Você está na página 1de 283

Algoritmos de

Lógica de
Programação II
Unidade I:
Introdução à linguagem C
Prof. Me. Pietro Martins de Oliveira
Introdução à linguagem C

• O que é um algoritmo? (já sabemos...)


• É uma sequência finita de passos para a resolução de
um problema.
• Algoritmo na computação:
• Corresponde a transformar um conjunto de dados de
entrada em um conjunto de dados de saída por meio
de instruções computacionais.
• Linguagem C
• Linguagem de programação de propósito geral
• Sintaxe muito parecida com outras linguagens:
• Pascal, Delphi, Java, C++, C#, etc.
Introdução à linguagem C

• Não depende de um hardware específico


• Combina vantagens de uma linguagem de alto
nível com a eficiência das linguagens de máquina
(assembly)
• Integrated Develop Environments (IDEs)
• Dev C++
• Code blocks
• Visual Studio
• Turbo C
• Visual C
Fonte: https://sourceforge.net/projects/orwelldevcpp/
Introdução à linguagem C

• Linguagens:
• Interpretadas
• Compiladas (C)
• Processo de compilação+linkedição

Código-fonte Compilador Programa - Objeto

Bibliotecas linkeditor

Programa - Executável
Introdução à linguagem C

• Estrutura básica de um programa em C


• Inclusões de bibliotecas
• Corpo principal do código: função main()
• Comandos geralmente finalizam com “;”
• Exemplo:
Introdução à linguagem C

• Comentários
• Há situações em que o programador quer
deixar anotações registradas no código fonte
• Tais informações não podem ser interpretadas
como instruções executáveis
• São apenas informações instrutivas
(documentação)
• O compilador deve desconsiderar qualquer coisa
que esteja em comentário
• Comandos “barra-barra” & “barra-asterisco”:
• // <comentário>
• /* <comentário> */
Algoritmos de
Lógica de
Programação II
Unidade I:
Conceitos fundamentais em programação
Prof. Me. Pietro Martins de Oliveira
Semântica × Sintaxe

• Sintaxe:
• Linguagem estruturada:
• Regras para a escrita do código
• Ordem de escrita do código
• Pontuação
• Semântica:
• Significado do código
• Passo a passo para a resolução do problema
• Lógica de programação
• O que o código executa e produz como
resultado
Idenfiticadores

• Existem comandos com identificadores fixos:


• Todos escritos em letras minúsculas
• Não podem ser substituídos (sobrescritos)
• Não podem ser “reutilizados”
• É comum dar nomes a diferentes estruturas
dentro de um programa
• Variáveis
• Constantes
• Tipos de dados
• Funções
• Rótulos
Idenfiticadores

• Regras para a criação de identificadores


(nomeação de estruturas):
• Nunca começam com um número
• Geralmente começam com uma letra ou underline
• Podem conter letras, underlines e números
• O primeiro caractere não pode ser um número
• Não admitem acentos, espaços e nem caracteres
especiais
• Observação importante: a linguagem C é case
sensititive – maiúsculo ≠ minúsculo
O código

• Estruturas de um programa:
• Palavras reservadas
• Tipos de dados
• Constantes
• Variáveis
• Atribuição
• Operadores
• Aritméticos, relacionais e lógicos
• Funções
• Entrada e saída de dados
Tipos de dados

Prof. Me. Pietro Martins de Oliveira


Tipos de Dados

• Oito tipos primitivos:


• char: caracteres simples e strings (cadeias de
caracteres)
• int: dados numéricos sem casas decimais
• float: números com casas decimais (valores em
ponto flutuante)
• double: ponto flutuante com precisão dupla
• bool: valor lógico (verdadeiro ou falso)
• enum: dados enumerados
• void: ausência de valores, ocupam 0 bits em
memória
• pointer: localização de memória
Tipos de dados

• Modificadores de tipos de dados:


• unsigned: utilizado para declarar que um valor
numérico não terá sinal
• Duplica a faixa de valores
• short: reduz a capacidade de armazenamento
• long: armazena a capacidade de armazenamento
• Os modificadores podem ser utilizados em conjunto com os
tipos. Por exemplo:
• long int
• unsigned float
Palavras reservadas

Prof. Me. Pietro Martins de Oliveira


Palavras reservadas

• Comandos específicos que têm significado


próprio:
• int, float, double, void, bool,
char, enum
• short, long, unsigned
• if, else, do, while, for, switch,
case, break, default
• return
• typedef, struct, union
Algoritmos de
Lógica de
Programação II
Unidade I:
Variáveis, constantes e atribuição
Prof. Me. Pietro Martins de Oliveira
Variáveis

• São valores que variam ao longo do tempo


• Permitem armazenar e acessar uma
informação
• Os valores ficam armazenados em memória
• Os valores podem ser alterados conforme a
necessidade
• Auxiliam na resolução dos problemas
• Toda variável possui:
• Um tipo
• Um identificador (nome)
Variáveis

• Sintaxe de criação de variáveis:


<tipo> <identificador>;
• Pode-se declarar mais de uma variável na mesma
linha
• Exemplos:
Constantes

Prof. Me. Pietro Martins de Oliveira


Constantes

• Alguns valores são fixos durante todo o programa


• As informações contidas em constantes não
variam ao longo do programa
• Sintaxe:
#define <identificador> <valor>
• Exemplos:
Atribuição

Prof. Me. Pietro Martins de Oliveira


Atribuição

• A atribuição é uma operação para armazenar ou


alterar o conteúdo de uma variável.
• Pode-se atribuir (dependendo do tipo da
variável):
• Valores literais
• Valores constantes
• Outras variáveis
• Resultados de expressões
• Em linguagem C, usa-se o símbolo “igual”:
<variável> = <valor>;
Atribuição

• Exemplos de atribuição:
Unidade I:
Operadores
Prof. Me. Pietro Martins de Oliveira
Operadores aritméticos

• Soma • Módulo
• Símbolo: + • Resto de divisão
• Subtração inteira
• Símbolo: - • Símbolo: %
• Multiplicação • Prioridades –
• Símbolo: * parênteses
• Divisão • Símbolo: ()
• Símbolo: /
Operadores aritméticos

• Exemplo - Uso de operadores aritméticos


Operadores relacionais

• Maior que • Igual


• Símbolo: > • Símbolo: ==
• Maior ou igual a • Diferente
• Símbolo: <= • Símbolo: !=
• Menor que
• Símbolo: <
• Menor ou igual a
• Símbolo: >=
Operadores relacionais

• Exemplo - Uso de operadores relacionais


Considere:
A = 2
B = 3
Operadores lógicos

• Negação
• Inverte um valor lógico
• Símbolo: !
• Conjunção
• Operação “E” lógica
• Símbolo: &&
• Disjunção
• Operação “E” lógica
• Símbolo: ||
Operadores lógicos

• Exemplo: Uso de Operadores Relacionais

