Autor | Zpráva | ||
---|---|---|---|
michalka44 Profil |
#1 · Zasláno: 10. 1. 2011, 17:03:20
Ahoj,
mám program: Slovní fotbal. Chtěla bych však, aby zadaná slova byla kontrolována z příslušného souboru, který obsahuje slova. Každé slovo je na novém řádku. Chtěla bych to udělat přes funkci, něco málo mám, ale nevím si vůbec rady #include <stdio.h> #include <string.h> char kontrola () { FILE *f; f = fopen("slova.txt","r"); char slovo; while ((slovo = fgets(f))!= EOF) { ... (tady nevím, co mám dát) } rewind (f); fclose(f); } int main(void) { char slovo_1[20], slovo_2[20]; char p1, p2, end; int i, error = 0; printf("SLOVNI FOTBAL\n"); printf("Zadej pismeno, jimz bude hra zacinat: "); scanf("%c", &p2); do { printf("Hrac 1: Zadej slovo: "); scanf("%s", slovo_1); *kontrola (char * slovo_1, char *f); //tady nevím, jak to zapsat ... if (p2 != slovo_1[0]) { printf("Slovo nezacina znakem '%c'\n", p2); printf("Vitezem se stava hrac 2.\n"); error++; printf("Pokracuj stiskem klavesy... "); scanf("%i", &end); return 1; } p1 = slovo_1[strlen(slovo_1) - 1]; printf("Hrac 2: Zadej slovo: "); scanf("%s", slovo_2); if (p1 != slovo_2[0]) { printf("Slovo nezacina znakem '%c'\n", p1); printf("Vitezem je hrac 1.\n"); error++; printf("Pokracuj stiskem klavesy a ENTERem... "); scanf("%i", &end); return 1; } p2 = slovo_2[strlen(slovo_2) - 1]; } while (error <= 0); return 0; } |
||
king26 Profil |
#2 · Zasláno: 10. 1. 2011, 18:51:17 · Upravil/a: king26
Píši to z hlavy, nechce se mě pouštět NetBeans.
#include <stdio.h> #include <string.h> bool kontrola (char *slovo_s) { FILE *f; f = fopen("slova.txt","r"); char *slovo; while ((slovo = fgets(f))!= EOF) { if(strcmp(slovo_s, slovo)==0) { fclose(f); return true; } } fclose(f); return false; } int main(void) { char *slovo_1, *slovo_2; char p1, p2, end; int i, error = 0; printf("SLOVNI FOTBAL\n"); printf("Zadej pismeno, jimz bude hra zacinat: "); scanf("%c", &p2); do { printf("Hrac 1: Zadej slovo: "); scanf("%s", slovo_1); if(kontrola (slovo_1)) printf("slovo je v souboru"); if (p2 != slovo_1[0]) { printf("Slovo nezacina znakem '%c'\n", p2); printf("Vitezem se stava hrac 2.\n"); error++; printf("Pokracuj stiskem klavesy... "); scanf("%i", &end); return 1; } p1 = slovo_1[strlen(slovo_1) - 1]; printf("Hrac 2: Zadej slovo: "); scanf("%s", slovo_2); if (p1 != slovo_2[0]) { printf("Slovo nezacina znakem '%c'\n", p1); printf("Vitezem je hrac 1.\n"); error++; printf("Pokracuj stiskem klavesy a ENTERem... "); scanf("%i", &end); return 1; } p2 = slovo_2[strlen(slovo_2) - 1]; } while (error <= 0); return 0; } Upravil jsem funkci + volání funkce, celé se mě to zdá ale divný. EDIT: funkce na porovnání je strcmp() |
||
michalka44 Profil |
#3 · Zasláno: 11. 1. 2011, 11:55:32
Děkuji, ale bohužel stejně nevím, jak dál... pořád mi to nějak nepíše.. Spíš potřebuju, aby to napsalo chybu, když vlastně v daném souboru to slovo nebylo, tak by to mělo napsat: Slovo není ve slovníku. Ale jsem vážně na pokraji svých sil :(
|
||
TomášK Profil |
#4 · Zasláno: 11. 1. 2011, 16:25:18
michalka44:
Musí to být v C? Pokud ne, doporučuju to napsat v nějakém srkiptovacím jazyce, který ti usnadní věci jako práci s pamětí apod. (Python, Ruby) - načtení a vyhledávání ve slovníku tam je "zadarmo", bude jednodušší to odladit, mají snadno naučitelnou syntaxi. „pořád mi to nějak nepíše“ A program dokážeš zkompilovat? Spustí se? To, co napsal king26 vypadá, že by mohlo po drobných úpravách fungovat (fgets má jiné parametry, víc toho nevidím). Zkoušela jsi to? |
||
king26 Profil |
#5 · Zasláno: 11. 1. 2011, 17:05:55
TomášK:
„fgets má jiné parametry“ Toho jsem si ani nevšiml. Je to samozřejmě špatně. bool kontrola(char *slovo_s) { FILE *f; f = fopen("slova.txt", "r"); char slovo[1024]; while (fgets(slovo, sizeof (slovo), f) != NULL) { if (strcmp(slovo_s, slovo) == 0) { fclose(f); return true; } } fclose(f); return false; } int main(void) { char *slovo; char p, end; int error = 0; printf("SLOVNI FOTBAL\n"); printf("Zadej pismeno, jimz bude hra zacinat: "); scanf("%c", &p); int hrac = 1; do { printf("Hrac " + hrac + ": Zadej slovo: "); scanf("%s", slovo); if (!kontrola(slovo)) { printf("Slovo není ve slovníku!"); error++; } else if (p != slovo[0]) { printf("Slovo nezačíná znakem '%c'\n", p); error++; } else { if (error > 0) { printf("Vítězem se stává hráč " + (hrac == 1 ? 1 : 2) + ".\n"); break; } else { p = slovo[strlen(slovo) - 1]; if (hrac == 1) { hrac++; } else { hrac = 1; } } } } while (error <= 0); printf("Pokracuj stiskem klavesy... "); scanf("%i", &end); return 0; } Je to předělané, ale netestovaný - ale mělo by to fungovat. |
||
michalka44 Profil |
#6 · Zasláno: 11. 1. 2011, 18:30:27
No musí to být právě v C, jsem s programováním teprve v začátcích, ale bohužel to není asi šálek mého čaje... Děkuji moc, že jste si dali práci. Stejně mi to nevypisuje chybu v případě, že tam to slovo není. V jaké knihovně je bool? není to třeba tím?
|
||
TomášK Profil |
#7 · Zasláno: 11. 1. 2011, 19:25:40
michalka44:
bool je v součástí nového standardu jazyka C99 (tedy, on už moc nový není :-)), který zavádí i knihovnu stdbool.h. Je možné, že používáš starší normu jazyka (záleží na kompilátoru a jeho parametrech), která bool ještě nezná. Dřív se místo bool používal int - hodnota 0 odpovídá boolovskému false, vše ostatní je true. Pokud nahradíš bool za int, bude to též fungovat. |
||
michalka44 Profil |
#8 · Zasláno: 11. 1. 2011, 19:37:45
TomášK:
aha :) děkuji, stejně mě to nefunguje :-D zkusím to projít od začátku, snad na to dojdu :) |
||
michalka44 Profil |
#9 · Zasláno: 11. 1. 2011, 19:41:20
Můžu se ještě zeptat, podmínka if (!kontrola(slovo)) znamená co? Já když jsem vždy používala podmínku if, tak jsem tam dávala jakoby if ( x != 5) apod. proč je tam ten otazník před slovem kontrola?
|
||
TomášK Profil |
#10 · Zasláno: 11. 1. 2011, 20:07:07
michalka44:
S trochu zjednodušení if() dostává jako parametr číslo. Pokud jeho hodnota není 0, provede se první větev, pro 0 else větev. if(x) je totéž jako if(x != 0) if(0) { /* toto nikdy se neprovede */ } |
||
king26 Profil |
#11 · Zasláno: 11. 1. 2011, 22:34:04 · Upravil/a: king26
Tak dobrá - teď jsem již NetBeans otevřel. Toto je hotová funkční verze.
#include <stdio.h> #include <stdlib.h> #include <string.h> int kontrola(char *slovo_s) { FILE *f; f = fopen("slova.txt", "r"); char slovo[1024]; int i; while (fgets(slovo, sizeof (slovo), f) != NULL) { int znaku = 0; for (i = 0; i < sizeof (slovo); i++) { if (slovo[i] == ';') { break; } znaku++; } char slovo_t[znaku]; for (i = 0; i < znaku; i++) { slovo_t[i] = slovo[i]; } if (strcmp(slovo_s, slovo_t) == 0) { fclose(f); return 1; } } fclose(f); return 0; } int main(int argc, char** argv) { char slovo [50], temp [50], p; int error = 0; printf("SLOVNI FOTBAL\n"); printf("Zadej pismeno, jimz bude hra zacinat: "); scanf("%s", temp); p = temp[0]; int hrac = 1; do { printf("Hrac %d -> Zadej slovo: ", hrac); scanf("%s", slovo); if (p != slovo[0]) { printf("Slovo nezačíná znakem '%c'\n", p); error++; } else if (kontrola(slovo) == 0) { printf("Slovo není ve slovníku!\n"); error++; } if (error > 0) { printf("Vítězem se stává hráč %d.\n", hrac ? 2 : 1); break; } else { p = slovo[strlen(slovo) - 1]; if (hrac == 1) { hrac++; } else { hrac = 1; } } } while (error <= 0); printf("Pokracuj stiskem klavesy... "); return (EXIT_SUCCESS); } slova.txt vypadá potom nějak takto: ahoj; cau; cus; jaj; juk; kutalet; tocit; |
||
michalka44 Profil |
#12 · Zasláno: 13. 1. 2011, 13:22:07
no já používám codelite... děkuji moc... jen sice mi to furt pise, ze slovo neni ve slovniku, i kdyz tam je :( ale to je uz jedno, i tak děkuji :) ... můžu se zeptat, co znamená hrac ? 2 : 1
|
||
Keeehi Profil |
#13 · Zasláno: 13. 1. 2011, 18:15:37 · Upravil/a: Keeehi
|
||
king26 Profil |
#14 · Zasláno: 14. 1. 2011, 10:44:25
michalka44:
„jen sice mi to furt pise, ze slovo neni ve slovniku, i kdyz tam je“ Máš ten soubor v adresáři spolu s main.c? Má soubor strukturu, jakou jsem nastínil? Mě vše fungovalo. „můžu se zeptat, co znamená hrac ? 2 : 1“ Jak už napsal Keeehi, každopádně to tam mám zapsané špatně. Mělo by to být takto: hrac==1?2:1 Hodnota proměnné hráč má totiž hodnoty 1 a 2. |
||
Časová prodleva: 13 let
|
0