Académique Documents
Professionnel Documents
Culture Documents
• 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)
Introdução a Computação
Um computador é composto por:
Caixas com:
1 moeda 256 moedas
2 moedas 488 moedas
4 moedas
8 moedas
16 moedas
32 moedas
64 moedas
128 moedas
Introdução a Computação
http://freeweb.supereva.com/nessunoforever/flash/hanoi/index.htm?p
Introdução a Computação
Algoritmos:
• Computacionalmente:
Se a entrada é :
(8, 49, 12, 23)
o seu algoritmo deve produzir como saída:
(8, 12, 23, 49)
• 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.
x recebe m
y recebe n
Repita
r recebe x mod y
x recebe y
y recebe r
Até que r == 0
Imprime x
Introdução a Computação
Na linguagem C:
x = m;
y = n;
do {
r = x % y;
x = y;
y = r;
}while( r != 0 );
printf(“%d”, x);
Introdução a Computação
Para ver depois:
• Mais desafios:
http://www2.fundao.pro.br/pages/desafios.asp
• Torre de Hanoi:
http://freeweb.supereva.com/nessunoforever/flash/hanoi/index.htm?p
• Página da disciplina:
http://www.las.ic.unicamp.br/~chenca/mc102/mc102.html
Linguagem C
Características da Linguagem C:
/*MC102 – Lab 0x
Nome: Ra: */
Estruturas de um Programa
Inclusão de Arquivos:
#include<stdio.h>
int m = 76;
int x, y;
int x, y;
É a mesma coisa que
int x;
int y;
Estruturas de um Programa
Comandos:
y = n;
r = x % y;
printf(“12");
printf(“??????????????");
Entrada e Saída
String de Formato (printf):
printf("Olá ”);
printf("Mundo”);
Entrada e Saída
Caracteres especiais:
printf(“\n\t****\n\t*\n\t*\n\t*\n\t*\n\t****\n”);
Entrada e Saída
Onde está o erro?
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:
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:
1
Estruturas de um Programa Estruturas de um Programa
Função main: Declarações:
int main()
{…} int m = 76;
int x, y;
• Função principal do programa.
• Todo programa em C deve ter uma. • Informam ao compilador o nome e o tipo da
variável.
• O programa começa a ser executado na primeira
linha da main. • Desse modo é possível saber quanto de memória
será utilizada.
• O programa termina quando a última linha da
função main é executada. • Deve ser feita sempre no início de cada bloco ({).
• Terminam sempre com ‘;’
int x, y;
É a mesma coisa que
int x;
int y;
2
Entrada e Saída Entrada e Saída
String de Formato (printf): String de Formato (printf):
• Como imprimir o produto de 3 por 4 ? • Cadeia de caracteres que informam como será a
saída.
printf(“12"); • Pode conter variáveis.
• Variáveis são indicadas pelo caracter ‘%’
• Como imprimir o produto de 65487 por 236597 ? • Cada variável na string de formato é preenchida
por uma variável na lista de argumentos.
printf(“??????????????");
printf("O MDC entre %d e %d eh: %d\n", m, n, x);
3
Entrada e Saída Entrada e Saída
Caracteres especiais: Caracteres especiais:
4
Entrada e Saída Entrada e Saída
scanf: String de Formato (scanf):
printf(“Entre com o seu ra: ");
scanf(“%d", &x); • Cadeia de caracteres que informam como será a
entrada.
• Utilizado para receber informações do teclado. • Sempre contém variáveis.
• Recebe o valor digitado pelo usuário.
• Variáveis são indicadas pelo caracter ‘%’
• Ativada após a tecla “enter” ser pressionada.
• Estrutura similar ao printf. • Mesmo tipos de variáveis do printf.
• Composto por
– String de Formato
– Lista de Argumentos
• Depende da String de Formato. Alterar o programa MDC (lab01) para que o mesmo,
• Separados por ‘,’ . ao invés de calcular o MDC entre dois valores fixos,
• Sempre variáveis. solicite ao usuário que informe entre quais valores
• As variáveis devem ser precedidas por ‘&’. ele deseja calcular o MDC.
5
Entrada e Saída Entrada e Saída
/*MC102 - Primeiro Programa em C - Cálculo do MDC */ /*MC102 - Primeiro Programa em C - Cálculo do MDC */
#include<stdio.h> #include<stdio.h>
int main() int main()
{
{ int m;
int m = 76; int n;
int n = 42; int x, y, r;
int x, y, r; printf(“Entre com os valores desejados: ");
x = m; scanf("%d %d", &m, &n);
y = n;
do x = m;
y = n;
{ do
r = x % y; {
x = y; r = x % y;
y = r; x = y;
y = r;
}while( r != 0 ); }while( r != 0 );
printf("O MDC entre %d e %d eh: %d\n", m, n, x); printf("O MDC entre %d e %d eh: %d\n", m, n, x);
return 0; return 0;
} }
Entrada e Saída
Exercício:
6
Variáveis Tipos
Variáveis em C: Os Tipos Básicos de C são:
instante. • double
Ex.:
int i 76
= ;
char c ‘a’
= ;
float f 3.1415926536
= ;
Tipos Tipos
char : Tabela ASCII American Standard Code for Information Interchange
• 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 = ‘@’ ;
1
Tipos Tipos
int : float :
Tipos Variáveis
double : Declaração de Variáveis em C:
nome_tipo + lista_identificadorers + ;
• Também representam os números de ponto-
flutuante (com vírgula).
• Possuem tamanho de 8 bytes (64 bits). • nome_tipo: int, char, float, double…
• O primeiro bit indica o sinal, os 11 seguintes e • lista_identificadorers: conjunto de identificadores
expoente e os 52 restantes a mantissa. separados por ‘,’.
• Podem representar valores positivos entre
2E-308 e 2E+308. Ex.:
• Podem representar valores negativos entre
-2E+308 e -2E-308. i
int ;
2
Variáveis Variáveis
Identificadores: Palavras reservadas do C:
• São os rótulos (nomes) das variáveis. auto break case char const continue default do
• São compostos sempre por letras e dígitos. double else enum extern float for goto if
• Começam sempre com letra. int long register return short signed sizeof static
• O caracter ‘_’ (underline) também é considerado
letra. struct switch typedef union unsigned void volatile while
• Não podem coincidir com as palavras reservadas da
linguagem.
Certo Errado • Não podem ser usadas como identificadores
• São sempre grafadas em letras minúsculas.
x1 1x
nome_casa int
Variáveis Variáveis
Atribuição de Variáveis: Modificador unsigned:
• Pode ser feito na declaração ou através de um • Diz ao compilador que os valores daquele tipo são
comando. todos positivos.
• O primeiro bit passa a fazer parte da representação.
Ex.: • Muda o intervalo de representação.
• Aparece antes do nome do tipo.
i=0
int ;
i=0 ; Ex.:
3
Variáveis Variáveis
• unsigned char 0 até 255 Exercício:
• unsigned int 0 até (2E+32 - 1)
Escreva um programa em Linguagem C que imprima
Outros Modificadores: na tela os seguintes dados:
Variáveis
Exercício:
4
Constantes Constantes
Exemplo: Problema:
#include<stdio.h>
int main() E se notássemos que Pi precisa ter pelo menos 4
{
float raio, peri, area; casas decimais? Imagine que seu programa tem mais
de 1000 linhas e Pi aparece 326 vezes no código.
printf(“Entre com o raio :”);
scanf(“%f”, &raio) ;
• Variáveis ocupam espaço na memória.
area = 3.14 * raio * raio; • O valor de Pi não muda durante a execução do
peri = 2 * 3.14 * raio;
printf(“Perimetro = %.6f \n Area = %.6f \n", peri, area); programa
Constantes Constantes
Solução: Constantes Simbólicas:
#include<stdio.h>
# define + nome + valor
#define Pi 3.141593
int main() • Não possuem tipo.
{
float raio, peri, area; • São substituídas antes do código ser compilado.
• Não terminam com ‘;’
printf(“Entre com o raio :”);
scanf(“%f”, &raio) ; • Não utilizam o operador ‘=‘
area = Pi * raio * raio; • São precedidas por “# define“
peri = 2 * Pi * raio; • A regra para criação dos nomes é a mesma para
printf(“Perimetro = %.6f \n Area = %.6f \n", peri, area); criação de nomes de variáveis.
return 0;
}
1
Constantes Operadores
Exemplos: Operadores Aritméticos:
/ Divisão
% Resto
Operadores Operadores
Operadores Aritméticos: Operadores Aritméticos:
2
Divisão por Zero Operadores
A = 1, B = 1 Operadores Relacionais:
A=B
multiplica por A dos dois lados… Operador Finalidade
A = AB
2 > Maior que
subtrai B2 dos dois lados… < Menor que
A2 - B2 = AB - B2 Maior ou igual que
fatorando... >=
Operadores Operadores
Operadores Relacionais: Operadores Lógicos:
3 4 7
+ !=
3
Operadores Operadores
Operadores Lógicos: Operadores Unários:
! Negação
Ex.:
3 5 8 10
* > – && 3 4
+ != 7
3 5 8 10
* > – || 3 4
+ != 7
Operadores Operadores
Operadores Unários: Operadores Unários:
• + ou - : Indicam o sinal da variável ou constante.
Ex.: • Possuem precedência maior que qualquer outro
+ 3 == B
- operador.
• ++ ou -- : Incrementam ou decrementam de 1 o • Associatividade da esquerda para direita.
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
4
Operadores Operadores
Conversão de Tipos: Exercício:
• Numa expressão todos os operandos são Faça um programa que solicite ao usuário a nota de
convertidos para o mesmo tipo. suas 3 provas e imprima a média aritmética delas.
• Sempre convertidos para o tipo maior.
• Durante uma atribuição com tipos diferentes podem
aparecer aviso do compilador (WARNINGS).
Ex.:
intA = 3.141593;
floatB = A;
A = 5 / 2;
A = 4.0 / 2.0;
Operadores Operadores
Exercício: Exercício:
Repita o exercício anterior usando apenas duas Faça um programa que calcula a média de provas da
variáveis. disciplina MC102 (a fórmula está na ementa do curso),
utilize duas variáveis apenas.
5
Aula Passada
#include<stdio.h>
#define PESO1 0.3
#define PESO2 0.3
#define PESO3 0.4
int main()
{
float nota, media;
printf("\nEntre com a primeira nota: ");
scanf("%f", ¬a);
media = nota * PESO1;
printf("\nEntre com a segunda nota: ");
scanf("%f", ¬a);
media += nota * PESO2;
printf("\nEntre com a terceira nota: ");
scanf("%f", ¬a);
media += nota * PESO3;
printf("\nA media das notas eh: %f\n ", media);
return 0;
}
Comandos Condicionais
Problema:
if( expressão )
{
comando1;
comando2;
…
comandoN;
}
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:
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);
else
printf("\nO maior numeor eh: %d\n ", b);
return 0;
}
Comandos Condicionais
Comando else:
1
Comandos Condicionais Comandos Condicionais
Resposta: Comando if:
#include<stdio.h>
int main() • O bloco de comandos é executado apenas se a
{ expressão é verdadeira, ou seja, tem valor
int a, b;
printf("\nEntre com os numeros: "); diferente de zero.
scanf("%d%d", &a, &b); • Quando o bloco de comandos possui apenas um
if( a > b ) comando não é necessário o uso de { }.
{
printf("\nO maior numero eh: %d\n ", a); • Quando a expressão é falsa, a execução do
} programa passa para o comando seguinte ao
if( b >= a ) bloco de comandos.
{
printf("\nO maior numero eh: %d\n ", b);
}
return 0;
}
2
Comandos Condicionais Comandos Condicionais
Comando else: Exercício:
• Deve sempre estar precedido de um if. Escreva um programa que calcula a média final dos
• O bloco de comandos é executado apenas se a alunos de MC102 das turmas P e R. Solicite ao
expressão é falsa, ou seja, tem valor igual a zero. usuário apenas as notas de prova, considere que
• Quando o bloco de comandos possui apenas um todos os alunos entregaram todos os exercícios de
comando não é necessário o uso de { }. laboratório. Imprima como saída a media final do
• O else é opcional ( if pode ter ou não um else, aluno e uma mensagem dizendo se o aluno foi
mas todo else tem um if ).
aprovado ou está de exame.
3
Comandos Condicionais Comandos Condicionais
Problema: #include<stdio.h>
int main()
{
Faça um programa que imprime o maior entre 3 int a, b, c;
printf("\nEntre com os numeros: ");
números inteiros distintos. O programa deve realizar scanf("%d%d", &a, &b, &c);
apenas duas comparações. if( a > b )
{
if( a > c )
printf("\nO maior numero eh: %d\n ", a);
else
printf("\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;
}
4
Comandos Condicionais
Exercício:
5
UNIVERSIDADE FEDERAL DE OURO PRETO
INSTITUTO DE CIÊNCIAS EXATAS E BIOLÓGICAS
DEPARTAMENTO DE COMPUTAÇÃO
CIC107 – PROGRAMAÇÃO DE COMPUTADORES I
5ª Aula prática
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).
Observações:
1. estamos designando como incremento algo que, na verdade, pode ser um decremento, como no
exemplo 2 acima;
2. a instrução de incremento i=i+1 pode ser escrita como i++; também a instrução
i=i-1 pode ser escrita como i--;
3. a estrutura “for” é muito mais flexível do que apresentado aqui. Quem quiser conhecer todas as
possibilidades deve consultar um livro ou um tutorial;
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.
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
........
Decisão Múltipla Decisão Múltipla
Problema: Solução:
Agora seu programa deve dizer o nome do aluno caso switch( expressão )
ele esteja matriculado. {
1
Decisão Múltipla Decisão Múltipla
Definição: Solução:
case 042066 :
case 042417 :
…
case 044609 : printf("\nO aluno esta matriculado\n ");
break;
• A expressão deve ter valor numérico. Escreva um programa que a partir do RA imprime o
• Começa a executar o bloco de comandos a partir
nome do usuário, se ele estiver matriculado em
do case que for igual ao valor da expressão.
MC102, caso contrário o programa avisa que o usuário
• Só para de executar os comandos quando
encontra um break ou chega ao fim do switch. não está matriculado.
• break é opcional e vem sempre seguido de ; P.s.: Considere apenas os seguintes alunos:
• default é opcional e é executado quando nenhum
case for igual a expressão. Ana 042066
Camila 042417
Leo 044609
Outro Leo 044635
2
Decisão Múltipla
Exercício:
3
Comandos Repetitivos
Problema:
do
{
comando 1;
comando 2;
…
comando n;
int main()
{
int x, y, r, m = 76, n = 42;
x = m;
y = n;
do
{
r = x % y;
x = y;
y = r;
}while( r != 0 );
return 0;
}
Comandos Repetitivos
Exercício:
#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:
#include <stdio.h>
int main ()
{
int num = 1, cont = 1, n;
printf(“Entre com n ”);
scanf(“%d”, &n);
do
{
printf (“%d\t”, num);
num += 2;
cont++;
} while (cont <= n);
}
Comandos Repetitivos
Exercício:
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 :
inicialização
while( condição de parada );
{
comando 1;
comando 2;
…
comando n;
atualização
}
Comandos Repetitivos
Solução:
int n, soma = 0;
printf ( "Digite um numero positivo, ou negativo para sair: ");
scanf ( "%d" , &n );
while ( n >= 0 )
{
soma = soma + n;
printf ( "Digite um numero positivo, ou negativo para sair:" );
scanf ( "%d" , &n );
}
printf ( "A soma eh %d\n" , soma );
Comandos Repetitivos
Problema:
#include <stdio.h>
int main ()
{
int num = 1, cont = 0, n;
printf(“Entre com n ”);
scanf(“%d”, &n);
while (cont < n);
{
printf (“%d\t”, num);
num += 2;
cont++;
}
}
Comandos Repetitivos
Problema:
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);
Comandos Repetitivos Comandos Repetitivos
Problema: Comando do-while :
• Escreva um programa que imprime os 3 primeiros O comando do-while é uma instrução de repetição
números ímpares. onde a condição de parada é testada após a execução
do bloco de comandos. A execução continua até que a
• Escreva um programa que imprime os 100 condição de parada seja falsa.
primeiros números ímpares.
int main()
do {
{ int x, y, r, m = 76, n = 42;
x = m;
y = n;
comando 1;
comando 2; do
{
… r = x % y;
comando n; x = y;
y = r;
}while( r != 0 );
} while( condição de parada ); return 0;
}
1
Comandos Repetitivos Comandos Repetitivos
Exercício: Solução:
2
Comandos Repetitivos Comandos Repetitivos
Exercício: Solução:
if ( n >= 0 )
soma = soma + n;
}while ( n >= 0 ) ;
printf ( "A soma eh %d\n" , soma );
3
Comandos Repetitivos Comandos Repetitivos
Solução: Problema:
4
Comandos Repetitivos Comandos Repetitivos
Problema: Solução:
5
Comandos Repetitivos Comandos Repetitivos
Aula passada: Etapas do laço:
1
Comandos Repetitivos Comandos Repetitivos
Exemplo: Exercício:
int main()
{ Escreva um programa em linguagem C
int i; que imprime os
for( i = 0; i < 100; i++ )
{ n primeiros números ímpares utilizando o
printf(“%d”, 2 * i + 1); comando
} for.
return 0;
}
2
Comandos Repetitivos Comandos Repetitivos
Solução: Exercício:
int main()
{ Escreva um programa que imprime todos os números
int i, n; primos entre 2 e n, onde n é fornecido pelo usuário.
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
3
Comandos Repetitivos Comandos Repetitivos
Solução: Exercício:
if( i % j == 0 )
break;
}
if( j == i )
printf( "%d\t", i);
}
Comandos Repetitivos
Solução:
int n;
i j;
int ,
4
Exercícios
Exercício:
a) 5
b) 45
c) 123
Exercícios
Exercício:
pot = 1;
while( pot < n )
pot *= 2;
if( pot == n)
printf("%d eh potencia de 2.\n", n);
else
printf("%d NAO eh potencia de 2.\n", n);
Exercícios
Exercício:
while( n > 0 )
{
pot = 1;
while( pot < n )
pot *= 2;
if( pot == n)
printf("eh potencia de 2.\n");
else
printf("NAO eh potencia de 2.\n");
Vetores Vetores
Problema: Definição:
Refaça o programa anterior para palavras ou frases Um vetor é um tipo de dado utilizado para representar
com 20, 30, e 50 caracteres. uma certa quantidade de variáveis do mesmo tipo.
1
Vetores Vetores
Em Linguagem C: Exemplos :
Onde: float [ ];
pesos 100
Vetores Vetores
Importante: Exercício:
2
Vetores Vetores
Solução: Exercício:
Vetores Vetores
Solução: Exercício:
#define TAM 100
int main() Utilizando o código do programa anterior, escreva um
{
float notas[TAM]; novo programa que permite ao usuário consultar a
int ras[TAM], aux, indice = 0, total;
printf(“Entre com o RA (ou negativo para sair): ”); nota de um aluno digitando o seu RA, o programa
scanf(“%d”, &aux);
while(aux > 0) deve rodar até que o usuário digite um RA negativo.
{
ras[indice] = aux;
printf(“Entre com a nota: ”); Obs.: O trecho de código que lê os RA’s e as notas é o
scanf(“%f”, ¬as[indice]);
printf(“Entre com o RA (ou negativo para sair): ”); mesmo do programa anterior.
scanf(“%d”, &aux);
indice++;
}
return 0;
}
3
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);
}
4
Vetores
Exercício :
casa -- asac
lata -- 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:
Onde:
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:
Matrizes Matrizes
Problema: Definição:
Escreva um programa em linguagem C que lê os RA’s Uma matriz é uma generalização multidimensional de
e n notas de no máximo 100 alunos, onde n é definido um vetor, em outras palavras, uma matriz é um vetor
pelo usuário. O programa deve ler e armazenar um de vetores.
novo RA e as suas notas até que o usuário digite um
RA negativo.
1
Matrizes Matrizes
Em Linguagem C: Exemplos :
char texto[linhas][colunas];
Onde:
notas[0][0] = 1;
• tipo: é o tipo das variáveis que devem ser criadas. scanf(“%c”, &texto[6][0]);
Ex.: int, char, float, entre outros; notas[5][2] = notas[5][1] + 1;
• identificador: é o nome que será utilizado para
referenciar o conjunto de variáveis;
for(i = 0; i < N; i++)
• d1, d2 … dn: são o número de variáveis que serão
for(j = 0; j < M; j++)
criados em cada dimensão.
notas[i][j] = 5.0;
Matrizes Matrizes
Importante: Exemplo:
A
• Como nos vetores, o primeiro elemento de uma
matriz é o de índice 0 (zero). B
• No caso de matrizes bidimensionais, a primeira A B C C
dimensão representa a linha e a segunda a coluna. D
D E F
• Na memória do computador, matrizes são
armazenadas de forma linear como se fossem E
G H I
vetores. F
• Durante a compilação o compilador se encarrega G
de determinar qual o verdadeiro endereço dos
H
campos da matriz.
I
2
Matrizes Matrizes
Exercício: Solução:
float notas[TAM][TAM];
int ra[TAM], n, i, j;
Escreva um programa em linguagem C que lê os RA’s printf("Entre com o numero de notas: ");
scanf("%d", &n);
e n notas de no máximo 100 alunos, onde n é definido
for (i = 0; i < TAM; i++)
pelo usuário. O programa deve ler e armazenar um {
novo RA e as suas notas até que o usuário digite um printf("Entre com o RA (ou negativo para sair): ");
scanf("%d", &ra[i]);
RA negativo. if ( ra[i] < 0 )
break;
for (j = 0; j < n; j++)
{
printf("Entre com a nota %d: ", j + 1);
scanf("%f", ¬as[i][j]);
}
}
Matrizes Matrizes
Exercício: Solução:
int A[TAM][TAM], B[TAM][TAM], C[TAM][TAM], i, j, n, m;
printf("Entre com as dimensoes das matrizes ");
Escreva um programa em linguagem C que solicita ao scanf("%d%d", &n, &m);
printf("Entre com os elementos da primeira matriz:\n");
usuário duas matrizes A e B de dimensões n e m for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
(definidas pelo usuário) e imprime a matriz resultante scanf("%d", &A[i][j]);
C da soma de A e B. 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]);
3
Relembrando Relembrando
Memória do Computador : Memória do Computador :
Podemos entender a memória de um computador Quando criamos em nosso programa uma variável de
como um conjunto de células que armazenam um determinado tipo, o Sistema Operacional, ao
informações. Cada célula da memória possui um executar o nosso programa reserva uma posição de
endereço (número inteiro de 32 bits). memória. Mas ao invés de utilizarmos o endereço da
variável como referência, fazemos uso do
1024
identificador(nome) que atribuímos a variável.
1025
1026 1025
1027
int x = 10; x 10
1028 1027
1029 1028
1030
Ponteiros Ponteiros
Definição: Exemplos :
char *texto;
armazenam endereços de memória, possivelmente,
endereços de memória de outras variáveis.
float *peso;
double *media;
Em Linguagem C:
tipo *identificador ;
1
Ponteiros Ponteiros
Operadores de Ponteiros: Desenho para ficar mais fácil:
• &variável.
- é utilizado para obter o endereço de uma
…
2356
*apontado.
ptr ?
Ponteiros Ponteiros
Qual é a saída ? Qual é a saída ?
int x = 10;
int *ptr; int x[3] = {1, 2, 3};
int * ; p
ptr = &x;
*ptr = *ptr * x; p = x;
p[0] = p[1] = p[2];
printf(“%d”, *ptr);
printf(“%d”, x); printf("%d\n", p[1]);
printf(“%d”, ptr); printf("%d\n", x[1]);
printf("%d\n", p);
2
Ponteiros Ponteiros
Exercício: Desvio Padrão:
Ponteiros Ponteiros
Média : Variância :
media = 0; dif = 0;
for( i = 0; i < n; i++)
dif = sqrt(dif);
3
Procedimentos e Funções
A aula de MC está ficando muito chata por quê ?
a) O número de permutações Pn
b) O número de arranjos An,k
c) O número de combinações Cn,k
Onde:
Pn = n!
An,k = n! / (n - k)!
Cn,k = n! / (k! * (n – k)!)
Procedimentos e Funções
Problema:
fat = 1;
for( i = n; i > 1; i-- )
fat *= i;
Procedimentos e Funções
Definição :
Procedimento
Instrução
Instrução
Instrução
Instrução
Procedimentos e Funções
Em C:
Lista de Parâmetros:
void ImprimeTexto()
{
printf(“Ola Mundo”);
}
Procedimentos e Funções
Exemplo :
int main()
{
int r;
r = SomaDoisNumeros(30, 50);
ImprimeTexto();
return 0;
}
Procedimentos e Funções
Exercício:
return ret;
}
Procedimentos e Funções
Exercício:
int Fatorial(int n)
{
int fat = 1;
int i;
for( i = n; i > 1; i-- )
fat *= i;
return fat;
}
Procedimentos e Funções
Exercício:
a) O número de permutações Pn
b) O número de arranjos An,k
c) O número de combinações Cn,k
Onde:
Pn = n!
An,k = n! / (n - k)!
Cn,k = n! / (k! * (n – k)!)
Procedimentos e Funções Procedimentos e Funções
A aula de MC está ficando muito chata por quê ? Problema :
1. Eu não entendo mais nada do que o professor Escreva um programa em linguagem C que solicita
fala. dois valores (n, k) ao usuário e calcula:
2. Eu não consigo resolver os exercícios de
laboratório e os exemplos de aula. a) O número de permutações Pn
3. Não consigo enxergar para que servem as coisas b) O número de arranjos An,k
que eu aprendo. c) O número de combinações Cn,k
4. Os programas ficaram muito maiores e bem
mais difíceis. Onde:
5. Tem mais de uma semana que ninguém deixa um
recado para mim no meu Orkut. Pn = n!
6. Todas as anteriores. An,k = n! / (n - k)!
Cn,k = n! / (k! * (n – k)!)
1
Procedimentos e Funções Procedimentos e Funções
Desenho para ficar mais fácil : Em C:
Programa
Instrução
tipo NomeDaFuncao(
Procedimento lista_de_parâmetros )
{
Instrução
Instrução
Procedimento
Instrução instruções;
Instrução
}
Instrução
Instrução
Lista de Parâmetros:
Exemplo : Exemplo :
int main()
int SomaDoisNumeros(int A, int B) {
{ int r;
r = SomaDoisNumeros(30, 50);
return A + B; ImprimeTexto();
} return 0;
}
void ImprimeTexto()
{
printf(“Ola Mundo”);
2
Procedimentos e Funções Procedimentos e Funções
Exercício: Potência :
return ret;
}
int Fatorial(int n)
Escreva um procedimento ou função que calcula o
fatorial de um número inteiro.
{
int fat = 1;
int i;
for( i = n; i > 1; i-- )
fat *= i;
return fat;
3
Procedimentos e Funções
Exercício:
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)!)
4
Procedimentos e Funções
Problema 1:
Problema 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:
Exercício 2:
Exercício 3:
1 2 7 15 23 56 57 58 70 72 78
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
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 :
return menor;
}
Procedimentos e Funções
Algoritmo :
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
N = 9; M = 2;
3 20 78 15 56 23 28 6 19
58 2
Procedimentos e Funções
Ordenação por Seleção (Selection Sort) :
M = 0; i = 0; 2 15 1 3 6 23 57
M = 1; i = 1; 2 15 1 3 6 23 57
2 15
2 15
M = 2; i = 2; 2 15 1 3 6 23 57
2 15 1
2 1 15
1 2 15
Procedimentos e Funções
Ordenação por Inserção (Insertion Sort) :
M = 3; i = 3; 2 15 1 3 6 23 57
1 2 15 3
1 2 3 15
1 2 3 15
M = 4; i = 4; 2 15 1 3 6 23 57
1 2 3 15 6
1 2 3 6 15
1 2 3 6 15
Procedimentos e Funções
Solução :
void InsertionSort( int V[100], int N, int Ordenado[100])
{
int M = 0, i, j, k;
for (i = 0; i < N; i++)
{
Ordenado[M] = V[i]; k = M;
for (j = M - 1; j >= 0; j--)
if (Ordenado[k] < Ordenado[j] )
Troca(&Ordenado[k--], &Ordenado[j]);
else
break;
M++;
}
}
Procedimentos e Funções
Problema :
i = 0; 57 30 8 15 56 23 2
i = 1; 30 57 8 15 56 23 2
i = 2; 30 8 57 15 56 23 2
i = 3; 30 8 15 57 56 23 2
i = 4; 30 8 15 56 57 23 2
i = 5; 30 8 15 56 23 57 2
i = 6; 30 8 15 56 23 2 57
i = 0; 30 8 15 56 23 2 57
i = 1; 8 30 15 56 23 2 57
Procedimentos e Funções
Solução :
1
Procedimentos e Funções Procedimentos e Funções
Solução: Solução:
intaux; * A = *A + B;
aux = *A; }
*A = *B;
*B = aux;
void SomaProduto(int A, int B, int* soma, int* prod) Escreva um procedimento ou função em linguagem C
{
que recebe um vetor de números inteiros V de
* soma = A + B; tamanho 100, e um inteiro N, em seguida você deve
* prod = A * B;
imprimir os N primeiros valores do vetor.
}
2
Procedimentos e Funções Procedimentos e Funções
Solução: Exercício :
void LeVetor(int V[100], int* N) Escreva uma função em linguagem C que recebe um
{
vetor de números inteiros V de tamanho 100, um
intaux;
*N = 0; inteiro N que contém o número de posições
scanf(“%d”, &aux); preenchidas de V, e um número inteiro X. A sua
while (aux != -1) função deve retornar 1 se V contém o valor X e zero
{
caso contrário.
V[*N] = aux;
(*N)++;
scanf(“%d”, &aux);
}
3
Procedimentos e Funções Procedimentos e Funções
Algoritmo : Busca Linear:
return 0;
}
E se os vetores do exercício anterior estivessem • Marque os extremos direito (dir) e esquerdo (esq)
do vetor.
sempre ordenados? Seria necessário verificar todos os
• Compare o valor procurado com o valor central
elementos para determinar se X está em V? (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.
4
Procedimentos e Funções Procedimentos e Funções
Busca Binária : Busca Binária:
X = 3; esq = 0; dir = N – 1; meio = (esq + dir)/2; esq = 0; dir = N - 1; meio = (esq + dir) / 2;
esq meio dir
while (esq < dir)
{
1 2 7 15 23 56 57 58 70 72 78 if ( X == V[meio] )
break;
esq meio dir
else if ( X > V[meio] )
1 2 7 15 23 56 57 58 70 72 78 esq = meio + 1;
else
esq meio dir dir = meio - 1;
1 2 7 15 23 56 57 58 70 72 78 meio = (esq + dir) / 2;
}
esq meio dir
X == V[meio] )
if (
1 2 7 15 23 56 57 58 70 72 78 1;
return
return 0;
Não há como garantir que o usuário sempre digitará Escreva uma função em linguagem C que retorna a
um vetor ordenado. E agora? Como devemos fazer posição no vetor (não é o valor) do menor elemento. A
para que seja possível utilizar a busca binária sempre? função recebe como parâmetros um vetor V de 100
elementos e um inteiro N que indica o número de
elementos de V.
5
Procedimentos e Funções Procedimentos e Funções
Solução: Algoritmo :
int MenorElemento(int V[100], int N) • Remova o menor elemento do vetor (V) e insira na
{ primeira posição livre do vetor auxiliar (Ordenado).
i menor = 0;
int , • Repita este processo até acabarem os elementos
do vetor V.
for( = i 1; i < N; i++)
if( [ ] <V i V[maior])
menor = i;
return menor;
}
3 20 78 15 56 23 2 1 19 28 6
void SelectionSort(int V[100], int N, int Ordenado[100])
{
int M = 0 , i;
while( N > 0)
N = 10; M = 1; {
3 20 78 15 56 23 2 6 19 28
i = MenorElemento(V, N);
Ordenado[M] = V[i];
1
V[i] = V[N - 1];
N = 9; M = 2;
N--;
M++;
3 20 78 15 56 23 28 6 19
}
58 2 }
6
Procedimentos e Funções Procedimentos e Funções
Problema : Algoritmo :
Como ordenar um vetor sem alterar os dados do vetor • Percorra o vetor (V)
original 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.
M = 0; i = 0; 2 15 1 3 6 23 57
2 15 1 3 6 23 57
M = 3; i = 3;
2
1 2 15 3
M = 1; i = 1; 2 15 1 3 6 23 57 1 2 3 15
2 15 1 2 3 15
2 15
2 15 1 3 6 23 57
M = 4; i = 4;
M = 2; i = 2; 2 15 1 3 6 23 57
1 2 3 15 6
2 15 1
1 2 3 6 15
2 1 15
1 2 3 6 15
1 2 15
7
Procedimentos e Funções Procedimentos e Funções
Solução : Problema :
void InsertionSort( int V[100], int N, int Ordenado[100])
{
Como ordenar um vetor sem o uso de um vetor auxiliar
int M = 0 , i, j , k ;
(Ordenado) ?
for (i = 0; i < N; i++)
Ordenado[M] = V[i]; k = M;
for (j = M - 1; j >= 0; j--)
Troca(&Ordenado[k--], &Ordenado[j]);
else
break;
M++;
}
i = 0; 57 30 8 15 56 23 2
i = 0; 30 8 15 56 23 2 57
i = 1; 8 30 15 56 23 2 57
8
Procedimentos e Funções
Solução :
int j , i;
for ( i = 0; i < N - 1; i++ )
{
9
Cadeias de Caracteres Cadeias de Caracteres
Problema : Dúvida :
Escreva um programa em linguagem C que lê uma Quando parar de ler os caracteres da palavra?
palavra da entrada e imprime o número de caracteres
desta palavra.
Cadeias de caracteres (Strings) são seqüências de Par ler ou para imprimir na tela uma cadeia de
letras, números ou símbolos onde o último caracter é caracteres, utilizamos %s como parâmetro das
o caracter ‘\0’ (da mesma família do ‘\n’, ‘\t’ ... ). funções scanf e printf. Ex.:
1
Cadeias de Caracteres Cadeias de Caracteres
Pergunta : Exercício :
Qual o tamanho do menor vetor que devemos declarar Escreva um programa em linguagem C que lê uma
para armazenar uma cadeia de caracteres com 10 palavra da entrada e imprime o número de caracteres
letras? desta palavra.
int main()
{ cadeia de caracteres, sem contar o ‘\0’. Ex.:
char [ ];
vetor 100
strlen(“casa") == 4
int , ;
i n
n = ; 0
cadeias e retorna o resultado dessa comparação.
while( [ ++] != '\0')
vetor i
Ex.:
n ++; strcmp(“casa“, “carro”) == 1
printf("O numero de caracteres eh %d", );
n
strcmp(“casa“, “casa”) == 0
return ; 0
} strcmp(“carro”, “casa") == -1
2
Cadeias de Caracteres Cadeias de Caracteres
Pergunta : Funções Importantes (string.h):
Qual o valor é retornado na chamada da seguinte • strcmpi – Compara caracter a caracter duas
função: cadeias ignorando se as letras são maiúsculas ou
minúsculas, e retorna o resultado dessa
strcmp(“Casa“, “carro”) == ? 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);
• strcat – Concatena duas strings, a primeira string Escreva uma função em linguagem C que recebe uma
recebe o seu conteúdo seguido do conteúdo da cadeia de caracteres de tamanho máximo 100, e
segunda string. Ex.: retorna 1 se esta cadeia é uma palíndrome e zero
caso contrário.
strcpy(vetor, “uva + ”);
strcat(vetor, “banana + ”);
strcat(vetor, “pera"); P.s.: Uma palavra é dita ser palíndrome se a
seqüência de seus caracteres da esquerda para a
direita é igual a seqüência de seus caracteres da
direita para a esquerda. Ex.:
arara
3
Cadeias de Caracteres Cadeias de Caracteres
Solução : Exercício :
4
Cadeias de Caracteres
Problema :
char vetor[10];
printf(“Entre com seu nome: ”);
scanf(“%s”, vetor);
printf(“O seu nome eh: %s”, vetor);
#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):
strcmp(“Casa“, “carro”) == ?
Cadeias de Caracteres
Funções Importantes (string.h):
return soma;
}
Exercícios
Exercício:
a) 3
b) 25
c) 70
1 2 7 15 23 56 57 58 70 72 78
Exercícios
Exercício:
Escreva uma função em C que recebe as float MaiorDist(float X1, float Y1, float X2, float Y2,
coordenadas de 3 pontos no plano e retorna a maior float X3, float Y3)
distância entre eles. Utilize a função abaixo. {
float D1 = Distancia(X1, Y1, X2, Y2);
#include<math.h> float D2 = Distancia(X1, Y1, X3, Y3);
float Distancia(float X1, float Y1, float X2, float Y2) float D3 = Distancia(X3, Y3, X2, Y2);
{
float DX = (X2 – X1) * (X2 – X1); if ( D1 > D2 && D1 > D3 )
float DY = (Y2 – Y1) * (Y2 – Y1); return D1;
return sqrt(DX + DY); if ( D2 > D3 && D2 > D3 )
} return D2;
return D3;
}
Registros Registros
Problema : Definição :
E se os pontos estivessem no espaço? E se você Registros são tipos de variáveis definidos pelo
precisasse calcular a maior distância entre N pontos? programador que agrupam outros tipos de dados
numa só estrutura. Chamamos cada item de um
registro de membro.
1
Registros Registros
Em C : Como usar :
Registros Registros
Exercício : Solução :
float X;
float Y;
float Z;
};
2
Registros Registros
Exercício : Solução :
Reescreva a função Distancia abaixo utilizando o tipo float Distancia(Ponto3D P1, Ponto3D P2)
mesma calcule a distância entre dois pontos no float DX = (P2.X – P1.X) * (P2.X – P1.X);
float Distancia(float X1, float Y1, float X2, float Y2) return sqrt(DX + DY + DZ);
{ }
float DX = (X2 – X1) * (X2 – X1);
float DY = (Y2 – Y1) * (Y2 – Y1);
return sqrt(DX + DY);
}
Registros Registros
Exercício : Solução :
float MaiorDistancia(Ponto3D P, Ponto3D V[100], int N)
Escreva uma função em C que recebe um ponto no {
espaço P, um vetor de pontos no espaço V, e a int i;
quantidade de pontos no vetor N e retorna a maior float aux, maior = Distancia(P, V[0]);
distância entre P e qualquer ponto de V. Utilize as for( i = 1; i < N; i++)
estruturas e funções dos exercícios anteriores. {
aux = Distancia(P, V[i]);
if ( maior < aux )
maior = aux;
}
return maior;
}
3
Registros Registros
Exercício : Solução :
Registros
Detalhe :
Ponto3D P1;
Ponto3D *ptr;
ptr = &P1;
ptr->X = 0;
ptr->Y = 0;
4
Registros
Exercício :
#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 :
Ponto2D pontos[100];
pontos[0].X = 0;
Registros
Exercício :
• Código
• Nome
• Sobrenome
• Data nascimento
• Tipo sanguíneo
• Sexo
• Tipo de plano de saúde
Registros
Solução :
Ponto3D P1;
Ponto3D *ptr;
ptr = &P1;
ptr->X = 0;
ptr->Y = 0;
Arquivos
Problema :
Solução :
• Leitura
• Escrita
• Edição
Arquivos
Abrindo e fechando arquivos em C :
fclose(leitura);
fclose(escrita);
return 0;
}
Arquivos
Exercício :
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 :
Como manter persistentes os dados utilizados • Arquivos de Texto: Os dados são gravados
e/ou gerados por um programa de computador ? como caracteres de 8 bits. Ex.: Um número inteiro
de 32 bits com 8 dígitos ocupará 64 bits no
arquivo.
Solução :
Arquivos Arquivos
Exemplos : Modos de abertura de Arquivo :
1
Arquivos Arquivos
Abrindo e fechando arquivos em C : A função fopen:
Um arquivo em C é representado pelo tipo A função fopen recebe duas strings como
FILE*. parâmetros:
Quando queremos abrir um arquivo utilizamos
• Nome do Arquivo: Caminho relativo do
arquivo. Ex.: “lab11.c”,
a
função fopen e para fechá-lo usamos a
função fclose.
“c:/temp/lab1.c”
• Modo de abertura: Determina como o
Ex.: arquivo deve ser aberto, os principais são:
– “w” : Escrita, se o arquivo existir cria um
FILE* arquivo = fopen(“nome.txt”, “wb”); novo.
fclose(arquivo); “r” : Leitura, se o arquivo não existir dá
Arquivos Arquivos
A função fclose: Lendo e escrevendo em Arquivos Texto :
2
Arquivos Arquivos
Exemplo:
include<stdio.h>
int main() fscanf(leitura, “%s”, texto);
{ fprintf(escrita, “%s”, texto);
char texto[100];
if( leitura == 0 )
fclose(escrita);
if( escrita == 0 )
return 0;
} to be continued
Arquivos Arquivos
Exercício : Exercício :
3
Arquivos Arquivos
Lendo e escrevendo em Arquivos Binários : Exemplo:
int val;
Arquivos binários nos permitem ler e escrever
fread(&val, sizeof(int), 1, leitura);
estruturas ou mesmo vetores de estruturas de uma
fwrite(&val, sizeof(int), 1, escrita);
vez. Utilizamos as funções, fread e fwrite. Ambas
recebem os mesmos parâmetros: int vetor[100];
• Ponteiro: Um ponteiro para estrutura (ou vetor) fread(vetor, sizeof(int), 100, leitura);
Arquivos Arquivos
Exercício : Exercício :
4
Recursividade Recursividade
Exercício : Solução:
return resp;
}
Recursividade Recursividade
Exercício : Solução:
Refaça o exercício anterior, mas desta vez não utilize int Somatorio(int N)
nenhum tipo de laço (for, while, do while, etc...). {
if( N == 1 )
return 1;
else
1
Recursividade Recursividade
Definição : Recursão :
Dois tipos:
• Direta
• Indireta
Recursividade Recursividade
Exemplo Numérico : Exemplo Numérico :
{
N == 4
if( N == 1 ) N == 3
return 1; N == 2
else N == 1 return 1;
return ( N + Somatorio(N – 1)); return 2 + 1;
}
return 3 + 3;
return 4 + 6;
2
Recursividade Recursividade
Exercício : Solução:
Recursividade Recursividade
Exercício : Solução:
cont++;
}
return cont;
}
3
Recursividade Recursividade
Exercício : Solução:
Escreva uma função recursiva que recebe como float Potencia(float X, int N)
{
parâmetros um número real X e um inteiro N e retorna
o valor de XN.
if( N == 0 )
return1;
else
Obs.: N pode ser negativo.
{
if( N<0)
return 1 / (X * Potencia(X, abs(N) - 1));
else
4
Recursividade
Exercício :
int Somatorio(int N)
{
int i, resp = 0;
for( i = 1; i <= N; i++ )
resp += i;
return resp;
}
Recursividade
Exercício :
int Somatorio(int N)
{
if( N == 1 )
return 1;
else
return (N + Somatorio(N – 1));
}
Recursividade
Definição :
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
N == 3
N == 2
N == 1 return 1;
return 2 + 1;
return 3 + 3;
return 4 + 6;
Recursividade
Exercício :
int Fatorial(int N)
{
if( N == 1 )
return 1;
else
return (N * Fatorial(N – 1));
}
Recursividade
Exercício :
int Digitos(int N)
{
if( abs( N ) < 10 )
return 1;
else
return (1 + Digitos(N / 10));
}
Recursividade
Exercício :
{ if ( n <= 1)
int A = 0, B = 1, i, temp; return n;
if ( n <= 1 )
return n;
else
temp = B; B += A; A = temp;
}
return B;
}
Recursividade Recursividade
Problema : Quando não usar Recursão:
Para o problema anterior qual das duas soluções era • Repetição do processamento:
mais eficiente? Em geral, cada chamada recursiva é independente
uma da outra. Caso ocorram os mesmos cálculos para
duas chamadas recursivas independentes, esses
cálculos serão repetidos para cada chamada.
1
Recursividade Recursividade
Busca Binária: int BuscaBin(int vetor[100], int esq, int dir, int x)
esq = 0; dir = N - 1; meio = (esq + dir) / 2; {
break;
else if( x > vetor[ meio] )
else if ( X > V[meio] )
esq = meio + 1; return BuscaBin( vetor, meio + 1 , dir , x);
if (X == V[meio] ) return 1;
return 1; }
return 0;
Recursividade Recursividade
Intercalação: Ordenação por Intercalação (Merge Sort):
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++) 78 2 72 1 57 56 23 12
{
if(iA == nA )
C[i] = B[iB++]; 78 2 72 1 57 56 23 12
else if( iB == nB )
C[i] = A[iA++]; 78 2 72 1 57 56 23 12
else if( A[iA] < B[iB] )
C[i] = A[iA++];
else 78 2 72 1 57 56 23 12
C[i] = B[iB++];
}
2
Recursividade Recursividade
Merge Sort:
int meio;
if ( inicio < fim )
{
3
Recursividade
Exercício :
• Repetição do processamento:
Em geral, cada chamada recursiva é independente
uma da outra. Caso ocorram os mesmos cálculos para
duas chamadas recursivas independentes, esses
cálculos serão repetidos para cada chamada.
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++];
}
}
Recursividade
Ordenação por Intercalação (Merge Sort):
78 2 72 1 57 56 23 12
78 2 72 1 57 56 23 12
78 2 72 1 57 56 23 12
78 2 72 1 57 56 23 12
Recursividade
Merge Sort:
http://freeweb.supereva.com/nessunoforever/flash/hanoi/index.htm?p
Alocação Dinâmica
Problema :
Como evitar o desperdício de memória quando 1. Determinar o quanto de memória será necessário.
alocamos vetores? Como criar um vetor do tamanho 2. Solicitar ao sistema a quantidade necessária de
que será necessário ao usuário? Como devolver ao memória.
sistema regiões de memória que não são mais 3. Devolver ao sistema a região de memória após o
necessárias? Quem somos? De onde viemos? Para seu uso.
onde vamos?
1
Alocação Dinâmica Alocação Dinâmica
#include<stdlib.h> Exercício :
#include<stdio.h>
int main() Escreva um programa em linguagem C que solicita ao
{ usuário um vetor de notas (números reais) e imprime
int *vetor, n;
printf(“Entre com o tamanho do vetor: ”);
a média aritmética das notas.
scanf(“%d”, &n);
vetor = malloc(n * (sizeof(int))); P.s.: Apesar de não ser necessário utilize um vetor.
if( vetor == 0 ) P.s.: O programa não deve limitar o tamanho do vetor.
{ P.s.: Não deve ocorrer desperdício de memória.
printf(“Erro: Memoria insuficiente”); P.s.: Após ser utilizada a memória deve ser devolvida.
return -1;
}
else ...
Escreva um programa em linguagem C que solicita ao Escreva um programa em linguagem C que utiliza a
usuário o RA (inteiro) e a média final (real) de todos os estrutura abaixo para criar lista. Numa lista o campo
seus alunos e imprime todos os alunos que estão de prox recebe o endereço do próximo elemento da lista.
exame. Solicite ao usuário o número de elementos da lista e
crie a mesma preenchendo o campo val com a
P.s.: Utilize um vetor de registros (estruturas) para posição do elemento na lista. Depois imprima a lista.
armazenar os dados dos alunos. typedef struct Elemento
P.s.: O programa não deve limitar o número de {
alunos. int val;
P.s.: Não deve ocorrer desperdício de memória. struct Elemento* prox;
P.s.: Após ser utilizada a memória deve ser devolvida. }Elemento;
2
Exercícios
Exercício: