View Full Version : programa em C dá erro


Master_piece
25-07-2008, 18:13
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.
#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>

h4des
25-07-2008, 18:18
Na função add_jogo não abriste o ficheiro para escrita.

jg = fopen("nomedofixeiro","w");

Master_piece
25-07-2008, 18:26
Na função add_jogo não abriste o ficheiro para escrita.

jg = fopen("nomedofixeiro","w");


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 scanf(" %c",&jogo); apenas consigo enviar um caracter, e eu pretendia enviar um nome comleto, como por exemplo Cs ou Rise of Nations, etc.

h4des
25-07-2008, 18:50
scanf("%[^\n]%c", jogo);

Master_piece
25-07-2008, 19:10
muito obrigado.
</div>

Master_piece
25-07-2008, 19:56
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.

#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>

Baderous
25-07-2008, 21:01
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.

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


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].