Kurs podstawy programowania UMCS, zdjęcie laptopa.

Podstawy programowania – Laboratorium 12

Wejściówka

Napisz program w języku C++, który za pomocą wskaźnika do funkcji wywoła funkcję f. Funkcja f powinna przyjmować dwa argumenty typu całkowitego oraz zwracać wynik operacji sqrt(a * b / 3).

Rozwiązanie:
#include <cmath>

float f(int a, int b) {
	return sqrt(a * b / 3.f);
}

int main() {
    float (*fun)(int, int);
    fun = f;
	fun(10, 10);
    return 0;
}

Zadanie 1

Napisz program w języku C++, który zmienia kolejność elementów w posortowanej tablicy liczb całkowitych, w następujący sposób:
– pierwszym elementem powinna być maksymalna wartość,
– drugim elementem powinna być minimalna wartość,
– trzecim elementem powinna być druga maksymalna wartość,
– czwartym elementem powinna być druga minimalna wartość,
i tak dalej.

Rozwiązanie:
#include <iostream>

void print_arr(int arr[], int n) {
    for(int i = 0; i < n; ++i)
        std::cout << arr[i] << " ";
    std::cout << std::endl;
}

void rearrange_max_min(int arr[], int n) {
    int *temp = new int[n];
    int min_idx = 0, max_idx = n - 1;
    for(int i = 0; i < n; ++i) {
        if(!(i % 2)) temp[i] = arr[max_idx--];
        else temp[i] = arr[min_idx++];
    }
    for(int i = 0; i < n; ++i) arr[i] = temp[i];
    delete[] temp;
}

int main() {
    int nums[] = {0, 1, 3, 4, 5, 6, 7, 8, 10};
    int n = sizeof(nums) / sizeof(nums[0]);
    rearrange_max_min(nums, n);
    print_arr(nums, n);
    return 0;
}

Zadanie 2

Napisz funkcję w języku C++, która przyjmuje następujące argumenty: wskaźnik na tablicę liczb całkowitych – arr, liczbę całkowitą będącą rozmiarem tej tablicy – n, liczbę całkowitą – k oraz wskaźnik na tablicę liczb całkowitych – result. Funkcja powinna wprowadzić do tablicy result k największych elementów z nieposortowanej tablicy arr przekazanej w argumencie. Funkcja nie powinna modyfikować oryginalnej tablicy. Napisz program w języku C++, który przetestuje działanie tej funkcji.

Rozwiązanie:
#include <algorithm>
#include <iostream>
#include <cstring>

bool compare(const int &a, const int &b) {
    return a > b;
}

void top_k_elements(int *arr, int n, int k, int *result) {
    int *cpy = new int[n];

    memcpy(cpy, arr, n * sizeof(arr[0]));
    std::sort(cpy, cpy + n, compare);
    memcpy(result, cpy, k * sizeof(cpy[0]));

    delete[] cpy;
}

void print_arr(int *arr, int n) {
    for(int i = 0; i < n; ++i)
        std::cout << arr[i] << " ";
    std::cout << std::endl;
}

int main() {
    int nums[] = {4, 5, 9, 12, 9, 22, 45, 7};
    int n = sizeof(nums) / sizeof(nums[0]), k = 3;
    int *result = new int[k];

    top_k_elements(nums, n, k, result);
    print_arr(result, k);

    delete[] result;
    result = nullptr;
    return 0;
}

Zadanie 3

Napisz program w języku C++, który wczyta od użytkownika liczbę, jako napis. Liczba powinna mieć co najwyżej 10 znaków. Następnie program powinien zwiększyć tą liczbę o 0.123 i ją wyświetlić.

Rozwiązanie:
#include <iostream>
#include <cstdlib>

int main() {
    char dig[11] = {0};
    std::cin >> dig;
    char *p;
    float f = strtod(dig, &p);
    if(p > dig) 
        std::cout << f + 0.123f << "\n";
    else 
        std::cout << " Konwersja się nie udała.\n";
    return 0;
}

