void v C

Programovacie jazyky, rady, poradňa...
Madeyro
Medium Expert
Medium Expert
Príspevky: 122
Registrovaný: 10 jan 2008, 18:26

void v C

Príspevok od používateľa Madeyro »

V programe mam 2 takmer identicke voidy, no jeden z nich mi nefunguje ako by mal. Hodiny do toho cumim a neviem nic najst.
void turn_hrac1 funguje a void turn_hrac2 uz nie tak celkom.

Kód: Vybrať všetko

void turn_hrac1()
{
    int nbr;
    char ltr;
    printf("\n\n");
    do
    {
        scanf("%c%d",&ltr,&nbr);
        switch (ltr)
        {
            case 'A':
                {
                    if(nbr==1)   array[0][0]='O';
                    else
                    {   if(nbr==2)   array[1][0]='O';
                        else
                        {   if(nbr==3)   array[2][0]='O';
                            else    printf("Zadal si zle cislo\n");
                        }
                    }
                    break;
                }
            case 'B':
                {
                    if(nbr==1)   array[0][1]='O';
                    else
                    {   if(nbr==2)   array[1][1]='O';
                        else
                        {   if(nbr==3)   array[2][1]='O';
                            else    printf("Zadal si zle cislo\n");
                        }
                    }
                    break;
                }
         case 'C':
                {
                    if(nbr==1)   array[0][2]='O';
                    else
                    {   if(nbr==2)   array[1][2]='O';
                        else
                        {   if(nbr==3)   array[2][2]='O';
                            else    printf("Zadal si zle cislo\n");
                        }
                    }
                    break;
                }
        }
    }
    while(nbr>3||nbr<1);
}

void turn_hrac2()
{
    int nbr;
    char ltr;
    printf("\n\n");
    do
    {
        scanf("%c%d",&ltr,&nbr);
        switch (ltr)
        {
            case 'A':
                {
                    if(nbr==1)   array[0][0]='X';
                    else
                    {   if(nbr==2)   array[1][0]='X';
                        else
                        {   if(nbr==3)   array[2][0]='X';
                            else    printf("Zadal si zle cislo\n");
                        }
                    }
                    break;
                }
            case 'B':
                {
                    if(nbr==1)   array[0][1]='X';
                    else
                    {   if(nbr==2)   array[1][1]='X';
                        else
                        {   if(nbr==3)   array[2][1]='X';
                            else    printf("Zadal si zle cislo\n");
                        }
                    }
                    break;
                }
         case 'C':
                {
                    if(nbr==1)   array[0][2]='X';
                    else
                    {   if(nbr==2)   array[1][2]='X';
                        else
                        {   if(nbr==3)   array[2][2]='X';
                            else    printf("Zadal si zle cislo\n");
                        }
                    }
                    break;
                }
        }
    }
    while(nbr>3||nbr<1);
}
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: void v C

Príspevok od používateľa c-ice »

myslim ze hovoris o Funkciách z návratovou hodnotou typu void ... takze nie o voidoch ale o funkciach ...

Do toho sa hodiny necumi (k nicomu to nevedie) ale ma sa to Debugovať

1. zbytocne zlozite rozhodovanie
2. nadbytocna funkcia ta druha funkcia je uplne zbytocna
3. mas premennu Array globalnu ? a co znamena v tvojom ponimani nefunguje

EDIT: takto namiesto dvoch dlhych funkcii ti staci jedna :psssst:

Kód: Vybrať všetko

void turn(char hracovSymbol)
{
    int nbr;
    char ltr;
    printf("\n\n");
    while(true)
    {
        scanf("%c%d",&ltr,&nbr);
        if (nbr >= 1 && nbr <= 3 && 
            ltr >= 'A' && ltr <= 'C')
        {
                array[nbr - 1][ltr-65] = hracovSymbol;
                break;
        }

        printf("Zadal si zle cislo\n");
    }
}
Madeyro
Medium Expert
Medium Expert
Príspevky: 122
Registrovaný: 10 jan 2008, 18:26

Re: void v C

Príspevok od používateľa Madeyro »

Ano array je zadefinovana ako globalna premenna. Tvoj kod je jednoduchsi no myslim ze nerobi to iste ako moj. Za domacu ulohu sme dostali naprogramovat piskvorky. Toto malo riesit kde chce hrac umiestnit svoj znak X/O. Ale skusim to s void turn(char hracovSymbol).
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: void v C

Príspevok od používateľa c-ice »

pokial nehadze chybu tak robi to co ma :) tvoj switch som nahradil tymto [ltr-65] ... a tie ify co ich mas mrte som nahradil tymto [nbr - 1] ... je to presne alternativa ku tomu tvojmu kodu osobne by som este dodal kontrolu ci v hracom policku sa uz nenachadza zadana hodnota ... ale ak ti to nejde tak ukaz Main ako to tam pouzivas alebo cely zdrojak...
Madeyro
Medium Expert
Medium Expert
Príspevky: 122
Registrovaný: 10 jan 2008, 18:26

Re: void v C

Príspevok od používateľa Madeyro »

k tej podmienke ci sa tam uz nieco nachadza som sa este nedostal. Errory mi to nehadze ale funguje to nasledovne:
Hrac jedna zada a tam kde zadal vpise O, no hrac dva zada, no nic sa nestane, nevpise nikde X. A ano, uz chapem ako fungujte to [ltr-65] [nbr - 1] :).

//autoeditácia príspevku (29 Feb 2012, 22:42)
Pole som zväcsil a podmienku trosku upravil:

Kód: Vybrať všetko

void turn(char playersSymbol)
{
    int nbr;
    char ltr;
    printf("\n\n");
    while(true)
    {
        scanf("%c%d",&ltr,&nbr);
        if (nbr >= 1 && nbr <= 15 && ltr >= 'A' &&
        ltr <= 'O' && array[ltr-65][nbr-1] == '#')
        {
                array[ltr-65][nbr-1] = playersSymbol;
                break;
        }

        printf("Zadal si zle cislo alebo pismeno. Tvoj tah zadavaj v tvare 'A1'\n");
    }
}
Mam vsak problem, ze mi ten printf vypisuje aj ked netreba. Potrebujem toto opakovanie zadavat opakovane, no vypisuje mi to hned pri tom ako zada tah hrac cislo 2.
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: void v C

Príspevok od používateľa c-ice »

1. debug debug debug ...

2. mozes skusit namiesto Break dat return ale myslim ze to je o tom istom ...

pridaj zvysok kodu toto je podla mna OK
Madeyro
Medium Expert
Medium Expert
Príspevky: 122
Registrovaný: 10 jan 2008, 18:26

Re: void v C

Príspevok od používateľa Madeyro »

Prikladam cely zdrojak.
Prílohy
Desktop.zip
(7.13 KiB) 18 stiahnutí
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: void v C

Príspevok od používateľa c-ice »

ten Scanf je nejaky dodrbany zabudol som si na private nabijacku takze tym cas mrhat nebudem uz ale nechapem preco to robi tak ako to robi vo Visual Studiu ked debugujem tak to nacitava prazdne veci cely zle je ten SCANF skus pouzit alternativu napr.

char koordinaty[3];
...
gets(koordinaty);
sscanf(koordinaty, "%c%d", &ltr, &nbr);
....
Madeyro
Medium Expert
Medium Expert
Príspevky: 122
Registrovaný: 10 jan 2008, 18:26

Re: void v C

Príspevok od používateľa Madeyro »

Teraz neviem ci mi radis aby som to robil cez pole alebo string. Podla mna so scanf nie je problem, skor by tom to vydel v cykle.

edit// Napisal som to presne tak ako si mi poradil (ako si to napisal) a funguje to uz. Mozes mi vysvetlit, co som to vlastne napisal? :D Musim to nejak vysvetlit ucitelke, ze preco je to tam :wink:
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: void v C

Príspevok od používateľa c-ice »

podla mna ten Scanf nenacital Enter a teda ostal stat (ked to beres ako stream) a ked isiel znova cyklus tak ten scanf nacital ten enter a vyhodil chybu ze nacital zle tak to vychadzalo z debugu ... a potom znova sa pytal co a nacital uz spravne ... to bol problem ktoremu nechapem preco nastal mne sa to asi este nestalo ...

a toto riesenie je ze som na nacitavanie zo vstupu pouzil funkciu gets() ... ktora do pola znakov nacita cely zadany riadok takze vyprazdni cely "stream" ktory caka na vstupe a ulozi do pola ...

a sscanf som pouzil na jednoduche nacitanie z pamäte cize z toho pola charov som to "vyparsoval"/nacital takymto jednoduchym prikazom
Madeyro
Medium Expert
Medium Expert
Príspevky: 122
Registrovaný: 10 jan 2008, 18:26

Re: void v C

Príspevok od používateľa Madeyro »

Dakujem, velmi si mi pomohol. A ten cyklus while(true) sa da pouzit aj v C, alebo len v C++?
Numline1
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 858
Registrovaný: 04 dec 2006, 18:04

Re: void v C

Príspevok od používateľa Numline1 »

Ak sa nepletiem, tak C nema definovane true a false, takze skus while(1)
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: void v C

Príspevok od používateľa c-ice »

myslim ze sa pleties podla mna true/false má... ono ako to je reprezentovane v pozadi je jedno uz ... kludne namiesto true tam moze byt (1==1) 2==2 .... aka kolvek pravda :) alebo to true false mozu byt kludne makra ktore preprocessor nahradi 1/0 ... myslim ze je to uplne jedno... proste true je vec ktora musi fungovat vsade
A ten cyklus while(true) sa da pouzit aj v C
samozrejme to neni ziadna specialna konstrukcia ak sa ti nepozdava pouzi 1=1 namiesto true ... C a C++ mas vzaklade to iste c++ pridava nejake nove kniznice, Stream-y a potom tie veci okolo OOP ... ale na tejto nizkej urovni rozdiel ktory som v skole videl bolo iba medzi tym ze v C++ som pisal cout << namiesto printf() v C ...
+ v novom C++11 pribudli "auto" a Lambda výrazy atď...
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8223
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: void v C

Príspevok od používateľa harrison314 »

C nema true, false ani boolean, C++ uz ano,
no v C su definovane napriklad vo windows.h
Este tak medzi recou, namisto while(1) odporucam pouzivat for(;;), kod je citatelnejsi.
Numline1
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 858
Registrovaný: 04 dec 2006, 18:04

Re: void v C

Príspevok od používateľa Numline1 »

c-ice napísal:myslim ze sa pleties podla mna true/false má... ono ako to je reprezentovane v pozadi je jedno uz ... kludne namiesto true tam moze byt (1==1) 2==2 .... aka kolvek pravda :) alebo to true false mozu byt kludne makra ktore preprocessor nahradi 1/0 ... myslim ze je to uplne jedno... proste true je vec ktora musi fungovat vsade


samozrejme to neni ziadna specialna konstrukcia ak sa ti nepozdava pouzi 1=1 namiesto true ... C a C++ mas vzaklade to iste c++ pridava nejake nove kniznice, Stream-y a potom tie veci okolo OOP ... ale na tejto nizkej urovni rozdiel ktory som v skole videl bolo iba medzi tym ze v C++ som pisal cout << namiesto printf() v C ...
+ v novom C++11 pribudli "auto" a Lambda výrazy atď...
Zle si ma pochopil. Myslel som priamo vyrazy "true" a "false" (pokial si ich nedefinujes tak nefunguju). Je samozrejme, ze jazyk, ktory ma v sebe zakomponovane podmienky ich zvlada... Naviac pouzitie 1 = 1 v podmienke je zbytocne priradovanie, cize sa ti vykona +n opakovani (priradeni) pri kazdom spusteni, jednotka tam bohate staci.
Napísať odpoveď