kde som spravil chybu?

C,C++,C#

Moderátori: psichac, Moderátori

logarytmus
Okoloidúci
Okoloidúci
Príspevky: 42
Dátum registrácie: 10 Apr 2014, 17:29

kde som spravil chybu?

Príspevok od používateľa logarytmus » 05 Jan 2015, 23:27

caute, mam program:
# include <stdio.h>

int main() {

char x;
int y, z;
y=0;

while(z!=5) {
x=getchar();

if (x=='+'){
y++;
}
if (x=='-'){
y--;
}
printf("%d\n", y);
}

return 0;
}

no a je taku problem ze ked stlacim napr + vypiseme ze:1
1
vypise proste 2krat jednotku za sebou a vobec nvm preco?
0

stefanSK
Pokročilý člen
Pokročilý člen
Príspevky: 752
Dátum registrácie: 24 Jún 2010, 00:00
Bydlisko: Trnava
Vek: 68

Re: kde som spravil chybu?

Príspevok od používateľa stefanSK » 06 Jan 2015, 00:47

V programe nie je chyba, ale niektoré špeciálne klávesy ako napr. šípky, Home, .. generujú dva znaky 0x00 a kód klávesy.Neviem isto, ale si stláčal klávesu "+" na numerickej klávesnice?
Na overenie môjho tvrdenia prerob program tak, že nahradíš test na napr. 'A' a vyskúšaj.
0
S.K.

majky1113
Okoloidúci
Okoloidúci
Príspevky: 1
Dátum registrácie: 06 Jan 2015, 00:55

Re: kde som spravil chybu?

Príspevok od používateľa majky1113 » 06 Jan 2015, 00:58

Kód: Vybrať všetko

# include <stdio.h>

int main() {

char x;
int y;
y = 0;

while(1) {
x = getchar();

if (x == '+'){
y++;
printf("%d\n", y);
}
else if (x == '-')
{
y--;
printf("%d\n", y);
}

}

return 0;
}
0

Samanko
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1106
Dátum registrácie: 03 Máj 2013, 16:18
Bydlisko: Up there in the sky

Re: kde som spravil chybu?

Príspevok od používateľa Samanko » 06 Jan 2015, 01:46

Kód: Vybrať všetko

# include <stdio.h>
# include<conio.h>

int main(void)
{
    char x;
    int  y=0,
         z;

    while(z!=5){
      x=getch();

      if(x=='+')
        y++;
      if (x=='-')
        y--;

      printf("%d\n", y);
    }

     return 0;
}

or s minimalnymi zmenami

Kód: Vybrať všetko

#include<stdio.h>

int main() 
{

    char x;
    int  y, z;  // 'z' nema zmysel !
         y=0;   //mozes priradit hodnotu aj hned: int y=0;

    while(z!=5){
      x=getchar();

      if (x=='\053'){   //kuk ASCII
        y++;
        continue;
      }
      if (x=='\055'){   //kuk ASCII
        y--;
        continue;
      }
      printf("%d\n", y);
    }

    return 0;
}
Cele to je nedomyslene, ale pricip dufam chapes. Inak, premenna z nemeni hodnotu/nic s nou nerobis.
0
“Strong people don't put others down... They lift them up.“ Michal P. Watson.
„Pravda musí čelit více zkoumajícím pohledům !"
„We cannot choose our external circumstances, but we can always choose how we respond to them'' Epiktetos

logarytmus
Okoloidúci
Okoloidúci
Príspevky: 42
Dátum registrácie: 10 Apr 2014, 17:29

Re: kde som spravil chybu?

Príspevok od používateľa logarytmus » 06 Jan 2015, 02:15

Dakujem uz to funguje

Vlastne tam stacilo dat to continue. Ale co mi to vlastne sposobilo to continue ze to uz teraz zrazu ide? V com bola pred tym chyba?
0

Samanko
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1106
Dátum registrácie: 03 Máj 2013, 16:18
Bydlisko: Up there in the sky

Re: kde som spravil chybu?

Príspevok od používateľa Samanko » 06 Jan 2015, 10:17

Uklada ti aj stlacene '\n' (enter, ktorym tu hodnotu potvrdzujes.) Kedze '\n' nieje +/-, tak program prebehne obidva if bez splnenej podmienky a vytlaci vysledok znovu, ktory je rovnaky - kedze sa premenna ani nezvacsovala a ani nezmensovala.

Preto musis bud pouzit iny tvar citania znaku, aby cital len jeden /* x=getch(), printf("%c\n",&x) */ ... alebo to neak inak osetrit.
Napriklad:

Kód: Vybrať všetko

# include <stdio.h>

int main() {

char x;
int y, z;
y=0;

while(z!=5) {
x=getchar();

if (x=='+'){
y++;
}
if (x=='-'){
y--;
}
while(getchar()!='\n')
;   //preskoci vsetky znaky stlacene do '\n' .
printf("%d\n", y);
}

return 0;
}
alebo dalsich vela moznosti. To continue; je interacny prikaz, ktory skace na koniec najvnutornejsej smycky a nuti ju k opakovaniu.

