Artykuł “C++17 – nowy, miłościwie panujący nam standard C++” z Programisty 66

Dzięki uprzejmości redakcji Programisty, mogę podzielić się tym artykułem.

C++17 – nowy, miłościwie panujący nam standard C++

Trochę ponad rok temu, w numerze 10/2016 magazynu, zapowiedziany został nadchodzący standard języka. Od tego czasu komitet standaryzacyjny zdążył się jeszcze spotkać i dokonać pewnych zmian.

Finalny kształt C++17 poznaliśmy po marcowym spotkaniu komisji standaryzacyjnej w miejscowości Kona na Hawajach, gdy szkic standardu został poddany głosowaniu organów narodowych (ang. national bodies). 6. września głosowanie zostało zakończone jednogłośną akceptacją [1], co pozwoliło pominąć drugie głosowanie i przejść bezpośrednio do publikacji. Organizacja ISO opublikowała C++17 w grudniu 2017 jako ISO/IEC 14882:2017 [2]. Wedle relacji członków komitetu 9 miesięcy od zakończenia prac oznacza bardzo szybką publikację…

ZWI #4 – jak wylosować elementy bez powtórzeń

Losowanie bez powtórzeń jest chyba jednym z najczęstszych zadań dla początkujących, zarówno uczących się samodzielnie, jak i na studiach. Często przejawia się w zadaniu typu “utwórz program losujący liczby w Lotto”. Równie często spotykam kod z wydajnością O(evil), którego powstydziłbym się nawet w najbezczelniejszym Lawful Evil – mieszanina randów, srandów, sprawdzania w pętli O(n3) czy wartość jest już znaleziona, alokacji pamięci za pomocą new[] itd.

Jest to w dużej mierze pokłosie sposobu nauczania C++. W tym poście przedstawię proste, czytelne i wydajne sposoby uzyskania tego samego efektu.

Lawful Evil #5 – instrukcja retum

Nie byłem pewien, czy dodawać tę historię, ponieważ nie zakończyła się ona pełnym sukcesem, ale uznałem, że rozwiązanie na to zasługuje. Historia zaczęła się pewnego pięknego środowego popołudnia:

