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