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

[C++] Dzielenie za pomocą odejmowania

Object Storage Arubacloud
0 głosów
4,000 wizyt
pytanie zadane 1 listopada 2016 w C i C++ przez szerwi Użytkownik (620 p.)
edycja 1 listopada 2016 przez szerwi

Witam,

 

Myślę nad projektem stworzenia kalkulatora, który przy swoich obliczeniach będzie brał pod uwagę kolejność wykonywania działań. Chcę stworzyć kod, który dzielenie oraz mnożenie będzie zamieniał na dodawanie i odejmowanie. Mnożenie udało mi się zrobić, jednak mam problem z dzieleniem. Trochę poczytałem w internecie, jednak nie znalazłem na to odpowiedzi.

Na razie mam coś takiego:

#include <iostream>
#include <stdio.h>

using namespace std;

int main()
{
    int liczba, dzielnik, wynik;
    cout << "Podaj liczbe: ";
    cin >> liczba;
    cout << "Podaj dzielnik: ";
    cin >> dzielnik;

    if(liczba>=dzielnik)
    {
        liczba = liczba - dzielnik;
    }
    wynik = dzielnik - liczba;

    cout << wynik << endl;
    return 0;
}

Jednak program po wprowadzeniu liczb 10 (liczba) i 5 (dzielnik) podaje wynik 0.

Ktoś ma propozycję jak to rozwiązać? :) 

6 odpowiedzi

+1 głos
odpowiedź 1 listopada 2016 przez niezalogowany

Najpierw odejmujesz od liczby dzielnik, a w wyniku odejmujesz dzielnik od wcześniej odjętej liczby co w rezultacie daje zero. Moja propozycja, w ifie dodaj to. 

while(liczba!=0)
{
    liczba -= dzielnik;
    i++;
}

Na koniec zamiast wyniku wyświetl i.

komentarz 1 listopada 2016 przez szerwi Użytkownik (620 p.)
Możesz wysłać jak powinna wyglądać cała pętla? Mam błąd: error: 'i' was not declared in this scope
komentarz 1 listopada 2016 przez niezalogowany
Zadeklaruj zmienną int i=0.
komentarz 1 listopada 2016 przez szerwi Użytkownik (620 p.)
Hmm, wynik wychodzi o 1 mniejszy niż powinien, i jak zrobić aby były także ułamki (np 0,5). Zamieniłem int na float, jednak przy działaniu np 10:20 wynik podaje 0
komentarz 1 listopada 2016 przez niezalogowany

Przy jakich danych wychodzi ci wynik o jeden mniejszy? Trzymaj twój kod z moją poprawką.

#include <iostream>
#include <stdio.h>

using namespace std;

int main()
{
    int liczba, dzielnik, wynik;
    int i=0;
    
    cout << "Podaj liczbe: ";
    cin >> liczba;
    cout << "Podaj dzielnik: ";
    cin >> dzielnik;

    if(liczba>=dzielnik)
    {
        while(liczba!=0)
        {
            liczba -= dzielnik;
            i++;
        }
    }
    
    cout << i << endl;
    
    return 0;
}
komentarz 1 listopada 2016 przez szerwi Użytkownik (620 p.)
Działa, tylko jak jeszcze zrobić aby można było otrzymywać także wynik np 0,5? I jak można to zastosować w kalkulatorze, który zgodnie z kolejnością wykonywania działań obliczy 2+2*4:2?
0 głosów
odpowiedź 1 listopada 2016 przez ThePatrykOOO Dyskutant (8,400 p.)

Nie wiem czy dobrze to zrobiłem i czy to miałeś na myśli, ale dzielenie to wygląda w taki sposób nie wiem co chciałeś osiągnąć to swoim kodem(chodzi mi głównie o tego ifa). 

Masz tutaj mój kod: 

#include <iostream>
using namespace std;
int main(int liczba, int dzielnik, int wynik)
{
    cout << "Podaj liczbe: ";
    cin >> liczba;
    cout << "Podaj dzielnik: ";
    cin >> dzielnik;

    wynik = liczba / dzielnik;
    cout << wynik << endl;
    return 0;
}

 

