1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

programa em C dá erro

Discussão em 'Programação' iniciada por Master_piece, 25 de Julho de 2008. (Respostas: 7; Visualizações: 665)

  1. Master_piece

    Master_piece Power Member

    Estou aqui a fazer um programa que me dá um certo jeito e proveito para estudar C, visto que tenho andado a estudar pelo livro "Linguagem C" de Luis Damas.

    O programa ainda não está acabado mas só para experimentar o que ja está feito compileio e ao executalo quando chega á parte de pedir um jogo na função add_jogo() eu coloco o jogo e depois dá erro. Suponho que seja na fprintf(), mas não sei qual é o problema.
    Código:
    #include <stdio.h>
    #include <stdlib.h>
    
    add_jogo()
    {
         FILE *jg;
         char jogo;
         printf("Nome do jogo: ");
         scanf(" %c",&jogo);
         fprintf(jg,"%c",jogo);
         }
    
    
    
    int main()
    {
      FILE *pp, *jg;
      int mmenu, menu;
      pp = fopen("pessoal.txt","a+");
      jg = fopen("jogos.txt","a+");  
        
      printf(">>>O que deseja fazer?<<<\n\n");
      printf("1:adicionar jogo.\n");
      printf("2:adicionar participante.\n");
      printf("3:ver participantes.\n");
      printf("4:ver jogos.\n");
      printf("5:sair\n\n");
      
      scanf("%d",&mmenu);
      
      switch(mmenu)
      
          case 1 : add_jogo();
          /*case 2 : " ";
          case 3 : " ";
          case 3 : " ";
          case 4 : " ";
          case 5 : exit(1) ;*/
           
      fclose(pp);
      fclose(jg);
    }
    
    Ajudem-me é que ainda não percebo assim muito disto visto que ainda ando a estudar isto(apenas com apoio deste livro e da internet).

    Cumps.
    Master
    </div>
     
    Última edição pelo moderador: 25 de Julho de 2008
  2. h4des

    h4des Power Member

    Na função add_jogo não abriste o ficheiro para escrita.

    jg = fopen("nomedofixeiro","w");
     
  3. Master_piece

    Master_piece Power Member


    LoL

    Não sabia que tinha que abrir o ficheiro para escrita.
    xD.

    Obrigado

    Ja agora então não necessito de abrir os ficheiros para escrita e leitura em main, pois essas operações vão ser todas realizadas por funções criadas por mim e chamadas em main.?

    E mais uma coisa com o
    Código:
    scanf(" %c",&jogo);
    apenas consigo enviar um caracter, e eu pretendia enviar um nome comleto, como por exemplo Cs ou Rise of Nations, etc.
     
    Última edição pelo moderador: 25 de Julho de 2008
  4. h4des

    h4des Power Member

    scanf("%[^\n]%c", jogo);
     
  5. Master_piece

    Master_piece Power Member

    muito obrigado.
    </div>
     
  6. Master_piece

    Master_piece Power Member

    Desculpem la tar outra ves a incomodar, mas depois de ter o programa completo, deparome com o mesmo erro que me deparava inicialmente, e não estou a ver do que possa ser.

    Código:
    #include <stdio.h>
    #include <stdlib.h>
    
    mmenu()
      {
      system("cls"); 
      int m;
      
      printf(">>>O que deseja fazer?<<<\n\n");
      printf("1:adicionar jogo.\n");
      printf("2:adicionar participante.\n");
      printf("3:ver jogos.\n");
      printf("4:ver participantes.\n");
      printf("qualquer outra tecla para sair\n\n");
      
      scanf(" %d",&m);
      
      switch(m)
      {
          case 1 : add_jogo();
          case 2 : add_participante();
          case 3 : ver_jogos();
          case 4 : ver_participantes();
          default : exit(1);         
      }       
    }
    
    sm1()     
    {    
         int j; 
         printf("1:adicionar outro jogo.");
         printf("2:voltar ao menu principal.");
         printf("qualquer outra tecla para sair\n\n.");
         
         scanf(" %d",&j);
         
         switch(j)
         {
              case 1 : add_jogo();
              case 2 : mmenu();
              default : exit(1);
         }    
         }
         
    sm2()     
    {    
         int p; 
         printf("1:adicionar outro participante.");
         printf("2:voltar ao menu principal.");
         printf("qualquer outra tecla para sair\n\n.");
         
         scanf(" %d",&p);
         
         switch(p)
         {
              case 1 : add_participante();
              case 2 : mmenu();
              default : exit(1);
         }     
         }
         
    sm3()     
    {    
         int aj; 
         printf("1:voltar ao menu principal.");
         printf("qualquer outra tecla para sair\n\n.");
         
         scanf(" %d",&aj);
         
         switch(aj)
         {
              case 1 : mmenu();
              default : exit(1);
         }    
         }     
         
    add_jogo()
    {
         system("cls");
         FILE *jg;
         char jogo;
         jg = fopen("jogos.txt","a");
         printf("Nome do jogo: ");
         scanf(" %[^\n]%c",&jogo);
         fprintf(jg,"%c\n",jogo);
         fclose(jg);
         sm1();
    }
    
    add_participante()
    {
         system("cls");         
         FILE *pp;
         char man;
         pp = fopen("participantes.txt","a");
         printf("Nome do participante: ");
         scanf(" %[^\n]c",&man);
         fprintf(pp,"%c\n",man);
         fclose(pp);
         sm2();    
         }
         
    ver_jogos()
    {
         system("cls");           
         FILE *jg;
         char jogo;
         jg = fopen("jogos.txt","a");
         while ((jogo=fgetc(jg)) !=EOF)
               putchar(jogo);
         fclose(jg);
         sm3();
         }        
    
    ver_participantes()
    {
         system("cls");                   
         FILE *pp;
         char man;
         pp = fopen("participantes.txt","a");
         while ((man=fgetc(pp)) !=EOF)
               putchar(man);
         fclose(pp);
         sm3();
         }        
    
    int main()
    {
        int m;
      mmenu();
    }
    
    Cumps.
    Master
    </div>
     
    Última edição pelo moderador: 25 de Julho de 2008
  7. Baderous

    Baderous Banido

    Tens aí uma série de falhas de estruturação do código:

    1) Os teus "cases" vão ser invocados todos sequencialmente a partir do case de entrada, porque não estás a colocar a instrução break no fim de cada um.
    2) Não se deve usar a função exit(int) por tudo e por nada. O parâmetro desta função é um inteiro que permite comunicar ao SO a ocorrência de determinado estado da aplicação ou de algum erro.
    3) Todas essas invocações de funções dentro de outras funções para fazer o efeito "retroceder" podem ser substituídas por um simples ciclo "do...while" com a ajuda dos tais breaks nos cases.
    4) As tuas funções não têm tipo de retorno. Sendo assim, o compilador assume que o seu tipo de retorno é int. No entanto não há nenhuma instrução de return no código. Convinha que o seu tipo fosse void (não retorna nada).
    5) Estás a usar uma chamada ao SO através do código system(...). Isso vai fazer com que o teu programa fique dependente do SO no qual estás a programar e, portanto, não se torna portável.
    6) Não estás a testar a hipótese de falha na abertura de ficheiros.
     
  8. h4des

    h4des Power Member

    Estive a ver o codigo, tenho ideia que nos switchs no fim do código de cada case é preciso adicionar um break, por exemplo:

    Código:
      switch(m)
      {
          case 1: 
              add_jogo();
          break;
          case 2: 
              add_participante();
          break;
          case 3: 
              ver_jogos();
          break;
          case 4:
              ver_participantes();
          break;
          default: 
              exit(1);         
      }   
    
    Na função add_jogo() no scanf estás a atribuir uma string(vários caracteres) à char jogo que consiste em apenas 1 caracter. Deves então declara-la como char *jogo ou char jogo[256].
     

Partilhar esta Página