1. Wypisywanie danych Przykłady 1.1. Napisz program, który wypisze na ekran słowa Hello, world!. 1 // Przyklad 1: Hello, world! 3 using namespace std; 5 int main() { 6 cout << "Hello, world!" << endl; 7 8 return 0; 9 } Pierwsza linia jest przykładem komentarza. Wszystko co znajduje się po podwójnym ukośniku, aż do końca linii, jest ignorowane przez kompilator. Można umieszczać tam wyjaśnienia kodu, które ułatwią jego zrozumienie przez inne osoby (lub ciebie za kilka tygodni lub miesięcy). Uwaga! Zwróć uwagę na brak polskich znaków, nie tylko w komentarzu, ale w całym kodzie. Ich używanie może prowadzić do błędów kompilacji lub nieprawidłowego działania programu, dlatego lepiej ich unikać. Druga i trzecia linia mówią kompilatorowi, że używać będziemy strumieni wejścia i wyjścia (iostream), znajdujących się wewnątrz biblioteki standardowej (std). Czym dokładnie są strumienie dowiesz się później. Póki co musisz wiedzieć, że służą one do wypisywania oraz pobierania danych. Linie 5-9 okalają właściwą serię poleceń wydawaną komputerowi. Wszystko co znajduje się między klamrami po int main() jest wykonywane przez komputer po kolei, od góry do dołu. Uwaga! Zauważ, że każda linia kodu między klamrami została wcięta o jeden poziom. Wcięcia nie są niezbędne do prawidłowego działania programu, jednak bardzo ułatwiają czytanie kodu. Warto wyrobić sobie nawyk prawidłowego formatowania już na samym początku.
Linia 6 odpowiada za wypisanie na ekran tekstu Hello, world!. Wszystko co znajduje się między znakami cudzysłowu zostanie wypisane na ekran dokładnie tak, jak wygląda w kodzie, włącznie ze spacjami, liczbami i operacjami matematycznymi. Uwaga! Między cudzysłowami nie można umieszczać znaków nowej linii. Słowo endl oznacza koniec linii (od angielskiego end line). Przesłanie go do strumienia (bez cudzysłowów!) spowoduje przejście do nowego wiersza. W końcu linia 8 odpowiada za przekazanie do systemu liczby 0, oznaczającej prawidłowe zakończenie działania programu. 1.2. Napisz program, który wypisze na ekran piernikowego ludzika: (")_ (_. _) / : \ (_/ \_) 1 // Przyklad 1.2: Piernikowy ludzik 3 using namespace std; 5 int main() { 6 cout << " _" << endl; 7 cout << " _(\")_" << endl; 8 cout << "(_. _)" << endl; 9 cout << " / : \\" << endl; 10 cout << "(_/ \\_)" << endl; 11 12 return 0; 13 } W celu wypisania piernikowego ludzika, musimy przepisać wszystkie znaki go tworzące do edytora, umieścić je w cudzysłowach i wypisać. Tym razem jednak potrzebujemy więcej niż jednej linii z cout i endl. Problem pojawia się, gdy chcemy wypisać na ekran znak cudzysłowu. Jego umieszczenie w kodzie oznaczać będzie koniec tekstu do wypisania, a nie o to nam chodzi. Aby temu zaradzić, należy umieścić odwrócony ukośnik (backslash) przed problematycznym znakiem, jak w linii 7. Jest to znak dla kompilatora 5
(przynajmniej w tym wypadku): wiem, że następny znak ma specjalne znaczenie, ale ja chcę go po prostu wypisać. Podobny problem napotykamy w linii 9. Tym razem chcemy wypisać ukośnik, a znak cudzysłowu pozostawić jako zakończenie tekstu. Znów, umieszczamy ukośnik przed problematycznym znakiem, tym razem ukośnikiem. To samo musimy zrobić w linii 10. Uwaga! Dodatkowy ukośnik powinniśmy umieszczać także przed znakiem apostrofu oraz znakiem zapytania. Dodatkowo, umieszczenie go przed literą n (czyli \n) da nam znak nowej linii. 1.3. Napisz program, który obliczy i wypisze wartość wyrażenia 9 31 + 62. 1 // Przyklad 1.3: Wartosc wyrazenia 3 using namespace std; 5 int main() { 6 cout << 9*31 + 62 << endl; 7 8 return 0; 9 } Jeżeli pominiemy cudzysłowy, wyrażenie nie będzie traktowane jako tekst, ale jako matematyczne działanie. Możemy w ten sposób wykonywać obliczenia na liczbach. Do dyspozycji mamy dodawanie (+), odejmowanie (-), mnożenie (*), dzielenie (/) oraz resztę z dzielenia (%). Kolejność wykonywania działań jest taka, jak w matematyce. Najpierw wykonywane jest mnożenie i dzielenie (w tym dzielenie z resztą) od lewej do prawej, a następnie dodawanie i odejmowanie, również od lewej do prawej. Kolejność możemy zmieniać przy użyciu nawiasów, ale tylko okrągłych. Uwaga! Dzielenie w C++ jest całkowitoliczbowe, to znaczy jeżeli dwie liczby są całkowite, to wynik ich dzielenia również będzie całkowity. Wynik zaokrąglany jest w dół, zatem 99/10 da nam 9. Uwaga! Znak % nie ma w C++ nic wspólnego z obliczaniem procentów. Służy do obliczania reszty z dzielenia jednej liczby przez drugą. 6
1.. Napisz program, który obliczy przybliżoną wartość wyrażenia ( 2 ) 5 i wypisze ją na ekran. 1 // Przyklad 1.: Pierwiastki 3 #include <cmath> using namespace std; 5 6 int main() { 7 cout << pow(sqrt(2), 5) << endl; 8 9 return 0; 10 } Oprócz podstawowych operacji arytmetycznych mamy także możliwość obliczania wartości innych funkcji matematycznych, jak pierwiastki, potęgi, logarytmy, funkcje trygonometryczne itp. Musimy jednak w tym celu użyć definicji z pliku cmath, o czym informujemy kompilator w linii 3. Otrzymujemy w ten sposób dostęp do funkcji takich jak sqrt (pierwiastek kwadratowy z liczby), pow (potęga), sin, cos, log itp. Funkcji tych używamy podając najpierw nazwę, a następnie argumenty w nawiasach okrągłych. Jeżeli argumentów jest kilka, oddzielamy je przecinkami. Uwaga! Liczby ułamkowe piszemy w C++ z kropką. Zatem prawidłowo powinniśmy napisać, na przykład, 2.5, ale nie 2,5. Uwaga! C++ nie posiada operatora potęgowania ^. Wyrażenie 2^5 nie zwróci błędu w czasie kompilacji, ale jego wynikiem nie będzie 32, tylko 0. Uwaga! Funkcje trygonometryczne (sin, cos, tan) przyjmują jako argumenty miarę kąta w radianach, nie w stopniach. Uwaga! Nie jest dostępna funkcja obliczająca wartość cotangensa danego kąta. Można to ograniczenie obejść obliczając wartość 1/tan(x). 7
Pytania 1.1. Co wypisze na ekran następująca linia kodu? 1 cout << "2+2" << endl; 1.2. Co wypisze na ekran następująca linia kodu? 1 cout << "/\\/\\\n" << endl; 1.3. Co wypisze na ekran następująca linia kodu? 1 cout << 9999/1000 << endl; 1.. Co wypisze na ekran następująca linia kodu? 1 cout << 9999%1000 << endl; 1.5. Czym różnią się poniższe linie kodu? Jaki jest wpływ tej różnicy na wynik działania każdej z nich? 1 cout << "2+2*2" << endl; 2 cout << 2+2*2 << endl; Zadania 1.1. (+5) Napisz program, który wypisze na ekran twoje imię i nazwisko. 1.2. (+5) Napisz program, który wypisze na ekran pierwsze cztery wersy Inwokacji z Pana Tadeusza : Litwo! Ojczyzno moja! Ty jesteś jak zdrowie, Ile cię trzeba cenić, ten tylko się dowie, Kto cię stracił. Dziś piękność twa w całej ozdobie Widzę i opisuję, bo tęsknię po tobie. 1.3. (+10) Napisz program, który wypisze na ekran lisa: /..\ ( o o ) \ / \ / O 8
1.. (+10) Napisz program, który wypisze na ekran kota: \_/ (^Y^)--.-, w-w (( ) 1.5. (+10) Napisz program, który wypisze na ekran sowę: ^...^ / o,o \ ):::( ===w=w=== 1.6. (+5) Napisz program, który obliczy i wypisze wartość wyrażenia 123 56. 1.7. (+10) Napisz program, który obliczy i wypisze liczbę sekund, która upływa w ciągu jednego tygodnia. 1.8. (+10) Napisz program, który obliczy i wypisze resztę z dzielenia wyrażenia (92 + 157) (673 192) przez 11. 1.9. (+5) Napisz program, który obliczy i wypisze przybliżoną wartość pierwiastka kwadratowego z 3. 1.10. (+10) Napisz program, który obliczy i wypisze wartość wszystkich funkcji trygonometrycznych kąta 30 stopni. Rozszerzenie 1.1. (+50) Napisz program, który będzie wypisywać na ekran losowe cytaty. 1.2. (+80) Napisz program, który pobierze tekst jako argument wiersza poleceń, a następnie wypisze go w dymku obok sowy, lisa lub kota, na przykład wywołanie sowa.exe "Hello, world!" powinno wyświetlić: --------------- Hello, world! ^...^ /-------------- / o,o \ ):::( ===w=w=== 1.3. (+130) Napisz program, który wczyta z pliku listę produktów (jeden na linię), a następnie uporządkuje je alfabetycznie i zapisze do oryginalnego pliku (nadpisując oryginalną zawartość). 9