Pierwsze kroki

Przykłady

Jednym z najlepszych sposobów na nauczenie się programowania w nowym języku jest zapoznanie się z mnóstwem przykładowych programów. Najlepiej jest skopiować każdy z poniższych programów i wkleić go do pliku tekstowego, a następnie go skompilować. Potem wypróbuj eksperymenty. Dzięki rozszerzeniu tych przykładowych programów poznasz różne aspekty C++ i zyskasz większą pewność przy pisaniu programów od zera.

Przykład 1. Uruchomienie kompilatora

Skopiuj poniższy program klasyczny, wklej go do pliku tekstowego i skompiluj. Instrukcje kompilacji są dostępne tutaj.

Prawdopodobnie udało Ci się już poznać szczegóły tego programu w samouczku, więc nie znajdziesz tutaj szczegółowego opisu. Jeśli chodzi o czytelność, należy pamiętać o kilku kwestiach. Odnosi się to do komentarzy i formatowania, które poprawiają czytelność, zrozumienie i obsługę programów.

  • Każdy program, który tworzymy, zaczyna się od komentarza w nagłówku, w którym podano imię i nazwisko autora, jego dane kontaktowe, krótki opis oraz sposób użycia (w stosownych przypadkach). Każda funkcja zaczyna się od komentarza na temat operacji i użycia.
  • Komentarze objaśniające dodajemy pełne zdania, jeśli kod sam się nie udokumentuje, np. gdy przetwarzanie jest trudne, nieoczywiste, interesujące lub ważne.
  • Zawsze używaj nazw opisowych: zmienne to słowa zapisane małymi literami rozdzielone znakiem _, jak w przypadku zmiennej moja_zmienna. Nazwy funkcji używają wielkich liter do oznaczania słów, tak jak w przypadku funkcji MyExcitingFunction(). Stałe zaczynają się od litery „k” i używają wielkich liter do oznaczania słów, tak jak w przypadku kDaysInWeek.
  • Wcięcie jest wielokrotnością liczby 2. Pierwszy poziom to 2 spacje; jeśli potrzebne jest dalsze wcięcie, użyjemy 4 spacji, 6 spacji itd.
// hello.cpp: Maggie Johnson
// Description: a program that prints the immortal saying "hello world"

#include <iostream>
using namespace std;

int main() {
  cout << "Hello World!" << endl;
  return 0;
}

Kilka eksperymentów do wypróbowania:

  • Przede wszystkim musisz upewnić się, że możesz skompilować i uruchomić ten program.
  • Zmodyfikuj powyższy program tak, aby wyświetlał wiadomość "Hello World!". 4 razy w wierszu po 6 wierszy, przy czym każdy z nich jest wydrukowany w polu zawierającym 17 spacji. Aby to zrobić, użyj pętli for. Kliknij tutaj, aby dowiedzieć się więcej o formatowaniu danych wyjściowych za pomocą operatora cout. Kliknij tutaj, aby zobaczyć rozwiązanie.
  • Korzystając z właśnie ukończonego programu, sprawdź, jak napisać tekst „Hello World” wyrównany do lewej w polach składających się z 17 spacji (domyślnie jest to tekst wyrównany do prawej). Kliknij tutaj, by zobaczyć rozwiązanie.

Przykład 2. Uzyskiwanie danych wejściowych

Wprowadzanie tekstu z klawiatury w C++ przy użyciu „cina” jest łatwe. Oto przykład:

// get_input.cpp: Maggie Johnson
// Description: Illustrate the use of cin to get input.

#include <iostream>
using namespace std;

int main() {
  int input_var = 0;
  // Enter the do while loop and stay there until either
  // a non-numeric is entered, or -1 is entered. Note that
  // cin will accept any integer, 4, 40, 400, etc.
  do {
    cout << "Enter a number (-1 = quit): ";
    // The following line accepts input from the keyboard into
    // variable input_var.
    // cin returns false if an input operation fails, that is, if
    // something other than an int (the type of input_var) is entered.
    if (!(cin >> input_var)) {
      cout << "You entered a non-numeric. Exiting..." << endl;
      break;
      // exit the do while loop
    }
    if (input_var != -1) {
      cout << "You entered " << input_var << endl;
    }
  } while (input_var != -1);
  cout << "All done." << endl;
  return 0;
}

Eksperyment:

  • Po wystąpieniu błędu wejściowego strumień „przerwa”, cin zwraca wartość „false” (fałsz) i program się zatrzymuje. Bardzo ważne jest, aby chronić się przed takimi błędami, jak w przypadku opisanego powyżej programu. Co jednak w sytuacji, gdy chcemy naprawić ten błąd, a nie zrezygnować z programu? Aby rozwiązać problem po wystąpieniu błędu, wykonaj 2 kroki:
    1. Usuń błąd za pomocą funkcji cin.clear().
    2. Usuń nieprawidłowe znaki ze strumienia. Można to zrobić na przykład za pomocą funkcji cin.ignore().

W tych 2 krokach napisz program, który usunie nieprawidłowe dane wejściowe. Sprawdź w Google, jak działają te metody. Nasze rozwiązanie znajdziesz tutaj.

Przykład 3. Jakie wyniki daje ten program?

#include <iostream>
using namespace std;

int main() {
  cout << " 1\t2\t3\t4\t5\t6\t7\t8\t9" << endl << "" << endl;
  for (int c = 1; c < 10; c++) {
    cout << c << "| ";
    for (int i = 1; i < 10; i++) {
      cout << i * c << '\t';
    }
    cout << endl;
  }
  return 0;
} 

Przykład 4: rozkładanie ułatwia wszystko...

Czas zacząć pisać gry komputerowe. Ta pierwsza będzie prosta, ale to dopiero początek. Naszym zadaniem jest napisanie programu implementującego zgadywanie. Nasz program generuje losową liczbę z zakresu od 0 do 100. Odtwarzacz musi odgadnąć tajny numer. W ramach programu dostępne są wskazówki w rodzaju „To zbyt wysoka wartość” lub „To za mało”, aż gracz w końcu odgadnie tajną liczbę.

Pracujemy nad tą grą w 3 krokach. 

  1. Dowiedz się, jak wygenerować liczbę losową w danym zakresie wartości.
  2. Utwórz funkcję główną, która przetwarza jedną odpowiedź z odtwarzacza i udostępnia wskazówki.
  3. Dodaj elementy, które pozwalają na wielokrotne odgadnięcie, aż gracz odgadnie liczbę.

Ten proces nazywa się rozkładem, co oznacza rozbicie zadania na podzadania, które są łatwe do wykonania.

Zacznij od kroku 1 w wyszukiwarce Google, by zobaczyć, jak wygenerować losową liczbę przy użyciu C++. Spróbuj wyszukać „rand C++”. Tutaj znajdziesz nasze rozwiązanie. 

W drugim kroku musimy otrzymać od odtwarzacza liczbę całkowitą (z odpowiednim sprawdzaniem błędów w cinku) i porównać ją z tajnym numerem. Spróbuj samodzielnie napisać tę część gry, zanim sprawdzisz nasze rozwiązanie.

Na koniec musimy dodać pętlę, która będzie zbierać odgadnięcia od gracza, aż w końcu uda mu się odgadnąć tajną liczbę. Po ukończeniu tej części programu możesz zapoznać się z naszym rozwiązaniem.

Rozpakowywanie to jedna z najważniejszych umiejętności, którą musi się zgłębić programista. Kluczem do sukcesu jest możliwość podziału zadania na łatwe do wykonania części i wykonywania każdej z nich w czasie. Nie ma znaczenia, czy jest on duży czy mały. Oto inne możliwości ćwiczenia rozkładu treści.

  • Wiele codziennych zadań daje możliwość rozwijania umiejętności deklaracja. Może Cię dziwi, że Twój umysł po prostu tak działa!

    Na przykład, gdy muszę posprzątać bardzo brudną kuchnię (np. niektóre dziewczynki właśnie upierzyły ciasto), dzielim zadania, aby stworzyć plan i upewnić się, że nie trzeba będzie robić tego później. Nie chcę najpierw myć podłogi, jeśli na ladzie jest najróżniejsze zagadki do posprzątania – prawdopodobnie później będę musiała zrobić podłogę jeszcze raz. Może najpierw wyjęłam wszystkie składniki, przeniosę wszystkie naczynia do zlewu, posprzątam blaty, umyję naczynia, a na koniec posprzątam podłogi. To zadanie można zrealizować w inny sposób, ale jeśli je najpierw przeanalizujesz, łatwiej mi będzie określić plan, który nie będzie wymagał ponownej pracy.

    Używaj codziennych zadań jako przykładów do rozwijania umiejętności dekompozycji. Kto wie, może to nawet poprawi Twoją wydajność w domu!

  • Największy wspólny dzielnik dwóch liczb całkowitych to największa liczba, która dzieli je równomiernie. Na przykład: gcd(12; 18) = 6, gcd(−4; 14) = 2. Najwydajniejszym sposobem obliczania wartości cD jest algorytm Euklidesa. Napisz program z funkcją obliczającą współczynnik gcd dla 2 liczb całkowitych. Spróbuj najpierw wykonać funkcję bez rekurencji – pomoże Ci to zrozumieć, jak działa algorytm.

    Wyraźnie zdefiniuj zadania podrzędne, na przykład znajdź kod algorytmu Euklidesa, utwórz funkcję nierekurencyjną dla algorytmu itp. Tutaj znajdziesz nasze rozwiązanie.

Przykład 5: Łamigłówki matematyczne

Jedną z możliwości komputerów jest możliwość wyszukiwania rozwiązania problemu za pomocą brute-force. Metoda prób i błędów działa dobrze w przypadku niektórych problemów. Okazuje się, że komputery są szczególnie skuteczne w przypadku takich problemów. Pomyśl o tym:

Konie kosztują 10 zł, świnie – 3 zł, a króliki – tylko 0,50 zł. Rolnik kupuje 100 zwierząt za 100 zł. Ile z każdego zwierzęcia kupił? 

Istnieje bardzo proste rozwiązanie tego problemu. Zobacz, czy uda Ci się go znaleźć, zanim obejrzysz nasze.

Oto jeszcze jedna opcja, którą możesz wypróbować:
Na ile sposobów można ułożyć 6 różnych książek, od lewej do prawej, na półce?

Tym razem przedstawimy Ci rozwiązanie i umożliwimy Ci napisanie programu: 720.

Przykład 6: Ciągi tekstowe do rozważenia

Co daje poniższy program?

#include <iostream>
using namespace std;

int main() {
  string str1 = "To be or not to be, that is the question";
  string str2 = "only ";
  string str3 = str1.substr(6, 12);
  str1.insert(32, str2);
  str1.replace(str1.find("to be", 0), 5, "to jump");
  str1.erase(9, 4);
  cout << str1 << endl;
  for (int i = 0; i < str3.length(); i++)
    cout << str3[i]; cout << endl;
}

Aby uzyskać pomoc, kliknij tutaj.

Przykład 7. Kolejne kroki i rozkład pracy – pierwszy dzień pracy

Właśnie otrzymujesz stanowisko sprzedawcy w firmie ExerShoe, która specjalizuje się w wysokiej jakości butach do ćwiczeń w cenie około 225 USD za parę. Szef przyznał Ci 3 opcje wynagrodzenia. Musisz wybrać jedną z nich przed rozpoczęciem pierwszego dnia:

  1. stałe wynagrodzenie 600 USD tygodniowo;
  2. Wynagrodzenie w wysokości 7 PLN za godzinę plus prowizja od sprzedaży w wysokości 10%.
  3. Bez wynagrodzenia, ale w wysokości 20% prowizji i 20 zł za każdą sprzedaną parę butów

Jako ekspert w programie C++ wiesz, że możesz napisać program, który pomoże Ci wybrać najlepszą ofertę wynagrodzenia.

Powszechnym podejściem do realizacji rozkładu na potrzeby większego programu jest utworzenie głównej funkcji, która wygląda jak zarys rozwiązania problemu. Następnie napiszemy funkcje, które wykonują poszczególne zadania.

Oto pierwszy bilet w programie głównym:

  GetInput(WeeklySales);
  CalcMethod1(WeeklySales);
  CalcMethod2(WeeklySales);
  CalcMethod3(WeeklySales); 

Zanim zapoznasz się z naszym rozwiązaniem, sprawdź, czy możesz wdrożyć każdą z tych funkcji.

Przykład 8. Gdzie są dostępne produkty i usługi?

Jaki jest efekt tego programu?

// scope.cpp, Maggie Johnson
// Description: A program to illustrate different scopes

#include <iostream>
using namespace std;

int a = 18;
int b = 6;

int function1(int a, int b) {
  return a - b;
}

int function2() {
  int c;
  c = a + b;
  return c;
}

int main() {
  int b = 12;
  int c = 0;
  a = function1(b, a);
  c = function2();
  cout << "a: " << a << " b: " << b << " c: " << c << endl;
}

Gdy znajdziesz odpowiedź na swoje pytanie, zajrzyj do skomentowanej wersji kodu tutaj.

Przykład 9. Przetwarzanie plików

Przetwarzanie plików w C++ jest wykonywane za pomocą fstream. Aby zapisać plik w pliku, zadeklarujemy zasób typu ofstream i otwieramy go w trybie „out”. Przeanalizuj to w przykładzie poniżej.

// file.cpp, Maggie Johnson
// Description: An illustration of file processing
#include <fstream>
#include <iostream>
using namespace std;

int main() {
  char first_name[30], last_name[30]; int age;
  char file_name[20];
  // Collect the data.
  cout << "Enter First Name: "; cin >> first_name;
  cout << "Enter Last Name: "; cin >> last_name;
  cout << "Enter Age: "; cin >> age;
  cout << endl << "Enter the name of the file: "; cin >> file_name;

  // Create an ofstream called People, open the stream for output.
  ofstream People(file_name, ios::out);
  // Write the output to the stream.
  People << first_name << endl << last_name << endl << age << endl; return 0;
} 
  • Sprawdź, czy wiesz, jak otworzyć utworzony przed chwilą plik i wyświetlić dane.Tutaj znajdziesz nasze rozwiązanie.
  • Teraz zobacz, czy da się zmodyfikować ten program, aby umożliwić użytkownikowi wpisywanie wielu rekordów danych za pomocą pętli. Chcemy też odczytywać wszystkie dane po 1 rekordzie.Tutaj znajdziesz nasze rozwiązanie.

Możesz teraz samodzielnie wypróbować kilka ćwiczeń i projektów.

Jak to jest być inżynierem oprogramowania w Google

Więcej informacji o pracy w Google znajdziesz na tej stronie.

Ćwiczenia i projekty

Poniższe ćwiczenia pozwolą Ci lepiej poćwiczyć podstawy języka C++. Nie zapewniamy rozwiązań w przypadku tych ćwiczeń i projektów, ponieważ chcielibyśmy pracować z innymi uczestnikami tego kursu.

  1. To typowe odgłosy krykieta na polu gry w bezpośredniej proporcji do bieżącej temperatury. Po dodaniu 40 do liczby uderzeń krykieta w ciągu minuty, a następnie podzielenie tej wartości przez 4 otrzymujemy temperaturę. Napisz program, który będzie podawać liczbę odcisków w ciągu minuty i wydrukuje aktualną temperaturę. Przykład:
    Number of chirps: 120
    The temperature is: 40.0 degrees. 
  2. Napisz program, w którym obliczysz końcową ocenę za ukończenie kursu programowania. Schemat oceniania:
    Final grades will be based on the following:
    40% Assignments   15% Midterm Examination
    35% Final Examination
    10% Class Participation Grade 

    Twój program powinien poprosić użytkownika o 4 wyniki za projekty – ocenę semestralną, końcową i ocenę z sekcji. Następnie obliczamy i drukujemy końcową ocenę. Aby wykonać obliczenia, mnożysz przez siebie 4 wyniki projektów przez 0,4 (40%). Następnie mnożysz wynik semestru przez 0,15, wynik końcowy – 0,35, a ocenę za uczestnictwo w programie – 0,1. Następnie dodajesz wszystkie wyniki tych mnożenia.

    Używaj funkcji w dowolnym miejscu w tym programie. Możesz utworzyć funkcję pobierającą dane wejściowe, przekazując jako parametr ciąg znaków, który ma być wyświetlany w objaśnieniach. Oto przykładowe uruchomienie:

    Enter the score for the first assignment. 75
    Enter the score for the second assignment. 85
    Enter the score for the third assignment. 82
    Enter the score for the fourth assignment. 94
    Enter the score for the midterm. 81
    Enter the score for the final. 89
    Enter the score for the section grade. 100
    The final grade is: 86.9
  3. Ponieważ stopery elektroniczne stają się tańsze i dokładniejsze, nie będą mieć wątpliwości co do dokładnych pomiarów czasu. Napisz program, który jako dane wejściowe podaje przedział czasu w sekundach, a potem zwraca podaną przez niego liczbę godzin, minut i sekund. Przykład:
    Number of seconds: 3662
    Hours: 1
    Minutes: 1
    Seconds: 2     
  4. Przed napisaniem programu przeprowadź jego analizę. Wszędzie tam, gdzie to możliwe, używaj funkcji, aby utworzyć dobrze zorganizowane programy.

  5. Załóżmy, że chcemy wydrukować baner na potrzeby:

    „ZABLOKOWANE DŹWIĘKI ZAGRANICZĄ TRZECI DŹWIĘKÓW”

    Chcemy, żeby litery były dość duże, ponieważ jest to baner:

    FFFFF
    F
    FFF
    F
    F
    
    EEEEE
    E
    EEE
    E
    EEEEE
    
    itp.

    Jako dobre narzędzie do analizowania problemów pewnie udało Ci się zauważyć, że zamiast umieszczać wszystkie wartości w głównej funkcji, lepiej przyporządkować je do funkcji. Możemy więc mieć funkcje „printE”, „printZ” itd.

    Napisz program z funkcjami, które utworzy baner ze słowem lub wyrażeniem z wieloma powtórzonymi literami. Niektóre możliwości:

    FREEZY BREEZE MAKES FLEAS
    SNEEZE TWEETLE BEETLE PADDLE BATTLE
    SIX SICK CHICKS KICK
    SUE SEWS SUE'S SOCKS
    BEN BENDS BIM'S BROOM 
  6. Oto problem z „magiczną liczbą”: poproś użytkownika o wpisanie trzycyfrowej liczby, której pierwsza cyfra jest większa od ostatniej. Twój program odwróci tę liczbę i odejmie wartość wycofania od pierwotnej liczby. Na koniec odwróć wynikową liczbę i dodaj ją do postaci odwróconej. Wygeneruj na wyjściu wynik końcowy. Liczba wpisana przez użytkownika musi być liczbą całkowitą (nie może zawierać trzech znaków). Zastanów się, jak napisać funkcję, która pobiera jako dane liczbę całkowitą i zwraca jej odwrotność. Przykład:
    input number: 901
    reverse it: 109
    subtract: 901 - 109 = 792
    reverse it: 297
    add: 297 + 792 = 1089   
  7. Przepisy wymagają, aby producenci umieszczali daty ważności swoich produktów. W przepisach jest jednak luka – nie wymaga ona podawania daty ważności w żadnej konkretnej formie. Może ona być napisana w języku suahili i nadal być legalna.

    Nadine, trzecia kuzyna Ralpha Nadera, jest samozwańczym szpiegowniczką ds. jakości jedzenia. Dowiedziała się, że wielu producentów produktów spożywczych zaczęło kodować daty ważności produktów, aby klienci nie wiedzieli, ile lat mają produkty.

    Jednak kodowanie pozwala sklepom spożywczym poznać daty ważności, jeśli z jakiegoś powodu będą chcieli to zrobić.

    Jedna popularna metoda kodowania:

    • zakoduj miesiące od stycznia do grudnia jako od „A” do „L”
    • zakoduj każdą cyfrę daty jako od „Q” do „Z”
    • zakoduj rok za pomocą liter od „A” do „Z”, co oznacza liczbę od 1 do 26, którą następnie dodaj do roku 1995.

    Nadia znalazła wyjątkowo wątpliwy boch chleba o tej dacie: AZM. Napisz program, który ustali datę.

  8. Jest to liczba analogiczna do znanej sztuczki z kartami. Poproś użytkownika o wpisanie 3-cyfrowego numeru. Ta liczba przypomina literę ABC (gdzie A, B, C to 3 cyfry). Teraz oblicz pozostałe liczby utworzone przez ABC, BCA i CAB po podzieleniu przez 11. Nazwijmy te reszty X, Y, Z. Dodaj je jako X+Y, Y+Z, Z+X. Jeśli któraś z sum jest nieparzysta, zwiększ lub zmniejsz ją o 11 (zależnie od tego, która operacja spowoduje uzyskanie liczby dodatniej mniejszej niż 20; zwróć uwagę, jeśli suma wynosi 9, po prostu zgłoś ten problem i przerwij ten proces). Na koniec podziel każdą sumę na pół. Otrzymane cyfry to A, B, C. Napisz program, który będzie implementował ten algorytm.

Aplikacja: Wizualizacja muzyki przy użyciu animacji

Inżynierowie oprogramowania tworzą szeroką gamę często interesujących i innowacyjnych aplikacji. W każdym module tego kursu prezentujemy inną aplikację zaprojektowaną i wdrożoną przez inżynierów. Pomaga ona zrozumieć różne obszary, w których pracują inżynierowie.

Tutaj znajdziesz ciekawą aplikację, która stworzono z myślą o wizualizacji muzyki.