C programozás segítség?
A legnagyobb páros számot kéne kiírnom 10 beírt szám közül. Sajnos csak 0-kat kapok mindig. Mi a hiba?
#include <stdio.h>
int main() {
int numbers[10];
int largest=0;
int i;
for(i=1;i<11;i++) {
scanf("%d", &numbers[i]);
if(numbers[i]%2==0 && numbers[i]>largest)
largest=numbers[i];
}
if((largest=0)){
printf("There are no even numbers.");}
else{
printf("%d", largest);}
return 0;
}
if((largest=0)){
sorban van a hiba, itt a largest=0 miatt 0 értéket kap, ide largest==0 kéne.
A numbers[10] egy tíz elemű tömböt hoz létre, a numbers[11] 11 eleműt. Neked az előbbi kell. Azért "kellett" átírnod, mert a tömb elemeinek indexe (a szögletes zárójel közötti szám) nullától kezdődik, nem 1-től. Tehát ha a for ciklust javítod 0-tól kezdődőre, akkor működni fog.
Emlékeim szerint pl. a Visual Basic indexei kezdődnek 1-től, de a legtöbb programnyelvnél ez 0. Tehát 0-tól a 9. elemig kéred be őket. Már ha el akarod tárolni, mert ez ebben a kódban nem szükséges.
Nem kell 11-re átírni, 0-tól 9-ig kell a ciklusnak futnia, mert a C-ben a tömb index 0-val kezdődik. És 0-tól 9 pont 10. darab szám van. Ezt érdemes megszokni, mert így mindig cipelsz magaddal egy "üres" (nem használt stb.) tömb elemet. Tehát eleve az első ciklus for (i=0; i<10; i++) formában lenne megfelelő. Ha nem szükséges a beírt számok tárolása felesleges a tömbbel vacakolni. Tehát ha csak arra vagyunk kiváncsiak, hogy a beírt számsorból melyik a legnagyobb akkor tök felesleges ezt egy tömbbe letárolni. Nyilván ha kellenek még valamire a számok akkor el lehet tárolni.
Az elegáns megoldás a largest alapértékre nem -999 hanem a legkisebb int ez fordító függően vagy -32 768 vagy -2 147 483 648 (ezt aktuálisan meg kell nézni, hogy mennyi).
"A numbers[10]-et át kellett írnom 11-re"
Ha a feladatban 10 számot kell bekérni, akkor felesleges.
Inkább a ciklusnál az alábbi sort:
for(i=1;i<11;i++) {
cseréld le erre:
for (i = 0; i < 10; i++) {
ugyanis a C-ben - és az összes C-szerű nyelvben - a tömbök indexelése 0-ról kezdődik.
"és mivel az inputban voltak negatív számok is, ezért a largest alapértéke -999 lett, valamint az utolsó if-nél is -999"
Inkább csináld úgy, hogy a ciklusban, a szám bekérése után a largest változó értékének megadod a legelső számot:
if (i == 0)
largest = num[i];
Majd a következő feltételben leellenőrzöd, hogy az aktuális szám páros-e illetve nagyobb-e a largest értékénél - ha igen, akkor felülírod a largest értékét.
A kiíratási feltételnél pedig e helyett:
if((largest == 0)){
inkább így jársz el:
if (largest % 2 != 0) {
ha ugyanis a legnagyobb szám nem páros (vagyis például megmaradt a tömb legelső eleme), akkor nincsenek páros számok. Ha páros, akkor meg feltételezhető, hogy a legnagyobb páros szám került kiválasztásra.
#6-nál elírtam:
largest = num[i];
helyett
largest = numbers[i];
"Inkább csináld úgy, hogy a ciklusban, a szám bekérése után a largest változó értékének megadod a legelső számot:
if (i == 0)
largest = num[i];
Majd a következő feltételben leellenőrzöd, hogy az aktuális szám páros-e illetve nagyobb-e a largest értékénél - ha igen, akkor felülírod a largest értékét."
Sajnos nem jó így, ha az első szám pl. -1, az lesz a largest, de viszont pl. -4 -re már nem fogja átírni, mivel az kisebb, de a végén az lenne a jó megoldás.
Tömb nélkül, ugyanúgy mint a tömbös változatnál. Most csak a "lényeges" részek
int number;
int largest=-32768;
int i;
for(i=1;i<11;i++) {
scanf("%d", &number);
if(number%2==0 && number>largest)
largest=number;
}
Esetleg a másik változattal:
int number;
int largest;
int i;
for(i=1;i<11;i++) {
scanf("%d", &number);
if (i==1) largest=number;
if(number%2==0 && number>largest)
largest=number;
}
További 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!