Jump to content

Menu em C (structs)


Ana Silva

Recommended Posts

Ana Silva

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

 

Link to post
Share on other sites
thoga31

Antes de mais, alguns apontamentos breves:

  1. 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?
  2. 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.

Knowledge is free!

Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.