Arquivo

Posts Tagged ‘Exercícios Resolvidos’

Vestibular

quinta-feira, 15/12/2011 Deixe um comentário
Codigo fonte:
// Vestibular!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
char nome[50];    // nome do cidadao
char inscr[20];    // num de inscricao do candidato
double nota;    // nota do candidato
} Candidato;

typedef struct {
char cod[10];    // codigo do curso
char nome[50];    // nome do curso
int nVagas;        // num de vagas deste curso
int nInscritos;    // num de inscritos neste curso
Candidato **v;    // vetor de ponteiros para candidatos deste curso
} Curso;

int leNumCursos () {
int x = 0;

while (x == 0) {
printf ("Digite o numero de cursos: ");
scanf ("%d", &x);
}

return x;
}

void erro () {
printf ("Erro: Memoria insuficiente.\n");
exit (1);
}

Curso *leCursos (int n) {
Curso *c;
int i;

c = (Curso *)malloc (n*sizeof (Curso));
if (c == NULL) erro ();

for (i = 0; i < n; i++) {
int x, j;
printf ("Digite codigo, nome, num de vagas e de inscritos do curso: ");
scanf ("%s %s %d %d", c[i].cod, c[i].nome, &c[i].nVagas, &c[i].nInscritos);

// alocar o vetor que armazena os candidatos deste curso
x = c[i].nInscritos;
c[i].v = (Candidato **)malloc (x * sizeof (Candidato *));
if (c[i].v == NULL) erro ();

for (j = 0; j < x; j++) {
c[i].v[j] = (Candidato *) malloc (sizeof (Candidato));
if (c[i].v[j] == NULL) erro ();
}
}

return c;

}

void leCandidatos (Curso *c, int n, char *cod) {
int pos;

for (pos = 0; pos < n; pos++) {
if ( strcmp (cod, c[pos].cod) == 0 ) {
// achei o curso na posicao POS
int cand;

for (cand = 0; cand < c[pos].nInscritos; cand++) {
printf ("Digite nome, inscricao e nota do candidato: ");
scanf ("%s %s %lf", c[pos].v[cand]->nome, c[pos].v[cand]->inscr, &c[pos].v[cand]->nota);
}
}
}

}

void ordena (Candidato **v, int n) {
int i, j;

for (i = 0; i < n-1; i++) {
for (j = i+1; j < n; j++) {
if (v[i]->nota < v[j]->nota) {
// trocar os dois de lugar
Candidato *aux = v[i];
v[i] = v[j];
v[j] = aux;
}
}
}
}

void aprovados (Curso c) {
int i;

// Colocar os candidatos em ordem DECRESCENTE de nota
ordena (c.v, c.nInscritos);

printf ("\nAprovados:\n");
for (i = 0; i < c.nVagas && i < c.nInscritos; i++) {
printf ("%d %s %.2f\n", i+1, c.v[i]->nome, c.v[i]->nota);
}

if (i < c.nVagas+10 && i < c.nInscritos) {
printf ("\nSuplentes:\n");

for ( ; i < c.nVagas+10 && i < c.nInscritos; i++) {
printf ("%d %s %.2f\n", i+1, c.v[i]->nome, c.v[i]->nota);
}
}

}

int main () {
Curso *c;    // vetor de cursos
int n;        // numero de cursos
int i;

n = leNumCursos ();
c = leCursos (n);

for (i = 0; i < n; i++) {
printf ("Candidatos ao curso %s\n", c[i].nome);
leCandidatos (c, n, c[i].cod);
}

for (i = 0; i < n; i++) {
printf ("\n\n****************\nAprovados em %s\n", c[i].nome);
aprovados (c[i]);
}

return 0;
}

Teste:

3
CCOMP Computacao 10 15
MAT Matematica 4 3
BSI SistemasInformacao 8 20
A 1 10
B 2 11
C 3 13
D 4 10
E 5 90
F 6 99
G 7 8
H 8 100
I 9 8
J 10 71
K 11 33
L 12 31
M 13 30
N 14 80
O 15 30
A 1 10
B 2 11
C 3 13
A 1 10
B 2 11
C 3 13
D 4 10
E 5 90
F 6 99
G 7 8
H 8 100
I 9 8
J 10 71
K 11 33
L 12 31
M 13 30
N 14 80
O 15 30
P 16 44
Q 17 41
R 18 2
S 19 1
T 20 57

Cadastro de Vendas e Vendedores

terça-feira, 13/12/2011 Deixe um comentário
#include <stdio.h>    // printf, scanf
#include <stdlib.h>    // malloc, exit, NULL, free
#include <string.h>    // strlen, strcmp, strcpy, strcat

typedef struct {
char nome[30];
char cod[10];
int idade;
} Vendedor;

typedef struct {
char codVendedor[10];
char codVenda[10];
double valorTotal;
} Venda;

int leNumVendedores () {
int x;

printf ("Digite o numero de vendedores: ");
scanf ("%d", &x);

return x;
}

Vendedor *leVendedores (int n) {
Vendedor *v;
int i;

v = (Vendedor *) malloc (n*sizeof (Vendedor));
if (v == NULL) {
printf ("Erro de memoria.\n");
exit (1);
}

// se chegue aqui eh pq consegui alocar o vetor...
// entao vamos preenche-lo
for (i = 0; i < n; i++) {
printf ("Digite codigo, idade e nome do vendedor: ");
scanf ("%s %d %s", v[i].cod, &v[i].idade, v[i].nome);
}

return v;
}

int leNumVendas () {
int x;

printf ("Digite o numero de vendas: ");
scanf ("%d", &x);

return x;
}

int existeVendedor (Vendedor *v, int n, char *cod) {
/*    Verifica se o codigo de um vendedor foi digitado corretamente, ou seja,
se este vendedor foi cadastrado. */
int i;

for (i = 0; i < n; i++) {
if ( strcmp (v[i].cod, cod) == 0 ) {
return 1;
}
}

return 0;
}

Venda *leVendas (int n, Vendedor *vendedores, int nVendedores) {
Venda *v;
int i;

v = (Venda *)malloc (n*sizeof (Venda));
if (v == NULL) {
printf ("Erro de memoria.\n");
exit (1);
}

for (i = 0; i < n; i++) {
printf ("Digite codigo do vendedor, codigo da venda e valor total da venda: ");
scanf ("%s %s %lf", v[i].codVendedor, v[i].codVenda, &v[i].valorTotal);

if ( !existeVendedor (vendedores, nVendedores, v[i].codVendedor) ) {
printf ("Codigo do vendedor inexistente, digite novamente.\n");
i--;
}

}

return v;
}

int calcNumVendas (Venda *v, int n, char *cod) {
int i, vendas = 0;

for (i = 0; i < n; i++) {
if ( strcmp (cod, v[i].codVendedor) == 0) vendas++;
}

return vendas;
}

void imprimeVendedorComMaisVendas (Vendedor *v1, int n1, Venda *v2, int n2) {
int i;
int maior = 0;

for (i = 1; i < n1; i++) {
if ( calcNumVendas (v2, n2, v1[i].cod) > calcNumVendas (v2, n2, v1[maior].cod) )
maior = i;
}

printf ("O vendedor com maior numero de vendas foi %s.\n", v1[maior].nome);

}

double calcMediaVendas (Venda *v, int n, char *cod) {
int i, vendas = 0;
double valor = 0;

for (i = 0; i < n; i++) {
if ( strcmp (cod, v[i].codVendedor) == 0) {
valor = valor + v[i].valorTotal;
vendas++;
}
}

return valor/vendas;
}

void imprimeVendedorComMelhorMedia (Vendedor *v1, int n1, Venda *v2, int n2) {
int i;
int maior = 0;

for (i = 1; i < n1; i++) {
if ( calcMediaVendas (v2, n2, v1[i].cod) > calcMediaVendas (v2, n2, v1[maior].cod) )
maior = i;
}

printf ("O vendedor com melhor media de vendas foi %s.\n", v1[maior].nome);
printf ("Sua vendas que superaram a media foram:");

for (i = 0; i < n2; i++) {
if ( strcmp (v1[maior].cod, v2[i].codVendedor) == 0 && v2[i].valorTotal > calcMediaVendas (v2, n2, v1[maior].cod) ) {
printf ("%s\n", v2[i].codVenda);
}

}

}

int main (int argc, char **argv) {
Vendedor *v1;    // vetor com os vendedores da loja
Venda *v2;        // vetor com as vendas da loja
int n1;            // numero de vendedores
int n2;            // numero de vendas

n1 = leNumVendedores ();
v1 = leVendedores (n1);

n2 = leNumVendas ();
v2 = leVendas (n2, v1, n1);

// letra a
imprimeVendedorComMaisVendas (v1, n1, v2, n2);
imprimeVendedorComMelhorMedia (v1, n1, v2, n2);

return 0;
}

Cadastro de Alunos

terça-feira, 13/12/2011 Deixe um comentário

Defina um tipo Aluno, com nome, matricula, turma e nota de 3 provas.
Defina funções para leitura e impressão de um aluno.
Defina uma funcao que calcula sua média final (a função pede que o usuário digite uma quarta nota caso ele tenha ficado de prova final).

/*
Defina um tipo Aluno, com nome, matricula, turma e nota de 3 provas.
Defina funções para leitura e impressão de um aluno.
Defina uma funcao que calcula sua média final (a função pede que o usuário digite uma quarta nota caso ele tenha ficado de prova final).
*/

#include <stdio.h>
#include <stdlib.h>

typedef struct {
char nome[30];
char mat[10];
char turma[10];

double n1, n2, n3, pf;
} Aluno;

void leAluno (Aluno *p) {
printf ("Digite nome, matricula e turma do aluno: ");
scanf ("%s %s %s", p->nome, p->mat, p->turma);

printf ("Digite as 3 notas do aluno: ");
scanf ("%lf %lf %lf", &p->n1, &p->n2, &p->n3);

if ( (p->n1 + p->n2 + p->n3) < 60 ) {
printf ("Digite nota da prova final: ");
scanf ("%lf", &p->pf);
}
}

void imprimeAluno (Aluno *p) {
printf ("Nome: %s\n", p->nome);
printf ("Matricula: %s\n", p->mat);
printf ("Turma: %s\n", p->turma);
printf ("Nota 1: %.2f\n", p->n1);
printf ("Nota 2: %.2f\n", p->n2);
printf ("Nota 3: %.2f\n", p->n3);
}

double media (Aluno *p) {
double m;

m = p->n1 + p->n2 + p->n3;

if ( m < 60 ) {
m = 0.4*m + 0.6*p->pf;
}

return m;

}

/*double media (Aluno *p) {
double m, pf;

m = p->n1 + p->n2 + p->n3;

if ( m < 60 ) {
printf ("Aluno de prova final. Digite nota da PF: ");
scanf ("%lf", &pf);

m = 0.4*m + 0.6*pf;
}

return m;

}*/

/*int main (int argc, char **argv) {
Aluno a;
double m;

leAluno (&a);
imprimeAluno (&a);

m = media (&a);

if ( m >= 60 ) printf ("%s passou na disciplina com media %.2f.\n", a.nome, m);
else printf ("Game over para %s, que reprovou com %.2f.\n", a.nome, m);

return 0;
}*/

void alunoComMaiorMedia (Aluno *v, int n) {
int i, m = 0;

for (i = 1; i < n; i++) {
if ( media (&v[i]) > media (&v[m]) ) m = i;
}

printf ("O aluno com maior media (%.2f) foi %s.\n", media (&v[m]), v[m].nome);
}

int main (int argc, char **argv) {
int n;            // numero de alunos
Aluno *v;        // vetor de alunos
int i;

printf ("Digite o numero de alunos: ");
scanf ("%d", &n);

v = (Aluno *)malloc (n * sizeof (Aluno));
if (v == NULL) {
printf ("Erro de memoria.\n");
exit (1);
}

for (i = 0; i < n; i++) leAluno ( &v[i] );

//for (i = 0; i < n; i++) imprimeAluno ( &v[i] );

printf ("Resultado Final: \n");
for (i = 0; i < n; i++) {
double m = media ( &v[i] );
if ( m >= 60 ) printf ("%s / %.2f / Aprovado\n", v[i].nome, m);
else printf ("%s / %.2f / Reprovado\n", v[i].nome, m);
}

alunoComMaiorMedia (v, n);

return 0;
}

Matrizes

quinta-feira, 24/11/2011 Deixe um comentário

