• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Napisz program sprawdzający czy równanie jest równaniem liniowym.

Object Storage Arubacloud
0 głosów
1,709 wizyt
pytanie zadane 18 listopada 2017 w C i C++ przez Patryk Bar Nowicjusz (230 p.)
Witam tak jak w temacie dostałem do rozwiązanie takie zadanie.

Napisz program sprawdzający czy równanie jest równaniem liniowym.

Niby trywialny problem, ale po głębszym zastanowieniu jest masa możliwości.
Wydaje mi się, że treść zadania powinna być bardziej doprecyzowana.
Co wogóle program powinien dostawać na wejściu? Jakieś pomysły?

Dodam, że zadanie jest z działu Pętle „while” i „do ...while” , więc jego rozwiązanie ma się opierać na tej pętli.

2 odpowiedzi

+1 głos
odpowiedź 18 listopada 2017 przez Bondrusiek Maniak (61,370 p.)
wybrane 20 listopada 2017 przez Patryk Bar
 
Najlepsza

Witam,

Ja to widzę tak

1) podajesz liczbę równań std::cin >> ilosc_rownan

2) tworzysz pętle while(ilosc_rownan--) //od razu zmniejszasz wartość może też na końcu pętli dodać ilosc_rownan-=1;

3) podajesz stringiem wyrażenie std::getline(std::cin, wyrazenie);

4)Tutaj zależy jak reprezentujesz potęgę, załóżmy że przy użyciu ^ przy czym nie zapisujesz x^1 tylko samo x

5)Wykorzystujesz metodę string find tworzysz zmienną : size_t found = wyrazenie.find("^")

6)Sprawdzasz co jest pod zmienną found:

if (found!=std::string::npos){/*rownanie linowe*/}else{/*równanie wyższego stopnia*/}

7)Petla znów się iteruje

komentarz 18 listopada 2017 przez Patryk Bar Nowicjusz (230 p.)
Dziękuje, za odpowiedź. Ciekawy pomysł.

Tylko mam jedną wątpliwość. Mianowicie gdy równanie będzie liniowe np. 3x+1 nie będzie znaku ^. Co znajdzie się w zmiennej found?
komentarz 18 listopada 2017 przez Bondrusiek Maniak (61,370 p.)
komentarz 18 listopada 2017 przez SebekChlebek Stary wyjadacz (11,290 p.)
Może trochę zbyt komplikuje ale gdy równaniem będzie, np.: x^2 - x^2 + 2x + 5, to według tego to jest równanie wyższego rzędu co jest nieprawdą. Byś musiał zaznaczyć na wejściu że równanie musi być uproszczone.
komentarz 18 listopada 2017 przez Bondrusiek Maniak (61,370 p.)
Ale Ty podajesz nieuporządkowane(nie wiem jak to jest nazwa w dokładnie w matematyce) równanie. Równania należy podawać w jak najprostszej postaci bo mogą występować takie problemy jak podałeś. Pamiętam jak w liceum na matematyce że jeśli się poda taką nieuporządkowane równania liczby/równania to nie dostaniemy maksymalnej liczby punktów. Np jeśli odpowiedź jest 3/2 to za podanie (3/2)/1 nie dostaje się maksymalnej liczby punktów. Można tworzyć takie nieuporządkowane równania ale nie jest to prawidłowe.

2x^100-2x^100+0x^999+x+1+12-12+0
komentarz 18 listopada 2017 przez Patryk Bar Nowicjusz (230 p.)
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string wyrazenie;

    cout << "Podaj rownaie postaci ax^n+bx^n-1+...+sx^1+t: ";
    getline(cin, wyrazenie);
    size_t found = wyrazenie.find("^");

    cout << found;
    return 0;
}

Dlaczego nie zwraca -1?

Z góry przepraszam dopiero się uczę.

komentarz 18 listopada 2017 przez Bondrusiek Maniak (61,370 p.)

Spoko, dobra pytanie.

W dokumentacji jest napisane że stała string::npos jest zdefiniowana

static const size_t npos = -1;

A jeśli chodzi o funkcje find() to zwraca ona npos jeśli nie ma żądanego wyrazu lub pozycje jego wystąpienia.

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string wyrazenie;

    cout << "Podaj rownaie postaci ax^n+bx^n-1+...+sx^1+t: ";
    getline(cin, wyrazenie);
    size_t found = wyrazenie.find("^");
    if(found != string::npos)
    {
        cout << "Pozycja wystąpienia: " << found << endl;
    }
    else
    {
        cout << "Nie wystepuje found: " << found << " npos: " << string::npos << endl;
cout << static_cast<int>(found) << endl;

    }

    return 0;
}

Trzeba by się przyjrzeć liczbie 4294967295 (jakiego używasz kompilatora ja MinGW 4.9.2 32bit taka sama liczba). Przekonwertuj tą liczbę na int bo size_t to unsigned int.

cout << static_cast<int>(found) << endl;

Google Translator(http://www.cplusplus.com/reference/string/string/npos/)

Stała ta jest definiowana z wartością -1, która ponieważ size_t jest typem całkowitym bez znaku, jest to największa możliwa do przedstawienia wartość dla tego typu.

komentarz 20 listopada 2017 przez Patryk Bar Nowicjusz (230 p.)
Dziękuje, wszystko jasne.
0 głosów
odpowiedź 18 listopada 2017 przez Aisekai Nałogowiec (42,190 p.)
1.Pobierz stringa który będzie równaniem.

2a. Jeżeli wyszukasz x, za pierwszym razem, a okaże się że go nie ma - znaczy że równanie nie jest liniowe.

2b. W pętli while:  Wyszukuj 'x'.

3. Sprawdź co stoi dalej za x. Jeżeli symbol '^', sprawdź co stoi dalej. Jeżeli cyfra różna od 1, napisz że nie jest i skończ. Jeżeli 1, to sprawdź następny char w równaniu. Jeżeli będzie to liczba napisz, że nie jest. Jeżeli będzie to znak (+,-,dzielenie itd)  powróć do kroku drugiego (2b), tylko zacznij wyszukiwać od indeksu +1 gdzie znajdował się x.

 

Przy czym, to powinno zadziałać dla równań gdzie stopień potęgi zapisujesz przy pomocy '^'. Dla równań w którym występują (np) x*x, musiałbyś sprawdzać jeszcze następne chary czy nie występuje coś takiego.

Podobne pytania

0 głosów
1 odpowiedź 462 wizyt
0 głosów
1 odpowiedź 447 wizyt
pytanie zadane 25 marca 2020 w C i C++ przez Ola_00 Nowicjusz (210 p.)
0 głosów
2 odpowiedzi 188 wizyt
pytanie zadane 24 listopada 2019 w C i C++ przez eweline Nowicjusz (120 p.)

92,555 zapytań

141,402 odpowiedzi

319,538 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...