322
Introdução a Computação O que é um computador? Um computador é uma coleção de componentes que realizam operações lógicas e aritméticas sobre um grande volume de dados.” (F. K. Miyazawa)

Aulas de Linguagem c

  • Upload
    acfava

  • View
    1.128

  • Download
    12

Embed Size (px)

Citation preview

Page 1: Aulas de Linguagem c

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)

Page 2: Aulas de Linguagem c

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

Page 3: Aulas de Linguagem c

Introdução a Computação

Page 4: Aulas de Linguagem c

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).

Page 5: Aulas de Linguagem c

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).

Page 6: Aulas de Linguagem c

Introdução a Computação

Page 7: Aulas de Linguagem c

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

Page 8: Aulas de Linguagem c

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.

Page 9: Aulas de Linguagem c

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

Page 10: Aulas de Linguagem c

Introdução a Computação

Existem 10 tipos de pessoas…aquelas que entendem binário…

e as que não entendem.

Page 11: Aulas de Linguagem c

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?

Page 12: Aulas de Linguagem c

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.

Page 13: Aulas de Linguagem c

Introdução a Computação

http://freeweb.supereva.com/nessunoforever/flash/hanoi/index.htm?p

Page 14: Aulas de Linguagem c

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.”

Page 15: Aulas de Linguagem c

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

Page 16: Aulas de Linguagem c

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

Page 17: Aulas de Linguagem c

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

Page 18: Aulas de Linguagem c

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);

Page 19: Aulas de Linguagem c

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

Page 20: Aulas de Linguagem c

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

Page 21: Aulas de Linguagem c

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;

}

Page 22: Aulas de Linguagem c

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: */

Page 23: Aulas de Linguagem c

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 */

Page 24: Aulas de Linguagem c

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.

Page 25: Aulas de Linguagem c

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;

Page 26: Aulas de Linguagem c

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 }

Page 27: Aulas de Linguagem c

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.

Page 28: Aulas de Linguagem c

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(“??????????????");

Page 29: Aulas de Linguagem c

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);

Page 30: Aulas de Linguagem c

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 (“…”).

Page 31: Aulas de Linguagem c

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);

Page 32: Aulas de Linguagem c

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”);

Page 33: Aulas de Linguagem c

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)

Page 34: Aulas de Linguagem c

Entrada e SaídaO que será impresso?

printf(“\n\t****\n\t*\n\t*\n\t*\n\t*\n\t****\n”);

Page 35: Aulas de Linguagem c

Entrada e SaídaOnde está o erro?

printf(“\n %d dividido por %d eh %d e o resto eh %d \n”, x, y, resultado)

Page 36: Aulas de Linguagem c

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

Page 37: Aulas de Linguagem c

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.

Page 38: Aulas de Linguagem c

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);

Page 39: Aulas de Linguagem c

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.

Page 40: Aulas de Linguagem c

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;

}

Page 41: Aulas de Linguagem c

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;

}

Page 42: Aulas de Linguagem c

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.

Page 43: Aulas de Linguagem c

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 */

Page 44: Aulas de Linguagem c

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.

Page 45: Aulas de Linguagem c

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);

Page 46: Aulas de Linguagem c

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)

Page 47: Aulas de Linguagem c

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.

Page 48: Aulas de Linguagem c

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.

Page 49: Aulas de Linguagem c

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

Page 50: Aulas de Linguagem c

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;

Page 51: Aulas de Linguagem 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;

Page 52: Aulas de Linguagem c

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

Page 53: Aulas de Linguagem c

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.

Page 54: Aulas de Linguagem c

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.

Page 55: Aulas de Linguagem c

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

Page 56: Aulas de Linguagem c

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.

Page 57: Aulas de Linguagem c

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.

Page 58: Aulas de Linguagem c

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;

}

Page 59: Aulas de Linguagem c

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 ???

Page 60: Aulas de Linguagem c

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.

Page 61: Aulas de Linguagem c

Comandos Condicionais

Em linguagem C:

