x-kom hosting

[Rozwiązany][c++] kalkulator

maly4141
utworzono
utworzono (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
komentarz

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 :P )

maly4141
komentarz
komentarz

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
komentarz

[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
komentarz

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.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Strona wykorzystuje pliki cookies w celu prawidłowego świadczenia usług i wygody użytkowników. Warunki przechowywania i dostępu do plików cookies możesz zmienić w ustawieniach przeglądarki.