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

Co sądzicie o tym kodzie?

Cloud VPS
0 głosów
513 wizyt
pytanie zadane 1 grudnia 2015 w C i C++ przez dziubi21 Początkujący (310 p.)
Witam, oto mój kod z zadania "Napisz niewielki kalkulator, który pobiera na wejściu jeden z operatorów arytmetycznych
oraz dwa argumenty, po czym wyświetla wynik obliczeń otrzymany na podstawie tych
danych.". Co o nim sądzicie czy powinienem go inaczej ugryźć czy na początek takie coś wystarczy?


#include <iostream>

using namespace std;
int liczba1, liczba2;
string dzialanie;

int main()
{
cout << "Podaj 1 liczbe: " ;
cin >> liczba1;
cout << "\nPodaj 2 liczbe: " ;
cin >> liczba2;
    cout << "\nPodaj dzialanie" << endl;
    cin >> dzialanie;
    if (dzialanie=="+")
    {
    cout <<liczba1 <<" + " << liczba2 <<" = " <<liczba1 + liczba2;
    }
    else if (dzialanie == "-")
    {
    cout << liczba1 << " - " << liczba2 << " = " << liczba1 - liczba2;
    }
    else if (dzialanie == "*" )
    {
    cout << liczba1 << " * " << liczba2 << " = " << liczba1 * liczba2;
    }
    else
    {
    cout << liczba1 << " / " << liczba2 << " = " << liczba1 / liczba2;
    }
    return 0;
}

 

5 odpowiedzi

+1 głos
odpowiedź 1 grudnia 2015 przez juriiw Gaduła (3,470 p.)
Spróbuj podstawić do zmiennej liczba2 - zero i wybierz działanie "/".
komentarz 1 grudnia 2015 przez dziubi21 Początkujący (310 p.)
Jak się pozbyć zera przy dzieleniu?
komentarz 1 grudnia 2015 przez Szahid Pasjonat (20,970 p.)
możesz się go pozbyć używając instrukcji warunkowej if a konkretniej zagnieżdzić if w ifie

np

if( dzialanie=="/" )

{

     if(liczba2==0)

     { cout<<"Pamiętaj Cholero nie dziel przez 0"<<endl}

    else {cout<<liczba1/liczba2<<endl}

}
0 głosów
odpowiedź 1 grudnia 2015 przez radek024 Szeryf (77,160 p.)
Można to zrobić za pomocą switcha, ale jeżeli się uczysz i jeszcze go nie znasz, nie jest źle ;).
komentarz 1 grudnia 2015 przez niezalogowany
Ja powiem, że osobiście switch-a nie lubię :) Jest (moim zdaniem) brzydki, niepraktyczny i ogólnie jakiś taki niefajny ;)
komentarz 1 grudnia 2015 przez draghan VIP (106,230 p.)
@filipeczek7: W pewnych sytuacjach aż się narzuca użycie switcha, np. kiedy musisz sprawdzić po kolei wszystkie wartości zmiennej typu wyliczeniowego. Switch jest w tym przypadku znacznie czytelniejszy niż cała lawina if-else i w dodatku kompilator ostrzeże, jeśli zapomnimy o jakiejś wartości.

@radek024: Konstrukcji switch możemy użyć tylko w przypadku egzaminowania typów numerycznych całkowitoliczbowych.
komentarz 1 grudnia 2015 przez radek024 Szeryf (77,160 p.)
Kiedyś miałem kod w którym został użyty char, nie było problemu z działaniem. Użyć tylko czy jest wskazane?
komentarz 1 grudnia 2015 przez draghan VIP (106,230 p.)
Zauważ, że char jest tylko ośmiobitową liczbą całkowitą, która w pewnych przypadkach jest traktowana wyjątkowo. ;)
komentarz 1 grudnia 2015 przez niezalogowany
@draghan - no, ja jednak właśnie wolę ify-else ify-elsy :) Jakoś mi tak wygodniej, to już kwestia gustu i przywyczajenia ;)
0 głosów
odpowiedź 1 grudnia 2015 przez Mikrokontroler xD Stary wyjadacz (13,500 p.)

Fajnie że coś robisz ale mam dla Ciebie zadanie 

Wprowadź następujące dane

Pierwszy przypadek
liczba1 = 10;
liczba2 = 0; 
dzialanie="/";
Pytanie do Ciebie dlaczego to nie zadziała.

Drugi przypadek
liczba1 = 5;
liczba2 = 2;
dzialanie= "dasdasdaadsada";
Pytanie do Ciebie dlaczego wyniki jest nieprawdziwy i dlaczego wykonałem dzielenie?

Trzeci Przypadek
liczba1 = 2147483647;
liczba2 = 3;
dzialanie = "+";
Pytanie do Ciebie dlaczego wynik nie jest równy 2147483648?;

Podoba mi sie twój program bo sam kiedyś identyczny napisałem jednak potestuj sobie z tymi parametrami i postaraj się wyciągnąć wnioski :) oraz postaraj się odpowiedzieć na pytania :) nie koniecznie tutaj ale dla siebie :D.

 

komentarz 1 grudnia 2015 przez dziubi21 Początkujący (310 p.)
#include <iostream>



using namespace std;
long double liczba1, liczba2, wynik;
string dzialanie;

