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