Considere:
A = 2
B = 3
Algoritmos de
Lógica de
Programação II
Unidade I:
Funções intrínsecas
Prof. Me. Pietro Martins de Oliveira
Funções intrínsecas

• Existem operações complexas que já foram desenvolvidas


em forma de funções
• É preciso identificar a biblioteca à qual uma função
intrínseca pertence
• Exemplos:
– ceil(x) – z = modf(x, &y)
– abs(x) – pow(x,y)
– floor(x) – sqrt(x)
– log(x) – printf(“texto”)
– log10(x) – scanf(“%d”, &x)
Funções intrínsecas

• Exemplo

ATENÇÃO:
IDENTAÇÃO
Unidade I:
Entrada e saída de dados
Prof. Me. Pietro Martins de Oliveira
Entrada e saída de dados

• Leitura de dados a partir do teclado (scanf): é


feita por uma função
• Sintaxe:
scanf(“<tipo_variavel>”, &<variável>);

• Escrita de dados na tela do computador (printf):


é feita por uma função
• Sintaxe:
printf(“texto <tipo_variavel>”, <variável>);
Especificadores de formato

• Caracteres especiais para indicar o tipo da variável


• Tais caracteres devem ser inseridos entre as aspas
duplas para indicar o tipo
• %d: imprimir/ler um int
• %f: imprimir/ler um float
• %e: imprimir/ler um double
• %c: imprimir/ler um char
• %s: imprimir/ler um vetor de char (string)
Caracteres especiais importantes

• Caracteres especiais para utilizar em textos (dentro das


aspas duplas):
• \n: pula de linha
• \0: indica o fim de um texto (nulo)
• \: indica que o próximo caractere, caso seja especial,
deverá ser interpretado literalmente
• ' ': indica um espaço
• \t: insere uma tabulação (tab)
• \b: retrocesso (tab)
• \f: salta de página de formulário
Entrada e saída de dados
Entrada e saída de dados

• Execução do programa
Entrada e saída de dados

• Execução do programa
Entrada e saída de dados

• Execução do programa
Unidade II:
Estruturas Condicionais
Prof. Me. Pietro Martins de Oliveira
Introdução

• Há casos onde é necessário definir caminhos


diferentes de acordo com situações específicas
• Por exemplo:
• Tomar decisões
• Escolher entre diferentes opções
• Realizar comparações
• Imagine um caso em que é preciso determinar um
valor, informado pelo usuário, é um número
negativo?
• Dependendo dessa resposta, o algoritmo irá executar
um bloco de comandos ou simplesmente ignorá-lo.
Exemplificando...

• Desenvolver um programa que peça para o usuário


informar dois números. O programa deverá informar o
seguinte:
a) Qual é o maior número?
b) Qual é o menor número?
c) Os números são iguais?

• Desenvolver uma função valide se o usuário informou um


cpf válido ou inválido.
• A programação de um alarme de incêndio: os sensores
estão detectando sinal de incêndio?
Estruturas condicionais

• Estrutura condicional ou estrutura de decisão:

a) A sequência de passos a ser executada


depende de uma condição
b) Caso a condição seja verdadeira, o bloco de
comandos é executado
c) Caso a condição não seja verdadeira, o bloco
de comandos é ignorado
d) Permite interromper e/ou redirecionar o fluxo
de um algoritmo
Estruturas condicionais

• Usadas para “selecionar um caminho” que será


executado, baseado em uma condição
• A condição deve ser composta por de uma ou mais
expressões lógico-relacional
• Há várias formas de se categorizar as sintaxes das
estruturas condicionais:
• Simples (if),
• Composta (if-else),
• Aninhadas,
• Múltipla (switch-case).
Unidade II:
O comando if
Prof. Me. Pietro Martins de Oliveira
Estrutura condicional simples

• O comando if
• O bloco de comandos definido pelo if só é
executado caso sua condição seja verdadeira
• A condição deve ser expressa de uma
expressão lógico-relacional
• Há várias formas de se organizar a sintaxe do
comando if
• Simples
• Composta
• Aninhada
Estrutura condicional simples

• Testa uma condição e, caso ela seja verdadeira,


executa um bloco de comandos.
• A condição é dada por uma expressão lógico-
relacional e possui como resultado verdadeiro
(true) ou falso (false)
• Sintaxe do if em linguagem C:

ATENÇÃO:
INDENTAÇÃO
Exemplo

• Desenvolva um algoritmo que peça para o usuário


informar um número.
• Caso o número seja maior do que 10, o algoritmo
deverá imprimir: “Maior que 10”.
• Construção do programa:
• Entrada: valor numérico (int ou float)
• Saída: mensagem que informa que o número é maior
que 10 (através de um printf)
• Passo a passo:
• Usuário informa o número
• Se o número > 10: informar ao usuário
Exemplo

Exemplo

ATENÇÃO:
INDENTAÇÃO
Exemplo

TESTE DE
MESA!!!

numero → <lixo de memória>


Exemplo

TESTE DE
MESA!!!

numero → <lixo de memória>


Saída (tela) → Digite um número inteiro:
Exemplo

TESTE DE
MESA!!!

numero → 11
Saída (tela) → Digite um número inteiro:
Exemplo

TESTE DE
MESA!!!

numero → 11
Saída (tela) → Digite um número inteiro:
Exemplo

TESTE DE
MESA!!!

numero → 11
Saída (tela) → Valor maior que 10.
Condições complexas

• De maneira geral, condições simples são formadas


com operadores relacionais:
• Maior que (>), menor que (<), maior ou igual (>=),
menor ou igual (<=), igual (==) e
diferente (!=)
• Pode-se utilizar os operadores lógicos para compor
condições complexas.
• Condição complexa: união de duas ou mais
condições simples
• Operadores:
• Conjunção (&&), disjunção (||) e negação (!)
Exemplo

1) Imagine que é preciso informar ao usuário se um número


é maior que 10 e, simultaneamente, menor que 20:

ATENÇÃO:
INDENTAÇÃO
Exemplo

TESTE DE
MESA!!!

num → <lixo de memória>


Exemplo

TESTE DE
MESA!!!

num → <lixo de memória>


Saída (tela) → Digite um número:
Exemplo

TESTE DE
MESA!!!

num → 11
Saída (tela) → Digite um número:
Exemplo

TESTE DE
MESA!!!

num → 11
Saída (tela) → Digite um número:
Exemplo

TESTE DE
MESA!!!

num → 11
Saída (tela) → Valor entre 10 e 20
Exemplo

2) Imagine que é preciso informar ao usuário se um número


é maior que 10 ou se é igual a 0:
ATENÇÃO:
INDENTAÇÃO
Exemplo

TESTE DE
MESA!!!

num → <lixo de memória>


Exemplo

TESTE DE
MESA!!!

num → <lixo de memória>


Saída (tela) → Digite um número:
Exemplo

TESTE DE
MESA!!!

num → 5
Saída (tela) → Digite um número:
Exemplo

TESTE DE
MESA!!!

