230 likes | 316 Views
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013. Capítulo IX Estruturas e Subprogramas sem Parâmetros. Tema do Lab 9: Campeonato de Fórmula 1 Ler as informações sobre o campeonato e montar as seguintes tabelas : Tabela dos locais dos grandes prêmios
E N D
CES-10 INTRODUÇÃO À COMPUTAÇÃOAulas Práticas – 2013 Capítulo IX Estruturas e Subprogramas sem Parâmetros
Tema do Lab 9: Campeonato de Fórmula 1 • Ler as informações sobre o campeonato e montar as seguintes tabelas: • Tabela dos locais dos grandes prêmios • Tabela de informações sobre os pilotos: nome, escuderia, classificação em cada grande prêmio e total de pontos, ordenada decrescentemente pelo total de pontos • Tabela de informações sobre as escuderias: nome e total de pontos, ordenada decrescentemente pelo total de pontos
Tema do Lab 9: Campeonato de Fórmula 1 • Os locais dos GP’s, os nomes dos pilotos e suas escuderias devem ser lidos de um arquivo • Os resultados de cada GP devem ser fornecidos pelo operador • O relatório completo do campeonato, com a classificação dos pilotos em cada GP, com a pontuação final e com a classificação final dos pilotos e das escuderias, deve ser escrito num arquivo
ngps Sejam as declarações à esquerda Programa 9.1: Montagem da tabela de locais dos grandes prêmios typedef char cadeia1[16]; struct tabelagps { cadeia1 VetGPs[30]; int ngps; }; typedef struct tabelagpstabelagps; tabelagpsTabGPs; VetGPs Elas implementam a seguinte estrutura: TabGPs
Copiar, salvar e executar o programa à esquerda #include <stdio.h> #include <conio.h> #include <string.h> typedef char cadeia1[16], cadeia2[21]; /* Estrutura para a tabela de locais dos GPs */ struct tabelagps { cadeia1 VetGPs[30]; int ngps; }; typedef struct tabelagpstabelagps; /* Variaveis globais */ tabelagpsTabGPs; FILE *filein, *fileout; Continua no próximo slide
A variável TabGPs é global /* Funcao LerGPs: leitura dos locais dos GPs */ void LerGPs () { int i; char c, d; fscanf (filein, "%d%c", &TabGPs.ngps, &c); for (i = 0; i < TabGPs.ngps; i++) { fgets (TabGPs.VetGPs[i], 16, filein); fscanf (filein, "%c", &c); } } Leitura do <enter> Leitura de no máximo 15 (16-1) caracteres Escrever o seguinte arquivo de entrada, de nome “Formula1Entrada.txt”: 5<enter> Sao Paulo <enter> Londres <enter> Los Angeles <enter> Paris <enter> Tokio <enter> O Borland não completa com espaços em branco até interar 15 caracteres Continua no próximo slide 15
/* Funcao EscreverGPs: escrita dos locais dos GPs */ void EscreverGPs () { int i; fprintf (fileout, “\n\nLocais dos %d GP's:\n", TabGPs.ngps); for (i = 0; i < TabGPs.ngps; i++) fprintf (fileout, "\n%-20s", TabGPs.VetGPs[i]); } Continua no próximo slide
/* funcao main */ void main () { /* Abertura dos arquivos de entrada e de saida */ filein = fopen ("Formula1Entrada.txt", "r"); fileout = fopen ("Formula1Saida", "w"); fprintf (fileout, "CAMPEONATO DE FORMULA 1 - RESULTADOS"); /* Avisos de sobre os arquivos de entrada e saida */ printf ("Processamento das informacoes de um Campeonato de Formula 1\n\n"); printf ("\tArquivo Formula1Entrada: locais, pilotos e escuderias dos GPs\n\n"); printf ("\tArquivo Formula1Saida: Relatorio completo do campeonato\n\n"); /* Processamento das informacoes sobre os GPs */ LerGPs (); EscreverGPs (); /* Fechamento da tela */ printf ("\nDigite algo para encerrar: "); getch (); }
No vídeo: Processamento das informacoes de um Campeonato de Formula 1 Arquivo Formula1Entrada: locais, pilotos e escuderias dos GPs Arquivo Formula1Saida: Relatorio completo do campeonato Digite algo para encerrar: No arquivo Formula1Saida: CAMPEONATO DE FORMULA 1 - RESULTADOS Locais dos 5 GP's: Sao Paulo Londres Los Angeles Paris Tokio Resultado da execução
Sejam as declarações à esquerda Programa 9.2: Montagem da tabela dos pilotos participantes do campeonato de Fórmula 1 struct piloto { cadeia2 NomePiloto; cadeia1 Escuderia; int Classificacao[30], TotalPontos; }; typedef struct piloto piloto; struct tabelapilotos { piloto VetPilotos[30]; int npilotos; }; typedef struct tabelapilotostabelapilotos; tabelapilotosTabPilotos; tipo piloto NomePiloto Escuderia TotalPontos Classificacao Elas implementam a estrutura a seguir
VetPilotos npilotos TabPilotos
Fazer no Programa 9.1 as alterações que se seguem /* Estrutura para a tabela de locais dos GPs */ struct tabelagps {- - - - -}; typedef struct tabelagpstabelagps; /* Estrutura para as informacoes sobre um piloto participante dos GPs */ struct piloto { cadeia2 NomePiloto; cadeia1 Escuderia; int Classificacao[30], TotalPontos; }; typedef struct piloto piloto; /* Estrutura para a tabela de pilotos participantes dos GPs */ struct tabelapilotos { piloto VetPilotos[30]; int npilotos; }; typedef struct tabelapilotostabelapilotos; Continua no próximo slide
/* Variaveis globais */ tabelagpsTabGPs; tabelapilotosTabPilotos; FILE *filein, *fileout; /* Funcao LerGPs: leitura dos locais dos GPs */ void LerGPs () {- - - - -} /* Funcao EscreverGPs: escrita dos locais dos GPs */ void EscreverGPs () {- - - - -} Continua no próximo slide
/* Funcao LerPilotos: leitura dos nomes e das escuderias dos pilotos - Zera a classificacao em todos os GPs e o numero total de pontos */ void LerPilotos () { int i, j; char c; fscanf (filein, "%d%c", &TabPilotos.npilotos, &c); for (i = 0; i < TabPilotos.npilotos; i++) { fgets (TabPilotos.VetPilotos[i].NomePiloto, 21, filein); fgets (TabPilotos.VetPilotos[i].Escuderia, 16, filein); fscanf (filein, "%c", &c); for (j = 0; j < TabPilotos.npilotos; j++) TabPilotos.VetPilotos[i].Classificacao[j] = 0; TabPilotos.VetPilotos[i].TotalPontos = 0; } } O arquivo Formula1Entrada.txt passa a conter os pilotos e as escuderias, conforme o próximo slide
fgets (TabPilotos.VetPilotos[i].NomePiloto, 21, filein); fgets (TabPilotos.VetPilotos[i].Escuderia, 16, filein); 5<enter> Sao Paulo <enter> Londres <enter> Los Angeles <enter> Paris <enter> Tokio<enter> 16<enter> Felipe Massa Ferrari <enter> Fernando Alonso Ferrari <enter> SebastianVettelRed Bull <enter> Mark Webber Red Bull <enter> Jenson Button McLaren <enter> Sergio Perez McLaren <enter> Kimi RaikkonenLotus <enter> RomainGrosjeanLotus <enter> Nico Rosberg Mercedes <enter> Lewis Hamilton Mercedes <enter> Nico HulkenbergSauber <enter> Esteban Gutierrez Sauber <enter> Paul di Resta Force India <enter> Adrian Sutil Force India <enter> Pastor Maldonado Williams <enter> ValtteriBottas Williams <enter> Continua no próximo slide 20 15
/* Funcao EscreverPilotos: escrita das informacoes sobre os pilotos */ void EscreverPilotos () { int i, j; fprintf (fileout, "\n\nInformacoes sobre os %d pilotos:\n", TabPilotos.npilotos); for (i = 0; i < TabPilotos.npilotos; i++) { fprintf (fileout, "\n%-25s", TabPilotos.VetPilotos[i].NomePiloto); fprintf (fileout, "%-20s", TabPilotos.VetPilotos[i].Escuderia); fprintf (fileout, "Classificacoes: "); for (j = 0; j < TabGPs.ngps; j++) fprintf (fileout, "%3d", TabPilotos.VetPilotos[i].Classificacao[j]); fprintf (fileout, " Total de pontos:%4d", TabPilotos.VetPilotos[i].TotalPontos); } }
void main () { /* Abertura dos arquivos de entrada e de saida */ - - - - - /* Avisos de sobre os arquivos de entrada e saida */ - - - - - /* Processamento das informacoes sobre os GPs */ LerGPs (); EscreverGPs (); LerPilotos (); EscreverPilotos (); /* Fechamento da tela */ printf ("\nDigite algo para encerrar: "); getch (); } Copiar, salvar e executar
Exercício 9.1: Leitura e armazenamento dos resultados dos GP’s • Fazer uma função de nome LerResultadosGPs e colocar na função main uma chamada para ela: • Sugere-se para essa leitura a seguinte estratégia: • Para cada GP o programa escreve o seu local e • Pergunta ao operador a classificação de cada um dos pilotos, armazenando a informação em TabPilotos LerGPs (); EscreverGPs (); LerPilotos (); LerResultadosGPs (); EscreverPilotos ();
Exercício 9.2: Cálculo da pontuação total de cada piloto • Fazer uma função de nome CalcularPontuação e colocar na função main uma chamada para ela: • A pontuação total de cada piloto deve ser armazenada em TabPilotos, no campo TotalPontos LerGPs (); EscreverGPs (); LerPilotos (); LerResultadosGPs (); CalcularPontuacao (); EscreverPilotos ();
Exercício 9.2: Cálculo da pontuação total de cada piloto • Como é bem conhecido, recebem pontos num GP os 10 primeiros classificados, segundo a tabela: 1º Lugar: 25 ptos 2º Lugar: 18 ptos 3º Lugar: 15 ptos 4º Lugar: 12 ptos 5º Lugar: 10 ptos 6º Lugar: 08 ptos 7º Lugar: 06 ptos 8º Lugar: 04 ptos 8º Lugar: 02 ptos 10º Lugar: 01 ptos
Exercício 9.3: Ordenação decrescente da TabPilotos pelo total de pontos dos pilotos • Fazer uma função de nome OrdenarTabPilotos e colocar na função main uma chamada para ela: • A ordenação pode usar uma adaptação do método Bubble-Sort, mas pode usar alternativamente algum outro método LerGPs (); EscreverGPs (); LerPilotos (); LerResultadosGPs (); CalcularPontuacao (); OrdenarTabPilotos (); EscreverPilotos ();
Exercício 9.4: Montagem, ordenação e escrita de uma tabela de escuderias • A tabela de escuderias deve usar as seguintes declarações: struct escuderia { cadeia1 NomeEscuderia; int Pontos; }; typedef struct escuderia escuderia; struct tabelaescuderias { escuderia VetEscuderias[30]; int nescuderias; }; typedef struct tabelaescuderiastabelaescuderias; tabelaescuderiasTabEscuderias;
Exercício 9.4: Montagem, ordenação e escrita de uma tabela de escuderias • Fazer três funções de nomes MontarTabEscuderias, OrdenarTabEscuderias e EscreverEscuderias, colocando na função main uma chamada para cada uma delas: LerGPs (); EscreverGPs (); LerPilotos (); LerResultadosGPs (); CalcularPontuacao (); OrdenarTabPilotos (); EscreverPilotos (); MontarTabEscuderias (); OrdenarTabEscuderias (); EscreverEscuderias ();