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 ();
Download

CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013