Upload
acfava
View
1.128
Download
12
Embed Size (px)
Citation preview
Introdução a Computação
• O que é um computador?
“Um computador é uma coleção de componentesque realizam operações lógicas e aritméticas
sobre um grande volume de dados.” (F. K. Miyazawa)
Introdução a ComputaçãoUm computador é composto por:
• Unidades de entrada de dados: Ex.: teclado, mouse, câmera de vídeo, etc…
• Unidades de saída de dados Ex.: monitor, impressora, etc…
• Unidades de armazenamento Ex.: memória RAM, memória ROM, discos rígidos, cache. etc...
• Unidade Central de Processamento – CPU
• Unidade Lógica Aritmética – ULA
Introdução a Computação
Introdução a Computação
Termos técnicos:
• Hardware: Componentes mecânicos e eletro-eletrônicos (Parte dura do computador).
• Software: Seqüência de instrucões e comandos quefazem o computador realizar determinada tarefa(Programas de computador).
• Sistema Operacional: Coleção de programas quegerencia e aloca recursos de hardware e software (Linux, Unix, Windows).
Introdução a Computação
• Linguagem de Máquina: Conjunto de instruçõesque podem ser interpretados e executadosdiretamente pela CPU.
• Linguagem de alto nível: Linguagem queindepende do conjunto de instrucões da linguagem de máquina (Pascal, C, Algol, BASIC).
• Compilador: Tradutor de programas escritos emuma linguagem de programação para programas emlinguagem de máquina (GCC).
Introdução a Computação
Introdução a Computação
Bits e Bytes:
• A menor unidade de informação de um computadoré o Bit, um Bit pode assumir os valores 0 ou 1.
• Um Byte é um conjunto de oito Bits.
• Dados são armazenados na base binária não nadecimal.
0 = 000000001 = 0000000110 = 00001010255 = 11111111
Introdução a Computação
Desafio:
Você possui dez caixas vazias e deve distribuirnessas caixas 1000 moedas de tal forma que, quandosolicitado, você possa retornar um número qualquerde moedas sem retirá-las das caixas. Cada caixa comporta pelo menos 1000 moedas e osvalores solicitados serão todos maiores que zero.
Introdução a Computação
Solução:
Usando a base binária…
Caixas com:1 moeda 256 moedas2 moedas 488 moedas4 moedas8 moedas16 moedas32 moedas64 moedas128 moedas
Introdução a Computação
Existem 10 tipos de pessoas…aquelas que entendem binário…
e as que não entendem.
Introdução a Computação
Desafio:
Em um lado de um rio se encontram, você, um lobo um coelho e um repolho. Você possui uma canoa que te permite levar apenasum deles de cada vez, sabendo que caso o lobo fiquesozinho com o coelho o lobo o come e o mesmoacontece quando o coelho fica sozinho com o repolho. Como fazer para atravessar todos eles em segurançapara a outra margem do rio?
Introdução a Computação
Desafio:
Suponha que você possui 3 pinos, A, B e C e que nopino A estão dispostos 3 discos de tamanhosdiferentes em ordem crescente de cima para baixo(menor em cima). O objetivo é levar os 3 discos do pino A para o pino C, usando o pino B como auxiliare obedecendo as seguintes restrições:
•Pode-se mover apenas 1 pino de cada vez
•Não se pode colocar um pino maior sobre um menor.
Introdução a Computação
http://freeweb.supereva.com/nessunoforever/flash/hanoi/index.htm?p
Introdução a Computação
Algoritmos:
• Um algoritmo é uma seqüência de passos com o objetivo de executar uma tarefa.
• São muito comuns, receitas, manuais
• As soluções para os problemas anteriores sãoalgoritmos.
• Computacionalmente:
“Um procedimento computacional que recebevalores de entrada e produz valores de saída.”
Introdução a Computação
Exemplo:
• Entrada: Uma seqüência aleatória de números.
• Saída: A mesma seqüência de números ordenada.
Se a entrada é :(8, 49, 12, 23)
o seu algoritmo deve produzir como saída:(8, 12, 23, 49)
• Algoritmo Correto: Sempre termina e paraqualquer instância de entrada produz uma saídacorreta
Introdução a Computação
Algoritmo de Euclides (Cálculo do MDC):
• Entrada: 2 valores inteiros positivos m e n (m > n).• Saída: O Máximo Divisor Comum de m e n.
• Passo 1: Faça x = m e y = n• Passo 2: Calcule o resto de x por y, isto ér = x mod y• Passo 3: Faça x = y e y = r• Passo 4: Se r != 0 (r diferente de zero) volte para o passo 2, senão retorne x como resposta.
mdc(x, y) = mdc(y, x mod y)mdc(x, 0) = x
Introdução a Computação
Computacionalmente:
x recebe my recebe nRepita
r recebe x mod yx recebe yy recebe r
Até que r == 0Imprime x
Introdução a Computação
Na linguagem C:
x = m;y = n;do {
r = x % y;x = y;y = r;
}while( r != 0 );printf(“%d”, x);
Introdução a Computação
Para ver depois:
• JL Hennessy e DA Patterson, “Arquitetura de Computadores – Uma Abordagem Quantitativa” Ed Campus.
• Mais desafios: http://www2.fundao.pro.br/pages/desafios.asp
• Torre de Hanoi:http://freeweb.supereva.com/nessunoforever/flash/hanoi/index.htm?p
• Página da disciplina:http://www.las.ic.unicamp.br/~chenca/mc102/mc102.html
Linguagem C
Características da Linguagem C:
• linguagem estruturada em bloco simples, ou seja, é composta basicamente por funções e variáveis.
• C é sensível ao caso, letras maiúsculas e minúsculas são tratadas como caracteres separados.
MDC != Mdc != mdcmain != Main != maiN
Primeiro Programa em C/*MC102 - Primeiro Programa em C - Cálculo do MDC */#include<stdio.h>int main(){
int m = 76;int n = 42;int x, y, r;x = m;y = n;do{
r = x % y;x = y;y = r;
}while( r != 0 );printf("O MDC entre %d e %d eh: %d\n", m, n, x);return 0;
}
Estruturas de um ProgramaComentários:
/*MC102 - Primeiro Programa em C - Cálculo do MDC */
• São ignorados pelo compilador.• Ajudam no entendimento do código.• Funcionam como lembretes.• Em C comentários começam com /* .• Terminam com */ .• Podem ter mais de uma linha.• Não se pode criar um comentário dentro de outro.• Deverão ser usados nos laboratórios.
/*MC102 – Lab 0x Nome: Ra: */
Estruturas de um ProgramaInclusão de Arquivos:
#include<stdio.h>
• Avisam ao compilador que neste programa serão usados os procedimentos, funções e variáveis declarados no arquivo especificado (no caso stdio.h).
• Permite o reutilização de código• Não é necessário saber como funciona• Basta saber o nome e onde está implementado.• Outras inclusões muito comuns em C:
#include<math.h> /*Funções Matemáticas */#include<stdlib.h> /*Funções de Gerência de Memória*/#include<string.h> /*Funções de Manipulação de Strings */
Estruturas de um ProgramaFunção main:
int main(){ … }
• Função principal do programa.• Todo programa em C deve ter uma.• O programa começa a ser executado na primeira
linha da main.• O programa termina quando a última linha da
função main é executada.
Estruturas de um ProgramaDeclarações:
int m = 76;int x, y;
• Informam ao compilador o nome e o tipo da variável.
• Desse modo é possível saber quanto de memória será utilizada.
• Deve ser feita sempre no início de cada bloco ({).• Terminam sempre com ‘;’
int x, y; É a mesma coisa que
int x;int y;
Estruturas de um ProgramaComandos:
y = n; r = x % y;
• São as ações do programa.• Sempre terminam com ‘;’• Podemos ter mais de um comando por linha.• Sempre terminam com ‘;’• Como cada comando termina com ‘;’ não é preciso
colocar ‘;’ depois de }
Entrada e Saídaprintf:
printf("O MDC entre %d e %d eh: %d\n", m, n, x);
• Utilizado para imprimir na tela.• Comando da biblioteca stdio.h• Composto por
– String de Formato– Lista de Argumentos
• Imprime a partir do último caracter impresso.• Não muda de linha até que a linha acabe ou que
encontre um \n.
Entrada e SaídaString de Formato (printf):
• Como imprimir o produto de 3 por 4 ?
printf(“12");
• Como imprimir o produto de 65487 por 236597 ?
printf(“??????????????");
Entrada e SaídaString de Formato (printf):
• Cadeia de caracteres que informam como será a saída.
• Pode conter variáveis.• Variáveis são indicadas pelo caracter ‘%’• Cada variável na string de formato é preenchida
por uma variável na lista de argumentos.
printf("O MDC entre %d e %d eh: %d\n", m, n, x);
Entrada e SaídaAlgumas possíveis variáveis:
• %d: Para números inteiros (int).• %f: Para números de ponto-flutuante (float).• %c: Para caracteres (char).• %s: Para cadeias de caracteres (“…”).
Entrada e SaídaLista de Argumentos (printf):
• Depende da String de Formato.• Separados por ‘,’ .• Podem ser variáveis ou constantes .
int p = 65487 * 236597 ;printf("O Produto entre %d e %d eh: %d\n", 65487, 236597 , p);
Entrada e SaídaCaracteres especiais:
• Qual o resultado do comando?
printf("Olá Mundo”);
• Saída: Olá Mundo• Qual o resultado do comando?
printf("Olá ”);printf("Mundo”);
Entrada e SaídaCaracteres especiais:
• Utilizados para indicar quebra de linha.• Indicar tabulação.• Caracteres reservados.• Ex.:
\n - Quebra de linha\t - Tabulação\” - Caracter “\% - Caracter %\a - Sinal de alerta (beep)
Entrada e SaídaO que será impresso?
printf(“\n\t****\n\t*\n\t*\n\t*\n\t*\n\t****\n”);
Entrada e SaídaOnde está o erro?
printf(“\n %d dividido por %d eh %d e o resto eh %d \n”, x, y, resultado)
Entrada e Saídascanf:
printf(“Entre com o seu ra: ");scanf(“%d", &x);
• Utilizado para receber informações do teclado.• Recebe o valor digitado pelo usuário.• Ativada após a tecla “enter” ser pressionada.• Estrutura similar ao printf.• Composto por
– String de Formato– Lista de Argumentos
Entrada e SaídaString de Formato (scanf):
• Cadeia de caracteres que informam como será a entrada.
• Sempre contém variáveis.• Variáveis são indicadas pelo caracter ‘%’• Mesmo tipos de variáveis do printf.
Entrada e SaídaLista de Argumentos (scanf):
• Depende da String de Formato.• Separados por ‘,’ .• Sempre variáveis.• As variáveis devem ser precedidas por ‘&’.
int ra;float media;printf(“Entre com o RA do aluno e sua media: ");scanf(“%d %f“, &ra, &media);
Entrada e SaídaExercício:
Alterar o programa MDC (lab01) para que o mesmo, ao invés de calcular o MDC entre dois valores fixos,solicite ao usuário que informe entre quais valoresele deseja calcular o MDC.
O programa deve ler esses valores, calcular o MDC eretornar a resposta ao usuário.
Entrada e Saída/*MC102 - Primeiro Programa em C - Cálculo do MDC */#include<stdio.h>int main(){
int m = 76;int n = 42;int x, y, r;x = m;y = n;do{
r = x % y;x = y;y = r;
}while( r != 0 );printf("O MDC entre %d e %d eh: %d\n", m, n, x);return 0;
}
Entrada e Saída/*MC102 - Primeiro Programa em C - Cálculo do MDC */#include<stdio.h>int main(){
int m;int n;int x, y, r;
printf(“Entre com os valores desejados: ");scanf("%d %d", &m, &n);
x = m;y = n;do{
r = x % y;x = y;y = r;
}while( r != 0 );printf("O MDC entre %d e %d eh: %d\n", m, n, x);return 0;
}
Entrada e SaídaExercício:
Escreva um programa em linguagem C que lê umatemperatura em Celsius e imprime o valor desta temperatura em Farenheit.
P.s.: F = C * (9.0 / 5.0) + 32.0
Repita o mesmo exercício mas convertendo de Farenheit para Celsius.
1
Linguagem C
Características da Linguagem C:
• linguagem estruturada em bloco simples, ou seja, é composta basicamente por funções e variáveis.
• C é sensível ao caso, letras maiúsculas e minúsculas são tratadas como caracteres separados.
MDC != Mdc != mdcmain != Main != maiN
Primeiro Programa em C/*MC102 - Primeiro Programa em C - Cálculo do MDC */
#include<stdio.h>int main()
{
int m = 76;
int n = 42;
int x, y, r;
x = m;
y = n;do
{
r = x % y;
x = y;
y = r;
}while( r != 0 );
printf("O MDC entre %d e %d eh: %d\n", m, n, x);
return 0; }
Estruturas de um Programa
Comentários:
/*MC102 - Primeiro Programa em C - Cálculo do MDC */
• São ignorados pelo compilador.• Ajudam no entendimento do código.• Funcionam como lembretes.• Em C comentários começam com /* .• Terminam com */ .• Podem ter mais de uma linha.• Não se pode criar um comentário dentro de outro.• Deverão ser usados nos laboratórios.
/*MC102 – Lab 0x Nome: Ra: */
Estruturas de um Programa
Inclusão de Arquivos:
#include<stdio.h>
• Avisam ao compilador que neste programa serão usados os procedimentos, funções e variáveis declarados no arquivo especificado (no caso stdio.h).
• Permite o reutilização de código• Não é necessário saber como funciona• Basta saber o nome e onde está implementado.• Outras inclusões muito comuns em C:
#include<math.h> /*Funções Matemáticas */
#include<stdlib.h> /*Funções de Gerência de Memória*/
#include<string.h> /*Funções de Manipulação de Strings */
2
Estruturas de um Programa
Função main:int main()
{ … }
• Função principal do programa.• Todo programa em C deve ter uma.• O programa começa a ser executado na primeira
linha da main.• O programa termina quando a última linha da
função main é executada.
Estruturas de um Programa
Declarações:
int m = 76;
int x, y;
• Informam ao compilador o nome e o tipo da variável.
• Desse modo é possível saber quanto de memória será utilizada.
• Deve ser feita sempre no início de cada bloco ({).• Terminam sempre com ‘;’
int x, y;
É a mesma coisa queint x;int y;
Estruturas de um Programa
Comandos:
y = n;
r = x % y;
• São as ações do programa.• Sempre terminam com ‘;’• Podemos ter mais de um comando por linha.• Sempre terminam com ‘;’• Como cada comando termina com ‘;’ não é preciso
colocar ‘;’ depois de }
Entrada e Saída
printf:
printf("O MDC entre %d e %d eh: %d\n", m, n, x);
• Utilizado para imprimir na tela.• Comando da biblioteca stdio.h• Composto por
– String de Formato– Lista de Argumentos
• Imprime a partir do último caracter impresso.• Não muda de linha até que a linha acabe ou que
encontre um \n.
3
Entrada e Saída
String de Formato (printf):
• Como imprimir o produto de 3 por 4 ?
printf(“12");
• Como imprimir o produto de 65487 por 236597 ?
printf(“??????????????");
Entrada e Saída
String de Formato (printf):
• Cadeia de caracteres que informam como será a saída.
• Pode conter variáveis.• Variáveis são indicadas pelo caracter ‘%’• Cada variável na string de formato é preenchida
por uma variável na lista de argumentos.
printf("O MDC entre %d e %d eh: %d\n", m, n, x);
Entrada e Saída
Algumas possíveis variáveis:
• %d: Para números inteiros (int).• %f: Para números de ponto-flutuante (float).• %c: Para caracteres (char).• %s: Para cadeias de caracteres (“…”).
Entrada e Saída
Lista de Argumentos (printf):
• Depende da String de Formato.• Separados por ‘,’ .• Podem ser variáveis ou constantes .
int p = 65487 * 236597 ;printf("O Produto entre %d e %d eh: %d\n", 65487, 236597 , p);
4
Entrada e Saída
Caracteres especiais:
• Qual o resultado do comando?
printf("Olá Mundo”);
• Saída: Olá Mundo• Qual o resultado do comando?
printf("Olá ”);printf("Mundo”);
Entrada e Saída
Caracteres especiais:
• Utilizados para indicar quebra de linha.• Indicar tabulação.• Caracteres reservados.• Ex.:
\n - Quebra de linha\t - Tabulação\” - Caracter “\% - Caracter %\a - Sinal de alerta (beep)
Entrada e Saída
O que será impresso?
printf(“\n\t****\n\t*\n\t*\n\t*\n\t*\n\t****\n”);
Entrada e Saída
Onde está o erro?
printf(“\n %d dividido por %d eh %d e o resto eh %d \n”,
x, y, resultado)
5
Entrada e Saída
scanf:printf(“Entre com o seu ra: ");
scanf(“%d", &x);
• Utilizado para receber informações do teclado.• Recebe o valor digitado pelo usuário.• Ativada após a tecla “enter” ser pressionada.• Estrutura similar ao printf.• Composto por
– String de Formato– Lista de Argumentos
Entrada e Saída
String de Formato (scanf):
• Cadeia de caracteres que informam como será a entrada.
• Sempre contém variáveis.• Variáveis são indicadas pelo caracter ‘%’• Mesmo tipos de variáveis do printf.
Entrada e Saída
Lista de Argumentos (scanf):
• Depende da String de Formato.• Separados por ‘,’ .• Sempre variáveis.• As variáveis devem ser precedidas por ‘&’.
int ra;
float media;
printf(“Entre com o RA do aluno e sua media: ");scanf(“%d %f“, &ra, &media);
Entrada e Saída
Exercício:
Alterar o programa MDC (lab01) para que o mesmo, ao invés de calcular o MDC entre dois valores fixos,solicite ao usuário que informe entre quais valoresele deseja calcular o MDC.
O programa deve ler esses valores, calcular o MDC eretornar a resposta ao usuário.
6
Entrada e Saída/*MC102 - Primeiro Programa em C - Cálculo do MDC */
#include<stdio.h>int main()
{
int m = 76;
int n = 42;
int x, y, r;
x = m;
y = n;do
{
r = x % y;
x = y;
y = r;
}while( r != 0 );
printf("O MDC entre %d e %d eh: %d\n", m, n, x);
return 0; }
Entrada e Saída/*MC102 - Primeiro Programa em C - Cálculo do MDC */
#include<stdio.h>int main(){int m;int n;int x, y, r;
printf(“Entre com os valores desejados: ");scanf("%d %d", &m, &n);
x = m;y = n;
do{
r = x % y;x = y;y = r;
}while( r != 0 );printf("O MDC entre %d e %d eh: %d\n", m, n, x);return 0;
}
Entrada e Saída
Exercício:
Escreva um programa em linguagem C que lê umatemperatura em Celsius e imprime o valor desta temperatura em Farenheit.
P.s.: F = C * (9.0 / 5.0) + 32.0
Repita o mesmo exercício mas convertendo de Farenheit para Celsius.
1
Variáveis
Variáveis em C:
• São objetos que não possuem valor fixo.• Representam uma região da memória (gaveta).• Cada variável está associada a um tipo.• Podem armazenar apenas um único valor a cada
instante.• Os valores são armazenados em binário.
Ex.:
int i = 76;
char c = ‘a’;
float f = 3.1415926536;
Tipos
Os Tipos Básicos de C são:
• char
• int
• float
• double
Tipos
char :
• Representam os caracteres.• Possuem tamanho de 1 byte (8 bits).• Representam valores entre -127 e 127.• Cada valor está associado a um símbolo na tabela
ASCII.• Formato para impressão é %c
Ex.:char c1 = ‘a’;
char c2 = ‘@’;
Tipos
Tabela ASCII American Standard Code for Information Interchange
2
Tipos
int :
• Representam os números inteiros.• Possuem tamanho de 4 bytes (32 bits).• O primeiro bit indica o sinal.• Podem representar valores entre:
-2147483648 e + 2147483647• Formato para impressão é %d
Tipos
float :
• Representam os números de ponto-flutuante (com vírgula).
• Possuem tamanho de 4 bytes (32 bits).• O primeiro bit indica o sinal, os 7 seguintes e
expoente e os 24 restantes a mantissa.• Podem representar valores positivos entre:
2E-38 e 2E+38.• Podem representar valores negativos entre:
-2E+38 e -2E-38.• Formato para impressão é %f
Tipos
double :
• Também representam os números de ponto-flutuante (com vírgula).
• Possuem tamanho de 8 bytes (64 bits).• O primeiro bit indica o sinal, os 11 seguintes e
expoente e os 52 restantes a mantissa.• Podem representar valores positivos entre
2E-308 e 2E+308.• Podem representar valores negativos entre
-2E+308 e -2E-308.• Formato para impressão é %lf
Variáveis
Declaração de Variáveis em C:
nome_tipo + lista_identificadorers + ;
• nome_tipo: int, char, float, double…• lista_identificadorers: conjunto de identificadores
separados por ‘,’.
Ex.:
int i;
char a, b, c;
3
Variáveis
Identificadores:
• São os rótulos (nomes) das variáveis.• São compostos sempre por letras e dígitos.• Começam sempre com letra.• O caracter ‘_’ (underline) também é considerado
letra.• Não podem coincidir com as palavras reservadas da
linguagem.Certo Erradox1 1x
nome_casa int
Variáveis
Palavras reservadas do C:
whilevolatilevoidunsigneduniontypedefswitchstruct
staticsizeofsignedshortreturnregisterlongint
ifgotoforfloatexternenumelsedouble
dodefaultcontinueconstcharcasebreakauto
• Não podem ser usadas como identificadores• São sempre grafadas em letras minúsculas.
Variáveis
Atribuição de Variáveis:
• Pode ser feito na declaração ou através de um comando.
Ex.:
int i = 0;
i = 0;
Variáveis
Modificador unsigned:
• Diz ao compilador que os valores daquele tipo são todos positivos.
• O primeiro bit passa a fazer parte da representação.• Muda o intervalo de representação.• Aparece antes do nome do tipo.
Ex.:
unsigned int i = 32569;
4
Variáveis
• unsigned char 0 até 255• unsigned int 0 até (2E+32 - 1)
Outros Modificadores:
• long
• const
• static
• volatile
Variáveis
Exercício:
Escreva um programa em Linguagem C que imprima na tela os seguintes dados:
1. Seu nome – string (entre “”)2. Seu sexo (M ou F ou I) – tipo char3. Sua idade – tipo int4. Seu peso – tipo float
Variáveis
Exercício:
Escreva um programa em Linguagem C que requisite os seguintes dados para o usuário:
1. Nome – string (entre “”)2. Sexo (M ou F ou I) – tipo char
3. Idade – tipo int4. Peso – tipo float
1
Constantes
Exemplo:
#include<stdio.h>int main()
{
float raio, peri, area;
printf(“Entre com o raio :”);
scanf(“%f”, &raio) ;
area = 3.14 * raio * raio;
peri = 2 * 3.14 * raio;
printf(“Perimetro = %.6f \n Area = %.6f \n", peri, area);
return 0;
}
Constantes
Problema:
E se notássemos que Pi precisa ter pelo menos 4casas decimais? Imagine que seu programa tem maisde 1000 linhas e Pi aparece 326 vezes no código.
• Variáveis ocupam espaço na memória.• O valor de Pi não muda durante a execução do
programa
Como resolver ???
Constantes
Solução:
#include<stdio.h>
#define Pi 3.141593
int main()
{
float raio, peri, area;
printf(“Entre com o raio :”);
scanf(“%f”, &raio) ;
area = Pi * raio * raio;
peri = 2 * Pi * raio;
printf(“Perimetro = %.6f \n Area = %.6f \n", peri, area);
return 0;
}
Constantes
Constantes Simbólicas:
# define + nome + valor
• Não possuem tipo.• São substituídas antes do código ser compilado.• Não terminam com ‘;’• Não utilizam o operador ‘=‘• São precedidas por “# define“• A regra para criação dos nomes é a mesma para
criação de nomes de variáveis.
2
Constantes
Exemplos:
# define PI 3.141593
# define MASCULINO ‘m’
# define NOME “Renato”
Operadores
Operadores Aritméticos:
Resto%
Divisão/
Multiplicação*
Subtração-
Soma+
FinalidadeOperador
Operadores
Operadores Aritméticos:
• Precedência: * / % > + -
• Assim: 3 + 5 * 7 == 3 + (5 * 7)
• Associatividade da esquerda para direita.
• Assim: 3 * 5 % 2 == (3 * 5) % 2
• Para resolvermos “problemas” de precedência utilizamos parênteses. Ex.:
raiz = (-B + Delta) / (2 * A)
Operadores
Operadores Aritméticos:
• Devem ser utilizados com valores numéricos apenas. (char pode?)
• Operador % só pode ser utilizado com operandos inteiros.
• Operador / quando utilizado com operandos inteiros retorna um valor inteiro.
• Divisão por zero interrompe a execução do programa.
3
Divisão por Zero
A = 1, B = 1
A = B
multiplica por A dos dois lados…
A2 = AB
subtrai B2 dos dois lados…
A2 - B2 = AB - B2
fatorando...
(A – B)(A + B) = B(A – B)
corta (A – B) dos dois lados…
A + B = B
2 = 1
Operadores
Operadores Relacionais:
!=
==
<=
>=
<
>
Operador
Diferente
Igual
Menor ou igual que
Maior ou igual que
Menor que
Maior que
Finalidade
Operadores
Operadores Relacionais:
• Retornam 1 quando a expressão é verdadeira e zero se for falsa.
• Todos possuem a mesma precedência.• Associatividade da esquerda para direita.• Possuem precedência menor que qualquer operador
aritmético.
Ex.:
3 * 5 > 8 – 10
3 + 4 != 7
Operadores
Operadores Lógicos:
||
&&
Operador
OU lógico (or)
E lógico (and)
Finalidade
4
Operadores
Operadores Lógicos:
• Retornam 1 quando a expressão é verdadeira e zero se for falsa.
• Precedência: && > ||
• Associatividade da esquerda para direita.• Possuem precedência menor que qualquer operador
relacional.
Ex.:
3 * 5 > 8 – 10 && 3 + 4 != 7
3 * 5 > 8 – 10 || 3 + 4 != 7
Operadores
Operadores Unários:
Incremento++Negação!
Decremento--
Indica sinal positivo+
-
OperadorIndica sinal negativo
Finalidade
Operadores
Operadores Unários:• + ou - : Indicam o sinal da variável ou constante.
Ex.:+3 == -B
• ++ ou -- : Incrementam ou decrementam de 1 o valor da variável, devem ser usado sempre com variáveis. Ex:
i++; é o mesmo que i = i + 1;
j--; é o mesmo que j = j - 1;
• ! : Troca tudo que for diferente de zero por 0, e troca zero por 1. Ex.:
3 * 5 > 8 – 10 || !(3 + 4 != 7)
Operadores
Operadores Unários:
• Possuem precedência maior que qualquer outro operador.
• Associatividade da esquerda para direita.
5
Operadores
Conversão de Tipos:
• Numa expressão todos os operandos são convertidos para o mesmo tipo.
• Sempre convertidos para o tipo maior.• Durante uma atribuição com tipos diferentes podem
aparecer aviso do compilador (WARNINGS).Ex.:
int A = 3.141593;
float B = A;
A = 5 / 2;
A = 4.0 / 2.0;
Operadores
Exercício:
Faça um programa que solicite ao usuário a nota de
suas 3 provas e imprima a média aritmética delas.
Operadores
Exercício:
Repita o exercício anterior usando apenas duas
variáveis.
Operadores
Exercício:
Faça um programa que calcula a média de provas dadisciplina MC102 (a fórmula está na ementa do curso),utilize duas variáveis apenas.
Aula Passada#include<stdio.h>#define PESO1 0.3#define PESO2 0.3#define PESO3 0.4int main(){
float nota, media;printf("\nEntre com a primeira nota: ");scanf("%f", ¬a);media = nota * PESO1;printf("\nEntre com a segunda nota: ");scanf("%f", ¬a);media += nota * PESO2;printf("\nEntre com a terceira nota: ");scanf("%f", ¬a);media += nota * PESO3;printf("\nA media das notas eh: %f\n ", media);return 0;
}
Comandos Condicionais
Problema:
Escreva um programa que lê dois números inteiros (a e b) e imprime como saída o maior deles.
• Temos duas saídas possíveis.• Só uma deve ser executada.
Como resolver ???
Comandos Condicionais
Definição:
Uma estrutura condicional permite a escolha de um grupo de comandos ou instruções a ser executadoquando determinada condição, composta porexpressões aritméticas, e/ou operadores relacionais, e/ou operadores lógicos é satisfeita, ou seja éverdadeira != 0.
Comandos Condicionais
Em linguagem C:
if( expressão ){
comando1;comando2;…comandoN;
}
Comandos CondicionaisResposta:
#include<stdio.h>int main(){
int a, b;printf("\nEntre com os numeros: ");scanf("%d%d", &a, &b);if( a > b ){
printf("\nO maior numero eh: %d\n ", a);}if( b >= a ){
printf("\nO maior numero eh: %d\n ", b);}return 0;
}
Comandos Condicionais
Comando if:
• O bloco de comandos é executado apenas se a expressão é verdadeira, ou seja, tem valor diferente de zero.
• Quando o bloco de comandos possui apenas um comando não é necessário o uso de { }.
• Quando a expressão é falsa, a execução do programa passa para o comando seguinte ao bloco de comandos.
Comandos CondicionaisProblema:
O programa anterior realiza duas comparações, sendoque uma delas é desnecessária, como evitá-la?
if( a > b ){
printf("\nO maior numero eh: %d\n ", a);}if( b >= a ){
printf("\nO maior numeor eh: %d\n ", b);}
Comandos CondicionaisResposta:
#include<stdio.h>int main(){
int a, b;printf("\nEntre com os numeros: ");scanf("%d%d", &a, &b);if( a > b )printf("\nO maior numero eh: %d\n ", a);
elseprintf("\nO maior numeor eh: %d\n ", b);
return 0;}
Comandos Condicionais
Comando else:
• Deve sempre estar precedido de um if.• O bloco de comandos é executado apenas se a
expressão é falsa, ou seja, tem valor igual a zero.• Quando o bloco de comandos possui apenas um
comando não é necessário o uso de { }.• O else é opcional ( if pode ter ou não um else,
mas todo else tem um if ).
Comandos Condicionais
Exercício:
Escreva um programa que calcula a média final dosalunos de MC102 das turmas P e R. Solicite aousuário apenas as notas de prova, considere quetodos os alunos entregaram todos os exercícios delaboratório. Imprima como saída a media final doaluno e uma mensagem dizendo se o aluno foiaprovado ou está de exame.
Comandos CondicionaisExercício:
Faça um programa que imprime o maior entre 3números inteiros distintos (a, b, c).
Comandos Condicionais#include<stdio.h>int main(){
int a, b, c;printf("\nEntre com os numeros: ");scanf("%d%d", &a, &b, &c);if( a > b && a > c)printf("\nO maior numero eh: %d\n ", a);
if( b > a && b > c)printf("\nO maior numero eh: %d\n ", b);
if( c > a && c > b)printf("\nO maior numero eh: %d\n ", c);
return 0;}
Comandos CondicionaisProblema:
Faça um programa que imprime o maior entre 3números inteiros distintos. O programa deve realizarapenas duas comparações.
Comandos Condicionais#include<stdio.h>int main(){
int a, b, c;printf("\nEntre com os numeros: ");scanf("%d%d", &a, &b, &c);if( a > b ){
if( a > c )printf("\nO maior numero eh: %d\n ", a);
elseprintf("\nO maior numero eh: %d\n ", c);
}else{
if( b > c )printf("\nO maior numero eh: %d\n ", b);
elseprintf("\nO maior numero eh: %d\n ", c);
}return 0;
}
Comandos Condicionais
Comando Condicionais Aninhados:
• A quantidade de if-else aninhados depende da vontade do programador.
• Cada else está relacionado ao if que se encontra no mesmo bloco.
Comandos Condicionais
Exercício:
Escreva um programa que lê 3 valores inteiros eimprime como saída os mesmos valores em ordemcrescente.
Comandos Condicionais
Exercício:
Escreva um programa em linguagem C que solicita aousuário os coeficientes A, B, e C de uma equação dosegundo grau, e imprime, se existirem, o(s) valor(es)da(s) raíz(es) da equação. Caso não existam raízesreais o programa deve informar o usuário deste fato.
1
Aula Passada
#include<stdio.h>#define PESO1 0.3#define PESO2 0.3#define PESO3 0.4int main(){
float nota, media;printf("\nEntre com a primeira nota: ");scanf("%f", ¬a);media = nota * PESO1;printf("\nEntre com a segunda nota: ");scanf("%f", ¬a);media += nota * PESO2;printf("\nEntre com a terceira nota: ");scanf("%f", ¬a);media += nota * PESO3;printf("\nA media das notas eh: %f\n ", media);return 0;
}
Comandos Condicionais
Problema:
Escreva um programa que lê dois números inteiros (a e b) e imprime como saída o maior deles.
• Temos duas saídas possíveis.• Só uma deve ser executada.
Como resolver ???
Comandos Condicionais
Definição:
Uma estrutura condicional permite a escolha de um grupo de comandos ou instruções a ser executadoquando determinada condição, composta porexpressões aritméticas, e/ou operadores relacionais, e/ou operadores lógicos é satisfeita, ou seja éverdadeira != 0.
Comandos Condicionais
Em linguagem C:
if( expressão )
{
comando1;
comando2;
…
comandoN;
}
2
Comandos Condicionais
Resposta:
#include<stdio.h>int main()
{
int a, b;
printf("\nEntre com os numeros: ");
scanf("%d%d", &a, &b);
if( a > b )
{printf("\nO maior numero eh: %d\n ", a);
}
if( b >= a )
{
printf("\nO maior numero eh: %d\n ", b);
}
return 0;
}
Comandos Condicionais
Comando if:
• O bloco de comandos é executado apenas se a expressão é verdadeira, ou seja, tem valor diferente de zero.
• Quando o bloco de comandos possui apenas um comando não é necessário o uso de { }.
• Quando a expressão é falsa, a execução do programa passa para o comando seguinte ao bloco de comandos.
Comandos Condicionais
Problema:
O programa anterior realiza duas comparações, sendoque uma delas é desnecessária, como evitá-la?
if( a > b ){
printf("\nO maior numero eh: %d\n ", a);}if( b >= a ){
printf("\nO maior numeor eh: %d\n ", b);}
Comandos Condicionais
Resposta:
#include<stdio.h>int main(){
int a, b;printf("\nEntre com os numeros: ");scanf("%d%d", &a, &b);if( a > b )printf("\nO maior numero eh: %d\n ", a);
elseprintf("\nO maior numeor eh: %d\n ", b);
return 0;}
3
Comandos Condicionais
Comando else:
• Deve sempre estar precedido de um if.• O bloco de comandos é executado apenas se a
expressão é falsa, ou seja, tem valor igual a zero.• Quando o bloco de comandos possui apenas um
comando não é necessário o uso de { }.• O else é opcional ( if pode ter ou não um else,
mas todo else tem um if ).
Comandos Condicionais
Exercício:
Escreva um programa que calcula a média final dosalunos de MC102 das turmas P e R. Solicite aousuário apenas as notas de prova, considere quetodos os alunos entregaram todos os exercícios delaboratório. Imprima como saída a media final doaluno e uma mensagem dizendo se o aluno foiaprovado ou está de exame.
Comandos Condicionais
Exercício:
Faça um programa que imprime o maior entre 3números inteiros distintos (a, b, c).
Comandos Condicionais
#include<stdio.h>int main(){
int a, b, c;printf("\nEntre com os numeros: ");scanf("%d%d", &a, &b, &c);if( a > b && a > c)printf("\nO maior numero eh: %d\n ", a);
if( b > a && b > c)printf("\nO maior numero eh: %d\n ", b);
if( c > a && c > b)printf("\nO maior numero eh: %d\n ", c);
return 0;}
4
Comandos Condicionais
Problema:
Faça um programa que imprime o maior entre 3números inteiros distintos. O programa deve realizarapenas duas comparações.
Comandos Condicionais
#include<stdio.h>int main(){int a, b, c;printf("\nEntre com os numeros: ");scanf("%d%d", &a, &b, &c);
if( a > b ){
if( a > c )printf("\nO maior numero eh: %d\n ", a);
elseprintf("\nO maior numero eh: %d\n ", c);
}else{
if( b > c )printf("\nO maior numero eh: %d\n ", b);
else
printf("\nO maior numero eh: %d\n ", c);}return 0;
}
Comandos Condicionais
Comando Condicionais Aninhados:
• A quantidade de if-else aninhados depende da vontade do programador.
• Cada else está relacionado ao if que se encontra no mesmo bloco.
Comandos Condicionais
Exercício:
Escreva um programa que lê 3 valores inteiros eimprime como saída os mesmos valores em ordemcrescente.
5
Comandos Condicionais
Exercício:
Escreva um programa em linguagem C que solicita aousuário os coeficientes A, B, e C de uma equação dosegundo grau, e imprime, se existirem, o(s) valor(es)da(s) raíz(es) da equação. Caso não existam raízesreais o programa deve informar o usuário deste fato.
UNIVERSIDADE FEDERAL DE OURO PRETOINSTITUTO DE CIÊNCIAS EXATAS E BIOLÓGICASDEPARTAMENTO DE COMPUTAÇÃOCIC107 – PROGRAMAÇÃO DE COMPUTADORES I
5ª Aula prática
Estrutura de repetição “for”
Seu formato é for (inicialização; condição; incremento) comando interno;
e sua finalidade é repetir o “comando interno” enquanto a “condição” permanecer verdadeira. É semelhante à estrutura “while” da aula anterior, mas a estrutura “for” prevê campos específicos para “inicialização” e para estabelecer “incremento”. É especialmente projetada para executar uma ação repetida sob controle de um contador que é incrementado em cada iteração (repetição).
Ela trabalha da seguinte forma:1. inicialização é executada; visa, geralmente, a atribuição de valor a uma variável contadora;2. condição é verificada; se é verdadeira a repetição continua, senão a repetição é encerrada e o
“comando interno” não é mais executado;3. comando interno é executado. Na verdade, pode ser um comando composto, ou bloco de comandos,
entre chaves { };4. finalmente, incremento é executado e o processo retorna para o passo 2 acima.
Exemplo 1 : programa para calcular o fatorial de um número.#include <iostream>using namespace std;main(){
int x, fat;cout << "Digite um número inteiro: ";cin >> x;fat = 1;for ( int i=2; i<=x; i=i+1 ) fat = fat * i;cout << "fatorial: " << fat << endl;
system("pause");}
Exemplo 2 : programa que imprime todos os divisores de um número#include <iostream>using namespace std;main(){
int x;cout << "Digite um número: ";cin >> x;for ( int i=x; i >= 1; i=i-1 ) if ( x%i = = 0 )
cout << i << " é divisor de " << x << endl; system("pause");}
Observações: 1. estamos designando como incremento algo que, na verdade, pode ser um decremento, como no
exemplo 2 acima;2. a instrução de incremento i=i+1 pode ser escrita como i++; também a instrução
i=i-1 pode ser escrita como i--;3. a estrutura “for” é muito mais flexível do que apresentado aqui. Quem quiser conhecer todas as
possibilidades deve consultar um livro ou um tutorial;
Exemplo 3 : programa que escreve uma mensagem com a seguinte estrutura:sonho sonho sonho sonho sonho sonho sonho sonho sonho sonho …#include <iostream>using namespace std;main(){ int linhas; cout << "Quantas linhas: "; cin >> linhas; for (int lin=1; lin<=linhas; lin++) { for (int col=1; col<=lin; col++) cout << "sonho "; cout << endl; } system("pause");}
Exercícios:
3)Crie um programa para imprimir a tabela de conversão de graus Celsius para Farenheit e Kelvin. A tabela deve abranger as temperaturas de 0oC a 100o C.
4)O valor aproximado do número π pode ser calculado usando-se a série: S = 1/13 - 1/33 + 1/53 - 1/73 + 1/93 - ...sendo π = (S *32)1/3.Escreva um programa para ler um número inteiro n, calcular e imprimir uma aproximação para o valor de π usando os n primeiros termos da série.
a) Altere o programa do exemplo 3 para imprimir o dobro do número de linhas especificado, formando uma configuração como exemplificado abaixo para número de linhas igual a 4.sonho
sonho sonho sonho sonho sonho sonho sonho sonho sonho sonho sonho sonho sonho sonho sonho
b) Altere o programa do exemplo 3 para imprimir o número de linhas especificado, com a seguinte configuração: sonho
sonho sonho sonho sonho sonho sonho sonho sonho sonho sonho sonho sonho sonho sonho sonho ........
1
Decisão Múltipla
Problema:
Escreva um programa que solicita ao usuário quedigite o seu RA e em seguida o programa retorna se ousuário está ou não matriculado na disciplina MC102.
Decisão Múltipla
Solução:
int RA;
scanf("%d", &RA);
if( RA == 042066 || RA == 042417 || … || RA == 044609 )
printf("\nO aluno esta matriculado\n ");
else
printf("\nO aluno NAO esta matriculado\n ");
Decisão Múltipla
Problema:
Agora seu programa deve dizer o nome do aluno caso ele esteja matriculado.
Decisão Múltipla
Em linguagem C:
switch( expressão )
{
case valor1 : bloco de comandos
case valor2 : bloco de comandos
…
case valorN : bloco de comandos
default : bloco de comandos
}
2
Decisão Múltipla
Definição:
O comando switch é uma estrutura condicional dedecisão múltipla que testa o valor de uma expressão edesvia o fluxo de execução do programa de acordocom o resultado do teste.
Decisão Múltipla
Solução:
int RA;
scanf("%d", &RA);
switch( RA )
{
case 042066 :
case 042417 :
…
case 044609 : printf("\nO aluno esta matriculado\n ");
break;
default : printf("\nO aluno NAO esta matriculado\n ");
}
Decisão Múltipla
switch:
• A expressão deve ter valor numérico.• Começa a executar o bloco de comandos a partir
do case que for igual ao valor da expressão.• Só para de executar os comandos quando
encontra um break ou chega ao fim do switch.• break é opcional e vem sempre seguido de ;• default é opcional e é executado quando nenhum
case for igual a expressão.
Decisão Múltipla
Exercício:
Escreva um programa que a partir do RA imprime onome do usuário, se ele estiver matriculado emMC102, caso contrário o programa avisa que o usuário
não está matriculado.P.s.: Considere apenas os seguintes alunos:
Ana 042066Camila 042417
Leo 044609Outro Leo 044635
3
Decisão Múltipla
Exercício:
Escreva um programa que solicita ao usuário quedigite um caracter e em seguida o programa imprimese esse caracter é ou não uma vogal.
Comandos Repetitivos
Problema:
• Escreva um programa que imprime os 3 primeirosnúmeros ímpares.
• Escreva um programa que imprime os 100primeiros números ímpares.
• Escreva um programa que imprime os n primeirosnúmeros ímpares, onde n é indicado pelo usuário.
Comandos Repetitivos
Comando do-while :
O comando do-while é uma instrução de repetiçãoonde a condição de parada é testada após a execuçãodo bloco de comandos. A execução continua até que acondição de parada seja falsa.
Comandos Repetitivos
Em linguagem C:
do{
comando 1;comando 2;…comando n;
} while( condição de parada );
Comandos RepetitivosExemplo:
int main(){
int x, y, r, m = 76, n = 42;x = m;y = n;
do{
r = x % y;x = y;y = r;
}while( r != 0 );
return 0; }
Comandos Repetitivos
Exercício:
Escreva um programa em linguagem C que imprime os100 primeiros números ímpares.
Comandos Repetitivos
Solução:
#include <stdio.h>int main (){
int num = 1, cont = 1;do{
printf (“%d\t”, num);num += 2;cont++;
} while (cont <= 100);}
Comandos Repetitivos
Exercício:
Escreva um programa em linguagem C que imprime osn primeiros números ímpares.
Comandos Repetitivos
Solução:
#include <stdio.h>int main (){
int num = 1, cont = 1, n;printf(“Entre com n ”);scanf(“%d”, &n);do{
printf (“%d\t”, num);num += 2;cont++;
} while (cont <= n);}
Comandos Repetitivos
Exercício:
Construa um programa que imprime a soma de todosos valores positivos digitados pelo usuário até que eledigite um numero negativo.
Comandos Repetitivos
Solução:
int n, soma = 0;do{
printf ( "Digite um numero positivo para ser somado ou negativo para sair: " );scanf ( "%d" , &n );
if ( n >= 0 )soma = soma + n;
}while ( n >= 0 ) ;printf ( "A soma eh %d\n" , soma );
Comandos Repetitivos
Comando while :
O comando while é uma instrução de repetiçãoonde a condição de parada é testa antes da execuçãodo bloco de comandos. A execução continua até que acondição de parada seja falsa. Possui 4 etapasbásicas:
• Inicialização da variável de controle.• Teste da condição de parada.• Execução do bloco de comandos.• Atualização da variável de controle.
Comandos Repetitivos
Em linguagem C:
inicializaçãowhile( condição de parada );{
comando 1;comando 2;…comando n;atualização
}
Comandos Repetitivos
Solução:
int n, soma = 0;printf ( "Digite um numero positivo, ou negativo para sair: ");scanf ( "%d" , &n );while ( n >= 0 ) {
soma = soma + n;printf ( "Digite um numero positivo, ou negativo para sair:" );scanf ( "%d" , &n );
}printf ( "A soma eh %d\n" , soma );
Comandos Repetitivos
Problema:
Qual é o melhor ? do-while ou while ? Analise oproblema da soma dos números positivos.
Comandos Repetitivos
Problema:
Reescreva o algoritmo para imprimir os n númerosímpares utilizando o comando while.
Comandos Repetitivos
Solução:
#include <stdio.h>int main (){
int num = 1, cont = 0, n;printf(“Entre com n ”);scanf(“%d”, &n);while (cont < n); {
printf (“%d\t”, num);num += 2;cont++;
}}
Comandos Repetitivos
Problema:
Escreva um programa que informa se um númerointeiro é par ou é ímpar. Este programa deve rodar atéque o usuário digite 0 (zero).
Comandos Repetitivos
Solução:
int n;do{
printf (“Entre um valor positivo (ou 0 para sair):");scanf ("%d", &n);if (n % 2 == 1)
printf ("%d eh impar\n", n);else
printf ("%d eh par\n", n);} while (n != 0);
1
Comandos Repetitivos
Problema:
• Escreva um programa que imprime os 3 primeirosnúmeros ímpares.
• Escreva um programa que imprime os 100primeiros números ímpares.
• Escreva um programa que imprime os n primeirosnúmeros ímpares, onde n é indicado pelo usuário.
Comandos Repetitivos
Comando do-while :
O comando do-while é uma instrução de repetiçãoonde a condição de parada é testada após a execuçãodo bloco de comandos. A execução continua até que a
condição de parada seja falsa.
Comandos Repetitivos
Em linguagem C:
do
{
comando 1;
comando 2;
…
comando n;
} while( condição de parada );
Comandos Repetitivos
Exemplo:
int main()
{int x, y, r, m = 76, n = 42;x = m;
y = n;
do{
r = x % y;x = y;y = r;
}while( r != 0 );
return 0; }
2
Comandos Repetitivos
Exercício:
Escreva um programa em linguagem C que imprime os100 primeiros números ímpares.
Comandos Repetitivos
Solução:
#include <stdio.h>
int main ()
{
int num = 1, cont = 1;
do
{
printf (“%d\t”, num);
num += 2;
cont++;
} while (cont <= 100);
}
Comandos Repetitivos
Exercício:
Escreva um programa em linguagem C que imprime osn primeiros números ímpares.
Comandos Repetitivos
Solução:
#include <stdio.h>
int main ()
{
int num = 1, cont = 1, n;
printf(“Entre com n ”);
scanf(“%d”, &n);
do
{
printf (“%d\t”, num);
num += 2;
cont++;
} while (cont <= n);
}
3
Comandos Repetitivos
Exercício:
Construa um programa que imprime a soma de todosos valores positivos digitados pelo usuário até que ele
digite um numero negativo.
Comandos Repetitivos
Solução:
int n, soma = 0;
do
{
printf ( "Digite um numero positivo para ser somado ou negativo para sair: " );
scanf ( "%d" , &n );
if ( n >= 0 )
soma = soma + n;
}while ( n >= 0 ) ;
printf ( "A soma eh %d\n" , soma );
Comandos Repetitivos
Comando while :
O comando while é uma instrução de repetiçãoonde a condição de parada é testa antes da execuçãodo bloco de comandos. A execução continua até que a
condição de parada seja falsa. Possui 4 etapasbásicas:
• Inicialização da variável de controle.• Teste da condição de parada.
• Execução do bloco de comandos.• Atualização da variável de controle.
Comandos Repetitivos
Em linguagem C:
inicialização
while( condição de parada );
{
comando 1;
comando 2;
…
comando n;
atualização
}
4
Comandos Repetitivos
Solução:
int n, soma = 0;
printf ( "Digite um numero positivo, ou negativo para sair: ");
scanf ( "%d" , &n );
while ( n >= 0 )
{
soma = soma + n;
printf ( "Digite um numero positivo, ou negativo para sair:" );
scanf ( "%d" , &n );
}
printf ( "A soma eh %d\n" , soma );
Comandos Repetitivos
Problema:
Qual é o melhor ? do-while ou while ? Analise oproblema da soma dos números positivos.
Comandos Repetitivos
Problema:
Reescreva o algoritmo para imprimir os n númerosímpares utilizando o comando while.
Comandos Repetitivos
Solução:
#include <stdio.h>
int main ()
{
int num = 1, cont = 0, n;
printf(“Entre com n ”);
scanf(“%d”, &n);
while (cont < n);
{
printf (“%d\t”, num);
num += 2;
cont++;
}
}
5
Comandos Repetitivos
Problema:
Escreva um programa que informa se um númerointeiro é par ou é ímpar. Este programa deve rodar atéque o usuário digite 0 (zero).
Comandos Repetitivos
Solução:
int n;
do
{
printf (“Entre um valor positivo (ou 0 para sair):");
scanf ("%d", &n);
if (n % 2 == 1)
printf ("%d eh impar\n", n);
else
printf ("%d eh par\n", n);
} while (n != 0);
1
Comandos Repetitivos
Aula passada:
int num = 1, cont = 0, n;
printf(“Entre com n ”);
scanf(“%d”, &n);
while (cont < n);
{
printf (“%d\t”, num);
num += 2;
cont++;
}
Comandos Repetitivos
Etapas do laço:
• Inicialização: cont = 0
• Condição de parada:
cont < n
• Bloco de comandos:printf (“%d\t”, num);
num += 2;
• Atualização:
cont++;
Comandos Repetitivos
Comando for :
O comando for é uma simplificação do comandowhile, onde a inicialização da variável de controle,a condição de parada e atualização da variável decontrole são especificados no próprio comando.
O comportamento é o mesmo do comando while :após a inicialização a condição de parada é testada,se for verdadeira o bloco de comandos é executado, avariável de controle é atualizada e a condição deparada é testada novamente e o comando se repeteaté que a expressão da condição de parada seja falsa.
Comandos Repetitivos
Em linguagem C:
for(inicialização ; condição de parada ; atualização)
{
comando 1;
comando 2;
…
comando n;
}
2
Comandos Repetitivos
Exemplo:
int main()
{
int i;
for( i = 0; i < 100; i++ )
{
printf(“%d”, 2 * i + 1);
}
return 0;
}
Comandos Repetitivos
Exercício:
Escreva um programa em linguagem Cque imprime os
n primeiros números ímpares utilizando o comando
for.
Comandos Repetitivos
Solução:
int main()
{
int i, n;printf(“Entre com n ”);
scanf(“%d”, &n);
for( i = 0; i < n; i++ )
{
printf(“%d”, 2 * i + 1);}
return 0; }
Comandos Repetitivos
Exercício:
Escreva um programa em linguagem C que calcula osomatório de 1 até n. Onde n é fornecido pelo usuário.
3
Comandos Repetitivos
Solução:
int main()
{
int i, n, soma = 0;printf(“Entre com n ”);
scanf(“%d”, &n);
for( i = 0; i < n; i++ )
{
soma = soma + i;}
printf(“%d”, soma);return 0;
}
Comandos Repetitivos
Exercício:
Escreva um programa em linguagem C que determinase valor n informado pelo usuário é ou não um número
primo.
Comandos Repetitivos
Solução:
int main(){
int i, n;printf(“Entre com n ”);
scanf(“%d”, &n);for( i = 2; i < n; i++ )
{if(n % i == 0 )
break;
}if( i == n )
printf(“%d eh Primo”, n);else
printf(“%d NAO eh Primo”, n);return 0;
}
Comandos Repetitivos
Exercício:
Escreva um programa que imprime todos os númerosprimos entre 2 e n, onde n é fornecido pelo usuário.
4
Comandos Repetitivos
Solução:
int n, i, j;
printf("Entre com n ");
scanf("%d", &n);for( i = 2; i < n; i++)
{
for( j = 2; j < i; j++ ){
if( i % j == 0 )
break; }
if( j == i )printf("%d\t", i);
}
Comandos Repetitivos
Exercício:
Escreva um programa em linguagem C que imprimatodas as tabuadas entre 2 e n, onde n é informado
pelo usuário.
Comandos Repetitivos
Solução:
int n;
int i, j;
printf("Entre com um numero inteiro positivo: ");scanf("%d", &n);
for( i = 2; i <= n; i++ ){
printf("\nTabuada do %d:\n", i);
for( j = 1; j <= 10; j++)
printf("%d x %d = %d\n", i, j, i * j);
}
Exercícios
Exercício:
Diga qual será a saída do programa a seguir.
Exercícios
int r = 0, n = 98;while( n > 0 ){
r += n % 10;n /= 10;if( n == 0 && r > 9){
n = r;r = 0;
}}printf("%d\n", r);
Exercícios
Exercício:
Repita o exercício anterior mas considere que n valeagora:
a) 5b) 45c) 123
Exercícios
Exercício:
Escreva um programa que lê uma seqüência denúmeros inteiros e imprime qual o maior e qual omenor valor dessa seqüência. A seqüência terminacom o número 0 (zero).
Exercícios
int n, maior, menor;printf("Entre com um numero ou zero para terminar: ");scanf("%d", &n);maior = menor = n; while(n != 0 ){
if( n > maior )maior = n;
if( n < menor )menor = n;
printf("Entre com um numero ou 0 para sair: ");scanf("%d", &n);
}printf("maior: %d e o menor: %d\n", maior, menor);
Exercícios
Exercício:
Escreva um programa que imprime a soma de todosos números inteiros entre A e B (incluindo A e B),onde A e B são fornecidos pelo usuário.
Exercícios
#include<stdio.h>int main(){
int A, B, soma, i;printf("Entre com A e B: ");scanf("%d%d", &A, &B);soma = 0; for (i = A; i <= B; i++)
soma += i;printf("A soma eh %d\n", soma);return 0;
}
Exercícios
Exercício:
Escreva um programa que lê um valor informado pelousuário e imprime se este valor é ou não uma potênciapositiva de 2.
Exercícios
int n, pot;printf("Entre com o numero: ");scanf("%d", &n);
pot = 1; while( pot < n )
pot *= 2;
if( pot == n)printf("%d eh potencia de 2.\n", n);
elseprintf("%d NAO eh potencia de 2.\n", n);
Exercícios
Exercício:
Altere o programa anterior para que ele execute atéque o usuário digite um valor negativo.
Exercíciosint n, pot;printf("Entre com o numero: ");scanf("%d", &n);
while( n > 0 ){
pot = 1; while( pot < n )
pot *= 2;
if( pot == n)printf("eh potencia de 2.\n");
elseprintf("NAO eh potencia de 2.\n");
printf("Entre com o numero: ");scanf("%d", &n);
}
1
Vetores
Exercício :
Escreva um programa em linguagem C que lêpalavras com 4 letras e as imprime de trás para frente.Ex.:
casa -- asaclata -- atal
sapo -- opas
Vetores
Solução:
int main()
{
char L1, L2, L3, L4;
printf(“Entre com palavras de 4 letras: “);
scanf(“%c%c%c%c”, &L1, &L2, &L3, &L4);
printf(“%c%c%c%c”, L4, L3, L2, L1);
return 0;
}
Vetores
Problema:
Refaça o programa anterior para palavras ou frasescom 20, 30, e 50 caracteres.
Vetores
Definição:
Um vetor é um tipo de dado utilizado para representaruma certa quantidade de variáveis do mesmo tipo.
2
Vetores
Em Linguagem C:
tipo + identificador + [ número de variáveis ];
Onde:
• tipo: é o tipo das variáveis que devem ser criadas. Ex.: int, char, float, entre outros;
• identificador: é o nome que será utilizado para referenciar o conjunto de variáveis;
• número de variáveis: é o número de variáveis que será criado (tamanho do vetor).
Vetores
Exemplos :
int notas[10];
char letras[50];
float pesos[100];
notas[0] = 1;
scanf(“%c”, &letras[6]);
notas[5 + 2] = notas[5] * pesos[2];
for(i = 0; i < N; i++)
pesos[i] = 1.0;
Vetores
Importante:
• O primeiro elemento de um vetor é o de índice 0 (zero).
• Num vetor de 100 elementos o último elemento é o de índice 99.
• Acessar uma posição inválida de um vetor pode fazer seu programa “Abortar”.
Vetores
Exercício:
Escreva um programa em linguagem C que lê palavrascom 10 letras e as imprime de trás para frente. Utilizevetores e laços.
3
Vetores
Solução:
#define TAM 10
int main()
{
char letras[TAM];
int i;
printf(“Entre com a frase: ”);
for(i = 0; i < TAM; i++)
scanf(“%c”, &letras[i]);
for(i = TAM - 1; i >= 0; i--)
printf(“%c”, letras[i]);
return 0;
}
Vetores
Exercício:
Escreva um programa em linguagem C que lê RA’s eas notas de no máximo 100 alunos. O programa develer e armazenar um novo RA e uma nova nota até que
o usuário digite um RA negativo.
Vetores
Solução:
#define TAM 100int main(){
float notas[TAM];int ras[TAM], aux, indice = 0, total;printf(“Entre com o RA (ou negativo para sair): ”);scanf(“%d”, &aux);while(aux > 0)
{ras[indice] = aux;printf(“Entre com a nota: ”);scanf(“%f”, ¬as[indice]);
printf(“Entre com o RA (ou negativo para sair): ”);scanf(“%d”, &aux);indice++;
}return 0;
}
Vetores
Exercício:
Utilizando o código do programa anterior, escreva umnovo programa que permite ao usuário consultar anota de um aluno digitando o seu RA, o programa
deve rodar até que o usuário digite um RA negativo.
Obs.: O trecho de código que lê os RA’s e as notas é o
mesmo do programa anterior.
4
Vetores
Solução:total = indice;
printf(“Entre com o RA (ou negativo para sair): ”);
scanf(“%d”, &aux);
while( aux > 0 )
{
for( indice = 0; indice < total; indice++ )
if( ras[indice] == aux )
break;
if( indice < total )
printf(“A nota eh: %.2f\n”, notas[indice]);else
printf(“RA naum encontrado\n”);
printf(“Entre com o RA (ou negativo para sair): ”);
scanf(“%d”, &aux);
}
Vetores
Exercício :
Escreva um programa em linguagem C que lêpalavras com 4 letras e as imprime de trás para frente.Ex.:
casa -- asaclata -- atalsapo -- opas
Vetores
Solução:
int main(){
char L1, L2, L3, L4;printf(“Entre com palavras de 4 letras: “);scanf(“%c%c%c%c”, &L1, &L2, &L3, &L4);printf(“%c%c%c%c”, L4, L3, L2, L1);return 0;
}
Vetores
Problema:
Refaça o programa anterior para palavras ou frasescom 20, 30, e 50 caracteres.
Vetores
Definição:
Um vetor é um tipo de dado utilizado para representaruma certa quantidade de variáveis do mesmo tipo.
Vetores
Em Linguagem C:
tipo + identificador + [ número de variáveis ];
Onde:
• tipo: é o tipo das variáveis que devem ser criadas. Ex.: int, char, float, entre outros;
• identificador: é o nome que será utilizado para referenciar o conjunto de variáveis;
• número de variáveis: é o número de variáveis que será criado (tamanho do vetor).
Vetores
Exemplos :
int notas[10];char letras[50];float pesos[100];
notas[0] = 1;scanf(“%c”, &letras[6]);notas[5 + 2] = notas[5] * pesos[2];for(i = 0; i < N; i++)
pesos[i] = 1.0;
Vetores
Importante:
• O primeiro elemento de um vetor é o de índice 0 (zero).
• Num vetor de 100 elementos o último elemento é o de índice 99.
• Acessar uma posição inválida de um vetor pode fazer seu programa “Abortar”.
Vetores
Exercício:
Escreva um programa em linguagem C que lê palavrascom 10 letras e as imprime de trás para frente. Utilizevetores e laços.
Vetores
Solução:
#define TAM 10int main(){
char letras[TAM];int i;printf(“Entre com a frase: ”);for(i = 0; i < TAM; i++)
scanf(“%c”, &letras[i]);for(i = TAM - 1; i >= 0; i--)
printf(“%c”, letras[i]);return 0;
}
Vetores
Exercício:
Escreva um programa em linguagem C que lê RA’s eas notas de no máximo 100 alunos. O programa develer e armazenar um novo RA e uma nova nota até queo usuário digite um RA negativo.
VetoresSolução:
#define TAM 100int main(){
float notas[TAM];int ras[TAM], aux, indice = 0, total;printf(“Entre com o RA (ou negativo para sair): ”);scanf(“%d”, &aux);while(aux > 0){
ras[indice] = aux;printf(“Entre com a nota: ”);scanf(“%f”, ¬as[indice]);printf(“Entre com o RA (ou negativo para sair): ”);scanf(“%d”, &aux);indice++;
}return 0;
}
Vetores
Exercício:
Utilizando o código do programa anterior, escreva umnovo programa que permite ao usuário consultar anota de um aluno digitando o seu RA, o programadeve rodar até que o usuário digite um RA negativo.
Obs.: O trecho de código que lê os RA’s e as notas é omesmo do programa anterior.
Vetores
Solução:total = indice;printf(“Entre com o RA (ou negativo para sair): ”);scanf(“%d”, &aux);while( aux > 0 ){
for( indice = 0; indice < total; indice++ )if( ras[indice] == aux )
break;if( indice < total )
printf(“A nota eh: %.2f\n”, notas[indice]);else
printf(“RA naum encontrado\n”);printf(“Entre com o RA (ou negativo para sair): ”);scanf(“%d”, &aux);
}
1
Aula Passada
Problema :
Escreva um programa em linguagem C que lê os RA’se 4 notas de no máximo 100 alunos. O programa develer e armazenar um novo RA e as suas notas até que
o usuário digite um RA negativo.
Aula Passada
Solução:
#define TAM 100
int main(){
float notas1[TAM], notas2[TAM], notas3[TAM], notas4[TAM];
int ras[TAM], aux, indice = 0, total;printf(“Entre com o RA (ou negativo para sair): ”);
scanf(“%d”, &aux);while(aux > 0)
{…
}
return 0; }
Matrizes
Problema:
Escreva um programa em linguagem C que lê os RA’se n notas de no máximo 100 alunos, onde n é definidopelo usuário. O programa deve ler e armazenar umnovo RA e as suas notas até que o usuário digite umRA negativo.
Matrizes
Definição:
Uma matriz é uma generalização multidimensional deum vetor, em outras palavras, uma matriz é um vetor
de vetores.
2
Matrizes
Em Linguagem C:
tipo + identificador + [ d1 ][ d2 ] … [ dn ];
Onde:
• tipo: é o tipo das variáveis que devem ser criadas. Ex.: int, char, float, entre outros;
• identificador: é o nome que será utilizado para referenciar o conjunto de variáveis;
• d1, d2 … dn: são o número de variáveis que serão criados em cada dimensão.
Matrizes
Exemplos :
int notas[10][10];
char texto[linhas][colunas];
notas[0][0] = 1;
scanf(“%c”, &texto[6][0]);
notas[5][2] = notas[5][1] + 1;
for(i = 0; i < N; i++)
for(j = 0; j < M; j++)
notas[i][j] = 5.0;
Matrizes
Importante:
• Como nos vetores, o primeiro elemento de uma matriz é o de índice 0 (zero).
• No caso de matrizes bidimensionais, a primeira dimensão representa a linha e a segunda a coluna.
• Na memória do computador, matrizes são armazenadas de forma linear como se fossem vetores.
• Durante a compilação o compilador se encarrega de determinar qual o verdadeiro endereço dos campos da matriz.
Matrizes
Exemplo:
IHG
FED
CBA
I
H
G
F
E
D
C
B
A
3
Matrizes
Exercício:
Escreva um programa em linguagem C que lê os RA’se n notas de no máximo 100 alunos, onde n é definidopelo usuário. O programa deve ler e armazenar um
novo RA e as suas notas até que o usuário digite umRA negativo.
Matrizes
Solução:float notas[TAM][TAM];
int ra[TAM], n, i, j;printf("Entre com o numero de notas: ");
scanf("%d", &n);for (i = 0; i < TAM; i++)
{printf("Entre com o RA (ou negativo para sair): ");
scanf("%d", &ra[i]);if ( ra[i] < 0 )
break;
for (j = 0; j < n; j++){
printf("Entre com a nota %d: ", j + 1);scanf("%f", ¬as[i][j]);
}}
Matrizes
Exercício:
Escreva um programa em linguagem C que solicita aousuário duas matrizes A e B de dimensões n e m(definidas pelo usuário) e imprime a matriz resultante
C da soma de A e B.
Matrizes
Solução:int A[TAM][TAM], B[TAM][TAM], C[TAM][TAM], i, j, n, m;
printf("Entre com as dimensoes das matrizes ");
scanf("%d%d", &n, &m);printf("Entre com os elementos da primeira matriz:\n");
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
scanf("%d", &A[i][j]);
printf("Entre com os elementos da segunda matriz:\n");
for (i = 0; i < n; i++)for (j = 0; j < m; j++)
scanf("%d", &B[i][j]);
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
C[i][j] = A[i][j] + B[i][j];printf("A matriz resultante eh:\n");
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
printf("%d\t", C[i][j]);
1
Relembrando
Memória do Computador :
Podemos entender a memória de um computadorcomo um conjunto de células que armazenam
informações. Cada célula da memória possui um endereço (número inteiro de 32 bits).
1024
1025
1026
1030
1029
1028
1027
Relembrando
Memória do Computador :
Quando criamos em nosso programa uma variável deum determinado tipo, o Sistema Operacional, ao
executar o nosso programa reserva uma posição dememória. Mas ao invés de utilizarmos o endereço davariável como referência, fazemos uso do
identificador(nome) que atribuímos a variável.
10
1025
x
1028
1027int x = 10;
Ponteiros
Definição:
Ponteiros ou Apontadores são tipos de variáveis quearmazenam endereços de memória, possivelmente,endereços de memória de outras variáveis.
Em Linguagem C:
tipo *identificador;
Ponteiros
Exemplos :
int *nota;
char *texto;
float *peso;
double *media;
2
Ponteiros
Operadores de Ponteiros:
Existem dois “novos” operadores que são utilizadoscom ponteiros em C :
• & - é utilizado para obter o endereço de uma variável.
• * - é utilizado para obter o conteúdo do endereço apontado.
int *ptr, nota = 10;
ptr = ¬a;
nota = *ptr;
Ponteiros
Desenho para ficar mais fácil:
10
?
2356
…
1025
x
ptr
1027
int x = 10;int *ptr;
ptr = &x;*ptr = 50;
50
1026
…
1025
x
ptr
Ponteiros
Qual é a saída ?
int x = 10;
int *ptr;
ptr = &x;
*ptr = *ptr * x;
printf(“%d”, *ptr);
printf(“%d”, x);
printf(“%d”, ptr);
Ponteiros
Qual é a saída ?
int x[3] = {1, 2, 3};
int *p;
p = x;
p[0] = p[1] = p[2];
printf("%d\n", p[1]);
printf("%d\n", x[1]);
printf("%d\n", p);
3
Ponteiros
Exercício:
Escreva um programa em linguagem C que solicita aousuário os pesos e alturas de no máximo 100 pessoas.Em seguida o seu programa deve solicitar ao usuárioque escolha entre calcular o Desvio Padrão dospesos ou das alturas. O seu programa deve imprimir oresultado do cálculo do desvio padrão.
P.s.: Seu programa deveria ter no máximo 4 laços (for, while, etc…)
Ponteiros
Desvio Padrão:
1. Calcule a média dos valores2. Calcule o quadrado da diferença de cada valor em
relação a média.3. Some todos os quadrados.4. Divida o valor da soma pelo número de elementos
menos um.5. Tire a raiz quadrada do resultado.
Ponteiros
Média :
media = 0;
for( i = 0; i < n; i++)
media += vetor[i];
media = media / n;
Ponteiros
Variância :
dif = 0;
for( i = 0; i < n; i++)
dif += (vetor[i] – media) * (vetor[i] – media);
dif = dif / (n – 1);
Desvio Padrão:
dif = sqrt(dif);
Procedimentos e FunçõesA aula de MC está ficando muito chata por quê ?
1. Eu não entendo mais nada do que o professor fala.
2. Eu não consigo resolver os exercícios de laboratório e os exemplos de aula.
3. Não consigo enxergar para que servem as coisas que eu aprendo.
4. Os programas ficaram muito maiores e bem mais difíceis.
5. Tem mais de uma semana que ninguém deixa um recado para mim no meu Orkut.
6. Todas as anteriores.
Procedimentos e FunçõesProblema :
Escreva um programa em linguagem C que solicitadois valores (n, k) ao usuário e calcula:
a) O número de permutações Pnb) O número de arranjos An,kc) O número de combinações Cn,k
Onde:
Pn = n!An,k = n! / (n - k)!Cn,k = n! / (k! * (n – k)!)
Procedimentos e Funções
Problema:
Quantas vezes vamos escrever o código que calcula ofatorial de um número?
fat = 1;for( i = n; i > 1; i-- )
fat *= i;
Procedimentos e Funções
Definição :
Procedimentos são estruturas que agrupam umconjunto de comandos, que são executados quando oprocedimento é chamado.
Funções são semelhantes aos procedimentos, excetoque uma função sempre retorna um valor.
Procedimentos e Funções
Desenho para ficar mais fácil :
Programa
Procedimento
Instrução
Instrução
Procedimento
Instrução
Instrução
Instrução
Instrução
Instrução
Procedimentos e Funções
Em C:
tipo NomeDaFuncao( lista_de_parâmetros ){
instruções;}
Lista de Parâmetros:
tipo identificador, tipo identificador …
Procedimentos e Funções
Exemplo :
int SomaDoisNumeros(int A, int B){
return A + B;}
void ImprimeTexto(){
printf(“Ola Mundo”);}
Procedimentos e Funções
Exemplo :
int main(){
int r;r = SomaDoisNumeros(30, 50);ImprimeTexto();return 0;
}
Procedimentos e Funções
Exercício:
Escreva um procedimento ou função em linguagem Cque recebe como parâmetros dois valores A e B ecalcula o valor de AB. Seu procedimento ou funçãodeve se chamar pot.
Procedimentos e Funções
Potência :
double pot(double A, double B){
double ret = 1;int i;for( i = 0; i < B; i++ )
ret *= A;
return ret;}
Procedimentos e Funções
Exercício:
Escreva um procedimento ou função que calcula ofatorial de um número inteiro.
Procedimentos e Funções
Fatorial :
int Fatorial(int n){
int fat = 1;int i;for( i = n; i > 1; i-- )
fat *= i;
return fat;}
Procedimentos e Funções
Exercício:
Escreva um programa em linguagem C que solicitadois valores (n, k) ao usuário e calcula:
a) O número de permutações Pnb) O número de arranjos An,kc) O número de combinações Cn,k
Onde:
Pn = n!An,k = n! / (n - k)!Cn,k = n! / (k! * (n – k)!)
1
Procedimentos e Funções
A aula de MC está ficando muito chata por quê ?
1. Eu não entendo mais nada do que o professor fala.
2. Eu não consigo resolver os exercícios de laboratório e os exemplos de aula.
3. Não consigo enxergar para que servem as coisas que eu aprendo.
4. Os programas ficaram muito maiores e bem mais difíceis.
5. Tem mais de uma semana que ninguém deixa um recado para mim no meu Orkut.
6. Todas as anteriores.
Procedimentos e FunçõesProblema :
Escreva um programa em linguagem C que solicitadois valores (n, k) ao usuário e calcula:
a) O número de permutações Pnb) O número de arranjos An,kc) O número de combinações Cn,k
Onde:
Pn = n!An,k = n! / (n - k)!Cn,k = n! / (k! * (n – k)!)
Procedimentos e Funções
Problema:
Quantas vezes vamos escrever o código que calcula o
fatorial de um número?
fat = 1;
for( i = n; i > 1; i-- )
fat *= i;
Procedimentos e Funções
Definição :
Procedimentos são estruturas que agrupam umconjunto de comandos, que são executados quando oprocedimento é chamado.
Funções são semelhantes aos procedimentos, excetoque uma função sempre retorna um valor.
2
Procedimentos e Funções
Desenho para ficar mais fácil :
Programa
Procedimento
Instrução
Instrução
Procedimento
Instrução
Instrução
Instrução
Instrução
Instrução
Procedimentos e Funções
Em C:
tipo NomeDaFuncao( lista_de_parâmetros )
{
instruções;
}
Lista de Parâmetros:
Procedimentos e Funções
Exemplo :
int SomaDoisNumeros(int A, int B)
{
return A + B;
}
void ImprimeTexto()
{
printf(“Ola Mundo”);
Procedimentos e Funções
Exemplo :
int main()
{
int r;
r = SomaDoisNumeros(30, 50);
ImprimeTexto();
return 0;
}
3
Procedimentos e Funções
Exercício:
Escreva um procedimento ou função em linguagem Cque recebe como parâmetros dois valores A e B ecalcula o valor de AB. Seu procedimento ou função
deve se chamar pot.
Procedimentos e Funções
Potência :
double pot(double A, double B)
{
double ret = 1;
int i;
for( i = 0; i < B; i++ )
ret *= A;
return ret;
}
Procedimentos e Funções
Exercício:
Escreva um procedimento ou função que calcula ofatorial de um número inteiro.
Procedimentos e Funções
Fatorial :
int Fatorial(int n)
{
int fat = 1;
int i;
for( i = n; i > 1; i-- )
fat *= i;
return fat;
4
Procedimentos e Funções
Exercício:
Escreva um programa em linguagem C que solicitadois valores (n, k) ao usuário e calcula:
a) O número de permutações Pn
b) O número de arranjos An,k
c) O número de combinações Cn,k
Onde:
Pn = n!An,k = n! / (n - k)!Cn,k = n! / (k! * (n – k)!)
Procedimentos e FunçõesProblema 1:
Escreva um procedimento ou função em linguagem Cque troca dois valores A e B.
Problema 2:
Escreva um procedimento ou função em linguagem Cque retorna a soma e o produto de dois valores A e B.
Procedimentos e Funções
Passagem de Parâmetros:
• Passagem por Valor: Quando a função é chamada o parâmetro passado por valor é copiado, ou seja, o valor da variável utilizada como parâmetro não é alterado.
• Passagem por Referência: Quando a função é chamada o endereço do parâmetro passado por referência é atribuído à um ponteiro, ou seja, qualquer alteração no conteúdo apontado será refletida no conteúdo da variável utilizada como parâmetro.
Procedimentos e FunçõesExemplo :
void FuncaoInutil(int A, int* B){
A = 1;*B = 2;
}
int main(){
int X = 0, Y = 0;FuncaoInutil(X, &Y);printf(“%d %d”, X, Y);return 0;
}
Procedimentos e FunçõesExercício 1:
Escreva um procedimento ou função em linguagem Cque troca dois valores A e B.
Exercício 2:
Escreva um procedimento ou função em linguagem Cque recebe dois valores A e B, calcula a soma eguarda o resultado em A.
Exercício 3:
Escreva um procedimento ou função em linguagem Cque retorna a soma e o produto de dois valores A e B.
Procedimentos e Funções
Solução:
void troca(int* A, int* B){
int aux;aux = *A;*A = *B;*B = aux;
}
Procedimentos e Funções
Solução:
void SomaEmA(int* A, int B){
*A = *A + B;}
Procedimentos e Funções
Solução:
void SomaProduto(int A, int B, int* soma, int* prod){
*soma = A + B;*prod = A * B;
}
Procedimentos e Funções
Exercício :
Escreva um procedimento ou função em linguagem Cque recebe um vetor de números inteiros V detamanho 100, e um inteiro N, em seguida você deveimprimir os N primeiros valores do vetor.
Procedimentos e Funções
Solução:
void ImprimeVetor(int V[100], int N){
int i;for (i = 0; i < N; i++)
printf(“%d ”, V[i]);}
Procedimentos e Funções
Exercício :
Escreva um procedimento ou função em linguagem Cque recebe um vetor de números inteiros V detamanho 100, e um inteiro N por referência, emseguida você deve ler valores inteiros da entrada atéque o usuário digite -1. Ao final todos os valoresdiferentes de -1 devem estar armazenados em V e ototal de valores deve estar em N.
Procedimentos e Funções
Solução:
void LeVetor(int V[100], int* N){
int aux;*N = 0;scanf(“%d”, &aux);while (aux != -1){
V[*N] = aux;(*N)++;scanf(“%d”, &aux);
}}
Procedimentos e Funções
Exercício :
Escreva uma função em linguagem C que recebe umvetor de números inteiros V de tamanho 100, uminteiro N que contém o número de posiçõespreenchidas de V, e um número inteiro X. A suafunção deve retornar 1 se V contém o valor X e zerocaso contrário.
Procedimentos e Funções
Algoritmo :
• Percorra todos os valores do Vetor• Compare cada valor com o número procurado• Se um dos valores for igual então retorne 1• Senão continue procurando• Se chegar ao fim da busca retorne zero, porque o
valor não foi encontrado.
Procedimentos e Funções
Busca Linear:
int BuscaLinear(int V[100], int N, int X){
int i;for (i = 0; i < N; i++){
if( V[i] == X )return 1;
}return 0;
}
Procedimentos e Funções
Problema :
E se os vetores do exercício anterior estivessemsempre ordenados? Seria necessário verificar todos oselementos para determinar se X está em V?
Procedimentos e Funções
Algoritmo :
• Marque os extremos direito (dir) e esquerdo (esq) do vetor.
• Compare o valor procurado com o valor central (meio)
• Se for igual retorne saia do laço.• Senão, se o valor for maior que o valor de meio,
então esq recebe meio mais 1.• Senão dir recebe meio menos 1.• Atualize o valor do meio.• Repita enquanto esq for menor que dir.• Ao sair do laço se valor for igual a meio retorne 1,
senão retorne 0.
Procedimentos e Funções
Busca Binária :X = 3; esq = 0; dir = N – 1; meio = (esq + dir)/2;
esq meio dir
1 2 7 15 23 56 57 58 70 72 78
meio diresq
1 2 7 15 23 56 57 58 70 72 78
1 2 7 15 23 56 57 58 70 72 78
esq meio dir
1 2 7 15 23 56 57 58 70 72 78
esq meio dir
Procedimentos e Funções
Busca Binária:esq = 0; dir = N - 1; meio = (esq + dir) / 2;while (esq < dir){
if ( X == V[meio] )break;
else if ( X > V[meio] )esq = meio + 1;
elsedir = meio - 1;
meio = (esq + dir) / 2;}if ( X == V[meio] )
return 1;return 0;
Procedimentos e Funções
Problema :
Não há como garantir que o usuário sempre digitaráum vetor ordenado. E agora? Como devemos fazerpara que seja possível utilizar a busca binária sempre?
Procedimentos e Funções
Exercício :
Escreva uma função em linguagem C que retorna aposição no vetor (não é o valor) do menor elemento. Afunção recebe como parâmetros um vetor V de 100elementos e um inteiro N que indica o número deelementos de V.
Procedimentos e Funções
Solução:
int MenorElemento(int V[100], int N){
int i, menor = 0;
for(i = 1; i < N; i++)if(V[i] < V[maior])
menor = i;
return menor;}
Procedimentos e Funções
Algoritmo :
• Remova o menor elemento do vetor (V) e insira na primeira posição livre do vetor auxiliar (Ordenado).
• Repita este processo até acabarem os elementos do vetor V.
Procedimentos e Funções
Ordenação por Seleção (Selection Sort) :N = 11; M = 0;
3 20 78 15 56 23 2 1 19 28 6
N = 10; M = 1;
3 20 78 15 56 23 2 6 19 28
1
N = 9; M = 2;
3 20 78 15 56 23 28 6 19
58 2
Procedimentos e Funções
Ordenação por Seleção (Selection Sort) :
void SelectionSort(int V[100], int N, int Ordenado[100]){
int M = 0, i;while(N > 0){
i = MenorElemento(V, N);Ordenado[M] = V[i];V[i] = V[N - 1];N--;M++;
}}
Procedimentos e Funções
Problema :
Como ordenar um vetor sem alterar os dados do vetororiginal V ?
Procedimentos e Funções
Algoritmo :
• Percorra o vetor (V)• Para cada elemento (aux) de V, insira uma cópia
de aux na primeira posição livre do vetor auxiliar (Ordenado).
• Se o valor de aux for menor que do elemento anterior, então troque aux com o anterior.
• Senão saia do laço.• Repita as trocas até que aux chegue na primeira
posição.
Procedimentos e Funções
Ordenação por Inserção (Insertion Sort) :
2 15 1 3 6 23 57M = 0; i = 0;
2
2 15 1 3 6 23 57M = 1; i = 1;
2 15
2 15
2 15 1 3 6 23 57M = 2; i = 2;
2 15 1
2 1 15
1 2 15
Procedimentos e Funções
Ordenação por Inserção (Insertion Sort) :
2 15 1 3 6 23 57M = 3; i = 3;
1 2 15 3
1 2 3 15
1 2 3 15
2 15 1 3 6 23 57M = 4; i = 4;
1 2 3 15 6
1 2 3 6 15
1 2 3 6 15
Procedimentos e Funções
Solução :void InsertionSort( int V[100], int N, int Ordenado[100]){
int M = 0, i, j, k;for (i = 0; i < N; i++){
Ordenado[M] = V[i]; k = M;for (j = M - 1; j >= 0; j--)
if (Ordenado[k] < Ordenado[j] )Troca(&Ordenado[k--], &Ordenado[j]);
elsebreak;
M++;}
}
Procedimentos e Funções
Problema :
Como ordenar um vetor sem o uso de um vetor auxiliar(Ordenado) ?
Procedimentos e Funções
Algoritmo :
• Para cada elemento i do vetor V.• Se o valor de i + 1 for menor que i• Então troque i + 1 com i.• Senão incremente o valor de i.• Repita este processo até i chegue ao fim do vetor.• Repita todo o processo até que todos os
elementos do vetor tenham sido comparados.
Procedimentos e Funções
Ordenação por Troca (Bubble Sort) :
57 30 8 15 56 23 2i = 0;
30 57 8 15 56 23 2i = 1;
30 8 57 15 56 23 2i = 2;
30 8 15 57 56 23 2i = 3;
30 8 15 56 57 23 2i = 4;
30 8 15 56 23 57 2i = 5;
30 8 15 56 23 2 57
30 8 15 56 23 2 57
i = 6;
i = 0;
8 30 15 56 23 2 57i = 1;
Procedimentos e Funções
Solução :
void BubbleSort( int V[100], int N){
int j, i;for ( i = 0; i < N - 1; i++ ){
for ( j = 0; j < N - 1; j++ )if ( V[j] < V[j + 1] )
Troca( &V[j], &V[j + 1] );}
}
1
Procedimentos e Funções
Problema 1:
Escreva um procedimento ou função em linguagem Cque troca dois valores A e B.
Problema 2:
Escreva um procedimento ou função em linguagem Cque retorna a soma e o produto de dois valores A e B.
Procedimentos e Funções
Passagem de Parâmetros:
• Passagem por Valor: Quando a função é chamada o parâmetro passado por valor é copiado, ou seja, o valor da variável utilizada como parâmetro não é alterado.
• Passagem por Referência: Quando a função é chamada o endereço do parâmetro passado por referência é atribuído à um ponteiro, ou seja, qualquer alteração no conteúdo apontado será refletida no conteúdo da variável utilizada como parâmetro.
Procedimentos e Funções
Exemplo :
void FuncaoInutil(int A, int* B)
{
A = 1;*B = 2;
}
int main()
{
int X = 0, Y = 0;FuncaoInutil(X, &Y);
printf(“%d %d”, X, Y);return 0;
}
Procedimentos e Funções
Exercício 1:
Escreva um procedimento ou função em linguagem Cque troca dois valores A e B.
Exercício 2:
Escreva um procedimento ou função em linguagem Cque recebe dois valores A e B, calcula a soma eguarda o resultado em A.
Exercício 3:
Escreva um procedimento ou função em linguagem Cque retorna a soma e o produto de dois valores A e B.
2
Procedimentos e Funções
Solução:
void troca(int* A, int* B)
{
int aux;
aux = *A;
*A = *B;
*B = aux;
}
Procedimentos e Funções
Solução:
void SomaEmA(int* A, int B)
{
*A = *A + B;
}
Procedimentos e Funções
Solução:
void SomaProduto(int A, int B, int* soma, int* prod)
{
*soma = A + B;
*prod = A * B;
}
Procedimentos e Funções
Exercício :
Escreva um procedimento ou função em linguagem Cque recebe um vetor de números inteiros V detamanho 100, e um inteiro N, em seguida você deve
imprimir os N primeiros valores do vetor.
3
Procedimentos e Funções
Solução:
void ImprimeVetor(int V[100], int N)
{
int i;
for (i = 0; i < N; i++)
printf(“%d ”, V[i]);
}
Procedimentos e Funções
Exercício :
Escreva um procedimento ou função em linguagem Cque recebe um vetor de números inteiros V detamanho 100, e um inteiro N por referência, em
seguida você deve ler valores inteiros da entrada atéque o usuário digite -1. Ao final todos os valoresdiferentes de -1 devem estar armazenados em V e o
total de valores deve estar em N.
Procedimentos e Funções
Solução:
void LeVetor(int V[100], int* N)
{
int aux;
*N = 0;
scanf(“%d”, &aux);
while (aux != -1)
{
V[*N] = aux;
(*N)++;
scanf(“%d”, &aux);
}
}
Procedimentos e Funções
Exercício :
Escreva uma função em linguagem C que recebe umvetor de números inteiros V de tamanho 100, uminteiro N que contém o número de posições
preenchidas de V, e um número inteiro X. A suafunção deve retornar 1 se V contém o valor X e zerocaso contrário.
4
Procedimentos e Funções
Algoritmo :
• Percorra todos os valores do Vetor• Compare cada valor com o número procurado• Se um dos valores for igual então retorne 1
• Senão continue procurando• Se chegar ao fim da busca retorne zero, porque o
valor não foi encontrado.
Procedimentos e Funções
Busca Linear:
int BuscaLinear(int V[100], int N, int X)
{
int i;
for (i = 0; i < N; i++)
{
if( V[i] == X )
return 1;
}
return 0;
}
Procedimentos e Funções
Problema :
E se os vetores do exercício anterior estivessemsempre ordenados? Seria necessário verificar todos oselementos para determinar se X está em V?
Procedimentos e Funções
Algoritmo :
• Marque os extremos direito (dir) e esquerdo (esq) do vetor.
• Compare o valor procurado com o valor central (meio)
• Se for igual retorne saia do laço.• Senão, se o valor for maior que o valor de meio,
então esq recebe meio mais 1.• Senão dir recebe meio menos 1.• Atualize o valor do meio.• Repita enquanto esq for menor que dir.• Ao sair do laço se valor for igual a meio retorne 1,
senão retorne 0.
5
Procedimentos e Funções
Busca Binária :X = 3; esq = 0; dir = N – 1; meio = (esq + dir)/2;
727058575623 7815721
esq meio dir
727058575623 7815721
esq meio dir
727058575623 7815721
esq meio dir
727058575623 7815721
esq meio dir
Procedimentos e Funções
Busca Binária:esq = 0; dir = N - 1; meio = (esq + dir) / 2;
while (esq < dir)
{
if ( X == V[meio] )
break;
else if ( X > V[meio] )
esq = meio + 1;
else
dir = meio - 1;
meio = (esq + dir) / 2;
}
if ( X == V[meio] )
return 1;
return 0;
Procedimentos e Funções
Problema :
Não há como garantir que o usuário sempre digitaráum vetor ordenado. E agora? Como devemos fazerpara que seja possível utilizar a busca binária sempre?
Procedimentos e Funções
Exercício :
Escreva uma função em linguagem C que retorna aposição no vetor (não é o valor) do menor elemento. Afunção recebe como parâmetros um vetor V de 100
elementos e um inteiro N que indica o número deelementos de V.
6
Procedimentos e Funções
Solução:
int MenorElemento(int V[100], int N)
{
int i, menor = 0;
for(i = 1; i < N; i++)
if(V[i] < V[maior])
menor = i;
return menor;
}
Procedimentos e Funções
Algoritmo :
• Remova o menor elemento do vetor (V) e insira na primeira posição livre do vetor auxiliar (Ordenado).
• Repita este processo até acabarem os elementos do vetor V.
Procedimentos e Funções
Ordenação por Seleção (Selection Sort) :
2819122356 61578203
28196223561578203
1
N = 11; M = 0;
N = 10; M = 1;
1962823561578203
258
N = 9; M = 2;
Procedimentos e Funções
Ordenação por Seleção (Selection Sort) :
void SelectionSort(int V[100], int N, int Ordenado[100])
{
int M = 0, i;
while(N > 0)
{
i = MenorElemento(V, N);
Ordenado[M] = V[i];
V[i] = V[N - 1];
N--;
M++;
}
}
7
Procedimentos e Funções
Problema :
Como ordenar um vetor sem alterar os dados do vetororiginal V ?
Procedimentos e Funções
Algoritmo :
• Percorra o vetor (V)• Para cada elemento (aux) de V, insira uma cópia
de aux na primeira posição livre do vetor auxiliar (Ordenado).
• Se o valor de aux for menor que do elemento anterior, então troque aux com o anterior.
• Senão saia do laço.• Repita as trocas até que aux chegue na primeira
posição.
Procedimentos e Funções
Ordenação por Inserção (Insertion Sort) :
5723631152
2
5723631152
152
M = 0; i = 0;
M = 1; i = 1;
152
5723631152
1152
M = 2; i = 2;
1512
1521
Procedimentos e Funções
Ordenação por Inserção (Insertion Sort) :
5723631152
31521
M = 3; i = 3;
15321
15321
5723631152
615321
M = 4; i = 4;
156321
156321
8
Procedimentos e Funções
Solução :void InsertionSort( int V[100], int N, int Ordenado[100])
{
int M = 0, i, j, k;
for (i = 0; i < N; i++)
{
Ordenado[M] = V[i]; k = M;
for (j = M - 1; j >= 0; j--)
if (Ordenado[k] < Ordenado[j] )
Troca(&Ordenado[k--], &Ordenado[j]);
else
break;
M++;
}
}
Procedimentos e Funções
Problema :
Como ordenar um vetor sem o uso de um vetor auxiliar(Ordenado) ?
Procedimentos e Funções
Algoritmo :
• Para cada elemento i do vetor V.• Se o valor de i + 1 for menor que i• Então troque i + 1 com i.
• Senão incremente o valor de i.• Repita este processo até i chegue ao fim do vetor.• Repita todo o processo até que todos os
elementos do vetor tenham sido comparados.
Procedimentos e Funções
Ordenação por Troca (Bubble Sort) :
223561583057
223561585730
i = 0;
i = 1;
223561557830i = 2;
572235615830i = 0;
223565715830i = 3;
223575615830i = 4;
257235615830i = 5;
572235615830i = 6;
572235615308i = 1;
9
Procedimentos e Funções
Solução :
void BubbleSort( int V[100], int N)
{
int j, i;
for ( i = 0; i < N - 1; i++ )
{
for ( j = 0; j < N - 1; j++ )
if ( V[j] < V[j + 1] )
Troca( &V[j], &V[j + 1] );
}
}
1
Cadeias de Caracteres
Problema :
Escreva um programa em linguagem C que lê umapalavra da entrada e imprime o número de caracteresdesta palavra.
Cadeias de Caracteres
Dúvida :
Quando parar de ler os caracteres da palavra?
Cadeias de Caracteres
Definição :
Cadeias de caracteres (Strings) são seqüências deletras, números ou símbolos onde o último caracter éo caracter ‘\0’ (da mesma família do ‘\n’, ‘\t’ ... ).
Na linguagem C utilizamos vetores do tipo char paraarmazenar cadeias de caracteres. Ex.:
char vetor[10] = “casa”;
Cadeias de Caracteres
Como usar :
Par ler ou para imprimir na tela uma cadeia decaracteres, utilizamos %s como parâmetro dasfunções scanf e printf. Ex.:
char vetor[10];
printf(“Entre com seu nome: ”);
scanf(“%s”, vetor);
printf(“O seu nome eh: %s”, vetor);
A função scanf, quando utilizada com o parâmetro %s
lê todos os caracteres até encontrar um caracter iguala espaço ou fim de linha.
2
Cadeias de Caracteres
Pergunta :
Qual o tamanho do menor vetor que devemos declarar para armazenar uma cadeia de caracteres com 10letras?
Cadeias de Caracteres
Exercício :
Escreva um programa em linguagem C que lê umapalavra da entrada e imprime o número de caracteresdesta palavra.
Cadeias de Caracteres
Solução :
#include <stdio.h>int main(){
char vetor[100];int i, n;
printf("Entre com a palavra: ");scanf("%s", vetor);
i = 0;n = 0;
while(vetor[i++] != '\0')n++;
printf("O numero de caracteres eh %d", n);
return 0;}
Cadeias de Caracteres
Funções Importantes (string.h):
• strlen – Retorna o números de caracteres da cadeia de caracteres, sem contar o ‘\0’. Ex.:
strlen(“casa") == 4
• strcmp– Compara caracter a caracter duas cadeias e retorna o resultado dessa comparação. Ex.:
strcmp(“casa“, “carro”) == 1
strcmp(“casa“, “casa”) == 0
strcmp(“carro”, “casa") == -1
3
Cadeias de Caracteres
Pergunta :
Qual o valor é retornado na chamada da seguintefunção:
strcmp(“Casa“, “carro”) == ?
Cadeias de Caracteres
Funções Importantes (string.h):
• strcmpi – Compara caracter a caracter duas cadeias ignorando se as letras são maiúsculas ou minúsculas, e retorna o resultado dessa comparação. Ex.:
strcmpi(“Casa“, “carro”) == 1
strcmpi(“Casa“, “cASa”) == 0
strcmpi(“caRro”, “casA") == -1
• strcpy – Copia uma string para dentro de outra. Ex.:
strcpy(vetor, “carro”);
strcpy(vetor2, vetor);
Cadeias de Caracteres
Funções Importantes (string.h):
• strcat – Concatena duas strings, a primeira string recebe o seu conteúdo seguido do conteúdo da segunda string. Ex.:
strcpy(vetor, “uva + ”);
strcat(vetor, “banana + ”); strcat(vetor, “pera");
Cadeias de Caracteres
Exercício :
Escreva uma função em linguagem C que recebe umacadeia de caracteres de tamanho máximo 100, eretorna 1 se esta cadeia é uma palíndrome e zerocaso contrário.
P.s.: Uma palavra é dita ser palíndrome se aseqüência de seus caracteres da esquerda para adireita é igual a seqüência de seus caracteres dadireita para a esquerda. Ex.:
arara
4
Cadeias de Caracteres
Solução :
int palindrome(char palavra[100])
{char aux[100];
int i, n;
n = strlen(palavra);for( i = 0; i < n; i++ )
aux[i] = palavra[n – i - 1];
aux[n] = ‘\0’;if( strcmp(palavra, aux) == 0 )
return 1;
elsereturn 0;
}
Cadeias de Caracteres
Exercício :
Escreva um procedimento em linguagem C querecebe 3 cadeia de caracteres de tamanho máximo50, e as imprime na tela em ordem alfabética.
Cadeias de Caracteres
Solução :
void ordem(char a[50], char b[50], char c[50]){
if( strcmp(a, b) > 0 )
{if(strcmp(b, c) > 0 )
printf("%s,%s,%s", a,b,c);
else{
if( strcmp(a, c) > 0 )
printf("%s,%s,%s", a,c,b);else
printf("%s,%s,%s", c,a,b);
} continua no próximo slide
Cadeias de Caracteres
Continuação :
}
else
{if(strcmp(c, a) > 0 )
printf("%s,%s,%s", b,c,a);
else{
if(strcmp(b, c) > 0 )
printf("%s,%s,%s", b,a,c); else
printf("%s,%s,%s", c,b,a);}
}
}
Cadeias de CaracteresProblema :
Escreva um programa em linguagem C que lê umapalavra da entrada e imprime o número de caracteresdesta palavra.
Cadeias de CaracteresDúvida :
Quando parar de ler os caracteres da palavra?
Cadeias de CaracteresDefinição :
Cadeias de caracteres (Strings) são seqüências deletras, números ou símbolos onde o último caracter éo caracter ‘\0’ (da mesma família do ‘\n’, ‘\t’ ... ).
Na linguagem C utilizamos vetores do tipo char paraarmazenar cadeias de caracteres. Ex.:
char vetor[10] = “casa”;
Cadeias de CaracteresComo usar :
Par ler ou para imprimir na tela uma cadeia decaracteres, utilizamos %s como parâmetro dasfunções scanf e printf. Ex.:
char vetor[10];printf(“Entre com seu nome: ”);scanf(“%s”, vetor);printf(“O seu nome eh: %s”, vetor);
A função scanf, quando utilizada com o parâmetro %slê todos os caracteres até encontrar um caracter iguala espaço ou fim de linha.
Cadeias de CaracteresPergunta :
Qual o tamanho do menor vetor que devemos declarar para armazenar uma cadeia de caracteres com 10letras?
Cadeias de CaracteresExercício :
Escreva um programa em linguagem C que lê umapalavra da entrada e imprime o número de caracteresdesta palavra.
Cadeias de CaracteresSolução :
#include <stdio.h>int main(){
char vetor[100];int i, n;printf("Entre com a palavra: ");scanf("%s", vetor);i = 0;n = 0;while(vetor[i++] != '\0')
n++;printf("O numero de caracteres eh %d", n);return 0;
}
Cadeias de CaracteresFunções Importantes (string.h):
• strlen – Retorna o números de caracteres da cadeia de caracteres, sem contar o ‘\0’. Ex.:
strlen(“casa") == 4
• strcmp– Compara caracter a caracter duas cadeias e retorna o resultado dessa comparação. Ex.:
strcmp(“casa“, “carro”) == 1strcmp(“casa“, “casa”) == 0strcmp(“carro”, “casa") == -1
Cadeias de CaracteresPergunta :
Qual o valor é retornado na chamada da seguintefunção:
strcmp(“Casa“, “carro”) == ?
Cadeias de CaracteresFunções Importantes (string.h):
• strcmpi – Compara caracter a caracter duas cadeias ignorando se as letras são maiúsculas ou minúsculas, e retorna o resultado dessa comparação. Ex.:
strcmpi(“Casa“, “carro”) == 1strcmpi(“Casa“, “cASa”) == 0strcmpi(“caRro”, “casA") == -1
• strcpy – Copia uma string para dentro de outra. Ex.:
strcpy(vetor, “carro”);strcpy(vetor2, vetor);
Cadeias de CaracteresFunções Importantes (string.h):
• strcat – Concatena duas strings, a primeira string recebe o seu conteúdo seguido do conteúdo da segunda string. Ex.:
strcpy(vetor, “uva + ”);strcat(vetor, “banana + ”); strcat(vetor, “pera");
Cadeias de CaracteresExercício :
Escreva uma função em linguagem C que recebe umacadeia de caracteres de tamanho máximo 100, eretorna 1 se esta cadeia é uma palíndrome e zerocaso contrário.
P.s.: Uma palavra é dita ser palíndrome se aseqüência de seus caracteres da esquerda para adireita é igual a seqüência de seus caracteres dadireita para a esquerda. Ex.:
arara
Cadeias de CaracteresSolução :
int palindrome(char palavra[100]){
char aux[100];int i, n;n = strlen(palavra);for( i = 0; i < n; i++ )
aux[i] = palavra[n – i - 1];aux[n] = ‘\0’;if( strcmp(palavra, aux) == 0 )
return 1;else
return 0;}
Cadeias de CaracteresExercício :
Escreva um procedimento em linguagem C querecebe 3 cadeia de caracteres de tamanho máximo50, e as imprime na tela em ordem alfabética.
Cadeias de CaracteresSolução :
void ordem(char a[50], char b[50], char c[50]){
if( strcmp(a, b) > 0 ){
if(strcmp(b, c) > 0 )printf("%s,%s,%s", a,b,c);
else{
if( strcmp(a, c) > 0 )printf("%s,%s,%s", a,c,b);
elseprintf("%s,%s,%s", c,a,b);
} continua no próximo slide
Cadeias de CaracteresContinuação :
}else{
if(strcmp(c, a) > 0 )printf("%s,%s,%s", b,c,a);
else{
if(strcmp(b, c) > 0 )printf("%s,%s,%s", b,a,c);
elseprintf("%s,%s,%s", c,b,a);
}}
}
Exercícios
Exercício:
Diga qual será a saída do programa a seguir.
Exercícios#include <stdio.h>void f(int a) {
a = 2;printf ("a = %d\n", a);
}int main() {
int a;a = 1;printf ("a = %d\n", a);f(a);printf ("a = %d\n", a);return 0;
}
Exercícios
Exercício:
E qual a saída deste programa?
Exercícios#include <stdio.h>void f(int *a) {
*a = 2;printf ("a = %d\n", *a);
}int main(){
int a;a = 1;printf ("a = %d\n", a);f(&a);printf ("a = %d\n", a);return 0;
}
Exercícios
Exercício:
Escreva uma função em linguagem C que recebe umamatriz de números inteiros com no máximo 50linhas e 50 colunas, recebe também dois númerosinteiros N e M que indicam respectivamente o númerode linhas e de colunas da matriz; a função tambémrecebe um valor inteiro X.A sua função deve retornar a soma de todos oselementos da matriz na linha X.
Exercícios
int somaLinha(int Matriz[50][50], int M, int N, int X){
int soma, j;soma = 0;
for (j = 0; j < N; j++)soma += Matriz[X][j];
return soma;}
Exercícios
Exercício:
Considere o vetor com 11 elementos abaixo e digaquantas comparações de igualdade realizam osalgoritmos de Busca Linear e Busca Binária, natentativa de se encontrar no vetor os valores:
a) 3b) 25c) 70
1 2 7 15 23 56 57 58 70 72 78
Exercícios
Exercício:
Utilizando (não precisa implementar) as funções e procedimentos vistos em aula. Escreva um programaem linguagem C que solicita a usuário um vetor comno máximo 50 números inteiros maiores que zero.Como saída, seu programa deve imprimir o vetor emordem crescente e decrescente. Você pode utilizar seachar necessário os seguintes procedimentos:
LeVetor (int V[100], int * N);Troca(int* A, int* B);ImprimeVetor (int V[100], int N);InsertionSort(int V[100], int N, int S[100]);SelectionSort(int V[100], int N, int S[100]);BubleSort (int V[100], int N);
Exercícios#include <stdio.h>int main() {
int v[100], n, i;printf (“Entre com o vetor");LeVetor(v, &n);BubbleSort(v, n);printf (“A saida eh:\n");ImprimeVetor(v, n);for( i = 0; i < (n/2); i++)
Troca(&v[i], &v[n-1-i]);ImprimeVetor(v, n);return 0;
}
Exercícios
Exercício:
Escreva um procedimento em linguagem C, querecebe um vetor de strings, e um inteiro porreferência indicando o número de strings no vetor. Seuprograma deve remover do vetor qualquer stringduplicada, ou seja, cada string deve aparecer apenasuma vez no vetor. O procedimento deve ter a seguinte assinatura:
RemoveDup(char* Vetor[100], int* N);
Exercícios
#include <sting.h>RemoveDup(char* Vetor[100], int* N){
int i, j;for( i = 0; i < n; i++)
for( j = i + 1; j < *N; j++)if( strcmp(Vetor[i], Vetor[j]) == 0 ){
strcpy(Vetor[j], Vetor[(*N) - 1]);(*N)--;j--;
}}
1
Registros
Exercício :
Escreva uma função em C que recebe ascoordenadas de 3 pontos no plano e retorna a maiordistância entre eles. Utilize a função abaixo.
#include<math.h>
float Distancia(float X1, float Y1, float X2, float Y2)
{
float DX = (X2 – X1) * (X2 – X1);
float DY = (Y2 – Y1) * (Y2 – Y1);
return sqrt(DX + DY);
}
Registros
Solução :
float MaiorDist(float X1, float Y1, float X2, float Y2,
float X3, float Y3)
{
float D1 = Distancia(X1, Y1, X2, Y2);
float D2 = Distancia(X1, Y1, X3, Y3);
float D3 = Distancia(X3, Y3, X2, Y2);
if ( D1 > D2 && D1 > D3 )
return D1;
if ( D2 > D3 && D2 > D3 )
return D2;
return D3;
}
Registros
Problema :
E se os pontos estivessem no espaço? E se vocêprecisasse calcular a maior distância entre N pontos?
Registros
Definição :
Registros são tipos de variáveis definidos peloprogramador que agrupam outros tipos de dadosnuma só estrutura. Chamamos cada item de umregistro de membro.
2
Registros
Em C :
typedef struct Ponto2D
{
float X;
float Y;
};
No exemplo acima criamos um Registro paraarmazenar as informações de um ponto no plano.Demos ao tipo desse Registro o nome de Ponto2D e X, Y são seus membros.
Registros
Como usar :
Ponto2D p1, p2;
p1.X = 0;
p1.Y = 0;
p2.X = p1.X + 1;
p2.Y = 2 * p1.Y;
Ponto2D pontos[100];
pontos[0].X = 0;
Registros
Exercício :
Defina um tipo Registro chamado Ponto3D, quearmazene as coordenadas de um ponto no espaço.
Registros
Solução :
typedef struct Ponto3D
{
float X;
float Y;
float Z;
};
3
Registros
Exercício :
Reescreva a função Distancia abaixo utilizando o tipoPonto3D definido no exercício anterior para que a
mesma calcule a distância entre dois pontos noespaço.
float Distancia(float X1, float Y1, float X2, float Y2)
{
float DX = (X2 – X1) * (X2 – X1);
float DY = (Y2 – Y1) * (Y2 – Y1);
return sqrt(DX + DY);
}
Registros
Solução :
float Distancia(Ponto3D P1, Ponto3D P2)
{
float DX = (P2.X – P1.X) * (P2.X – P1.X);
float DY = (P2.Y – P1.Y) * (P2.Y – P1.Y);
float DZ = (P2.Z – P1.Z) * (P2.Z – P1.Z);
return sqrt(DX + DY + DZ);
}
Registros
Exercício :
Escreva uma função em C que recebe um ponto noespaço P, um vetor de pontos no espaço V, e a
quantidade de pontos no vetor N e retorna a maiordistância entre P e qualquer ponto de V. Utilize asestruturas e funções dos exercícios anteriores.
Registros
Solução :
float MaiorDistancia(Ponto3D P, Ponto3D V[100], int N)
{
int i;
float aux, maior = Distancia(P, V[0]);
for( i = 1; i < N; i++)
{
aux = Distancia(P, V[i]);
if ( maior < aux )
maior = aux;
}
return maior;
}
4
Registros
Exercício :
Defina um tipo Registro para armazenar os dados deum paciente de um convênio médico. O registro devearmazenar pelo menos:
• Código• Nome• Sobrenome• Data nascimento• Tipo sanguíneo• Sexo• Tipo de plano de saúde
Registros
Solução :
typedef struct Data{
int Dia;int Mes;int Ano;
};
typedef struct Paciente{
int Codigo;char Nome[50];char Sobrenome[50];Data Nascimento;char Sangue[4];char Sexo;int PlanoSaude;
};
Registros
Detalhe :
Quando você tem um ponteiro para uma estrutura(registro) ao invés de utilizarmos ‘.’ utilizamos ‘->’
para acessar o membros. Ex.:
Ponto3D P1;
Ponto3D *ptr;
ptr = &P1;
ptr->X = 0;
ptr->Y = 0;
RegistrosExercício :
Escreva uma função em C que recebe ascoordenadas de 3 pontos no plano e retorna a maiordistância entre eles. Utilize a função abaixo.
#include<math.h>float Distancia(float X1, float Y1, float X2, float Y2){
float DX = (X2 – X1) * (X2 – X1);float DY = (Y2 – Y1) * (Y2 – Y1);return sqrt(DX + DY);
}
RegistrosSolução :
float MaiorDist(float X1, float Y1, float X2, float Y2,float X3, float Y3){
float D1 = Distancia(X1, Y1, X2, Y2);float D2 = Distancia(X1, Y1, X3, Y3);float D3 = Distancia(X3, Y3, X2, Y2);
if ( D1 > D2 && D1 > D3 )return D1;
if ( D2 > D3 && D2 > D3 )return D2;
return D3;}
RegistrosProblema :
E se os pontos estivessem no espaço? E se vocêprecisasse calcular a maior distância entre N pontos?
RegistrosDefinição :
Registros são tipos de variáveis definidos peloprogramador que agrupam outros tipos de dadosnuma só estrutura. Chamamos cada item de umregistro de membro.
RegistrosEm C :
typedef struct Ponto2D{
float X;float Y;
};
No exemplo acima criamos um Registro paraarmazenar as informações de um ponto no plano.Demos ao tipo desse Registro o nome de Ponto2D e X, Y são seus membros.
RegistrosComo usar :
Ponto2D p1, p2;p1.X = 0;p1.Y = 0;p2.X = p1.X + 1;p2.Y = 2 * p1.Y;
Ponto2D pontos[100];
pontos[0].X = 0;
RegistrosExercício :
Defina um tipo Registro chamado Ponto3D, quearmazene as coordenadas de um ponto no espaço.
RegistrosSolução :
typedef struct Ponto3D{
float X;float Y;float Z;
};
RegistrosExercício :
Reescreva a função Distancia abaixo utilizando o tipoPonto3D definido no exercício anterior para que amesma calcule a distância entre dois pontos noespaço.
float Distancia(float X1, float Y1, float X2, float Y2){
float DX = (X2 – X1) * (X2 – X1);float DY = (Y2 – Y1) * (Y2 – Y1);return sqrt(DX + DY);
}
RegistrosSolução :
float Distancia(Ponto3D P1, Ponto3D P2){
float DX = (P2.X – P1.X) * (P2.X – P1.X);float DY = (P2.Y – P1.Y) * (P2.Y – P1.Y);float DZ = (P2.Z – P1.Z) * (P2.Z – P1.Z);return sqrt(DX + DY + DZ);
}
RegistrosExercício :
Escreva uma função em C que recebe um ponto noespaço P, um vetor de pontos no espaço V, e aquantidade de pontos no vetor N e retorna a maiordistância entre P e qualquer ponto de V. Utilize asestruturas e funções dos exercícios anteriores.
RegistrosSolução :float MaiorDistancia(Ponto3D P, Ponto3D V[100], int N){
int i;float aux, maior = Distancia(P, V[0]);for( i = 1; i < N; i++){
aux = Distancia(P, V[i]);if ( maior < aux )
maior = aux;}return maior;
}
RegistrosExercício :
Defina um tipo Registro para armazenar os dados deum paciente de um convênio médico. O registro devearmazenar pelo menos:
• Código• Nome• Sobrenome• Data nascimento• Tipo sanguíneo• Sexo• Tipo de plano de saúde
RegistrosSolução :
typedef struct Paciente{
int Codigo;char Nome[50];char Sobrenome[50];Data Nascimento;char Sangue[4];char Sexo;int PlanoSaude;
};
typedef struct Data{
int Dia;int Mes;int Ano;
};
RegistrosDetalhe :
Quando você tem um ponteiro para uma estrutura(registro) ao invés de utilizarmos ‘.’ utilizamos ‘->’para acessar o membros. Ex.:
Ponto3D P1;Ponto3D *ptr;
ptr = &P1;ptr->X = 0;ptr->Y = 0;
ArquivosProblema :
Como manter persistentes os dados utilizadose/ou gerados por um programa de computador ?
Solução :
Armazenar os dados de entrada em arquivos.
ArquivosTipos de Arquivo :
• Arquivos de Texto: Os dados são gravados como caracteres de 8 bits. Ex.: Um número inteiro de 32 bits com 8 dígitos ocupará 64 bits no arquivo.
• Arquivos Binários: Os dados são gravados na forma binária (do mesmo modo que estão na memória). Ex.: Um número inteiro de 32 bits com 8 dígitos ocupará 32 bits no arquivo.
ArquivosExemplos :
Os dois trechos de arquivo abaixo possuem osmesmo dados :
• Arquivo Binário: Renato ÌÌÌÌÌ·áõ�A+ Ì• Arquivo Texto: Renato,32891319,A+
ArquivosModos de abertura de Arquivo :
Existem 3 modos de se abrir um arquivo:
• Leitura • Escrita • Edição
ArquivosAbrindo e fechando arquivos em C :
Um arquivo em C é representado pelo tipo FILE*.Quando queremos abrir um arquivo utilizamos afunção fopen e para fechá-lo usamos a função fclose.Ex.:
FILE* arquivo = fopen(“nome.txt”, “wb”);fclose(arquivo);
ArquivosA função fopen:
A função fopen recebe duas strings comoparâmetros:
• Nome do Arquivo: Caminho relativo do arquivo. Ex.: “lab11.c”, “c:/temp/lab1.c”
• Modo de abertura: Determina como o arquivo deve ser aberto, os principais são:– “w” : Escrita, se o arquivo existir cria um novo.– “r” : Leitura, se o arquivo não existir dá erro.– “a” : Edição, se o arquivo não existir dá erro.
A função fopen retornará um ponteiro para o arquivoou 0 (zero) caso ocorra algum problema na abertura.
ArquivosA função fclose:
A função fclose recebe o ponteiro do arquivo a serfechado. Ex.:
FILE* arquivo = fopen(“nome.txt”, “wb”);fclose(arquivo);
Obs.: A string “wb” indica que queremos abrir umarquivo binário para escrita. Sempre que quisermosabrir um arquivo binário acrescentamos o caracter bna string do modo de abertura.
ArquivosLendo e escrevendo em Arquivos Texto :
Para ler ou escrever em um Arquivo Texto, utilizamosas funções, fscanf e fprintf:
• fscanf : Idêntica ao scanf, só que recebe o ponteiro para o arquivo como primeiro parâmetro.
• fprintf : Idêntica ao printf, só que recebe o ponteiro para o arquivo como primeiro parâmetro.
Importante: fscanf deve ser usado apenas comarquivos abertos para leitura e fprintf com arquivosabertos para escrita.
ArquivosExemplo:include<stdio.h>int main(){
char texto[100];FILE *leitura, *escrita;leitura = fopen(“leitura.txt”, “r”);if( leitura == 0 ){
printf(“Nao abriu o leitura.txt”);return 0;
}escrita = fopen(“escrita.txt”, “w”);if( escrita == 0 ){
printf(“Nao abriu o escrita.txt”);return 0;
} to be continued
Arquivos
fscanf(leitura, “%s”, texto);fprintf(escrita, “%s”, texto);
fclose(leitura);fclose(escrita);
return 0;}
ArquivosExercício :
Escreva um programa em C que solicita ao usuário onome(string), telefone(inteiro) e tipo sanguíneo(string).Em seguida o seu programa deve gravar esses dadosnum arquivo texto chamado “dados.txt”.
ArquivosExercício :
Escreva um programa em C que lê de um arquivochamado “dados.txt” e imprime na tela os seguintesdados do usuário: nome(string), telefone(inteiro) e tiposanguíneo(string).
ArquivosLendo e escrevendo em Arquivos Binários :
Arquivos binários nos permitem ler e escreverestruturas ou mesmo vetores de estruturas de umavez. Utilizamos as funções, fread e fwrite. Ambas recebem os mesmos parâmetros:
• Ponteiro: Um ponteiro para estrutura (ou vetor)que será lido ou escrito no arquivo.• Tamanho: Inteiro que indica o tamanho daestrutura, utilizamos sizeof para descobrir o tamanho.• Quantidade: Número de estruturas (maior que 1 quando for vetor).• Arquivo: Ponteiro para o arquivo.
ArquivosExemplo:
int val;fread(&val, sizeof(int), 1, leitura);fwrite(&val, sizeof(int), 1, escrita);
int vetor[100];fread(vetor, sizeof(int), 100, leitura);fwrite(vetor, sizeof(int), 100, escrita);
ArquivosExercício :
Escreva um programa em C que solicita ao usuário onúmero de pacientes e os seguintes dados para cadapaciente nome(string), telefone(inteiro) e tiposanguíneo(string). Em seguida o seu programa devegravar o número de pacientes e na seqüência osdados de todos os pacientes num arquivo bináriochamado “dadosbin.txt”.
ArquivosExercício :
Escreva um programa em C que lê de um arquivochamado “dadosbin.txt” o número de pacientes eem seguida os seus dados e imprime na tela osmesmos.
1
Arquivos
Problema :
Como manter persistentes os dados utilizadose/ou gerados por um programa de computador ?
Solução :
Armazenar os dados de entrada em arquivos.
Arquivos
Tipos de Arquivo :
• Arquivos de Texto: Os dados são gravados como caracteres de 8 bits. Ex.: Um número inteiro de 32 bits com 8 dígitos ocupará 64 bits no arquivo.
• Arquivos Binários: Os dados são gravados na forma binária (do mesmo modo que estão na memória). Ex.: Um número inteiro de 32 bits com 8 dígitos ocupará 32 bits no arquivo.
Arquivos
Exemplos :
Os dois trechos de arquivo abaixo possuem osmesmo dados :
• Arquivo Binário: Renato ÌÌÌÌÌ·áõ�A+ Ì• Arquivo Texto: Renato,32891319,A+
ArquivosModos de abertura de Arquivo :
Existem 3 modos de se abrir um arquivo:
• Leitura • Escrita • Edição
2
Arquivos
Abrindo e fechando arquivos em C :
Um arquivo em C é representado pelo tipo FILE*.
Quando queremos abrir um arquivo utilizamos a
função fopen e para fechá-lo usamos a função fclose.
Ex.:
FILE* arquivo = fopen(“nome.txt”, “wb”);
fclose(arquivo);
Arquivos
A função fopen:
A função fopen recebe duas strings comoparâmetros:
• Nome do Arquivo: Caminho relativo do arquivo. Ex.: “lab11.c”,“c:/temp/lab1.c”
• Modo de abertura: Determina como o arquivo deve ser aberto, os principais são:– “w” : Escrita, se o arquivo existir cria um
novo.“r” : Leitura, se o arquivo não existir dá
Arquivos
A função fclose:
A função fclose recebe o ponteiro do arquivo a serfechado. Ex.:
FILE* arquivo = fopen(“nome.txt”, “wb”);
fclose(arquivo);
Obs.: A string “wb” indica que queremos abrir um
arquivo binário para escrita. Sempre que quisermosabrir um arquivo binário acrescentamos o caracter bna string do modo de abertura.
Arquivos
Lendo e escrevendo em Arquivos Texto :
Para ler ou escrever em um Arquivo Texto, utilizamos
as funções, fscanf e fprintf:
• fscanf : Idêntica ao scanf, só que recebe o ponteiro para o arquivo como primeiro parâmetro.
• fprintf : Idêntica ao printf, só que recebe o ponteiro para o arquivo como primeiro parâmetro.
3
ArquivosExemplo:include<stdio.h>int main(){
char texto[100];FILE *leitura, *escrita;
leitura = fopen(“leitura.txt”, “r”);if( leitura == 0 )
{printf(“Nao abriu o leitura.txt”);return 0;
}escrita = fopen(“escrita.txt”, “w”);
if( escrita == 0 ){
printf(“Nao abriu o escrita.txt”);return 0;
} to be continued
Arquivos
fscanf(leitura, “%s”, texto);fprintf(escrita, “%s”, texto);
fclose(leitura);fclose(escrita);
return 0;}
Arquivos
Exercício :
Escreva um programa em C que solicita ao usuário onome(string), telefone(inteiro) e tipo sanguíneo(string).
Em seguida o seu programa deve gravar esses dadosnum arquivo texto chamado “dados.txt”.
Arquivos
Exercício :
Escreva um programa em C que lê de um arquivochamado “dados.txt” e imprime na tela os seguintes
dados do usuário: nome(string), telefone(inteiro) e tiposanguíneo(string).
4
Arquivos
Lendo e escrevendo em Arquivos Binários :
Arquivos binários nos permitem ler e escreverestruturas ou mesmo vetores de estruturas de umavez. Utilizamos as funções, fread e fwrite. Ambas recebem os mesmos parâmetros:
• Ponteiro: Um ponteiro para estrutura (ou vetor)que será lido ou escrito no arquivo.• Tamanho: Inteiro que indica o tamanho daestrutura, utilizamos sizeof para descobrir o tamanho.• Quantidade: Número de estruturas (maior que 1 quando for vetor).• Arquivo: Ponteiro para o arquivo.
ArquivosExemplo:
int val;fread(&val, sizeof(int), 1, leitura);
fwrite(&val, sizeof(int), 1, escrita);
int vetor[100];
fread(vetor, sizeof(int), 100, leitura);
fwrite(vetor, sizeof(int), 100, escrita);
Arquivos
Exercício :
Escreva um programa em C que solicita ao usuário onúmero de pacientes e os seguintes dados para cada
paciente nome(string), telefone(inteiro) e tiposanguíneo(string). Em seguida o seu programa devegravar o número de pacientes e na seqüência os
dados de todos os pacientes num arquivo bináriochamado “dadosbin.txt”.
Arquivos
Exercício :
Escreva um programa em C que lê de um arquivochamado “dadosbin.txt” o número de pacientes e
em seguida os seus dados e imprime na tela osmesmos.
1
Recursividade
Exercício :
Escreve uma função que recebe como parâmetro uminteiro positivo N e retorna a soma de todos os
números inteiros entre 0 e N.
RecursividadeSolução:
int Somatorio(int N)
{
int i, resp = 0;
for( i = 1; i <= N; i++ )
resp += i;
return resp;
}
Recursividade
Exercício :
Refaça o exercício anterior, mas desta vez não utilizenenhum tipo de laço (for, while, do while, etc...).
Recursividade
Solução:
int Somatorio(int N)
{
if( N == 1 )
return 1;
else
return (N + Somatorio(N – 1));
}
2
Recursividade
Definição :
“Uma função ou procedimento é dito recursivo ( ouapresenta recursividade ) se for definido em termos de
si próprio.”
Recursividade
Recursão :
É o processo de resolução de um problema,reduzindo-o em um ou mais sub-problemas com as
seguintes características:
• idênticos ao problema original.
• resolução mais simples e conhecida.
Dois tipos:
• Direta• Indireta
Recursividade
Exemplo Numérico :
int Somatorio(int N)
{
if( N == 1 )
return 1;
else
return (N + Somatorio(N – 1));
}
Recursividade
Exemplo Numérico :
Para N == 4, temos:
N == 4
return 4 + 6;
N == 3
return 3 + 3;
N == 2
return 2 + 1;
N == 1 return 1;
3
Recursividade
Exercício :
Escreva uma função recursiva que recebe comoparâmetro um inteiro N maior que zero e retorna o
valor do fatorial de N.
Recursividade
Solução:
int Fatorial(int N)
{
if( N == 1 )
return 1;
else
return (N * Fatorial(N – 1));
}
Recursividade
Exercício :
Reescreva a função abaixo tornando-a recursiva:
int Digitos( int N )
{
int cont = 1;
while( abs( N ) > 9)
{
N = N / 10;
cont++;
}
return cont;
}
Recursividade
Solução:
int Digitos(int N)
{
if( abs( N ) < 10 )
return 1;
else
return (1 + Digitos(N / 10));
}
4
Recursividade
Exercício :
Escreva uma função recursiva que recebe comoparâmetros um número real X e um inteiro N e retorna
o valor de XN.
Obs.: N pode ser negativo.
Recursividade
Solução:
float Potencia(float X, int N)
{
if( N == 0 )
return 1;
else
{
if( N < 0 )
return 1 / (X * Potencia(X, abs(N) - 1));
else
return (X * Potencia(X, N - 1));
}
}
RecursividadeExercício :
Escreve uma função que recebe como parâmetro uminteiro positivo N e retorna a soma de todos osnúmeros inteiros entre 0 e N.
RecursividadeSolução:
int Somatorio(int N){
int i, resp = 0;for( i = 1; i <= N; i++ )
resp += i;
return resp;}
RecursividadeExercício :
Refaça o exercício anterior, mas desta vez não utilizenenhum tipo de laço (for, while, do while, etc...).
RecursividadeSolução:
int Somatorio(int N){
if( N == 1 )return 1;
elsereturn (N + Somatorio(N – 1));
}
RecursividadeDefinição :
“Uma função ou procedimento é dito recursivo ( ouapresenta recursividade ) se for definido em termos desi próprio.”
RecursividadeRecursão :
É o processo de resolução de um problema,reduzindo-o em um ou mais sub-problemas com as seguintes características:
• idênticos ao problema original.• resolução mais simples e conhecida.
Dois tipos:
• Direta• Indireta
RecursividadeExemplo Numérico :
int Somatorio(int N){
if( N == 1 )return 1;
elsereturn (N + Somatorio(N – 1));
}
RecursividadeExemplo Numérico :
Para N == 4, temos:
N == 4
return 4 + 6;
N == 3
return 3 + 3;
N == 2
return 2 + 1;
N == 1 return 1;
RecursividadeExercício :
Escreva uma função recursiva que recebe comoparâmetro um inteiro N maior que zero e retorna ovalor do fatorial de N.
RecursividadeSolução:
int Fatorial(int N){
if( N == 1 )return 1;
elsereturn (N * Fatorial(N – 1));
}
RecursividadeExercício :
Reescreva a função abaixo tornando-a recursiva:
int Digitos( int N ){
int cont = 1;while( abs( N ) > 9){
N = N / 10;cont++;
}return cont;
}
RecursividadeSolução:
int Digitos(int N){
if( abs( N ) < 10 )return 1;
elsereturn (1 + Digitos(N / 10));
}
RecursividadeExercício :
Escreva uma função recursiva que recebe comoparâmetros um número real X e um inteiro N e retornao valor de XN.
Obs.: N pode ser negativo.
RecursividadeSolução:
float Potencia(float X, int N){
if( N == 0 )return 1;
else{
if( N < 0 )return 1 / (X * Potencia(X, abs(N) - 1));
elsereturn (X * Potencia(X, N - 1));
}}
1
RecursividadeExercício :
Reescreva a função abaixo tornando-a recursiva:
int Fibonacci ( int n )
{int A = 0, B = 1, i, temp;
if ( n <= 1)
return n;
for ( i = 2; i <= n; i++)
{
temp = B; B += A; A = temp;}
return B;
}
Recursividade
Solução:
int Fibonacci( int n )
{
if ( n <= 1)
return n;
else
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
Recursividade
Problema :
Para o problema anterior qual das duas soluções eramais eficiente?
Recursividade
Quando não usar Recursão:
• Repetição do processamento:Em geral, cada chamada recursiva é independente
uma da outra. Caso ocorram os mesmos cálculos paraduas chamadas recursivas independentes, essescálculos serão repetidos para cada chamada.
• Gasto de memória excessivo:Cada chamada recursiva aloca memória para asvariáveis locais e para os parâmetros, sendo que naforma iterativa isso ocorre apenas uma vez.
2
Recursividade
Busca Binária:esq = 0; dir = N - 1; meio = (esq + dir) / 2;
while (esq < dir)
{
if ( X == V[meio] )
break;
else if ( X > V[meio] )
esq = meio + 1;
else
dir = meio - 1;
meio = (esq + dir) / 2;
}
if ( X == V[meio] )
return 1;
return 0;
Recursividade
int BuscaBin(int vetor[100], int esq, int dir, int x)
{
int meio = (esq + dir) / 2;
if( dir <= esq )
return vetor[meio] == x;
else if( x > vetor[meio] )
return BuscaBin(vetor, meio + 1, dir, x);
else if( x < vetor[meio] )
return BuscaBin(vetor, esq, meio - 1, x);
else
return 1;
}
RecursividadeIntercalação:
void Intercala(int A[10], int nA, int B[10], int nB, int C[10]){
int i, iA = 0, iB = 0;
for(i = 0; i < iA + iB; i++){
if( iA == nA )C[i] = B[iB++];
else if( iB == nB )C[i] = A[iA++];
else if( A[iA] < B[iB] )C[i] = A[iA++];
else
C[i] = B[iB++];}
}
12235657172278
172278 12235657
278 172
23 12
Recursividade
Ordenação por Intercalação (Merge Sort):
72
12235657
78 5712 56
3
Recursividade
Merge Sort:
int MergeSort ( int v[10], int inicio, int fim )
{
int meio;
if ( inicio < fim )
{
meio = (inicio + fim ) / 2;
MergeSort (v, inicio, meio );
MergeSort (v, meio + 1, fim );
Intercala (v, inicio, meio, fim );
}
}
Recursividade
http://freeweb.supereva.com/nessunoforever/flash/hanoi/index.htm?p
RecursividadeExercício :
Reescreva a função abaixo tornando-a recursiva:
int Fibonacci ( int n ) {
int A = 0, B = 1, i, temp;if ( n <= 1)
return n;for ( i = 2; i <= n; i++) {
temp = B; B += A; A = temp;}return B;
}
RecursividadeSolução:
int Fibonacci( int n ){
if ( n <= 1)return n;
elsereturn Fibonacci(n - 1) + Fibonacci(n - 2);
}
RecursividadeProblema :
Para o problema anterior qual das duas soluções eramais eficiente?
RecursividadeQuando não usar Recursão:
• Repetição do processamento:Em geral, cada chamada recursiva é independenteuma da outra. Caso ocorram os mesmos cálculos paraduas chamadas recursivas independentes, essescálculos serão repetidos para cada chamada.
• Gasto de memória excessivo:Cada chamada recursiva aloca memória para asvariáveis locais e para os parâmetros, sendo que naforma iterativa isso ocorre apenas uma vez.
Recursividade
Busca Binária:esq = 0; dir = N - 1; meio = (esq + dir) / 2;while (esq < dir){
if ( X == V[meio] )break;
else if ( X > V[meio] )esq = meio + 1;
elsedir = meio - 1;
meio = (esq + dir) / 2;}if ( X == V[meio] )
return 1;return 0;
Recursividadeint BuscaBin(int vetor[100], int esq, int dir, int x){
int meio = (esq + dir) / 2;if( dir <= esq )
return vetor[meio] == x;else if( x > vetor[meio] )
return BuscaBin(vetor, meio + 1, dir, x);else if( x < vetor[meio] )
return BuscaBin(vetor, esq, meio - 1, x);else
return 1;}
RecursividadeIntercalação:
void Intercala(int A[10], int nA, int B[10], int nB, int C[10]){
int i, iA = 0, iB = 0;for(i = 0; i < iA + iB; i++)
{if( iA == nA )
C[i] = B[iB++];else if( iB == nB )
C[i] = A[iA++];else if( A[iA] < B[iB] )
C[i] = A[iA++];else
C[i] = B[iB++];}
}
78 2 72 1 57 56 23 12
78 2 72 1 57 56 23 12
78 2 72 1
23 12
RecursividadeOrdenação por Intercalação (Merge Sort):
72
23 1257 56
78 5712 56
RecursividadeMerge Sort:
int MergeSort ( int v[10], int inicio, int fim ){
int meio;if ( inicio < fim ){
meio = (inicio + fim ) / 2;MergeSort (v, inicio, meio );MergeSort (v, meio + 1, fim );Intercala (v, inicio, meio, fim );
}}
Recursividade
http://freeweb.supereva.com/nessunoforever/flash/hanoi/index.htm?p
Alocação DinâmicaProblema :
Como evitar o desperdício de memória quandoalocamos vetores? Como criar um vetor do tamanhoque será necessário ao usuário? Como devolver aosistema regiões de memória que não são maisnecessárias? Quem somos? De onde viemos? Paraonde vamos?
Alocação DinâmicaSolução:
1. Determinar o quanto de memória será necessário.2. Solicitar ao sistema a quantidade necessária de
memória.3. Devolver ao sistema a região de memória após o
seu uso.
Alocação Dinâmica
Função malloc:
<ponteiro> = malloc ( <tamanho em bytes> );
• Recebe como parâmetro o número de bytesnecessários (tamanho da memória).
• Retorna um ponteiro para a região de memória alocada dinamicamente pelo sistema.
• Se o sistema não conseguir alocar uma região com o tamanho especificado (por falta de espaço) a função malloc retorna zero.
Alocação Dinâmica
Função free:
free ( <ponteiro para região de memória> );
• Recebe como parâmetro o ponteiro para região de memória alocada dinamicamente e devolve a região alocada ao sistema.
• Apenas regiões de memória alocadas com mallocpodem ser desalocadas com free.
• A mesma região de memória só pode ser desalocada uma vez.
Alocação Dinâmica
#include<stdlib.h>#include<stdio.h>int main(){
int *vetor, n;printf(“Entre com o tamanho do vetor: ”);scanf(“%d”, &n);vetor = malloc(n * (sizeof(int)));if( vetor == 0 ){
printf(“Erro: Memoria insuficiente”);return -1;
}else ...
Alocação DinâmicaExercício :
Escreva um programa em linguagem C que solicita aousuário um vetor de notas (números reais) e imprimea média aritmética das notas.
P.s.: Apesar de não ser necessário utilize um vetor.P.s.: O programa não deve limitar o tamanho do vetor.P.s.: Não deve ocorrer desperdício de memória.P.s.: Após ser utilizada a memória deve ser devolvida.
Alocação DinâmicaExercício :
Escreva um programa em linguagem C que solicita aousuário o RA (inteiro) e a média final (real) de todos osseus alunos e imprime todos os alunos que estão deexame.
P.s.: Utilize um vetor de registros (estruturas) paraarmazenar os dados dos alunos.P.s.: O programa não deve limitar o número dealunos.P.s.: Não deve ocorrer desperdício de memória.P.s.: Após ser utilizada a memória deve ser devolvida.
Alocação DinâmicaExercício :
Escreva um programa em linguagem C que utiliza aestrutura abaixo para criar lista. Numa lista o campoprox recebe o endereço do próximo elemento da lista.Solicite ao usuário o número de elementos da lista ecrie a mesma preenchendo o campo val com aposição do elemento na lista. Depois imprima a lista.
typedef struct Elemento{
int val;struct Elemento* prox;
}Elemento;
1
Alocação Dinâmica
Problema :
Como evitar o desperdício de memória quandoalocamos vetores? Como criar um vetor do tamanhoque será necessário ao usuário? Como devolver aosistema regiões de memória que não são maisnecessárias? Quem somos? De onde viemos? Paraonde vamos?
Alocação Dinâmica
Solução:
1. Determinar o quanto de memória será necessário.2. Solicitar ao sistema a quantidade necessária de
memória.3. Devolver ao sistema a região de memória após o
seu uso.
Alocação Dinâmica
Função malloc:
<ponteiro> = malloc ( <tamanho em bytes> );
• Recebe como parâmetro o número de bytesnecessários (tamanho da memória).
• Retorna um ponteiro para a região de memória alocada dinamicamente pelo sistema.
• Se o sistema não conseguir alocar uma região com o tamanho especificado (por falta de espaço) a função malloc retorna zero.
Alocação Dinâmica
Função free:
free ( <ponteiro para região de memória> );
• Recebe como parâmetro o ponteiro para região de memória alocada dinamicamente e devolve a região alocada ao sistema.
• Apenas regiões de memória alocadas com mallocpodem ser desalocadas com free.
• A mesma região de memória só pode ser desalocada uma vez.
2
Alocação Dinâmica
#include<stdlib.h>
#include<stdio.h>
int main()
{
int *vetor, n;
printf(“Entre com o tamanho do vetor: ”);
scanf(“%d”, &n);
vetor = malloc(n * (sizeof(int)));
if( vetor == 0 )
{
printf(“Erro: Memoria insuficiente”);
return -1;
}
else ...
Alocação Dinâmica
Exercício :
Escreva um programa em linguagem C que solicita aousuário um vetor de notas (números reais) e imprimea média aritmética das notas.
P.s.: Apesar de não ser necessário utilize um vetor.P.s.: O programa não deve limitar o tamanho do vetor.P.s.: Não deve ocorrer desperdício de memória.P.s.: Após ser utilizada a memória deve ser devolvida.
Alocação Dinâmica
Exercício :
Escreva um programa em linguagem C que solicita aousuário o RA (inteiro) e a média final (real) de todos osseus alunos e imprime todos os alunos que estão deexame.
P.s.: Utilize um vetor de registros (estruturas) paraarmazenar os dados dos alunos.P.s.: O programa não deve limitar o número dealunos.P.s.: Não deve ocorrer desperdício de memória.P.s.: Após ser utilizada a memória deve ser devolvida.
Alocação Dinâmica
Exercício :
Escreva um programa em linguagem C que utiliza aestrutura abaixo para criar lista. Numa lista o campoprox recebe o endereço do próximo elemento da lista.Solicite ao usuário o número de elementos da lista ecrie a mesma preenchendo o campo val com aposição do elemento na lista. Depois imprima a lista.
typedef struct Elemento
{
int val;
struct Elemento* prox;
}Elemento;
ExercíciosExercício:
Diga qual será a saída do programa a seguir.
Exercícios#include <stdio.h>void f(int a, int b) {
if( a <= b )printf (“%d", b);
else{
f(a – 1);printf (“, %d", a);
}}int main() {
int a = 12, b = 4;f(a, b);return 0;
}
ExercíciosExercício:
Escreva uma função recursiva em linguagem C querecebe como parâmetros dois inteiros X, Y (onde X ésempre menor que Y) e retorna a soma de todos osvalores entre X e Y (incluindo X e Y).
Exercíciosint Somatorio(int X, int Y) {
if( Y <= X )return X;
elsereturn Y + Somatorio(Y – 1);
}
ExercíciosExercício:
Escreva um programa em Linguagem C que lê doisvetores de números reais de um arquivo texto einforma ao usuário se os vetores lidos são iguais.Considere que a primeira informação do arquivo é ovalor que indica o tamanho dos vetores, e que osvalores consecutivos são os seus valores. Seuprograma deve solicitar ao usuário o nome do arquivotexto a ser lido e deve utilizar alocação dinâmica.Ex. Arquivo de entrada:
3 1.5 2.5 4.7 1.5 2.5 4.7
ExercíciosExercício:
Escreva um programa em linguagem C que solicita aousuário dados de alguns pacientes (nome, sobrenome,peso, idade) e grava estas informações em um arquivotexto, cujo nome é informado pelo usuário:• Utilize registros para resolver este exercício.• A primeira informação a ser gravada no arquivo
deve ser o número de pacientes.• A seguir, os dados de cada paciente devem ser
gravados em uma linha do arquivo, separados por espaços.
ExercíciosExercício:
Escreva um programa em linguagem C que lê de umarquivo texto os dados de alguns pacientes (nome,sobrenome, peso, idade), calcula o peso médio destespacientes e imprime os nomes completos daquelespacientes que estiverem acima da média.• O nome do arquivo deve ser solicitado ao usuário• Utilize registros e alocação dinâmica para resolver
este exercício• Lembre-se de que a primeira informação do
arquivo é o número de pacientes.