Ocena Pracy

0

Witam, jestem w klasie 1 liceum i niedawno zacząłem programować w moim 1 języku czyli C++.

Obecnie jestem na 6 odcinku kursu na ''Pasja Informatyki'' więc wiem na razie niewiele :).

Będąc nie do końca usatysfakcjonowany kalkulatorem P. Zelenta, który przedstawił w jednym z odcinków postanowiłem stworzyć swój. Chciałbym usłyszeć wasze opinię na jego temat oraz ewentualne zmiany jakie mógłbym wprowadzić. Poniżej wklejam kod i z góry dziękuję za porady :).

#include <iostream>
#include <ostream>
#include <cmath>
#include <conio.h>
 
using namespace std;
 
char wybor;
 
int main()
{
double a, b, wynik;
int dzialanie;
 
for(;;)
{
cout<<"   MENU GLOWNE"<<endl;
cout<<"-----------------"<<endl;
cout<<"0. Wyjscie"<<endl;
cout<<"1. Dodawanie"<<endl;
cout<<"2. Odejmowanie"<<endl;
cout<<"3. Mnozenie"<<endl; 
cout<<"4. Dzielenie"<<endl;
cout<<"5. Pierwiastkowanie"<<endl;
cout<<"6. Potegowanie"<<endl; 
cout<<endl<<"Wybierz[0-6] ";
 
wybor=getch();
 
switch (wybor)
{
case '1': 
system("cls");
cout<<"======[Dodawanie]======"<<endl;
cout<<endl<<"Podaj 1 liczbe: ";
cin>>a;
cout<<"Podaj 2 liczbe: ";
cin>>b;
cout<<endl<<"     Suma= "<<a+b;
break;
 
case '2': 
system("cls");
cout<<"======[Odejmowanie]======"<<endl;
cout<<endl<<"Podaj 1 liczbe: ";
cin>>a;
cout<<"Podaj 2 liczbe: ";
cin>>b;
cout<<endl<<"    Roznica= "<<a-b;
break;
 
case '3': 
system("cls");
cout<<"======[Mnozenie]======"<<endl;
cout<<endl<<"Podaj 1 liczbe: ";
cin>>a;
cout<<"Podaj 2 liczbe: ";
cin>>b;
cout<<endl<<"    Iloczyn= "<<a*b;
break;
 
case '4': 
system("cls");
cout<<"======[Dzielenie]======"<<endl;
cout<<endl<<"Podaj 1 liczbe: ";
cin>>a;
cout<<"Podaj 2 liczbe: ";
cin>>b;
if(b==0) cout<<"Nie dzielimy przez 0!"<<endl;
else
cout<<endl<<"     Iloraz= "<<a/b;
break;
 
case '5':
system("cls");
cout<<"======[Pierwiastkowanie]======"<<endl;
cout<<endl<<"Podaj stopien pierwiastka: ";
cin>>b;
cout<<"Podaj liczbe do spierwiastkowania: ";
cin>>a;
if(b>0)  cout<<endl<<"          Wynik= "<<pow(a,(1/b));
else cout<<endl<<"Nie pierwiastkujemy przez 0!"<<endl;
break;
 
case '6': 
system("cls");
cout<<"======[Potegowanie]======"<<endl;
cout<<endl<<"Podaj liczbe ktora bedzie potegowana: ";
cin>>a;
cout<<"Podaj stopien potegi: ";
cin>>b;
cout<<endl<<"            Wynik= "<<pow(a,b)<<endl;
break;
 
default : cout<<endl<<"Koniec programu."<< endl;
exit(0);
 
}
getchar();getchar();
system("cls");
}
return 0;
}```
2

#include <conio.h>

To ci blokuje przeportowanie kodu na inne platformy, polecam unikać.

using namespace std;

Też raczej praktyka uznawana za kiepską, oszczędza klikania w klawiaturę, ale może powodować problemy jak będziesz miał dwie przestrzenie nazw z tak samo nazwanymi obiektami.

char wybor;

int main()
{
double a, b, wynik;
int dzialanie;

Czemu akurat wybor (pomijając to, że lepiej, gdybyś programował po angielsku) jest globalny?

system("cls");

Nadal - nieprzenośne na unixy. Poza tym jak już używasz tego conio.h, to zdaje się, że udostępnia clrscr(), lepiej już użyć tego niż wywołań systemowych.

3

Brak podziału na małe funkcja wszystko w main i już nie chce na to patrzeć.
To jest jak z językiem naturalnym: jak ktoś mówi do ciebie zdaniem wielokrotnie złożonym, to zapewne będziesz miał problem ze zrozumieniem treści.
Jak ktoś mówi krótkimi zdaniami, z dobrze określonym podmiotem i orzeczeniem, to dużo łatwiej zrozumieć co orator miał na myśli.

Zelent uczy bardzo wielu złych praktyk programowania. Czym skorupka za młodu nasiąknie to na starość trąci.
Ergo od Zelenta nauczysz się parę dobrych rzeczy i jeszcze więcej bardzo złych, które będzie potem trudno wyplewić.
Dlatego radzę szukać innych źródeł.

0
  1. Zgodnie z radami podmieniłem kod, lecz występuję błąd.
  2. Czyli co mam dać zamiast "using namespace std;" , myślałem, że dodaję się do w każdym programie. Tak jak mówiłem jestem początkującym i jeszcze nie odkryłem wszystkich rzeczy
#include <iostream>
#include <ostream>
#include <cmath>
#include <conio.h>

using namespace std;

int main()
{
double a, b, wynik;
char choice;

for(;;)
{
cout<<"   MENU GLOWNE"<<endl;
cout<<"-----------------"<<endl;
cout<<"0. Wyjscie"<<endl;
cout<<"1. Dodawanie"<<endl;
cout<<"2. Odejmowanie"<<endl;
cout<<"3. Mnozenie"<<endl; 
cout<<"4. Dzielenie"<<endl;
cout<<"5. Pierwiastkowanie"<<endl;
cout<<"6. Potegowanie"<<endl; 
cout<<endl<<"Wybierz[0-6] ";

choice=getch();

switch (choice)
{
case '1': 
clrscr();
cout<<"======[Dodawanie]======"<<endl;
cout<<endl<<"Podaj 1 liczbe: ";
cin>>a;
cout<<"Podaj 2 liczbe: ";
cin>>b;
cout<<endl<<"     Suma= "<<a+b;
break;

case '2': 
clrscr();
cout<<"======[Odejmowanie]======"<<endl;
cout<<endl<<"Podaj 1 liczbe: ";
cin>>a;
cout<<"Podaj 2 liczbe: ";
cin>>b;
cout<<endl<<"    Roznica= "<<a-b;
break;

case '3': 
clrscr();
cout<<"======[Mnozenie]======"<<endl;
cout<<endl<<"Podaj 1 liczbe: ";
cin>>a;
cout<<"Podaj 2 liczbe: ";
cin>>b;
cout<<endl<<"    Iloczyn= "<<a*b;
break;

case '4': 
clrscr();
cout<<"======[Dzielenie]======"<<endl;
cout<<endl<<"Podaj 1 liczbe: ";
cin>>a;
cout<<"Podaj 2 liczbe: ";
cin>>b;
if(b==0) cout<<"Nie dzielimy przez 0!"<<endl;
else
cout<<endl<<"     Iloraz= "<<a/b;
break;

case '5':
clrscr();
cout<<"======[Pierwiastkowanie]======"<<endl;
cout<<endl<<"Podaj stopien pierwiastka: ";
cin>>b;
cout<<"Podaj liczbe do spierwiastkowania: ";
cin>>a;
if(b>0)	cout<<endl<<"          Wynik= "<<pow(a,(1/b));
else cout<<endl<<"Nie pierwiastkujemy przez 0!"<<endl;
break;

case '6': 
clrscr();
cout<<"======[Potegowanie]======"<<endl;
cout<<endl<<"Podaj liczbe ktora bedzie potegowana: ";
cin>>a;
cout<<"Podaj stopien potegi: ";
cin>>b;
cout<<endl<<"            Wynik= "<<pow(a,b);
break;

default : cout<<endl<<"Koniec programu."<< endl;
exit(0);

}
getchar();getchar();
clrscr();
}
return 0;
} ```
0
  1. Czyli co mam dać zamiast "using namespace std;" , myślałem, że dodaję się do w każdym programie. Tak jak mówiłem jestem początkującym i jeszcze nie odkryłem wszystkich rzeczy

Nic. Po prostu te nazwy, które są w przestrzeni nazw std poprzedzasz przedrostkiem std::, np. zamiast cout - std::cout.

No i tak jak wyżej ktoś napisał. Wszystkie operacje kalkulatora wydziel do osobnych funkcji. To jest największy problem, bo reszta (przestrzenie, przenośność) to są rzeczy, których jakoś tam się nauczysz w trakcie. Ale wydzielania powtarzających się fragmentów kodu warto się uczyć od samego początku.

0

I mam to dawać przed każdym cout? i to tylko przed cout czy tez przy cin?

0

Co to znaczy dać do osobnych funkcji?
Czyli do każdego takiego muszę dodać coś nowego?

case '1': 
clrscr();
cout<<"======[Dodawanie]======"<<endl;
cout<<endl<<"Podaj 1 liczbe: ";
cin>>a;
cout<<"Podaj 2 liczbe: ";
cin>>b;
cout<<endl<<"     Suma= "<<a+b;
break;
1

Tak. Zauważ, że w każdym przypadku powtarza ci się pewien schemat. Masz czyszczenie ekranu, wypisanie nazwy działania, pobierasz po dwa argumenty i wypisujesz wynik. Tym powinna zajmować się funkcja. Np.:

#include <functional>
#include <string>
#include <iostream>

