Zadanie 1
Napisz program w języku C++, który wczyta ze standardowego wejścia liczbę całkowitą, a następnie obliczy sumę cyfr tej liczby.
Rozwiązanie:
#include <iostream> int main() { int value, sum = 0; std::cin >> value; do sum += value % 10; while (value /= 10); std::cout << sum << std::endl; return 0; }
Zadanie 2
Napisz program w języku C++, który pobierze od użytkownika 6
liczb zmiennoprzecinkowych będących współrzędnymi (x, y)
trzech punktów na płaszczyźnie. Jeżeli leżą one na jednej prostej, program powinien wyświetlić współczynniki a
, b
równania tej prostej w postaci y = ax + b
. W przeciwnym razie program powinien wyświetlić komunikat "niewspółliniowe"
.
Rozwiązanie:
#include <iostream> int main() { double x1, y1, x2, y2, x3, y3; std::cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3; double d = (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1); if (d == 0) { double a = (y2 - y1) / (x2 - x1); double b = y1 - a * x1; std::cout << "y = " << a << " x + " << b << "\n"; } else std::cout << "niewspółliniowe\n"; return 0; }
Zadanie 3
Napisz program w języku C++, który wczytuje ze standardowego wejścia współczynniki układu dwóch równań liniowych z dwoma niewiadomymi i wypisuje na standardowym wyjściu rozwiązanie układu równań. W przypadku nieskończonej liczby lub braku rozwiązań program powinien wypisać na standardowym wyjściu odpowiednią informację.
Podpowiedź: zaimplementuj algorytm rozwiązywania układów równań metodą wyznaczników (inaczej nazywaną wzorami Cramera).
Rozwiązanie:
#include <iostream> int main() { double a1, b1, c1, a2, b2, c2; std::cin >> a1 >> b1 >> c1 >> a2 >> b2 >> c2; double r = a1 * b2 - a2 * b1; double r_x = c1 * b2 - c2 * b1; double r_y = a1 * c2 - a2 * c1; if (r != 0) { double x = r_x / r; double y = r_y / r; std::cout << "x = " << x << ", y = " << y << std::endl; } else { if (r_x == 0 && r_y == 0) std::cout << "Nieskończona liczba rozwiązań.\n"; else std::cout << "Brak rozwiązań.\n"; } return 0; }
Zadanie 4
Napisz program w języku C++, który dla tablicy liczb całkowitych wypisze z niej wartość najbliższą średniej arytmetycznej wszystkich wartości z tej tablicy.
Rozwiązanie:
#include <iostream> #include <cmath> int main() { const int n = 5; int arr[n] = {1, 2, 4, 5, 6}; float avg, sum = 0; for (int i = 0; i < n; ++i) sum += arr[i]; avg = sum / n; int min = arr[0]; for (int i = 1; i < n; ++i) if (std::abs(arr[i] - avg) < std::abs(min - avg)) min = arr[i]; std::cout << min << std::endl; return 0; }
Zadanie 5
Napisz program w języku C++, który utworzy dwuwymiarową tablicę liczb całkowitych o liczbie wierszy i kolumn równej 16
. W tablicy zapisz wyniki tabliczki mnożenia i wyświetl w systemie szesnastkowym tak, aby indeksy komórek były jednocześnie czynnikami mnożenia.
Rozwiązanie:
#include <iostream> #include <iomanip> int main() { const int n = 16; int arr[n][n]; for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) arr[i][j] = (i + 1) * (j + 1); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) std::cout << std::hex << std::setw(4) << arr[i][j]; std::cout << std::endl; } return 0; }
Zadanie 6
Zmodyfikuj poprzednie zadanie tak, żeby zamiast tablicy dwuwymiarowej użyć do reprezentacji macierzy tablicy jednowymiarowej.
Rozwiązanie:
#include <iostream> #include <iomanip> int main() { const int n = 16; int arr[n * n]; for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) arr[i * n + j] = (i + 1) * (j + 1); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) std::cout << std::hex << std::setw(4) << arr[i * n + j]; std::cout << std::endl; } return 0; }
Zadanie 7
Napisz program w języku C++, w których utworzona i zapełniona danymi zostanie dwuwymiarowa tablica znaków o wymiarach n
wierszy i m
kolumn zawierająca wyłącznie małe litery. Napisz program, który wyświetli najwcześniejszą i najpóźniejszą alfabetycznie literę znajdującą się osobno w każdym z wierszy tablicy. Następnie zmodyfikuj program tak, aby po zakończeniu działania dla wierszy wykonać analogiczne działanie dla kolumn.
Rozwiązanie:
#include <iostream> #include <cstdlib> #include <ctime> const int N = 5, M = 10; char min(char str[], int n) { char min = str[0]; for(int i = 1; i < n; ++i) if(min > str[i]) min = str[i]; return min; } char max(char str[], int n) { char max = str[0]; for(int i = 1; i < n; ++i) if(max < str[i]) max = str[i]; return max; } char rand_char() { int v = rand() % 52; if (v < 26) return 'A' + v; else return 'a' + (v - 26); } void fill_arr(char arr[][M], int n, int m) { for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) arr[i][j] = rand_char(); } int main() { srand(time(0)); char arr[N][M] = {}, min_value = 0, max_value = 0; fill_arr(arr, N, M); for (int i = 0; i < N; ++i) { min_value = min(arr[i], M), max_value = max(arr[i], M); std::cout << "Row " << i + 1 << ": " << min_value << " " << max_value << std::endl; } for (int j = 0; j < M; ++j) { min_value = max_value = arr[0][j]; for (int i = 1; i < N; ++i) { if (arr[i][j] < min_value) min_value = arr[i][j]; if (arr[i][j] > max_value) max_value = arr[i][j]; } std::cout << "Column " << j + 1 << ": " << min_value << " " << max_value << std::endl; } return 0; }
Zadanie 8
Napisz program w języku C++, który wypełni trójwymiarową tablicę NxMxO
wartościami pseudolosowymi, a następnie wypisze wszystkie elementy tej tablicy.
Rozwiązanie:
#include <iostream> #include <cstdlib> #include <ctime> const int N = 2, M = 3, O = 4; void fill_arr(int arr[][M][O]) { for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) for (int k = 0; k < O; k++) arr[i][j][k] = rand() % 100; } void print_arr(int arr[][M][O]) { for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { for (int k = 0; k < O; k++) std::cout << arr[i][j][k] << ","; std::cout << " "; } std::cout << std::endl; } } int main() { srand(time(0)); int arr[N][M][O] = {}; fill_arr(arr); print_arr(arr); return 0; }
Zadanie 9
Napisz program w języku C++, który wykona dla dwóch dwuwymiarowych tablic liczb zmiennoprzecinkowych operację mnożenia macierzowego, wynik zapisz w trzeciej tablicy.
Rozwiązanie:
// Version 1.0 #include <iostream> const int n = 2, m = 3, p = 4; int main() { float matrix_0[n][m] = {}, matrix_1[m][p] = {}, result[n][p] = {}; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) std::cin >> matrix_0[i][j]; for (int i = 0; i < m; ++i) for (int j = 0; j < p; ++j) std::cin >> matrix_1[i][j]; for (int i = 0; i < n; ++i) for (int j = 0; j < p; ++j) for (int k = 0; k < m; ++k) result[i][j] += matrix_0[i][k] * matrix_1[k][j]; for (int i = 0; i < n; ++i) { for (int j = 0; j < p; ++j) std::cout << result[i][j] << " "; std::cout << std::endl; } return 0; }
// Version 2.0 #include <iostream> #include <cstdlib> #include <ctime> #include <iomanip> typedef unsigned int uint; const uint N = 2, M = 3, P = 4; const float MIN = 0.f, MAX = 5.f; float rand_value(float min, float max) { return ((float)rand() / RAND_MAX) * (max - min) + min; } void fill_matrix(float mat[], uint n, uint m) { for (uint i = 0; i < n; ++i) for (uint j = 0; j < m; ++j) mat[i * m + j] = rand_value(MIN, MAX); } void print_matrix(float mat[], uint n, uint m) { for (uint i = 0; i < n; ++i) { for (uint j = 0; j < m; ++j) std::cout << std::fixed << std::setprecision(2) << mat[i * m + j] << " "; std::cout << std::endl; } } void matrix_mul(float a[], float b[], float result[], int n, int m, int p) { for(int i = 0; i < n * p; ++i) result[i] = 0; for (int i = 0; i < n; ++i) for (int j = 0; j < p; ++j) for (int k = 0; k < m; ++k) result[i * p + j] += a[i * m + k] * b[k * p + j]; } int main() { srand(time(0)); float matrix_0[N * M] = {}, matrix_1[M * P] = {}, result[N * P] = {}; fill_matrix(matrix_0, N, M), fill_matrix(matrix_1, M, P); matrix_mul(matrix_0, matrix_1, result, N, M, P); print_matrix(result, N, P); return 0; }
Zadanie 10
Napisz program w języku C++, który dla dwuwymiarowej tablicy o elementach typu całkowitego wyświetli indeks wiersza o największej średniej wartości elementów.
Rozwiązanie:
#include <iostream> #include <cstdlib> #include <ctime> const int N = 4, M = 5, MIN = 0, MAX = 100; int rand_value() { return rand() % (MAX - MIN + 1) + MIN; } void fill_arr(int arr[][M]) { for(int i = 0; i < N; ++i) for(int j = 0; j < M; ++j) arr[i][j] = rand_value(); } void print_arr(int arr[][M]) { for(int i = 0; i < N; ++i) { for(int j = 0; j < M; ++j) std::cout << arr[i][j] << " "; std::cout << "\n"; } } void find_max_row(int arr[][M], int &result) { int sum; float max_avg = -1, avg = 0; for (int i = 0; i < N; ++i) { sum = 0; for (int j = 0; j < M; ++j) sum += arr[i][j]; avg = (float)sum / M; if (avg > max_avg) { max_avg = avg; result = i; } } } int main() { srand(time(0)); int arr[N][M] = {}, max_row; fill_arr(arr); print_arr(arr); find_max_row(arr, max_row); std::cout << "Row with the highest average: " << max_row << std::endl; return 0; }
Zadanie 11
Napisz funkcję w języku C++, która przyjmie w argumencie liczbę zmiennoprzecinkową i zwróci jej wartość całkowitą i ułamkową.
Podpowiedź: Możesz do tego użyć referencji.
Rozwiązanie:
// Version 1.0 #include <iostream> #include <cmath> void splitDouble(double value, double& intPart, double& fracPart) { fracPart = std::modf(value, &intPart); } int main() { double value, intPart, fracPart; std::cin >> value; splitDouble(value, intPart, fracPart); std::cout << "Integer part: " << intPart << std::endl; std::cout << "Fractional part: " << fracPart << std::endl; return 0; }
// Version 2.0 #include <iostream> #include <cmath> void splitDouble(double value, int& intPart, double& fracPart) { intPart = std::floor(value); fracPart = value - intPart; } int main() { int intPart; double value, fracPart; std::cin >> value; splitDouble(value, intPart, fracPart); std::cout << "Integer part: " << intPart << std::endl; std::cout << "Fractional part: " << fracPart << std::endl; return 0; }
Zadanie 12
Napisz funkcję w języku C++, która zwróci indeks i wartość najmniejszej wartości z przekazanej w argumencie tablicy liczb zmiennoprzecinkowych.
Rozwiązanie:
#include <iostream> void findMinValueAndIndex(double arr[], int size, int& minIndex, double& minValue) { minIndex = 0; minValue = arr[0]; for (int i = 1; i < size; ++i) if (arr[i] < minValue) { minValue = arr[i]; minIndex = i; } } int main() { const int size = 5; double numbers[size] = {3.5, 1.2, 4.8, 0.9, 2.3}; int minIndex; double minValue; findMinValueAndIndex(numbers, size, minIndex, minValue); std::cout << "Min value: " << minValue << " at index: " << minIndex << std::endl; return 0; }
Zadanie 13
Napisz funkcję w języku C++, która przyjmuje w argumencie napis będący liczbą binarną i wyświetla jej wartość dziesiętną.
Rozwiązanie:
#include <iostream> int myStrlen(const char *str) { int len = 0; for(;str[len];++len); return len; } int convertBinaryToDecimal(const char *binaryString) { int decimalValue = 0; for (int i = 0; i < myStrlen(binaryString); ++i) decimalValue = decimalValue * 2 + (binaryString[i] - '0'); return decimalValue; } int main() { const char* binaryString = "1101"; std::cout << "Decimal value: " << convertBinaryToDecimal(binaryString) << "\n"; return 0; }
Zadanie 14
Napisz program w języku C++, który pobierze od użytkownika i wyświetli tablicę liczb całkowitych (o konkretnym, ustalonym rozmiarze) na 4 sposoby:
1) klasycznie, za pomocą operacji wejścia (oba scanf()
i std::cin
) po uruchomieniu programu,
2) za pomocą parametrów wywołania programu (wykorzystaj argumenty funkcji main(int argc, char* argv[])
)
#./a.out 1 2 3 4 5
3) wczytania z linii poleceń tablicy podanej w string-u za pomocą operatora here-string '<<<'
powłoki bash linuxa,
#./a.out <<< "1 2 3 4 5"
4) wczytania z pliku tekstowego za pomocą programu 'cat'
i operatora pipeline '|'
powłoki bash linuxa.
#cat plik_z_liczbami.txt | ./a.out
Rozwiązanie:
// Version 1.0 #include <iostream> #include <cstdio> void inputArrayWithScanf(int array[], int size) { for (int i = 0; i < size; ++i) scanf("%d", &array[i]); } void inputArrayWithCin(int array[], int size) { for (int i = 0; i < size; ++i) std::cin >> array[i]; } void printArray(const int array[], int size) { for (int i = 0; i < size; ++i) std::cout << array[i] << " "; std::cout << std::endl; } int main() { const int size = 5; int numbers[size]; inputArrayWithScanf(numbers, size); printArray(numbers, size); inputArrayWithCin(numbers, size); printArray(numbers, size); return 0; }
// Version 2.0 #include <iostream> #include <cstdlib> void inputArrayFromArgs(int array[], int size, char* argv[]) { for (int i = 0; i < size; ++i) array[i] = std::atoi(argv[i + 1]); } int main(int argc, char* argv[]) { const int size = 5; int numbers[size]; if (argc != size + 1) { std::cerr << "Usage: ./a.out 1 2 3 4 5" << std::endl; return 1; } inputArrayFromArgs(numbers, size, argv); for (int i = 0; i < size; ++i) std::cout << numbers[i] << " "; std::cout << std::endl; return 0; }
// Version 3.0 #include <iostream> #include <cstring> #include <cstdlib> void inputArrayFromHereString(int array[], int size, char* inputString) { char* token = std::strtok(inputString, " "); for (int i = 0; i < size && token != nullptr; ++i) { array[i] = std::atoi(token); token = std::strtok(nullptr, " "); } } int main() { const int size = 5; int numbers[size]; char inputString[100]; std::cin.getline(inputString, 100); inputArrayFromHereString(numbers, size, inputString); for (int i = 0; i < size; ++i) std::cout << numbers[i] << " "; std::cout << std::endl; return 0; }
// Version 4.0 #include <iostream> void inputArrayFromPipeline(int array[], int size) { for (int i = 0; i < size; ++i) std::cin >> array[i]; } int main() { const int size = 5; int numbers[size]; inputArrayFromPipeline(numbers, size); for (int i = 0; i < size; ++i) std::cout << numbers[i] << " "; std::cout << std::endl; return 0; }
Przygotuj się do kolokwium i zrób poniższe zadania samodzielnie!
W celu przygotowania się na kolokwium, spróbuj wykonać poniższe zadania samodzielnie.
Zadanie 1
Napisz program, który wczytuje od użytkownika 2
liczby całkowite r
oraz h
, które są odpowiednio promieniem koła oraz wysokością stożka zbudowanego na tym kole. Program ma wypisać na standardowym wyjściu objętość bryły. Jeżeli r
lub h
są mniejsze lub równe 0
wyświetl na standardowym wyjściu komunikat "Błędne dane"
. (Objętość stożka V=PI r^2 h / 3
)
Zadanie 2
Napisz funkcję, która przyjmuje w argumentach:
(1) tablicę liczb zmiennoprzecinkowych arr1
,
(2) liczbę całkowitą n
- rozmiar tablicy arr1
,
(3) tablicę liczb całkowitych arr2
,
(4) liczbę całkowitą m
- rozmiar tablicy arr2
.
Wartości elementów w tablicy arr2
to indeksy dla tablicy arr1
. Niech funkcja wyświetli wszystkie elementy tablicy arr1
o indeksach, których wartości znajdują się w tablicy arr2
. Jeżeli w arr1
nie ma odpowiedniego indeksu to wyświetla dla niego wartość NAN
. Zademonstruj użycie tej funkcji w funkcji głównej.
PRZYKŁAD:
IN arr1: 2.3, 3.1, 0.5, 3.4, 5.2
IN arr2: 4, 1, 3, 9, 1
OUT: [4]=5.2, [1]=3.1, [3]=3.4, [9]=NAN, [1]=3.1
Zadanie 3
Napisz funkcję, która przyjmuje w argumencie liczbę całkowitą (bez znaku, mniejszą niż 65536
) w postaci napisu. Funkcja ma dokonać konwersji tego napisu do liczby całkowitej i zwrócić jej wartość. Zademonstruj użycie tej funkcji w funkcji głównej.
PRZYKŁAD:
IN: "1234"
OUT: 1234
Zadanie 4
Napisz funkcję rekurencyjną, która zamienia liczbę binarną, reprezentowaną za pomocą napisu, na liczbę całkowitą. Zademonstruj jej użycie.
PRZYKŁAD:
IN: "10010011"
OUT: 147
Zadanie 5
Napisz program, który wczytuje od użytkownika liczbę całkowitą n
(zakładamy, że n < 20
). Utwórz tablicę liczb zmiennoprzecinkowych arr
, która będzie w stanie pomieścić n
liczb, a następnie wczytaj do niej n
wartości ze standardowego wejścia. Napisz funkcję, która przyjmuje taką tablicę w argumencie. Funkcja ma wyświetlić na standardowym wyjściu kolejne wyrazy ciągu od 1
do n
zdefiniowanego wzorem:
F(0) = 0
F(n) = (-1)^n * arr_{n-1} + F_{n-1}
gdzie: ^
- operacja potęgowania
PRZYKŁAD:
IN n: 3
IN a: 0.4, 0.2, 1.4
OUT: -0.4, -0.2, -1.6
Zadanie 6
Zaprojektuj i zdefiniuj funkcję dyadic()
, która oblicza i zwraca iloczyn diadyczny dwóch wektorów 3
-elementowych przekazanych w argumentach. Do reprezentacji wektorów i macierzy użyj tablic automatycznych. W funkcji głównej pokaż użycie tej funkcji. Iloczyn diadyczny dwóch wektorów n
-wymiarowych daje w wyniku macierz nxn
-wymiarową (zob. Iloczyn diadyczny).
Zadanie 7
Zdefiniuj funkcję seq()
, która w argumencie otrzymuje nieujemną liczbę całkowitą n
. Funkcja powinna zwracać, jako liczbę rzeczywistą, wartość elementu o indeksie n
ciągu zdefiniowanego w następujący sposób:
a_{0}=0, a_{1}=1
a_{n} = a_{n-1} * pierwiastek(a_{n-2})
Napisz program, który sprawdzi działanie tej funkcji. Program powinien wylosować liczbę n
z przedziału obustronnie domkniętego <0;100>
, a następnie wyświetlić wynik funkcji seq()
dla wylosowanej liczby.
Zadanie 8
Napisz program, który pobiera od użytkownika dwie liczby jednobajtowe bez znaku t
, s
. Wylicz i wyświetl nową wartość w następujący sposób:
1) zamień 4
najmłodsze bity liczby s
miejscami z 4
najstarszymi bitami liczby s
,
2) w powstałej liczbie zaneguj bit znajdujący się na pozycji będącej wynikiem reszty z dzielenia t
przez 8
.
PRZYKŁAD:
t = 214; reszta z (t/8) = 6
s = 93 = 0101 1101b
1) 1101 0101b
2) 1001 0101b = 149
Zadanie 9
Napisz funkcję matRows()
, która przyjmuje jako argumenty: jednowymiarową tablicę automatyczną liczb całkowitych mat
, liczby całkowite n
, m
. Tablicę mat
należy zinterpretować jako tablicę dwuwymiarową o n
wierszach i m
kolumnach, w której kolejne komórki ustawione są wierszami. Funkcja powinna zwrócić liczbę wierszy, w których liczby posortowane są rosnąco.
PRZYKŁAD:
IN n = 2, m = 3
IN mat = [1, 6, 3, 5, 6, 7]
OUT: 1
bo: mat = | 1 6 3 | (nieposortowane)
| 5 6 7 | (posortowane)
Zadanie 10
Zdefiniuj funkcję, która przyjmuje jako argumenty: napis str
oraz automatyczną tablicę liczb całkowitych bez znaku occ
o długości równej ilości znaków w napisie str
. Funkcja powinna w i
-ty element tablicy occ
wpisać liczbę wystąpień (w całym napisie str
) i
-tego znaku z tego napisu. Napis str
może zawierać jedynie małe i wielkie litery oraz spacje. Małe i wielkie litery zliczamy łącznie, jako ten sam znak.
PRZYKŁAD:
IN str = "Ala ma kota"
OUT occ = [4, 1, 4, 2, 1, 4, 2, 1, 1, 1, 4]
Zadanie 11
Napisz program, który pobiera od użytkownika dwie liczby całkowite dodatnie n
i m
. Następnie program ma generować i wyświetlać na ekranie pseudolosowe zdanie, które ma być zbudowane z n
słów a każde słowo ma być zbudowane z co najwyżej m
znaków. W słowach mają się pojawiać, z równym prawdopodobieństwem, małe i duże litery.
PRZYKŁAD:
IN: 8 5
OUT: jtETN jxpd G DDYmP NYtT HubNe IAByV jmN
Zadanie 12
Napisz program, który wczyta od użytkownika dodatnią liczbę całkowitą r
i wyświetli na ekranie terminala koło zbudowane ze znaków '#'
o promieniu równym r
(zgodnie z przykładem poniżej). Równanie koła ma postać: x^2+y^2 <= r^2
. Do obliczenia pierwiastka kwadratowego użyj funkcji std::sqrt()
z biblioteki <cmath>
.
PRZYKŁAD:
IN: 3
OUT:
#
#####
#####
#######
#####
#####
#
Zadanie 13
Napisz funkcję, która w parametrze przyjmuje tablicę liczb całkowitych. Funkcja powinna zwrócić element o największej liczbie bitów o wartości 1
, jeśli w tablicy jest więcej liczb o takiej samej ilości bitów, funkcja powinna zwrócić tę, która wystąpiła w tablicy, jako ostatnia. Zilustruj działanie tej funkcji i wyświetli wynik zwrócony przez funkcję.
PRZYKŁAD:
IN: {1, 2, 3, 4, 5, 64}
OUT: 5
Zadanie 14
Napisz funkcję, która przyjmuje jednobajtową liczbę całkowitą bez znaku v
, liczbę całkowitą b
i zmienną logiczną f
. Funkcja powinna pozostawić jedynie wartość 4
najmłodszych bitów liczby v
, a następnie zanegować wartość tych 4
-ech bitów, jeżeli f
jest równe true
, w przeciwnej sytuacji ten krok powinien być pominięty. Na koniec funkcja powinna zanegować bit na pozycji b
i zwrócić nową wartość. W programie głównym wyświetli wartość zwróconą przez funkcję z zadanymi argumentami.
PRZYKŁAD:
IN: v = 13, b = 6, f = true
OUT: 66
Zadanie 15
Napisz rekurencyjną funkcję, która otrzymuje jako argument całkowitą liczbę nieujemną n
i zwraca jako wartość n
-ty wyraz ciągu zdefiniowanego w następujący sposób:
F_{n} = 1, gdy m <2
F_{n-1}, gdy n>=2 i n<10
F_{n-1} - F_{n-3}, gdy n >=10
W funkcji głównej wczytaj od użytkownika całkowitą liczbę nieujemną i wyświetl wynik działania funkcji.
PRZYKŁADY:
IN: 1 IN: 4 WE: 10
OUT: 1 OUT: 2 OUT: 704
Zadanie 16
Napisz funkcję, która w argumencie przyjmuje napis (c-string) a następnie sprawdza, czy dany napis złożony jest z samych cyfr. W przypadku, gdy napis składa się z samych cyfr, funkcja powinna zwrócić liczbę całkowitą, którą reprezentuje napis lub wartość -1
w przeciwnym wypadku. W funkcji głównej wczytaj od użytkownika napis i wyświetl wynik działania funkcji.
PRZYKŁADY:
IN: "123ak"
OUT: -1
IN: "1001"
OUT: 1001
Zadanie 17
Pewną powierzchnię pokrywają nadajniki radiowe. Każdy nadajnik znajduje się w pozycji oznaczonej za pomocą współrzędnych x
, y
na słupie o wysokości z
. Każdy nadajnik zapewnia łączność w obszarze kuli o promieniu r
, w której środku znajduje się nadajnik. Osoba z odbiornikiem znajduje się w pozycji x
, y
na wysokości gruntu (z=0)
. Odbiornik połączy się z najbliższym nadajnikiem, w którego zasięgu będzie. Napisz funkcję, która przyjmie parametry:
(1) liczbę n
nadajników,
(2/3/4) trzy tablice, po jednej dla współrzędnych (x, y, z)
kolejnych nadajników,
(5) promień r
nadajników,
(6, 7) współrzędne x
, y
osoby z odbiornikiem.
Wszystkie współrzędne są liczbami zmiennoprzecinkowymi. Funkcja powinna zwrócić indeks odbiornika, z którym połączy się odbiornik, lub -1
, jeżeli nie połączy się z żadnym. Zilustruj użycie tej funkcji w programie i wyświetl na ekranie wynik.
PRZYKŁAD:
IN: n=6, x[]={2,2,3,5,6,8}, y[]={2,6,3,7,1,6}, z[]={2,1,1.5,2,2,2}, r=2.5, x=7, y=2.
OUT: 4
Zadanie 18
Pewien inżynier, pracujący dla koncernu samochodowego, projektuje akumulator dla nowego modelu samochodu elektrycznego. Potrzebuje on jednak programu, który obliczy mu czas potrzebny do naładowania tego akumulatora, w zależności od maksymalnej pojemności max_capacity
i jego aktualnego stanu naładowania capacity
.
Pusty akumulator (czyli w pełni rozładowany), ładuje się z maksymalną wydajnością, wynoszącą max_charge_efficiency
jednostek pojemności w ciągu jednostki czasu. Jednakże, wraz z coraz większym naładowaniem akumulatora, maleje liniowo wydajność ładowania, tak, że przy 100%
naładowania akumulatora, wydajność ładowania wynosi tylko 50%
pierwotnej wydajności. Oczywiście, stopień naładowania nie może przekroczyć 100%
. Jednostkę czasu traktujemy jako niepodzielną i całkowitą.
Pomóż inżynierowi i zaprojektuj i zdefiniuj odpowiednią funkcję charging_time()
, która zwróci ilość jednostek czasu potrzebnych do pełnego naładowania akumulatora, do poziomu max_capacity
, zakładając, że akumulator jest już wstępnie naładowany do pewnej pojemności capacity
a maksymalna wydajność ładowania wynosi max_charge_efficiency
. Funkcja ma również, dla celów testowych, wypisywać na ekranie, dla każdej jednostki czasu, numer tej jednostki czasu i aktualny stan naładowania akumulatora z dokładnością do dwóch miejsc po przecinku.
Napisz program, który pobierze od użytkownika maksymalną pojemność akumulatora, jej początkową wartość naładowania i maksymalną wydajność ładowania. Za pomocą funkcji charging_time()
i pobranych od użytkownika wartości wypisz na ekranie, dla każdej jednostki czasu numer tej jednostki czasu i aktualny stan naładowania akumulatora z dokładnością do dwóch miejsc po przecinku.
Zadanie 19
W pewnym parabanku klient wziął lichwiarską pożyczkę na X
euro, którą ma spłacić w M
miesięcy. Warunki umowy mówią, że klient ma spłacać co miesiąc ratę równą co do wartości X/M
plus 20%
odsetek z pozostałego jeszcze do spłaty kapitału.
Zadanie 20
Napisz program, który pobierze z konsoli wartość X
oraz M
a następnie wypisze na ekranie wartość raty w każdym miesiącu oraz na końcu wartość całkowitą oddanej pożyczki razem z odsetkami. Wartości kwot powinny być drukowane z dokładnością do dwóch miejsc po przecinku.