28 de jun. de 2010

Gabarito da prova 03 - ICC e ALP

Pessoal,

A pedidos, estou postando aqui o gabarito da prova 03 de ICC / ALP (2010-01).

São soluções que podem ser simplificadas e melhoradas.

Abraços,


Victor Vargas

QUESTÃO 01

#include "stdio.h"
#define MAX 5
int maior = 0;

void getMaiorSeq(int seq[], int *qtd, int *ind_ini, int *ind_fim){
int cont;

for(cont = 0; cont < MAX-1; cont++){
if(seq[cont]+1 == seq[cont+1]){
*qtd = *qtd + 1;
if(*qtd > maior){
maior = *qtd;
*ind_ini = (cont + 1) - *qtd;
*ind_fim = cont + 1;
}
}
else
*qtd = 1;
}
}

int main(){
int seq[MAX], cont, qtd=1, ind_ini, ind_fim;
for(cont=0; cont printf("INFORME O %i NRO: ", cont+1);
scanf("%i", &seq[cont]);
}

getMaiorSeq(seq, &qtd, &ind_ini, &ind_fim);

//system("cls");
printf("\n\nMAIOR SEQ. ENCONTRADA: %i\n", maior);
for(cont=ind_ini+1; cont<=ind_fim; cont++)
printf("%i\n", seq[cont]);
system("pause");
return 0;
}


QUESTÃO 02

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#define LIN 20
#define COL 80

void leNomes(char n[LIN][COL]);
void escrevaNomes(char n[LIN][COL]);
int primeiroNome(char n[LIN][COL], char *pn);

int main(int argc, char *argv[]){
char nomes[LIN][COL], primeiro_nome[COL];
int i, numero_vezes = 0;

printf("\nDigite 20 nomes:\n");

leNomes(nomes);
escrevaNomes(nomes);
numero_vezes = primeiroNome(nomes, primeiro_nome);

printf("\n\%sApareceu %d vezes na lista.", numero_vezes, primeiro_nome);
system("PAUSE");
return 0;
}

void leNomes(char n[LIN][COL]){
int i;

for(i = 0; i < LIN; i++){
printf("\nDigite o nome[%d]: ", i + 1);
//scanf("%s", &n[i]);
gets(n[i]);
}
}

void escrevaNomes(char n[LIN][COL]){
int i;

for(i = 0; i < LIN; i++){
printf("\nNome[%d]: %s\n", i + 1, n[i]);
}
}

int primeiroNome(char n[LIN][COL], char pn[COL]){
int i, qv;
/* i é o contador de linhas e qv é a quantidade
de vezes que o nome aparece na lista
*/

qv = 0; //quantidade de vezes que o nome repete na lista

strcpy(pn, n[0]);
/* pega o primeiro nome da lista desordenanda
e coloca em pn (primeiro nome)
*/

//loop que percorre as linhas da matriz de nomes
for(i = 0; i < LIN; i++){
/* verifica se o primeiro nome é menor que pn
quando for a primeira comparação,
teremos que n[i] igual a pn
*/
if(strcmp(n[i], pn) < 0){
/* se o nome em n[i] for o menor,
copia ele para pn
*/
strcpy(pn, n[i]);

//agora temos um novo pn
printf("\nNovo menor --> pn = %s na ", pn);
//em uma nova posição
printf("posicao %d\n", i+1);
/* isso quer dizer que o contador
*/ tem que voltar a ser 1.
qv = 1;
}else{ //se n[i] não for menor que pn...
//verifica se são iguais e se for...
if(strcmp(pn, n[i]) == 0){
/* conta mais um para termos a quantidade
*/ de vezes que foi digitado
qv++;
/* mostra o menor nome (ordem alfabética),
/a quantidade e...
printf("Contagem --> %s = %d ** ", pn, qv);
//a posição na matriz.
printf("posicao %d\n", i+1);
}
}
/* se n[i] for maior que pn,
então não faz nada, pois só queremos encontrar
o primeiro nome da ordem alfabética
*/
}

//retorna a quantidade de vezes que
//o primeiro nome aparece na lista
return qv;
}


QUESTÃO 03

#include "stdio.h"
#include "stdlib.h"

#define T1 10
#define T2 5

void leVetor(int *pv, int t);
void conjunto(int *pa, int *pb);

int main(int argc, char *argv[]){
int a[T1], b[T2];

puts("*** Lendo vetor A ***");
leVetor(a, T1);
puts("*** Lendo vetor B ***");
leVetor(b, T2);

conjunto(a, b); //verifica se b está contido em a

system("PAUSE");
return 0;
}

void leVetor(int *pv, int t){
int i;

for(i = 0; i < t; i++){
printf("\nDigite o elemento %d do vetor: ", i+1);
scanf("%d", &pv[i]);
}
}

void conjunto(int *pa, int *pb){
int i, j, qt_contidos = 0;

for(i = 0; i < T1; i++){ //percorre o vetor a
for(j = 0; j < T2; j++){//percorre o vetor b
/* se o elemento do vetor a for igual
ao elemento do vetor b
*/
if(pa[i] == pb[j]){
/* soma um na quantidade de valores
de b que estão contidos em a
*/
qt_contidos++;
}
}//fim do looping que percorre o vetor b
}//fim do looping que percorre o vetor a

//se a quantidade de elementos for igual
//a constante T2 significa que todos os
//elementos de b estão contidos em a
if(qt_contidos == T2){
puts("B esta contido em A");
}
else{
//se a quantidade de elementos
//for maior ou igual a constante T2
//significa ao menos um elemento
//de b está contido em a
if(qt_contidos >= 1){
puts("B parcialmente contido em A");
}
else{
//se entrar aqui é porque nenhum
//elemento de b foi encontrado em a
puts("B nao esta contido em A");
}
}
}

QUESTÃO 04


#include "stdio.h"

#define NRQUESTOES 20
#define QTALUNOS 10
#define VLQUESTAO 0.5

void leProva(char *g);

int main(int argc, char *argv[]){
float alunos[QTALUNOS][2], soma = 0, media;
char gabarito[NRQUESTOES], prova[NRQUESTOES];
int nao_acertos[NRQUESTOES];
int i, j;
int erros = 0;
int questao_menor_acertos = 0;

leProva(gabarito);

for(j = 0; j < NRQUESTOES; j++)
nao_acertos[j] = 0;

for(i = 0; i < QTALUNOS; i++){
alunos[i][1] = 0.0;

printf("\nMatricula %d: ", i+1);
scanf("%f", &alunos[i][0]);
printf("\nDigite o gabarito do aluno %.0f: ", alunos[i][0]);
leProva(prova);

for(j = 0; j < NRQUESTOES; j++){
if(gabarito[j] == prova[j]){
alunos[i][1] = alunos[i][1] + VLQUESTAO;
}
else{
nao_acertos[j]++;
}

printf("\nQUESTAO %d - %c - ", j+1, gabarito[j]);
printf("NAO ACERTOS = %d\n", nao_acertos[j]);
printf("\tAluno %.0f - assinalou", alunos[i][0]);
printf(" = %c\n", prova[j]);
}

alunos[i][1] = (alunos[i][1]*10)/(VLQUESTAO*NRQUESTOES);
printf("Media do aluno = %.2f\n", alunos[i][1]);
soma = soma + alunos[i][1];
}

media = soma / QTALUNOS;

printf("\nMedia do vestibular = %.2f\n", media);


for(j = 0; j < NRQUESTOES; j++){
if(nao_acertos[j] > erros){
erros = nao_acertos[j];
questao_menor_acertos = j;
}
}
printf("\nQuestao com menor acertos = %d" questao_menor_acertos+1);
printf(" com %d erros\n", nao_acertos[questao_menor_acertos]);

printf("\nMatr.\t\t|\t\tNota\n");

for(i = 0; i < QTALUNOS; i++){
printf("\n%.0f\t\t|\t\t%.2f\n", alunos[i][0], alunos[i][1]);
}

system("PAUSE");
return 0;
}

void leProva(char *g){
int i;

for(i = 0; i < NRQUESTOES; i++){
do{
fflush(stdin);
printf("\nQuestao %d: ", i+1);
g[i] = toupper(getchar());
}
while(g[i] != 'A' && g[i] != 'B' && g[i] != 'C' &&
g[i] != 'D' && g[i] != 'E');
}

for(i = 0; i < NRQUESTOES; i++)
printf("\nQuestao %d: %c", i+1, g[i]);
}

Nenhum comentário: