Slovni fotbal po x-té – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Slovni fotbal po x-té – C / C++ – Fórum – Programujte.comSlovni fotbal po x-té – C / C++ – Fórum – Programujte.com

 

30. 4. 2013   #1
-
0
-

Ahoj, toto téma tu už kdysi bylo, ale nikde jsem nenašla funkční řešení. Mám pokus o program na Slovní fotbal, ale pokaždé mi vrátí odpověď, že slovo nebylo nalezeno ve slovníku. Prolezla jsem spoustu stránek, ale nikde jsem se nedočetla o funkčním řešení. Pomůžete, prosím? Děkuju

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int kontrola(char *slovo_s)
{
    FILE *fr;
    fr = fopen ("slovnik.txt", "r");
    char slovo[1024];
if ((fr = fopen("slovnik.txt", "r")) == NULL)
{
  printf ("Soubor se nepodarilo otevrit.\n");
  system ("pause");
  return 1;
}

int i;
    while (fgets(slovo, sizeof (slovo), fr) != NULL) 
{
        int znaku = 0;
        for (i = 0; i < sizeof (slovo); i++) {
            if (slovo[i] == ';') {
                break;
            }
            znaku++;
        }
        char slovo_t[znaku+1];
        for (i = 0; i < znaku; i++) {
            slovo_t[i] = slovo[i];
        }
        if (strcmp(slovo_s, slovo_t) == 0) {
            fclose(fr);
            return 1;
        }
    }
    fclose(fr);
    return 0;
}

int main(int argc, char** argv) {
    char slovo [50], temp [50], p;
    int error = 0;

    printf("SLOVNI FOTBAL\n");
    printf("tady budou pravidla hry\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 nezacina znakem '%c'\n", p);
            error++;
        } else if (kontrola(slovo) == 0) {
            printf("Slovo neni ve slovniku!\n");
            error++;
        }
        if (error > 0) {
            printf("Vitezem se stava hrac %d.\n", hrac == 1?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);
}

Nahlásit jako SPAM
IP: 62.141.0.–
30. 4. 2013   #2
-
0
-

každopádně bych soubor se slovníkem otevřel jen jednou např. na záčátku funkce main a na jejím konci bych soubor zavřel. Pokud fgets přečte řádek, je ve výsledném řetězci uložen vč. znaku ukončíjícího řádek, např přečte "ahoj<CR><LF>". Když to pak porovnáš s řetězcem "ahoj"... Další věc je sizeof(slovo), pravděpodobně vrátí 4, protože slovo je *char, tedy pointer. Pro délku řetězce je funkce strlen.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
KIIV
~ Moderátor
+43
God of flame
30. 4. 2013   #3
-
0
-

me to funguje... mas ve slovniku slova ukoncena strednikem?  zda se ze se s nim docela pocita ... jinak se tam asi objevi i konec radku a tak..

urcite bych spis pro pocitani delky slova pouzil radeji jestli to je 'a' az 'z' .. cekat strednik a nekontrolovat ani nesmyslny znaky je proste cesta do pekla

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
30. 4. 2013   #4
-
0
-

#3 KIIV
Díky moc. Soubor má strukturu:

auto;
skola;
topeni;
televize;

Dělám to v codelite. Nemůže to být nějakým nastavením? Jsem fakt lama.

Nahlásit jako SPAM
IP: 62.141.0.–
30. 4. 2013   #5
-
0
-

#2 hlucheucho
super, díky :-) Udělám.

Nahlásit jako SPAM
IP: 62.141.0.–
KIIV
~ Moderátor
+43
God of flame
30. 4. 2013   #6
-
0
-

no ja sem pouzil slova ktery sem mohl navazovat ...

auto;
vaha;
ovar;
ryba;
kov;
kolecek;
rak;

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
30. 4. 2013   #7
-
0
-

#6 KIIV
tak daleko (do navazování) jsem se nikdy nedostala  

Nahlásit jako SPAM
IP: 62.141.0.–
KIIV
~ Moderátor
+43
God of flame
30. 4. 2013   #8
-
0
-

