Autor Zpráva
michalka44
Profil
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
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
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
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
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
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
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
TomášK:
aha :) děkuji, stejně mě to nefunguje :-D zkusím to projít od začátku, snad na to dojdu :)
michalka44
Profil
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
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)
. Pokud tam dáš něco jiného než číslo, převede se to na číslo. Tj můžeš psát
if(0) { /* toto nikdy se neprovede */ }
. Operátory == nebo != porovnají dvě hodnoty a vrátí číslo: 1 resp. 0, můžeš si vyzkoušet třeba (5 != 3) == 0 (výsledek bude 1) apod. Vykřičník je další z operárorů - "not" - z 0 dělá nenulu a naopak.
king26
Profil
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
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
michalka44:
hrac ? 2 : 1
Zkrácený zápis ifu. (Ternární operátor)
if(hrac==true){
  2
}
else {
  1
}
king26
Profil
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.

Vaše odpověď

Mohlo by se hodit

Příspěvky nesouvisející s webem budou odstraněny.

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: