Buscar

VetoresIntroducao

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 84 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 84 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 84 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

VETORES
‹nº›
Exercício
Faca um programa capaz de corrigir uma prova de múltipla escolha. 
A prova terá 10 questões, valendo 1 ponto cada uma. 
Cada questão tem 5 alternativas numeradas de 1 a 5.
O programa deve inicialmente obter o gabarito da prova. 
	Ele será constituído de um conjunto de 10 números representando a alternativa correta de cada questão ( um número entre 1 e 5) 
Após a leitura do gabarito, o programa devera corrigir as provas dos alunos. 
	Portanto, para cada aluno da turma, captura sua matrícula e suas respostas (validando-as), calculando sua nota de acordo com o gabarito e exibindo-a.
A leitura termina com um código de matricula negativo.
‹nº›
2
‹nº›
Exemplo de prova
‹nº›
Exercício
Entradas								
Gabarito (10 números)
Aluno1: matricula, 10 respostas		 	
Aluno2: matricula , 10 respostas			
.....
Saídas
	
nota do aluno 1
nota do aluno 2
.....
‹nº›
4
‹nº›
Solução Geral
		Obtém gabarito
			Captura matrícula
			Calcula acertos(nota) de acordo c/o gabarito
			Exibe matrícula e nota
 
Matr ≠ 0
Calcula acertos de acordo com o gabarito: 	
	 		
					acertos = 0		
					Captura resposta da questão
					Se resposta da questão == gabarito da questão
				i		incrementa total de acertos 
			
10 x
‹nº›
5
‹nº›
Armazenando o gabarito
Como uma variável int só pode armazenar 1 resposta do gabarito, para armazená-lo serão necessárias 10 variáveis!!!!!
int main(void)
{
	int gab1, gab2,gab3,gab4gab5,gab6,gab7,gab8,gab8,gab10;
gab1
gab2
gab3
gab4
gab5
gab6
gab7
gab8
gab9
gab10
‹nº›
Exemplo
int main (void) {
	int gab1, gab2,gab3,gab4gab5,gab6,gab7,gab8,gab9,gab10,nota,matr; 
	scanf ( "%d", &gab1);
	scanf ( "%d", &gab2);
	scanf ( "%d", &gab3);
	scanf ( "%d", &gab4);
	scanf ( "%d", &gab5);
	scanf ( "%d", &gab6);
	scanf ( "%d", &gab7);
	scanf ( "%d", &gab8);
	scanf ( "%d", &gab9);
	scanf ( "%d", &gab10);
	
	printf( " Digite a matricula, ou 0 para terminar"; )scanf( " %d",&matr);
	while (matr !=0)
	{
		nota= corrige_prova(gab1, gab2,gab3,gab4gab5,gab6,gab7,gab8,gab9,gab10)
		printf(" %d - %d", matr, nota);
		printf( " Digite a matricula, ou 0 para terminar"; )scanf( " %d",&matr)
	}
5
3
4
2
3
2
4
2
1
1
gab1
gab2
gab3
gab4
gab5
gab6
gab7
gab8
gab9
gab10
Como cada resposta do gabarito está em uma variável, para corrigir a prova do aluno será necessário um if por questão.
Como cada resposta do gabarito está em uma variável é necessário ler cada resposta individualmente.
‹nº›
Questões para a Solução
Problema:
Para comparar as respostas de cada aluno com a alternativa correta do gabarito é necessário ter o gabarito disponível
Como?
Utilizando 10 variáveis distintas: gab1,gab2,....gab10?
NÃO!!!!!
Desejo: 1 variável que seja capaz de armazenar simultaneamente as 10 respostas do gabarito: (o conjunto de respostas)
Solução: 
um mecanismo que nos permita armazenar um conjunto de valores na memória do computador:vetor
5
3
4
2
3
2
4
2
1
1
										
gabarito
‹nº›
8
‹nº›
É uma variável capaz de armazenar diversos valores do mesmo tipo simultaneamente
Um vetor contém um número fixo de células idênticas
Cada célula armazena UM e APENAS UM dos valores do vetor
Exemplo:
Vetor
										
										
5
3
2
1
5
3
2
1
4
4
gabarito
‹nº›
9
‹nº›
Vetor
Problemas
Na declaração da variável
Quantos valores?
Tipo de cada valor?
No uso da variável
Como armazenar um valor em uma determinada posição?
Como acessar um determinado valor?
	
‹nº›
10
‹nº›
Declaração de Vetores
Precisamos especificar:
 o tipo dos valores que o vetor armazena (um vetor só pode armazenar um tipo de valor) e 
o tamanho do vetor.
tipo identificador[tamanho];
‹nº›
Declaração de Vetores
int v [5];
A declaração acima reserva um espaço na memória para 5 inteiros e o endereço desta área é armazenado no ponteiro constante v
v
Esse espaço de memória é acessado através de seu endereço armazenado no ponteiro constante v
‹nº›
Exemplos de Declaração
int a, b[20];
float c[10];
double d[30], e, f[5];
int v[4];
‹nº›
Exemplos de Declaração
int a, b[20];
float c[10];
double d[30], e, f[5];
int v[4];
Declara um inteiro e um vetor de inteiros de 20 posições
‹nº›
Exemplos de Declaração
int a, b[20];
float c[10];
double d[30], e, f[5];
int v[4];
Declara um vetor de variáveis de tipo float de 10 posições
‹nº›
Exemplos de Declaração
int a, b[20];
float c[10];
double d[30], e, f[5];
int v[4];
Declara um vetor de 30 posições, uma variável e outro vetor de 5 posições. Todas as variáveis são do tipo double.
‹nº›
Exemplos de Declaração
int a, b[20];
float c[10];
double d[30], e, f[5];
int v[4];
Representação de v
(int [])
v
???
(int)
???
(int)
???
(int)
???
(int)
‹nº›
17
‹nº›
Exemplo de Declaração com Inicialização
int v[4] ={17,42,23,34};
17
(int)
42
(int)
23
(int)
34
(int)
‹nº›
Vetor
Problemas No uso da variável
Como armazenar /acessar um valor em uma determinada posição?
DUAS FORMAS:
Pelo endereço
Por indexação
				
	
‹nº›
19
‹nº›
Vetor : acesso pelo endereço
	
v
v
17
42
23
34
‹nº›
20
‹nº›
Vetor : acesso pelo endereço: exibindo o 1º valor
printf( “%d”, *v); 
17
42
23
34
v
v
17
E os demais valores????
‹nº›
21
‹nº›
Vetor : acesso pelo endereço
Considerando que:
 v  é um tipo de "ponteiro constante", cujo valor não pode ser alterado e armazena o endereço do 1º elemento do vetor
 Os elementos de um vetor estão armazenados em áreas consecutivas na memória 
 O endereço resultante do incremento de um ponteiro reflete o tamanho do tipo referenciado. 
17
42
23
34
v
v
V+1
V+2
Tem-se que:
v+1 é o endereço da 2º elemento, 
 
o endereço do terceiro elemento é v+2 e assim sucessivamente
‹nº›
22
‹nº›
Vetor : acesso pelo endereço - Exibindo valores
17
42
23
34
v
v
int i;
for(i=0;i<4;i++)
{
	printf(“%d”, *(v+i));
}
‹nº›
23
‹nº›
Vetor : acesso pelo endereço - Exibindo valores
17
42
23
34
v
v
0
i
int i;
for(i=0;i<4;i++)
{
	printf(“%d”, ();
}
17
(v+i)
‹nº›
24
‹nº›
Vetor : acesso pelo endereço - Exibindo valores
17
42
23
34
v
v
1
i
int i;
for(i=0;i<4;i++)
{
	printf(“%d”, ();
}
42
*
(v+i)
‹nº›
25
‹nº›
Vetor : acesso pelo endereço - Exibindo valores
17
42
23
34
v
v
2
i
int i;
for(i=0;i<4;i++)
{
	printf(“%d”, ();
}
23
*
(v+i)
‹nº›
26
‹nº›
Vetor : acesso pelo endereço - Exibindo valores
17
42
23
34
v
v
3
i
int i;
for(i=0;i<4;i++)
{
	printf(“%d”, ();
}
34
*
(v+i)
‹nº›
27
‹nº›
Vetor : acesso pelo endereço - Exibindo valores
17
42
23
34
v
v
4
i
int i;
for(i=0; i<4 ;i++)
{
	 printf(“%d”, *(v+i));
}
‹nº›
28
‹nº›
Vetor : acesso pelo endereço - Alterando valores
17
42
23
34
v
v
*(v+2) = 99;
‹nº›
29
‹nº›
Vetor : acesso pelo endereço
Armazenando valor na 3ª posição
17
42
99
34
v
v
*(v+2) = 99;
‹nº›
30
‹nº›
Vetor : acesso pelo endereço
17
42
99
34
v
v
1
i
*(v+i) = 77;
Armazenando valor na i_ésima posição
‹nº›
31
‹nº›
Vetor : acesso pelo endereço
17
77
99
34
v
v
1
i
*(v+i) = 77;
Armazenando valor na i_ésima posição
‹nº›
32
‹nº›
Vetor
Problemas No uso da variável
Como armazenar /acessar um valor em uma determinada posição?
DUAS FORMAS:
Pelo endereço
Por indexação
				
	
‹nº›
33
‹nº›
Vetor : acesso por indexação
		
		Cada POSIÇÃO (célula) é identificada por um 	NÚMERO
					vetor [número da posição]v[4] = 3;
	
										
	0	1	2	3	4	5	6	7	8	9
										
					3					
v
‹nº›
34
‹nº›
Vetor : acesso por indexação - Exibindo valores
17
42
23
34
v
v
int i;
for(i=0;i<4;i++)
{
	printf(“%d”, v[i]);
}
	0	1	2	3
‹nº›
35
‹nº›
Vetor : acesso por indexação - Exibindo valores
17
42
23
34
v
v
0
i
int i;
for(i=0;i<4;i++)
{
	printf(“%d”, ();
}
17
V[i])
	0	1	2	3
‹nº›
36
‹nº›
Vetor : acesso por indexação - Exibindo valores
17
42
23
34
v
v
1
i
int i;
for(i=0;i<4;i++)
{
	printf(“%d”, ();
}
42
V[i]
	0	1	2	3
‹nº›
37
‹nº›
Vetor : acesso por indexação - Exibindo valores
17
42
23
34
v
v
2
i
int i;
for(i=0;i<4;i++)
{
	printf(“%d”, ();
}
23
V[i]
	0	1	2	3
‹nº›
38
‹nº›
Vetor : acesso por indexação - Exibindo valores
17
42
23
34
v
v
3
i
int i;
for(i=0;i<4;i++)
{
	printf(“%d”, ();
}
34
V[i]
	0	1	2	3
‹nº›
39
‹nº›
Vetor : acesso por indexação - Exibindo valores
17
42
23
34
v
v
4
i
int i;
for(i=0; i<4 ;i++)
{
	 printf(“%d”, v[i]);
}
	0	1	2	3
‹nº›
40
‹nº›
Vetor : acesso por indexação
17
42
23
34
v
v
V[2] = 99;
Armazenando valor na 3ª posição
‹nº›
41
‹nº›
Vetor : acesso por indexação
17
42
99
34
v
v
Armazenando valor na 3ª posição
‹nº›
42
‹nº›
Vetor : acesso por indexação
17
42
99
34
v
v
1
i
V[i] = 77;
Armazenando valor na i_ésima posição
‹nº›
43
‹nº›
Vetor : acesso por indexação
17
42
99
34
v
v
1
i
V[i] = 77;
Armazenando valor na i_ésima posição
77
‹nº›
44
‹nº›
Resumo Vetor
VETOR: Variável capaz de armazenar vários elementos simultaneamente
A variável é dividida em várias células (posições) identificadas por um nº (índice)
Cada valor fica armazenado em uma posição (célula)do vetor
As células podem ser acessadas por seu endereço ou pelo número de seu índice
EM C:
Na declaração da variável vetor é necessário determinar a quantidade de células (elementos) e o tipo de dado dos elementos
Um vetor de dimensão DIM os índices variam de 0 a DIM-1
	
										
	0	1	2	3	4	5	6	7	8	9
5
3
2
1
5
3
2
1
4
4
Vetor
‹nº›
45
‹nº›
Resumo Declaração e Inicialização
int a, b[20],c[10]; /* declara uma variável simples e dois vetores inteiros*/
float notas[6]; /* declara um vetor de reais*/
double d[30], e, f[5]; 	/* declara dois vetores e uma variável simples */
Declaração com inicialização:
	int v[5] = {12, 5, 34, 32, 9};
Inicialização com valores diferentes após a declaração:
	notas[0]=7.5;		notas[1]=9.9; 	notas[2]=8.7	;	notas[3]=3.2; notas[4]=9.8;		notas[5]=1.2;
Inicialização com mesmo valor após a declaração:
	for(i=0;i<10;i=i+1)
 	{
			v[i]=0;
 }
‹nº›
46
‹nº›
Voltando ao exercício - Declaração e Inicialização
int vgab[10]; 	// índices variam de 0 a 9
Esta declaração reserva um espaço de memória para armazenar 10 valores inteiros e este espaço de memória é referenciado pelo nome vgab. 
O identificador vgab armazena o endereço da área onde os dados são armazenados
Para acessar uma posição é necessário identificá-la por um número que varia de 0 a DIM-1
Inicialização de algumas posições do vetor gabarito:
* (vgab+0) = 5;
* (vgab+1)] = 3;
vgab[4]= 3;
vgab[9] = 4;
	5	3	?	?	3	?	?	?	?	4
	0	1	2	3	4	5	6	7	8	9
vgab
‹nº›
47
‹nº›
Voltando ao exercício
Faca um programa capaz de corrigir uma prova de múltipla escolha. 
A prova terá 10 questões, valendo 1 ponto cada uma. 
Cada questão tem 5 alternativas numeradas de 1 a 5.
O programa deve inicialmente obter o gabarito da prova. 
	Ele será constituído de um conjunto de 10 números representando a alternativa correta de cada questão ( um número entre 1 e 5) 
Após a leitura do gabarito, o programa devera corrigir as provas dos alunos. 
	Portanto, para cada aluno da turma, captura sua matrícula e suas respostas (validando-as), calculando sua nota de acordo com o gabarito e exibindo-a.
A leitura termina com um código de matricula negativo.
		Obtém gabarito
			Captura matrícula
			Calcula acertos(nota) de acordo c/o gabarito
			Exibe matrícula e nota
 
Matr ≠ 0
‹nº›
48
‹nº›
int main (void)
{	 
	 int vgab[10];
	scanf ( "%d", (vgab+0));
	scanf ( "%d", (vgab+1));
	scanf ( "%d", (vgab+2));
	scanf ( "%d", (vgab+3));
	scanf ( "%d", (vgab+4));
	scanf ( "%d", (vgab+5));
	scanf ( "%d", (vgab+6));
	scanf ( "%d", (vgab+7));
	scanf ( "%d", (vgab+8));
	scanf ( "%d", (vgab+9));
vgab
int main (void)
{	int gab1, gab2,gab3,gab4gab5;
	 int gab6,gab7,gab8,gab8,gab10; 
	scanf ( "%d", &gab1);
	scanf ( "%d", &gab2);
	scanf ( "%d", &gab3);
	scanf ( "%d", &gab4);
	scanf ( "%d", &gab5);
	scanf ( "%d", &gab6);
	scanf ( "%d", &gab7);
	scanf ( "%d", &gab8);
	scanf ( "%d", &gab9);
	scanf ( "%d", &gab10);
gab1
gab2
gab3
gab4
gab5
gab6
gab7
gab8
gab9
gab10
4
5
6
7
0
1
2
3
8
9
Voltando ao Exercício com vetor
ARGHH!!
‹nº›
int main (void)
{	 int vgab[10];
	scanf ( "%d", (vgab+0));
	scanf ( "%d", (vgab+1));
	scanf ( "%d", (vgab+2));
	scanf ( "%d", (vgab+3));
	scanf ( "%d", (vgab+4));
	scanf ( "%d", (vgab+5));
	scanf ( "%d", (vgab+6));
	scanf ( "%d", (vgab+7));
	scanf ( "%d", (vgab+8));
	scanf ( "%d", (vgab+9));
4
5
6
7
0
1
2
3
8
9
vgab
	for ( pos=0 ; pos < 10; pos ++)	
	{
			scanf ( "%d", (vgab + pos));
 }
	
	for ( pos=0 ; pos < 10; pos ++)	
	{
			scanf ( "%d", &vgab[pos]);
 }
	
‹nº›
Solução – Capturar Gabarito
#include <stdio.h>
int main (void)
{
 	int pos;
 	int vgab[10];
 
 	for (pos=0; pos<10; pos++) 
 	{
 	printf("Digite a resposta da questão %d", pos+1);
		scanf("%d", (vgab+pos));
 	}
		
	…….
	return 0;
Como garantir que o gabarito só contenha números que sejam respostas ( 1 a 5)?
Os valores digitados precisam ser validados!!!
‹nº›
51
‹nº›
Solução – Capturar Gabarito
int ler_resp_valida(int questao){
	int resp;
	printf( “\nQuestao %d - Digite a sua opcao de resposta (1 a 5): ”,questao );
	scanf( “%d”, &resp);
	while ( resp <1 || resp >5){
		printf( “\n\tOpcao invalida. Digite a sua opcao de resposta – 1 a 5”: )
		scanf( “%d”, &resp);
	}
	return resp;
}
int main (void){
 int pos, vgab[10];
 /* Obter gabarito */
 for (pos=0; pos<10; pos++){
 	 vgab[pos] = ler_resp_valida(pos+1);
 }
/* exibir as respostas armazenadas no gabarito */
/* Para cada aluno da turma */
	/* Corrigir a prova de um aluno */
 return 0;
}
‹nº›
52
‹nº›
Solução – Capturar Gabarito
int ler_resp_valida(int questao){
	int resp;
	printf( “\nQuestao %d - Digite a sua opcao de resposta (1 a 5): ”,questao );
	scanf( “%d”, &resp);
	while ( resp <1 || resp >5){
		printf( “\n\tOpcao invalida. Digite a sua opcao de resposta – 1 a 5”: )
		scanf( “%d”, &resp);
	}
	return resp;
}
int main (void){
 int pos, vgab[10];
 /* Obter gabarito */
 for (pos=0; pos<10; pos++){
 	 vgab[pos] = ler_resp_valida(pos+1);
 }
/* exibir as respostas armazenadas no gabarito */
 for (i=0; i<10; i++) {		
	printf("\n Questão %d – %d", i+1, *(vgab+i));
 } 
/* Para cada aluno da turma */
	/* Corrigir a prova de um aluno */
 return 0;
}
‹nº›
53
‹nº›
Solução – Calcular acertos
/* Para cada aluno da turma */
	printf("Digite a matr"); 		scanf("%d",&matr);
	while(matr>0)
	{	/* Corrigir a prova de um aluno */
		nota=0;
		for (questao=1; questao<=10; questao = questao + 1) 
 	{
		 	resp= ler_resp_valida(questao); 
			pos=questao -1;
			if (resp == gabarito[pos])
				nota=nota+1;
		}
	
		printf("\n Matr: %d – Nota %d",matr,nota);
		printf("Digite a matr");		scanf("%d",&matr);
	}
	return 0;
Função!!!
‹nº›
54
‹nº›
	printf("Digite a matr"); 	scanf("%d",&matr);while(matr>0)
	{	
		for (questao=1; questao<=10; questao = questao + 1){
		 	prova[questao-1]= ler_resp(questao);
		}
		nota=0;
		for (i=0; i<10; i++) 
		{
			printf("\nQuestao %d - %d", i+1, prova[i]);
			if (prova[i] == gabarito[i])
			{
				nota=nota+1;
				printf("\tCORRETA" );
			}
			else
				printf("\tINCORRETA" );
		}
		printf("\n Matr: %d – Nota %d",matr,nota);
		printf("Digite a matr");		scanf("%d",&matr);
	}
Armazenando as respostas do aluno em um vetor ( int provas[10]) para depois de capturadas, mostrar as questões válidas/ inválidas e a nota
‹nº›
55
‹nº›
Resolvendo com funções
		Obtém gabarito ( função carrega(...))
		Para cada aluno
			Capturar matrícula
			Calcular acertos(nota) de acordo c/o gabarito ( função calcula_acertos(...))
			Exibir matrícula e nota
Faca um programa capaz de corrigir uma prova de múltipla escolha. 
A prova terá 10 questões, valendo 1 ponto cada uma. 
Cada questão tem 5 alternativas numeradas de 1 a 5.
O programa deve inicialmente obter o gabarito da prova. Ele será constituído de um conjunto de 10 números representando a alternativa correta de cada questão ( um número entre 1 e 5) 
Após a leitura do gabarito, o programa devera corrigir as provas dos alunos. 
	Portanto, para cada aluno da turma, captura sua matrícula e suas respostas (validando-as), calculando sua nota de acordo com o gabarito e exibindo-a.
A leitura termina com um código de matricula negativo.
corrige_provas(...))
‹nº›
56
‹nº›
Vetor e Funções
#define MAXQ 5
int main(void)
{
	int 	gabarito[MAXQ];
	carrega(??????);
	corrige_provas(??????);
	return 0;
}
	?	?	?	?	?
	0	1	2	3	4
gabarito
‹nº›
Vetor e Funções
#define MAXQ 5
int main(void)
{
	int 	gabarito[MAXQ];
	carrega(gabarito);
	corrige_provas(gabarito);
	return 0;
}
	?	?	?	?	?
	0	1	2	3	4
gabarito
‹nº›
int main(void)
{
	int 	gabarito[MAXQ];
	carrega(gabarito);
	corrige_provas(gabarito);
	return 0;
}
void carrega ( ????????? )
{	int i;
	for (i=0; i<MAXQ; i++) 
	{
			printf("Questão%d",i+1);	
			gab[i]= ler_resp_valida(i+1));
		}
		return ;
}
void carrega( int gab[ ])
int * gab
	?	?	?	?	?
	0	1	2	3	4
gabarito
Vetor e Funções
‹nº›
59
‹nº›
void carrega ( int gab[ ] )
{	int i;
	for (i=0; i<MAXQ; i++) 
	{
			printf("Questão%d",i+1);	
			gab[i]= ler_resp_valida(i+1));
		}
		return ;
}
int main(void)
{
	int gabarito[MAXQ];
	carrega(gabarito);
	corrige_provas(gabarito);
	return 0;
}
	?	?	?	?	?
	0	1	2	3	4
gabarito
Vetor e Funções
gab
‹nº›
60
‹nº›
Corrigindo as Provas
int calcula_acertos(int gabarito[ ] ){	
	int nota,questao,pos,resp;
	nota=0;
	for (questao=1; questao<MAXQ; questao = questao + 1){
 		printf("Digite sua resposta da questão %d", questao);
			scanf("%d",&resp);
			pos=questao -1;
			if (resp == gabarito[pos]))
					nota=nota+1;
	}
	return nota;
}
void corrige_provas( int gabarito[ ]){	
	int matr,nota;
	scanf( "%d",&matr);
	while ( matr>0){											nota=calcula_acertos(gabarito);
		printf("%d - %d",matr,nota);
		scanf("%d",&matr);
	}
	return ;
}
‹nº›
Solução do exercício de correção automática com funções
int calcula_acertos(int gabarito[])
{	int nota,questao,pos,resp;
	nota=0;
	for (questao=1; questao<=MAXQ; questao ++) 
 	{
			printf("Questão%d",questao);								scanf("%d",&resp);
			pos=questao -1;
			if (resp == gabarito[pos])
				nota=nota+1;
	}
	return nota;
}
void corrige_provas( int gab[ ])
{	int matr,nota;
	scanf( "%d",&matr);
	while ( matr>0)
	{	
			nota=calcula_acertos(gab);
			printf("%d - %d",matr,nota);
			scanf("%d",&matr);
	}
	return ;
}
void carrega ( int gab [ ] )
{	int i;
	for (i=0; i<MAXQ; i++) 
	{
			printf("Questão%d",i+1);								scanf("%d", (gab+i));
		}
		return ;
}
int main(void)
{	
	int gabarito[MAXQ];		
	carrega(gabarito) 	
	corrige_provas(gabarito);
	return 0;
}
			
‹nº›
Vetores Passados para Funções
Representação de vetores na memória:
vetor é alocado em posições contíguas de memória
Exemplo: int v[10];
v = vetor de inteiros com 10 elementos
espaço de memória de v = 
10 x valores inteiros de 4 bytes = 
40 bytes 
Nome do vetor armazena o endereço inicial
da área, isto é, onde na memória está o primeiro valor do vetor		v armazena 104
‹nº›
63
63
‹nº›
Vetores Passados para Funções
Exemplo:
int main(void){
	int v[10]={12,23,34,45,56,67,78,89,90,14};
	exibir_vetor(v,10);
	return 0;
}
Passagem de vetor para função:
consiste em passar o endereço da primeira posição do vetor
"passar um vetor para uma função" é equivalente a
"passar o endereço inicial do vetor"
elementos do vetor não são copiados para a função
argumento copiado é apenas o endereço do primeiro elemento 
a função chamada recebe uma referência para o vetor , ou seja, a função chamada, 
	 quando acessa os elementos, acessa as mesmas posições de memória que a função
	 que declarou vetor.
			
			
			
			
		14	144
		90	
		89	
		78	
		67	
		56	
		45	
		34	
		23	
	v	12	104
‹nº›
64
‹nº›
Vetores Passados para Funções
CONSEQUÊNCIAS:
se atribuirmos um valor a um elemento do vetor passado como parâmetro, este elemento também é alterado no vetor original.
Uma função auxiliar pode ser chamada para acessar e/ou modificar os elementos de um vetor de outra função. 
A referência do vetor passada para a função indica apenas o início do espaço de memória a partir do qual os elementos estão armazenados.
Para a função chamada, a dimensão do vetor original é indiferente – a função sempre recebe apenas uma referência para o início da área de memória. 
Como tratar o problema da quantidade de elementos?
Receber como parâmetro, também, o número de elementos do vetor.
‹nº›
65
‹nº›
Exercício
Faça um programa que capture valores de dois vetores de reais de 4 elementos e mostre o produto interno dos dois vetores.
Exemplo:
X = (1,2,3,4)	Y = (4,3,2,1)		X.Y = 1*4 + 2*3 + 3*2 + 4*1 = 20
‹nº›
Possível Solução
# define TAM 4
int main(void)
{
	int X[TAM] , Y[TAM], i , prodint;
	for(i=0;i<TAM;i=i+1)
	{
		printf("Valor:"); scanf("%d",&X[i]);
	}
	for(i=0;i<TAM;i=i+1)
	{
		printf("Valor:"); scanf("%d", &Y[i]);
	}
	prodint=0;
	for(i=0;i<TAM;i++)
		prodint= prodint + X[i]*Y[i];
	printf( "\n Produto interno destes vetores: %d", prodint);
	return 0;
}
			
			
	prodint	?	
	i	?	
	Y	120	
	X	104	
	3	?	
	2	?	
	1	?	
	 0 	?	120
	3	?	
	2	?	
	1	?	
	0	?	104
			
			
	prodint	?	
	i		
	Y	120	144
	X	104	
	3	1	
	2	2	
	1	3	
	 0 	4	120
	3	4	
	2	3	
	1	2	
	0	1	104
20
‹nº›
Possível Solução com função
#define TAM 4
int main(void)
{	int X[TAM],y[TAM], prodint;
	int i;
	for(i=0;i<TAM;i=i+1)
	{
		printf("Valor:"); scanf("%d", &X[i]);
	}
	for(i=0;i<TAM;i=i+1)
	{
		printf("Valor:"); scanf("%d",&Y[i]);
	}
	prodint=0;
	for(i=0;i<TAM;i=i+1)
	{
		prodint= prodint + X[i] * Y[i];
	}
	printf( "\n Produto interno destes vetores: %d", prodint);
	return 0;
}
FUNÇÃO 
PARA 
PREENCHER
 VETOR
Recebe o vetor sem valores ("vazio" ) 
Preenche as posições com os valores capturados
devolve o vetor com valores
‹nº›
68
‹nº›
Vetores Passados para Funções
# define TAM 4
void preencher_vetor( ???????? )
{
	int i;
	for( i=0; i < TAM ; i=i+1)
	{
		scanf( "%d", v+i );
	}
	return;
}
int main(void){
	int X[TAM],Y[TAM];
	preencher_vetor(X);
	return 0;
}
			
			
			
			
			
			
			
		?	
		?	
		?	120
		?	
		?	
		?	
		?	104
int * v
void preencher_vetor( int v[ ])
			
			
			
			
		?	
		?	
		?	
		?	
		?	
		?	120
		4	
		3	
		2	
		1	104
v
X
Y
104
120
Preencher o vetor Y
‹nº›
69
‹nº›
Vetores Passados para Funções
# define TAM 4
void preencher_vetor( int v[] )
{
	int i;
	for( i=0; i < TAM ; i=i+1)
	{
		scanf( "%d", v+i);
	}
	return;
}
int main(void){
	int X[TAM],Y[TAM];
	preencher_vetor(X);
	preencher_vetor(Y);
	.......
	return 0;
}
			
			
			
			
			
			
			
		?	
		?	
		?	120
		?	
		?	
		?	
		?	104
Preencher o vetor Y
			
			
			
			
		?	
		?	
		?	
		?	
		?	
		?	120
		4	
		3	
		2	
		1	104v
X
Y
104
120
v
1
2
3
4
‹nº›
70
‹nº›
#define TAM 4
void preenche_vetor(int v[ ])
{	int i;
	for( i=0; i<TAM ; i=i+1)	{
		printf("Valor:"); scanf("%d", v+i);
	}
}
int main(void)
{
	int X[TAM],y[TAM], prodint;
	int i;
	preenche_vetor( X);
	preenche_vetor( Y);
	prodint=0;
	for(i=0;i<TAM;i=i+1) {
		prodint= prodint + X[i]*Y[i];
	}
	printf( "\n Produto interno destes vetores: %d", prodint);
	return 0;
}
Faça uma função que calcule o produto interno bruto:
Recebe os vetores, e 
retorna o valor do produto interno
Solução com função
‹nº›
Solução com função
#define TAM 4					
void preenche_vetor(int v[ ])
{	int i;
	for( i=0; i<TAM ; i=i+1)
	{
		printf("Valor:"); 		scanf("%d", &v[i]);
	}
	return;
}
int produto_interno( int x[], int y[])
{	int i;
	int 	prodint=0;
	for(i=0;i<TAM;i=i+1) {
		prodint= prodint + X[i]*Y[i];
	}
	return prodint;
}
int main(void)
{	int X[TAM],y[TAM], prodint;
	preenche_vetor( X);
	preenche_vetor( Y);
	printf("\nProduto interno destes vetores:
				 %d", produto_interno(X,Y));
	return 0;
}
‹nº›
‹nº›
Vetores Passados para Funções
# define TAM 10
void preencher_vetor( int v[])
{
	int i;
	for( i=0; i < TAM ; i=i+1)
	{
		scanf( "%d", v+i);
	}
	return;
}
int main(void){
	int X[TAM],Y[TAM];
	preencher_vetor(X);
	return 0;
}
			
			
			
			
			
			
			
		?	
		?	
		?	120
		?	
		?	
		?	
		?	104
		?	
		?	
		?	
		?	
		?	
		?	
		?	
		?	
		?	
		?	
		?	
		?	
		?	
		?	104
v
X
104
Y
144
Como tratar o problema da quantidade de elementos?
Como a função "sabe" onde o vetor "termina"?
‹nº›
74
‹nº›
Vetores Passados para Funções
Como tratar o problema da quantidade de elementos?
Como a função "sabe" quando o vetor "terminou"?
SOLUÇÃO:
A função chamada deve receber também o número de elementos do vetor como parâmetro:
		
	void preencher_vetor(int n, int v[ ])
		
‹nº›
75
‹nº›
Vetores Passados para Funções
# define TAM 10
void preencher_vetor(int n , int v[])
{	
	int i;
	for( i=0; i < n; i++)
	{
		scanf( "%d", v+i);
	}
	return;
}
int main(void)
{
	int X[TAM],Y[TAM];
	preencher_vetor(TAM, X);
	exibe_vetor (TAM, X);
}
			
			
			
			144
		?	
		?	
		?	
		?	
		?	
		?	
		?	
		?	
		?	
	vet	?	104
v
n
10
E SE SÃO NO MÁXIMO 10 ELEMENTOS????
‹nº›
76
‹nº›
Vetores Passados para Funções
			
			
			
			144
		?	
		?	
		?	
		?	
		67	
		56	
		45	
		34	
		23	
	X	12	104
X
NO MÁXIMO 10 ELEMENTOS????
QUANTOS???? 
Não necessariamente TAM 
Depende da quantidade
 de elementos preenchidos pela função anterior
int main(void)
{ 	 
	preencher_vetor( TAM, X);
	exibir_vetor (?????, X);
}
‹nº›
77
‹nº›
Vetores Passados para Funções
int preencher_vetor( int n, int v[ ])
{	int i, num;
	printf(" Qual o número?");
	scanf( "%d", &num)
	while( i < n && num !=0)
	{
		*(v+i)=num;
		printf(" Qual o número?");
		scanf( arq,"%d", &num)
		i++;
	}
	return i;
}
			
			
			
			144
		?	
		?	
		?	
		?	
		67	
		56	
		45	
		34	
		23	
	X	12	104
v
n
10
NO MÁXIMO 10 ELEMENTOS!!!
 	qt = preencher_vetor( TAM, X);
	exibir_vetor (qt, X);
qt
6
‹nº›
78
‹nº›
Exercício
Uma disciplina possui 10 provas com pesos distintos. Faça uma programa que capture o peso de cada uma das 10 provas. A seguir, para cada um dos alunos, capture sua matrícula, o número da prova (NÃO NECESSARIAMENTE EM ORDEM!!!!) e a nota de cada das 10 avaliações, mostrando a média ponderada de suas notas
Ex: Pesos:
Aluno 1: prova: 3 	5.0 	 5.0 * 1
				4	1.0	 1.0 * 4
				2 	10.0	  10.0 * 3
				1 	10.0	 ...
				6 	8.0	
				7 	7.0	
				9 	1.0	
				10 	3.0	
				5 	 4.0
				8	10.0
	2	3	1	4	4	2	6	4	4	5
‹nº›
Exercício
Uma disciplina possui NO MÁXIMO 10 provas com pesos distintos. Faça uma programa que capture o peso de cada uma das 10 provas. A seguir, para cada um dos alunos, capture sua matrícula, o número da prova (NÃO NECESSARIAMENTE EM ORDEM!!!!) e a nota de cada das 10 avaliações, mostrando a média ponderada de suas notas
Ex: Pesos:
Aluno 1: prova: 3 	5.0 	 5.0 * 1
				4	1.0	 1.0 * 4
				2 	10.0	  10.0 * 3
				1 	10.0	 ...
				6 	8.0	
				7 	7.0	
				9 	1.0	
				10 	3.0	
				5 	 4.0
				8	10.0
	2	3	1	4	4	2	6	4	4	5
‹nº›
int preenche_vetor(int k, float vpesos[ ], float*tot)
{	int i; float p; 
	*tot = 0;
	printf("\nPeso: "); scanf("%f",&p]);
	while(i<k && p>0)
	{		vpesos[i]=p;
			*tot= *tot+vpesos[i];
			printf("\nPeso: ");scanf("%f",&p);
	}
	return i;
}
float processa_aluno(float v[],int n, float soma){
	float med=0,nota;		int i,npr;
	for(i=0;i<n;i++)
	{		printf( "Nº da prova? ");
			scanf( "%d",&npr);
			printf( "Nota da prova %d? ",npr);
			scanf( "%f",&nota);
			med= med + nota*v[npr-1];
	}
	return med/soma;}
int main(void)
{
	float vpesos[ TAM ],totpeso,media;
	int i,matr,n;
	n = preenche_vetor( TAM, vpesos,&tot_peso);
	printf("\n Matricula?");
	scanf("%d",&matr);
	while(matr!=0)
	{	 					
media=processa_aluno(vpesos, n, totpeso);
		 printf( "\nAluno %d - Media %f", 								matr,media);
printf("\n Matricula?");
scanf("%d",&matr);
	}
	return 0;
}
# define TAM 10
‹nº›
	Jan	Fev	Mar	Abr	Mai	Jun	Jul	Ago	Set	Out	Nov	Dez
	0.1	0.1	0.1	0.2	0.2	0.2	0.3	0.2	0.3	0.2	0.1	0.3
Exercício
Valor aplicado: 100,00 
Mês Aplicação: 11 
100,00 *1.1  110,00 * 1.3  143,00
Faça um programa que capture o índice de reajuste de cada mês do ano anterior de uma caderneta de poupança do arquivo TAXAS.txt. 
A seguir, para cada investidor, capture o número da conta, o valor aplicado e o mês em que aplicou, mostrando quanto possui no final do ano. 
Lembre-se que o montante aplicado no segundo mês é equivalente ao montante inicial acrescido do reajuste do primeiro mês. A entrada de dados é finalizada quando for digitado o valor 0 como o número de conta.
Exemplo: Reajustes 
‹nº›
Exercício
Dada uma seqüência de 14556 números, exibir a soma dos números "simétricos em posição" isto é, 0 1º c/ último, 2º com penúltimo, 3º c/antepenúltimo, etc.. 
 
‹nº›
Exercício
Faça um programa que leia o dia e mês de um evento e o dia e mês atual, mostrando quantos dias faltam para o evento ocorrer.
Exemplo: 
Quando o evento não é no mês corrente:
atual:19 04 evento: 25 08
Meses completos: 07, 06, 05
Meses incompletos: 04 ( 30 – 19 dias)  11 dias
Meses incompletos: 08  25 dias
Quando o evento é no mês corrente:
atual:19 04 evento: 25 04
Meses incompletos: 04 ( 30 – 19 dias)  11 dias
DICA p/Solução:
Crie um vetor meses, com 12 posições e inicialize-o com os dias em cada mês:
		  int meses[12] = {31,28,31,30,31,30,31,31,30,31,30,31}
‹nº›
1)
Um copo cilíndrico
 
com 4 cm de raio e 12 
cm de altura, está com água até a altura de
 
8 cm. Foram, então, colo
cadas em seu 
interior n bolas de gude, e o nível da água 
atingiu a boca do copo, sem 
derramamento.
 
Qual é o volume, em cm
3
, de todas as n 
bolas de gude juntas?
 
1)
 
32
π
 
2)
 
48
π
 
3)
 
64
π
 
4)
 
80
π
 
5)
 
96
π
 
 
2)
Uma lata de leite em pσ, em forma de 
um cilindro reto, possui 8 cm de altura com 
3 cm de
raio na base.
Uma outra lata de 
l
eite, de mesma altura e cujo raio ι o 
dobro da primeira lata, possui um volume
 
1)
 
duas vezes maior.
 
2)
 
trκs vezes maior.
 
3)
 
quatro vezes maior.
 
4)
 
sete vezes maior.
 
5)
 
oito vezes maior.
 
 
3)
Duas pessoas, partindo de um mesmo 
local, caminham em direηυes ortogonais. 
Uma pessoa caminhou 12 metros para o 
sul, a outra, 5 metros para o leste.
Qual a 
distβncia que separa essas duas pessoas?
 
1)
 
7 m.
 
2)
 
13 m.
 
3)
 
17 m.
 
4)
 
60 m.
 
5)
 
119 m.
 
4) 
Um pintor dispυe de 6 cores diferentes 
de tinta para pintar uma casa e precisa 
escolher uma cor para o interior e outra 
diferente para o exterior, sem fazer 
n
enhuma mistura de tintas.
De quantas 
maneiras diferentes essa casa pode ser 
pintada usando
-
se apenas as 6 cores de 
tinta que ele possui?
 
1)
 
6
 
2)
 
15
 
3)
 
20
 
4)
 
30
 
5)
 
60
 
 
5) 
Ao passar sua mγo direita por todos os 
vιrtices e arestas de um poliedro, somenteuma vez, um deficiente visual percebe que 
passou por 8 vιrtices e 12 arestas.
Conclui
-
se que o nϊmero de faces desse 
poliedro ι 
igual a
 
1)
 
20.
 
2)
 
12.
 
3)
 
8.
 
4)
 
6.
 
5)
 
4.
 
 
6)
Um cientista descobriu que o movimento 
de uma partícula no espaço segue uma 
trajetória descrita pelo polinômio P(x)
 
= 5x
2
 
+ 5x 
–
 
30 .
 
Este polinômio pode ser 
fatorado na seguinte forma
 
1)
 
5(x 
–
 
5) (x 
–
 
3).
 
2)
 
5(x 
–
 
2) (x + 3).
 
3)
 
5(x + 2) (x 
–
 
3).
 
4)
 
5(x 
–
 
2) (x 
–
 
3).
 
5)
 
5(x + 5) (x + 3).
 
 
v
10
4
1
44
v
10
4
1
44

Outros materiais

Outros materiais