Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

zadanie 18.6.4 kalkulator

Ostatnio zmodyfikowano 2010-09-10 16:21
Autor Wiadomość
ulysses
Temat założony przez niniejszego użytkownika
zadanie 18.6.4 kalkulator
» 2010-09-10 09:08:03
Witam
Moj problem dotyczy zadania jeszcze ze starego kursu. Tresc zadania:
4.* Zaprojektuj kalkulator, który będzie wykonywać wszystkie działania matematyczne jakie znasz. Dodatkowo ma mieć możliwość obliczenia pola i obwodów wszystkich znanych ci figur geometrycznych. Dla lepszej wizualizacji, proponuje stworzyć ciekawy interfejs oparty o bibliotekę DDT. Wszystkie operacje podczas działanie programu mają być zapisane w pliku. Czyli jeżeli użytkownik włączył program zrobił dodawanie i obliczył pole jakiejś figury i zakończył program, to wszystko co wykonał ma być zapisane w pliku o nazwie jaką sam wymyślisz. Dobrze by było by zapisane dane to te, które użytkownik widzi na ekranie podczas obsług programu. Wykorzystaj wszystkie poznane zagadnienia by napisać spójny i przyjazdy dla użytkownika program.

Program nie jest jeszcze w pelni dopracowany, tzn. do pliku nie zostaja zapisane jeszcze wszystkie czynnosci wykonywane przez uzytkownika oraz nie ma pelnych zabezpieczen przez wprowadzaniem glupstw przez uzytkownika ale to sie dopracuje.
Moj problem dotyczy zadeklarowania jednej zmiennej typu string w funkcji
int funkcja(int *poziom,int *pion, string menu_1[3])
. Jezeli nie zadeklaruje zmiennej
string w;
 wewnatrz tej funkcji program dziala prawidlowo, natomiast jezeli ja zadeklaruje program dziala nie tak jak powinien, tzn powinien przejsc do kolejnego menu. Moze ktos wie gdzie tkwi problem. Prezentuje kod programu:
C/C++
#include <iostream>
#include <conio.h>
#include "ddtconsole.h"
#include <cstdio>
#include <cmath>
#include <fstream>

using namespace std;
using namespace ddt::console;

int funkcja( int *, int *, string[] );
void Menu();
void Kursor( int, int );

void Menu_dzialania_matematyczne();
int dzialania_matematyczne( int *, int *, string[] );

int dodawanie( int );



void zapis( string );

int main()
{
    //zmienne do polozenia kursora
    //w menu glownym
    int poziom = 26, pion = 10;
   
    //zmienne do polozenia kursora
    //w menu OPERACJE MATEMATYCZNE
    int poziom_m = 26, pion_m = 10;
   
    //zmienna do ktorej przypisujemy zwrocona wartosc funkcji
    //FUNKCJA
    int zwracanie_funkcji;
    int zwracanie_funkcji_operacje_matematyczne;
   
    string menu_1[ 4 ] =
    {
        "Wybrano obliczenia matematyczne",
        "Wybrano obliczanie pol",
        "Wybrano inne operacje",
        "KONIEC PROGRAMU",
    };
   
    string menu_2[ 8 ] =
    {
        "Wybrales dodawanie",
        "Wybrales odejmowanie",
        "Wybrales mnozenie",
        "Wybrales dzielenie",
        "Wybrales potegowanie",
        "Wybrales pierwiastkowanie",
        "Wybrales obliczanie reszty z dzielenia",
        "POWROT DO MENU GLOWNEGO",
    };
   
   
    zapis( "\n\n!!!ROZPOCZECIE PROGRAMU!!!" );
    //wykonuj petle dopoki w pierwszym menu
    //nie zostanie przycisniety ESC
    //wartosc zwracana przez "funkcja" zostaje pzypisana
    //do zmniennej "zwracanie_funkcji" aby pozniej wykonac odpowiednia instrukcje
    while(( zwracanie_funkcji = funkcja( & poziom, & pion, menu_1 ) ) != 27 )
    {
        clrscr();
        gotoxy( 25, 8 );
       
        //jezeli w 1 menu wybrano
        //pierwsza wartosc
        if( zwracanie_funkcji == 1 )
        {
            //wykonuj dopoki nie zostanie przycisniety klawisz ESC
            //analogiczne dzialanie do petli powyzej
            //z tymze teraz dzialamy na menu w ktorym mamy az 7 opcji do wyboru
            while(( zwracanie_funkcji_operacje_matematyczne = dzialania_matematyczne( & poziom_m, & pion_m, menu_2 ) ) != 27 )
            {
                clrscr();
                gotoxy( 25, 8 );
               
                //jezeli "dzialania_matematyczne" zwrocily wartosc z zakresu 1-7
                if( zwracanie_funkcji_operacje_matematyczne > 0 && zwracanie_funkcji_operacje_matematyczne < 8 )
                {
                    //wykonaj i wyswietl funkcje "dodawanie" ktora przyjmuje 1 parametr
                    cout << dodawanie( zwracanie_funkcji_operacje_matematyczne );
                }
               
                getch();
            }
        }
        else if( zwracanie_funkcji == 2 )
        {
            cout << "FUNKCJA GLOWNA - OBLICZANIE POL\n";
        }
        else if( zwracanie_funkcji == 3 )
        {
            cout << "FUNKCJA GLOWNA - INNE\n";
        }
        getch();
    }
    return 0;
}


int funkcja( int * poziom, int * pion, string menu_1[ 3 ] )
{
   
   
    //char w[100];
    int znak;
   
    //!!!!!!!!!zadeklarowanie tej zmiennej powoduje blad
    //string w;
    do
    {
        Menu();
        Kursor( * poziom, * pion );
        znak = getch();
       
       
        if( znak == 224 )
        {
            znak = getch();
        }
       
        switch( znak )
        {
            //do gory
        case 72:
            {
                if( * pion == 10 )
                {
                    * pion = 12;
                }
                else
                {
                    //*pion=*pion-1;
                    ( * pion ) --;
                }
                break;
            }
           
            //w lewo
        case 75:
            {
                break;
            }
           
            //w prawo
        case 77:
            {
                break;
            }
           
            //w dol
        case 80:
            {
                if( * pion == 12 )
                {
                    * pion = 10;
                }
                else
                {
                    //*pion=*pion+1;
                    ( * pion ) ++;
                }
                break;
            }
           
            //ENTER
        case 13:
            {
                clrscr();
                if( * poziom == 26 &&* pion == 10 )
                {
                    //cout<<"Wybrales operacje matematyczne\n";
                    cout << menu_1[ 0 ];
                    zapis( menu_1[ 0 ] );
                   
                    return 1;
                }
                else if( * poziom == 26 &&* pion == 11 )
                {
                    //cout<<"Wybrales obliczanie pol\n";
                    cout << menu_1[ 1 ];
                    zapis( menu_1[ 1 ] );
                    return 2;
                }
                else if( * poziom == 26 &&* pion == 12 )
                {
                    //cout<<"Wybrales inne dzialania\n";
                    cout << menu_1[ 2 ];
                    zapis( menu_1[ 2 ] );
                    return 3;
                }
                //getch();
                break;
            }
           
            //ESC
        case 27:
            {
                clrscr();
                //cout<<"KONIEC PROGRAMU!!!";
                cout << menu_1[ 3 ];
                zapis( menu_1[ 3 ] );
                return 27;
                break;
            }
        }
       
        //cout<<znak<<endl;
        //dopoki nie zostanie nacisniety ESC
    } while( znak != 27 );
   
}


void Menu()
{
    clrscr();
    gotoxy( 35, 8 );
    cout << "Wybierz zadanie";
    gotoxy( 30, 10 );
    cout << "1 - Operacje matematyczne";
    gotoxy( 30, 11 );
    cout << "2 - Obliczanie pol figur";
    gotoxy( 30, 12 );
    cout << "3 - Inne dzialania";
}

void Kursor( int poziom, int pion )
{
    gotoxy( poziom, pion );
    cout << "-->";
}

