Jak nauczyć się programować?

Twój kod jest dla mnie nieczytelny. Pomijam już fakt, że wczytane liczby umieszczasz w tablicy, co jest niepotrzebne a wręcz niewskazane. Poniższy kod jest dla mnie dużo bardziej czytelny.

#include 

#include 

#include 


using namespace std;


int main()

{

  float maxv = numeric_limits::min();

  float minv = numeric_limits::max();

  float value, sum = 0, counter = 0;

  char key;


  do

  {

    while(true)

    {

      cout << "Podaj liczbe: "; cin >> value;

      if (cin.fail())

      {

        cin.clear();

        cin.ignore();

      }

      else break;

    }


    minv = min(value, minv);

    maxv = max(value, maxv);

    sum += value; 

    ++counter;


    do 

    {

      cout << "Czy koniec wprowadzania? [T/N]: "; cin >> key;

      key = toupper(key);

    } 

    while((key != 'T') && (key != 'N'));

  } 

  while(key != 'T');


  cout << "Najwieksza z wczytanych liczb to " << maxv << endl;

  cout << "Najmniejsza z wczytanych liczb to " << minv << endl;

  cout << "Srednia z wczytanych liczb to " << sum / counter << endl;


  return 0;

}

Twój kod nie jest dla mnie nieczytelny dlatego, że do rozwiązania problemu użyłeś tablicy. Czytelność kodu jest dla mnie kwestią przyzwyczajeń. Clojure jest dla mnie nieczytelny przez jego składnię. Python jest dla mnie mniej czytelny z uwagi na brak w tym języku znaczników wydzielających bloki kodu.

Co zaś do użycia przez Ciebie tablicy. Zgadnij co się stanie, gdy będę chciał wczytać miliard liczb do programu. Jesteś pewien, że wystarczy mi pamięci w systemie? Pomijam już fakt, że po wczytaniu wszystkich danych, czterokrotnie przechodzisz przez całą tablicę aby wyliczyć trzy parametry. W najlepszym przypadku podałeś przykład na to, jak nie powinno się rozwiązywać pewnych problemów.

W przypadku chęci dodania nowych funkcji mój kod nie będzie nadawał się wyłącznie do śmietnika. Mogę obudować pewne funkcje i zachować czytelność kodu.

Nie wiem jak Ty, ale ja piszę kod źródłowy, a nie maszynowy. :slight_smile:

Ale niech będzie, że uściślę - nie ma czegoś takiego jak “wydajny kod źródłowy”.

Dla mnie języki, których nie znam są po prostu nieznane. Chociaż widząc pierwszy raz na oczy kod jakiegoś języka, nieraz potrafię go, przynajmniej w części, zrozumieć.

Właściwie można by zrobić taki eksperyment i posadzić programistę:

  1. takiego, który nie zna C# przed kodem C#;

  2. takiego, który nie zna Javy przed kodem Javy;

  3. i takiego, który nie zna C++ przed kodem C++.

I poprosić ich o próbę zrozumienia kodu intuicyjnie. Ciekawe, któremu się to najmniej uda.

Pod warunkiem, że kod źródłowy nie jest kodem maszynowym :wink:

Im język wyższego poziomu, tym mniej wiem co i jak będzie wykonywane w danym fragmencie kodu źródłowego.

Jeżeli ktoś nie zna obiektowego modelu programowania, to w zasadzie niewiele zrozumie. Poza tym, podstawowa składnia tych trzech języków jest do siebie bardzo podobna.

Tak, utrudnia mi czytanie kodu to, czego w nim nie ma. Nie mam czasu bawić się w zgadywanie, jak będzie wykonywany dany fragment kodu i jakie typy będą używane.

Mój kod wcale nie jest dużo większy od Twojego. Chciałeś użyć funkcji, to użyłeś. Dla mnie jest to przerost formy nad treścią w przypadku tak banalnego zadania.

Nie zapamiętuję danych, jeżeli nie muszę tego robić. Nie dzielę krótkiego kodu na funkcje, jeżeli funkcje te nie są wykorzystywane w innych częściach kodu.

Tak sobie to tłumacz.

Ja nie straciłem kontroli nad kodem, gdyż dokładnie wiem co, kiedy i dlaczego się dzieje. W przypadku wystąpienia błędu mogłem usunąć pozostałe dane z bufora, ale celowo tego nie zrobiłem. Nie zakładam także tak jak Ty, że każda dana przechowywana jest w osobnym wierszu.

Tablica i wyjątki w kodzie, który tego nie wymaga - wydajnościowy koszmar. Gdybym pisał tak programy to umarłbym z głodu.

Wyjątki to tylko jeden ze sposobów obsługi błędów, bardzo kosztowny w języku C++.

Dobrze, rozważmy taki przypadek. Zachodzi potrzeba przetwarzania w programie miliarda liczb. Efekt? Twój rozwojowy kodu trzeba przepisać od nowa.

Gdybym ja miał tworzyć rozwojowy kod, utworzyłbym coś na kształt takiej klasy:

template

struct algorithm

{

  typedef std::function ftype;


  algorithm(ftype f, T v) : function(f), value(v) {}


  void calculate(T v) 

  { 

    function(value, v); 

  }


  ftype function;

  T value;

};

a następnie tak z niej skorzystał:

int main()

{

  vector> vec;

  vec.push_back(algorithm([](float& r, float v){ r = max(r, v); }, numeric_limits::min()));

  vec.push_back(algorithm([](float& r, float v){ r = min(r, v); }, numeric_limits::max()));

  vec.push_back(algorithm([](float& r, float v){ r += v; }, 0));

  vec.push_back(algorithm([](float& r, float v){ ++r; }, 0));


  do 

  {

    float v = getvalue();

    for (algorithm& a: vec) a.calculate(v); 

  } 

  while(!finish());


  cout << "Najwieksza z wczytanych liczb to " << vec[0].value << endl;

  cout << "Najmniejsza z wczytanych liczb to " << vec[1].value << endl;

  cout << "Srednia z wczytanych liczb to " << vec[2].value / vec[3].value << endl;


  return 0;

}

Mam elastyczny kod i nie muszę pamiętać wczytywanych danych.

To się zgadza. Jednak zabezpieczając się przed użytkownikiem powinieneś także pomyśleć o tym, że użytkownik może chcieć przetwarzać duże ilości danych. Twój kod ogranicza ilość możliwych do przetworzenia danych, choć nie musi tego robić.

Chętnie zobaczę jakiś zaawansowany programu do edycji zdjęć, napisany w Javie, Scali czy Clojure. Znasz taki?

Ja znam większą ilość języków kompilowanych do binarnego…

Dodane 09.04.2013 (Wt) 16:01

Ja znam większą ilość języków kompilowanych do binarnego…

Nie wiem w czym Ty widzisz problem:

vec.push_back(algorithm([](float& r, float v){ r *= v; }, 1));

...

cout << "Srednia geometryczna to " << pow(vec[4].value, 1.0f / vec[3].value) << endl;

Zmieniłem kod bo chciałeś, aby kod był rozwojowy. Nie jest dla Ciebie czytelny? Można go bardziej opakować, ale ja nie widzę takiej potrzeby.

W języku C++ mamy podany zakres na którym operujemy, oraz określony typ, na który będą rzutowane elementy kolekcji. Myślisz, że tego kodu nie da się uprościć? Można, tylko po co.

W takim przypadku zachodzi potrzeba scalania wyników cząstkowych. Mój kod znacznie lepiej się do tego nadaje, aniżeli Twój.

Taki program można napisać w czymkolwiek.

To się tyczy także projektów Open Source?

AutoCad tylko częściowo korzysta z .NET. Większość kodu została napisana w języku C++.

To, że język C++ jest wykorzystywany do tworzenia wydajnych aplikacji.

Widać, że twórcy takich aplikacji mają odmienne zdanie na ten temat.

Ja wolę dodać jedną linijkę kodu więcej i mieć wydajniejszy program. Każdy ma inne priorytety.

Gdybym chciał mieć więcej czasu na picie kawy, tobym sobie zatrudnił kogoś do wklepywania kodu.

Aż dziw bierze, że programy dekodujące strumienie wideo, nie przechowują w programie wszystkich wczytywanych danych. Przecież ktoś mógłby chcieć robić z tych danych wykresy.

Że co proszę? Poczytaj sobie o GCC.

Co ma piernik do wiatraka?

Czyli sam sobie przeczysz, bo wiele projektów Open Source jest tworzonych w języku C++.

Plik źródłowe Blendera 2.66a:

Język C/C++: 4431 plików.

Python: 884 pliki.

Platforma .NET ma bardzo bogaty i spójny zestaw bibliotek. Gdy wydajność ma drugorzędne znaczenie, prościej jest skorzystać z gotowych rozwiązań.

Twoja argumentacja jest kiepska, gdyż narzędzia pozwalające zaciemniać kod dostępne są dla wielu języków. Poza tym, gdy ktoś bardzo chce się dowiedzieć jak działa dany kod, to się tego dowie. Wystarczy przeanalizować kod maszynowy.

Język C jest podzbiorem języka C++.

Tak sobie to tłumacz.

To akurat zapewne kolejna projekcja @RaveStara, który nie od dziś twierdzi, że Windows został napisany w C++ i przez to jest nieprzenośny.

C jest prostym, ale przemyślanym językiem programowania, który pozwala pisać wydajne programy.

C++ jest nieudolną przeróbką C na język obiektowy, która wygląda jak próba zrobienia ośmiornicy z jamnika poprzez przybicie do niego czterech desek.

Możesz podać przykład na to, co można było zrobić lepiej?

@RaveStar

Widzisz w języku C++ wady tam, gdzie inni widzą zalety. Ten “śmietnik”, jak go nazwałeś, będzie jeszcze długo bardzo popularny.

Skąd ty te “fakty” wysysasz? AutoCad istnieje od 1982 roku i na początku był pisany w C.

A czy ktoś zna jakieś dobre kursy c ++ ? 

Strefa kurstów ma w ofercie:

http://strefakursow.pl/kursy/programowanie/kurs_c_od_zera_do_bohatera.html - tutaj masz kurs od podstaw

http://strefakursow.pl/kursy/programowanie/kurs_c_aplikacje_w_visual_studio.html  - tutaj masz natomiast aplikacje w Visual Studio

Polecam:

A może na początku swej programistycznej drogi pozwolić sobie na wypróbowanie kilku języków? Ja zaczęłam od webu - html, css, js, bo wszyscy przecież mówili „frontend jest cudowny”. Po czym stwierdziłam, że to zupełnie nie jest dla mnie. Na html nie mogłam patrzeć, a js mi się po prostu nie podoba. Teraz uczę się Javy i jest ok.
Podstaw dobrze jest poszukać w książkach Książki IT od PWN - Księgarnia PWN

Zabrakło kursów oferowanych przez „Online Group Kraków” vide: Sprzedaż na allegro - #2 przez natalia3456

Lub staży dla chętnych gdy wyjadacze doić chcą za mocno małą firemkę.

Odrobinę offtop, ale skoro zeszło się na programowanie, to zobaczcie 256 bajtów !!! i jak to zostało zrobione. Ehhh przypomniały mi się czasy demo sceny, Intel Outside itd. :cry: to były czasy. :wink:

Polecam ten kurs, prosto zrobiony, prowadzi krok po kroku. Skupia się bardziej na prostych rzeczach użytkowych niż na ogromie niuansów i detali jakie znajdują się w C++: