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

równania

Ostatnio zmodyfikowano 2011-05-23 15:45
Autor Wiadomość
aimo1
Temat założony przez niniejszego użytkownika
równania
» 2011-05-19 17:33:43
piszę program go rozwiązywania równań
mam kod:
C/C++
#include <iostream>
int main()
{
    int l;
    int p;
    int menu;
    int Menu;
    int licznik = 0;
    int str = 1;
    int liczba[ 3 ][ 10 ];
    int x[ 3 ][ 10 ];
    int znak[ 3 ][ 10 ];
    char X[ 3 ][ 10 ];
    using namespace std;
    cout << "podaj równanie";
    do
    {
        if( str == 1 )
        {
            cout << endl << "1)liczba" << endl << "2)x" << endl << "3)p" << endl << "4)koniec"; //tu należy wybrać czy pod 1 liczbą //ma się zapisać zwykła liczba czy z niewiadomą , p oznacza 2 stronę równania
            cin >> menu;
            switch( menu )
            {
            case 1:
                cout << endl << "podaj liczbę" << endl;
                cin >> liczba[ 1 ][ licznik ];
                x[ 1 ][ licznik ] = 0;
                X[ 1 ][ licznik ] = ' ';
                break;
            case 2:
                cout << endl << "podaj liczbę" << endl;
                cin >> liczba[ 1 ][ licznik ];
                x[ 1 ][ licznik ] = 1;
                X[ 1 ][ licznik ] = 'x';
                break;
            case 3:
                str = 2;
                break;
            case 4:
                return 0;
                break;
            default:
                return 0;
            }
        }
        if( str == 1 )
        {
            cout << "podaj znak:" << endl << "1)+" << endl << "2)-" << endl << "3)/" << endl << "4)*" << endl; //teraz należy podać //znak dla 1 liczby
            cin >> Menu;
            switch( Menu )
            {
            case 1:
                znak[ 1 ][ licznik ] = '+';
            case 2:
                znak[ 1 ][ licznik ] = '-';
            case 3:
                znak[ 1 ][ licznik ] = '/';
            case 4:
                znak[ 1 ][ licznik ] = '*';
            }
        }
        if( str == 2 )
        {
            cout << endl << "1)liczba" << endl << "2)x" << endl << "3)s" << endl << "4)koniec"; //jeśli str == 2 (po użyciu p ) //pyta się o 2 stronę
            cin >> menu;
            switch( menu )
            {
            case 1:
                cout << endl << "podaj liczbę" << endl;
                cin >> liczba[ 0 ][ licznik ];
                x[ 2 ][ licznik ] = 0;
                X[ 2 ][ licznik ] = ' ';
                break;
            case 2:
                cout << endl << "podaj liczbę" << endl;
                cin >> liczba[ 2 ][ licznik ];
                x[ 2 ][ licznik ] = 1;
                X[ 2 ][ licznik ] = 'x';
                break;
            case 3:
                str = 0;
                break;
            case 4:
                return 0;
                break;
            default:
                return 0;
            }
        }
        if( str == 2 )
        {
            cout << "podaj znak:" << endl << "1)+" << endl << "2)-" << endl << "3)/" << endl << "4)*" << endl;
            cin >> Menu;
            switch( Menu )
            {
            case 1:
                znak[ 1 ][ licznik ] = '+';
            case 2:
                znak[ 1 ][ licznik ] = '-';
            case 3:
                znak[ 1 ][ licznik ] = '/';
            case 4:
                znak[ 1 ][ licznik ] = '*';
            }
        }
        if( str == 0 ) // w 2 stronie zamiast p jest s tzn sprawdzenie równania i tu miało je wyświetlić ale pojawia się //jakiś ciąg liczb
        {
            int strr = 1;
            for( licznik = 0; licznik < 9; licznik++ )
            {
                if( licznik < 9 ) strr = 2;
               
                cout << liczba[ strr ][ licznik ] << X[ strr ][ licznik ] << znak[ strr ][ licznik ];
            }
        }
    } while( 100 == 100 );
   
}

i po przejściu do str==0 pojawiają się liczby , ciąg bezsensownych znaków
ma ktoś pomysł dlaczego?
P-33198
absflg
» 2011-05-19 18:02:44
Zlituj się nad nami i sobą. Jeżeli chcesz, żeby ktoś pomagał ci w kodzie, który jest dłuższy niż 10-12 linijek to choć poślednio wytłumacz jego działanie w komentarzach.

Znaczniki kodu C++ na tym forum to [ cpp ][/ cpp ].
P-33200
dmx81
» 2011-05-20 16:04:11
probowalem to uruchomic, ale szczerze nie rozumiem za bardzo, o co tam chodzi. w pierwszym menu mam do wyboru:

