28 maj
Laboratoria nr 13 program nr 2
Przekazywanie argumentów do funkcji przez wartość i referencje. Rekurencyjne wywołanie funkcji. Argumenty funkcji main.
UWAGA :: Proszę się zapoznać dokładnie z programem przedstawionym w wpisie Laboratoria nr 13 program nr 1 zanim Państwo przystąpią do analizy niniejszego rozwiązania. Przykład ten jest rozszerzoną wersją wcześniejszego programu, dla osób które chcą poznać trochę więcej C++. Zachęcam do zgłębiania meandrów C++. Ewentualne pytania osób zainteresowanych zostaną omówione na zajęciach.
#include "stdafx.h" #include <string> #include <iostream> using namespace std; /** Podstawowa struktura do przetwarzania w programie */ struct statStr { std::string uName; int cLetter; int cToken; }; /** Prototyp funkcji do uzupelniania struktury Struktura przekazywana jest przez referencje a nie wartosc. Jesli ktoras grupa chce korzystac z tego rozwiazania, to prosze podac uzasadnienie tego zabiegu oraz tego jak takie przekazywanie dziala. Proponuje zastosowania przekazywania przez wartosc, ktore latwiej jest na poczatku zrozumiec. */ void fillStr(statStr &sStr); /** Prototyp funkcji do uzupelniania struktury Struktura przekazywana jest przez wskaznik a nie wartosc. Jesli ktoras grupa chce korzystac z tego rozwiazania, to prosze podac uzasadnienie tego zabiegu oraz tego jak takie przekazywanie dziala. Proponuje zastosowania przekazywania przez wartosc, ktore latwiej jest na poczatku zrozumiec. @note :: funkcja przeciazona */ void fillStr(statStr *sStr); /** Prototyp funkcji do pokazywania elementow (pol) struktury. Struktura przekazywana jest przez referencje a nie przez wartosc. Do czego sluzy modyfikator const w zapisie w przypadku gdy przekazujemy strukture przez referencje? Czy taki modyfikator jest potrzebny w przypadku przekazywania przez wartosc? Jesli ktoras grupa chce korzystac z tego rozwiazania, to prosze podac uzasadnienie tego zabiegu oraz tego jak takie przekazywanie dziala. Proponuje zastosowania przekazywania przez wartosc, ktore latwiej jest na poczatku zrozumiec. */ void showStr(const statStr &sStr); /** Prototyp funkcji do pokazywania elementow (pol) struktury. Struktura przekazywana jest przez referencje a nie przez wartosc. Do czego sluzy modyfikator const w zapisie w przypadku gdy przekazujemy strukture przez referencje? Czy taki modyfikator jest potrzebny w przypadku przekazywania przez wartosc? Jesli ktoras grupa chce korzystac z tego rozwiazania, to prosze podac uzasadnienie tego zabiegu oraz tego jak takie przekazywanie dziala. Proponuje zastosowania przekazywania przez wartosc, ktore latwiej jest na poczatku zrozumiec. @note :: funkcja przeciazona */ void showStr(const statStr *sStr); /** Prototy funkcji do laczenia pol struktury. Struktury przekazywane sa przez referencje a nie przez wartosc. Do czego sluzy modyfikator const w zapisie w przypadku gdy przekazujemy strukture przez referencje? Czy taki modyfikator jest potrzebny w przypadku przekazywania przez wartosc? Jesli ktoras grupa chce korzystac z tego rozwiazania, to prosze podac uzasadnienie tego zabiegu oraz tego jak takie przekazywanie dziala. Proponuje zastosowania przekazywania przez wartosc, ktore latwiej jest na poczatku zrozumiec. */ statStr joinStr(const statStr &sStr1, const statStr &sStr2); /** UWAGA !!! Znaki ? trzeba odpowiednio czyms zastapic, aby program sie skompilowal Prototyp funkcji do zrealizowania zadania polegajacego na zlaczeniu struktur, bez zwracania struktury jako wyniku. */ void joinStr(? , ... , ?); /** Prototyp funkcji do zliczania ilosci znakow w podanym lancuhcu */ int cLetter(string s); /** Prototyp funkcji do zliczania ilosci wyrazen w podanym lancuchu */ int cToken(string s); /** Program prezentujacy mozliwosc wykorzystania funkcji operujacych na zdefiniowanej strukturze z dodatkowym rozwiazaniem polegajacym na dynamicznej alokacji pamieci na strukture. @author Marcin Mironczuk */ int main() { using namespace std; // Tworzenie zmiennych o typie statStr (struktura) statStr s1, s2; // Tworzenie zmiennej przechowujacej informacje z obu ww. struktur statStr sumaStr; // Uzupelnianie struktur fillStr(s1); fillStr(s2); std::cout << std::endl; // Pokazanie zawartosci struktur showStr(s1); showStr(s2); // Polaczenie struktur sumaStr = joinStr(s1, s2); // Pokazanie zawartosci struktury polaczonej showStr(sumaStr); /** Zawansowane uzycie struktur z alokacja dynamiczna pamieci */ statStr *s = new statStr; fillStr(s); showStr(s); // Zwolnienie przydzielonej pamieci delete s; std::cin.get(); std::cin.get(); return 0; } void fillStr(statStr &sStr) { std::string temp; int countLetter = 0; int countToken = 0; std::cout << "Podaj imie i nazwisko: " << std::endl; getline(std::cin, sStr.uName); std::cout << "Podaj lancuch do wprowadzenia: " << std::endl; getline(std::cin, temp); countLetter = cLetter(temp); countToken = cToken(temp); sStr.cLetter = countLetter; sStr.cToken = countToken; } void fillStr(statStr *sStr) { std::string temp; int countLetter = 0; int countToken = 0; std::cout << "Podaj imie i nazwisko: " << std::endl; getline(std::cin, sStr->uName); std::cout << "Podaj lancuch do wprowadzenia: " << std::endl; getline(std::cin, temp); countLetter = cLetter(temp); countToken = cToken(temp); sStr->cLetter = countLetter; sStr->cToken = countToken; } void showStr(const statStr &sStr) { std::cout << "Podane imie i nazwisko to: " << sStr.uName << std::endl; std::cout << "Ilosc znakow w wprowadzonym lancuchu to: " << sStr.cLetter << std::endl; std::cout << "Ilosc wyrazen w wprowadzonym lancuchu to: " << sStr.cToken << std::endl; std::cout << std::endl; } void showStr(const statStr *sStr) { std::cout << "Podane imie i nazwisko to: " << sStr->uName << std::endl; std::cout << "Ilosc znakow w wprowadzonym lancuchu to: " << sStr->cLetter << std::endl; std::cout << "Ilosc wyrazen w wprowadzonym lancuchu to: " << sStr->cToken << std::endl; std::cout << std::endl; } statStr joinStr(const statStr &sStr1, const statStr &sStr2) { // Algorytm laczenia pol struktury } void joinStr(?, ..., ?) { // Algorytm laczenia struktur } int cLetter(string s) { return s.length(); } int cToken(string s) { // Algorytm zaimplementowany na wczesniejszych zajeciach return 0; }