Ana Silva Posted May 29, 2021 at 01:04 PM Report Share #622463 Posted May 29, 2021 at 01:04 PM Oi pessoal! Eu estou fazendo um trabalho de gerir uma equipa de um desporto à escolha e preciso criar estruturas para colocar as informações dos jogadores e os seus respetivos jogos. O problema é que eu sou iniciante em estruturas tenho de fazer uma tabela e apresentá-la em ficheiro de texto e não sei como fazer a não ser em modo manual no entanto ficam tortas as linhas. O meu segundo problema é que tenho de criar um ficheiro binário com os dados de todos os jogadores e jogos como posso fazer isso? Alguém pode ajudar? Isto é o que eu tenho até agora: #include <stdio.h> FILE * dados_jogador; FILE * dados_jogo; FILE * dados_gerais; int i, j; struct dados_jogador { char nome[50]; int dia; int mes; int ano; float altura; float peso; int n_jogos; }; typedef struct dados_jogador jogador; jogador ler_jogador() { jogador jogador; printf("\nDADOS DO JOGADOR:\n"); printf("nome:"); scanf("%s", jogador.nome); printf("data de nascimento:"); scanf("%d/%d/%d", &jogador.dia, &jogador.mes, &jogador.ano); if ((jogador.dia >= 01 && jogador.dia <= 30) && (jogador.mes == 04 || jogador.mes == 06 || jogador.mes == 9 || jogador.mes == 11)){ } if (jogador.dia >= 01 && jogador.dia <= 31 && (jogador.mes == 01 || jogador.mes == 03 || jogador.mes == 05 || jogador.mes == 07 || jogador.mes == 8|| jogador.mes == 10 || jogador.mes == 12) && jogador.ano >= 1583){ } if (jogador.dia == 29 && jogador.dia == 2 && (jogador.ano % 400 == 0 || jogador.ano % 4 == 0 && jogador.ano % 100 != 0)){ } if ((jogador.dia >= 01 && jogador.dia <= 28) && (jogador.mes == 2)){ } if (jogador.dia <= 00 || jogador.dia > 31){ printf("dia invalido\n"); ler_jogador(); } if (jogador.mes <= 00 || jogador.mes > 12){ printf("mes invalido\n"); ler_jogador(); } if (jogador.ano < 1583){ printf("ano invalido\n"); ler_jogador(); } printf("altura:"); scanf("%f", &jogador.altura); if(jogador.altura <= 0){ ler_jogador(); } printf("peso:"); scanf("%f", &jogador.peso); if(jogador.peso <= 0){ ler_jogador(); } printf("numero de jogos:"); scanf("%d", &jogador.n_jogos); if(jogador.n_jogos < 0){ ler_jogador(); } dados_jogador = fopen("dados_jogador.txt", "a"); fprintf(dados_jogador, "\n%s %02d/%02d/%d %.2f %.2f %d", jogador.nome, jogador.dia, jogador.mes, jogador.ano, jogador.altura, jogador.peso, jogador.n_jogos); fclose(dados_jogador); dados_gerais = fopen("dados_gerais.dat", "ab"); fwrite (&jogador.nome, sizeof(struct dados_jogador), 1 , dados_gerais); fclose(dados_gerais); } struct dados_jogo { int dia; int mes; int ano; char local[50]; char adversario[50]; char resultado[50]; }; typedef struct dados_jogo jogo; jogo ler_jogo() { jogo jogo; printf("\nDADOS DO JOGO:\n"); printf("data:"); scanf("%d/%d/%d",&jogo.dia, &jogo.mes, &jogo.ano); printf("local:"); scanf("%s", jogo.local); printf("adversario:"); scanf("%s", jogo.adversario); printf("resultado:"); scanf("%s", jogo.resultado); dados_jogo = fopen("dados_jogo.txt", "a"); fprintf(dados_jogo, "\n%02d/%02d/%d %s %s %s\n", jogo.dia, jogo.mes, jogo.ano, jogo.local, jogo.adversario, jogo.resultado); fclose(dados_jogo); } int main(int argc, char *argv[]) { char opcao; do{ printf(" MENU INICIAL:\n"); printf("Escolha uma das opcoes:\n"); printf("1- Inserir jogador \n"); printf("2- Editar jogador \n"); printf("3- Procurar jogador \n"); printf("4- Eliminar jogador \n"); printf("5- Inserir jogo \n"); printf("6- Contabilizar \n"); printf("7- Sair do programa \n"); fflush(stdin); printf("opcao:"); scanf("%c", &opcao); switch(opcao){ case '1': ler_jogador(); break; //escolha das opcoes e suas funcoes case '2': break; case '3': break; case '4': break; case '5': ler_jogo(); break; case '6': break; case '7': return 0; default: printf("Opcao invalida\n");break; } } while (opcao != '7'); return 0; } 1 Report Link to comment Share on other sites More sharing options...
thoga31 Posted May 30, 2021 at 11:54 PM Report Share #622476 Posted May 30, 2021 at 11:54 PM Antes de mais, alguns apontamentos breves: Se nas funções ler_jogador() e ler_jogo() não estás a retornar um resultado, por que motivo declaraste que elas retornam jogador e jogo, respetivamente? Usar o mesmo identificador para uma estrutura e uma variável (struct dados_jogador e FILE *dados_jogador), apesar de possível neste caso, pode facilmente gerar confusão ao ler o código. Posto isto, acerca dos teus problemas: Ficheiros binários: deves passar o apontador para jogador e não jogador.nome, se o intuito é gravar a estrutura inteira: fwrite(&jogador, sizeof(struct dados_jogador), 1, dados_gerais); Podes definir no printf() e fprintf() um tamanho mínimo pré-definido para cada dado: int n = 1234; printf("|%d|\n", n); // |1234| <-- usa o espaço estritamente necessário printf("|%7d|\n", n); // | 1234| <-- preenche com espaços à esquerda até perfazer 7 printf("|%07d|\n", n); // |0001234| <-- preenche com zeros à esquerda até perfazer 7 Cumprimentos. 1 Report Knowledge is free! Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now