float add(float a, float b)
{
  return a+b;
}

void perform_operation(std::string name, std::string result_name, std::function<float(float, float)> operation)
{
  float a, b;
  clrscr();
  std::cout << "====[" << name << "]====" << std::endl;
  std::cout << std::endl << "Podaj 1. liczbe: ";
  std::cin >> a;
  std::cout << std::endl << "Podaj 2. liczbe: ";
  std::cin >> b;
  std::cout << std::endl << result_name << " = " << operation(a, b);
}

Wtedy case z dodawaniem załatwiasz tak:

case '1':
  perform_operation("Dodawanie", "suma", add);
  break;

0

Dzięki bardzo za pomoc <3

0

Będąc nie do końca usatysfakcjonowany kalkulatorem P. Zelenta, który przedstawił w jednym z odcinków

Czy możesz wyjaśnić, co oznacza ten brak satysfakcji? Pytam, bo Zelent to takie ciekawe zjawisko. Z jednej strony wieli początkujących sobie go chwali, bo w miarę prosty sposób wprowadza w takie totalne podstawy. Z drugiej - większość osób uważa podobnie do tego, co napisał @MarekR22 kilka postów wyżej.

A mnie zastanawia, jakie wady/niedociągnięcia w tym kursie znajduje osoba początkująca, która dopiero się uczy. Fajnie, jakbyś napisał kilka zdań w tym temacie.

0

Chodziło mi o to, że ten kalkulator był bardzo prosty i nietypowy, najpierw musisz wprowadzić liczbę a dopiero potem działanie. Chciałem napisać taki zwyczajny kalkulator, w którym najpierw wyświetla się menu.
Jeżeli chodzi o P. Zelenta to uważam, że bardzo fajnie tłumaczy ten język jak dla początkujących. Ja jestem na takim totalnym początku (to jest mój pierwszy język i dopiero zaczynam programować) i dopiero poznaję te wszystkie funkcję. Ciężko też mi na tym etapie stworzyć coś zupełnie od początku samemu, więc te zadania które piszę P. Zelent w kursie uczę się pisać sam. Jednak trochę martwi mnie myśl kiedy udało mi się (według mnie) napisać fajny program o jaki mi chodziło, prosząc o opinie tutaj okazuje się, że to mógłbym napisać inaczej, to inaczej i cały program muszę obrócić do góry nogami a nie do końca wiem jak :/ Aktualnie mam 15 lat i uczęszczam do Liceum mat-fiz. W przyszłości chciałbym być informatykiem. Przy 2 godzinach informatyki w szkole, ciężko się czegokolwiek nauczyć. Wiem, że aby zostać dobrym programistą trzeba dużo pisać, więc muszę też coś robić samemu w domu. Fajnie, że istnieją takie fora gdzie można się popytać doświadczonych programistów co można zmienić, co moim zdaniem bardzo ułatwia naukę :)

2

Jednak trochę martwi mnie myśl kiedy udało mi się (według mnie) napisać fajny program o jaki mi chodziło, prosząc o opinie tutaj okazuje się, że to mógłbym napisać inaczej

No ale nie powinno Cię to w żadnym razie martwić. Na forum pomocy udzielają ludzie, którzy zawodowo się zajmują programowaniem, są pasjonatami, studentami (te 3 opcje można dowolnie łączyć). Dziwne by było, zebyś Ty po kilku lekcjach kursu online miał ten sam poziom, co inni komentujący.

Ale ważne jest to, że słuchasz co Ci zostało przekazane, nie obrażasz się, stosujesz się do zaleceń. To dobry sygnał, są szanse, że wyjdziesz na ludzi ;)

0

Dzięki ;)
A tak już poza tematem, uważasz że warto iść w tego C++, czy może przenieść się na jakiś inny np. Pythona, Ruby

4

To zależy, co chcesz robić w przyszłości, co Cię kręci. Bo programowanie to jest tak szeroka dziedzina, że mieści się tutaj pisanie stron, pisanie aplikacji, programowanie mikrokontrolerów, pisanie algorytmów, walka z bazami danych itp. Ale uważam, że C++ to taki język, znajomość którego się zawsze przyda.

Poza tym prawda jest taka, że w programowaniu język jest czymś wtórnym. Tak samo, jak w przypadku doświadczonego kierowcy - zmiana samochodu przychodzi dość łatwo, chwilkę się siedzi niepewnie, bo się go nie zna, ale po chwili jedziesz tak samo, jak tymi, które znasz od dawna.
Tutaj jest podobnie. Ważne, żebyś załapał taki specyficzny sposób myślenia, podchodzenia do tematu, wykształcił umiejętność szukania odpowiedzi na napotkane problemy i samodzielność. Jak tego się nauczysz, to zmiana języka nie będzie większym wyzwaniem.

3

Język programowania to tylko narzędzie. Po pierwszym języku programowania nauczanie się kolejnego jest duże bardziej proste.
Bardziej czasochłonne jest opanowanie konkretnych technologi.
Najważniejsze jest wyrobienie sobie dobrych praktyk i umiejętności pisania czytelnego kodu, a to jest niezależne od języka.

0

Powracam i witam!
Korzystając z rad innego forumowicza na innym forum postanowiłem zmodyfikować mój kalkulator. Zgodnie z jego radami usunąłem ''using namespace std '' oraz dodałem funkcję.
Proszę o opinię oraz proszę wziąć pod uwagę że jestem początkujący i jest to mój 1 język :)

#include <iostream>
#include <ostream>
#include <cmath>
#include <conio.h>

void dodawanie()
{
	system("cls");
    float a, b;
    std::cout << "======[Dodawanie]======\n";
    std::cout << "\nPodaj 1 liczbe: ";
    std::cin >> a;
    std::cout << "Podaj 2 liczbe: ";
    std::cin >> b;
    std::cout << "\n     Suma= " << a + b;
    getchar();
    getchar();
    system("cls");
}
void odejmowanie()
{
    system("cls");
    float a, b;
    std::cout << "======[Odejmowanie]======\n";
    std::cout << "\nPodaj 1 liczbe: ";
    std::cin >> a;
    std::cout << "Podaj 2 liczbe: ";
    std::cin >> b;
    std::cout << "\n    Roznica= " << a - b;
    getchar();
    getchar();
    system("cls");
}
void mnozenie()
{
    system("cls");
    float a, b;
    std::cout << "======[Mnozenie]======\n";
    std::cout << "\nPodaj 1 liczbe: ";
    std::cin >> a;
    std::cout << "Podaj 2 liczbe: ";
    std::cin >> b;
    std::cout << "\n    Iloczyn= " << a * b;
    getchar();
    getchar();
    system("cls");
}
void dzielenie()
{
    system("cls");
    float a, b;
    std::cout << "======[Dzielenie]======\n";
    std::cout << "\nPodaj 1 liczbe: ";
    std::cin >> a;
    std::cout << "Podaj 2 liczbe: ";
    std::cin >> b;
    if (b == 0)
        std::cout << "Nie dzielimy przez 0!\n";
    else
        std::cout << "\n     Iloraz= " << a / b;
    getchar();
    getchar();
    system("cls");
}
void pierwiastkowanie()
{
    system("cls");
    float a, b;
    std::cout << "======[Pierwiastkowanie]======\n";
    std::cout << "\nPodaj stopien pierwiastka: ";
    std::cin >> b;
    std::cout << "Podaj liczbe do spierwiastkowania: ";
    std::cin >> a;
    if (b > 0) {
        std::cout << "\n          Wynik= " << pow(a, (1 / b));
        getchar();
        getchar();
        system("cls");
    }
    else {
        std::cout << "\nNie pierwiastkujemy przez 0!\n";
        getchar();
        getchar();
        system("cls");
    }
}
void potegowanie()
{
    system("cls");
    float a, b;
    std::cout << "======[Potegowanie]======\n";
    std::cout << "\nPodaj liczbe ktora bedzie potegowana: ";
    std::cin >> a;
    std::cout << "Podaj stopien potegi: ";
    std::cin >> b;
    std::cout << "\n            Wynik= " << pow(a, b);
    getchar();
    getchar();
    system("cls");
}

int main()
{
    int choice;
    system("cls");
    do {
    	
        std::cout << "   MENU GLOWNE\n";
        std::cout << "-----------------\n";
        std::cout << "0. Wyjscie\n";
        std::cout << "1. Dodawanie\n";
        std::cout << "2. Odejmowanie\n";
        std::cout << "3. Mnozenie\n";
        std::cout << "4. Dzielenie\n";
        std::cout << "5. Pierwiastkowanie\n";
        std::cout << "6. Potegowanie\n";
        std::cout << "\nWybierz[0-6] ";
        
		choice=getch();

        switch (choice) {
        
		case '0':
			return 0;
			break;	
		case '1':
            dodawanie();
            break;
        case '2':
            odejmowanie();
            break;
        case '3':
            mnozenie();
            break;
        case '4':
            dzielenie();
            break;
        case '5':
            pierwiastkowanie();
            break;
        case '6':
            potegowanie();
            break;
        default: 
			std::cout<<"\nNie ma takiej opcji w MENU";	
			getchar();
			system("cls");  
      
        }

    } while (choice != 0);
    return 0;
}
0

Korzystając z rad innego forumowicza na innym forum postanowiłem zmodyfikować mój kalkulator. Zgodnie z jego radami usunąłem ''using namespace std '' oraz dodałem funkcję

A wydawało mi się, że to na naszym forum padły takie porady :P
@sugar_hiccup pisał o namespace std, natomiast @MarekR22 wspomniał o tym, że wszystko jest w main

0

Faktycznie ;) Sorki za to chłopaki.
Tam po prostu lepiej mi wytłumaczył jak mam to zrobić :) Co nie zmienia faktu, że faktycznie to pisali

1 użytkowników online, w tym zalogowanych: 0, gości: 1