Hej koledzy z #programowanie #cpp Potrzebuje pilnej pomocy ! place jak za króla ;D Pisze własne kolosa mam czas do okooło 18:30 jest do drugi termin 🙁 Tresc zadania
1.Napisac program wykorzystujacy stos, ktory sprawdza czy w danym wyrazeniu nawiasy sa prawidlowo zagniezdzone. Przetestowac dzialanie na wyrazeniu ” [ [ ] [ [ ] [ [ ] ”

2.Opracowac rekurnecyjny algorytm pozwalajacy zamienic liczbe dziesietna na liczbe w systemie trojkowym. Sprawdzic dla liczby 123

Liczy na was 5 osob

ZWI#3 – jak wywołać specjalizację szablonu funkcji dla wszystkich typów z listy

Tym razem podzielę się pytaniem jakie otrzymałem na IRC-u:

<cauchy> mam sobie funkcyjke z templejtem
<cauchy> i chce sobie ta fn wywolac dla jakiejs tam listy typow
<cauchy> np dla int, in64_t, string, vector<int>, vector<string>, itd
<cauchy> jakos fajnie daloby sie to zrobic w petli zebym nie musial explicitnie dawac po kolei
<cauchy> fn<int>();
<cauchy> fn<string>();
<cauchy> …

Oczywiście, że by się dało!

ZWI #2 – zaprzyjaźniona pojedyńcza specjalizacja szablonu

Do napisania tej notki zainspirowało mnie to pytanie na forum. Lekko parafrazując podany kod, szablon klasy wyglądał następująco:

template<typename T>
void bar(Foo<T> f)
{
    DBG(f.val);
}
 
template<typename T>
struct Foo
{
    Foo(T val) : val{val} {}
 
    template<typename U>
    friend void bar(Foo<U>);
 
private:
    T val;
};

Lawful Evil #4 – pętla switch

W tym odcinku opiszę problem z wątku zatytułowanego oryginalnie “Pilnie Potrzebna POMOC Program Obliczający Średnią C++”:

Zadanie: Napisz program, który wczytuje w pętli liczby różne od zera i oblicza ich sumę oraz średnią. Wczytanie zera oznacza zakończenie działania pętli i wyświetlenie obliczonych wartości. W C++.
Najlepiej w Dev-C++.
Będę wdzięczny za wszelkie wskazówki.
Czekam na odpowiedź.

Lawful Evil #3 – średnia i zliczanie elementów w tablicy

W tym odcinku opiszę problem z wątku zatytułowanego “Siema potrzebuj prosty program w c++ w visual studio ktoś potrafi ?”:

Napisz program, który zapisuje do tablicy 10 elementowej liczby rzeczywiste
dodatnie, w momencie, gdy podana przez użytkownika liczba jest ujemna program
wyświetla informację o błędnej liczbie i prosi o podanie innej liczby.
Po zakończeniu wprowadzania program powinien wywołać funkcję, która znajdzie
średnią wartość tablicy i policzy ile elementów tablicy jest większych od średniej.
Po zakończeniu działania funkcji w programie głównym mają zostać zapisane w
zmiennych wartość średnia oraz ilość liczb większych od średniej.

Misja Gynvaela 004

MISJA 004            goo.gl/                     DIFFICULTY: ███░░░░░░░ [3/10]
┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅
Jeden z naszych agentów infiltruje siedzibę wrogiego syndykatu, i utknął pod 
drzwiami z elektronicznym zamkiem. Udało mu się dostać do elektroniki i zrzucić
krótki program, który sprawdza wprowadzony kod i otwiera drzwi.

Twoim zadaniem będzie wykonanie analizy poniższego programiku oraz znalezienie
poprawnego kodu.

      #include <stdio.h>
      int check(char*b){char*p;for(p=b;*p;p++);if(((p-b)^42)!=47)return(
      ~0xffffffff);unsigned long long ch=0x1451723121264133ULL;for(p=b;*
      p;p++)ch=((ch<<9)|(ch>>55))^*p;return!!(14422328074577807877ULL==
      ch);}int main(void){char buf[1234];scanf("%1233s",buf);puts("nope"
      "\0good"+check(buf)*(6-1));return 0;}

--

Odzyskaną wiadomość umieśc w komentarzu pod tym video 🙂
Linki do kodu/wpisów na blogu/etc z opisem rozwiązania są również mile
widziane!

P.S. Rozwiązanie zadania przedstawie na początku kolejnego livestreama.

Kod, jak widać, jest trochę bardzo nieczytelny. Ok, to jest C, ale i tak powinno być lepiej. Dlatego pierwszym krokiem ku rozwiązaniu zadania było jego poprawne sformatowanie. Do tego użyłem http://format.krzaq.cc, mojego webowego frontendu dla clang-format.

Lawful Evil #2 – Pilne Kolos z struktur

Treść prośby1 o pomoc wyglądała następująco:

Zadanie 1
Zdefiniuj strukturę opisującą książkę zawierającą pola (ilość stron, numer
biblioteczny, termin wypożyczenia) , oraz zdefiniuj strukturę opisującą datę. W
programie dynamicznie utwórz zmienną typu strukturalnego z polem typu
strukturalnego , następnie wczytaj z klawiatury wartości pól, po czym wczytane
informacje wydrukuj na ekranie. Przed zakończeniem programu zwolnij pamięć po
dynamicznie utworzonej zmiennej. (3 pkt)
Zadanie 2
Napisz funkcję, która zwraca jako wartość wskaźnik do zmiennej strukturalnej
opisującej książkę. Zadaniem funkcji jest zaalokowanie zmiennej oraz ustalenie
wartości jej pól (wartości pól zmiennej wczytujemy z klawiatury).
Napisz program testujący działanie funkcji.

Visual Studio

Wygląda na idealnego kandydata do tej kategorii.

1W sumie ciężko było powiedzieć czy to prośba, bo słowo “proszę” ani żadne podobne nie znajduje się w treści.