Kezdőoldal » Számítástechnika » Programozás » Miért nem működik ez a program...

Miért nem működik ez a program c++ -ban?

Figyelt kérdés

#include <iostream>

#include <stdlib.h>


using namespace std;


int main ()


{

int i;

int x;

int y;

int z;

int utszamjegy;

const int paros[5]={0,2,4,6,8};

const int paratlan[5]={1,3,5,7,9};



cout << "Kerem az x szamot: "; cin >> x;

cout << "Kerem az y szamot: "; cin >> y;


z = 0;


do {

while (x!=0 and y !=0){

utszamjegy = x%10;}

i = 0;

while (utszamjegy != paratlan[i]){

++i;}

z = z+x+y-1;

x = x-1;

y = y-1;

cout << "A szorzat erteke: " << z;

while (utszamjegy != paros[i]){

++i;}

y = 2*y;

x = x/2;

}

return 0;


}



A cél hogy kiszámítsuk két szám szorzatát, de szorzás nélkül. A matematikai háttere nem lényeges, és meg lehetne oldani egyszerűbben is, de én gyakorlás miatt tömbökkel szeretném.

A célom az volna hogy beolvasom a két (egész) számot, (x,y) megnézem hogy az x utolsó számjegye megegyezik-e a páros / páratlan tömb valamelyik elemével, amelyikkel megegyezik, azt az utasítás sort kell végrehajtani, kész.

A gond az hogy futtatásnál, miután bekéri a számokat nem csinál semmit a program, megáll. Ötletek?



2013. okt. 18. 21:17
1 2 3 4
 11/35 anonim ***** válasza:
Szerintem itt-ott néhány módosítást kifelejtettél. Könnyen ellenőrizheted a program futását. Futtasd pontonként. Látni fogod, hogy az egyik ciklusban kiakad.
2013. okt. 18. 21:38
Hasznos számodra ez a válasz?
 12/35 anonim ***** válasza:

{

int i;

int x;

int y;

int z;

int utszamjegy;

const int paros[5]={0,2,4,6,8};

const int paratlan[5]={1,3,5,7,9};


cout << "Kerem az x szamot: "; cin >> x;

cout << "Kerem az y szamot: "; cin >> y;


Eddig minden jól megy.

Beolvasunk x-nek 10-et, y-nak 30-at.

z = 0;

Még itt sincs semmi baj.

do {

while (x!=0 and y !=0){

utszamjegy = x%10;}

Itt már baj van. X, Y közül egyik sem nulla, ezért az utszamjegy felveszi az x utolsó számjegyét. És ez a végtelenségig ismétlődik, mert ennek a ciklusnak a belsejében soha nem lesz x vagy y nulla.

2013. okt. 18. 21:41
Hasznos számodra ez a válasz?
 13/35 A kérdező kommentje:
Nem is kell hogy nulla legyen, és pont itt áll le a program futáskor is... akkor mi volna a helyes megoldás? Össze akarom vetni x utolsó számjegyét a két tömb elemeivel, és amelyik tömb elemeivel megegyezik a számjegy, azt az utasításblokkot kellene lefuttatni. DE hogy?
2013. okt. 18. 22:07
 14/35 anonim ***** válasza:

while (x!=0 and y !=0){

utszamjegy = x%10;}

...

Ez egy végtelen ciklus. Ha nem akarod módosítani az x,y-t ebben a ciklusban, csak az x utolsó számjegye kell, akkor csak ennyit írj:

utszamjegy = x % 10;

...

while (x!=0 and y !=0) - nem kell.

2013. okt. 18. 22:10
Hasznos számodra ez a válasz?
 15/35 anonim ***** válasza:

Ha az első while ciklust ki is törölöd, még maradnak végtelen ciklusok.

Tegyük fel, hogy az utolsoszamjegy változó 4. Akkor itt ismét egy végtelen ciklus lesz, mert paratlan[i] soha nem lesz 4.

while (utszamjegy != paratlan[i]){

++i;}

Helyett írd ezt:

while(utszamjegy % 2 != 0 && utszamjegy == paratlan[i])

Hasonlóan a másik while ciklust is módosítani kell.

2013. okt. 18. 22:13
Hasznos számodra ez a válasz?
 16/35 A kérdező kommentje:
Áh, elszomorodtam :( Úgy látszik programozónak is születni kell...nem áll rá a buksim...
2013. okt. 18. 22:18
 17/35 iostream ***** válasza:

"Nem ír ki hibát, csak marad a kurzor ott és nem reagál semmire. Legalább nem fagy le :)"


Ez pontosan a lefagyás definíciója. És feltehetően egy végtelen ciklusba kerül a program, ahogy sokan emlegették már.

A program háromféleképpen végezheti.

1. Normál leállás. Ezt az jelzi, hogy a program rendeltetésszerűen leáll, kiírva egy eredményt vagy egy hibát. Nem kell, hogy HELYES legyen az eredmény, az már egy másik kérdés.

2. Abortálás. Ez a segfault és társai, amikor a program abnormális állapotba kerül, és elhal.

3. Nem áll le. Ez tipikusan végtelen ciklus vagy deadlock miatt lehetséges. Mivel a te programod szigorúan egyszálú, ezért az előbbi. Mivel a te programod nem áll le, felteheted, hogy ez az eset áll fenn.

2013. okt. 18. 22:19
Hasznos számodra ez a válasz?
 18/35 anonim ***** válasza:
Szerintem te nem nagyon érted a ciklusok vagy az értékadás működését.
2013. okt. 18. 22:24
Hasznos számodra ez a válasz?
 19/35 A kérdező kommentje:

#include <iostream>

#include <stdlib.h>


using namespace std;


int main ()


{

int i;

int x;

int y;

int z;

int utszamjegy;

const int paros[5]={0,2, while (utszamjegy != paros[i]){

++i;}

y = 2*y;

x = x/2;4,6,8};

const int paratlan[5]={1,3,5,7,9};



cout << "Kerem az x szamot: "; cin >> x;

cout << "Kerem az y szamot: "; cin >> y;


z = 0;



while (x!<=0 and y!<=0){

utszamjegy = x%10;

i = 0;

while (utszamjegy != paratlan[i]){

++i;}

z = z+x+y-1;

x = x-1;

y = y-1;

cout << "A szorzat erteke: " << z;

while (utszamjegy != paros[i]){

++i;}

y = 2*y;

x = x/2;}


return 0;


}



Tessék, részben megoldottam. A legelső while ciklust meghagytam, csak a kapcsos zárójeleket tettem máshová. Így már lefut, hiba nélkül, csak nem azt számítja amit kellene... valamiért elszámolja az értékeket. De már közelít!

2013. okt. 18. 22:25
 20/35 A kérdező kommentje:
Most kezdem a programozást tanulni, így sajna nem teljesen tiszta még a dolog. De a szokásos "elolvasok egy 500 oldalas könyvet a témáról" megközelítésem helyett, inkább gyakorlás útján prbálom magam fejleszteni.
2013. okt. 18. 22:27
1 2 3 4

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!