Zadanie 4

Napisz funkcję w języku C++, która znajduje element pojawiający się w tablicy tylko raz, gdy inne elementy pojawiają się dwukrotnie. Funkcja w argumencie powinna przyjąć wskaźnik na tablicę liczb całkowitych oraz rozmiar tej tablicy. Napisz program w języku C++, który przetestuje działanie tej funkcji.

Rozwiązanie:
#include <iostream>

int search_single_element(int *arr, int n) {
    int result = arr[0];
    for (int i = 1; i < n; ++i) 
        result ^= arr[i];
    return result;
}


int main() {
    int array[] = {3, 1, 5, 1, 5, 7, 9, 7, 9};
    int n = sizeof(array) / sizeof(array[0]);
    std::cout << search_single_element(array, n) << std::endl;
    return 0;
}

Zadanie 5

Wykorzystując wskaźniki na funkcje napisz program w języku C++, który w zależności od wywołania funkcji f wykona dodawanie lub odejmowanie dwóch macierzy kwadratowych. Spróbuj użyć wskaźników na funkcję tak, aby powtórzyć jak najmniej kodu w zaproponowanej implementacji (zasada DRY). Dodatkowo funkcja f powinna wyświetlić wynik wybranej operacji. Wynik operacji na macierzach powinien być zapisany do pierwszej tablicy. Operacje na tablicach powinny być przeprowadzone za pomocą arytmetyki wskaźników.

Rozwiązanie:
#include <iostream>

typedef int (*p_fun)(int, int);

int add(int a, int b) {
    return a + b;
}

int sub(int a, int b) {
    return a - b;
}

void print_matrix(int *matrix, int n, int m) {
    for(int i = 0; i < n; ++i) {
        for(int j = 0; j < m; ++j)
            std::cout << *(matrix + i * m + j) << " ";
        std::cout << "\n";
    }
}

void f(int *a, int *b, int n, p_fun fun) {
    for(int i = 0; i < n; ++i)
        for(int j = 0; j < n; ++j)
            *(a + i * n + j) = fun(*(a + i * n + j), *(b + i * n + j));
    print_matrix(a, n, n);
}

int main() {
    int arr1[]={1, 2, 3, 5, 15, 0, 12, 13, 5};
    int arr2[]={1, 2, 3, 5, 15, 0, 12, 13, 5};
    f(arr1, arr2, 3, add);
    f(arr1, arr2, 3, sub);
    f(arr1, arr2, 3, sub);
    return 0;
}

Zadanie 6

Zdefiniuj funkcję f w języku C++, która w argumencie przyjmuje nieujemną liczbę całkowitą n, tablicę liczb całkowitych arr oraz wskaźnik na liczbę zmiennoprzecinkową result. Funkcja powinna zwrócić, za pomocą argumentu result, wynik następującej sumy:
f(n) = Σ(0<=a<=n) (x*(x-a))
gdzie dla arr[a] podzielnego przez 5 x = a3 lub x = sqrt(a) w przeciwnym razie. Napisz program, który sprawdzi działanie tej funkcji. Program powinien wczytać ze standardowego wejścia nieujemną liczbę całkowitą n, zaalokować pamięć, wypełnić ją losowymi wartościami z przedziału <0;15> i wyświetlić na standardowym wyjściu wynik funkcji f.

Rozwiązanie:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>

const int MIN = 0;
const int MAX = 15;

void fill_arr(int *arr, unsigned int n) {
    for(unsigned int i = 0; i < n; ++i) 
        arr[i] = MIN + rand() / (RAND_MAX / (MAX - MIN + 1));
}

void f(unsigned int n, int *arr, float *result) {
    *result = 0.f;
    float x = 0.f;
    for(unsigned int a = 0; a <= n; ++a) {
        x = !(arr[a] % 5) ? pow(a, 3) : sqrt(a);
        *result += x * (x - a);
    }
}