if( expressão ){

comando1;comando2;…comandoN;

}

Page 62: Aulas de Linguagem c

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;

}

Page 63: Aulas de Linguagem c

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.

Page 64: Aulas de Linguagem c

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);}

Page 65: Aulas de Linguagem c

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;}

Page 66: Aulas de Linguagem c

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 ).

Page 67: Aulas de Linguagem c

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.

Page 68: Aulas de Linguagem c

Comandos CondicionaisExercício:

Faça um programa que imprime o maior entre 3números inteiros distintos (a, b, c).

Page 69: Aulas de Linguagem 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;}

Page 70: Aulas de Linguagem c

Comandos CondicionaisProblema:

Faça um programa que imprime o maior entre 3números inteiros distintos. O programa deve realizarapenas duas comparações.

Page 71: Aulas de Linguagem 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 ){

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;

}

Page 72: Aulas de Linguagem c

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.

Page 73: Aulas de Linguagem c

Comandos Condicionais

Exercício:

Escreva um programa que lê 3 valores inteiros eimprime como saída os mesmos valores em ordemcrescente.

Page 74: Aulas de Linguagem c

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.

Page 75: Aulas de Linguagem c

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;

}

Page 76: Aulas de Linguagem c

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;}

Page 77: Aulas de Linguagem c

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;}

Page 78: Aulas de Linguagem c

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.

Page 79: Aulas de Linguagem c

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.

Page 80: Aulas de Linguagem c

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

Page 81: Aulas de Linguagem c

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 ........

Page 82: Aulas de Linguagem c

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

}

Page 83: Aulas de Linguagem c

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

Page 84: Aulas de Linguagem c

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.

Page 85: Aulas de Linguagem c

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.

Page 86: Aulas de Linguagem c

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.

Page 87: Aulas de Linguagem c

Comandos Repetitivos

Em linguagem C:

do{

comando 1;comando 2;…comando n;

} while( condição de parada );

Page 88: Aulas de Linguagem c

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; }

Page 89: Aulas de Linguagem c

Comandos Repetitivos

Exercício:

Escreva um programa em linguagem C que imprime os100 primeiros números ímpares.

Page 90: Aulas de Linguagem c

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);}

Page 91: Aulas de Linguagem c

Comandos Repetitivos

Exercício:

Escreva um programa em linguagem C que imprime osn primeiros números ímpares.

Page 92: Aulas de Linguagem c

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);}

Page 93: Aulas de Linguagem c

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.

Page 94: Aulas de Linguagem c

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 );

Page 95: Aulas de Linguagem c

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.

Page 96: Aulas de Linguagem c

Comandos Repetitivos

Em linguagem C:

inicializaçãowhile( condição de parada );{

comando 1;comando 2;…comando n;atualização

}

Page 97: Aulas de Linguagem c

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 );

Page 98: Aulas de Linguagem c

Comandos Repetitivos

Problema:

Qual é o melhor ? do-while ou while ? Analise oproblema da soma dos números positivos.

Page 99: Aulas de Linguagem c

Comandos Repetitivos

Problema:

Reescreva o algoritmo para imprimir os n númerosímpares utilizando o comando while.

Page 100: Aulas de Linguagem c

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++;

}}

Page 101: Aulas de Linguagem c

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).

Page 102: Aulas de Linguagem c

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);

Page 103: Aulas de Linguagem c

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; }

Page 104: Aulas de Linguagem c

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);

}

Page 105: Aulas de Linguagem c

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

}

Page 106: Aulas de Linguagem c

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++;

}

}

Page 107: Aulas de Linguagem c

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);

Page 108: Aulas de Linguagem c

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;

}

Page 109: Aulas de Linguagem c

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.

Page 110: Aulas de Linguagem c

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.

Page 111: Aulas de Linguagem c

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);

}

Page 112: Aulas de Linguagem c

Exercícios

Exercício:

Diga qual será a saída do programa a seguir.

Page 113: Aulas de Linguagem c

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);

Page 114: Aulas de Linguagem c

Exercícios