int main()
{

cout << "Podaj 1 liczbe: " ;
cin >> liczba1;
cout << "\nPodaj 2 liczbe: " ;
cin >> liczba2;
    cout << "\nPodaj dzialanie" << endl;
    cin >> dzialanie;


    if (dzialanie=="+")
    {
    wynik == (liczba1 + liczba2);
    

    cout <<liczba1 <<" + " << liczba2 <<" = " <<liczba1 + liczba2;
    }
    else if (dzialanie == "-")
    {
    cout << liczba1 << " - " << liczba2 << " = " << liczba1 - liczba2;
    }
    else if (dzialanie == "*" )
    {
    cout << liczba1 << " * " << liczba2 << " = " << liczba1 * liczba2;
    }
    else if (dzialanie=="/")
    {
    if(liczba2 ==0)
    {
    cout << "Pamietaj Cholero nie dziel przez zero";
    }
    else
    {

    cout << liczba1 << " / " << liczba2 << " = " << liczba1 / liczba2;
    }
    }
    else
    {
    cout << "Dzialanie nieprawidlowe";
    }

    return 0;
}

Coś takiego lepsze

komentarz 1 grudnia 2015 przez Mikrokontroler xD Stary wyjadacz (13,500 p.)
całkiem fajnie jak na początek :)
ale z tym long double nie rozwiązałeś do końca problemu bo jak wymnożysz 2 bardzo duże liczby znowu będziesz miał to samo co wcześniej z int-em :).

weś uwagę rady reszty użytkowników bo są bardzo istotne :).
0 głosów
odpowiedź 1 grudnia 2015 przez Szahid Pasjonat (20,970 p.)
edycja 1 grudnia 2015 przez Szahid

Widzę że jesteś dumny ze swojego pierwszego kodu i chcesz się nim  pochwalić. Też tak miałem. Ten kod to nic specjalnego jednak możemy udzielić Ci paru rad. (  nie to że się czepiam ale dla teningu) 

 

1. Zabezpiecz program przed błędami urzytkownika. Np jak będzie chciał dzielić przez 0 albo zamiast liczby 4 wpisze słowo "cztery" lub po prostu walnie głową w klawiature i kliknie enter.

2. Dowiedz się o nipezpieczeństwie stosowania zmiennych globalnych

3. [INFO] używając dyrektywy ( mam nadzieje że dobrze określiłem) using w całym programie odcinasz sobie możliwość używania innych przestrzeni nazw.Tzn możesz ich używać ale jeśli ich elemnty będą się nazywały tak samo to narobisz sobie problemów.

 

Jak coś jest nie jasne to pisz 

–1 głos
odpowiedź 1 grudnia 2015 przez Patrycjerz Mędrzec (192,320 p.)

Nie ma co tu wiele oceniać, ale ja bym nie używał zmiennych globalnych oraz using namespace std.

komentarz 1 grudnia 2015 przez C☺ndzi Stary wyjadacz (12,100 p.)
Co jest złego w using namespace std; ?
komentarz 1 grudnia 2015 przez niezalogowany
Ja osobiście używam w takich małych programikach zmiennych globalnych, tylko że ja wiem, kiedy lepiej użyć globalną, a kiedy nie i to już raczej nie jest przywyczajenie, tylko po prostu w takich małych programikach jakoś mi te globale nie przeszkadzają ;)

No i dołączam się do pytania Condziego: czemu niby lepiej nie używać standardowej przestrzeni nazw? Zaoszczędza ciągłego stosowania przedrostka std::, więc nie wiem co w tym złego :)
komentarz 1 grudnia 2015 przez Radfler VIP (101,030 p.)

Ze zmiennych globalnych powinno się korzystać w ostateczności. Nawet przy małych programikach lepiej umieszczać zmienne w funkcjach. http://stackoverflow.com/questions/484635/are-global-variables-bad

Z using namespace std też się nie powinno korzystać, gdyż zawsze istnieje ryzyko wieloznaczności. Nawet jeżeli nie używamy zewnętrznych bibliotek, to powinniśmy stosować się do takich drobnych niepisanych zasad. http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice

komentarz 1 grudnia 2015 przez niezalogowany
Jeśli chodzi o zmienne globalne, to ja już nie mam zdania, ja w małych programikach będę ich używał ile chcę i głowa mi od tego nie spadnie.

Jeśli chodzi o przestrzenie nazw, to wiem co nie co o nich, ale chyba jeszcze nie umiem samemu takiej zrobić, bo za bardzo się tym nie interesowałem i tylko trochę zrozumiałem, jakoś na razie nie jest mi to potrzebne. Skoro póki co nie używam więcej niż dwóch przestrzeni nazw (std i sf, zależy w jakich sytuacjach), to nie powinienem mieć żadnego problemu. To samo co u zmiennych globalnych, jak się coś dobrze używa z umiarem to nic się nie powinno stać. A o ile wiem, to przestrzenie nazw mają zapobiegać błędom, które wyrzuci kompilator przez to, że zauważy dwie takie same nazwy funkcji (tylko że każda w innej przestrzeni). No więc czy nie da się zrobić wyjątku i mimo to, że jest using namepsace foo i using namespace bar, użyć sobie w wyjątkowych sytuacjach przedrostka foo::?

Podobne pytania

0 głosów
2 odpowiedzi 447 wizyt
pytanie zadane 23 lutego 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
+1 głos
0 odpowiedzi 355 wizyt
0 głosów
1 odpowiedź 721 wizyt
pytanie zadane 28 października 2020 w C i C++ przez rain.deer Początkujący (430 p.)

93,483 zapytań

142,417 odpowiedzi

322,763 komentarzy

62,895 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

Kursy INF.02 i INF.03
...