maly4141 utworzono 22 czerwca 2011 utworzono 22 czerwca 2011 (edytowane) Witam! Napisałem taki prosty kalkulator, który mam zamiar wzbogacić w jeszcze kila przydatnych funkcji, jednak mam pewien problem. Gdy wpisuje liczby jednocyfrowe to jako wynik program zwraca dość dziwne liczby mam nadzieje ze ktoś rozwiąże ten problem. Z góry dziękuje za pomoc [code]#include <cstdlib> #include <iostream> #include <conio.h> using namespace std; int main(int argc, char *argv[]) { cout.setf(ios::fixed); cout.precision(4); //dokladnosc char c,znak; static int tab[10],tab2[10]; //tablice na dwie wartosci, statyczne wtypelnione sa zerami int licznik_dlugosci=0,licznik_dlugosci2=0; //liczniki do okreslenia dlugosci poszczegolnych liczb int mnoznik=1,mnoznik2=1,licznik=9,licznik2=9,zapas=1,dzielnik=1; //liczniki do tablic int pierwsza=0,druga=0,warunek=0; //dwie zmienne do dzialan, warunek do zmiany tablicy double wynik; cout<<"\n\n ----------KALKULATOR----------\n" <<" + - dodawanie\n" <<" - - odejmowanie\n" <<" * - mnozenie\n" <<" / - dzielenie\n\n\n"; // wczytanie dzialania do tablic oraz znaku while (c!=13) { c=getch(); cout<<c; if (c=='+' || c=='-' || c=='*' || c=='/') {warunek=1; znak=c;} //przypisanie znaku dzialan if(c<='9' && c>='0' && warunek==0) // wartosci pierwszej tablicy { char *wsk=&c; tab[licznik]=atoi(wsk); licznik--; licznik_dlugosci++; } if(c<='9' && c>='0' && warunek==1) //wartosci drugiej tablicy { char *wsk=&c; tab2[licznik2]=atoi(wsk); licznik2--; licznik_dlugosci2++; } } // wyciagniecie wartosci z dwoch tablic licznik_dlugosci=10-licznik_dlugosci; // ilosc zer w pierwszej tablicy przed wartoscia for (int a=0;a<licznik_dlugosci;a++) dzielnik*=10; //oblicznanie przez ile trzeba pidzielisc pierwsza liczbe for(int i=0;i<10;i++) { if ( tab[i]!=0||tab[i+1]!=0 ) pierwsza=pierwsza+tab[i]*mnoznik; cout<<i<<". "<<tab[i]<<" wartosc pierwsza : "<<pierwsza<<" wartosc mnoznik: "<<mnoznik<<endl; //tester mnoznik*=10; } cout<<"-----//"<<pierwsza<<endl<<dzielnik<<endl;//tester pierwsza=pierwsza/dzielnik; //ustalenie prawdziwej wartosci liczby licznik_dlugosci2=10-licznik_dlugosci2; //ilosc miejsc w drugiej tablicy przed wartoscia dzielnik=1; // zerowanie dzielnika for (int a=0;a<licznik_dlugosci2;a++) dzielnik*=10; //oblicznanie przez ile trzeba pidzielisc druga liczbe for (int i=0;i<10;i++) { if ( tab2[i]!=0||tab2[i+1]!=0 ) druga=druga+tab2[i]*mnoznik2; cout<<i<<". "<<tab2[i]<<" wartosc druga : "<<druga<<" wartosc mnoznik2: "<<mnoznik2<<endl; //tester mnoznik2*=10; } cout<<"-----//"<<druga<<endl<<dzielnik<<endl;//tester druga/=dzielnik; //ustalenie prawdziwej wartosci liczby //wykonanie dzialan switch(znak) { case '+': wynik=pierwsza+druga;break; case '-': wynik=pierwsza-druga;break; case '*': wynik=pierwsza*druga;break; case '/': wynik=pierwsza/druga;break; } cout<<pierwsza<<znak<<druga<<"="<<wynik<<endl; system("PAUSE"); return EXIT_SUCCESS; } // created BY maly4141 [/code]
Xanteri komentarz 27 czerwca 2011 komentarz 27 czerwca 2011 Nie obraź się ale straszny jest program, po: 1) wszystko masz w main, domyślam się że uczysz się programować w c++, jeżeli tak to może naucz się odrazu też pisać ładny kod (chociażby oddzielne funkcje do każdej wykonywanej czynności) 2) czemu operujesz na tablicach? (czyżby poprzedni język w jakim się uczyłeś to C ?) uzyj vectora Ogólnie mogę ci pozmieniać ten program co napisałeś, ale powiem szczerze, że lepiej by było go napisać od nowa. Oczywiście mogę ci w tym pomóc (żeby nie było że tylko krytykuje )
maly4141 komentarz 29 czerwca 2011 Autor komentarz 29 czerwca 2011 Problem juz rozwiazalem i byl banalny. Jezeli chodzi o nauke to jestem w jej trakcie. Kozystam z symfonii i dopiero przerabiam klasy ale pomyslalem ze sprawdze swoje mozliwosci Jezeli chodzi o uzywanie funkcji to zaden problem ale nie chcialem kombionwac skoro i tak program nie dziaial najpierw chodzilo o rozwiazanie problemu. Dodatkowo troche zamieszania robia polecenia, ktorymi szukalem bledow. Chetnie zobacze inne rozwiazanie tego programu moze przy okazji sie czegos naucze Operuje na tablicach bo jak narazie najlepiej je rozumiem. Poprzednim jezykiem byl Pascal i jakos za bardzo sie nie przyadl i dlatego zabralem sie za nauke troche powazniejszego jezyka. Oczekuje na poprawki i chetnie przyjme jakies wskazowki
Xanteros komentarz 29 czerwca 2011 komentarz 29 czerwca 2011 [quote name='maly4141' timestamp='1309350519' post='1288817'] Problem juz rozwiazalem i byl banalny. Jezeli chodzi o nauke to jestem w jej trakcie. Kozystam z symfonii i dopiero przerabiam klasy ale pomyslalem ze sprawdze swoje mozliwosci Jezeli chodzi o uzywanie funkcji to zaden problem ale nie chcialem kombionwac skoro i tak program nie dziaial najpierw chodzilo o rozwiazanie problemu. Dodatkowo troche zamieszania robia polecenia, ktorymi szukalem bledow. Chetnie zobacze inne rozwiazanie tego programu moze przy okazji sie czegos naucze Operuje na tablicach bo jak narazie najlepiej je rozumiem. Poprzednim jezykiem byl Pascal i jakos za bardzo sie nie przyadl i dlatego zabralem sie za nauke troche powazniejszego jezyka. Oczekuje na poprawki i chetnie przyjme jakies wskazowki [/quote] To jak uczysz się z symfoni to możesz nie znać jeszcze vectora. On jest dopiero w Pasji C++. Ale spokojnie wszystko przed tobą. Swoją drogą staraj się odrazu pisać ładny kod a nie najpierw brzydko ale żeby działał a później będziesz poprawiał bo w przypadku 200 lini kodu to bez różnicy ale jak będziesz miał 2500 lini to już nie będzie tak fajnie poprawiać taki kod.
maly4141 komentarz 30 czerwca 2011 Autor komentarz 30 czerwca 2011 Dzieki za rady. Niepotrzebnie namieszalem w programie z tablicami ale wpadlem na szczescie na lepsze rozwiazanie. Co do pasji to mam zamiar kupic jak tylko skoncze symfonie. Teraz program wyglada tak i mam zamiar go troche rozbudowac: [code]#include <cstdlib> #include <iostream> #include <conio.h> using namespace std; int main(int argc, char *argv[]) { char c,znak; double jeden=0,dwa=0; long warunek=0; //warunek do zmiany liczby double wynik; cout<<"\n\n ----------KALKULATOR----------\n" <<" + - dodawanie\n" <<" - - odejmowanie\n" <<" * - mnozenie\n" <<" / - dzielenie\n\n\n"; // wczytanie dzialania do tablic oraz znaku while (c!=13) { c=getch(); cout<<c; if (c=='+' || c=='-' || c=='*' || c=='/') {warunek=1; znak=c;} //przypisanie znaku dzialan if(c<='9' && c>='0' && warunek==0) // wartosci pierwszej tablicy { char *wsk=&c; jeden=jeden*10+atoi(wsk); } if(c<='9' && c>='0' && warunek==1) //wartosci drugiej tablicy { char *wsk=&c; dwa=dwa*10+atoi(wsk); } } //wykonanie dzialan switch(znak) { case '+': wynik=jeden+dwa;break; case '-': wynik=jeden-dwa;break; case '*': wynik=jeden*dwa;break; case '/': wynik=jeden/dwa;break; } cout<<jeden<<znak<<dwa<<"="<<wynik<<endl; system("PAUSE"); return EXIT_SUCCESS; } //BY maly4141[/code]
Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!
Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.