Exercício:

Repita o exercício anterior mas considere que n valeagora:

a) 5b) 45c) 123

Page 115: Aulas de Linguagem c

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).

Page 116: Aulas de Linguagem c

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);

Page 117: Aulas de Linguagem c

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.

Page 118: Aulas de Linguagem c

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;

}

Page 119: Aulas de Linguagem c

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.

Page 120: Aulas de Linguagem c

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);

Page 121: Aulas de Linguagem c

Exercícios

Exercício:

Altere o programa anterior para que ele execute atéque o usuário digite um valor negativo.

Page 122: Aulas de Linguagem c

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);

}

Page 123: Aulas de Linguagem c

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.

Page 124: Aulas de Linguagem c

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.

Page 125: Aulas de Linguagem c

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.

Page 126: Aulas de Linguagem c

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);

}

Page 127: Aulas de Linguagem c

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

Page 128: Aulas de Linguagem c

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;

}

Page 129: Aulas de Linguagem c

Vetores

Problema:

Refaça o programa anterior para palavras ou frasescom 20, 30, e 50 caracteres.

Page 130: Aulas de Linguagem c

Vetores

Definição:

Um vetor é um tipo de dado utilizado para representaruma certa quantidade de variáveis do mesmo tipo.

Page 131: Aulas de Linguagem c

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).

Page 132: Aulas de Linguagem c

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;

Page 133: Aulas de Linguagem c

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”.

Page 134: Aulas de Linguagem c

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.

Page 135: Aulas de Linguagem c

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;

}

Page 136: Aulas de Linguagem c

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.

Page 137: Aulas de Linguagem c

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;

}

Page 138: Aulas de Linguagem c

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.

Page 139: Aulas de Linguagem c

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);

}

Page 140: Aulas de Linguagem c

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.

Page 141: Aulas de Linguagem c

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

Page 142: Aulas de Linguagem c

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]);

Page 143: Aulas de Linguagem c

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;

Page 144: Aulas de Linguagem c

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);

Page 145: Aulas de Linguagem c

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);

Page 146: Aulas de Linguagem c

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.

Page 147: Aulas de Linguagem c

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)!)

Page 148: Aulas de Linguagem c

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;

Page 149: Aulas de Linguagem c

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.

Page 150: Aulas de Linguagem c

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

Page 151: Aulas de Linguagem c

Procedimentos e Funções

Em C:

tipo NomeDaFuncao( lista_de_parâmetros ){

instruções;}

Lista de Parâmetros:

tipo identificador, tipo identificador …

Page 152: Aulas de Linguagem c

Procedimentos e Funções

Exemplo :

int SomaDoisNumeros(int A, int B){

return A + B;}

void ImprimeTexto(){

printf(“Ola Mundo”);}

Page 153: Aulas de Linguagem c

Procedimentos e Funções

Exemplo :

int main(){

int r;r = SomaDoisNumeros(30, 50);ImprimeTexto();return 0;

}

Page 154: Aulas de Linguagem c

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.

Page 155: Aulas de Linguagem c

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;}

Page 156: Aulas de Linguagem c

Procedimentos e Funções

Exercício:

Escreva um procedimento ou função que calcula ofatorial de um número inteiro.

Page 157: Aulas de Linguagem c

Procedimentos e Funções

Fatorial :

int Fatorial(int n){

int fat = 1;int i;for( i = n; i > 1; i-- )

fat *= i;

return fat;}

Page 158: Aulas de Linguagem c

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)!)

Page 159: Aulas de Linguagem c

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.

Page 160: Aulas de Linguagem c

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;

}

Page 161: Aulas de Linguagem c

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;

Page 162: Aulas de Linguagem c

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)!)

Page 163: Aulas de Linguagem c

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.

Page 164: Aulas de Linguagem c

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.

Page 165: Aulas de Linguagem c

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;

}

Page 166: Aulas de Linguagem c

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.

Page 167: Aulas de Linguagem c

Procedimentos e Funções

Solução:

void troca(int* A, int* B){

int aux;aux = *A;*A = *B;*B = aux;

}

Page 168: Aulas de Linguagem c

Procedimentos e Funções

Solução:

void SomaEmA(int* A, int B){

*A = *A + B;}

Page 169: Aulas de Linguagem c

Procedimentos e Funções

Solução:

void SomaProduto(int A, int B, int* soma, int* prod){

*soma = A + B;*prod = A * B;

}

Page 170: Aulas de Linguagem c

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.

Page 171: Aulas de Linguagem c

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]);}

Page 172: Aulas de Linguagem c

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.

Page 173: Aulas de Linguagem c

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);

}}

Page 174: Aulas de Linguagem c

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.

Page 175: Aulas de Linguagem c

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.

Page 176: Aulas de Linguagem c

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;

}

Page 177: Aulas de Linguagem c

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?

Page 178: Aulas de Linguagem c

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.

Page 179: Aulas de Linguagem c

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

Page 180: Aulas de Linguagem c

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;

Page 181: Aulas de Linguagem c

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?

Page 182: Aulas de Linguagem c

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.

Page 183: Aulas de Linguagem c

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;}

Page 184: Aulas de Linguagem c

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.

Page 185: Aulas de Linguagem c

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

Page 186: Aulas de Linguagem c

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++;

}}

Page 187: Aulas de Linguagem c

Procedimentos e Funções

Problema :

Como ordenar um vetor sem alterar os dados do vetororiginal V ?

Page 188: Aulas de Linguagem c

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.

Page 189: Aulas de Linguagem c

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

Page 190: Aulas de Linguagem c

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

Page 191: Aulas de Linguagem c

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++;}

}

Page 192: Aulas de Linguagem c

Procedimentos e Funções

Problema :

Como ordenar um vetor sem o uso de um vetor auxiliar(Ordenado) ?

Page 193: Aulas de Linguagem c

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.

Page 194: Aulas de Linguagem c

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;

Page 195: Aulas de Linguagem c

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] );}

}

Page 196: Aulas de Linguagem c

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.

Page 197: Aulas de Linguagem c

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.

Page 198: Aulas de Linguagem c

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.

Page 199: Aulas de Linguagem c

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.

Page 200: Aulas de Linguagem c

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.

Page 201: Aulas de Linguagem c

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++;

}

}

Page 202: Aulas de Linguagem c

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

Page 203: Aulas de Linguagem c

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;

Page 204: Aulas de Linguagem c

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] );

}

}

Page 205: Aulas de Linguagem c

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.

Page 206: Aulas de Linguagem c

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

Page 207: Aulas de Linguagem c

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

Page 208: Aulas de Linguagem c

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);}

}

}

Page 209: Aulas de Linguagem c

Cadeias de CaracteresProblema :

Escreva um programa em linguagem C que lê umapalavra da entrada e imprime o número de caracteresdesta palavra.

Page 210: Aulas de Linguagem c

Cadeias de CaracteresDúvida :

Quando parar de ler os caracteres da palavra?

Page 211: Aulas de Linguagem c

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”;

Page 212: Aulas de Linguagem c

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.

Page 213: Aulas de Linguagem c

Cadeias de CaracteresPergunta :

Qual o tamanho do menor vetor que devemos declarar para armazenar uma cadeia de caracteres com 10letras?

Page 214: Aulas de Linguagem c

Cadeias de CaracteresExercício :

Escreva um programa em linguagem C que lê umapalavra da entrada e imprime o número de caracteresdesta palavra.

Page 215: Aulas de Linguagem c

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;

}

Page 216: Aulas de Linguagem c

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

Page 217: Aulas de Linguagem c

Cadeias de CaracteresPergunta :

Qual o valor é retornado na chamada da seguintefunção:

strcmp(“Casa“, “carro”) == ?

Page 218: Aulas de Linguagem c

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);

Page 219: Aulas de Linguagem c

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");

Page 220: Aulas de Linguagem c

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

Page 221: Aulas de Linguagem c

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;}

