Kurs podstawy programowania UMCS, zdjęcie laptopa.

Podstawy programowania – Laboratorium 7

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.

Dodaj komentarz

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