int main() {
    srand(time(0));
    unsigned int n;
    std::cin >> n;
    float r = 0.f;
    int *arr = new int[n + 1];
    fill_arr(arr, n + 1);
    f(n, arr, &r);
    std::cout << r << std::endl;
    delete[] arr;
    return 0;
}

Zadanie 7

Zaprojektuj i zdefiniuj funkcję transpose w języku C++, która w parametrze przyjmie macierz liczb zmiennoprzecinkowych o wielkości n x n. Zadaniem tej funkcji będzie wykonanie transpozycji tej macierzy. Forma reprezentacji macierzy oraz sposób jej przekazania do funkcji i zwrócenia wartości do samodzielnego określenia. W funkcji głównej pokaż użycie tej funkcji. Macierz transponowana macierzy A to macierz AT, która powstaje poprzez zamianę jej wierszy na kolumny i kolumn na wiersze. Napisz program w języku C++, który przetestuje działanie tej funkcji, dynamicznie zaalokuje pamięć dla dwuwymiarowej macierzy i wypełni ją dowolnymi wartościami.

Rozwiązanie:
#include <iostream>

void fill_matrix(float **arr, int n, int m) {
    for(int i = 0; i < n; ++i)
        for(int j = 0; j < m; ++j) 
            arr[i][j] = i * m + j;
}

void print_matrix(float **arr, int n, int m) {
    for(int i = 0; i < n; ++i) {
        for(int j = 0; j < m; ++j) 
            std::cout << arr[i][j] << " "; 
        std::cout << "\n";
    }
}

void transpose(float **mat, int n, int m) {
    for(int i = 0; i < n; ++i)
        for(int j = i + 1; j < m; ++j)
            std::swap(mat[i][j], mat[j][i]);
}

int main() {
    int n = 4;
    float **arr = new float*[n];
    for(int i = 0; i < n; ++i) 
        arr[i] = new float[n];
    
    fill_matrix(arr, n, n);
    print_matrix(arr, n, n);
    transpose(arr, n, n);
    print_matrix(arr, n, n);
    
	for(int i = 0; i < n; ++i) 
	    delete[] arr[i]; 
	delete[] arr;
    return 0;
}

Zadanie 8

Napisz funkcję w języku C++, która przyjmuje wskaźnik na void oraz liczbę całkowitą ptrsize. ptrsize jest liczbą bajtów, która reprezentuje zmienną. Funkcja powinna odpowiednio zrzutować zmienną na typ char lub int, a następnie zwiększyć jej wartość o jeden. Napisz program w języku C++, który sprawdzi działanie tej funkcji dla obu tych typów.

Rozwiązanie:
#include <iostream>

void increase(void *data, int ptrsize) {
    if(ptrsize == sizeof(char)) {
        char *ptrchar;
        ptrchar = (char*)data;
        (*ptrchar)++;
    } else if(ptrsize == sizeof(int)) {
        int *ptrint;
        ptrint = (int*)data;
        (*ptrint)++;
    }
}

int main()  {
    char c = 'x';
    int i = 10;
    increase(&c, sizeof(c));
    std::cout << c <<"\n";
    increase(&i, sizeof(i));
    std::cout << i <<"\n";
    return 0;
}

Zadanie 9

Napisz funkcję w języku C++, który znajdzie najmniejszy i drugi najmniejszy element w dowolnej tablicy liczb całkowitych. Wartość najmniejszego i drugiego najmniejszego elementu powinny zostać zwrócone za pomocą argumentów funkcji. Do operowania na tablicy użyj arytmetyki wskaźników. Napisz program w języku C++, który przetestuje działanie tej funkcji.

Rozwiązanie:
#include <iostream>

void find(int *array, int n, int &s, int &ss) {
    if(*array < *(array + 1)) {
        s = *array;
        ss = *(array + 1);
    } else {
        s = *(array + 1);
        ss = *array;
    }

    for(int i = 0; i < n; ++i) {
        if (s > *(array + i)) {
            ss = s;
            s = *(array + i);
        } else if (*(array + i) < ss) {
            ss = *(array + i);
        }
    }
}

