PP – Laboratorium 3

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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *