[C++] Prosty kalkulator


(G7996095) #1

Obiecuje - tym razem nie usunę :) 

 

Mam takie zadanie: 


(kostek135) #2

Nie da się zrozumieć co piszesz.

Strasznie powtarzasz kod, spróbuj to zrobić tak, by miec petle, która zakonczysz, jeśli wejdziesz w coś innego niż default:

do {
    jakasZmienna = false;

    switch() {
        ...
        
        default:
            jakasZmienna = true;
    }
} while(jakasZmienna)

Analogicznie jak punkt 2.


(pionner) #3

Bez sensu przepisujesz drugi raz praktycznie to samo w default, zrób tak jak napisał kostek.

Co do liczb zmiennoprzecinkowych poeksperymentuj z przecinkami i kropkami. Ogólnie Windows z ustawioną lokalizacją na Polski będzie wymagał wpisania liczby zmiennoprzecinkowej z przecinkiem. Pamiętaj, że jeśli podajesz liczbę w kodzie, zawsze używasz kropki, niezależnie od ustawień systemowych.


(Qoo) #4

Olałeś przypadek dzielenia przez 0


(G7996095) #5

 

Żeby olać trzeba najpierw wiedzieć, że komputer sobie nie da rady :stuck_out_tongue: Rozmawiasz z amatorem. 

 

Więc udało mi się coś osiągnąć, a mianowicie od wprowadzenia liczby do wyniku jest pętla. Nie mogę spełnić warunku by pętla się zchrzaniła przy obliczeniach = 0. 

 

// Kalkulator.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"
#include <iostream>


int wybor;
float liczba1, liczba2;


int _tmain(int argc, _TCHAR* argv[])
{
do
{
std::cout << "\tWpisz liczbe: ";
std::cin >> liczba1;
std::cout << "Jakie dzialanie chcesz wykonac? \n";
std::cout << "[1] Dodawanie" << std::endl;
std::cout << "[2] Odejmowanie" << std::endl;
std::cout << "[3] Mnozenie" << std::endl;
std::cout << "[4] Dzielenie \n" << std::endl;;


std::cout << "Wybierz: ";
std::cin >> wybor; //uztkownik wybiera dzialanie


switch (wybor)
{
do
{
case 1:   // w przypadku wyboru 1
std::cout << "Podaj druga liczbe: ";
std::cin >> liczba2;
std::cout << "Twoj wynik to: " << (liczba1 + liczba2);
break;
case 2:   // analogicznie
std::cout << "Podaj druga liczbe: ";
std::cin >> liczba2;
std::cout << "Twoj wynik to: " << (liczba1 - liczba2);
break;
case 3:
std::cout << "Podaj druga liczbe: ";
std::cin >> liczba2;
std::cout << "Twoj wynik to: " << (liczba1 * liczba2);
break;
case 4:
std::cout << "Podaj druga liczbe: ";
std::cin >> liczba2;
if (liczba1 == 0 || liczba2 == 0)
std::cout << "Pamietaj cholero - nie dziel przez 0!" << std::endl;
else
std::cout << "Twoj wynik to: " << (liczba1 / liczba2);
break;
} while (liczba1 > 0 || liczba2 > 0); //petla sie powtarza poki liczby sa wyzsze od 0
} 
} while (wybor>0 && wybor<=4); //petla sie powtarza poki wybor nie miesci sie w widelkach menu


getchar(), getchar();


return 7;
}

Program nie liczy wartosci podzielonych przez zero. Wbrew mojej woli jednak zaczyna od nowa…  prawdopodobnie jedna petla wpada mi w drugą, ale pomyślę o tym jutro. 


(pio_95) #6

Na pewno dobrze zrozumiałeś opis programu?

To “obecny” sugerowało by mi, że trzymamy non stop jakiś wynik, na którym wykonujemy odpowiednie działanie z przypisaniem.


(mikolaj_s) #7