int main() {
    int s, ss, array[7] = {5, 6, 7, 2, 3, 4, 12};
    find(array, 7, s, ss);
    std::cout << s << " " << ss << "\n";
    return 0;
}

Zadanie 10

Napisz program w języku C++, który zaalokuje pamięć dla dwóch 10-elementowych tablic liczb całkowitych: a i b. Następnie program powinien wczytać od użytkownika wartość całkowitą x i wypełnić nią tablicę a, zaś tablica b powinna być uzupełniona wartością x, powiększoną o 2. Na koniec program powinien wyświetlić obie tablice, zaimplementowane rozwiązanie nie powinno używać pętli.

Rozwiązanie:
#include <iostream>
#include <algorithm>

int op_increase(int i) {
    return i + 2;
}

void print_elem(int i) {
    std::cout << i << " ";
}

int main() {
    int x, *a = new int[10], *b = new int[10];
    std::cin >> x;
    std::fill(a, a + 10, x);
    std::transform(a, a + 10, b, op_increase);
    std::for_each(a, a + 10, print_elem);
    std::cout << std::endl;
    std::for_each(b, b + 10, print_elem);
    std::cout << std::endl;     
    delete[] a;
    delete[] b;
    a = b = nullptr;
    return 0;
}

Zadanie 11

Zaprojektuj funkcję w języku C++, która dla wprowadzonej tablicy liczb rzeczywistych znajdzie podaną w argumencie wartość. Funkcja powinna zwrócić do niej wskaźnik, lub wskaźnik na NULL, jeśli nie znajdzie jej w tablicy. Zaimplementowane rozwiązanie nie powinno wykorzystywać pętli.

Rozwiązanie:
#include <algorithm>

float *f(float *arr, int n, float x) {
	float *p = std::find(arr, arr + n, x);
	if(p != arr + n) return p;
	else return nullptr;
}

Zadanie 12

Napisz dwie funkcje w języku C++ condition i action. Funkcja condition powinna przyjąć liczbę całkowitą i zwrócić wartość logiczną. Funkcja action powinna przyjmować referencję na liczbę całkowitą i nic nie zwracać. Funkcja condition ma sprawdzać, czy w liczbie powtarza się którakolwiek cyfra. Funkcja action powinna odwrócić kolejność cyfr w tej liczbie. Napisz funkcję modify_array, która przyjmie tablicę liczb całkowitych, jej rozmiar oraz dwa wskaźniki na funkcje o nagłówkach takich jak condition i action. Dla każdego elementu tablicy spełniającego warunek condition należy wywołać funkcję action.

Rozwiązanie:
#include <iostream>

void action(int &value) {
    int result = 0;
    do {
        result *= 10;
        result += value % 10;
    } while(value /= 10);
    value = result;
}

bool condition(int value) {
    int tmp[10] = {};
    do {
        ++tmp[value % 10];
        if(tmp[value % 10] > 1) return true;
    } while(value /= 10);
    return false;
}

void modify_array(int arr[], int n, bool (*cond)(int), void (*act)(int&)) {
    for(int i = 0; i < n; ++i) if(cond(arr[i])) act(arr[i]);
}

void print_arr(int arr[], int n) {
    for(int i = 0; i < n; ++i)
        std::cout << arr[i] << " ";
    std::cout << std::endl;
}

int main() {
    const int n = 5;
    int arr[n] = {1142, 123, 3243, 1543, 15443};
    print_arr(arr, n);
    modify_array(arr, n, condition, action);
    print_arr(arr, n);
    return 0;
}

Zadanie 13

Napisz funkcję w języku C++, do użycia jako komparator w funkcji qsort, która pozwoli posortować napisy rosnąco względem ich ostatnich znaków. Jeżeli ostatnie znaki są jednakowe, należy porównać przedostatnie itd.

Rozwiązanie:
#include <iostream>
#include <cstdlib>

unsigned int str_len(const char *str) {
    unsigned int len = 0;
    while(*(str + ++len));
    return len;
}

int str_cmp(const void *a, const void *b) {
    char c0, c1;
    const char* str_0 = (const char*)a;
    const char* str_1 = (const char*)b;
    unsigned int i = 0, n = str_len(str_0), m = str_len(str_1);
    unsigned int min_len = n < m ? n : m;
    
    for(int i = 1; i <= min_len; ++i) {
        c0 = str_0[n - i];
        c1 = str_1[m - i];
        if(c0 != c1) return c0 - c1;
    }
    return n - m;
}

void print_arr(const char arr[][100], int n) {
    for(int i = 0; i < n; ++i)
        std::cout << arr[i] << std::endl;
    std::cout << std::endl;
}

int main() {
    char arr[5][100] = {
        "limE",
        "alA",
        "keicaM",
        "nadgoB",
        "test"
    };
    print_arr(arr, 5);
    str_cmp(arr[0], arr[1]);
    qsort(arr, 5, 100, str_cmp);
    print_arr(arr, 5);
    return 0;
}

Zadanie 14

Napisz program w języku C++, który podzieli podany string na tokeny (fragmenty napisu) rozdzielone podanym znakiem. Zbierz wszystkie tokeny do tablicy string-ów i następnie wyświetl je na ekranie. Do wykonania zadania można użyć funkcji strtok() z pliku <cstring>.

PRZYKŁAD:
char str[] = "ala;ma kota;i;dwa psy"
char delimeter = ';'
tokeny: "ala", "ma kota", "i", "dwa psy"

Rozwiązanie:
// Version 1.0  

#include <iostream>
#include <cstring>

int main() {
    char str[100] = "ala;ma kota;i;dwa psy", delimeter = ';';
    char* tokens[100];
    int num_tokens = 0;

    char* token = strtok(str, &delimeter);
    while (token != nullptr) {
        tokens[num_tokens] = token;
        num_tokens++;
        token = strtok(nullptr, &delimeter);
    }

    for (int i = 0; i < num_tokens; ++i) std::cout << tokens[i] << "\n";
    return 0;
}

// Version 2.0
#include <iostream>
#include <cstring>

int main() {
    char str[] = "ala;ma kota;i;dwa psy", *delimeter = ";";
    char **tokens = {};
    int num_tokens = 0; 
    char *tmp = new char[strlen(str) + 1]();
    strcpy(tmp, str);

    char *token = strtok(tmp, delimeter);
    while(token) {
        ++num_tokens;
        token = strtok(nullptr, delimeter);
    }
    tokens = new char*[num_tokens];
    num_tokens = 0;

    std::cout << str << std::endl;
    token = strtok(str, delimeter);
    while(token) { //token != nullptr
        tokens[num_tokens] = new char[std::strlen(token) + 1]();
        std::strcpy(tokens[num_tokens], token);
        num_tokens++;
        token = strtok(nullptr, delimeter);
    }

    for(int i = 0; i < num_tokens; ++i) std::cout << tokens[i] << std::endl;
    return 0;
}
    

Zadanie 15

W języku C++ napisz funkcję search_string(), która przyjmie tablicę napisów, jej rozmiar oraz wskaźnik na funkcję pf odpowiedniej postaci. Funkcja search_string() powinna zwrócić wskaźnik na napis, dla którego funkcja f wykorzystująca funkcje pf zwróci największą wartość. Zdefiniuj funkcję search_string() tak, aby jako funkcja pf mogła być wywołana funkcja biblioteczna strpbrk z <cstring>, której jako drugi argument zostanie przekazany napis złożony z samogłosek. Funkcja f powinna zwracać ilość samogłosek w przetwarzanym napisie.

Rozwiązanie:
#include <iostream>
#include <cstring>


unsigned int f(const char *str, char *(*pf)(const char *, const char *)) {
    unsigned int result = 0;
    const char *tmp = str;
    while(tmp) {
        tmp = pf(tmp, "aeiouy");
        if(tmp) ++result;
        else return result;
        tmp += 1;
    }
    return result;
}

const char *search_string(const char *arr[], int n, char *(*pf)(const char *, const char *)) {
    unsigned int tmp = 0, max = f(arr[0], pf);
    const char *result = arr[0];
    for(int i = 1; i < n; ++i) {
        tmp = f(arr[i], pf);
        if(tmp > max) {
            max = tmp;
            result = arr[i];
        }
    }
    return result;
}

int main() {
    const char *arr[5] = {
        "emil",
        "ala",
        "maciek",
        "bogdan",
        "test"
    };
    std::cout << search_string(arr, 5, strpbrk) << 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

Dane są dwie tablice liczb zmiennoprzecinkowych o długościach: (1) 3*N oraz (2) N, gdzie N jest liczbą naturalną. Zdefiniuj funkcję fun_arr, która w parametrze przyjmie dwie tablice (o podanej wyżej specyfikacji) oraz wskaźnik na pewną dodatkową funkcję fun_aux. Funkcja fun_arr z każdych trzech sąsiadujących elementów (o indeksach {3i, 3i+1, 3i+2}) z pierwszej tablicy ma obliczyć, za pomocą fun_aux, pojedynczą wartość i wstawić ją do drugiej tablicy w element o indeksie i. Funkcja pomocnicza fun_aux, dla trzech podanych liczb, ma zwracać wartość największą.
W funkcji głównej stwórz przykładowe dynamiczne tablice (1) i (2) spełniające warunki z początku zadania i wykorzystując funkcje fun_arr i fun_aux, uzupełnij tablicę wyjściową (2). Wypisz na ekranie jej wartości. Zadbaj o właściwe zarządzanie pamięcią dynamiczną.
PRZYKŁAD:
IN: [1.0,1.0,2.5, 2.0,1.0,-0.5, -1.5,-3.0,-4.0, 0.0,0.0,0.0,0.0]
OUT: [2.5 2.0 -1.5 0.0]

Zadanie 2

Napisz program w języku C++, który stworzy dynamiczną tablicę dwuwymiarową trójkątną arr o rozmiarze NxN wybranego typu liczbowego i wypełni ją dowolnymi wartościami. Zdefiniuj funkcję, która w parametrze przyjmie wskaźnik na wskaźnik na typ void (do tablicy trójkątnej arr), rozmiar N, wielkość w bajtach pojedynczego elementu size_n tablicy przekazanej w pierwszym parametrze oraz dwie współrzędne x, y typu całkowitego. Funkcja ma zwrócić wskaźnik typu void ustawiony na podany we współrzędnych x, y element tablicy lub nullptr jeżeli nie ma takiego elementu. Pokaż użycie tej funkcji i wykonaj dealokację tablicy arr.
PRZYKŁAD:
0 1 2 3 4
5 6 7 8
8 9 10
11 12
13
OUT: 7 (dla x=2, y=1)

Zadanie 3

Napisz program, który obliczy i wyświetli długości dwuwymiarowych wektorów zapisanych w jednowymiarowej tablicy liczb zmiennoprzecinkowych. Tablica z wektorami wejściowymi ma być skonstruowana w ten sposób, że kolejne współrzędne (x, y) każdego wektora zajmują kolejne elementy tablicy, czyli: [x1,y1, x2,y2, x3,y3, …, xn,yn].

Zadanie 4

Zdefiniuj funkcję arr_fun, która w parametrach przyjmie: (1) wskaźnik na początek tablicy wektorów, (2) wskaźnik na za-ostatni element tej tablicy, (3) wskaźnik na początek tablicy wynikowej z obliczonymi długościami oraz (4) wskaźnik na funkcję pomocniczą, która zwraca wartość zmiennoprzecinkową a w parametrach bierze dwie wartości zmiennoprzecinkowe. Zdefiniuj funkcję pomocniczą, która zwróci długość wektora przy podaniu przez parametry jego dwóch współrzędnych. W funkcji głównej stwórz przykładową dynamiczną tablicę wektorów, wyznacz za pomocą stworzonej funkcji arr_fun ich długości i wyświetl powstałą w ten sposób tablicę wynikową. W zadaniu nie można używać funkcji z biblioteki <algorithm>.
PRZYKŁAD:
IN: [1.0,1.0 2.0,1.0 1.0,3.0 3.0,1.0]
OUT: [1.414214 2.236068 3.162278 3.162278]

Zadanie 5

Napisz program, który przyjmie od użytkownika liczbę całkowitą n. Utwórz dynamiczną tablicę liczb całkowitych arr i wypełnij ją wartościami od użytkownika większymi od 0. Liczby te reprezentują liczbę elementów dla kolejnych wierszy nieregularnej tablicy dwuwymiarowej arr2d. Następnie utwórz dynamiczną n-elementową tablicę wskaźników na tablice liczb zmiennoprzecinkowych arr2d. Każdemu wskaźnikowi zarezerwuj pamięć zgodnie z korespondującą indeksowo wartością tablicy arr. Wypełnij wszystkie tablice liczbami zmiennoprzecinkowymi pobranymi od użytkownika. Utwórz dynamiczną n-elementową tablicę liczb zmiennoprzecinkowych result, której elementami są sumy elementów poszczególnych wierszy tablicy arr2d, a następnie wyświetl jej zawartość.
PRZYKŁAD:
IN:
n: 4
arr: [3 5 4 1]
arr2d: [1.3 2.5 7.1]
       [1.1 3.4 2.2 4.7 1.9]
       [0.4 2.1 7.1 3.9]
       [3.5]
OUT:
result: [10.9 13.3 13.5 3.5]

Zadanie 6

Napisz program, który przyjmuje od użytkownika dwie liczby całkowite n i m. Utwórz dynamiczną tablicę dwuwymiarową liczb całkowitych nieujemnych arr2d o rozmiarze nx2m i wypełnij ją losowymi wartościami z przedziału <0,10). Następnie utwórz drugą dynamiczną tablicę dwuwymiarową liczb zmiennoprzecinkowych arr2d_2 o n wierszach. Korzystając z kolejnych elementów tablicy arr2d wypełnij kolejne wiersze tablicy arr2d_2 w następujący sposób: kolejne dwa elementy z każdego wiersza scal w liczbę zmiennoprzecinkową, w której mniejsza z tych dwóch liczb będzie częścią całkowitą, a większa - częścią ułamkową. Następnie wyświetl zawartość tablicy arr2d_2.
PRZYKŁAD:
IN:
n: 3
m: 4
arr2d: [3 5 2 3 5 0 3 3]
       [0 4 1 2 0 1 9 1]
       [3 1 6 0 1 2 2 9]