Page 222: Aulas de Linguagem c

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.

Page 223: Aulas de Linguagem c

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

Page 224: Aulas de Linguagem c

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);

}}

}

Page 225: Aulas de Linguagem c

Exercícios

Exercício:

Diga qual será a saída do programa a seguir.

Page 226: Aulas de Linguagem c

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;

}

Page 227: Aulas de Linguagem c

Exercícios

Exercício:

E qual a saída deste programa?

Page 228: Aulas de Linguagem c

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;

}

Page 229: Aulas de Linguagem c

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.

Page 230: Aulas de Linguagem c

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;}

Page 231: Aulas de Linguagem c

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

Page 232: Aulas de Linguagem c

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);

Page 233: Aulas de Linguagem c

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;

}

Page 234: Aulas de Linguagem c

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);

Page 235: Aulas de Linguagem c

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--;

}}

Page 236: Aulas de Linguagem c

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.

Page 237: Aulas de Linguagem c

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;

};

Page 238: Aulas de Linguagem c

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;

}

Page 239: Aulas de Linguagem c

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;

Page 240: Aulas de Linguagem c

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);

}

Page 241: Aulas de Linguagem c

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;}

Page 242: Aulas de Linguagem c

RegistrosProblema :

E se os pontos estivessem no espaço? E se vocêprecisasse calcular a maior distância entre N pontos?

Page 243: Aulas de Linguagem c

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.

Page 244: Aulas de Linguagem c

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.

Page 245: Aulas de Linguagem c

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;

Page 246: Aulas de Linguagem c

RegistrosExercício :

Defina um tipo Registro chamado Ponto3D, quearmazene as coordenadas de um ponto no espaço.

Page 247: Aulas de Linguagem c

RegistrosSolução :

typedef struct Ponto3D{

float X;float Y;float Z;

};

Page 248: Aulas de Linguagem c

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);

}

Page 249: Aulas de Linguagem c

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);

}

Page 250: Aulas de Linguagem c

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.

Page 251: Aulas de Linguagem c

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;

}

Page 252: Aulas de Linguagem c

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

Page 253: Aulas de Linguagem c

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;

};

Page 254: Aulas de Linguagem c

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;

Page 255: Aulas de Linguagem c

ArquivosProblema :

Como manter persistentes os dados utilizadose/ou gerados por um programa de computador ?

Solução :

Armazenar os dados de entrada em arquivos.

Page 256: Aulas de Linguagem c

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.

Page 257: Aulas de Linguagem c

ArquivosExemplos :

Os dois trechos de arquivo abaixo possuem osmesmo dados :

• Arquivo Binário: Renato ÌÌÌÌÌ·áõ�A+ Ì• Arquivo Texto: Renato,32891319,A+

Page 258: Aulas de Linguagem c

ArquivosModos de abertura de Arquivo :

Existem 3 modos de se abrir um arquivo:

• Leitura • Escrita • Edição

Page 259: Aulas de Linguagem c

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);

Page 260: Aulas de Linguagem c

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.

Page 261: Aulas de Linguagem c

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.

Page 262: Aulas de Linguagem c

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.

Page 263: Aulas de Linguagem c

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

Page 264: Aulas de Linguagem c

Arquivos

fscanf(leitura, “%s”, texto);fprintf(escrita, “%s”, texto);

fclose(leitura);fclose(escrita);

return 0;}

Page 265: Aulas de Linguagem c

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”.

Page 266: Aulas de Linguagem c

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).

Page 267: Aulas de Linguagem c

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.

Page 268: Aulas de Linguagem c

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);

Page 269: Aulas de Linguagem c

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”.

Page 270: Aulas de Linguagem c

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.

Page 271: Aulas de Linguagem c

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

Page 272: Aulas de Linguagem c

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.

Page 273: Aulas de Linguagem c

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).

Page 274: Aulas de Linguagem c

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.

Page 275: Aulas de Linguagem c

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));

}

Page 276: Aulas de Linguagem c

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;

Page 277: Aulas de Linguagem c

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));

}

