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.
