Kezdőoldal » Számítástechnika » Programozás » C-ben ez hogy tudnám ezt megírni?

C-ben ez hogy tudnám ezt megírni?

Figyelt kérdés

Sziasztok! Be kell kérnem tetszőleges számokat, míg nullát nem nyomnak. Ez kódban hogy néz ki?


Azt tudom, hogyha egy számot kérek, akkor:

printf("Adj meg egy számot: \n");

scanf("%d", &szam);


De azt, hogy kezeljem, ha nem tudom előre, hogy hány számot fog beírni az adott egyén?

Fogalmam sincs, hogy ez kódban hogyan is néz ki. :/


Tudnátok segíteni?


2013. febr. 21. 20:31
1 2
 1/17 iostream ***** válasza:

do

{

printf("Adj meg egy számot: \n");

scanf("%d", &szam);

} while (szam);

2013. febr. 21. 20:42
Hasznos számodra ez a válasz?
 2/17 gyorki92 ***** válasza:

Ha nem kell használnod semmire a bevitt számokat, akkor ennyi:

do{

printf("Adj meg egy számot!");

scanf("%d", &szam);

} while(szam != 0);


Ha használni kell őket (feltételezem, hogy ez inkább a helyzet), akkor csinálsz egy egész-szám tömböt (alaposan fölélőve a használt helyeknek, nem hiszem, hogy lenne az a felhasználó, akinek lenne türelme 100 számot megadni), meg csinálsz egy számlálót:


int szamok[100], szamlalo=0;

do{

printf("Adj meg egy számot!");

scanf("%d", &szamok[szamlalo]);

szamlalo++;

}while(szamok[szamlalo] != 0);


Nem ez az egyetlen helyes megoldás, de ez jutott eszembe hirtelen.

2013. febr. 21. 20:42
Hasznos számodra ez a válasz?
 3/17 A kérdező kommentje:

Igen, később matematikai műveletekhez kell őket használnom.

Köszi a megoldást! Erre így magamtól biztos nem jöttem volna rá.

2013. febr. 21. 20:49
 4/17 anonim ***** válasza:

#include <stdio.h>


#define KEZDOERTEK 0

#define INITVAL 1

#define KILEPESIFELTETEL 0

#define ASCIIOFFSET 0x30


int main(void){

char lastchar = INITVAL;

int tmpszam = KEZDOERTEK;


while(1){

lastchar = getch() - ASCIIOFFSET;

if (lastchar != KILEPESIFELTETEL){

if((lastchar > 0) && (lastchar < 10)){

tmpszam = (tmpszam * 10) + lastchar;

}

}else{

break;

}

}

return 0;

}

2013. febr. 21. 20:49
Hasznos számodra ez a válasz?
 5/17 anonim ***** válasza:

most nézem az előzőeket, csak az enyém foglalkozik numerikus érvényességvizsgálattal és helyiérték emeléssel.


az előzőekkel az a kis gond, hogy a nulla valójában 0x30, az egy pedig 0x31 és így tovább. Sosem fogsz kilépni a ciklusból, kivéve, ha a terminálnak valahogy beküldöd a 0x0 karaktert, és a scanf tulajdonsága, hogy ettől behülyül.

2013. febr. 21. 20:55
Hasznos számodra ez a válasz?
 6/17 A kérdező kommentje:

Húú ezt az utolsót egyáltalán nem értem. :S


Egyébként csak kíváncsiságból. Úgy is meg lehetne oldani, hogy egymás után vesszővel elválasztva beírni? Én ebben gondolkoztam és le is ragadtam itt, ezért nem is jutott eszembe a másik. Mivel az egy dolog, hogy vesszővel elválasztva beírja, de ennyi számot lehet egyáltalán scanf-fel beolvasni, vagy csak egyesével lehet?

2013. febr. 21. 20:56
 7/17 A kérdező kommentje:

#5


De számokat kér és nem karaktereket, ezért int-es megoldást használom.

2013. febr. 21. 20:57
 8/17 anonim ***** válasza:

#define KILEPESIFELTETEL ','

de a ',' helyére beírhatod a 0x2C megfelelőjét is. Voila, így is működik, és már a 0 számjegyet is beveszi a helyiérték emelésbe.


egy kicsit át kellene írni a kódomat, modulárisabbra


Persze, hogy nem érted, ez itt egy hardverközeli nyelv, nem egy visual basic!

2013. febr. 21. 21:02
Hasznos számodra ez a válasz?
 9/17 A kérdező kommentje:
De én szeretném megérteni...
2013. febr. 21. 21:03
 10/17 anonim ***** válasza:
0%

Kedves kérdező, akkor arra adj nekem választ, hogy a scanf túlcsordulásait hogyan kezeled le?


Mivel az ASCII tábla jó sok karakterből áll, és a felhasználónak is sok billentyűje van, egy félreütéstől elszáll az egész program. szám helyett beütök neki betűket, funkcióbillentyűt, entert. Vajon miket fog letárolni a scanf?

2013. febr. 21. 21:04
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!