liczba, x, p, koniec (nie rozumiem co ktore robi)

podajac np nr1 (liczba) program prosi o liczbe, nastepnie o znak (nie wiadomo, czy podac nr opcji, czy wklepac znak)
wpisuje liczbe - menu sie znow powtarza, wpisuje znak (np +) - program sie zapetla...

Po pierwsze, okresl sobie zadania, jakie ma spelniac ten program, a najlepiej pojedynczo - zrealizuj jedno zadanie, jesli bedzie dzialalo, dodaj kolejne.
Po drugie - analizuj swoj kod - sprawdzaj linia po linii co sie bedzie dzialo, jesli ...

nie wiem czy wiesz, ale masz warunek
if(str==1)
, nie ma mozliwosci jego zmiany (tzn str na inna wartosc) wiec ten drugi if sie nie wykona
(if(str==2))

Ze wzgledu na zbyt duza ilosc bledow, ciezko tu cokolwiek podpowiedziec - tak jak napisalem powyzej, okresl dokladnie, co program ma robic i po kroczku to rozpisz - poza tym wprowadz cos takiego, jak kontrola poprawnosci danych (ktos zamiast 5 poda G?)
P-33224
aimo1
Temat założony przez niniejszego użytkownika
» 2011-05-23 07:32:27
jest możliwość zmiany str po wciśnięciu 3 (czyli p (p=prawa))
jednak problem jest gdy ma to się wyświetlić zaczynają się ciągle powtarzać się jakieś dziwne liczby
chcę wyświetlić równanie aby sprawdzić czy zapisuje się poprawnie
poza tym jest coś takiego jak obsługa błędów a mianowicie "default" gdy użytkownik wciśnie litere (np g ) program się zamknie
P-33355
absflg
» 2011-05-23 15:45:28
Nie widzę tu (w twoim programie) rozwiązania, ale to to co wydaje się osobliwe:
- zaraz po zamknięciu bloku if(str==1) otwierasz drugi, identyczny.
- wprowadzanie 1. i 2. strony jest niemal identyczne. Dlaczego więc zdublowałeś kod wprowadzania? Możesz przez to pominąć coś przy wprowadzaniu poprawek. Zamiast stawiać warunków odwołuj się do indeksów [str] tablic.
- nie rozróżniaj nazw zmiennych wyłącznie za pomocą wielkości liter, bo najpewniej w końcu doprowadzi cię to do trudnych do wykrycia pomyłek w kodzie.
- nie przyzwyczajaj się do pisania 100 == 100. Wystarczy zostawić pusty nawias lub choć wstawić po prostu 1, 100 czy true. Porównywanie wartości to też operacja dla komputera.

A tu w działaniu:
- przy wprowadzaniu znaków dla str==2 wprowadza je do [1][licznik]. Nie powinno być analogicznie do reszty [2]?
- W równaniu kolejność wyrażeń nie jest dowolna. Nie możesz więc przyjąć takiego zapisu, bo nie zapamiętuje on kolejności wszystkich wyrażeń, a jedynie oddzielnie liczb bez niewiadomej i z niewiadomą.

Zauważ kilka ważnych rzeczy:
- Liczba (lub wyrażenie z niewiadomą) może być ujemne lub dodatnie i NIE jest to operacja.
- Odejmowanie można traktować jako dodawanie wyrażenia ujemnego.
- Dzielenie można traktować jako mnożenie liczby odwrotnej, więc a/b = a*(1/b).
Zostaje więc tylko dodawanie lub mnożenie + zapis w ramach wyrażenia, że jest one ujemne i/lub odwrotne. Oczywiście to mój koncept.

Kolejność wykonywania działań jest bardzo ważna - aby twój dalszy program mógł przetworzyć równanie, należy grupować wyrażenia, czyli stosować zapis taki, jak gdyby były w nim nawiasy:
((a*b)+((c*d)*e))+g = h
Powyższe jest zapisem równoznacznym z
a*b+c*d*e+g = h
Jeżeli równanie będzie rozpatrywane od lewej do prawej, czyli
((((a*b)+c)*d)*e)+g = h
w prawie żadnym wypadku nie zostanie poprawnie rozwiązane...
Można więc przyjąć, że zapis ten jest w pewien sposób "drzewiasty". Odpowiednie więc wydaje się drzewo.
Na naszym przykładzie:
http://tinypic.com/r/23l13ir/7
(Oczywiście chcą tak odwzorowywać niezbędna jest znajomość przynajmniej prostych struktur i wskaźników.)

P-33367
« 1 »
  Strona 1 z 1