2. Zmienne i stałe Przykłady 2.1. Napisz program, który wypisze na ekran wynik dzielenia 281 i 117 w postaci liczby mieszanej (tj. 2 47/117). 5 int a = 281; int b = 117; 7 8 cout << a/b << " "; 9 cout << a%b << "/"; 10 cout << b << endl; 11 12 return 0; 1 } Program ten da się napisać bez użycia zmiennych. Jednak w takim przypadku, gdybyśmy chcieli zmienić liczbę 281 na inną, potrzebowalibyśmy dokonać zmiany w dwóch miejscach (a w przypadku liczby 117 w trzech). Chcąc uniknąć tej duplikacji możemy nadać nazwy tym dwóm liczbom, tworząc zmienne, jak w liniach 5 i. Aby stworzyć zmienną, podajemy najpierw jej typ (tutaj int, czyli liczba całkowita, od angielskiego integer), następnie jej nazwę, a na końcu, po znaku =, początkową wartość. Uwaga! Nazwa zmiennej może składać się wyłącznie z liczb alfabetu angielskiego (małych i wielkich), cyfr oraz znaku podkreślenia, przy czym nie może zaczynać się od cyfry. Wielkość liter ma znaczenie. Uwaga! Znak =, poza wyglądem, nie ma absolutnie nic wspólnego ze znakiem równości stosowanym w matematyce. Jest to operator przypisania, oznaczający, że zmienna po lewej stronie otrzymuje wartość po prawej. Operator ten nie jest symetryczny: po lewej zawsze znajduje się zmienna do której przypisujemy, a po prawej wartość do przypisania. 10
Tak stworzonych zmiennych możemy następnie używać w działaniach matematycznych odwołując się do nich poprzez ich nazwy, jak w liniach 8-10. 2.2. Napisz program, który zapyta użytkownika o liczbę naturalną, pobierze ją, a następnie wypisze na ekran jej kwadrat. 5 cout << "Podaj liczbe naturalna: "; 7 int n; 8 cin >> n; 9 10 cout << "Jej kwadrat jest rowny " << n*n << endl; 11 return 0; 12 } Aby pobrać wartość od użytkownika, musimy stworzyć zmienną, w której będziemy tę wartość przechowywać. Podanie początkowej wartości dla zmiennej nie jest obowiązkowe. W linii 7 zostało ono pominięte, jako że początkowa wartość i tak zostałaby natychmiast nadpisana w linii 8. Uwaga! O ile zmienna nie otrzymuje natychmiast wartości w żaden inny sposób, zawsze pamiętaj o podaniu początkowej wartości dla niej. Wartość zmiennej bez przypisanej wartości jest nieokreślona i może być absolutnie dowolna, co często prowadzi do nieoczekiwanego zachowania programu. Uwaga! Jeżeli uczono cię kiedyś, że zmienne należy tworzyć na początku bloku, jak najszybciej wyzbadź się tego nawyku. Wynika on z ograniczeń technologicznych języka C (na podstawie którego powstał C++, którego używamy tutaj) i jest absolutnym przeciwieństwem dobrych praktyk stosowanych obecnie. Zmienne należy tworzyć tuż przed ich pierwszym użyciem. Za pobranie wartości od użytkownika odpowiada linia 8. Zwróć uwagę na kierunek strzałek przy cout i cin. Te pierwsze kierują dane do strumienia, a te drugie ze strumienia do zmiennej. 2.. Napisz program, który pobierze od użytkownika dwie liczby (nazwijmy je n i k), a następnie wypisze ułamek n k w postaci liczby mieszanej. 11
5 cout << "Podaj wartosci n i k" << endl; 7 int n, k; 8 cin >> n >> k; 9 10 cout << "Ulamek n/k w postaci liczby mieszanej: "; 11 cout << n/k << " "; 12 cout << n%k << "/"; 1 cout << k << endl; 14 15 return 0; 1 } Ten przykład jest rozszerzeniem przykładu 1. Zamiast obliczać wynik dla znanych liczb, pobieramy je od użytkownika, a następnie obliczamy i wypisujemy wynik. Zwróć uwagę na linie 7 i 8, w których tworzone są zmienne oraz pobierane są ich wartości. Możliwe jest tworzenie wielu zmiennych jednego typu jednocześnie. Wystarczy oddzielić ich nazwy przecinkami. Możliwe jest również pobranie dwóch liczb na raz tak jak w linii 8. 2.4. Napisz program, który pobierze od użytkownika promień koła (niekoniecznie całkowity), a następnie obliczy i wypisze na ekran jego średnicę. 5 cout << "Podaj promien kola: "; 7 double r; 8 cin >> r; 9 10 cout << "Srednica tego kola: " << 2*r << endl; 11 12 return 0; 1 } 12
Jako że treść zadania wymaga od nas działania z liczbami, które nie muszą być całkowite, typ zmiennej int nie jest tutaj odpowiedni. Stosujemy w zamian typ double, który służy do przechowywania tzw. liczb zmiennoprzecinkowych. Pozwala on na przechowywanie liczb bardzo dużych (do około 2 1024 ) jak i bardzo małych (najmniejsza możliwa liczba dodatnia w okolicach 2 1024 ). Jednakże precyzja takiej liczby jest dość ograniczona: jedynie pierwsze 9 miejsc znaczących w zapisie dziesiętnym niesie za sobą jakiekolwiek znaczenie. Uwaga! Każdy wynik otrzymany w działaniu na liczbach zmiennoprzecinkowych jest jedynie przybliżeniem. Nawet proste obliczenie jak 0.1 + 0.2 może dać, dość nieoczekiwanie, wynik 0.29999999999. Wynika to z tego, że 0.1 jest w systemie dwójkowym liczbą o rozwinięciu nieskończonym, więc nie da się jej dokładnie przedstawić wewnątrz zmiennej typu double. Liczb zmiennoprzecinkowych nie należy używać, o ile nie jest to absolutnie niezbędne. Nawet obliczenia na pieniądzach lepiej wykonywać na liczbach całkowitych (w postaci, na przykład, liczby groszy). 2.5. Napisz program, który pobierze od użytkownika promień koła, a następnie wypisze jego pole i obwód. 5 const double PI =.14159255; 7 cout << "Podaj promien kola: "; 8 double r; 9 cin >> r; 10 11 cout << "Obwod kola: " << 2*PI*r << endl; 12 cout << "Pole kola: " << PI*r*r << endl; 1 14 return 0; 15 } Oprócz zmiennych, możemy tworzyć także stałe. Różnią się one od zmiennych tym, że nie można zmieniać ich wartości, a co za tym idzie, podanie wartości początkowej jest obowiązkowe. Stałe tworzymy tak jak zmienne, z tą różnicą, że przed typem piszemy słowo const (od angielskiego constant, czyli stała). Nazwy stałych z reguły piszemy wielkimi literami, ale nie jest to wymagane. 1
Pytania 2.1. Co wypisze następujący fragment kodu? 1 int n = 5; 2 cout << n << endl; 4 n = 10; 5 cout << n << endl; 2.2. Co wypisze następujący fragment kodu? 1 int a = 5; 2 int b = a; a = 10; 4 cout << b << endl; 2.. Co wypisze następujący fragment kodu? 1 int a = 5; 2 a = a+1; cout << a << endl; 2.4. Co wypisze następujący fragment kodu? (1e100 oznacza 1 10 100 ). 1 cout << 1e100 + 1-1e100 << endl; 2.5. Ile miejsca w pamięci zajmuje pojedyncza zmienna typu int? Jaka jest najmniejsza i największa wartość, jaka może się w niej zmieścić? 2.. Ile miejsca w pamięci zajmuje pojedyncza zmienna typu double? Zadania 2.1. (+10) Napisz program, który pobierze od użytkownika jedną liczbę: długość przejechanego dystansu wyrażoną w milach. Program ma policzyć i wypisać długość tego dystansu w kilometrach. 2.2. (+10) Napisz program, który pobierze od użytkownika trzy liczby: a, b i c, będące współczynnikami funkcji kwadratowej w postaci ogólnej. Program ma policzyć i wypisać na ekran wartość delty tej funkcji. 14
2.. (+10) Napisz program, który pobierze od użytkownika jedną liczbę: temperaturę powietrza w stopniach Celsjusza. Program ma policzyć i wypisać tę temperaturę wyrażoną w stopniach Fahrenheita (F = 9 5 C + 2). 2.4. (+10) Napisz program, który pobierze od użytkownika dwie liczby: długości przyprostokątnych trójkąta prostokątnego. Program ma policzyć i wypisać na ekran długość przeciwprostokątnej tego trójkąta. 2.5. (+10) Napisz program, który pobierze od użytkownika jedną liczbę całkowitą n, a następnie policzy i wypisze sumę liczb naturalnych od 1 do n włącznie. 2.. (+15) Napisz program, który pobierze od użytkownika trzy liczby: a, b i c, będące współczynnikami funkcji kwadratowej w postaci ogólnej. Program ma policzyć i wypisać na ekran współrzędne wierzchołka tej funkcji. 2.7. (+20) Napisz program, który pobierze od użytkownika trzy liczby: długości boków pewnego trójkąta. Program ma policzyć i wypisać pole powierzchni tego trójkąta. 2.8. (+20) Napisz program, który pobierze od użytkownika cztery liczby: współrzędne dwóch punktów na płaszczyznie (x 1, y 1, x 2, y 2 ). Program ma policzyć, a następnie wypisać odległość między tymi dwoma punktami. 2.9. (+10) Napisz program, który pobierze od użytkownika liczbę oznaczającą długość odcinka, a następnie wyznaczy złoty podział tego odcinka i wypisze na ekran odległości punktu podziału od każdego z punktów końcowych. 2.10. (+10) Napisz program, który pobierze od użytkownika liczbę opisującą długość promienia kuli, a następnie obliczy i wypisze objętość i pole powierzchni tej kuli. Rozszerzenie 2.1. (+50) Napisz program, który pobierze z pliku listę pomiarów temperatur (jeden pomiar na linię), a następnie policzy i wypisze na ekran amplitudę i średnią tych pomiarów. 2.2. (+80) Napisz program, który wczyta z pliku tekst, a następnie zakoduje go klasycznym szyfrem Cezara i zapisze go do drugiego pliku. 2.. (+10) Napisz program, który wczyta od użytkownika liczbę, a następnie wypisze na ekran wszystkie liczby pierwsze mniejsze od danej liczby. 15