Skoro zadanie ma być odporne na użytkownika to nie możesz wczytywać liczb tylko stringi, które będziesz analizował i tworzył z nich liczby. Wtedy nie straszne Ci czy system używa kropki dziesiętnej czy przecinka. Jako test poprawności podejrzewam nauczyciel będzie wciskał losowe klawisze. Spróbuj w dowolnym miejscu uruchomionego programu zacząć opierać się na klawiaturze wciskając losowe znaki, niektórzy tak testują :wink:

 

“bo ktoś kto to pisał słabo redaguje myśli”

Jeszcze nie widziałeś jak wyglądają treści zadań na konkursach. Tam celowo pisze się głupoty w treści, żeby zaciemnić jego treść.


(G7996095) #8

 

Gościu, ja nie startuje w jakiś konkursach. Nie mam spiny o to, że walę błędy. Ja to robię w wolnym czasie, a nie po to by startować w jakiś konkursach… 

Funkcja (czy czym tam) string jest jeszcze nie była wprowadzana. Znam ją z innego kursu, wiem że istnieje, ale zadanie ma polegać na jego wykonaniu bez znajomości stringów. Wprowadzono char, ale w moim kalkulatorze nie mogę znaleźć dla niego zastosowania… jak na razie. 

 

Jak chcesz pomóc - proszę bardzo. Jak przyszedłeś narzekać to niespecjalnie widzę sens marnowania czasu tutaj.

 

 

Z tego co patrzyłem na forum cppox.pl to tam różne kalkulatory lądowały, i nie każde z takim menu, czy takim mechanizmem. Są kalkulatory gdzie najpierw pyta się o dwie liczby, są gdzie najpierw trzeba wybrać działanie. W moim zadaniu masz jedną pętlę wpisaną w drugą. Na forum cppox.pl znajdziesz kalkulatory gdzie ktoś zrobił dwie oddzielne pętle i wyborem menu przed wpisaniem liczby. 


(pio_95) #9

Wiadomo, że kalkulator dla czterech podstawowych działań można napisać na dziesiątki sposobów, ale sam przedstawiłeś konkretną listę kroków, dlaczego się jej nie trzymać?

 

Program działa w dokładnie tak, jak go napisałeś :D, czyli żeby wyjść, musisz opuścić pętlę wewnętrzną i podać wybór spoza opcji menu.

 

Swoją drogą, kalkulator rzeczywiście jest prosty i da się go napisać w C++, zgodnie z opisem kroków, używając w całym kodzie tylko 5 średników, z czego jeden na “using namespace”, żeby program był krótszy, dwa na deklaracje zmiennych i jeden na return z funkcji głównej - można się pokusić o określenie “program w jednej linijce”.


(fedora24x) #10

 

 

 

Masz racje, ON strasznie się rozpisuje. Pogrupuj instrukcje w funkcje oraz precyzuj swoje komentarze. Według mnie ten kod wygląda jak by był pisany na poczekaniu, zero optymalizacji. Najpierw zrób sobie argorytm tego i “POMYŚL JAK  w NAJMNIEJSZEJ Ilości KODU uzyskać ten SAM EFEKT”

 

Bo tak się da, łatwiej wychwycisz błedy a kod stanie sie przejrzysty…


(mikolaj_s) #11

Pytanie wygląda żywcem wzięte z jakiejś uczelni. Na PG prowadzący testuje program opierając się na klawiaturze. Jak program nie wyłapie błędów i będzie niesprawny do dalszego działania to student nie zalicza pracy. Zabezpieczenie przed nieprawidłowymi danymi polega na obsłużeniu sytuacji np. gdy ktoś ci wpisze literę zamiast liczby. Jeśli jeszcze tego nie przerabiałeś to problem polega na tym, że to nie zadanie jest niejasne, tylko wstawiający te zadanie nie przystosował je do poziomu w danym momencie kursantów.

Jak w przyszłości będziesz się tego uczyć to zwróć uwagę na sstream, bo większość kursów miesza C z C++ i uczy kursantów obsługi charów i funkcji z C zamiast C++.

 

W tym przypadku musisz sprawdzić co wczyta program po wpisaniu liter, po kompilacji GCC wczytuje zero czyli całkiem logicznie, ale nie każdy kompilator tak musi mieć.