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