OUT:
arr2d_2: [3.5 2.3 0.5 3.3]
         [0.4 1.2 0.1 1.9]
         [3.1 0.6 1.2 2.9]

Zadanie 7

Napisz funkcję, która przyjmuje dwie równoliczne dynamiczne tablice wskaźników na napisy (c-string). W pierwszej tablicy, w każdym napisie zapisana jest tablica rejestracyjna, która została przechwycona przez fotoradar. Zakładamy że każda tablica rejestracyjna rozpoczyna się od dwóch lub trzech liter wskazujących miejscowość rejestracji, a następnie biały znak oraz ciąg cyfr (długość ciągu to 4 lub 5 cyfr). Należy pomóc jednostce policji w pogrupowaniu rejestracji według miejscowości, aby odpowiednio rozesłać poszczególnym jednostkom numery rejestracji wskazane do wystawienia mandatu. Funkcja powinna zapisać do drugiej tablicy napisy, które są połączeniem tablic rejestracyjnych dla konkretnego województwa (zobacz przykład). Funkcja ma zwrócić liczbę napisów w wyjściowej tablicy. Kolejność województw i rejestracji pojazdów w tablicy wynikowej nie ma znaczenia. Napisz program testujący zaimplementowaną funkcję.
PRZYKŁAD:
IN:
[ “LRY 1234”, “LU 87654”, “WA 1234”, “LRY 888”, “LU 999” ]
OUT:
[ “LRY 1234 888”, “LU 87654 999”, “WA 1234” ]

