Lista 3 Zestaw I Zadanie 1. Zaprojektować i zaimplementować funkcje: utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy, zapisz wypisującą na standardowym wyjściu wyniki operacji na macierzach, format danych m n x_11 x_12... x_1n x_21 x_22... x_2n... x_m1 x_m2... x_mn p q y_11 y_12... y_1q y_21 y_22... y_2q... y_p1 y_p2... y_pq usun zwalniającą zasoby przydzielone na stercie, czytaj pobierającą ze standardowego wejścia rozmiary macierzy oraz wartości ich elementów, czytaj losowo pobierającą ze standardowego wejścia rozmiary macierzy oraz wypełniającą tablicę wartościami pseudolosowymi, suma wykonującą operację dodawania macierzy pobranych jako argumenty tej funkcji oraz umieszczającą wynik działania w macierzy utworzonej wewnątrz tej funkcji, roznica wykonującą operację odejmowania macierzy pobranych jako argumenty tej funkcji oraz umieszczającą wynik działania w macierzy utworzonej wewnątrz tej funkcji, iloczyn wykonującą operację mnożenia macierzy pobranych jako argumenty tej funkcji oraz umieszczającą wynik działania w macierzy utworzonej wewnątrz tej funkcji, transponowanie wykonującą operację transponowania macierzy pobranej jako argument wywołania tej funkcji oraz umieszczającą wynik działania w macierzy utworzonej wewnątrz tej funkcji. Rozwiązanie zadania należy przetestować podanym poniżej ciągiem instrukcji:
{ srand(time(null)); double **A = 0, **B = 0; unsigned int n = 2, m = 3, p = 3, q = 2; if (czytaj_losowo(a, m, n, B, p, q)) { zapisz(a, m, n); zapisz(b, p, q); if (czytaj(a, m, n, B, p, q)) { zapisz(a, m, n); zapisz(b, p, q); if(!suma(a, m, n, B, p, q, C)){ cerr << "Macierze maja nieprawidlowe wymiary - suma niemozliwa" << endl; else{ cout << "suma macierzy" << endl; zapisz(c, m, n); if(!roznica(a, m, n, B, p, q, C)){ cerr << "Macierze maja nieprawidlowe wymiary - roznica niemozliwa" << endl; else{ cout << "roznica macierzy" << endl; zapisz(c, m, n); if(!iloczyn(a, m, n, B, p, q, C)){ cerr << "Macierze maja nieprawidlowe wymiary - iloczyn niemozliwy" << endl; else{ cout << "iloczyn macierzy" << endl; zapisz(c, m, q); cout << "macierz przed transponowaniem" << endl; zapisz(b, p, q); cout << "macierz transponowana" << endl; transpose(b, p, q, C); zapisz(c, q, p); Nie wolno zmieniać sposobu wywoływania poszczególnych funkcji. Komentarze należy zamienić na brakujące fragmenty kodu źródłowego.
Należy pamiętać o zwolnieniu zasobów przydzielonych na stercie. Zestaw II Zadanie 2. Zaprojektować i zaimplementować: funkcję char* wstaw(const char* zrodlo, char symbol); operującą na tablicy znaków i służącą do wstawienia co trzeci element tej tablicy symbolu przekazanego jako parametr wywołania tej funkcji, a zwracającą wskaźnik do nowo utworzonej wewnątrz tej funkcji tablicy w pamięci dynamicznej, funkcję void wstaw(char* cel, const char* zrodlo, char symbol); operującą na tablicy znaków i służącą do wstawienia co trzeci element tej tablicy symbolu przekazanego jako parametr wywołania tej funkcji, funkcję void wstaw1(char*& cel, const char* zrodlo, char symbol); operującą na tablicy znaków i służącą do wstawienia co trzeci element tej tablicy symbolu przekazanego jako parametr wywołania tej funkcji, pamięć dla tablicy docelowej należy przydzielić wewnątrz funkcji, dwuargumentową funkcję (szukaj) zwracającą liczbę wystąpień symbolu przekazanego jako parametr wywołania tej funkcji, jednoargumentową funkcję (kopiuj) zwracającą wskaźnik do nowo utworzonej wewnątrz tej funkcji tablicy w pamięci dynamicznej, do której przekopiowano tablicę źródłową zamieniając wszystkie małe litery na duże. Ciąg znaków oraz symbol odebrać jako parametry wywołania programu. Zdefiniowane funkcje przetestować podanym poniżej ciągiem instrukcji: char* a = wstaw(argv[1], argv[2][0]); char* b, *c; wstaw(b, argv[1], argv[2][0]); wstaw1(c, argv[1], argv[2][0]); cout << a << endl; cout << szukaj(a, s ) << endl; a = kopiuj(argv[1]); cout << a << endl; Przy realizacji zadań należy pamiętać o zwalnianiu pamięci i modyfikatorach const. Zadanie 3. Zaprojektować i zaimplementować funkcję realizującą następujące zadania: odczytanie danych osobowych (imię, nazwisko, numer gg, adres e mail, itp.) ze strumienia standardowego wejścia (wczytanie słowa END kończy pobieranie danych),
wyselekcjonowanie adresów email (na podstawie sprawdzenia wystepowania znaku @), zapisanie tych adresów (rozdzielonych średnikiem) z wykorzystaniem przekierowania danych ze standardowego wyjścia do pliku. Funkcje przetestuj podanym fragmentem kodu źródłowego. cout << "Podaj dane osobowe do wczytania: \n"; selektor(); Zestaw III Zadanie 4. Zaimplementować funkcję potega_10, która będzie zwracać wartość 10, podniesioną do potęgi podanej jako argument (typu unsigned int) funkcji. Funkcja ta powinna zwracać wartość typu unsigned int. Zadanie 5. Zaimplementować funkcję ile_cyfr, która przyjmuje jeden argument liczba typu unsigned int i która zwraca wartość typu unsigned int. Celem tej funkcji jest obliczenie liczby cyfr argumentu liczba. Zadanie 6. Zaimplementować funkcję doklej_do_liczby, która zwracać będzie liczbę z doklejoną do niej cyfrą. Funkcja ta przyjmuje od dwóch do trzech argumentów: zrodlo typu unsigned int, jest do liczba, do której należy dokleić cyfrę; cyfra typu unsigned int, jest to cyfra, która będzie doklejana; na_poczatek typu bool, który domyślnie przyjmuje wartość true. Funkcja powinna zwracać nową liczbę, której wartość zależy od argumentów cyfra i na_poczatek: jeżeli cyfra > 9, to zwracana jest wartość argumentu zrodlo (nie przeprowadzamy żadnych operacji); jeżeli na_poczatek==true, to cyfra jest dołączana do lewej strony źródła; jeżeli na_poczatek==false, to cyfra jest dołączana do prawej strony; Zadanie 7. Zaimplementować funkcję znak_na_cyfre, która przyjmuje wartość typu char i zwraca wartość typu unsigned int. Działanie tej funkcji polega na zamianie znaku z tabeli ASCII na jej numeryczną wartość. Oznacza to, że wywołanie: znak_na_cyfre( 2 ) zwróci 2. Jeżeli dany znak nie reprezentuje cyfry - należy zwrócić 0. Zadanie 8. Zaimplementować funkcję zamien_na_liczbe, która przyjmuje jako argument stały łańcuch znaków i zwraca wartość typu unsigned int. Jest to uproszczona wersja funkcji
atoi z biblioteki cstdlib, z jedną zmianą: każde wystąpienie znaku, który nie reprezentuje cyfry ma zostać zastąpione wartością 0. Założono, że łańcuch znaków reprezentuje tylko liczbę całkowitą nieujemną. Przykładowo, wywołanie: zamien_na_liczbe("1234") zwróci wartość 1234, ale wywołanie: zamien_na_liczbe("1ert234"); zwróci wartość 1000234 (każda litera została zastąpiona cyfrą 0). Funkcję należy zaimplementować nie używając funkcji atoi i nie używając klasy string. Przykładowy kod testujący działanie funkcji z zadań 5-7 (komentarze oznaczają oczekiwane wartości na standardowym wyjściu): unsigned jakas_liczba = 6572; cout << doklej_do_liczby(jakas_liczba,5) << endl; //56572 cout << doklej_do_liczby(jakas_liczba,1,false) << endl; //65721 unsigned jakas_druga_liczba = zamien_na_liczbe("1234"); cout << jakas_druga_liczba << endl; //1234 jakas_druga_liczba = zamien_na_liczbe("1ert234"); cout << jakas_druga_liczba << endl; //1000234 Zadanie 9. Zaimplementować program, który będzie demonstrować działanie funkcji zamien_na_liczbe. Działanie programu będzie zależeć od dodatkowych argumentów, podanych z linii wywołania programu: jeżeli nie podano żadnego argumentu, to program oczekuje na podanie przez użytkownika ciągu znaków. Ciąg ten powinien zostać zamieniony na liczbę (przy pomocy funkcji zamien_na_liczbe i wysłany na standardowe wyjście; jeden argument jest ciągiem znaków, który podobnie jak w przypadku wersji bezargumentowej zostanie zamieniony na liczbę i wysłany na standardowe wyjście; jeżeli podano więcej argumentów program powinien zakończyć działanie, wypisując odpowiedni komunikat na standardowym wyjściu błędów i zwracając do systemu operacyjnego wartość -1. Zadanie 10. Rozbudować funkcję zamien_na_liczbe, aby przy konwersji znaków, dla każdego znaku niebędącego cyfrą wypisać odpowiedni komunikat (ostrzeżenie) na standardowym wyjściu błędów.
Zestaw IV W zadaniach 11-16 założono, że wszystkie napisy składają się tylko z białych znaków i małych liter alfabetu angielskiego. Zadanie 11. Zaimplementować funkcję wypisz_tablice_2d, która przyjmuje trzy argumenty: tab_2d, która reprezentuje tablicę dwuwymiarową, przechowującą wartości typu unsigned int; wiersze typu unsigned int, reprezentuje liczbę wierszy wspomnianej tablicy; kolumny typu unsigned int, reprezentuje liczbę kolumn wspomnianej tablicy. i nic nie zwraca. Każdy wiersz powinien zostać wypisany w ten sposób, że wartości są otoczone znakami [ i ]. Każdy wiersz kończy się znakiem nowej linii. Zadanie 12. Zaimplementować funkcję ile_wystapien_znaku, która będzie przyjmować dwa argumenty: zrodlo typu string lub char*; znak typu char. i zwraca wartość typu unsigned int. Zadaniem tej funkcji jest zwrócenie liczby wystąpień danego znaku w podanym napisie. Jeżeli dany znak nie występuje - należy zwrócić 0. Zadanie 13. Zaimplementować funkcję znak_na_numer, który przyjmuje argument znak typu char i zwraca wartość typu unsigned int. Funkcja ta powinna zwracać pozycję danego znaku w alfabecie angielskim, tj. dla argumentu a zostanie zwrócona wartośc 0, dla b wartość 1 itd., dla z zostanie zwrócona wartość 25. Jeżeli dany znak nie należy do alfabetu angielskiego należy zwrócić 111. Zadanie 14. Zaimplementować funkcję statystyka, która przyjmuje dwa argumenty: tablica, będąca wskaźnikiem na tablicę wartości typu unsigned int. Uwaga założono, że podana tablica została wcześniej utworzona i przechowuje 26 elementów; napis, będący argumentem typu string lub char*. i nie zwraca żadnej wartości. Podana tablica posiada 26 elementów. Wartości tablicy należy wyzerować, a następnie: do tablica[0] wpisać liczbę wystąpień znaku a w argumencie napis (skorzystać z funkcji ile_wystapien_znaku); do tablica[1] wpisać liczbę wystąpień znaku b w argumencie napis; do kolejnych komórek wpisać liczbę wystąpień kolejny znaków z alfabetu angielskiego ( c, d itd.) w argumencie napis; dla ułatwienia: tablica[24] przechowuje liczbę wystąpień znaku y, a tablica[25] liczbę wystąpień znaku z.
Zadanie 15. Zaimplementować funkcję statystyki, która przyjmuje dwa argumenty: napisy, argument będący tablicą napisów; rozmiar, rozmiar wspomnianej tablicy. Funkcja zwraca dwuwymiarową tablicę wartości typu unsigned int o rozmiarach rozmiarx26 (tj. rozmiar wierszy i 26 kolumn). Wiersz o indeksie 0 powinien przechowywać liczbę wystąpień kolejnych znaków z alfabetu angielskiego dla wartości napisy[0]. Podobnie każdy kolejny wiersz aż do obliczenia statystyk dla każdego napisu z tablicy napisy. Wynikowa tablica powinna zostać utworzona dynamicznie. Zadanie 16. Zaimplementować program, demonstrujący działanie funkcji statystyki. Przykładowy fragment funkcji main: string napisy[] = {"ala ma", "kota", "abcdefghijklmnopqrstuvwxyz"; unsigned** statsy = statystyki(napisy,3); wypisz_tablice_2d(statsy,3,26); powinien spowodować wyświetlenie na standardowym wyjściu: [3][0][0][0][0][0][0][0][0][0][0][1][1][0][0][0][0][0][0][0][0][0][0][0][0][0] [1][0][0][0][0][0][0][0][0][0][1][0][0][0][1][0][0][0][0][1][0][0][0][0][0][0] [1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1] Przy realizacji zadań należy pamiętać o zwalnianiu pamięci i modyfikatorach const.