Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Podobne dokumenty
Ćwiczenie 4 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Ćwiczenie 5 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Wykład 7 Abstrakcyjne typy danych słownik (lista symboli)

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

Wykład 6_1 Abstrakcyjne typy danych stos Realizacja tablicowa i za pomocą rekurencyjnych typów danych

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Języki i metody programowania Java INF302W Wykład 2 (część 1)

tablica: dane_liczbowe

Zmienne i struktury dynamiczne

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

DYNAMICZNE PRZYDZIELANIE PAMIECI

Podejście obiektowe. Tablice (1) obiektów

ZASADY PROGRAMOWANIA KOMPUTERÓW

Część 4 życie programu

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

- - Ocena wykonaniu zad3. Brak zad3

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Programowanie i struktury danych

Etap 2 - Budowa interfejsu. typedef struct ELEMENT* stos; struct ELEMENT { dane Dane; stos Nastepny; }; struct kolejka { stos Poczatek, Koniec; };

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Zasady programowania Dokumentacja

Programowanie komputerowe. Zajęcia 4

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Programowanie i struktury danych

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Szablony klas, zastosowanie szablonów w programach

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

Wyklad 7 Funkcje (c.d.). Tablice jednowymiarowe znaków

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Podejście obiektowe. Tablice obiektów Przykład 1 metody i atrybuty statyczne oraz niestatyczne

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Wstęp do programowania

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

Proste programy w C++ zadania

Podstawy Programowania Podstawowa składnia języka C++

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 5

int tab_a [ 2 ] [ 3 ];

Microsoft IT Academy kurs programowania

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Podstawy programowania skrót z wykładów:

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Podstawy Programowania C++

I - Microsoft Visual Studio C++

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Wstęp do programowania

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Konstrukcje warunkowe Pętle

Pliki wykład 2. Dorota Pylak

Zajęcia 6 wskaźniki i tablice dynamiczne

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Zajęcia 4 procedury i funkcje

Deklaracja struktury w C++

Język C++ zajęcia nr 2

Programowanie w języku C++

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Programowanie komputerowe. Zajęcia 3

1 Podstawy c++ w pigułce.

Podstawy algorytmiki i programowania - wykład 2 Tablice dwuwymiarowe cd Funkcje rekurencyjne

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015

Szablony funkcji i szablony klas

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Wstęp do programowania

Tablice, funkcje - wprowadzenie

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Języki programowania obiektowego Nieobiektowe elementy języka C++

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Programowanie - wykład 4

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Spis treści WSTĘP CZĘŚĆ I. PASCAL WPROWADZENIE DO PROGRAMOWANIA STRUKTURALNEGO. Rozdział 1. Wybór i instalacja kompilatora języka Pascal

Programowanie w języku C++

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wykład 3 Składnia języka C# (cz. 2)

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

np. dla p=1 mamy T1(N) N/2 średni czas chybionego wyszukiwania z prawdopodobieństwem q:

Lab 9 Podstawy Programowania

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

Algorytmy i język C++

Programowanie obiektowe

Egzamin z Podstaw informatyki i programowania 2007/2008

class Student Deklaracja klasy Osoba: Deklaracja klasy Student:

Programowanie strukturalne i obiektowe : podręcznik do nauki zawodu technik informatyk / Adam Majczak. Gliwice, cop

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Instrukcje sterujące

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

1. Abstrakcyjne typy danych

Pytanie 1. Pytanie 2. Pytanie 3 WOJEWÓDZKI KONKURS INFORMATYCZNY. Treść pytania

Programowanie komputerowe. Zajęcia 5

Wykład :37 PP2_W9

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE

Język ludzki kod maszynowy

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

struct Student { char nazwisko[30]; int wiek; float ocena; }; #define MAX_ROZMIAR 3 Student lista_studentow[max_rozmiar];

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Transkrypt:

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania Zofia Kruczkiewicz

Zakres Funkcje przetwarzające teksty (biblioteka <string.h>) - tworzenie własnych funkcji Tablice jednowymiarowe i dwuwymiarowe Tablice wskaźników na łańcuchy Tablice wskaźników na struktury

Tablica dwuwymiarowa znaków

Przykład funkcji main dla Zad1 enum kl dodaj = 'a', zmien = 'b', sortuj = 'c', usun = 'd', pokaz = 'e', koniec = 'k' ; int main() char opcja; // zmienna wyboru typu int int ile=0; char Dane[N][DL]; do system("cls"); cout << ("Jesli nacisniesz klawisz:\n"); cout << ("a - Dodawanie kolejnego elementu do tablicy\n"); cout << ("b - Wyszukiwanie i zmiana zadanego elementu w tablicy\n"); cout << ("c - Sortowanie \n"); cout << ("d - Usuwanie \n"); cout << ("e - Wyswietlenie wszystkich elementow wstawionych do tablicy\n"); cout << ("k - Koniec programu\n"); cin >> opcja; switch (opcja) case dodaj: cout << "Nacisnales klawisz " << opcja << " - operacja 1.1\n" << endl; Dodaj_osobe(Dane, ile); break; case zmien: cout << "Nacisnales klawisz " << opcja << "- operacja 1.2\n" << endl; Zmien_nazwisko(Dane, ile); break; case sortuj: cout << "Nacisnales klawisz " << opcja << " - operacja 1.3\n" << endl; Sortowanie(Dane, ile); break; case usun: cout << "Nacisnales klawisz " << opcja << " - operacja 1.4\n" << endl; Usun_osobe(Dane, ile); break; case pokaz: cout << "Nacisnales klawisz " << opcja << " - operacja 1.5\n" << endl; Wyswietl_osoby_(Dane, ile); break; case koniec:cout << "Nacisnales klawisz " << opcja << " - koniec programu\n" << endl; break; default:cout << ("Nacisnales niewlasciwy klawisz\n") << endl; _getch(); while (opcja!= koniec); return 0;

Zad1 cd Napisz program, który w opcjach (wg wskazówek z Cw4) wywołuje funkcje, które wykonują następujące czynności na tablicy Dane zdefiniowanej jako char Dane[N][DL], opisane dalej. W komentarzach należy przedstawić odwołania do tablicy za pomocą indeksowania 1) Dodawanie danych do tablicy Napisz funkcję void Dodaj_osobe(char (*Dane)[DL], int & ile), która wprowadza dane Nazwisko za pomocą Podaj_tablice_znakow(char*, char*) funkcja void Podaj_tablice_znakow(char* komunikat, char* Nazwisko) sprawdza format łańcucha Nazwisko ze względu na niepotrzebne spacje, które usuwa, powtarzające się litery, które zamienia na jedną oraz brak dużej litery jako pierwszy znak łańcucha, którą zamienia na dużą literę. Tablica znaków Nazwisko jest przekazywana przez parametr typu wskaźnik na typ char. Każda z tych funkcji wyświetla komunikat przekazany przez listę parametrów z globalnej tablicy Komunikaty. Należy zastosować cin i cout. Zmienna globalna Komunikaty - przykład: char *Komunikaty[]= "Wpisz wiek", "Wpisz ocene srednia", "Wpisz nazwisko","tablica pelna", " Taka osoba już istnieje", " Wstawiono poprawnie", "Tablica pusta", " Usunieto poprawie", " Brak osoby"," Dokonano zmiany oceny"," Nieprawidlowy format danych powtorzenie liter", " Nieprawidlowy format danych liczbowych", " Nieprawidlowy format danych za duzo spacji"," Wyswietlono poprawnie";

Zad1 cd void Dodaj_osobe(char (*Dane)[DL], int & ile) // void Dodaj_osobe(char Dane[][DL], int & ile) char Nazwisko[DL]; if (Pelna(ile)) cout << *(Komunikaty+3) << endl; cout << "rozmiar: " << ile << endl; Podaj_tablice_znakow(*(Komunikaty+1), Nazwisko); bool wynik = Dodaj_do_tablicy(Nazwisko, Dane, ile); if (!wynik) cout << *(Komunikaty+4) << endl; else cout << *(Komunikaty+5) << endl; Funkcja bool Dodaj_do_tablicy(char* Nazwisko, char (*Dane)[DL], int& ile) dodaje po jednym elemencie typu char[dl] do tablicy na pozycję o indeksie ile. Podczas wstawiania pierwszego elementu ile powinno być równe 0; po wstawieniu należy powiększyć wartość ile o 1. Po ponownym wywołaniu funkcji kolejny element należy wstawiać jako element tablicy o indeksie ile, gdy ile spełnia warunek: ile<n. Po wykonaniu tej opcji, jeśli element został wstawiony do tablicy, należy zawsze powiększyć ile o jeden. Zmienną ile należy przekazywać przez referencję. Tablica powinna być przekazana przez domyślny wskaźnik, tablica znaków Nazwisko przez domyślny wskaźnik. Przez wynik funkcji zwracana jest wartość false, gdy nie wstawiono, ponieważ obiekt z takim samym nazwiskiem już istnieje oraz true, gdy wstawiono. Kolejna dana typu char[dl] nie zostanie wstawiona, gdy powtórzyło się takie samo nazwisko. Należy w tej funkcji wywołać funkcję char* Wyszukaj_wg_nazwiska( char (*Dane)[DL], int ile, char*nazwisko, int &ktory), która zwraca znalezioną osobę wg tablicy znaków Nazwisko przez wskaźnik lub NULL, jeśli nie znaleziono. Gdy wynik jest równy NULL, funkcja wstawia nowy element typu char[dl].

