Valami miatt nem jó a programom?
Csináltam egy programot, ami bekéri a tömb elemeit majd egy bekért számról eldönti, hogy van-e benne ilyen.
De valami nem jó.
#include<stdio.h>
#define N 10
int main()
{
int tomb[N];
int i;
for(i = 0; i < N; i++)
{
printf("%d. elem:\n", i);
scanf("%d", &tomb[i]);
}
int szam, idx;
printf("Kerek egy szamot:\n");
scanf("%d", &szam);
i = 0;
do
{
if(szam == tomb[i])
{
idx = i;
printf("Van ilyen szam! Helye: %d\n", i);
}
else
{
printf("Nincs ilyen elem!\n");
}
i++;
}while(szam != tomb[i]);
return 0;
}
Elég sok hiba van benne.
Először is, ha a szám nincs benne a tömbben kapásból csináltál egy végtelen ciklust.
Másrészt logikailag is hibás, hogy minden egyes lépés után kiírod, hogy nincs ilyen elem, mikor lehet, hogy van, csak a végén.
Harmadrészt a hátultesztelő ciklus is teljesen rossz elgondolás, ugyanis az első elem kivételével mindig kilépsz a ciklusból, mielőtt megtalálnád az elemet.
Pontosan mi a hiba?
Így látatlanban annyit, hogy a do...While ciklus nem ér sose véget, ha a bekért szám nem szerepel a tömbelemek között, és túlindexelés lesz, ezt asszem Stack Overflow címen adja vissza a legtöbb fordító. Ezt ezért mindenképp több értelme lenne for ciklussal csinálni.
Értem. És meddig menne a ciklusom így?
Mert ha van iy benne ilyen elem akkor sem csinál semmit.
i = 0;
while(i < N)
{
if(szam == tomb[i])
{
idx = i;
printf("Van ilyen elem! Helye: %d\n", idx);
}
i++;
}
No így kiírja, de csak az első előfordulást kéne kiírnia, így meg mindegyiket kiírja.
Megcsináltam. Ez már jó.
i = 0;
while(i < N && szam != tomb[idx])
{
if(szam == tomb[i])
{
idx = i;
printf("Van ilyen elem! Helye: %d\n", idx);
}
i++;
}
Bocs hogy nincs tabulálva.
Nem vagyok nagy C-s, de a
#define N 10
soron miért nincs fennakadva senki?
A megoldásod már majdnem jó, csak az a probléma, hogy ha többször is szerepel a szám, akkor többször írja ki.
Ezt szépen egy külön metódussal lehet megoldani, amiben benne van a while ciklusod (bár én inkább for-t használnék), és ha megtalálta az elemet akkor true-val tér vissza, egyébkén false-al.
"Nem vagyok nagy C-s, de a
#define N 10
soron miért nincs fennakadva senki?"
Miért kéne rajta fennakadni?
"A megoldásod már majdnem jó, csak az a probléma, hogy ha többször is szerepel a szám, akkor többször írja ki."
Nem írja ki többször, az első találatnál kilép a ciklusból.
"Ezt szépen egy külön metódussal lehet megoldani, amiben benne van a while ciklusod (bár én inkább for-t használnék), és ha megtalálta az elemet akkor true-val tér vissza, egyébkén false-al."
C-ben nincs logikai változó.
Ettől függetlenül a részek függvénybe/eljárásba rendezése mindig jó ötlet.
# 8/8 Időpont ma 20:05
Például mert most gyakorlatilag értéket adna egy N változónak, de a #define-t erre használni... csúnya.
"Például mert most gyakorlatilag értéket adna egy N változónak, de a #define-t erre használni... csúnya."
Mi van?
C-ben nincs konstans, ezért szokás makrókkal definiálni őket.
Szar megoldás, de C-ben nincs ennél jobb.
De vergődik ugye mindig mindenki, hogy C-vel kell kezdeni a programozást, mert az olyan jó tanulónyelv, meg olyan könnyű...
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!