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.
W niektórych przypadkach użycie switch
zamiast wielokrotnych instrukcji if-else
jest korzystniejsze, ponieważ switch
może być szybsze (zwłaszcza przy wielu przypadkach) i bardziej czytelne. Z drugiej strony if-else
oferuje większą elastyczność, ponieważ pozwala porównywać bardziej złożone wyrażenia.
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 jest jedną z najprostszych w C++. Pętla while
powtarza blok kodu tak długo, jak warunek logiczny pozostaje prawdziwy. Warunek jest sprawdzany przed każdym obrotem pętli, co oznacza, że jeśli warunek na początku jest fałszywy, pętla może w ogóle się nie wykonać. Dodatkowo należy zwrócić uwagę na przypadki, w których warunek pętli nigdy nie staję się fałszem. Może to prowadzić do nieskończonej pętli, co jest często błędem w programach.
/* 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. Pętla for
jest szczególnie przydatna, gdy wiemy dokładnie, ile razy chcemy wykonać pewien blok 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 int i; for(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. Jest ona szczególnie przydatna, gdy chcemy zakończyć pętlę przed jej naturalnym zakończeniem.
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, pomijając pozostałe instrukcje w bieżącej iteracji.
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)) //if(a <= d && c <= b) cout << "intersection"; else cout << "no intersection"; return 0; }
Zadanie 10
Zmodyfikuj poprzednie zadanie tak, aby wyświetlało dolną i górną granicę części wspólnej przedziału, jeżeli taka istnieje.
Rozwiązanie:
//Version 1.0 #include <iostream> int main() { double a, b, c, d, start, end; std::cin >> a >> b >> c >> d; if (a <= d && c <= b) { start = a > c ? a : c; end = b < d ? b : d; std::cout << "Przedziały mają część wspólną: [" << start << ", " << end << "]\n"; } else { std::cout << "Przedziały nie mają części wspólnej." << std::endl; } return 0; }
//Version 2.0 #include <iostream> int main() { double a, b, c, d; std::cin >> a >> b >> c >> d; if (a <= d && c <= b) std::cout << "Przedziały mają część wspólną: [" << std::max(a, c) << ", " << std::min(b, d) << "]\n"; else std::cout << "Przedziały nie mają części wspólnej." << std::endl; return 0; }
Zadanie 11
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 12
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; }
Zadanie 13
Napisz program w języku C++, który będzie pobierał ze standardowego wejścia liczby zmiennoprzecinkowe i sumował je, aż do momentu przekroczenia przez sumę liczby 100
lub podania liczby 0
. Program powinien wówczas wyświetlić o ile suma przekroczyła liczbę 100
i zakończyć działanie.
Rozwiązanie:
//Version 1.0 #include <iostream> int main() { double value, sum = 0; while (sum <= 100) { std::cin >> value; if (!value) // if (value == 0) break; sum += value; } if (sum > 100) std::cout << "Suma przekroczyła 100 o " << sum - 100 << std::endl; else std::cout << "Suma nie przekroczyła 100." << std::endl; return 0; }
//Version 2.0 #include <iostream> int main() { double value, sum = 0; do { std::cin >> value; sum += value; } while (sum <= 100 and value); if (sum > 100) std::cout << "Suma przekroczyła 100 o " << sum - 100 << std::endl; else std::cout << "Suma nie przekroczyła 100." << std::endl; return 0; }
Zadanie 14
Napisz program w języku C++, który wyświetli tabliczkę mnożenia od 0x0
do 10x10
zachowując poprawne odstępy.
Rozwiązanie:
#include <iostream> #include <iomanip> //setw() int main() { const int size = 11; const int value_width = 4; for (int i = 0; i < size; ++i) { for (int j = 0; j < size; ++j) std::cout << std::setw(value_width) << i * j; std::cout << std::endl; } return 0; }
Zadanie 15
Zmodyfikuj poprzedni program tak, aby pokazywał fragment tej tabliczki – trójkąt składający się z wyników niepowtarzających się działań (górny lub dolny do wyboru).
Rozwiązanie:
#include <iostream> #include <iomanip> int main() { const int size = 10; const int value_width = 4; const bool triangle = false; if (triangle) for (int i = 0; i <= size; ++i) { for (int j = 0; j <= i; ++j) std::cout << std::setw(value_width) << i * j; std::cout << std::endl; } else for (int i = 0; i <= size; ++i) { for (int j = 0; j < i; ++j) std::cout << std::setw(value_width) << ' '; for (int j = i; j <= size; ++j) std::cout << std::setw(value_width) << i * j; std::cout << std::endl; } return 0; }
Zadanie 16
Napisz program w języku C++, który narysuje na ekranie choinkę zbudowaną z gwiazdek *
o zadanej wysokości.
Rozwiązanie:
#include <iostream> int main() { unsigned int height; std::cin >> height; for (unsigned int i = 0; i < height; ++i) { for (int j = 0; j < height - i - 1; ++j) std::cout << " "; for (unsigned int j = 0; j < 2 * i + 1; ++j) std::cout << "*"; std::cout << std::endl; } for (unsigned int i = 0; i < height - 1; ++i) std::cout << " "; std::cout << "*" << std::endl; return 0; }
Zadanie 17
Napisz program w języku C++, który wczyta ze standardowego wejścia dwie liczby naturalne n
i m
, a następnie wyświetli szachownicę o rozmiarze nxm
, w taki sposób, by występowały w niej na przemian znaki #
oraz o
.
Rozwiązanie:
#include <iostream> int main() { unsigned int n, m; std::cin >> n >> m; for (unsigned int i = 0; i < n; ++i) { for (unsigned int j = 0; j < m; ++j) std::cout << ((i + j) % 2 ? "o" : "#"); std::cout << std::endl; } return 0; }
Zadanie 18
Kalendarz gregoriański, znajdujący się obecnie w powszechnym użyciu, został wprowadzony w piątek, 15 października 1582 roku. Korzystając z tej wiedzy, napisz program, który dla tej i każdej kolejnej daty wyświetli odpowiadający jej dzień tygodnia. Data powinna być podana w formacie dd.MM.yyyy
. W zadaniu zdefiniuj i wykorzystaj typ wyliczeniowy Weekday {Monday, Tuesday, …, Sunday}
.
Rozwiązanie:
#include <cstdio> int main() { unsigned int dd, mm, yy, century, year_of_century, result; scanf("%2d.%2d.%4d", &dd, &mm, &yy); if (mm < 3) { mm += 12; --yy; } century = yy / 100; year_of_century = yy % 100; result = (dd + (13 * (mm + 1) / 5) + year_of_century + (year_of_century / 4) + (century / 4) - 2 * century) % 7; switch (result) { case 2: printf("Poniedziałek\n"); break; case 3: printf("Wtorek\n"); break; case 4: printf("Środa\n"); break; case 5: printf("Czwartek\n"); break; case 6: printf("Piątek\n"); break; case 0: printf("Sobota\n"); break; case 1: printf("Niedziela\n"); break; } return 0; }
Zadanie 19
Napisz program w języku C++, który wczyta ze standardowego wejścia liczbę całkowitą n
, następnie wypisze wszystkie dwuwyrazowe wariacje z powtórzeniami dla zbioru liczb [1;n]
.
Rozwiązanie:
#include <iostream> int main() { int n; std::cin >> n; for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) std::cout << i << " " << j << std::endl; return 0; }
Zadanie 20
Napisz program w języku C++, który wczytuje ze standardowego wejścia nieujemną liczbę n
i wypisuje na standardowym wyjściu wartość ⌊√n⌋
(wartość √n
zaokrągloną w dół do najbliższej wartości całkowitoliczbowej). Program napisz bez użycia funkcji z biblioteki matematycznej. Przybliżenie pierwiastka kwadratowego zrealizuj za pomocą metody Herona.
Rozwiązanie:
#include <iostream> int main() { unsigned int n; std::cin >> n; float square = float(n), tmp = 1.f; while(square > tmp) { square = (square + tmp) / 2.f; tmp = n / square; } std::cout << int(square) << std::endl; return 0; }
Zadanie 21
Napisz program w języku C++, który pobierze ze standardowego wejścia liczbę całkowitą dodatnią x i wyświetli wszystkie liczby całkowite z jednostronnie domkniętego zakresu [0, x)
.
Rozwiązanie:
#include <iostream> int main() { unsigned int x; std::cin >> x; for (unsigned int i = 0; i < x; ++i) std::cout << i << " "; std::cout << std::endl; return 0; }
Zadanie 22
Zmodyfikuj poprzedni program tak, aby pobierał liczbę całkowitą (także ujemną) i wyświetlał wszystkie liczby całkowite z zakresu domkniętego [x, 0]
lub [0, x]
.
Rozwiązanie:
#include <iostream> int main() { int x; std::cin >> x; if(x > 0) { for(int i = 0; i <= x; ++i) std::cout << i << " "; std::cout << std::endl; } else { for(int i = x; i <= 0; ++i) std::cout << i << " "; std::cout << std::endl; } return 0; }
Zadanie 23
Napisz program w języku C++, który pobierze liczbę całkowitą dodatnią n
oraz n
liczb całkowitych. Program powinien wyświetlić średnią arytmetyczną tych liczb.
Rozwiązanie:
#include <iostream> int main() { unsigned int n; std::cin >> n; int value, sum = 0; for (unsigned int i = 0; i < n; ++i) { std::cin >> value; sum += value; } double avg = static_cast<double>(sum) / n; std::cout << "Średnia arytmetyczna: " << avg << std::endl; return 0; }
Zadanie 24
Napisz program w języku C++, który pobierze liczbę całkowitą dodatnią n
oraz n
liczb całkowitych. Program powinien wyświetlić największą spośród tych liczb.
Rozwiązanie:
#include <iostream> #include <climits> int main() { unsigned int n; std::cin >> n; int value, max = INT_MIN; for (int i = 0; i < n; ++i) { std::cin >> value; if (value > max) max = value; } std::cout << "Największa liczba to: " << max << std::endl; return 0; }
Zadanie 25
Napisz program w języku C++, który będzie pobierał ze standardowego wejścia liczby zmiennoprzecinkowe i sumował je, aż do momentu podania liczby 0
. Wówczas program powinien wyświetlić sumę liczb.
Rozwiązanie:
#include <iostream> int main() { float value, sum = 0; do { std::cin >> value; sum += value; } while (value); std::cout << "Suma liczb to: " << sum << std::endl; 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.