Zad1 cd bool Dodaj_do_tablicy(char* Nazwisko, char (*Dane)[DL], int& ile) int ktory; char *pom; //char Dane[][DL] pom = Wyszukaj_wg_nazwiska(Dane, ile, Nazwisko, ktory); if (pom!= NULL) return false; strcpy(*(dane+ile++), Nazwisko); return true; char* Wyszukaj_wg_nazwiska( char (*Dane)[DL], int ile, char*nazwisko, int &ktory) for (int i = 0; i < ile; i++) if (strcmp(*(dane+i), Nazwisko) == 0) ktory = i; return *(Dane+i); return NULL; //char Dane[][DL]

Zad1 cd 2. ** (funkcja dodatkowa) Wyszukiwanie danych osoby w celu zmiany nazwiska. Napisz funkcję void Zmien_nazwisko(char (*Dane)[DL], int ile), która zmienia ocenę u wybranej osoby, wyszukanej wg nazwiska. Po wprowadzeniu danych należy wywołać funkcję char* Zmien_nazwisko_osobie(char* nowe, char * nazwisko, char (*Dane)[DL], int ile), który wyszuka osobę w tablicy Dane wg łańcucha nazwisko za pomocą funkcji char* Wyszukaj_wg_nazwiska( char (*Dane)[DL], int ile, char*nazwisko, int &ktory), użytej podczas wstawiania nazwiska nowej osoby, i zmieni wartość łańcucha znaków wyszukanym elemencie tablicy i zwróci dane tej osoby przez wynik funkcji typu referencja char*, jeśli ją znaleziono lub NULL w przeciwnym wypadku. void Zmien_nazwisko(char (*Dane)[DL], int ile) char Nazwisko[DL], Nowe[DL]; if (Pusta(ile)) //funkcja zwraca true, gdy ile jest równe 0 cout << *(Komunikaty+6) << endl; Podaj_tablice_znakow(*(Komunikaty+1), Nazwisko); Podaj_tablice_znakow(*(Komunikaty+2), Nowe); char* osoba = Zmien_nazwisko_osobie(Nowe, Nazwisko, Dane, ile); if (osoba!= NULL) Wyswietl_osobe(osoba); else cout << *(Komunikaty+8) << endl;

Zad1 cd 3. Napisz funkcję void Usun_osobe(char (*Dane)[DL], int& ile), która pobiera poprawną daną typu tablica znaków za pomocą funkcji Podaj_tablice_znakow(char*, char*) i wywołuje funkcję int Usun_z_tablicy(char (*Dane)[DL], int& ile, char * Nazwisko), która za pomocą funkcji char* Wyszukaj_wg_nazwiska( char (*Dane)[DL], int ile, char*nazwisko, int &ktory), znajduje element tablicy Dane. Jeśli zwraca NULL, oznacza to brak danych osoby o podanym nazwisku lub dane osoby w przeciwnym wypadku. W przypadku znalezienia elementu usuwa element typu char[dl] w tablicy Dane o indeksie który, a następnie zsuwając elementy w tablicy Dane rozpoczynając od indeksu który. Funkcja Usun_z_tablicy zwraca 0, gdy nie znaleziono elementu, a różną od 0, gdy element typu char[dl] został usunięty z tablicy. void Usun_osobe(char (*Dane)[DL], int& ile) char Nazwisko[DL]; if (Pusta(ile)) //funkcja zwraca true, gdy ile jest równe 0 cout << *(Komunikaty+6) << endl; Podaj_tablice_znakow(*(Komunikaty+2), Nazwisko); int wynik = Usun_z_tablicy(Dane, ile, Nazwisko); if (wynik == 0) cout << *(Komunikaty+8) << endl; else cout << *(Komunikaty+7) << endl;

Zad1 cd 4. Napisz funkcję void Wyswietl_osoby_(char (*Dane)[DL], int ile), która wyświetla zawartość tablicy Dane za pomocą kolejnych znaków w tablicy dwuwymiarowej, odwołując się do nich za pomocą wskaźników. Należy to zmienić na odwołania indeksowane. void Wyswietl_osoby_(char (*Dane)[DL], int ile) if (Pusta(ile)) //funkcja zwraca true, gdy ile jest równe 0 cout << *(Komunikaty+6) << endl; for (int i = 0; i<ile; i++) for (int j=0; *(*(Dane+i)+j)!='\0';j++) // cout<<*(*(dane+i)+j); //Dane[i][j] cout<<endl; // *(Dane+i) równoważne char*, czyli Dane[i] // (Dane+i) wskaźnik na tablicę znaków char (*Dane)[DL] umieszczoną w wierszu i. //Dodanie i oznacza niejawne zwiększenie wartości wskaźnika Dane: *Dane+i*sizeof(char)*DL // dodanie do *(Dane+i) +j oznacza niejawne wyznaczenie adresu znaku // o indeksie j w tablicy znaków Dane[i], czyli : *Dane+(i*DL + j)*sizeof(char) // równoważny, jawny zapis: *(*Dane+ i*dl +j) gdzie *Dane jest wskaźnikiem na znak (char*), wskazujący na pierwszy znak o //indeksie 0 w wierszu o indeksie 0

Zad1 cd 5. Napisz funkcję, void Sortowanie(char (*t)[dl], int ile), która sortuje tablicę np. za pomocą algorytmu bąbelkowego: void Sortowanie(char (*t)[dl], int ile) if (Pusta(ile)) //funkcja zwraca true, gdy ile jest równe 0 cout << *(Komunikaty+6) << endl; Babelki(t, 0, ile - 1); Kod w C++ (ogólny) inline void zamien(element &a, element &b) element pom = a; a=b; b=pom; inline void porownaj_zamien(element &a, element &b) if (b<a) zamien(a,b); void babelki(element t[], long l, long p) // sortowanie wyznaczonej części tablicy za pomocą indeksów: od l do p np. babelki(t,0,ile-1); for( long i =l; i<p; i++) for (long j=l;j<p-i; j++) porownaj_zamien(t[j], t[j+1]);

Tablica dynamicznych łańcuchów

Przykład funkcji main dla Zad2 enum kl dodaj = 'a', zmien = 'b', sortuj = 'c', usun = 'd', pokaz = 'e', koniec = 'k' ; int main() char opcja; // zmienna wyboru typu int int ile=0; char* Dane[N]; do system("cls"); cout << ("Jesli nacisniesz klawisz:\n"); cout << ("a - Dodawanie kolejnego elementu do tablicy\n"); cout << ("b - Wyszukiwanie i zmiana zadanego elementu w tablicy\n"); cout << ("c - Sortowanie \n"); cout << ("d - Usuwanie \n"); cout << ("e - Wyswietlenie wszystkich elementow wstawionych do tablicy\n"); cout << ("k - Koniec programu\n"); cin >> opcja; switch (opcja) case dodaj: cout << "Nacisnales klawisz " << opcja << " - operacja 1.1\n" << endl; Dodaj_osobe(Dane, ile); break; case zmien: cout << "Nacisnales klawisz " << opcja << "- operacja 1.2\n" << endl; Zmien_nazwisko(Dane, ile); break; case sortuj: cout << "Nacisnales klawisz " << opcja << " - operacja 1.3\n" << endl; Sortowanie(Dane, ile); break; case usun: cout << "Nacisnales klawisz " << opcja << " - operacja 1.4\n" << endl; Usun_osobe(Dane, ile); break; case pokaz: cout << "Nacisnales klawisz " << opcja << " - operacja 1.5\n" << endl; Wyswietl_osoby_(Dane, ile); break; case koniec:cout << "Nacisnales klawisz " << opcja << " - koniec programu\n" << endl; break; default:cout << ("Nacisnales niewlasciwy klawisz\n") << endl; _getch(); while (opcja!= koniec); return 0;

Zad2 cd Napisz program, który w opcjach (wg wskazówek z Cw4) wywołuje funkcje, które wykonują następujące czynności na tablicy Dane zdefiniowanej jako char* Dane[N] (tablica dynamicznych tablic znaków), opisane dalej. W komentarzach należy przedstawić odwołania do tablicy za pomocą indeksowania 1) Dodawanie danych do tablicy Napisz funkcję void Dodaj_osobe(char * Dane[], int & ile), która wprowadza dane Nazwisko za pomocą Podaj_tablice_znakow(char*, char*) : funkcja void Podaj_tablice_znakow(char* komunikat, char* Nazwisko) sprawdza format łańcucha Nazwisko ze względu na niepotrzebne spacje, które usuwa, powtarzające się litery, które zamienia na jedną oraz brak dużej litery jako pierwszy znak łańcucha, którą zamienia na dużą literę. Tablica znaków Nazwisko jest przekazywana przez parametr typu wskaźnik na typ char. Każda z tych funkcji wyświetla komunikat przekazany przez listę parametrów z globalnej tablicy Komunikaty. Należy zastosować cin i cout. Zmienna globalna Komunikaty - przykład: char *Komunikaty[]= "Wpisz wiek", "Wpisz ocene srednia", "Wpisz nazwisko","tablica pelna", " Taka osoba już istnieje", " Wstawiono poprawnie", "Tablica pusta", " Usunieto poprawie", " Brak osoby"," Dokonano zmiany oceny"," Nieprawidlowy format danych powtorzenie liter", " Nieprawidlowy format danych liczbowych", " Nieprawidlowy format danych za duzo spacji"," Wyswietlono poprawnie";

Zad2 cd void Dodaj_osobe(char * Dane[], int & ile) if (Pelna(ile)) cout << *(Komunikaty+3) << endl; char* Nazwisko = new char [DL]; //przydział pamięci dla kolejnego elementu tablicy cout << "rozmiar: " << ile << endl; Podaj_tablice_znakow(*(Komunikaty+1), Nazwisko); bool wynik = Dodaj_do_tablicy(Nazwisko, Dane, ile); if (!wynik) cout << *(Komunikaty+4) << endl; else cout << *(Komunikaty+5) << endl; Funkcja bool Dodaj_do_tablicy(char* Nazwisko, char* Dane[], int& ile) dodaje po jednym elemencie typu char[dl] do tablicy na pozycję o indeksie. Podczas wstawiania pierwszego elementu ile powinno być równe 0; po wstawieniu należy powiększyć wartość ile o 1. Po ponownym wywołaniu funkcji kolejny element należy wstawiać jako element tablicy o indeksie ile, gdy ile spełnia warunek: ile<n. Po wykonaniu tej opcji, jeśli element został wstawiony do tablicy, należy zawsze powiększyć ile o jeden. Zmienną ile należy przekazywać przez referencję. Tablica powinna być przekazana przez domyślny wskaźnik, tablica znaków Nazwisko przez domyślny wskaźnik. Przez wynik funkcji zwracana jest wartość false, gdy nie wstawiono, ponieważ obiekt z takim samym nazwiskiem już istnieje oraz true, gdy wstawiono. Kolejna dana typu char[dl] nie zostanie wstawiona, gdy powtórzyło się takie samo nazwisko. Należy w tej funkcji wywołać funkcję char* Wyszukaj_wg_nazwiska( char *Dane[], int ile, char*nazwisko, int &ktory), która zwraca znalezioną osobę wg tablicy znaków Nazwisko przez wskaźnik lub NULL, jeśli nie znaleziono. Gdy wynik jest równy NULL, funkcja wstawia nowy element typu char[dl].

Zad2 cd char* Wyszukaj_wg_nazwiska( char *Dane[], int ile, char*nazwisko, int &ktory) for (int i = 0; i < ile; i++) if (strcmp(*(dane+i), Nazwisko) == 0) ktory = i; return *(Dane+i); return NULL; bool Dodaj_do_tablicy(char* Nazwisko, char* Dane[], int& ile) int ktory; char *pom; pom = Wyszukaj_wg_nazwiska(Dane, ile, Nazwisko, ktory); if (pom!= NULL) delete Nazwisko; //usunięcie z pamięci łańcucha, jeśli jest niepotrzebny return false; *(Dane+ile++)= Nazwisko; return true;

Zad2 cd 2. ** (funkcja dodatkowa) Wyszukiwanie danych osoby w celu zmiany nazwiska. Napisz funkcję void Zmien_nazwisko(char** Dane, int ile), która zmienia ocenę u wybranej osoby, wyszukanej wg nazwiska. Po wprowadzeniu danych należy wywołać funkcję char* Zmien_nazwisko_osobie(char* nowe, char * nazwisko, char**dane, int ile);, który wyszuka osobę w tablicy Dane wg łańcucha Nazwisko za pomocą funkcji char* Wyszukaj_wg_nazwiska( char *Dane[], int ile, char*nazwisko, int &ktory), użytej podczas wstawiania nazwiska nowej osoby, i zmieni wartość łańcucha znaków w yszukanym elemencie tablicy i zwróci dane tej osoby przez wynik funkcji typu referencja char*, jeśli ją znaleziono lub NULL w przeciwnym wypadku. void Zmien_nazwisko(char** Dane, int ile) char Nazwisko[DL], Nowe[DL]; if (Pusta(ile)) //funkcja zwraca true, gdy ile jest równe 0 cout << *(Komunikaty+6) << endl; Podaj_tablice_znakow(*(Komunikaty+1), Nazwisko); Podaj_tablice_znakow(*(Komunikaty+2), Nowe); char* osoba = Zmien_nazwisko_osobie(Nowe, Nazwisko, Dane, ile); if (osoba!= NULL) Wyswietl_osobe(osoba); else cout << *(Komunikaty+8) << endl;

Zad2 cd 3. Napisz funkcję void Usun_osobe(char** Dane, int& ile), która pobiera poprawną daną typu tablica znaków za pomocą funkcji Podaj_tablice_znakow(char*, char*) i wywołuje funkcję int Usun_z_tablicy(char **Dane, int& ile, char * Nazwisko), która za pomocą funkcji char* Wyszukaj_wg_nazwiska( char *Dane[], int ile, char*nazwisko, int &ktory) znajduje element tablicy Dane. Jeśli zwraca NULL, oznacza to brak danych osoby o podanym nazwisku lub dane osoby w przeciwnym wypadku. W przypadku znalezienia elementu usuwa element typu char[dl] w tablicy Dane o indeksie który, usuwając z pamięci element delete *(Dane+ktory), a następnie zsuwając elementy w tablicy Dane rozpoczynając od indeksu ktory. Funkcja Usun_z_tablicy zwraca 0, gdy nie znaleziono elementu, a różną od 0, gdy element typu char[dl] został usunięty z tablicy. void Usun_osobe(char** Dane, int& ile) char Nazwisko[DL]; if (Pusta(ile)) //funkcja zwraca true, gdy ile jest równe 0 cout << *(Komunikaty+6) << endl; Podaj_tablice_znakow(*(Komunikaty+2), Nazwisko); int wynik = Usun_z_tablicy(Dane, ile, Nazwisko); if (wynik == 0) cout << *(Komunikaty+8) << endl; else cout << *(Komunikaty+7) << endl;