tak si holt vypisovat slova pred strcmp ...  printf("srovnavam: '%s' s '%s'\n",slovo_s, slovo_t);  tolik jich ve slovniku neni a mozna bude videt jestli ty uvozovky jsou na spravnem miste

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
30. 4. 2013   #9
-
0
-

#2 hlucheucho
char slovo[1024];   sizeof(slovo) by mel fungovat.. jen to hodi celou velikost pole... ne aktualni delku

i vypis potvrzuje: sizeof(slovo)=1024

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ingiraxo+15
Grafoman
30. 4. 2013   #10
-
0
-

Ty slova si nejdříve načti do paměti, at nemusíš procházet soubor při každý kontrole.. čili lehká kostra ->



#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static char** g_words = NULL;
static int g_totalWords = 0;

int loadWords(const char* filename)
{
    FILE* file = fopen(filename, "r");
    char buffer[1024];
    int line = 0;

    if (!file)
    {
        printf("Soubor se nepodarilo otevrit nebo neexistuje!");
        return EXIT_FAILURE;
    }
    else
    {
        printf("Probiha nacitani slov do slovniku...\n");
    }

    while (fgets(buffer, sizeof(buffer), file))
    {
        size_t length = strlen(buffer);

        if (length > 0)
            *(buffer + length - 1) = '�';

        if (!line)
        {
            g_words = (char **)calloc(atoi(buffer), sizeof(char *));
        }
        else if (length > 0)
        {
            printf("Load: %s\n", buffer);
            *(g_words + g_totalWords) = (char *)calloc(length, sizeof(char));
            memcpy(*(g_words + g_totalWords), buffer, length);
            ++g_totalWords;
        }
        ++line;
    }

    fclose(file);
    return EXIT_SUCCESS;
}

void unloadWords()
{
    if (g_words)
    {
        int i;
        for (i = 0; i < g_totalWords; ++i)
        {
            free(*(g_words + i));
        }
        free(g_words);
    }
}

int constainsWord(const char* word)
{
    int i;

    if (!g_words || !word)
        return EXIT_FAILURE;

    for (i = 0; i < g_totalWords; ++i)
    {
        if (!strcmp(*(g_words + i), word))
            return EXIT_SUCCESS;
    }
}

int main(int argc, char** argv)
{
    // deklarace a initializace promennych

    if (loadWords("slovnik.txt") == EXIT_FAILURE)
        return EXIT_FAILURE;

    printf(":: SLOVNI FOTBAL ::\n");
    printf("-> tady budou pravidla hry\n");

    // nacitani znaku/slov z konzole a cela logika

    unloadWords();
    return EXIT_SUCCESS;
}

jinak porovnání slov, jestli se slovo vyskytuje ve slovníku máš jako: 



if (constainsWord("auto") != EXIT_FAILURE)
{
    // slovo tam existuje
}

Ve slovníku žádný slovo není ukončený středníkem !!!

PS: Lepší by to bylo přes struktůry (minimálně pohodlnější)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
1. 5. 2013   #11
-
0
-

#10 ingiraxo
Díky :-) To víš, lidi kteří to nikdy nedělali, to takhle nevymyslí. Ale vypadá to dobře :-)

Nahlásit jako SPAM
IP: 94.113.17.–
1. 5. 2013   #12
-
0
-

#8 KIIV
Tak výsledek byl, že slovo se porovnalo, ale nevyhodnotilo, že je to správně

Nahlásit jako SPAM
IP: 94.113.17.–
KIIV
~ Moderátor
+43
God of flame
1. 5. 2013   #13
-
0
-

#12 stoponozka
tak jinej kompilator .. to neni mozne

Nahlásit jako SPAM
IP: 86.49.86.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 41 hostů

Podobná vlákna

Slovni fotbal — založil Dominik Rozporka

Slovní fotbal — založil zstib

Slovni fotbal — založil fotbal

Slovní úloha — založil RocketBG

Slovní úloha — založil prasokure

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý