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

Czy ten kod jest "czysty" ?

Object Storage Arubacloud
0 głosów
465 wizyt
pytanie zadane 31 grudnia 2016 w C i C++ przez Piredele Nowicjusz (160 p.)

Witam, jestem nowy na forum, a także nowy w programowaniu. Posłuchałem podcast Pana Mirosława dotyczący błędów w programowaniu i stwierdziłem, że jakoś muszę wkręcić się w to forum i udostępniać swoje kody oraz patrzeć na cudze. Dlatego zakładam ten post, aby się (tak jak wspomniałem) jakoś wkręcić smiley.

Mam oczywiście pytanie, a mianowicie, czy ten kod da się jeszcze ulepszyć ? Czy należy inaczej układać zmienne, nie robić/robić spacje między różnymi znakami. Po prostu jakie są takie przynajmniej podstawowe zasady, żeby kod był schludny i tak jakby "uniwersalny", czyli łatwy w odczytaniu dla każdego.

Program liczy średnią z ocen. (Tak, dopiero jestem po kursie tablic laugh)

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

using namespace std;

int main()
{

    int liczba_wyrazow; float suma=0; float srednia;
    cout << "Witaj, bedziemy liczyc srednia ocen!"<<"\a" << endl;
    cout<<endl<<"Wprowadz liczbe wszystkich przedmiotow:";
    cin>>liczba_wyrazow;

    float ocena[liczba_wyrazow];

    cout<<endl << "Wprowadz swoje oceny:"<<"\a"<<endl;

        for(int i=0; i<liczba_wyrazow; i++)
    {
        cout<<"Ocena "<< i+1 <<": "<<"\a";
        cin >>ocena[i];
        suma+=ocena[i];
    }
    cout<< "Suma rowna sie: "<<"\a"<<suma<<endl;

    srednia=suma/liczba_wyrazow;

    cout<<"srednia rowna sie: "<<"\a" <<srednia<<endl;

    getchar(); getchar();

    return 0;
}

P.S Jeżeli takie posty nie powinny się tu pojawiać, to proszę, żeby ktoś mnie o tym powiadomił i ewentualnie pomógł się tu jakoś zaaklimatyzować laugh. Nie znalazłem na pierwszy rzut oka jakiegoś osobnego postu dla amatorskich kodów, żeby pooglądać, a tych bardziej skomplikowanych po prostu jeszcze nie rozumiem.

Pozdrawiam blush

komentarz 31 grudnia 2016 przez erx700 Gaduła (3,430 p.)
edycja 31 grudnia 2016 przez erx700
Rozmiar tablicy musi być wartością stałą.

Druga sprawa, nie używa się jednocześnie iostream i stdio. Musisz się na coś zdecydować.
komentarz 31 grudnia 2016 przez Piredele Nowicjusz (160 p.)
Ale ... ta tablica tak jakby ma wartość stałą, bo jej wartość nada użytkownik, i potem jej już nie zmieni. Program działa, więc chyba można tak zrobić. Proszę o jakieś głębsze wytłumaczenie tego.

 

Czy jeśli zrobię tylko stdio to wszystko będzie działało? W kursie pana Mirosława dołączanych jest wiele bibliotek.

Dziękuję za odpowiedż!
1
komentarz 31 grudnia 2016 przez Munvik Dyskutant (9,350 p.)

Twoje rozwiązanie dotyczące zainicjowania tablicy jest nie do końca poprawne.

W takich przypadkach należy użyć dynamicznej alokacji pamięci:

int liczba_wyrazów;

cin >> liczba_wyrazów;

float *ocena = new float[liczba_wyrazów]; //dynamiczna alokacja pamięci

/*
...
*/
//Gdy już nie potrzebujesz tablicy ocena robisz:

delete [] ocena;

 

1
komentarz 31 grudnia 2016 przez erx700 Gaduła (3,430 p.)
Na twoim miejscu zdecydowałbym się na iostream, a wywalił stdio. Zamiast getchar można użyć cin.get()
komentarz 1 stycznia 2017 przez niezalogowany
> Twoje rozwiązanie dotyczące zainicjowania tablicy jest nie do końca poprawne.

A dlaczego? Kiedyś nie działało, ale od jakiejś tam wersji standardu weszło do standardu i czemu ma nie używać? Chyba że zakłada, że będzie przenosił kod na kompilatory nie obsługujące tego zapisu.
1
komentarz 1 stycznia 2017 przez unknown Nałogowiec (39,560 p.)


A dlaczego? Kiedyś nie działało, ale od jakiejś tam wersji standardu weszło do standardu i czemu ma nie używać? 

Na pewno nie standardu C++. VLA zostało wprowadzone do C wraz ze standardem C99 a od C11 jest opcjonalne. g++ ma rozszerzenie, które wprowadza obsługe VLA i dlatego to się kompiluje. Na każdym innym kompilatorze zgodnym ze standardem C++ ten kod nie powinien się skompilować.

komentarz 1 stycznia 2017 przez niezalogowany
Ciekawe skąd taki opór przed tym zapisem, przecież to całkiem przyjemne. Zwłaszcza w czasach mody na języki typu Python, Swift itp. powinni wychodzić na przeciw takim rzeczom, a nie je wycofywać.
3
komentarz 1 stycznia 2017 przez unknown Nałogowiec (39,560 p.)
Tu chodzi o niebezpieczeństwo takiego zapisu. Przy VLA jest bardzo łatwo o stack overflow. Jeśli chcesz mieć tablice o rozmiarze nieznanym w czasie kompilacji użyj vectora/smart pointer'ów. W przypadku zbyt dużego rozmiaru zostanie rzucony wyjątek i bedziesz mógł z tym coś zrobić.
komentarz 1 stycznia 2017 przez Piredele Nowicjusz (160 p.)
Dzięki wielkie !

3 odpowiedzi

+1 głos
odpowiedź 31 grudnia 2016 przez nemezisso Użytkownik (860 p.)
Pierwsze co przychodzi mi do głowy to zmienne/metody/klasy itp. zapisuj po angielsku. Polecam "Czysty kod", jeszcze całego nie przerobiłem, ale już widzę że książka jest bardzo dobra.
0 głosów
odpowiedź 1 stycznia 2017 przez TheFeniks Gaduła (4,690 p.)
edycja 1 stycznia 2017 przez TheFeniks
  • Nazywaj zmienny po angielsku
  • Rozdzielaj sobie operatory spacjami 
    cout << "Wszystkiego najlepszego i smacznego jajka" << endl;
    
  • Nie deklaruj zmiennych w jednej lini, oraz deklaruj je odrazu pod klamerką main'a.
  • Kod sformatował bym tak:
    #include <iostream>
    #include <stdio.h>
    using namespace std;
     
    int main()
    {
        int liczba_wyrazow; 
    	float suma = 0, srednia
    	
    		cout << "Witaj, bedziemy liczyc srednia ocen!" << "\a" << endl;
    		cout << endl << "Wprowadz liczbe wszystkich przedmiotow:";
    		
    		cin >> liczba_wyrazow;
     
     
    		float ocena[liczba_wyrazow];
    	 
    	 
    		cout << endl << "Wprowadz swoje oceny:" << "\a" << endl;
    	 
    	 
    		for(int i=0; i<liczba_wyrazow; i++)
    		{
    			cout << "Ocena " << i+1 << ": " << "\a";
    			cin >> ocena[ i ];
    			suma += ocena[ i ];
    			
    		}
    		
    		
    		cout << "Suma rowna sie: " << "\a" << suma << endl;
    	 
    
    		srednia = suma / liczba_wyrazow;
    	 
    	 
    		cout << "srednia rowna sie: " << "\a" << srednia << endl;
    	 
    	 
    		getchar(); getchar();
     
     return 0;
    }

    Pozdrowionka smacznego jajka, wszystkiego najlepszego, wesołych świąt z okazji oczywiście nowego roku. :3

    EDIT: Wypowiadam się tylko na temat czytelności kodu. :)

komentarz 1 stycznia 2017 przez QizmoPL Stary wyjadacz (11,440 p.)
przestrzen nazw to ZŁO
komentarz 1 stycznia 2017 przez Evelek Nałogowiec (28,960 p.)

for (int i = 0; i < liczba_wyrazow; i++)

Sam Visual Studio rozdziela spacjami automatycznie takie wyrażenia... Poza tym po co dwa getchar(); na końcu?

komentarz 1 stycznia 2017 przez TheFeniks Gaduła (4,690 p.)
Wypowiedziałem się tylko na temat czytelności kodu, koledzy wyżej zajeli się resztą. :)
komentarz 1 stycznia 2017 przez QizmoPL Stary wyjadacz (11,440 p.)
Visula przerywa prace odrazu na koncu, getchary to przeciagaja, tak to dziala w konsoli w sfml nie trzeba tego uzywac
komentarz 1 stycznia 2017 przez krzysiuup Obywatel (1,140 p.)
Jeśli chodzi o deklarację zmiennych, to odwołam się do książki "Czysty kod". Autor zaleca deklarowanie zmiennych jak najbliżej miejsca ich użycia. Chociaż też nie ma co kurczowo trzymać się tej zasady. Jeśli uznasz, że lepszym jest deklarowanie ich bezpośrednio pod nagłówkiem funkcji, to zrób tak.

Pozdrawiam
–3 głosów
odpowiedź 31 grudnia 2016 przez operator Stary wyjadacz (10,920 p.)
Nie zauważyłem żadnych wykroczeń ;D

Podobne pytania

0 głosów
2 odpowiedzi 327 wizyt
pytanie zadane 7 marca 2017 w PHP przez Sławek Obywatel (1,270 p.)
0 głosów
4 odpowiedzi 1,488 wizyt
pytanie zadane 19 stycznia 2017 w Rozwój zawodowy, nauka, praca przez Rayden Użytkownik (610 p.)
+1 głos
1 odpowiedź 673 wizyt

92,551 zapytań

141,393 odpowiedzi

319,522 komentarzy

61,936 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!

...