Wejściówka – Funkcje matematyczne
Napisz program w języku C++, który obliczy pole sześciokąta foremnego. Program powinien wczytać długości boku od użytkownika, a następnie zapisać wynik do zmiennej typu całkowitego – result
. Na koniec program powinien wyświetlić, czy wartość wprowadzona do zmiennej result
jest podzielna bez reszty przez 6
, 3
lub 2
.
Rozwiązanie:
#include <iostream> #include <cmath> using namespace std; int main() { int a; cin >> a; int result = 3 * a * a * sqrt(3) / 2.0f; if(!(result % 6)) cout << "Podzielne przez 6, 3 i 2." << endl; else if(!(result % 3)) cout << "Podzielna przez 3." << endl; else if(!(result % 2)) cout << "Podzielna przez 2." << endl; else cout << "Niepodzielne przez 6, 3 lub 2."; return 0; }
Zadanie 1 – instrukcja wyboru switch
Napisz program w języku C++, który wczyta od użytkownika liczbę całkowitą. Następnie program powinien wyświetlić:
– Monday
, gdy użytkownik wprowadził 0
,
– Tuesday
, gdy użytkownik wprowadził 1
,
– Wednesday
, gdy użytkownik wprowadził 2
,
– Thursday
, gdy użytkownik wprowadził 3
,
– Party
dla każdej innej wartości wprowadzonej przez użytkownika.
Rozwiązanie
//Version 1.0 #include <iostream> using namespace std; int main() { int day; cin >> day; if(day == 0) cout << "Monday"; else if(day == 1) cout << "Tuesday"; else if(day == 2) cout << "Wednesday"; else if(day == 3) cout << "Thursday"; else cout << "Party"; return 0; }
//Version 2.0 #include <iostream> using namespace std; int main() { int day; cin >> day; switch (day) { case 0: cout << "Monday"; break; case 1: cout << "Tuesday"; break; case 2: cout << "Wednesday"; break; case 3: cout << "Thursday"; break; default: cout << "Party"; break; } return 0; }
Omówienie:
W celu ograniczenia wielokrotnego stosowania instrukcji if
możemy użyć instrukcji wyboru switch
. Konstrukcja tej instrukcji wygląda następująco:
switch (expression) { case condition1: /* instrukcje, jeśli expression == condition1 */ break; case condition2: /* instrukcje, jeśli expression == condition2 */ break; /* ... */ default: /* instrukcje, jeśli żaden z wcześniejszych warunków nie został spełniony */ break; }
Wartość expression
musi być wartością liczbową typu całkowitego lub wyliczeniowego.
Uwaga: Należy pamiętać o użyciu break
po zakończeniu instrukcji następujących po case
. Przy pominięciu instrukcji break
program przejdzie do wykonywania instrukcji z następnego case
i dalej aż do napotkania break
lub do końca instrukcji switch
, co może mieć nieprzewidziane skutki. Oczywiście są sytuacje, gdy jest to celowy zabieg, wtedy zaleca się opatrzeć taki fragment kodu komentarzem.
switch(dzielnik) { case 0: cout << "Dzielenie przez zero!"; /*tu powinien być break */ default: cout << 10 / dzielnik; } //Przykład chcianej sytuacji switch(a % 3) { case 0: cout << "Podzielne przez 3"; break; case -2: case -1: case 1: case 2: cout << "Niepodzielne przez 3"; break; }
Zadanie 2
Napisz program w języku C++, który przyjmuje od użytkownika 3 liczby całkowite i wyświetla największą z nich.
Rozwiązanie:
//Version 1.0 #include <iostream> using namespace std; int main() { int a, b, c; cin >> a >> b >> c; cout << (a > b ? (a > c ? a : c) : (b > c ? b : c)) << endl; return 0; }
//Version 2.0 #include <iostream> using namespace std; int main() { int a, b, c; cin >> a >> b >> c; a = a > b ? a : b; a = a > c ? a : c; cout << a << endl; return 0; }
Zadanie 3 – pętla while
Napisz program w języku C++, który wczyta od użytkownika liczbę całkowitą. Następnie program powinien inkrementować tą zmienną i do momentu dopóki będzie mniejsza niż 10
wyświetlać komunikat Za mało!
.
Rozwiązanie:
//Version 1.0 #include <iostream> using namespace std; int main() { int value; cin >> value; while(value < 10) { cout << "Za mało!\n"; value++; } return 0; }
//Version 2.0 #include <iostream> using namespace std; int main() { int value; cin >> value; while(value++ < 10) { cout << "Za mało!\n"; } return 0; }
Omówienie:
W celu wielokrotnego powtórzenia tego samego ciągu instrukcji, aby nie przepisywać tego samego kodu wiele razy, używamy pętli. Pierwszą omówioną pętlą będzie pętla while
, która wykonuje się do momentu, dopóki warunek
jest spełniony / prawdziwy. Dodatkowo należy mieć na uwadze, że pętla sprawdza warunek
przed wykonaniem kolejnego obrotu
/* inne instrukcje */ while(warunek) { /* instrukcje do wykonania w pętli */ } /* inne instrukcje */
Zadanie 4 – pętla for
Napisz program w języku C++, który wczyta użytkownika dwie liczby całkowite n
i k
. Następnie program powinien wyświetlić liczbę n
10
razy. Na koniec program powinien wyświetlić liczbę k
n
razy.
Rozwiązanie:
#include <iostream> using namespace std; int main() { int n, k; cin >> n >> k; for(int i = 0; i < 10; ++i) cout << n; for(int i = 0; i < n; ++i) cout << k; return 0; }
Omówienie:
W pewnych sytuacjach wygodniejsze jest używanie pętli for
. Instrukcja umożliwia ustawiania zmiennej, sprawdzania warunku i inkrementowania zmiennej w jednej linijce, co często zwiększa czytelność kodu.
/* inne instrukcje */ for (wyrazenie1; wyrazenie2; wyrazenie3) { /* instrukcje do wykonania w pętli */ } /* inne instrukcje */
wyrazenie1
– (opcjonalne) to instrukcja, która będzie wykonana przed pierwszym przebiegiem pętli. Ta instrukcja wykonuje się zawsze, nawet jeśli warunek pętli (wyrazenie2
) jest fałszywy.
Zazwyczaj służy do zainicjowania zmiennej, która będzie służyła jako licznik przebiegów pętli.wyrazenie2
– (opcjonalne) jest warunkiem zakończenia pętli. Pętla wykonuje się tak długo, jak prawdziwy jest ten warunek. Jeżeli nie będzie tego wyrażenia, to pętla wykonuje się zawsze.wyrazenie3
– (opcjonalne) jest to instrukcja, która wykonywana będzie po każdym przejściu pętli, także po ostatnim.
Zazwyczaj zamieszcza się tu instrukcje, która zwiększa licznik o odpowiednią wartość.
Instrukcja for
działa w następujący sposób; w pierwszej kolejności wykonuje wyrazenie1
, następnie sprawdza wyrazenie2
, jeżeli jest ono prawdziwe, to wykonywany jest blok pętli for
(lub pojedyncza instrukcja, jeśli klamry zostały pominięte), na koniec wykonywane jest wyrazenie3
. Instrukcję for
wewnątrz której nie ma żadnych instrukcji continue
lub break
(omówimy je później) jest równoważna z następującym zapisem instrukcji while
:
/* inne instrukcje */ wyrazenie1; while (wyrazenie2) { /* instrukcje do wykonania w pętli */ wyrazenie3; } /* inne instrukcje */
Przykłady:
Wypisywanie na ekran liczb od 1 do 10.
//Version 1.0 for(int i = 1; i <= 10; ++i){ cout << i << endl; }
//Version 2.0 for(int i = 1; i <= 10; ++i) cout << i << endl;
//Version 3.0 for(int i = 1; i <= 10; cout << i++);
//Version 4.0 for(int i = 1; i < 10; cout << i++); cout << i;
Kolejny przykład to wyświetlanie liczb najpierw rosnąco od 1 do 5, a następnie malejąco od 6 do 1.
//Version 1.0 int i; for(i = 1; i <= 5; ++i) cout << i; for(;i >= 1; --i) cout << i;
Zadanie 5 – pętla do…while
Napisz program w języku C++, który sumuje liczby, dopóki nie zostanie podana wartość 0
. Użycie instrukcji do…while
pozwala nie inicjalizować zmiennej value
sztuczną wartością.
Rozwiązanie:
#include <iostream> using namespace std; int main() { int value, sum = 0; do { cin >> value; sum += value; } while(value); cout << sum << endl; return 0; }
Omówienie:
Pętle while
i for
mają jeden zasadniczy mankament – może się zdarzyć, że nie wykonają się ani razu. Aby mieć pewność, że nasza pętla będzie miała co najmniej jeden przebieg musimy zastosować pętle do...while
. Jej składnia wygląda następująco:
/* inne instrukcje */ do { /* instrukcje do wykonania w pętli */ } while(warunek) /* inne instrukcje */
Instrukcja do...while
jest dość charakterystyczna i w przeciwieństwie do innych pętli sprawdza warunek pod koniec swojego przebiegu. Właśnie to sprawia, że pętla wykona się co najmniej raz.
Przykłady:
Pojedyncza instrukcja zamiast bloku instrukcji w pętli do...while
.
int a; do cout << a; while (++a <= 10);
Zadanie 6 – instrukcje break i continue, pętle nieskończone
Napisz program w języku C++, który pobiera granice przedziału domkniętego w formacie <a;b>
, a następnie wyświetla i zlicza wartości bez cyfry 5
.
Rozwiązanie:
#include <cstdio> #include <cmath> int main() { int b, e, counter = 0; scanf("<%d;%d>", &b, &e); for(int i = b; i <= e; ++i) { int value = abs(i); bool found = false; while(value) { if(value % 10 == 5) { found = true; break; } value /= 10; } if(found) continue; printf("%d ", i); counter++; } printf("\n%d numbers without digit 5 has been found between %d and %d.", counter, b, e); return 0; }
Omówienie:
break
– pozwala na opuszczenie wykonywania pętli w dowolnym momencie
for(int i = 0; i < 10; ++i) { if(i == 3) break; cout << i; }
continue
– w przeciwieństwie do poprzedniej instrukcji, która przerywa wykonywanie pętli, instrukcja continue
powoduje przejście do następnej iteracji, o ile warunek pętli jest spełniony
for (int i = 1; i < 10; ++i) { if (!(i % 3)) continue; cout << i; }
Powyższy kod generuje liczby od 1
do 9
niepodzielne przez 3
.
Pętla nieskończona to taka, której warunek zawsze jest prawdziwy. Z takiej pętli można wyjść jedynie za pomocą instrukcji break
lub return
.
for (;;) { /* ... */ } for (;1;) { /* ... */ } for (a;a;a) { /* ... */} /*gdzie a jest dowolną liczba rzeczywistą różną od 0*/ while (1) { /* ... */ } while (true) { /* ... */ } do { /* ... */ } while (1);
Zadanie 7
Napisz program w języku C++, który sprawdzi parzystość liczby wczytanej od użytkownika. Program powinien wyświetlić Parzysta
, jeśli liczba jest parzysta w innym przypadku program nie powinien wyświetlać nic.
Rozwiązanie:
#include <iostream> using namespace std; int main() { int n; cin >> n; if(!(n % 2)) { cout << "Parzysta"; } return 0; }
Zadanie 8
Rok przestępny jest podzielny przez 4
. Wyjątkiem od tej zasady są lata kończące się na 00
, które nie są przestępne. Z kolei wyjątkiem od tego wyjątku są lata podzielne przez 400
, które są przestępne. Napisz program, który przyjmie numer roku i wyświetli leap year
, jeżeli to rok przestępny, a common year
w przeciwnym wypadku.
Rozwiązanie:
#include <iostream> using namespace std; int main() { int year; cin >> year; if(!(year % 400) || (!(year % 4) && year % 100)) cout << "leap year"; else cout << "common year"; return 0; }
Zadanie 9
Przyjmij cztery wartości zmiennoprzecinkowe oznaczające początek i koniec dwóch domkniętych przedziałów. Wyświetl intersection
, jeżeli te przedziały mają część wspólną lub no intersection
w przeciwnym wypadku.
Rozwiązanie:
#include <iostream> using namespace std; int main() { float a, b, c, d; cin >> a >> b >> c >> d; if((a <= c && c <= b) || (c <= a && a <= d)) cout << "intersection"; else cout << "no intersection"; return 0; }
Zadanie 10
Napisz program w języku C++, który policzy z ilu cyfr składa się podana liczba całkowita (w zapisie dziesiętnym).
Rozwiązanie:
#include <iostream> using namespace std; int main() { int value; int c = 0; cin >> value; do ++c; while(value /= 10); cout << c; return 0; }
Zadanie 11
Napisz program w języku C++ wyświetlający ponownie liczbę dowolnej długości.
Rozwiązanie:
#include <cstdio> int main() { int n; for(;;) { if(scanf("%1d", &n) != 1) break; printf("%d", n); } return 0; }
Przygotuj się na kolejne laboratorium!
W celu przygotowania się na kolejne zajęcia, spróbuj wykonać poniższe zadania samodzielnie.
Zadanie 1
Napisz program w języku C++, który utworzy 5-
elementową tablicę liczb całkowitych i zapisze w jej komórkach 5
liczb podanych ze standardowego wejścia. Na koniec program powinien wyświetlić elementy tablicy.
Zadanie 2
Napisz program w języku C++, który utworzy dwie tablice liczb całkowitych n-
i m-
elementową. Rozmiary n
i m
zdefiniuj w kodzie z użyciem stałych. Zapełnij te tablice danymi (w dowolny sposób, np. wprowadzonymi ze standardowege wejścia, kolejnymi lub losowymi liczbami). Następnie utwórz tablicę o rozmiarze n + m
i zapisz w jej n
początkowych komórkach zawartość tablicy n-
elementowej, a w pozostałych zawartość tablicy m-
elementowej.
Zadanie 3
Napisz program w języku C++, który utworzy n-
elementową tablicę liczb całkowitych i zapełni ją danymi. Program powinien wyświetlić indeks komórki tablicy, w której została znaleziona liczba o największej wartości. Jeżeli ta sama liczba pojawia się w większej liczbie komórek, należy wyświetlić indeks dowolnej z nich.
Zadanie 4
Zmodyfikuj program z poprzedniego zadania tak, aby w przypadku, gdy liczba o największej wartości pojawia się w tablicy wielokrotnie, program wyświetlił indeksy wszystkich komórek, w których znajduje się ta liczba.
Zadanie 5
Napisz program w języku C++, który utworzy n-
elementową tablicę liczb całkowitych i zapełni ją danymi. Program powinien zmodyfikować zawartość tablicy tak, aby liczby parzyste znalazły się w początkowej, a liczby nieparzyste w końcowej części tablicy. Kolejność liczb w ramach grupy parzystych i nieparzystych jest dowolna.