Programozási tételekben mi a hiba? Rosszul írja ki az eredményt
Sziasztok!
Épp emelt szintű infó érettségire készülök és a programozási tételeket csinálom. De elakadtam bennük, mert az eredményt nem jól adja ki. C programozási nyelvet használok.
Meg tudjátok mondani, mi a hiba?
A tulajdonságot így határoztam meg:
bool tul(int szam){
(szam % 2)==0;
}
Megszámlálás:
int megszamlal(int n,int szamok[],int db){
db=0;
for(int i=1;i=n;i++){
if (tul(szamok[i])){
db++;
}
}
cout<<db;
return db<n;
}
Döntés:
bool dontes(int n,int szamok[],int talalt){
int i=1;
while(i<n and !tul(szamok[i])){
i++;
}
if (i=1){
cout<<"van a feltetelnek megfelelo elem";
}else{
cout<<"nincs a feltetelnek megfelelo elem";
}
return i<n;
Kiválasztás:
int kivalasztas(int n, int szamok[], int sorszam){
sorszam=1;
while (! tul(szamok[sorszam])){
sorszam++;
}
return sorszam<n;
}
A tömbben 1-10ig vannak sorba a számok az egyszerűség kedvéért.
Sorban:
1. tul
- C-ben nincs bool
- ha nem void a függvény, akkor adjon vissza valami értéket
2. megszamlal
- sima függvényparaméternek adsz értéket. lehet, de a függvényen kívül nem érvényesül
- C-ben for ciklus fejlécében nem definiálunk ciklusváltozót
- C-ben nincs cout<<, legyen printf
- nem igazán érthető, hogy mit akar visszaadni a függvény. ha db kisebb n-nél, akkor 1-et ad vissza, ha nem kisebb, akkor 0-át
3. dontes
- C-ben még mindig nincs cout<<
- a visszatérés megint nem tiszta
4. kivalasztas
- ha nincs a feltételnek megfelelő szám a listában, akkor végtelen ciklusba kerülsz. ide inkább for kéne.
- megint egy logikai értéket adsz vissza, pedig gondolom, hogy a sorszámot akarnád, nemde?
---------------
A paraméterlistákat is megkérdőjelezném a függvényekben így látatlanban, mert szerintem vannak ott felesleges dolgok, de lévén, hogy nem ismerem a feladat pontos kiírását, nem biztos, hogy igazam van.
1) bool tul(int n){return ((n%2)==0);}
2) A C nem 0-tól indexeli a tömböket? /ebben nem vagyok biztos/
3) A megszamlal miért int-et ad vissza, ha a return-ben db<n van?
4) A for ciklus feltételen i<n, nem i=n, főleg hogy utóbbi értékadás.
5) Az eldöntés feltétele i<n. Egyenlőséget meg az == ellenőriz. Az i=1 mindig igaz.
6) a cout c++, nem c. A c++ viszont garantáltan 0-tól indexeli a tömböket. A ciklusváltozók 0-tól induljanak, i<n feltétellel.
7) A talalt változót nem is használod. A típusa bool kéne, hogy legyen.
8) A tömböket illik const-ként (esetleg cím szerint átadni). A kimenetnek használt változóknak hivatkozásnak kell lenniük.
9) Ha használsz kimeneti változót és a kiírást is függvényen belül csinálod, akkor miért nem void-nak deklarálod a függvényeid? Fölösleges a return.
10) A kivalaszt megint int-nek lett deklarálva, a return meg bool-t ad.
Nem bántásból mondom, de szerintem ne C++-al érettségizz. Inkább javasolnám a Pascalt. Minden programot ugyanúgy megírsz benne az érettségin, csak a hibáid fele fel sem merülne. A C++ sokkal nehezebb nyelv.
#1: a kiválasztásnál valóban végtelen ciklus lenne, ha nem lenne olyan elem. DE! A kiválasztás tételének előfeltétele, hogy biztosan van megfelelő elem. Ha ezt nem tudnánk, akkor a lineáris keresés tételét használnánk, ahol tényleg ellenőrizni kell, de az másik tétel. Ezt éppen a kérdező jól csinálta.
A többi ponttal amúgy egyetértek.
A kód "magyarul" megvan lapon, de nem tudom pontosan, hogy kell átírni.
kb. 1 évig Pascalban programoztam, de a felkészítőtanárom (aki adta a lapokat) inkább a c++-t ajánlotta, mert ezt használják a legtöbb helyen
Így néz ki a program vége ,ahol a eredményeket kellene visszaadni. A tömböt is itt töltöttem fel.
int main()
{
int n=10;
int szamok[]= {1,2,3,4,5,6,7,8,9,10};
int talalt,sorszam,db;
cout<<dontes(n,szamok,talalt)<<endl;
cout<<kivalasztas<<". elem a megoldas"<<endl;
cout<<"Ennyi elem fele meg a feltetelnek: "<<megszamlal(n,szamok,db)<<endl;
cout << endl;
return 0;
}
Nah. Úgy látom, hogy ezeket függvényként akartak eredetileg, de nálad itt már minden keveredik.
3 lehetőséged van.
1) a tételeket függvényként csinálod meg. Ekkor csak a bemenő adatok a paraméterek (talalt meg hasonlók nincsenek). A megszámlálás és a kiválasztás int-et ad vissza, a döntés bool-t. (bool-t ne írass cout-ra, if-fel szét kel választani!). A függvényekben nincs kiírás, azt a main végzi a függvények visszatérési értéke alapján.
2) a tételek elvégzik a kiírást. Ebben az esetben void-ként deklaráld őket, return nincs. A paraméterek megint csak a bemenő adatok. A main csak meghívja ezeket.
3) Ez a legbonyolultabb. A kiírást a main végzi, a tételek viszont void-ok. Return nincs. A paraméterek a bemenet, illetve egy kimenetnek megfelelő típusú *hivatkozás*. /ez az, amit te a talalt-tal akartál/ A main-ben változókat deklarálsz, amik majd az eredményeket tárolják. Ezeket a változókat adod meg majd a tételek hivatkozás paraméterének. A tételek nem írnak ki, azt majd a main fog, a saját változói alapján.
Ha ragaszkodsz a c++-hoz, akkor privátban írd meg az e-mail címed, szívesen segítek, megírom neked mindhárom változatot, hogy lásd, mi a különbség.
De pl. én is Pascallal emelt szintűztem (mondjuk nekem rengeteg évem volt előtte Pascalban), c++-t az egyetemen kezdtem. Most, egy év után a WinAPI-val meg hálózatkezeléssel szórakozok (magamtól, egyetemen nem tanultuk).
"Most, egy év után a WinAPI-val meg hálózatkezeléssel szórakozok (magamtól, egyetemen nem tanultuk)."
Majd fogjátok a hálózatok előbb-utóbb elő kell kerüljenek.
Nálunk is utolsó előtti félévben volt számítógépes hálózatok, ahol alacsony sinztű C-s socketekkel kellett dolgozni, méghozzá elég összetett feladatokat.
A kérdésben adott kódok több sebből véreznek, erre már mások is rámutattak, valamint jó lenne eldönteni, hogy C++ vagy C kell neked, ugyanis sok C++-os dolog, például a cout nem használható a sima C-ben.
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!