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 – 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 Programa 9.1: Montagem da tabela de locais dos grandes prêmios Sejam as declarações à esquerda typedef char cadeia1[16]; struct tabelagps { cadeia1 VetGPs[30]; int ngps; }; typedef struct tabelagps tabelagps; ngps VetGPs local 0 tabelagps TabGPs; 1 2 Elas implementam a seguinte estrutura: 3 TabGPs . . . . . . #include <stdio.h> #include <conio.h> #include <string.h> typedef char cadeia1[16], cadeia2[21]; Copiar, salvar e executar o programa à esquerda /* Estrutura para a tabela de locais dos GPs */ struct tabelagps { cadeia1 VetGPs[30]; int ngps; }; typedef struct tabelagps tabelagps; /* Variaveis globais */ tabelagps TabGPs; FILE *filein, *fileout; Continua no próximo slide /* Funcao LerGPs: leitura dos locais dos GPs */ A variável void LerGPs () { TabGPs é global 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> } Escrever o seguinte arquivo de entrada, de nome “Formula1Entrada.txt”: 5<enter> Sao Paulo Londres Los Angeles Paris Tokio 15 <enter> <enter> <enter> <enter> <enter> Leitura de no máximo 15 (16-1) caracteres O Borland não completa com espaços em branco até interar 15 caracteres Continua no próximo slide /* 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 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; NomePiloto Escuderia Classificacao Sejam as declarações à esquerda tipo piloto TotalPontos struct tabelapilotos { piloto VetPilotos[30]; int npilotos; }; typedef struct tabelapilotos tabelapilotos; tabelapilotos TabPilotos; Elas implementam a estrutura a seguir npilotos VetPilotos NomePiloto Escuderia Classificacao TotalPontos . . . . . . . . . . . . . . . . . . . . . . . . 0 1 2 3 4 . . . . . . TabPilotos /* Estrutura para a tabela de locais dos GPs struct tabelagps {- - - - -}; typedef struct tabelagps tabelagps; */ Fazer no Programa 9.1 as alterações que se seguem /* 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 tabelapilotos tabelapilotos; */ Continua no próximo slide /* Variaveis globais */ tabelagps TabGPs; tabelapilotos TabPilotos; 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 5<enter> Sao Paulo <enter> fgets (TabPilotos.VetPilotos[i].NomePiloto, 21, Londres <enter> filein); Los Angeles <enter> fgets (TabPilotos.VetPilotos[i].Escuderia, 16, filein); Paris <enter> Tokio <enter> 16<enter> Felipe Massa Ferrari <enter> Fernando Alonso Ferrari <enter> Sebastian Vettel Red Bull <enter> Mark Webber Red Bull <enter> Jenson Button McLaren <enter> Sergio Perez McLaren <enter> Kimi Raikkonen Lotus <enter> Romain Grosjean Lotus <enter> Nico Rosberg Mercedes <enter> Lewis Hamilton Mercedes <enter> Nico Hulkenberg Sauber <enter> Esteban Gutierrez Sauber <enter> Paul di Resta Force India <enter> Adrian Sutil Force India <enter> Pastor Maldonado Williams <enter> Valtteri Bottas Williams <enter> 20 15 Continua no próximo slide /* 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: LerGPs (); EscreverGPs (); LerPilotos (); LerResultadosGPs (); EscreverPilotos (); 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 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: LerGPs (); EscreverGPs (); LerPilotos (); LerResultadosGPs (); CalcularPontuacao (); EscreverPilotos (); A pontuação total de cada piloto deve ser armazenada em TabPilotos, no campo TotalPontos 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: 2º Lugar: 3º Lugar: 4º Lugar: 5º Lugar: 6º Lugar: 7º Lugar: 8º Lugar: 8º Lugar: 10º Lugar: 25 ptos 18 ptos 15 ptos 12 ptos 10 ptos 08 ptos 06 ptos 04 ptos 02 ptos 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: LerGPs (); EscreverGPs (); LerPilotos (); LerResultadosGPs (); CalcularPontuacao (); OrdenarTabPilotos (); EscreverPilotos (); A ordenação pode usar uma adaptação do método BubbleSort, mas pode usar alternativamente algum outro método 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 tabelaescuderias tabelaescuderias; tabelaescuderias TabEscuderias; 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 ();