void Menu_dzialania_matematyczne()
{
    clrscr();
    gotoxy( 30, 10 );
    cout << "1 - dodawanie";
   
    gotoxy( 30, 11 );
    cout << "2 - odejmowanie";
   
    gotoxy( 30, 12 );
    cout << "3 - mnozenie";
   
    gotoxy( 30, 13 );
    cout << "4 - dzielenie";
   
    gotoxy( 30, 14 );
    cout << "5 - potegowanie";
   
    gotoxy( 30, 15 );
    cout << "6 - pierwiastkowanie";
   
    gotoxy( 30, 16 );
    cout << "7 - reszta z dzielenia";
}
int dzialania_matematyczne( int * poziom_m, int * pion_m, string menu_2[ 8 ] )
{
    string w;
    int znak;
   
    do
    {
        Menu_dzialania_matematyczne();
        Kursor( * poziom_m, * pion_m );
       
        znak = getch();
       
        if( znak == 224 )
        {
            znak = getch();
        }
       
        switch( znak )
        {
            //do gory
        case 72:
            {
                if( * pion_m == 10 )
                {
                    * pion_m = 16;
                }
                else
                {
                    //*pion=*pion-1;
                    ( * pion_m ) --;
                }
                break;
            }
           
            //w lewo
        case 75:
            {
                break;
            }
           
            //w prawo
        case 77:
            {
                break;
            }
           
            //w dol
        case 80:
            {
                if( * pion_m == 16 )
                {
                    * pion_m = 10;
                }
                else
                {
                    //*pion=*pion+1;
                    ( * pion_m ) ++;
                }
                break;
            }
           
            //ENTER
        case 13:
            {
               
                clrscr();
                if( * poziom_m == 26 &&* pion_m == 10 )
                {
                    //cout<<"Wybrales dodawanie\n";
                    cout << menu_2[ 0 ];
                    zapis( menu_2[ 0 ] );
                    return 1;
                }
                else if( * poziom_m == 26 &&* pion_m == 11 )
                {
                    //cout<<"Wybrales odejmowanie\n";
                    cout << menu_2[ 1 ];
                    zapis( menu_2[ 1 ] );
                    return 2;
                }
                else if( * poziom_m == 26 &&* pion_m == 12 )
                {
                    //cout<<"Wybrales mnozenie\n";
                    cout << menu_2[ 2 ];
                    zapis( menu_2[ 2 ] );
                    return 3;
                }
                else if( * poziom_m == 26 &&* pion_m == 13 )
                {
                    //cout<<"Wybrales dzielenie\n";
                    cout << menu_2[ 3 ];
                    zapis( menu_2[ 3 ] );
                    return 4;
                }
                else if( * poziom_m == 26 &&* pion_m == 14 )
                {
                    //cout<<"Wybrales potegowanie\n";
                    cout << menu_2[ 4 ];
                    zapis( menu_2[ 4 ] );
                    return 5;
                }
                else if( * poziom_m == 26 &&* pion_m == 15 )
                {
                    //cout<<"Wybrales pierwiastkowanie\n";
                    cout << menu_2[ 5 ];
                    zapis( menu_2[ 5 ] );
                    return 6;
                }
                else if( * poziom_m == 26 &&* pion_m == 16 )
                {
                    //cout<<"Wybrales obliczanie reszty z dzielenia\n";
                    cout << menu_2[ 6 ];
                    zapis( menu_2[ 6 ] );
                    return 7;
                }
                //getch();
                break;
            }
           
            //            //ESC
            //            case 27:
            //            {
            //                clrscr();
            //                cout<<"WYJSCIE Z MENU!!!";
            //                return 27;
            //                break;
            //            }
        }
    }
    while( znak != 27 );
   
    zapis( menu_2[ 7 ] );
    return 27;
}


int dodawanie( int a )
{
    char liczba[ 10 ];
    int liczba_1, liczba_2;
   
   
    do
    {
        cout << " ('k' konczy operacje)\nWprowadz 1 liczbe:\n";
        cin >> liczba;
        cin.get();
       
        //wykonuj dopoki uzytkownik nie wprowadzi 'k'-warunek wyjscia z petli
    } while( liczba[ 0 ] != 'k' &&( !isdigit( liczba[ 0 ] ) ) &&( !isdigit( liczba[ 1 ] ) ) );
   
    if( liczba[ 0 ] != 'k' &&( isdigit( liczba[ 0 ] ) ) ||( isdigit( liczba[ 1 ] ) ) )
    {
        sscanf( liczba, "%d", & liczba_1 );
       
       
        do
        {
            cout << "Wprowadz 2 liczbe:\n";
            cin >> liczba;
            cin.get();
        } while( liczba[ 0 ] != 'k' &&( !isdigit( liczba[ 0 ] ) ) &&( !isdigit( liczba[ 1 ] ) ) );
       
        if( liczba[ 0 ] != 'k' ||( isdigit( liczba[ 0 ] ) ) &&( isdigit( liczba[ 1 ] ) ) )
        {
            sscanf( liczba, "%d", & liczba_2 );
        }
       
        switch( a )
        {
            //wybrano dodawanie
        case 1:
            {
                cout << liczba_1 << "+" << liczba_2 << "=";
                return liczba_1 + liczba_2;
                break;
            }
           
            //wybrano odejmowanie
        case 2:
            {
                cout << liczba_1 << "-" << liczba_2 << "=";
                return liczba_1 - liczba_2;
                break;
            }
           
            //wybrano mnozenie
        case 3:
            {
                cout << liczba_1 << "*" << liczba_2 << "=";
                return liczba_1 * liczba_2;
                break;
            }
           
            //wybrano dzielenie
        case 4:
            {
                if( liczba_2 != 0 )
                {
                    cout << liczba_1 << "/" << liczba_2 << "=";
                    return liczba_1 / liczba_2;
                }
                else
                {
                    cout << "Nie podziele przez 0!!!";
                    return false;
                }
                break;
            }
           
            //wybrano potegowanie
        case 5:
            {
                cout << liczba_1 << "^2" << "=";
                return pow( liczba_1, 2 );
                break;
            }
           
            //wybrano pierwiastkowanie
        case 6:
            {
                cout << "pierwiastek z " << liczba_1 << "=";
                return sqrt( liczba_1 );
                break;
            }
           
            //wybrano reszte z dzielenia
        case 7:
            {
                cout << liczba_1 << "%" << liczba_2 << "=";
                return liczba_1 % liczba_2;
                break;
            }
        }
       
    }
    else
    {
        //return false;
    }
   
   
}


void zapis( string w )
{
    ofstream zapis;
   
    zapis.open( "logi.txt", ios::out | ios::binary | ios::app );
   
    if( zapis.is_open() )
    {
        cout << "Poprawnie zaladowano plik";
        zapis << w << endl;
        zapis.close();
    }
    else
    {
        cout << "ERROR\n";
    }
}


Pozdrawiam
Jacek
P-21884
ison
» 2010-09-10 14:47:26
mówisz że gdy zadeklarujesz zmienną w to program przestaje działać? :p
mógłbyś opisać co się dokładnie dzieje? zadeklarowałem zmienną w typu string w tejże funkcji i mi się kompiluje i działa raczej tak jak powinno
P-21885
ulysses
Temat założony przez niniejszego użytkownika
» 2010-09-10 15:16:01
na razie zaimplementowalem mozliwosc wyboru obliczen matematycznych wiec obliczanie pol i 3 opcja jeszcze nie dzialaja ale wyswietlaja odpowiedni komunikat ze ta opcja zostala wybrana. A co do bledu ktory u mnie sie uaktywnia to jak wybierzesz 1 opcje czyli "operacje matematyczne" powinno pojawic sie kolejne menu z 7 opcjami dzialan matematycznych. jezeli ta zmienna nie jest zadeklarowana to wszystko ladnie dziala natomiast jej zadeklarowanie juz nie wyswietla przy wyborze 1 opcji menu z 7 opcjami ani odpowiedniego komunikatu przy wyborze 2 i 3 opcji.\
sprobuj jeszcze raz wkleic kod gdyz dodalem w pewnym miejscu
getch()
 aby bylo widac roznice.


Pozdrawiam
Jacek

p.s. przepraszam jakby moj opis byl za bardzo zagmatwany
P-21886
ison
» 2010-09-10 16:21:53
po pierwsze to nie wiem jakim cudem u ciebie ten kod się kompiluje
funkcja pow przyjmuje w argumentach 2 double
477 linijka powinna wyglądać tak:
C/C++
return pow(( double ) liczba_1, 2 );

już pomijając sam fakt warningów

jeśli działa u ciebie _getch() to fajnie byłoby gdybyś na to zamienił wszystkie getch, bo na viście normaly nie działa i muszę za każdym razem je zamieniać :p

jaki związek ma niby zadeklarowanie zmiennej do tego że program źle działa? ;D
P-21888
« 1 »
  Strona 1 z 1