C-ben csináltam egy viszonylag egyszerű függvényt. Miért nem ad megfelelő értékeket?
Készítenem kell egy C függvényt beker néven, ami vár 2 egész számot cím szerinti paraméter átadással, és ezt csinálja:
A függvény egy egész számot olvasson be, de úgy, hogy a szám 318 és 405 között legyen. A határok még közte vannak.
A függvény addig olvassa be egy egész szám értékét, amíg az nem teljesíti a feltételt. Amint kijött egy megfelelő, a bekérés álljon le. A függvény állítsa be az első paraméterének értékét arra, hogy mi a véglegesen bekér szám, a másik paramétert pedig arra, hogy hányadik bekérésre sikerült megfelelő értéket kapni.
Részletek a teljes programból:
int szam, hanyatolvas;
beker(&szam, &hanyatolvas);
printf("%d\n", szam);
printf("%d\n", hanyatolvas);
Megírtam ezt a kódot:
int beker()
{
int szam=0, hanyatolvas=0;
while (szam < 318 || szam > 405)
{
hanyatolvas++;
scanf("%d", &szam);
}
return 0;
}
Ezzel az a baj, hogy a kelleténél vagy sokkal nagyobb, vagy sokkal kisebb számokat ad ki. Ha printf-et is írok a függvénybe, akkor kiírja a megfelelő számokat IS és a rosszakat IS, de utóbbiakat nem tudom eltávolítani, mert az a függvényen kívüli printf bele van már "égetve" a programba, ezért a függvényen kell alakítani.
while (szam < 318 || szam > 405)
Ez egy VAGY kapcsolat. Vagy 318-nál kisebb, vagy 405-nél nagyobb. Pontosan azt csinálja a program, amit kész tőle.
A szöveges leírásod szerint te 318 és 405 KÖZÖTTI számokat szeretnél, azaz (szam > 318 && szam < 405). De ebben még a határok nincsenek benne, azaz vagy <=, vagy eggyel nagyobb/kisebb számokat írsz.
#1 A feltétellel semmi gond nincs, addig fut a beolvasás, amíg a szám KÍVÜL van az adott határokon. A probléma ott van, és nem is értem ez miért fordul egyáltalán le (de apparently, lefordul), hogy a beker függvénynek egy szem paramétere sincs. Hiába adod át a függvényhívásnál a két változót, ha a függvény egy darabot sem vár.
Helyesen pl valahogy így fest a függvény:
int beker(int* szam_out, int* hanyatolvas_out)
{
    int szam=0, hanyatolvas=0;
   
    while (szam < 318 || szam > 405)
    {
        hanyatolvas++;
   
        scanf("%d", &szam);
   
    }
   
    *szam_out = szam;
    *hanyatolvas_out = hanyatolvas;   
   
    return 0;
}
Igen, mert az első hülyeséget írt. Nem az a hiba.
A két kódrészletnek mi köze van egymáshoz?
Az elején van egy beker függvényed két paraméterrel, majd van egy függvényed paraméter nélkül.
Hol írod ki a mit?
Ahogy fentebb írták, a beker() függvényedet nem érdekli az eredeti szam és hanyatolvas változó, hanem deklarál magának sajátot, ami a return után meg is szűnik. Nem is értem, miért deklaráltad ott is. Olvass utána a paraméterek fajtáinak, formális, aktuális paraméterlistának, cím- és érték szerinti paraméterátadásnak, stb., és egyáltalán mi az a függvényparaméter. (Gonoszság nélkül; a ""mire jó az int*"" kijelentésed alapján ezekre az infókra szükséged lesz.)
int beker() {
int szam=0, hanyatolvas=0; // <--- ???
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!