Código com funções de manipulação de matrizes dinâmicas feita na aula do dia 22/11/2011:


#include <stdio.h>
#include <stdlib.h>

void erro () {
    printf ("Memoria insuficiente.\n");
    exit (1);
}

int **alocaMatriz (int l, int c) {
    int **M, i;

    M = (int **)malloc (l*sizeof (int *));

     if (M == NULL) erro ();

     for (i = 0; i < l; i++) {
         M[i] = (int *)malloc (c*sizeof (int));
         if (M[i] == NULL) erro ();
     }

     return M;
}

void preencheMatriz (int **M, int l, int c) {
     int i, j;

     for (i = 0; i < l; i++) {
         for (j = 0; j < c; j++) {
             printf ("Digite elemente M[%d][%d]: ",i,j);
             scanf ("%d", &M[i][j]);
         }
     }
}

void imprimeMatriz (int **M, int l, int c) {
     int i, j;

     for (i = 0; i < l; i++) {
         for (j = 0; j < c; j++) {
             printf ("%d\t", M[i][j]);
         }
         printf ("\n");
     }
}

int main (int argc, char **argv) {
     int **M, l = 4, c = 3;

     M = alocaMatriz (l, c);
     preencheMatriz (M, l, c);
     imprimeMatriz (M, l, c);

    return 0;
}

Código correto do simulado de 2010/2

quarta-feira, 27/04/2011 Deixe um comentário

O único erro no arquivo era que estávamos salvando os dados do arquivo binário em um vetor que não havia sido alocado (confira entre as linhas 42 e 51 do arquivo simulado.c).

Quando encontrarem erros de Falha de Segmentação, lembrem-se que na maioria das vezes estamos tentando acessar um endereço de memória inválido (no caso, inválido porque não havia sido alocado).

O código correto segue:
Código:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
	int dia, mes, ano;
} Data;

typedef struct {
	int h;
	int m;
} Hora;

typedef struct {
	char local[10];
	Hora horario;
} Escala;

typedef struct {
	int n;
	char cia[10];
	Data dt;
	int nescalas;
	Escala *escalas;
} Voo;

void ordena (char **v, int n) {
	int i, j;
	char *aux;

	for (i = 0; i < n-1; i++) {
		for (j = i+1; j < n; j++) {
			if (strcmp (v[i], v[j]) > 0) {
				aux = v[i];
				v[i] = v[j];
				v[j] = aux;
			}
		}
	}
}

Voo *questao1 (FILE *fp) {
	Voo *v;
	int n, i, j, k = 0, nlocais = 0;
	char **locais;
	Escala *temp;
	
	// ler o numero de voos
	fread (&n, sizeof (int), 1, fp);

	// ler os voos
	v = (Voo *)malloc (n*sizeof (Voo));
	fread (v, sizeof (Voo), n, fp);

	for (i = 0; i < n; i++) {
		v[i].escalas = (Escala *)malloc (v[i].nescalas*sizeof (Escala));
		// ler as escalas deste voo
		fread (v[i].escalas, sizeof (Escala), v[i].nescalas, fp);
		// calculando o total de locais
		nlocais += v[i].nescalas;
	}

	// criar vetor com todos os locais
	locais = (char **)malloc (nlocais*sizeof (char *));

	for (i = 0; i < n; i++) {
		for (j = 0; j < v[i].nescalas; j++) {
			locais[k] = v[i].escalas[j].local;
			k++;
		}
	}

	// ordenar o vetor
	ordena (locais, nlocais);

	// imprimir sem repetir
	printf ("%s\n", locais[0]);
	for (k = 1; k < nlocais; k++)
		if (strcmp (locais[k], locais[k-1]) != 0) 
			printf ("%s\n", locais[k]);

	// retornar o vetor de voos
	return v;
}

int main (int argc, char **argv) {
	FILE *fp;
	Voo *voos;

	if (argc != 2) {
		printf ("Digite o nome do arquivo.\n");
		exit (1);
	}

	fp = fopen (argv[1], "rb");

	if (fp == NULL) {
		printf ("Nao foi possivel abrir o arquivo.\n");
		exit (1);
	}

	voos = questao1 (fp);

	fclose (fp);
	return 0;
}