Miért nem működik ez a program c++ -ban?
#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?
{
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.
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.
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.
"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.
#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!
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!