Zad2 cd 4. Napisz funkcję void Wyswietl_osoby_(char** Dane, int ile), która wyświetla zawartość tablicy Dane za pomocą kolejnych znaków w tablicy dwuwymiarowej, odwołując się do nich za pomocą wskaźników. Należy to zmienić na odwołania indeksowane. void Wyswietl_osoby_(char** Dane, int ile) if (Pusta(ile)) //funkcja zwraca true, gdy ile jest równe 0 cout << *(Komunikaty+6) << endl; for (int i = 0; i<ile; i++) for (int j=0; *(*(Dane+i)+j)!='\0';j++) cout<<*(*(dane+i)+j); // Dane[i][j] lub *(*Dane + i*dl + j) cout<<endl;

Zad2 cd 5. Napisz funkcję void Sortowanie(char **t, int ile), która sortuje tablicę np. za pomocą algorytmu bąbelkowego: void Sortowanie(char **t, int ile) if (Pusta(ile)) //funkcja zwraca true, gdy ile jest równe 0 cout << *(Komunikaty+6) << endl; Babelki(t, 0, ile - 1); Kod w C++ (ogólny) inline void zamien(element &a, element &b) element pom = a; a=b; b=pom; inline void porownaj_zamien(element &a, element &b) if (b<a) zamien(a,b); void babelki(element t[], long l, long p) // sortowanie wyznaczonej części tablicy za pomocą indeksów: od l do p np. babelki(t,0,ile-1); for( long i =l; i<p; i++) for (long j=l;j<p-i; j++) porownaj_zamien(t[j], t[j+1]);

Tablica dynamicznych struktur

Przykład funkcji main dla Zad3 enum dodaj='a', zmien='b', sortuj='c', usun='d', pokaz='e', koniec='k' ; enum wiek, ocena, nazwisko, pelna, jest, dod_poprawnie, pusta, us_poprawnie, brak, zmiana, litery, liczby, spacje, ok; int main() char opcja; // zmienna wyboru typu int Osoba* Dane[N]; int ile = 0; do system("cls"); cout<<("jesli nacisniesz klawisz:\n"); cout<<("a - Dodawanie kolejnego elementu do tablicy\n"); cout<<("b - Wyszukiwanie i zmiana zadanego elementu w tablicy\n"); cout<<("c - Sortowanie \n"); cout << ("d - Usuwanie \n"); cout<<("e - Wyswietlenie wszystkich elementow wstawionych do tablicy\n"); cout<<("k - Koniec programu\n"); cin>>opcja; switch (opcja) case dodaj:cout << ("Nacisnales klawisz a - operacja 1.1\n")<<endl; Dodaj_osobe(Dane, ile); break; //wstawic wywolanie funkcji wstawiajacej kolejny element do tablicy wg 1.1. case zmien:cout << ("Nacisnales klawisz b - operacja 1.2\n") << endl; Zmien_ocene(Dane, ile); break;// wstawic wywolanie funkcji wyszukującej element w tablicy wh p.1.2 case sortuj:cout << ("Nacisnales klawisz c - operacja 1.3\n") << endl; Sortowanie(Dane, ile); break;// wstawic wywolanie funkcji wg 1.3 wyswietlającej element tablicy o zadanym indeksie case usun: cout << "Nacisnales klawisz d" << opcja << " - operacja 1.4\n" << endl; Usun_osobe(Dane, ile); break; case pokaz:cout << ("Nacisnales klawisz e - operacja 1.4\n") << endl; Wyswietl_osoby(Dane, ile); break;// wstawic wywolanie funkcji wyswietlajacej zawartosc tablicy wg p.1.4 case koniec:cout << ("Nacisnales klawisz k - koniec programu\n") << endl; break; default:cout << ("Nacisnales niewlasciwy klawisz\n") << endl; _getch(); //wstrzymanie programu przed system("cls") przez dodatkowe naciskanie klawisza while (opcja!= koniec); fflush(stdin); return 0;

Zad3 cd Napisz program, który w opcjach (wg wskazówek z Cw4) wywołuje funkcje, które wykonują następujące czynności na tablicy Dane zdefiniowanej jako Osoba * Dane[N], gdzie Osoba jest typem strukturalnym: struct Osoba int Wiek; char Nazwisko[DL]; float Ocena; ; 1) Dodawanie danych do tablicy Napisz funkcję void Dodaj_osobe(Osoba* tab[], int& ile), która wprowadza dane Wiek za pomocą funkcji Podaj_liczbe_calkowita(char *), Nazwisko za pomocą Podaj_tablice_znakow(char*, char*) i Ocena za pomocą funkcji Podaj_liczbe_rzeczywista(char*): funkcja int Podaj_liczbe_calkowita(char *komunikat) sprawdza, czy wprowadzono dane w formacie liczby całkowitej oraz przez wynik zwraca poprawną daną typu int funkcja float Podaj_liczbe_rzeczywista(char* komunikat) sprawdza, czy wprowadzono dane w formacie liczby rzeczywistej oraz przez wynik zwraca poprawną daną typu float funkcja void Podaj_tablice_znakow(char* komunikat, char* Nazwisko) sprawdza format łańcucha Nazwisko ze względu na niepotrzebne spacje, które usuwa, powtarzające się litery, które zamienia na jedną oraz brak dużej litery jako pierwszy znak łańcucha, którą zamienia na dużą literę. Tablica znaków Nazwisko jest przekazywana przez parametr typu wskaźnik na typ char. Każda z tych funkcji wyświetla komunikat przekazany przez listę parametrów z globalnej tablicy Komunikaty. Należy zastosować cin i cout. Zmienna globalna Komunikaty - przykład: char *Komunikaty[]= "Wpisz wiek", "Wpisz ocene srednia", "Wpisz nazwisko","tablica pelna", " Taka osoba już istnieje", " Wstawiono poprawnie", "Tablica pusta", " Usunieto poprawie", " Brak osoby"," Dokonano zmiany oceny"," Nieprawidlowy format danych powtorzenie liter", " Nieprawidlowy format danych liczbowych", " Nieprawidlowy format danych za duzo spacji"," Wyswietlono poprawnie";

Zad3 cd void Dodaj_osobe(Osoba* Dane[], int & ile) char Nazwisko[DL]; if (Pelna(ile)) cout << *(Komunikaty+3) << endl; int Wiek = Podaj_liczbe_calkowita(*(Komunikaty+wiek)); float Ocena = Podaj_liczbe_rzeczywista(*(Komunikaty+ocena)); Podaj_tablice_znakow(*(Komunikaty+nazwisko), Nazwisko); bool wynik = Dodaj_do_tablicy(Wiek, Ocena, Nazwisko, Dane, ile); if (!wynik) cout << *(Komunikaty +jest) << endl; else cout << *(Komunikaty+dod_poprawnie) << endl; Funkcja int Dodaj_do_tablicy(int Wiek, float Ocena, char Nazwisko[], Osoba* *Dane, int& ile) dodaje po jednym elemencie typu Osoba do tablicy na pozycję o indeksie ile. Należy przydzielić pamięć na element tablicy typu Osoba. Podczas wstawiania pierwszego elementu ile powinno być równe 0; po wstawieniu należy powiększyć wartość ile o 1. Po ponownym wywołaniu funkcji kolejny element należy wstawiać jako element tablicy o indeksie ile, gdy ile spełnia warunek: ile<n. Po wykonaniu tej opcji, jeśli element został wstawiony do tablicy, należy zawsze powiększyć ile o jeden. Zmienną ile należy przekazywać przez referencję. Tablica powinna być przekazana przez domyślny wskaźnik, natomiast Wiek i Ocena przez wartość, tablica znaków Nazwisko przez domyślny wskaźnik. Przez wynik funkcji zwracana jest wartość false, gdy nie wstawiono, ponieważ obiekt z takim samym nazwiskiem już istnieje oraz true, gdy wstawiono. Kolejna dana typu Osoba nie zostanie wstawiona, gdy powtórzyło się takie samo nazwisko. Należy w tej funkcji wywołać funkcję Osoba* Wyszukaj_wg_nazwiska(Osoba ** Dane, int ile, char*nazwisko, int& ktory), która zwraca znalezioną osobę wg tablicy znaków Nazwisko przez wskaźnik lub NULL, jeśli nie znaleziono. Gdy wynik jest równy NULL, funkcja wstawia nowy element typu Osoba.

Zad3 cd bool Dodaj_do_tablicy(int Wiek, float Ocena, char Nazwisko[], Osoba** Dane, int& ile) Osoba* osoba, *pom; int ktory; pom = Wyszukaj_wg_nazwiska(Dane, ile, Nazwisko, ktory); if (pom!= NULL) return false; osoba= new Osoba(); //wywołanie domyślnego konstruktora struktury Osoba() strcpy(osoba->nazwisko, Nazwisko); //(*osoba).nazwisko osoba->ocena = Ocena; //(*osoba).ocena osoba->wiek = Wiek; //(*osoba).wiek *(Dane + ile++) = osoba; return true; Osoba* Wyszukaj_wg_nazwiska(Osoba ** Dane, int ile, char*nazwisko, int& ktory) for (int i = 0; i < ile; i++) if (strcmp((*(dane+i))->nazwisko, Nazwisko) == 0) // if (strcmp((*(*(dane+i))).nazwisko, Nazwisko) == 0) ktory=i; return *(Dane+i); return NULL;

Zad3 cd 2. ** (funkcja dodatkowa) Wyszukiwanie danych osobę w celu zmiany średniej oceny. Napisz funkcję void Zmien_ocene(Osoba ** Dane, int ile), która zmienia ocenę u wybranej osoby, wyszukanej wg nazwiska. Po wprowadzeniu danych należy wywołać funkcję Osoba* Zmien_ocene_osobie(float ocena, char * nazwisko, Osoba** Dane, int ile), który wyszuka osobę w tablicy Dane wg składowej Nazwisko za pomocą funkcji Osoba* Wyszukaj_wg_nazwiska(Osoba ** Dane, int ile, char* nazwisko, int& ktory) użytej podczas wstawiania danych nowej osoby, i zmieni wartość składowej Ocena i zwróci dane tej osoby przez wynik funkcji typu referencja Osoba*, jeśli ją znaleziono lub NULL w przeciwnym wypadku. void Zmien_ocene(Osoba** Dane, int ile) char Nazwisko[DL]; if (Pusta(ile)) //funkcja zwraca true, gdy ile jest równe 0 cout << *(Komunikaty+pusta) << endl; Podaj_tablice_znakow(*(Komunikaty+nazwisko), Nazwisko); float Ocena = Podaj_liczbe_rzeczywista(*(Komunikaty+ocena)); Osoba* osoba = Zmien_ocene_osobie(Ocena, Nazwisko, Dane, ile); if (osoba!= NULL) Wyswietl_osobe(osoba); // np. Nazwisko: Kowalski, Wiek: 20, Ocena srednia: 4.24 i dodaje znak końca linii \n else cout << *(Komunikaty+brak) << endl;

Zad3 cd 3. Napisz funkcję void Usun_osobe(Osoba** Dane, int& ile), która pobiera poprawną daną typu tablica znaków za pomocą funkcji Podaj_tablice_znakow(char*, char*) i wywołuje funkcję int Usun_z_tablicy(Osoba** Dane, int& ile, char * Nazwisko), która za pomocą funkcji Osoba* Wyszukaj_wg_nazwiska(Osoba** Dane, int ile, char*nazwisko, int& ktory) znajduje element tablicy Dane. Jeśli zwraca NULL, oznacza to brak danych osoby o podanym nazwisku lub dane osoby w przeciwnym wypadku. W przypadku znalezienia elementu usuwa element typu Osoba w tablicy Dane o indeksie który, usuwając element za pomocą operatora delete: delete *(Dane+który), a następnie zsuwając elementy w tablicy Dane rozpoczynając od indeksu który. Funkcja Usun_z_tablicy zwraca 0, gdy nie znaleziono elementu, a różną od 0, gdy element typu Osoba został usunięty z tablicy. void Usun_osobe(Osoba** Dane, int& ile) char Nazwisko[DL]; if (Pusta(ile)) //funkcja zwraca true, gdy ile jest równe 0 cout << *(Komunikaty+pusta) << endl; Podaj_tablice_znakow(*(Komunikaty+2), Nazwisko); int wynik = Usun_z_tablicy(Dane, ile, Nazwisko); if (wynik == 0) cout << *(Komunikaty+brak) << endl; else cout << *(Komunikaty+us_poprawnie) << endl;

Zad3 cd 4. Napisz funkcję Wyswietl_osoby(Osoba ** Dane, int ile), która wyświetla zawartość tablicy Dane za pomocą funkcji Wyswietl_osobe(Osoba osoba) wg komentarza z p.2 void Wyswietl_osoby(Osoba** Dane, int ile) if (Pusta(ile)) //funkcja zwraca true, gdy ile jest równe 0 cout << *(Komunikaty+pusta) << endl; for (int i = 0; i<ile; i++) Wyswietl_osobe(*(Dane+i));

Zad3 cd 5. Napisz funkcję void Sortuj(Osoba ** Dane, int ile), która sortuje tablicę wg składowej Nazwisko np. za pomocą algorytmu bąbelkowego: void Sortowanie(Osoba** t, int ile) if (Pusta(ile)) //funkcja zwraca true, gdy ile jest równe 0 cout << Komunikaty[pusta] << endl; Babelki(t, 0, ile - 1); Kod w C++ (ogólny) inline void zamien(element &a, element &b) element pom = a; a=b; b=pom; inline void porownaj_zamien(element &a, element &b) if (b<a) zamien(a,b); void babelki(element t[], long l, long p) // sortowanie wyznaczonej części tablicy za pomocą indeksów: od l do p np. babelki(t,0,ile-1); for( long i =l; i<p; i++) for (long j=l;j<p-i; j++) porownaj_zamien(t[j], t[j+1]);