komentarz 1 listopada 2016 przez szerwi Użytkownik (620 p.)
Przeczytaj całe pytanie. Chodzi o to aby zostało to zamienione na dodawanie/odejmowanie aby przy dłuższych działaniach było liczone zgodnie z kolejnością wykonywania działań.
0 głosów
odpowiedź 1 listopada 2016 przez szerwi Użytkownik (620 p.)
Tak teraz myślę, to chyba jednak ten sposób się nie sprawdzi. Jak napisać program który poprawnie obliczy nam działanie 2+2*4:2?
komentarz 1 listopada 2016 przez jradlica Obywatel (1,540 p.)
edycja 1 listopada 2016 przez jradlica
Masz stringa STR1: "23*4:2" bierzesz pierwszy znak jeżeli to jest liczba do zmiennej POM1 (String) dodajesz ten znak aż do napotkania znaku typu +-/*  jeżeli wystąpi któryś z tych znaków dodajesz go do zmiennej OPERATOR (w tym przypadku *) potem dodajesz do POM2 wszystkie następne znaki po operatorze aż do napotkania nastepnego operatora (w tym przypadku ':') i zapamiętujesz na której pozycji skończyłeś sprawdzać znaki. wykonujesz operację WYNIK = POM1 OPERATOR POM2 i wynikiem jest STR1=WYNIK+STR(od miejsca w którym skończyłeś, do końca). Rozumiesz?

Masz wyrażenie 123*432/12*14 (STR1)

POM1= 123  OPERATOR=*    POM2=432 WYNIK=53136
STR1=53136/12*14

POM1=53136 OPERATOR=/ POM2=12 WYNIK = 4428
STR1=4428*14

POM1 = 4428 OPERATOR=* POM2=14 WYNIK=61992
STR1=61992 - STR1 nie ma już żadnych operatorów więc kończysz. i zwracasz STR1 jako wynik.

To przy założeniu że występuje tylko mnożenie i dzielenie. Powinno spełniać swoje zadanie w twoim przypadku.

 

Z dodawaniem i dzieleniem było by nieco podobnie tylko sprawdzam warunek czy jak OPERATOR = - albo + to czy  następny operator po POM2 nie równa się = * / (OPERATOR 2) jeżeli się równa to pomijam na razie POM1 i OPERATOR i zaczynam zassysać dane od początku POM2 i potem przy doklejaniu po prostu STR1=POM1+OPERATOR+WYNIK+STR(od miejsca OPERATOR3, do końca)
komentarz 1 listopada 2016 przez szerwi Użytkownik (620 p.)
W programowaniu jestem nowy, i trochę nie rozumiem. Mógłbyś napisać mi kod? :)
komentarz 1 listopada 2016 przez jradlica Obywatel (1,540 p.)
Zaraz ci napiszę początek.

 

#Edit teraz tego jednak nie zrobię, nie pisze w c++ więc nie wiem czym obrobić stringi, postaram się jutro wieczorem wstawić rozwiązanie.
0 głosów
odpowiedź 1 listopada 2016 przez jradlica Obywatel (1,540 p.)
Dlaczego nie zrobisz po prostu : return liczba/dzielnik; skoro i tak operujesz na intach? Po co bawić się w odejmowanie w tym przypadku?
komentarz 1 listopada 2016 przez szerwi Użytkownik (620 p.)
Próbuję zrobić kalkulator, który zgodnie z kolejnością wykonywania działań obliczy np 2+2*4:2 :)
0 głosów
odpowiedź 1 listopada 2016 przez niezalogowany
edycja 2 listopada 2016

Ja proponuję żeby wczytywać naprzemiennie liczbę i znak w odpowiedni sposób. Możesz wtedy odpowiednio manipulować elementami. Wybrałem do wykonania zadania kontener zamiast tablicy (bo można usuwać elementy), ale bez niego też się da to zrobić. Zamieszczam cały kod, bo tłumaczenie Ci co musisz zrobić po kolei jest długie i wyboiste i można się pomylić łatwo :D

#include <iostream>
#include <vector>

using namespace std;


int main()
{
    /* Tablice na liczby i na znaki*/
    vector<float> liczby;
    vector<char> dzialania;

    cout<<"Podaj dzialanie zakonczone znakiem rowności: ";
    while(true)
    {
        float liczba;
        char dzialanie;

        if(cin>>liczba) // jezeli udalo sie wczytac liczbe to umiesc ja w tablicy
            liczby.push_back(liczba);
        else continue; // jezeli nie to zacznij petle od nowa

        cin>>dzialanie;

        if(dzialanie == '=') break; // jezeli ktos poda '=' zakoncz petle
        dzialania.push_back(dzialanie); // jezeli cos innego to dzialaj dalej

    }

    /* Wypisywanie rownania */
    for(int i=0; i<dzialania.size(); i++)
        cout<<liczby[i]<<dzialania[i];
    cout<<liczby.back()<<endl;

    /* Wykonywanie mnozenia i dzielenia */
    for(int i=0; i<dzialania.size();)
    {
        if(dzialania[i] == '*')
        {
            /*
            Majac dzialanie np 2+3+5=
            */
            liczby[i] = liczby[i] * liczby[i+1]; // sumujemy 2 i 3 i wpisujemy do pierwszej komórki kontenera
            liczby.erase(liczby.begin()+i+1); // usuwamy komórkę z trójką, bo już ją dodaliśmy do pierwszej
            dzialania.erase(dzialania.begin()+i); // usuwamy to dzialanie bo je juz wykonalismy
            // zauwaz, ze nie ma sensu zwiekszania iteracji jezeli wykonalismy dzialanie
        }
        else if(dzialania[i] == '/')
        {
            liczby[i] = liczby[i] / liczby[i+1];
            liczby.erase(liczby.begin()+i+1);
            dzialania.erase(dzialania.begin()+i);
        }
        else i++; // ma sens jak niewykonalismy zadnego dzialania
    }

    for(int i=0; i<dzialania.size(); i++)
    cout<<liczby[i]<<dzialania[i];
    cout<<liczby.back()<<endl;

    /* Wykonywanie dodawania i odejmowania */
    for(int i=0; i<dzialania.size();)
    {

        if(dzialania[i] == '+')
        {
            liczby[i] = liczby[i] + liczby[i+1];
            liczby.erase(liczby.begin()+i+1);
            dzialania.erase(dzialania.begin()+i);
        }
        else if(dzialania[i] == '-')
        {
            liczby[i] = liczby[i] - liczby[i+1];
            liczby.erase(liczby.begin()+i+1);
            dzialania.erase(dzialania.begin()+i);
        }
        else i++;

    }

    cout<<liczby[0]; // wynik!


    return 0;
}
0 głosów
odpowiedź 3 listopada 2016 przez szerwi Użytkownik (620 p.)
Ma ktoś jeszcze jakieś pomysły? :)
komentarz 4 listopada 2016 przez DragonCoder Nałogowiec (36,500 p.)
https://pl.m.wikipedia.org/wiki/Odwrotna_notacja_polska

 

Tego mozesz uzyc, program bedzie uznawal znaki przy wiekszej ilosci liczb i z znakow....

Na dwlch liczbach to nie problem, ale jezeli chcesz dzialania typu 2+2*4/8 to radze uzyc tego alorytmu.... stworzyc tablice, najlepiej dynamiczna alokacja pamieci i zmien int na double....

Podobne pytania

0 głosów
1 odpowiedź 2,841 wizyt
0 głosów
2 odpowiedzi 987 wizyt
pytanie zadane 29 stycznia 2017 w C i C++ przez WireNess Stary wyjadacz (11,240 p.)
0 głosów
1 odpowiedź 1,957 wizyt

92,555 zapytań

141,402 odpowiedzi

319,539 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!

...