|
| bl.a. switch problem Fra : Dorte Klerke |
Dato : 25-07-03 21:58 |
|
Hej
Jeg er lidt nybegynder til det her C, så derfor har jeg lidt problemer. Jeg
er ved at lave et Hangman spil (skal afleveres den 11 august).
Mit første problem er med min switch-løkke. Jeg kan ikke rigtig se hvad der
er galt, men den virker ikke.
---snip---
void gamemenu(void);
void playgame(int gametype);
---snip---
void gamemenu(void)
{
while(1)
{
printf("\n");
system("clear");
fflush(stdin);
printf(""); /* En menu med oversigt over kategorier */
printf("Indtast dit valg: ");
switch(getc(stdin))
{
case '0': askexit();
case '1': playgame(1);
break;
case '2': playgame(2);
break;
case '3': playgame(3);
break;
case '4': playgame(4);
break;
case '5': playgame(5);
break;
case '6': playgame(6);
break;
case '9': main();
break;
default: return;
}
}
}
void playgame(int gametype)
{
switch(gametype)
{
case '1':
printf("\nKategorien er: Matematiske begreber \n\n");
break;
case '2':
printf("\nKategorien er: Matematikere \n\n");
break;
case '3':
printf("\nKategorien er: Frugt og gr\x9Bnt \n\n");
break;
case '4':
printf("\nKategorien er: Madretter \n\n");
break;
case '5':
printf("\nKategorien er: Tegnefilmsfigurer \n\n");
break;
case '6':
printf("\nKategorien er: Kendte personer \n\n");
break;
default: return; /* hvad skal den lave */
}
}
case nr. 9 og 0 i switch(getc(stdin)) virker fint, men der sker ikke noget
med resten.
Mit andet problem er, at jeg ikke helt ved hvordan jeg skal læse fra en fil
og tilfældig vælge et ord (den skal vel først "tælle" hvor mange ord der er
i txt.filen?) og vise den med _ for hvert bogstav i stedet. Og hvad så hvis
nogle af ordene er sætninger?
En lidt fortvivlet C-eksperimentør Dorte :)
| |
Igor V. Rafienko (25-07-2003)
| Kommentar Fra : Igor V. Rafienko |
Dato : 25-07-03 22:48 |
|
[ Dorte Klerke ]
[ ... ]
> Mit første problem er med min switch-løkke.
Litt pussig å kalle en switch-setning for en løkke, men jeg er kanskje
litt kresen.
> Jeg kan ikke rigtig se hvad der er galt, men den virker ikke.
Hva vil du at den skal gjøre?
[ ... ]
> void gamemenu(void)
> {
> while(1)
> {
> printf("\n");
> system("clear");
> fflush(stdin);
Dette er helt for jævlig, av flere grunner.
> printf(""); /* En menu med oversigt over kategorier */
> printf("Indtast dit valg: ");
>
> switch(getc(stdin))
> {
> case '0': askexit();
> case '1': playgame(1);
> break;
> case '2': playgame(2);
> break;
> case '3': playgame(3);
> break;
> case '4': playgame(4);
> break;
> case '5': playgame(5);
> break;
> case '6': playgame(6);
> break;
> case '9': main();
Det er eksplisitt forbudt å kalle main.
> break;
> default: return;
> }
> }
> }
[ ... ]
Tenk at du taster inn 1, dvs. du skriver på konsollet tegnet '1'
etterfulgt av newline. I første omgang i gamemenu, vil man kalle
playgame(1), siden getc leser inn tegnet '1'. playgame( 1 ) vil skrive
Kategorien er: Matematiske begreber
.... og returnere tilbake til kalleren (dvs. gamemenu). Siden vi er i
en evig løkke, vil man fortsette til neste iterasjon, som begynner med
å "slette" nåværende skjermbildet (på en _usedvanlig_ grim måte, men
det er nå så). Siden tegnet '\n' ligger fortsatt i inputbufferet, vil
getc lese inn dette tegnet. Dette tilfellet er ikke listet opp
eksplisitt og man går dermed til default-grenen i switch. Mao. man
returnerer fra funksjonen gamemenu.
Hva er det du forventet at gamemenu - playgame skulle gjøre?
> case nr. 9 og 0 i switch(getc(stdin)) virker fint, men der sker ikke
> noget med resten.
Nei, tilfellet med nr. 9 virker slettes ikke fint.
> Mit andet problem er, at jeg ikke helt ved hvordan jeg skal læse fra
> en fil og tilfældig vælge et ord (den skal vel først "tælle" hvor
> mange ord der er i txt.filen?) og vise den med _ for hvert bogstav i
> stedet. Og hvad så hvis nogle af ordene er sætninger?
Dette problemet har ingenting med programmeringsspråket C å gjøre.
Hvis jeg ikke husker feil finnes det en gjennomgang av nettopp dette i
[1], [2] eller [3], dersom man har for dårlig tid til å titte i "The
art of computer programming". Problemet er nøyaktig det samme for ord
og setninger (tenk nøye på hvordan du definerer et "ord" og en
"setning" i dette tilfellet). I utgangspunktet -- fgetc + et par
hjelpefunksjoner for å manipulere vilkårlig lange strenger.
ivr
[1] ISBN 0-131-77429-8
[2] ISBN 0-201-61568-X
[3] ISBN 0-201-65788-0
--
<html><form><input type crash></form></html>
| |
Bertel Brander (25-07-2003)
| Kommentar Fra : Bertel Brander |
Dato : 25-07-03 22:59 |
|
Dorte Klerke wrote:
> Hej
> Jeg er lidt nybegynder til det her C, så derfor har jeg lidt problemer. Jeg
> er ved at lave et Hangman spil (skal afleveres den 11 august).
>
> Mit første problem er med min switch-løkke. Jeg kan ikke rigtig se hvad der
> er galt, men den virker ikke.
>
> ---snip---
> void gamemenu(void);
> void playgame(int gametype);
> ---snip---
>
> void gamemenu(void)
> {
> while(1)
> {
> printf("\n");
> system("clear");
> fflush(stdin);
> printf(""); /* En menu med oversigt over kategorier */
> printf("Indtast dit valg: ");
>
> switch(getc(stdin))
> {
> case '0': askexit();
Er du sikker på at du ikke vil have en break; her?
> case '1': playgame(1);
Her overfører du værdien 1 til funktionen playgame.
> break;
> case '2': playgame(2);
[snip]
> case '9': main();
> break;
> default: return;
> }
> }
> }
>
> void playgame(int gametype)
> {
> switch(gametype)
> {
> case '1':
Her tester du på karakteren '1'.
Så du skal enten overføre karakteren '1' til playgame eller lave
en case 1:
> printf("\nKategorien er: Matematiske begreber \n\n");
> break;
[snip]
> case '6':
> printf("\nKategorien er: Kendte personer \n\n");
> break;
> default: return; /* hvad skal den lave */
> }
>
> }
>
> case nr. 9 og 0 i switch(getc(stdin)) virker fint, men der sker ikke noget
> med resten.
>
>
> Mit andet problem er, at jeg ikke helt ved hvordan jeg skal læse fra en fil
> og tilfældig vælge et ord (den skal vel først "tælle" hvor mange ord der er
> i txt.filen?) og vise den med _ for hvert bogstav i stedet. Og hvad så hvis
> nogle af ordene er sætninger?
Man kan læse ord/sætninger fra en fil med fgets, og man kan så gemme dem
i et array f.ex "char word[MAX_NUM_WORDS][MAX_WORD_LENGTH];"
/b
| |
Kenan Vilic (26-07-2003)
| Kommentar Fra : Kenan Vilic |
Dato : 26-07-03 08:23 |
|
Hej
On Fri, 25 Jul 2003 22:58:01 +0200, "Dorte Klerke"
<dorte@home2.gvdnet.dk> wrote:
>void playgame(int gametype)
>{
> switch(gametype)
> {
> case '1':
> printf("\nKategorien er: Matematiske begreber \n\n");
> break;
> case '2':
> printf("\nKategorien er: Matematikere \n\n");
> break;
> case '3':
> printf("\nKategorien er: Frugt og gr\x9Bnt \n\n");
> break;
> case '4':
> printf("\nKategorien er: Madretter \n\n");
> break;
> case '5':
> printf("\nKategorien er: Tegnefilmsfigurer \n\n");
> break;
> case '6':
> printf("\nKategorien er: Kendte personer \n\n");
> break;
> default: return; /* hvad skal den lave */
> }
>
>}
Skal laves om til
void playgame(int gametype)
{
switch(gametype)
{
case 1:
printf("\nKategorien er: Matematiske begreber \n\n");
break;
case 2:
printf("\nKategorien er: Matematikere \n\n");
break;
case 3:
printf("\nKategorien er: Frugt og gr\x9Bnt \n\n");
break;
case 4:
printf("\nKategorien er: Madretter \n\n");
break;
case 5:
printf("\nKategorien er: Tegnefilmsfigurer \n\n");
break;
case 6:
printf("\nKategorien er: Kendte personer \n\n");
break;
default: return; /* hvad skal den lave */
}
}
Problemet her er at '1' oversat til integer er 0x31 (Hexadecimal) mens
1 = 0x01. Da du sender 1 i dine kald til funktionen skal du lave case
hvor du bruger 1.
SÃ¥ skulle de alle virke
Det med filen, hvad er formatet, er det mellemrum adskilt tekst, eller
er der et ord på hver linie eller tabulator. Hvis du skriver det kunne
jeg også godt hjælpe lidt der.
Med venlig hilsen
Kenan Vilic
| |
Dorte Klerke (26-07-2003)
| Kommentar Fra : Dorte Klerke |
Dato : 26-07-03 08:47 |
|
Tak for hjælpen, ja gættede mig til at '1' skulle være 1, af den forrige der
svarede, selvom det ikke var helt tydeligt, men rart med en forklaring
også.
> Det med filen, hvad er formatet, er det mellemrum adskilt tekst, eller
> er der et ord på hver linie eller tabulator. Hvis du skriver det kunne
> jeg også godt hjælpe lidt der.
>
Jeg ved ikke helt hvilket format der er bedst, men mit er txt. Jeg har 6
filer, svarende til de forskellige kategorier. I nogle er der kun ord på
hver linie, altså:
ord 1
ord 2
og nogle er der sætninger:
første ord
andet ord
og nogle blandet, så ingen tabularor.
Dorte
| |
Kenan Vilic (26-07-2003)
| Kommentar Fra : Kenan Vilic |
Dato : 26-07-03 10:19 |
|
On Sat, 26 Jul 2003 09:47:12 +0200, "Dorte Klerke"
<dorte@home2.gvdnet.dk> wrote:
>Tak for hjælpen, ja gættede mig til at '1' skulle være 1, af den forrige der
>svarede, selvom det ikke var helt tydeligt, men rart med en forklaring
>også.
>
>> Det med filen, hvad er formatet, er det mellemrum adskilt tekst, eller
>> er der et ord på hver linie eller tabulator. Hvis du skriver det kunne
>> jeg også godt hjælpe lidt der.
>>
>Jeg ved ikke helt hvilket format der er bedst, men mit er txt. Jeg har 6
>filer, svarende til de forskellige kategorier. I nogle er der kun ord på
>hver linie, altså:
>
>ord 1
>ord 2
>
>og nogle er der sætninger:
>
>første ord
>andet ord
>
>og nogle blandet, så ingen tabularor.
>
>Dorte
>
For at læse hele filen bruger jeg:
FILE *file;
file = fopen("data.txt", "r");
while(fgets(c, længden_af_den_største_tekstlinie, file)!=NULL)
//tælle hvor mange linier der er
hvor c er en char array der har længden_af_den_største_tekstlinie
elementer
og husker at lukke den når jeg er færdig:
fclose(file);
Når du ved hvor mange ord der er, kan du gøre følgende
random(antal_ord);
Dette burde give dig et helt tal der er tilfældigt og ligger melem 0
og antal af ord.
så læser du bare den nødvendige linie ved åbne filen forfra og læse så
mange gange som antal ord..
eller lade være med at lukke den ovenover og så bare bruge rewind();
hvis du vil erstatte bogstaverne bruger du en while
i=0;
while(c[i]!='\n')
{
c[i]='_';
i++
}
Hilsen
Kenan Vilic
| |
Dorte Klerke (26-07-2003)
| Kommentar Fra : Dorte Klerke |
Dato : 26-07-03 08:50 |
|
Alstå mit forrige problem virker fint, men jeg kan ikke rigtig forstår
hvorfor kategorimenuen kommer frem igen, hver gang den har udført f.eks.
case 1.
| |
Kent Friis (26-07-2003)
| Kommentar Fra : Kent Friis |
Dato : 26-07-03 09:00 |
|
Den Sat, 26 Jul 2003 09:50:02 +0200 skrev Dorte Klerke:
>Alstå mit forrige problem virker fint, men jeg kan ikke rigtig forstår
>hvorfor kategorimenuen kommer frem igen, hver gang den har udført f.eks.
>case 1.
Fordi du har puttet det hele ind i en while(1)?
Mvh
Kent
--
Journalist: En der har forstand på at skrive artikler, men typisk
ikke på det artiklerne handler om.
| |
Dorte Klerke (26-07-2003)
| Kommentar Fra : Dorte Klerke |
Dato : 26-07-03 09:03 |
|
> Fordi du har puttet det hele ind i en while(1)?
Men hvordan kan jeg så redde det?
| |
Kent Friis (26-07-2003)
| Kommentar Fra : Kent Friis |
Dato : 26-07-03 09:07 |
|
Den Sat, 26 Jul 2003 10:03:15 +0200 skrev Dorte Klerke:
>
>> Fordi du har puttet det hele ind i en while(1)?
>
>Men hvordan kan jeg så redde det?
Prøv at fjerne while(1)...
Mvh
Kent
--
Motion: andet ord for "ondt i fødderne".
| |
Dorte Klerke (26-07-2003)
| Kommentar Fra : Dorte Klerke |
Dato : 26-07-03 09:14 |
|
> >
> >> Fordi du har puttet det hele ind i en while(1)?
> >
> >Men hvordan kan jeg så redde det?
>
> Prøv at fjerne while(1)...
Synes jeg ikke rigtig hjælper
| |
Kenan Vilic (26-07-2003)
| Kommentar Fra : Kenan Vilic |
Dato : 26-07-03 09:53 |
|
On Sat, 26 Jul 2003 10:14:13 +0200, "Dorte Klerke"
<dorte@home2.gvdnet.dk> wrote:
>
>
>> >
>> >> Fordi du har puttet det hele ind i en while(1)?
>> >
>> >Men hvordan kan jeg så redde det?
>>
>> Prøv at fjerne while(1)...
>
>Synes jeg ikke rigtig hjælper
Det skulle det gøre, ellers plejer det at være på grund af mindre
kompiler /IDE problemer.
Hvis koden er ændret kan dit program være stadig det gamle som ikke
afspejler ændringernde.
Jeg ved ikke hvilken compiler eller IDE du har, men husk, at du skal
lukke dit kompilerede program hvis du har det kørende før du
kompilerer igen. Engang imellem hjælper det at lave en "rebuild" dvs
slette alle små output filer. (alt på nær kilde kode og projekt filer
til IDE) og kompilere igen.
mvh
Kenan Vilic
| |
|
|