Cize ked tam napises to '+' desat krat pri jednom citani znaku (naraz), tak ti desat krat prebehne cyklus s y++ a ked pride na znak, ktory nieje ani '+' ani '-' tak vytlaci vysledok - teda to nieje bohvieake riesenie.
0
Naposledy upravil/-a Samanko v 06 Jan 2015, 14:00, upravené celkom 1 krát.
“Strong people don't put others down... They lift them up.“ Michal P. Watson.
„Pravda musí čelit více zkoumajícím pohledům !"
„We cannot choose our external circumstances, but we can always choose how we respond to them'' Epiktetos

logarytmus
Okoloidúci
Okoloidúci
Príspevky: 42
Dátum registrácie: 10 Apr 2014, 17:29

Re: kde som spravil chybu?

Príspevok od používateľa logarytmus » 06 Jan 2015, 12:07

a to je vlastnost getchar() ze mi uklada do premenej aj to \n?

A kedze program prebehne bez obidvoch splnenych podmienok tak by hodnota ktoru bude vypisovat mala byt stale 0 nie?
Ked sa nic nezvecsovalo ani nezmensovalo. Ale to hodnutu aj stale inkrementuje alebo dekrementuje a vypise dvakrat po stalceni + alebominus zakazdym.

Alebo je to tak ze najpr precita znak + alebo minus prvy krat to prebehne a druhy krat cita znak \n a to len vypise druhy krat?
0

stefanSK
Pokročilý člen
Pokročilý člen
Príspevky: 752
Dátum registrácie: 24 Jún 2010, 00:00
Bydlisko: Trnava
Vek: 68

Re: kde som spravil chybu?

Príspevok od používateľa stefanSK » 06 Jan 2015, 13:43

getchar naozaj ukladá aj znak \n.
Ak to máš v C++.
Tak to uprav na:

Kód: Vybrať všetko

    char x;
    int y;
    y=0;  
    while(1) 
    {
      cin >> x ;
      if (x=='+')
         y++;
      if (x=='-')
         y--;
      printf("%d\n", y);
    }
alebo ak to máš v C:

Kód: Vybrať všetko

    char x;
    int y,;
    y=0; 
    while(1) 
    {
      x= getch();
      if (x=='+')
         y++;
      if (x=='-')
         y--;
      printf("%d\n", y);
    }
0
S.K.

logarytmus
Okoloidúci
Okoloidúci
Príspevky: 42
Dátum registrácie: 10 Apr 2014, 17:29

Re: kde som spravil chybu?

Príspevok od používateľa logarytmus » 06 Jan 2015, 14:09

Mam to v cecku no ten prikaz getch() sa nachadza v conio.h kniznici pokial viem na linux tato kniznica nieje
0

Samanko
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1106
Dátum registrácie: 03 Máj 2013, 16:18
Bydlisko: Up there in the sky

Re: kde som spravil chybu?

Príspevok od používateľa Samanko » 06 Jan 2015, 14:13

getchar(); cita znaky do vstupneho bufferu az po znak '\n'. Potom z neho vezme prvy a ostatne ignoruje. Tie znaky vsak stale su vo vstupnom buffer-e, vyhodis ich/vyprazdnis ho napriklad tym

Kód: Vybrať všetko

while(getchar()!='\n')
;

logarytmus napísal: Alebo je to tak ze najpr precita znak + alebo minus prvy krat to prebehne a druhy krat cita znak \n a to len vypise druhy krat?
-tato je spravna.

V tomto pripade by bolo pre teba zaujimavejsie pouzit getch();
0
“Strong people don't put others down... They lift them up.“ Michal P. Watson.
„Pravda musí čelit více zkoumajícím pohledům !"
„We cannot choose our external circumstances, but we can always choose how we respond to them'' Epiktetos

logarytmus
Okoloidúci
Okoloidúci
Príspevky: 42
Dátum registrácie: 10 Apr 2014, 17:29

Re: kde som spravil chybu?

Príspevok od používateľa logarytmus » 06 Jan 2015, 14:20

Okej dakujem uz tomu chapem :)
getch() je v tom conio.h a ten nie je pre linux. Na ktorom robim ja.Nejaky ekvivalnet k tomu na linux nieje?
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: kde som spravil chybu?

Príspevok od používateľa peterple » 06 Jan 2015, 21:23

Obávam sa že nie. Tam sa veci majú trochu inak. Pravdepodobne chceš aby sa ti znak prečítal okamžite po stisnutí. Dá sa to tak, že sa terminál prepne do unbuffered režimu.
Tu máš príklad ako na to.
http://shtrom.ssji.net/skb/getc.html
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok