pobierz
Transkrypt
pobierz
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). 1 2 3 4 5 6 7 8 9 10 11 12 13 #include <iostream> using namespace std; int main() { int a = 281; int b = 117; cout << a/b << " "; cout << a%b << "/"; cout << b << endl; return 0; } Program ten da si˛e napisać bez użycia zmiennych. Jednak w takim przypadku, gdybyśmy chcieli zmienić liczb˛e 281 na inna,˛ potrzebowalibyśmy dokonać zmiany w dwóch miejscach (a w przypadku liczby 117 w trzech). Chcac ˛ uniknać ˛ tej duplikacji możemy nadać nazwy tym dwóm liczbom, tworzac ˛ zmienne, jak w liniach 5 i 6. Aby stworzyć zmienna,˛ podajemy najpierw jej typ (tutaj int, czyli liczba całkowita, od angielskiego integer), nast˛epnie jej nazw˛e, a na końcu, po znaku =, poczatkow ˛ a˛ wartość. Uwaga! Nazwa zmiennej może składać si˛e wyłacznie ˛ z liczb alfabetu angielskiego (małych i wielkich), cyfr oraz znaku podkreślenia, przy czym nie może zaczynać si˛e od cyfry. Wielkość liter ma znaczenie. Uwaga! Znak =, poza wygladem, ˛ nie ma absolutnie nic wspólnego ze znakiem równości stosowanym w matematyce. Jest to operator przypisania, oznaczajacy, ˛ że zmienna po lewej stronie otrzymuje wartość po prawej. Operator ten nie jest symetryczny: po lewej zawsze znajduje si˛e zmienna do której przypisujemy, a po prawej wartość do przypisania. 10 Tak stworzonych zmiennych możemy nast˛epnie używać w działaniach matematycznych odwołujac ˛ si˛e do nich poprzez ich nazwy, jak w liniach 8-10. 2.2. Napisz program, który zapyta użytkownika o liczb˛e naturalna,˛ pobierze ja,˛ a nast˛epnie wypisze na ekran jej kwadrat. 1 2 3 #include <iostream> using namespace std; 4 5 6 7 8 9 int main() { cout << "Podaj liczbe naturalna: "; 10 11 12 int n; cin >> n; cout << "Jej kwadrat jest rowny " << n*n << endl; return 0; } Aby pobrać wartość od użytkownika, musimy stworzyć zmienna,˛ w której b˛edziemy t˛e wartość przechowywać. Podanie poczatkowej ˛ wartości dla zmiennej nie jest obowiazkowe. ˛ W linii 7 zostało ono pomini˛ete, jako że poczatkowa ˛ 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˛etaj o podaniu poczatkowej ˛ wartości dla niej. Wartość zmiennej bez przypisanej wartości jest nieokreślona i może być absolutnie dowolna, co cz˛esto prowadzi do nieoczekiwanego zachowania programu. Uwaga! Jeżeli uczono ci˛e kiedyś, że zmienne należy tworzyć na poczatku ˛ bloku, jak najszybciej wyzbadź ˛ si˛e tego nawyku. Wynika on z ograniczeń technologicznych j˛ezyka 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˛e na kierunek strzałek przy cout i cin. Te pierwsze kieruja˛ dane do strumienia, a te drugie ze strumienia do zmiennej. 2.3. Napisz program, który pobierze od użytkownika dwie liczby (nazwijmy je n i k), a nast˛epnie wypisze ułamek nk w postaci liczby mieszanej. 11 1 2 3 4 5 6 7 8 #include <iostream> using namespace std; int main() { cout << "Podaj wartosci n i k" << endl; int n, k; cin >> n >> k; 9 10 11 12 13 14 15 16 cout cout cout cout << << << << "Ulamek n/k w postaci liczby mieszanej: "; n/k << " "; n%k << "/"; k << endl; return 0; } Ten przykład jest rozszerzeniem przykładu 1. Zamiast obliczać wynik dla znanych liczb, pobieramy je od użytkownika, a nast˛epnie obliczamy i wypisujemy wynik. Zwróć uwag˛e na linie 7 i 8, w których tworzone sa˛ zmienne oraz pobierane sa˛ 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˛epnie obliczy i wypisze na ekran jego średnic˛e. 1 2 3 4 5 6 7 8 9 10 11 12 13 #include <iostream> using namespace std; int main() { cout << "Podaj promien kola: "; double r; cin >> r; cout << "Srednica tego kola: " << 2*r << endl; return 0; } 12 Jako że treść zadania wymaga od nas działania z liczbami, które nie musza˛ 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 21024 ) 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 znaczacych ˛ w zapisie dziesi˛etnym niesie za soba˛ 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 liczba˛ o rozwini˛eciu nieskończonym, wi˛ec nie da si˛e jej dokładnie przedstawić wewnatrz ˛ zmiennej typu double. Liczb zmiennoprzecinkowych nie należy używać, o ile nie jest to absolutnie niezb˛edne. Nawet obliczenia na pieniadzach ˛ 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˛epnie wypisze jego pole i obwód. 1 2 3 4 5 6 7 8 #include <iostream> using namespace std; int main() { const double PI = 3.1415926535; cout << "Podaj promien kola: "; double r; cin >> r; 9 10 11 12 13 14 15 cout << "Obwod kola: " << 2*PI*r << endl; cout << "Pole kola: " << PI*r*r << endl; return 0; } Oprócz zmiennych, możemy tworzyć także stałe. Różnia˛ si˛e one od zmiennych tym, że nie można zmieniać ich wartości, a co za tym idzie, podanie wartości poczatkowej ˛ jest obowiazkowe. ˛ Stałe tworzymy tak jak zmienne, z ta˛ różnica,˛ ż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. 13 Pytania 2.1. Co wypisze nast˛epujacy ˛ fragment kodu? 1 2 3 4 5 int n = 5; cout << n << endl; n = 10; cout << n << endl; 2.2. Co wypisze nast˛epujacy ˛ fragment kodu? 1 2 3 4 int a = 5; int b = a; a = 10; cout << b << endl; 2.3. Co wypisze nast˛epujacy ˛ fragment kodu? 1 2 3 int a = 5; a = a+1; cout << a << endl; 2.4. Co wypisze nast˛epujacy ˛ fragment kodu? (1e100 oznacza 1 · 10100 ). 1 cout << 1e100 + 1 - 1e100 << endl; 2.5. F Ile miejsca w pami˛eci zajmuje pojedyncza zmienna typu int? Jaka jest najmniejsza i najwi˛eksza wartość, jaka może si˛e w niej zmieścić? 2.6. F Ile miejsca w pami˛eci zajmuje pojedyncza zmienna typu double? Zadania 2.1. (+10) Napisz program, który pobierze od użytkownika jedna˛ liczb˛e: długość przejechanego dystansu wyrażona˛ 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˛edace ˛ współczynnikami funkcji kwadratowej w postaci ogólnej. Program ma policzyć i wypisać na ekran wartość delty tej funkcji. 14 2.3. (+10) Napisz program, który pobierze od użytkownika jedna˛ liczb˛e: temperatur˛e powietrza w stopniach Celsjusza. Program ma policzyć i wypisać t˛e temperatur˛e wyrażona˛ w stopniach Fahrenheita (F = 95 C + 32). 2.4. (+10) Napisz program, który pobierze od użytkownika dwie liczby: długości przyprostokatnych ˛ trójkata ˛ prostokatnego. ˛ Program ma policzyć i wypisać na ekran długość przeciwprostokatnej ˛ tego trójkata. ˛ 2.5. (+10) Napisz program, który pobierze od użytkownika jedna˛ liczb˛e całkowita˛ n, a nast˛epnie policzy i wypisze sum˛e liczb naturalnych od 1 do n włacznie. ˛ 2.6. (+15) Napisz program, który pobierze od użytkownika trzy liczby: a, b i c, b˛edace ˛ współczynnikami funkcji kwadratowej w postaci ogólnej. Program ma policzyć i wypisać na ekran współrz˛edne wierzchołka tej funkcji. 2.7. (+20) Napisz program, który pobierze od użytkownika trzy liczby: długości boków pewnego trójkata. ˛ Program ma policzyć i wypisać pole powierzchni tego trójkata. ˛ 2.8. (+20) Napisz program, który pobierze od użytkownika cztery liczby: współrz˛edne dwóch punktów na płaszczyznie (x1 , y1 , x2 , y2 ). Program ma policzyć, a nast˛epnie wypisać odległość mi˛edzy tymi dwoma punktami. 2.9. (+10) Napisz program, który pobierze od użytkownika liczb˛e oznaczajac ˛ a˛ długość odcinka, a nast˛epnie 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˛e opisujac ˛ a˛ długość promienia kuli, a nast˛epnie obliczy i wypisze obj˛etość i pole powierzchni tej kuli. Rozszerzenie 2.1. (+50) Napisz program, który pobierze z pliku list˛e pomiarów temperatur (jeden pomiar na lini˛e), a nast˛epnie policzy i wypisze na ekran amplitud˛e i średnia˛ tych pomiarów. 2.2. (+80) Napisz program, który wczyta z pliku tekst, a nast˛epnie zakoduje go klasycznym szyfrem Cezara i zapisze go do drugiego pliku. 2.3. (+130) Napisz program, który wczyta od użytkownika liczb˛e, a nast˛epnie wypisze na ekran wszystkie liczby pierwsze mniejsze od danej liczby. 15