num → 5
Saída (tela) → Digite um número:
Unidade II:
O par de comandos if-else
Prof. Me. Pietro Martins de Oliveira
Estrutura condicional composta

• A condição de um comando if pode ser falsa. Nesse caso,


pode-se capturar tal evento com um comando else
aliado ao respectivo if.
• Sintaxe do if-else em linguagem C:

ATENÇÃO:
INDENTAÇÃO
Estrutura condicional composta

• Desenvolva um algoritmo que peça para o usuário


informar um número.
• O algoritmo deverá informar se o número é par ou
ímpar.
• Construção do programa:
• Entrada: valor numérico
• Saída: mensagens que informam se o número é par ou
ímpar
• Passo a passo:
• Informar o número
• Se o número for par: imprimir “número par”
• Caso contrário: imprimir “número ímpar”
Exemplo
Exemplo

TESTE DE
MESA!!!

num → <lixo>
resto → <lixo>
Exemplo

TESTE DE
MESA!!!

num → <lixo>
resto → <lixo>
Saída (tela) → Digite um número:
Exemplo

TESTE DE
MESA!!!

num → 5
resto → <lixo>
Saída (tela) → Digite um número:
Exemplo

TESTE DE
MESA!!!

num → 5
resto → 2
Saída (tela) → Digite um número:
Exemplo

TESTE DE
MESA!!!

num → 5
resto → 1
Saída (tela) → Digite um número:
Exemplo

TESTE DE
MESA!!!

num → 5
resto → 1
Saída (tela) → Digite um número:
Exemplo

TESTE DE
MESA!!!

num → 5
resto → 1
Saída (tela) → Digite um número:
Exemplo

TESTE DE
MESA!!!

num → 5
resto → 1
Saída (tela) → Ímpar!
Observação Importante!!!

Essas duas
instruções podem
ser
substituídas pela
operação de
módulo
(%) que se
estudamos na
Unidade I
O mesmo exemplo, porém com o operador %

ATENÇÃO:
INDENTAÇÃO
Unidade II:
Encadeamento de comandos if e if-else

Prof. Me. Pietro Martins de Oliveira


Estruturas condicionais aninhadas

• Pode-se compor uma estrutura condicional mais


complexa
• Coloca-se um “if-else” dentro do outro, de
acordo com a necessidade do algoritmo
• Pode-se utilizar estruturas condicionais
simples, compostas e múltiplas, todas elas de
maneira aninhada
• Criam-se vários níveis de decisões em que, a
decisão mais interna só será conferida caso a
decisão mais externa tenha resultado
verdadeiro
Estruturas condicionais aninhadas

• Sintaxe genérica

ATENÇÃO:
IDENTAÇÃO
Exemplo

• Construa um algoritmo que receba, como entrada,


a média final de um aluno:
• Imprima “Aprovado” caso a nota seja maior ou
igual a 7.;
• “Exame” se a média for maior ou igual a 4,
porém menor que 7;
• Imprima “Reprovado” caso a média seja menor
que 4.
Exemplo
Exemplo

TESTE DE
MESA!!!

media →
Exemplo

TESTE DE
MESA!!!

media →
Saída (tela) → Digite a nota do aluno:
Exemplo

TESTE DE
MESA!!!

media → 6.9
Saída (tela) → Digite a nota do aluno:
Exemplo

TESTE DE
MESA!!!

media → 6.9
Saída (tela) → Digite a nota do aluno:
Exemplo

TESTE DE
MESA!!!

media → 6.9
Saída (tela) → Digite a nota do aluno:
Exemplo

TESTE DE
MESA!!!

media → 6.9
Saída (tela) → Digite a nota do aluno:
Exemplo

TESTE DE
MESA!!!

media → 6.9
Saída (tela) → Vai fazer sub.
Unidade II:
Os comandos switch-case
Prof. Me. Pietro Martins de Oliveira
Estrutura condicional múltipla

• Há situações em que uma mesma variável pode


gerar condições múltiplas
• A mesma condição pode levar a mais de dois
caminhos diferentes
• Geralmente uma única variável acaba
controlando os vários caminhos diferentes
• É como se fosse um “menu” de opções
• Basicamente, substitui uma sequência de
condições simples baseadas (if) em uma
única variável
Estrutura condicional múltipla

Sintaxe do switch-case em linguagem C


Exemplo

• Desenvolva um algoritmo que, dependendo do


valor (número inteiro) digitado pelo usuário,
imprimir na tela dia da semana correspondente
àquele número:
• 1 → domingo
• 2 → segunda-feira
• 3 → terça-feira
• 4 → quarta-feira
• 5 → quinta-feira
• 6 → sexta-feira
• 7 → sábado
Exemplo
Exemplo
Exemplo

TESTE DE
MESA!!!

num →
Exemplo

TESTE DE
MESA!!!

num →
Saída (tela) → Digite o número do dia da semana:
Exemplo

TESTE DE
MESA!!!

num → 3
Saída (tela) → Digite o número do dia da semana:
Exemplo

TESTE DE
MESA!!!

num → 3
Saída (tela) → Digite o número do dia da semana:
Exemplo

TESTE DE
MESA!!!

num → 3
Saída (tela) → Digite o número do dia da semana:
Exemplo

TESTE DE
MESA!!!

num → 3
Saída (tela) → Digite o número do dia da semana:
Exemplo

TESTE DE
MESA!!!

num → 3
Saída (tela) → Digite o número do dia da semana:
Exemplo

TESTE DE
MESA!!!

num → 3
Saída (tela) → Terça-feira.
Exemplo

TESTE DE
MESA!!!

num → 3
Saída (tela) → Terça-feira.
Unidade III:
Estruturas de repetição
Prof. Me. Pietro Martins de Oliveira
Introdução

• Computadores são muito eficientes em realizar


operações repetitivas.
• Pense no seguinte problema:
• Imprimir “Aguarde...”, por cem vezes, na tela!
• Uma estrutura de repetição permite repetir um
bloco comandos sem a necessidade de replicar
código-fonte.
• Observação: repetição e iteração têm o mesmo
significado.
Introdução

• Imprimindo “Aguarde...” por cem vezes:


Introdução

• É interessante replicar o mesmo código para


repetir a mesma tarefa?
• Exemplo anterior: utilizar a função printf()
por 100 vezes, em sequência...
• É oneroso e deselegante
• Existem comandos que permitem que a máquina
execute tarefas repetitivas, sem que seja
necessário replicar código.
• ESTRUTURAS DE REPETIÇÃO!
Introdução

Estruturas de Repetição
• Também conhecidas como Laços ou Loops
• Utilidade: iterar um bloco de comandos
• Toda estrutura de repetição possui um critério de
parada
• Critério de parada pode ser falho: loop infinito
Unidade III:
O comando for
Prof. Me. Pietro Martins de Oliveira
O comando for

Repetição por Contagem

• Repete um bloco de comandos por um número


finito de vezes.

• A quantia de repetições é controlada por uma


variável
• Gera-se uma sequência numérica
• Variável contadora (laço contado)
O comando for

• Sintaxe do comando for:


for(<inicialização>;<teste>;<incremento>)

• <inicialização> – geralmente, tem-se uma inicialização de


uma variável de controle (contador)
• <teste> – tem-se uma expressão lógica/relacional (condição)
• <incremento> – geralmente tem-se uma expressão de
atribuição com o incremento ou decremento de uma variável
(atualização do valor da variável)
Exemplo

• Imprimir “Aguarde...” por cem vezes

ATENÇÃO:
INDENTAÇÃO
Exemplo

• Imprimir “Aguarde...” por cem vezes

Repare que i++ é a mesma


coisa que i=i+1
O comando for

• A variável de controle gera uma sequência


numérica
• É como um contador:
• 1 – Executa pela primeira vez
• 2 – Executa pela segunda vez
• 3 – Executa pela terceira vez
• 4 – Executa pela quarta vez
• ...
• 98 – Executa pela oitava vez
• 99 – Executa pela nona vez
• 100 – Executa pela décima vez
O comando for

• Toda sequência numérica possui:


• Um valor inicial
• Um valor final
• Um valor de incremento/decremento
• Exemplo
• Valor inicial = 1
• Valor final = 5
• Incremento = +1
• Sequência gerada: 1, 2, 3, 4, 5
• Quando não for explicitado, o valor de incremento é +1 por
padrão
O comando for

• São exemplos de sequências:


▪0, 1, 2, 3, 4
▪7, 6, 5, 4, 3, 2, 1
▪0, 2, 4, 6, 8, 10
▪1, 3, 5, 7, 9
▪-3, -2, -1, 0, 1, 2, 3
▪0, 5, 10, 15, 20
▪0,0; 0,1; 0,2; 0,3; 0,4; 0,5
O comando for

• Sequências mais comuns na repetição por


contagem:
a) Valor inicial = 0 e incremento = +1:
0, 1, 2, 3, 4...
b) Valor inicial = 1 e incremento = +1:
1, 2, 3, 4, 5...
c) Valor inicial = N e decremento = -1:
Por ex. com N = 5:
5, 4, 3, 2, 1, 0
Exemplo

• Desenvolver um algoritmo para que se exibam os números


de 0 a 9 na tela.
Exemplo

TESTE DE
MESA!!!

cont →
Saída (tela) →
Unidade III:
O comando while
Prof. Me. Pietro Martins de Oliveira
O comando while

Repetição por Condição


• Em muitas situações na computação precisamos
repetir operações apenas enquanto uma condição
for verdadeira.
• Os comandos são repetidos até que a condição
seja quebrada – condição testada no início
• Muitas vezes é impossível prever quando a
condição será quebrada
• Às vezes é inviável realizar repetição por
contagem (comando for)
• Condição: expressão lógico-relacional
O comando while

• Em C o while faz a repetição por condição


• Repete um bloco de comandos enquanto uma
condição for verdadeira.
• Assim que a condição for quebrada, o laço de
repetição se interrompe.

• Sintaxe do comando while:


while(<Condição>)
{
<Bloco de comandos>
}
Exemplo

• Imprimir “Aguarde...” por cem vezes


O comando while

• Imagine o seguinte problema:


• Escrever um algoritmo para descobrir quantas
vezes é possível subtrair o valor 2 de um
número N qualquer (informado pelo usuário),
antes que o resultado das subtrações se torne
negativo.

• A interação com o usuário faz com que seja


difícil prever quantas vezes o laço deverá se
repetir
Exemplo

• Desenvolver um programa que peça para o


usuário informar valores inteiros.
• O programa deverá realizar a soma total dos os
valores informados
• O algoritmo deverá ser interrompido quando a soma
dos valores informados pelo usuário for maior do que
100.
Exemplo
Exemplo

TESTE DE
MESA!!!

Valor →
soma →
Saída (tela) → Digite um valor:
Unidade III:
O par de comandos do-while
Prof. Me. Pietro Martins de Oliveira
Os comandos do-while

• Estrutura de repetição similar ao while, com


algumas diferenças fundamentais
• O teste condicional é verificado somente ao
final do laço
• O bloco de comandos é executado,
obrigatoriamente, por pelo menos uma vez
• A lógica condicional é invertida, quando
comparada ao while:
• O laço de repetição é iterado até que a
condição seja atendida
Os comandos do-while

• Estrutura do-while:
• O código do laço deve ser executado por pelo
menos uma vez, antes de se verificar a
condição

• Sintaxe do comando do-while:


do{
<sequência de comandos>
}while(<expressão lógica>)
Exemplo

• Imprimir “Aguarde...” por cem vezes


Unidade III:
Estruturas de repetição aninhadas
Prof. Me. Pietro Martins de Oliveira
Estruturas de repetição aninhadas

• Em algumas situações observa-se a necessidade


de se aninhar uma estrutura de repetição dentro
da outra;
• Pode-se aninhar quantas estruturas de repetição
quanto for necessário, e de qualquer tipo;
• Geralmente, o aninhamento de estruturas de
repetição está relacionado a algoritmos que
envolvem matrizes.
Estruturas de repetição aninhadas

• Imagine uma estrutura de repetição do tipo


while
• Considere que, dentro do bloco de comandos
desta estrutura, foi inserida outra estrutura de
repetição do tipo while

while(<Condição 1>){
while(<Condição 2>){
<bloco de comandos>
}
}
Estruturas de repetição aninhadas

• Exemplos de aninhamento:
• Um for dentro de outro for

For(var1=inicio1;var<fim1;var1++){
for(var2=inicio2;var<fim2;var2++){
<Bloco de instruções>
}
}
Estruturas de repetição aninhadas

• Exemplos de aninhamento:
• Um while dentro de um for

for(var=inicio;var<fim;var++){
while(<condição>){
<Bloco de instruções>
}
}
Estruturas de repetição aninhadas

• Exemplos de aninhamento:
• Um do-while dentro de um for

for(var=inicio;var<fim;var++){
do{
<Bloco de instruções>
}while(<condição>);
}
Estruturas de repetição aninhadas

• Exemplos de aninhamento:
• Um do-while dentro de um while

while(<condição1>){
do{
<Bloco de instruções>
}while(<condição2>);
}
Estruturas de repetição aninhadas

• Exemplos de aninhamento:
• Um Para dentro de um Enquanto

while(<condição>){
for(var=inicio;var<fim;var++){
<Bloco de comandos>
}
}
Estruturas de repetição aninhadas

for(var=inicio;var<fim;var++){
<Bloco de comandos do FOR>
do{
<Bloco de comandos do DO-WHILE>
while(<condição1>){
<Bloco de comandos do WHILE>
}
<Bloco de comandos do DO-WHILE>
}while(<condição2>);
<Bloco de comandos do FOR>
}
Utilidade das estruturas de repetição

• Contadores
• Variável utilizada em conjunto com um laço para
contar o número de vezes que um evento ocorreu
• Acumuladores
• Variável para somar uma série de números
• Vetores
• Controlar o índice do vetor
• Matrizes
• Controlar o acesso a linhas e colunas
• Algoritmos iterativos
Utilidade das estruturas de repetição

• Variável contadora: um contador permite


computar a ocorrência de um evento
• Exemplo: contar quantos números inteiros
existem entre os números 7 e 13

FAÇA O TESTE DE MESA!!!


Utilidade das estruturas de repetição

• Variável acumuladora: soma uma sequência de


valores numéricos (acumula os valores)
• Exemplo: fazer um algoritmo para descobrir
qual o resultado da soma dos números de 1 a
10

FAÇA O TESTE DE MESA!!!


Síntese

Quando é indicada a utilização de uma estrutura


for?
• Para repetir um bloco de comandos repetidamente,
quando se sabe, de antemão, quantas vezes o bloco
deverá ser repetido
• Explorar padrões de sequências numéricas
• Para realizar contagens
• Para acumular valores
Síntese

Quando é indicada a utilização de uma estrutura


while ou do-while?
• Quando não é possível determinar previamente o número
de repetições a se realizar.
• Quando deseja-se gerar sequências complexas, por
exemplo, números decimais, números múltiplos, etc.
• Para repetir um conjunto de comandos por um número
finito de vezes.
• Tomar cuidado com a repetição infinita (loop infinito): em
algum momento a condição do deverá se fazer com que o
laço se interrompa!
Unidade IV:
Vetores
Prof. Me. Pietro Martins de Oliveira
Introdução

• Estruturas de dados homogêneas


• São estruturas de dados que agrupam diversas
informações do MESMO tipo em uma única
variável
• Variável simples:
• Apenas um dado é acessível
• Agregados homogêneos:
• Vários dados são acessíveis
• Podem ser unidimensionais (vetor) ou
multidimensionais (matrizes)
Introdução

• É usual manipular conjuntos de valores, em


detrimento de dados isolados;
• Exemplos: notas, preços, produtos, nomes, etc
• Para manipular um conjunto de dados do mesmo
tipo há uma estrutura denominada vetor.
• Analogia:
• Um vetor é como um trem - cada posição
do vetor é um vagão
Vetores

• Também conhecido como:


• Arranjo
• Array
• Agregado homogêneo unidimensional
• “São matrizes de uma única linha”
• Vetores em pseudocódigo:
• São declarados de maneira similar a uma variável
comum, porém, adiciona-se o tamanho
• Têm um tamanho máximo N
• O primeiro elemento encontra-se na posição 0
• O último elemento encontra-se na posição N-1
Vetores

• Sintaxe de declaração de um vetor:


<tipo> <nome>[<tamanho>];
▪Exemplo: int A[10];
• Declaração com lista de inicialização:
<tipo> <nome>[<tamanho>]={<v1>,<v2>,...,<vN>};
▪Exemplo: int B[3] = {15, 66, 42};

Vetor B:
Índice 0 1 2
Conteúdo 15 66 42
Vetores

• Sintaxe para acesso aos elementos de um vetor:


<nome_do_vetor>[<índice>];

▪Exemplo 1:
printf(“%d”, B[0]);
▪Exemplo 2:
B[i] = i + j;
▪Exemplo 3:
soma = soma + B[i];
Exemplo

• Escrever código em linguagem C para declarar um vetor


contendo “notas”, de tamanho 4 do tipo float.

Índice 1 2 3 4
Conteúdo 5,5 9,0 8,3 6,4
Índice inicial = 0
Índice final = N – 1 = TAM – 1 = 4 - 1 = 3
Exemplo

• Os valores de 0 a 3 correspondem ao índice de


cada uma das posições do vetor
• Os valores 5.5, 9.0, 8.3, 6.4 correspondem às
notas, ou seja, aos conteúdos (elementos) do
vetor

Índice 0 1 2 3
Valor 5.5 9.0 8.3 6.4
Exemplo

• Atribuição a uma posição do vetor:

• Atribuindo o valor de uma posição do vetor a


uma variável:
Erros comuns com vetores em linguagem C
Erros comuns com vetores em linguagem C
Exemplo

• Desenvolva um programa que peça para o professor


informar as quatro notas bimestrais de um aluno.
Exemplo

• O bloco de comandos pode ser concentrado em


uma estrutura de repetição (for, while,
do-while):
Exemplo

Algoritmo meu_vetor2
Var notas: Vetor[1..4] de real
Inicio
Para i de 1 até 4 passo 1 faça
escreva("Digite a nota ", i, ":")
leia(notas[i])
Fim_para
Fim
Teste de mesa

O que seria exibido para o usuário:


DigiteDigite
a notaa 1:
nota 1:
|

O que aconteceria na memória do computador:


Índice 1 2 3 4
Conteúdo
Teste de mesa

O que seria exibido para o usuário:


DigiteDigite
a notaa 1:
nota 1:
10.0 |

O que aconteceria na memória do computador:


Índice 1 2 3 4
Conteúdo 10.0
Teste de mesa

O que seria exibido para o usuário:


DigiteDigite
a notaa 2:
nota 1:
|

O que aconteceria na memória do computador:


Índice 1 2 3 4
Conteúdo 10.0
Teste de mesa

O que seria exibido para o usuário:


DigiteDigite
a notaa 2:
nota 1:
9.8 |

O que aconteceria na memória do computador:


Índice 1 2 3 4
Conteúdo 10.0 9.8
Teste de mesa

O que seria exibido para o usuário:


DigiteDigite
a notaa 3:
nota 1:
|

O que aconteceria na memória do computador:


Índice 1 2 3 4
Conteúdo 10.0 9.8
Teste de mesa

O que seria exibido para o usuário:


DigiteDigite
a notaa 3:
nota 1:
7.0 |

O que aconteceria na memória do computador:


Índice 1 2 3 4
Conteúdo 10.0 9.8 7.0
Teste de mesa

O que seria exibido para o usuário:


DigiteDigite
a notaa 4:
nota 1:
|

O que aconteceria na memória do computador:


Índice 1 2 3 4
Conteúdo 10.0 9.8 7.0
Teste de mesa

O que seria exibido para o usuário:


DigiteDigite
a notaa 4:
nota 1:
8.5 |

O que aconteceria na memória do computador:


Índice 1 2 3 4
Conteúdo 10.0 9.8 7.0 8.5

Fim da execução!
Unidade IV:
Strings – manipulando texto em C
Prof. Me. Pietro Martins de Oliveira
Strings

• Toda linguagem de programação possui alguma


maneira de trabalhar com texto;
• Em linguagem C, o tipo char é utilizado para
manipular caracteres alfanuméricos;
• Uma variável simples, do tipo char, só é capaz
de manipular um caractere por vez;
• Carac. alfanumérico: letras, dígitos, símbolos e
caracteres de controle
• Solução: criar um vetor de char: string!
Strings

• Variáveis do “tipo string”:


• Manipulam sequências de caracteres
• Tamanho finito

• Operações comuns sobre strings :


• Atribuição
• Comparação
• Acesso a caracteres específicos
• Concatenação
Strings

• Em linguagem C, tudo o que estiver dentro de


aspas duplas é considerado uma string!
• Uma variável simples, do tipo char, se identifica
por utilizar aspas simples;
• Ambas são case sensitive, diferenciam
maiúsculo/minúsculo
char simples

string
Strings

• Tamanho

• Fim da string: utiliza-se o caractere especial '\0'


• Uma string de tamanho n, pode possuir
• no máximo n-1 caracteres utilizáveis
Strings

• String não é um tipo primitivo: é um vetor de


char;
• Exemplo:
Exemplo

Índice Conteúdo
0
1
2
3
4
5
6
Strings

• Inicialização

• Atribuição
• Não é possível atribuir vários valores ao mesmo
tempo, por ex.:

? ?
? ?
Strings

• Atribuição por meio de funções:


• Sempre incluir a biblioteca string.h para
utilizar funções para strings
Strings

• scanf()
• Não lê frases com espaço
• Dispensa o operador &

• gets()
• Lê espaço, sintaxe mais simples
• Cuidado: permite textos maior que o tamanho
Strings

• strcpy()
• Copia ou atribui o conteúdo da string origem
para destino;
• Sintaxe: strcpy(destino,origem)
• O tamanho do destino deve ser igual ou maior
que a origem
Strings

• Igualdade
• Função strcmp()
• Compara o conteúdo da primeira string com o
da segunda
• Retorna 0, caso as strings sejam idênticas
• Retorna algo diferente de 0, caso contrário
• É case sensitive: maiúsculo ≠ minúsculo
Strings

• Igualdade
• Exemplo:
Strings

• Concatenação
• Função strcat();
• Sintaxe: strcat(destino,origem);
• Junta o conteúdo da string de origem ao final
do conteúdo da string de destino
Strings

• Estrutura
• Uma string é um vetor, com N caracteres
• Cada caractere em um índice
• Índices variam de 0 a N-1
• Final da string sempre deve conter o caractere
de controle ‘\0’
• N-1 caracteres “utilizáveis”
• Ex.:
0 1 2 3 4 5 6 7 8 9
A L G O R I T M O \0
Unidade IV :
Matrizes
Prof. Me. Pietro Martins de Oliveira
Introdução

• Até aqui aprendemos a manipular apenas arrays


simples:
• Estrutura de dados unidimensional;
• Controlada através de um único índice
• Consegue imaginar as situações em que é
necessário mais de um índice?
• Tabelas, gráficos 3D, aplicações contábeis,
processamento de imagens e visão
computacional, jogos, aplicações científicas,
projetos de engenharia etc.
Introdução

• Considere a tabela:
ano 2010 2011 2012
produto
Arroz 6,00 6,50 7,00
Feijão 4,00 4,35 5,25
Macarrão 3,50 3,30 3,75
• Aplicações com tabelas são inerentemente
matriciais
• Solução: MATRIZES
Matrizes

• Definição: matrizes são estruturas de dados


multidimensionais que necessitam de mais de um
índice para serem manipuladas.
• São parecidas com vetores
• Semelhanças: os elementos de uma matriz são
referenciados por um mesmo nome
• Diferença: possuem dois ou mais índices
• Bidimensionais: um índice para linhas e outro
índice para colunas
• Multidimensionais: podem possuir 2, 3,
... K índices
Matrizes

• Definição matemática: uma matriz é um arranjo


tabular de M×N valores, onde M é o número de
linhas e N é o número de colunas.
• Os elementos de uma matriz são acessados por
dois índices:
• i – geralmente associado às linhas
• j – geralmente associado às colunas
Matrizes

• Sintaxe de acesso a um elemento da matriz


<tipo> <nome>[<dim1>][<dim2>]...[<dimN>];

• Exemplo de criação de uma matriz bidimensional:


int A[3][3]

Mat =
Matrizes

• Sintaxe de acesso a um elemento da matriz


<nome_da_matriz>[<ind1><ind2>, ..., <indN>]

Exemplo de acesso a elementos da matriz


• Mat[1][1]
• Mat[3][3]
• Mat[1][3]
• Mat[2][1]
Exemplo

• Desenvolva um algoritmo que imprima, na tela, os


elementos da seguinte matriz:
Exemplo

• Código para imprimir uma matriz na tela


Exemplo
Exemplo

• Resultado da execução:
Unidade IV:
Registros
Prof. Me. Pietro Martins de Oliveira
Introdução

• Os tipos primitivos são eficientes em todas as


situações?
• Será que não existe algum caso em que é
preciso criar um novo tipo?
• Imagine uma aplicação de controle de estoque de
produtos:
• É preciso armazenar várias informações
• Código, nome do produto, quantidade em
estoque, valor de compra, valor de venda,
lucro, observações sobre o produto
Introdução

• Estruturas de Dados Heterogêneas


• Também conhecidas como registros, tipos de
dados compostos, structs.
• Exemplo: Controle de estoque (Produto)
• Código: número inteiro
• Nome do produto: texto
• Quantidade estocada: número real
• Valor da compra: número real
• Valor de venda: número real
• Lucro: número real
• Observações sobre o produto: texto
Structs

• Registros em linguagem C:
• Sintaxe:
struct <nome_do_registro>{
<tipo> <nome_do_campo1>;
<tipo> <nome_do_campo2>;
...
<tipo> <nome_do_campoN>;
};
• Esta é a declaração de um novo registro, um novo
tipo de dados, um tipo composto, reconhecido por
<nome_do_registro>
Exemplo

• Considerando uma aplicação de controle de


estoque, crie uma struct para que possa
armazenar as seguintes informações sobre um
produto:
• Código do produto
• Nome do produto
• Quantidade do produto em estoque
• Valor pago pelo produto
• Valor unitário para venda
Exemplo
Structs

• Como utilizar uma struct?


• Apenas definir a struct não basta
• É preciso criar uma variável do novo tipo criado
• Sintaxe para criação de uma variável do tipo
struct:
struct <tipo_registro> <nome_da_variável>;

• Exemplo:
struct produto p1;
Structs

• Acesso aos dados de um registro


• Utiliza-se o nome da variável do registro
seguida de um ponto (.), e então, referencia-se
o campo desejado.

• Sintaxe:
<nome_da_variável>.<campo>
Structs

• Criando um novo tipo de dados chamado


produto (struct produto)
Structs

• Criando e populando uma variável do tipo


struct produto
Structs & Vetores

• O exemplo anterior trata apenas um produto.


• Como criar uma lista de produtos?
• Registros podem ser combinados com vetores:
• Declara-se um novo registro
• Cria-se um vetor de registros (assim como se
cria uma variável do tipo registro)

• Exemplo: como criar e popular um vetor de


registros
Exemplo
Unidade V:
Sub-rotinas - funções
Prof. Me. Pietro Martins de Oliveira
Sub-rotinas

• Uma sub-rotina é um bloco de instruções que realiza


tarefas específicas
• Durante a execução são carregadas apenas uma vez e
podem ser executadas quantas vezes for necessário
• São utilizadas para se dividir um problema em
problemas menores (subproblemas)
• Modularização: o problema é dividido em partes
coerentes
• Evita-se repetição de código
• Legibilidade facilitada (abstração da
complexidade)
Sub-rotinas

• Exemplos:
• Validação de CPF/CNPJ
• Encontrar um CEP
• Calcular frete
• Inicialização de vetores e matrizes
• Exibição de mensagens

• As sub-rotinas são muito úteis para se reutilizar


uma solução, dentro do algoritmo
Funções

• Uma função é uma sub-rotina na qual é preciso


RETORNAR um valor para quem a invocou
• É um subalgoritmo - possui os mesmos
elementos de um algoritmo:
• Nome
• Declaração de variáveis
• Início
• Processamento
• Fim
• Característica especial: possui um tipo!
• Define o tipo do valor de retorno
Funções

• Originalmente, funções devem ser declaradas


antes da função main() em um programa
• Protótipo de funções
• São como cabeçalhos
• Permitem declarar as funções em qualquer
parte do programa
• Os cabeçalhos, em si, devem ser definidos
antes da função main()
• Sintaxe:
<tipo> <nome_da_função>([<parâmetros>]);
Funções

• Sintaxe de declaração de uma função:


<tipo> <nome_da_função>([<parâmetros>]){
<bloco de comandos>
}

• Parâmetros:
• Lista de variáveis de entrada
• Cada variável possui um tipo e um nome
• Podem existir nenhum, um ou vários parâmetros
Exemplo

• Criar uma função que receba o peso em quilos e o


converta em gramas. Invocar tal função para
testá-la em tempo de execução.
Exemplo

• Invocando a função:
Exemplo
TESTE DE
MESA!!!

qui → gra →
Saída (tela) →
Unidade V:
Sub-rotinas - procedimentos
Prof. Me. Pietro Martins de Oliveira
Procedimentos

• Um procedimento é uma sub-rotina na qual não há a


obrigatoriedade de se retornar um valor a quem o invocou
• Também é um subalgoritmo
• Sintaxe de declaração de um procedimento:
void <nome_procedimento>(<parâmetros>){
<bloco de comandos>
}

• Em um procedimento, a saída de dados é feita através de


passagem de parâmetros por referência
Exemplo

• Desenvolver programa que leia dois números e exiba o


resultado da soma entre eles.
Exemplo

• Desenvolver programa que leia dois números e exiba o


resultado da soma entre eles.

E se precisássemos realizar a
soma de mais dois números,
repetidamente???
Exemplo

• Desenvolver programa que leia dois números e exiba o


resultado da soma entre eles.
Basta replicar o código que
realiza a soma???

Solução ineficiente e
deselegante!
Exemplo

• Basta criar um procedimento...


Exemplo

• E invocá-lo quantas vezes for necessário!


Unidade V:
Escopo de variáveis e parâmetros
Prof. Me. Pietro Martins de Oliveira
Escopo de variáveis

• O escopo de uma variável está ligado à sua


visibilidade dentro de um programa
• Variável global: declarada no corpo principal
do algoritmo, é visível em todo o programa
• São criadas quando programa passa a executar.
• Variável local: declarada dentro de uma sub-
rotina, só pode ser acessada dentro da sub-
rotina
• Criadas apenas quando o programa invoca a sub-
rotina.
• Quando a execução da sub-rotina acaba, a variável
é destruída.
Escopo de variáveis

Algoritmo (corpo principal)

Fonte: adaptado de
MANZANO;
OLIVEIRA (1997)
Passagem de parâmetros

• Qual o propósito dos parâmetros?


• Servem como ponto de comunicação bidirecional
entre uma sub-rotina e o programa principal
• Ou para trocar valores entre a sub-rotina e a rotina
que a invocou
• Distinção entre parâmetros formais e parâmetros reais
• Existem dois modos de utilização:
• Por valor: não altera o parâmetro real – a sub-rotina
trabalha com uma cópia do valor passado
• Por referência: altera o parâmetro real – a sub-rotina
trabalha diretamente com o parâmetro de quem
invocou
Exemplo – Passagem de parâmetro por valor

Parâmetro formal!

Parâmetro real!
Exemplo – Passagem de parâmetro por valor

Passagem de
parâmetro
por valor!
Exemplo – Passagem de parâmetro por referência

Parâmetro formal!

Parâmetro real!
Exemplo – Passagem de parâmetro por referência

Passagem de
parâmetro
por referência!
Unidade V:
Recursividade
Prof. Me. Pietro Martins de Oliveira
Recursividade

Definição: O conceito de recursividade está relacionado a


algo que pode ser definido em termos de si próprio.
• Em programação: recursividade é um mecanismo que
permite uma função chamar a si mesma direta ou
indiretamente
• Exemplo – Relação de parentesco (pai × filho):
1. Pai
2. Avô – Pai do meu Pai
3. Bisavô – Pai do meu Avô: Pai do Pai do meu Pai
4. Trisavô – Pai do meu Bisavô: Pai do Pai do Pai do
meu Pai
Recursividade

• O princípio da recursividade consiste em diminuir um


problema, sucessivamente, em problemas menores
• De tanto diminuir o problema, chega em um ponto
que o problema pode ser resolvido diretamente (por
definição) – Depois, combinam-se as soluções!
• A função recursiva precisa ter duas partes:
• Caso base: determina que o problema está no menor
tamanho possível (não é possível diminuir mais)
• Solução direta
• Chamada recursiva: que faz uma nova chamada da
função transformando o problema atual num
problema menor
Exemplo

• A função Fatorial:
• Na matemática, a função fatorial de um
número n, onde n ∈ Z+, é o resultado do
produto de todos os inteiros positivos que são
menores ou iguais ao próprio n.
• Ou seja:
• n! = n × (n-1) × (n-2) × ... × 3 × 2 × 1
• Exemplo: fatorial de 5
• 5! = 5 × 4 × 3 × 2 × 1 = 120
Exemplo

Fatorial:

▪0! = 1 (por definição)


▪1! = 1 (por definição)
Exemplo

Fatorial:

▪0! = 1
▪1! = 1
▪2! = 2 × 1 = 2
Exemplo

Fatorial:

▪0! = 1
▪1! = 1
▪2! = 2 × 1 = 2
▪3! = 3 × 2 × 1 = 6
Exemplo

Fatorial:

▪0! = 1
▪1! = 1
▪2! = 2 × 1 = 2
▪3! = 3 × 2 × 1 = 6
▪4! = 4 × 3 × 2 × 1 = 24
Exemplo

Fatorial:

▪0! = 1
▪1! = 1
▪2! = 2 × 1 = 2
▪3! = 3 × 2 × 1 = 6
▪4! = 4 × 3 × 2 × 1 = 24
▪5! = 5 × 4 × 3 × 2 × 1 = 120
Exemplo