Page 278: Aulas de Linguagem c

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));

}

}

Page 279: Aulas de Linguagem c

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.

Page 280: Aulas de Linguagem c

RecursividadeSolução:

int Somatorio(int N){

int i, resp = 0;for( i = 1; i <= N; i++ )

resp += i;

return resp;}

Page 281: Aulas de Linguagem c

RecursividadeExercício :

Refaça o exercício anterior, mas desta vez não utilizenenhum tipo de laço (for, while, do while, etc...).

Page 282: Aulas de Linguagem c

RecursividadeSolução:

int Somatorio(int N){

if( N == 1 )return 1;

elsereturn (N + Somatorio(N – 1));

}

Page 283: Aulas de Linguagem c

RecursividadeDefinição :

“Uma função ou procedimento é dito recursivo ( ouapresenta recursividade ) se for definido em termos desi próprio.”

Page 284: Aulas de Linguagem c

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

Page 285: Aulas de Linguagem c

RecursividadeExemplo Numérico :

int Somatorio(int N){

if( N == 1 )return 1;

elsereturn (N + Somatorio(N – 1));

}

Page 286: Aulas de Linguagem c

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;

Page 287: Aulas de Linguagem c

RecursividadeExercício :

Escreva uma função recursiva que recebe comoparâmetro um inteiro N maior que zero e retorna ovalor do fatorial de N.

Page 288: Aulas de Linguagem c

RecursividadeSolução:

int Fatorial(int N){

if( N == 1 )return 1;

elsereturn (N * Fatorial(N – 1));

}

Page 289: Aulas de Linguagem c

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;

}

Page 290: Aulas de Linguagem c

RecursividadeSolução:

int Digitos(int N){

if( abs( N ) < 10 )return 1;

elsereturn (1 + Digitos(N / 10));

}

Page 291: Aulas de Linguagem c

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.

Page 292: Aulas de Linguagem c

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));

}}

Page 293: Aulas de Linguagem c

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.

Page 294: Aulas de Linguagem c

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

Page 295: Aulas de Linguagem c

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

Page 296: Aulas de Linguagem c

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;

}

Page 297: Aulas de Linguagem c

RecursividadeSolução:

int Fibonacci( int n ){

if ( n <= 1)return n;

elsereturn Fibonacci(n - 1) + Fibonacci(n - 2);

}

Page 298: Aulas de Linguagem c

RecursividadeProblema :

Para o problema anterior qual das duas soluções eramais eficiente?

Page 299: Aulas de Linguagem c

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.

Page 300: Aulas de Linguagem c

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;

Page 301: Aulas de Linguagem c

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;}

Page 302: Aulas de Linguagem c

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++];}

}

Page 303: Aulas de Linguagem c

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

Page 304: Aulas de Linguagem c

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 );

}}

Page 305: Aulas de Linguagem c

Recursividade

http://freeweb.supereva.com/nessunoforever/flash/hanoi/index.htm?p

Page 306: Aulas de Linguagem c

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?

Page 307: Aulas de Linguagem c

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.

Page 308: Aulas de Linguagem c

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.

Page 309: Aulas de Linguagem c

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.

Page 310: Aulas de Linguagem c

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 ...

Page 311: Aulas de Linguagem c

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.

Page 312: Aulas de Linguagem c

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.

Page 313: Aulas de Linguagem c

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;

Page 314: Aulas de Linguagem c

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.

Page 315: Aulas de Linguagem c

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;

Page 316: Aulas de Linguagem c

ExercíciosExercício:

Diga qual será a saída do programa a seguir.

Page 317: Aulas de Linguagem c

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;

}

Page 318: Aulas de Linguagem c

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).

Page 319: Aulas de Linguagem c

Exercíciosint Somatorio(int X, int Y) {

if( Y <= X )return X;

elsereturn Y + Somatorio(Y – 1);

}

Page 320: Aulas de Linguagem c

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

Page 321: Aulas de Linguagem c

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.

Page 322: Aulas de Linguagem c

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.