Zadanie 8

Radar morski na statku to prawdopodobnie najczęściej używany sprzęt elektroniczny podczas nawigacji. To doskonałe narzędzie do wykrywania obiektów wokół nas. Niestety jesteśmy tak bardzo uzależnieni od radaru, że czasami używamy go częściej niż własnych oczu do obserwacji wokół. Jednakże inna sytuacja miała miejsce, gdy pewien marynarz odczytywał dane z notatek pozostawionych na pokładzie swojego statku. W notatkach kapitan pokładu zapisał położenia N obiektów na morzu za pomocą współrzędnych biegunowych w następujący sposób:
R1 F1 R2 F2 ... Rn Fn
gdzie R to promień wodzący obiektu (odległość), zaś F to amplituda punktu (wartość kąt skierowanego w radianach).
Zaimplementuj funkcję, która posortuje dane przedstawione w notatce tak, aby obiekty były w kolejności od najmniej do najbardziej odległego od statku naszego bohatera, który znajduje się w punkcie (0, 0). W sytuacji, gdy oba obiekty są tak samo odległe należy wybrać ten o większej amplitudzie.
Napisz program, który przetestuje działanie tej funkcji i wyświetli współrzędne w układzie kartezjańskim tych obiektów w odpowiedniej kolejności.
Konwersja ze współrzędnych biegunowych do kartezjańskich:
x = R * cos(F)
y = R * sin(F)
PRZYKŁAD:
IN:
[1.2 6.1 1.2 1.1 5.4 3.1]
OUT:
1.179 -0.219
0.544 1.069
-5.395 0.225

Zadanie 9

Ranking gry NewCSShooter przechowywany jest na serwerze w następujący sposób:
MystiqueHero;1365;6890;15210
Frizz;5400;6200;11000
Każdy wiersz reprezentuje statystyki rozegranych meczy dla danego użytkownika. Pojedynczy wiersz zawiera następujące informacje oddzielone od siebie średnikiem: nazwa użytkownika, ilość wygranych meczy, ilość rozegranych meczy, ilość dokonanych likwidacji.
MystiqueHero;1365;6890;15210,
można zinterpretować, że gracz MystiqueHero wygrał 1365 meczy na 6890 wszystkich rozegranych meczy i dokonał 15210 likwidacji.
Zbuduj ranking graczy obliczając ich wynik rankingowy. Napisz funkcję, która przyjmuje dynamiczną tablicę napisów (c-string), w której w każdym elemencie przechowywany jest zapis statystyki danego gracza oraz drugą taką tablicę wyjściową na wyniki. Funkcja powinna w drugą tablicę wyjściową wpisać informacje o graczu oraz jego wynik liczony w następujący sposób: wygrane mecze + wszystkie mecze + ilość likwidacji. Możesz założyć że nazwa użytkownika to nie więcej niż 12 znaków oraz całkowity wynik to liczba całkowita złożona z maksymalnie 10 cyfr. Napisz program testujący zaimplementowaną funkcję.
PRZYKŁAD:
IN:
[ “MystiqueHero;1365;6890;15210”, “Frizz;5400;6200;11000”, “Ziemniak;9965;11000;73000”, “Evel00na;10;10;90” ]
OUT:
[ “MystiqueHero 23465”, //(bo 1365 + 6890 + 15210 = 23465) “Frizz 22600”, “Ziemniak 93965”, “Evel00na 110”, ]

Dodaj komentarz

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