Fatorial:

▪0! = 1
▪1! = 1
▪2! = 2 × 1 = 2
▪3! = 3 × 2 × 1 = 6
▪4! = 4 × 3 × 2 × 1 = 24
▪5! = 5 × 4 × 3 × 2 × 1 = 120
▪Qual é o fatorial de 6?
▪6! = ?
Exemplo

Fatorial:

▪0! = 1
▪1! = 1
▪2! = 2 × 1 = 2
▪3! = 3 × 2 × 1 = 6
▪4! = 4 × 3 × 2 × 1 = 24
▪5! = 5 × 4 × 3 × 2 × 1 = 120

▪6! = 6 × 5 × 4 × 3 × 2 × 1
Exemplo

Fatorial:

▪0! = 1
▪1! = 1
▪2! = 2 × 1 = 2
▪3! = 3 × 2 × 1 = 6
▪4! = 4 × 3 × 2 × 1 = 24
▪5! = 5 × 4 × 3 × 2 × 1 = 120

▪6! = 6 × 5 × 4 × 3 × 2 × 1
Exemplo

Fatorial:

▪0! = 1
▪1! = 1
▪2! = 2 × 1 = 2
▪3! = 3 × 2 × 1 = 6
▪4! = 4 × 3 × 2 × 1 = 24
▪5! = 5 × 4 × 3 × 2 × 1 = 120

▪6! = 6 × 5 × 4 × 3 × 2 × 1 = 6 × 5! = 6 × 120 = 720


Exemplo

Ou seja...
▪É possível definir o fatorial de um número n como
sendo o próprio número n multiplicado pelo fatorial
do seu antecessor n-1
▪n! = n × (n-1)!
Exemplo:
▪0! = 1 (por definição)
▪1! = 1 (por definição)
▪2! = 2 × 1!
▪3! = 3 × 2!
▪4! = 4 × 3!
▪ e assim por diante...
Exemplo

• Como se define, matematicamente, a função fatorial?

1, 𝑠𝑒 𝑛 = 0 𝑜𝑢 𝑛 = 1;
• Γ(n) =
𝑛 × 𝑛 − 1 !, 𝑠𝑒 𝑛 > 1.

• E como representar isso em uma função algorítmica?


Exemplo

• Como se define, matematicamente, a função fatorial?


Caso base
1, 𝑠𝑒 𝑛 = 0 𝑜𝑢 𝑛 = 1;
• Γ(n) =
𝑛 × 𝑛 − 1 , 𝑠𝑒 𝑛 > 1.
Chamada recursiva
• E como representar isso em uma função algorítmica?
Exemplo
Exemplo

Caso base

Chamada recursiva
Exemplo

fat(5)
Exemplo

fat(5) 5*fat(4)
Exemplo

fat(5) 5*fat(4)
fat(4)
Exemplo

fat(5) 5*fat(4)
fat(4) 4*fat(3)
Exemplo

fat(5) 5*fat(4)
fat(4) 4*fat(3)
fat(3)
Exemplo

fat(5) 5*fat(4)
fat(4) 4*fat(3)
fat(3) 3*fat(2)
Exemplo

fat(5) 5*fat(4)
fat(4) 4*fat(3)
fat(3) 3*fat(2)
fat(2)
Exemplo

fat(5) 5*fat(4)
fat(4) 4*fat(3)
fat(3) 3*fat(2)
fat(2) 2*fat(1)
Exemplo

fat(5) 5*fat(4)
fat(4) 4*fat(3)
fat(3) 3*fat(2)
fat(2) 2*fat(1)
fat(1)
Exemplo
Caso base:
propagação
dos resultados

fat(5) 5*fat(4)
fat(4) 4*fat(3)
fat(3) 3*fat(2)
fat(2) 2*fat(1)
fat(1) 1
Exemplo

fat(5) 5*fat(4)
fat(4) 4*fat(3)
fat(3) 3*fat(2)
fat(2) 2*1
fat(1) 1
Exemplo

fat(5) 5*fat(4)
fat(4) 4*fat(3)
fat(3) 3*2
fat(2) 2
fat(1) 1
Exemplo

fat(5) 5*fat(4)
fat(4) 4*6
fat(3) 6
fat(2) 2
fat(1) 1
Exemplo

fat(5) 5*24
fat(4) 24
fat(3) 6
fat(2) 2
fat(1) 1
Exemplo
Solução:
combinação
dos
resultados

fat(5) 120
fat(4) 24
fat(3) 6
fat(2) 2
fat(1) 1
Unidade V:
Arquivos
Prof. Me. Pietro Martins de Oliveira
Arquivos

• São estruturas de dados que são manipuladas


fora do ambiente do programa
• Em um computador, arquivos são salvos fora
da memória principal
• São utilizados no armazenamento de grandes
quantidades de informações
• A memória principal de um computador é
pequena, quando comparada a
armazenamento externo
• Arquivos auxiliam no armazenamento em
massa e com persistência
Arquivos

• Biblioteca: <stdio.h>
• Variável do “tipo arquivo”: Ponteiro para um FILE
• Função para abrir um arquivo:
• fopen(nome_do_arquivo,
modo_de_abertura)
• Modos de abertura:
• r – Abre apenas para leitura
• w – Cria um arquivo para escrita
• a – Anexa novos dados
• r+ – Abre para leitura e escrita
• w+ – Cria arquivo para leitura e escrita
• a+ – Anexa dados ou cria novo arquivo p/ leitura e
escrita
Arquivos

• Função para fechar um arquivo:


• fclose(arq)
• arq é a variável ponteiro do tipo FILE
• Salvando um caractere em um arquivo:
• fputc(char ch, FILE *arq);
• ch é o caractere a ser impresso no arquivo
• Lendo um caractere de um arquivo:
• fgetc(FILE *arq);
• Salvando uma string em um arquivo:
• fputs(char *str, FILE *arq);
• str é a string a ser impressa no arquivo
Arquivos

• Lendo uma string de um arquivo:


• fgets(char *str, int tam, FILE *arq);
• str é a string a ser lida do arquivo (destino da leitura)
• tam indica o tamanho da string lida
• Escrevendo dados quaisquer:
• fwrite(mem, qtd_bytes, cont, arq);
• Lendo dados quaisquer:
• fread(mem, qtd_bytes, cont, arq);
• mem possui/recebe o conteúdo escrito/lido
• qtd_bytes contém o tamanho do bloco escrito/lido
• cont guarda número de blocos escritos/lidos
Arquivos

• Outras funções importantes:


Exemplo

• Desenvolver um programa que leia um arquivo TXT e o


imprima na tela.
• Passo a passo do algoritmo:
1. Declarar de variáveis
A. Linha
B. Arquivo
2. Abrir arquivo
3. Ler linha a linha do arquivo
A. Imprimir cada linha na tela
4. Fechar o arquivo
Exemplo
Exemplo

Você também pode gostar