Aulas de Linguagem c

Preview:

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", &nota);media = nota * PESO1;printf("\nEntre com a segunda nota: ");scanf("%f", &nota);media += nota * PESO2;printf("\nEntre com a terceira nota: ");scanf("%f", &nota);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", &nota);media = nota * PESO1;printf("\nEntre com a segunda nota: ");scanf("%f", &nota);media += nota * PESO2;printf("\nEntre com a terceira nota: ");scanf("%f", &nota);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”, &notas[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”, &notas[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", &notas[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 = &nota;

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.

Recommended