Zakończyła się kolejna edycja konferencji BDAS’11. Wspaniała impreza oraz niepowtarzalna atmosfera. Zachęcam do uczestniczenia w następnych edycjach ludzi którzy jeszcze nie są pewni – naprawdę warto. Niezbędne informacje na temat konferencji jak i materiały prezentowane na sesjach plakatowych jak i planarnych można odnaleźć na stronie konferencji http://zti.aei.polsl.pl/bdas.
Archiwum autora: Marcin
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; }
Laboratoria nr 13 program nr 1
Przekazywanie argumentów do funkcji przez wartość i referencje. Rekurencyjne wywołanie funkcji. Argumenty funkcji main.
#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 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); /** 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); /** Prototyp funkcji do zliczania ilosci znakow w podanym lancuhcu @todo :: Dla zaintersowanych - sprawdzenie co to jest przeciazanie funkcji @todo :: Alterantywnie mozna napisac funkcje przetwarzajaca tablice znakow. @todo :: Dla zaintersowanych - Tworzenie przeciazonej wersji funkcji cLetter pobierajaca jako argument tablice znakow */ int cLetter(string s); /** Prototyp funkcji do zliczania ilosci wyrazen w podanym lancuchu @todo :: Alterantywnie mozna napisac funkcje przetwarzajaca tablice znakow. @todo :: Dla zaintersowanych - sprawdzenie co to jest przeciazanie funkcji @todo :: Dla zaintersowanych - Tworzenie przeciazonej wersji funkcji cToken pobierajaca jako argument tablice znakow */ int cToken(string s); /** Program prezentujacy mozliwosc wykorzystania funkcji operujacych na zdefiniowanej strukturze. @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); 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 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 sumowania pol przekazywanych struktur statStr s; return s; } int cLetter(string s) { return s.length(); } int cToken(string s) { // Algorytm zaimplementowany na wczesniejszych zajeciach return 0; }
Laboratoria nr 12 program nr 2
Funkcje, ogólna struktura funkcji. Umieszczanie definicji funkcji w programie. Zmienne lokalne i globalne. Zasięg i widzialność identyfikatorów.
#include "stdafx.h" #include <iostream> #include <cstring> // Stale okreslajace wielkosc zalokowanej pamieci dla wykorzystywanych tablic const int ArrSize = 50; const int tempArrSize = 50; int getTokenCout(const char *str); /** * * Program Główny prezentujący funckje C++ wyprowadzania treści na wyjście konsoli. * Trzy strategie (szkielety) algorytmow do zliczania ilosci slow (tokenow) w podanym przez * uzytkownika lancuchu znakow.Prosze zwrocic uwage na interpretacje znaku spacji. Algorytmy * w najprostszej postaci nie chronia przed podwojnymi spacjami. Mozna to wykryc poprzez wprowadzenie * nastepujacego lancucha znakow: "1 2 3 " * * @author Marcin Mirończuk * */ int main() { // Tablica przechowujaca lancuch podany przez uzytkownika char slowa[ArrSize]; // Wprwadzanie lancucha znakow std::cout << "Podaj slowa: " << std::endl; std::cin.getline(slowa, ArrSize); std::cout << "Ilosc wprowadzonych slow to: " << getTokenCout(slowa) << std::endl; std::cin.get(); std::cin.get(); return 0; } int getTokenCout(const char *str) { // Ustawienie zmiennych tymczasowych int k = 0; int iloscSlow = 0; // Przetwarzanie wprowadzonego lanucha znakow for(int i = 0; i < strlen(str); i++) { // Tymczasowa tablic do przechowywania znakow a nastepnie lanucha znakow w postaci osobnych tokenow char temp[tempArrSize]; // Najprostszy sposob wykrywania spacji oraz konca lancucha if(isspace(str[i]) || str[i+1] == '\0') { temp[k] = '\0'; iloscSlow++; k = 0; temp[k] = '\0'; } else { // Zapis znaku to tablicy tymczasowej temp[k] = str[i]; k++; } } return iloscSlow; }
Laboratoria nr 12 program nr 2
Funkcje, ogólna struktura funkcji. Umieszczanie definicji funkcji w programie. Zmienne lokalne i globalne. Zasięg i widzialność identyfikatorów.
#include "stdafx.h" #include <iostream> #include <cstring> // Stale okreslajace wielkosc zalokowanej pamieci dla wykorzystywanych tablic const int ArrSize = 50; const int tempArrSize = 50; // Funkcja zliczająca ilość słów w podanym łańcuchu znaków int getTokenCout(const char *str); /** * * Program Główny prezentujący funckje C++ wyprowadzania treści na wyjście konsoli. * Demonstracja przeniesienia strategii nr. 1 z Laboratoria nr 10 program nr 2 (http://profind.pl/2011/05/18/laboratoria-nr-10-program-nr-2/) do funkcji. * Prosze zwrocic uwage na interpretacje znaku spacji. Algorytmy w dalszym ciągu jest * w najprostszej postaci nie chronia przed podwojnymi spacjami. Mozna to wykryc poprzez wprowadzenie * nastepujacego lancucha znakow: "1 2 3 " * * @author Marcin Mirończuk * */ int main() { // Tablica przechowujaca lancuch podany przez uzytkownika char slowa[ArrSize]; // Wprwadzanie lancucha znakow std::cout << "Podaj slowa: " << std::endl; std::cin.getline(slowa, ArrSize); std::cout << "Ilosc wprowadzonych slow to: " << getTokenCout(slowa) << std::endl; std::cin.get(); std::cin.get(); return 0; } // Modyfikator const - zabezpiecznie przed modyfikacja wartosci wskazanej int getTokenCout(const char *str) { // Ustawienie zmiennych tymczasowych int k = 0; int iloscSlow = 0; // Przetwarzanie wprowadzonego lanucha znakow for(int i = 0; i < strlen(str); i++) { // Tymczasowa tablic do przechowywania znakow a nastepnie lanucha znakow w postaci osobnych tokenow char temp[tempArrSize]; // Najprostszy sposob wykrywania spacji oraz konca lancucha if(isspace(str[i]) || str[i+1] == '\0') { temp[k] = '\0'; iloscSlow++; k = 0; temp[k] = '\0'; } else { // Zapis znaku to tablicy tymczasowej temp[k] = str[i]; k++; } } return iloscSlow; }
Laboratoria nr 12 program nr 1
Funkcje, ogólna struktura funkcji. Umieszczanie definicji funkcji w programie. Zmienne lokalne i globalne. Zasięg i widzialność identyfikatorów.
#include "stdafx.h" #include <iostream> // Funkcja inline inline double square(double x) { return x*x;}; // Funkcja zachowujaca wartosc na ktora wskazuje wskaznik i zwracajaca nowy wynik float square(float const * x); // Modyfikacja wartosci pod adresem wskazywanym przez wskaznik i zwrocenie dodatkowo adresu modyfikowanej wartosci float *psquare(float * x); // Alternatywne do wskaznikow przekazywanie przez referencje void square(float &x); float psquare(float const &x); /** * Funkcje inline wystepuja w C++, C tej funckji nie posiada. * Program demonstrujacy tworzenie, wywolywanie i dzialanie funkcji inline, jak i pozostalych funkcji * @author Marcin Mironczuk */ int main() { double a = 0; std::cout << "Podaj wartosc a: " << std::endl; std::cin >> a; std::cout << "Kwadrat liczby to: " << square(a) << std::endl; double *p1 = &a; std::cout << "Wartosc p1: " << *p1 << std::endl; std::cout << "Adres p1: " << p1 << std::endl; std::cout << "Adres a: " << &a << std::endl; float k = 2; float *p2 = &k; std::cout << "Wartosc k: " << square(p2) << std::endl; std::cout << "Wartosc k: " << *psquare(p2) << std::endl; std::cout << "Wartosc k po modyfikacji przez *psquare(): " << k << std::endl; square(k); std::cout << "Wartosc k po modyfikacji przez square(float &x): " << k << std::endl; std::cout << "Modyfikacja k poprzez psquare(float const &x): " << psquare(k) << std::endl; std::cout << "Wartosc k po modyfikacji przez psquare(float const &x): " << k << std::endl; std::cin.get(); std::cin.get(); return 0; } // zabezpiecznie przed modyfikacja wartosci wskazanej float square(float const * x) { return (*x)*(*x); }; float *psquare(float * x) { *x = (*x)*(*x); return x; }; // Troche niebezpiecznie modyfikujemy przekazywana wartosc void square(float &x) { x = x*x; }; // Bardziej bezpieczny sposob float psquare(float const &x) { return x*x; }
Laboratoria nr 11 program nr 1
Struktury, odwołania do pól struktury, inicjalizacja zmiennej strukturalnej. Pola bitowe i unie.
#include "stdafx.h" #include <string> #include <iostream> // Wielkosc ustalona tablicy do przechowywania snakow const int snackCount = 3; /** * * Program Główny prezentujący funckje C++ wyprowadzania treści na wyjście konsoli. * Program prezentujacy zastosowania struktur w programowaniu * * @author Marcin Mirończuk * */ int main() { using namespace std; struct Batonik { std::string marka; float waga; int iloscKalori; }; // Deklaracja tablicy przechowujacej struktury Batonik Batonik batoniki[snackCount]; // Deklaracja i inicjalizacja wybranych struktur Batonik snack = {"Super chrupek" , 2.3, 350}; Batonik superSnack = {"Super mega chrupek" , 4.6, 700}; Batonik megaSnack; megaSnack.marka = snack.marka + " " + superSnack.marka; megaSnack.waga = snack.waga + superSnack.waga; megaSnack.iloscKalori = snack.iloscKalori + superSnack.iloscKalori; // Dodanie batonikow do tablicy batoniki[0] = snack; batoniki[1] = superSnack; batoniki[2] = megaSnack; for(int i = 0; i < snackCount; i++) { std::cout << "Parametry batonika nr " << i+1 << " to: " << std::endl; std::cout << "- marka - " << batoniki[i].marka << std::endl; std::cout << "- waga - " << batoniki[i].waga << std::endl; std::cout << "- ilosc kalorii - " << batoniki[i].iloscKalori << std::endl; } /** Wersja z dynamiczna alokacja pamiei na struktur */ // Zalokowanie pamieci na nowa strukture wypadkowa Batonik *dmegaSnack = new Batonik; dmegaSnack->marka = snack.marka + superSnack.marka; dmegaSnack->waga = snack.waga + superSnack.waga; dmegaSnack->iloscKalori = snack.iloscKalori + superSnack.iloscKalori; delete dmegaSnack; std::cin.get(); return 0; }
Laboratoria nr 10 program nr 2
Łańcuchy znaków. Inicjalizacja łańcucha znaków. Stała znakowa. Funkcje do wprowadzania i wyprowadzania znaków. Plik nagłówkowy string.h (cstring). Przykłady kodu w C/C++. Szkielet programu do wczytywania z konsoli mieszanego łańcucha znaków ze spacjami oraz segmentacji wprowadzonego łańcucha ze względu na występujące w nim spacje. Po segmentacji program ma wykonać zadane operacje na poszczególnych albo wszystkich elementach łańcucha.
#include "stdafx.h" #include <iostream> #include <cstring> // Stale okreslajace wielkosc zalokowanej pamieci dla wykorzystywanych tablic const int ArrSize = 50; const int tempArrSize = 50; /** * * Program Główny prezentujący funckje C++ wyprowadzania treści na wyjście konsoli. * Trzy strategie (szkielety) algorytmow do zliczania ilosci slow (tokenow) w podanym przez * uzytkownika lancuchu znakow.Prosze zwrocic uwage na interpretacje znaku spacji. Algorytmy * w najprostszej postaci nie chronia przed podwojnymi spacjami. Mozna to wykryc poprzez wprowadzenie * nastepujacego lancucha znakow: "1 2 3 " * * @author Marcin Mirończuk * */ int main() { // Tablica przechowujaca lancuch podany przez uzytkownika char slowa[ArrSize]; // Wprwadzanie lancucha znakow std::cout << "Podaj slowa: " << std::endl; std::cin.getline(slowa, ArrSize); /** * Strategia nr I - rozwiazanie podstawowe * */ // Ustawienie zmiennych tymczasowych int k = 0; int iloscSlow = 0; // Przetwarzanie wprowadzonego lanucha znakow for(int i = 0; i < strlen(slowa); i++) { // Tymczasowa tablic do przechowywania znakow a nastepnie lanucha znakow w postaci osobnych tokenow char temp[tempArrSize]; // Najprostszy sposob wykrywania spacji oraz konca lancucha if(isspace(slowa[i]) || slowa[i+1] == '\0') { temp[k] = '\0'; iloscSlow++; k = 0; temp[k] = '\0'; } else { // Zapis znaku to tablicy tymczasowej temp[k] = slowa[i]; k++; } } std::cout << "Ilosc podanych slow: " << iloscSlow << std::endl; /** * Strategia nr II - rozwiazanie rozszerzone na wskaznikach na lanuchy znakow * */ // Deklaracja zmiennej do przechowywania ilosci wykrytych slow (tokenow) iloscSlow = 0; // Utworzenie stalego wskaznika na wprowadzony przez uzytkownika lancuch (ochrona przed modyfikacja) // Wksazanie pierwszego elementu tablicy slowa. const char *pslowa = slowa; // Iteracyjne przesowanie wskaznika while(*pslowa) { if(isspace(*pslowa)) { iloscSlow++; } pslowa++; } iloscSlow++; std::cout << "Ilosc podanych slow: " << iloscSlow << std::endl; /** * Strategia nr III - rozwiazanie rozszerzone z uzyciem tworzenie dynamicznej tablicy * do alokacji nowej pamieci na wczytany lanuch znakow. Wersja uproszczona. * */ // Alokacja dynamiczna nowej z zalozenia mniejszej pamieci char *nslowa = new char[strlen(slowa) + 1]; // Skopiowanie lanucha do nowej tablicy. // @todo wczytywanie lancucha do tabicy slowa powinno odbywac sie w fukcji. Tablica slowa powinna byc tymczasowa strcpy(nslowa, slowa); // Zmienna przechowujaca ilosc slow iloscSlow = 0; // Przetwarzanie lanucha znakow for(int i = 0; i < strlen(nslowa); i++) { if(isspace(nslowa[i])) { iloscSlow++; } } // Zwolnienie przydzielonej pamieci delete [] nslowa; iloscSlow++; std::cout << "Ilosc podanych slow: " << iloscSlow << std::endl; std::cin.get(); std::cin.get(); return 0; }
Laboratoria nr 10 program nr 1
Łańcuchy znaków. Inicjalizacja łańcucha znaków. Stała znakowa. Funkcje do wprowadzania i wyprowadzania znaków. Plik nagłówkowy string.h (cstring). Przykłady kodu w C/C++.
#include "stdafx.h" #include <iostream> #include <string> /** * * Program Główny prezentujący funckje C++ wyprowadzania treści na wyjście konsoli. * Program do wprowadzania mieszanych danych: liczby, znaki alfanumeryczne, lancuchy ze spacjami. * * @author Marcin Mirończuk * */ int main() { using namespace std; // Tablica przechowujaca imiona char imiona[50]; // Tablica przechowujaca nazwiska char nazwiska[50]; // Tablica przechowujaca polaczenie Imienia i nazwiska char nazwisko[100]; // Zmienna przechowujaca podana przez uzytkownika ocene int ocena; // Zmienna przechowujaca wiek uzytkownika int wiek; // Zmienna przechowujaca rok rozpoczecia studiow int rozpoczecieStudiow; std::cout << "Kiedy rozpoczeles/rozpoczelas studia? "; std::cin >> rozpoczecieStudiow; std::cin.get(); std::cout << "Jak masz na imie? "; std::cin.getline(imiona, 50); std::cout << "Jak sie nazywasz? "; std::cin.getline(nazwiska, 50); std::cout << "Na jaka ocene zaslugujesz? "; std::cin >> ocena; if(ocena > 6 || ocena < 2) { std::cout << "Podales nieprawidlowa ocene \n"; std::cout << "Na jaka ocene zaslugujesz? "; std::cin >> ocena; } std::cout << "Ile masz lat? "; std::cin >> wiek; // Funkcje strcpy(). strcat() nie chronia pamieci // moze sie zdarzyc, ze kopia tablicy jest wieksza niz docelowa tablica // W ogolnym przypadku rola programisty jest zabezpieczenie programu przed taka sytuacja. strcpy(nazwisko, nazwiska); strcat(nazwisko, ", "); strcat(nazwisko, imiona); std::cout << "Rok rozpoczecia studiow: " << rozpoczecieStudiow << std::endl; std::cout << "Nazwisko: " << nazwisko << std::endl; std::cout << "Ocena: " << ocena-1 << std::endl; std::cout << "Wiek: " << wiek << std::endl; std::cin.get(); std::cin.get(); return 0; }
Laboratoria nr 9 program nr 1
Tablice dwuwymiarowe. Operacje na tablicach. Przykłady kodu w C/C++.
#include "stdafx.h" #include <string> #include <iostream> // Zadeklarowanie stalych do okreslenia wielkosci // dwuwymiarowej tablicy przechowujacej wartosci pomiarow dla poszczegolnych badaczy const int iloscBadaczy = 4; const int iloscPomiarow = 5; // Struktura do przechowywania informacji o badaczu S. Prata s. 137 - 146 struct badacze { int liczbaPorzadkowa; std::string name; }; /** * * Program Główny prezentujący funckje C++ wyprowadzania treści na wyjście konsoli. * Program prezentujący zastosowanie tablic dwuwymiarowych oraz używania łańcuchów zanków. * Program pobiera wartości zmierzonych rezystancji przez daną liczbę badaczy a następnie oblicza * i prezentuje w ustalony sposób wartości wybranych wskźników. * * @author Marcin Mirończuk * */ int main() { // Zainicjowanie tabeli przechowujacej wyniki pomiarow badaczy wartosciami zerowymi float pomiarNapiecia[iloscBadaczy][iloscPomiarow] = { {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0} }; // Zainicjowanie tablic jednowymiarowych przechowujacych statystyki w postaci: // - sumy pomiarow // - sredniej pomiarow // - maksymalnej wartosci pomiarow // - minimalnej wartosci pomiarow // dla kazdego z badaczy float sumaPomiarow[iloscBadaczy] = {0, 0, 0, 0}; float sredniaPomiarow[iloscBadaczy] = {0, 0, 0, 0}; float maksPomiarow[iloscBadaczy] = {0, 0, 0, 0}; float minPomiarow[iloscBadaczy] = {0, 0, 0, 0}; // Nazwy badaczy inicjalizowane za pomoca struktury const badacze sBadaczeNapiecia[iloscBadaczy] = { {1, "Janek"}, {2, "Aleks"}, {3, "Magda"}, {4, "Alina"} }; /** * Materiały do tablic jednowymiarowych S. Prata s. 114 - 118 "Tablice w skrócie" * Materiały do tablic dwuwymiarowych S. Prata s. 234 - 238 "Petle zagniezdzone i dwuwymiarowe tablice" * Materiały do łańcuchów znaków S. Prata s. 118 - 124 "Tablice w skrócie" * Materiały do wzkaznikow i łańcuchów znaków S. Prata s. 170 - 175 * Materiały o klasie string S. Prata s. 130 - 137 * * Podstawowe materiały http://we.pb.edu.pl/~jforenc/inf1-dzienne/INF1-2011-Prac-06.pdf * Dodatkowe materiały http://warsztat.gd/files/articles/megatutorial/1_5.pdf * * DLA DOCIEKLIWYCH W CELU POSZERZENIA WIADOMOSCI * Materiały o strukturach S. Prata s. 137 - 146 * Materiały dla dociekliwych - wksażniki, alokacje pamieci etc. S. Prata s. 151 - 182 */ // Nazwy badaczy inicjalizowane za pomoca tablicy wskaznikow char const char * ptBadaczeNapiecia[iloscBadaczy] = { "Janek", "Aleks", "Magda", "Alina" }; // Nazwy badaczy inicjalizowane za pomoca tablicy lancucha znakow const char ctBadaczeNapiecia[iloscBadaczy][25] = { "Janek", "Aleks", "Magda", "Alina" }; // Nazwy badaczy inicjalizowane za pomoca klasy string const std::string stBadaczeNapiecia[iloscBadaczy] = { "Janek", "Aleks", "Magda", "Alina" }; char znacznik = 'c'; while(znacznik != 'q') { std::cout << "Wprowadz wyniki uzyskane przez " << iloscBadaczy << " badaczy\n"; for(int badacz = 0; badacz < iloscBadaczy; badacz++) { std::cout << "Wprowadz wyniki badacza nr. " << badacz+1 << ". " << ptBadaczeNapiecia[badacz] << ":\n"; for(int pomiar = 0; pomiar < iloscPomiarow; pomiar++) { std::cout << "Wynik pomiaru nr. " << pomiar+1 << ": "; std::cin >> pomiarNapiecia[badacz][pomiar]; } } std::cout << std::endl; std::cout << "Wyniki pomiarow zarejstrowane przez " << iloscBadaczy << " badaczy\n"; for(int badacz = 0; badacz < iloscBadaczy; badacz++) { std::cout << "Wyniki badacza nr. " << badacz+1 << ". " << ctBadaczeNapiecia[badacz] << ": "; for(int pomiar = 0; pomiar < iloscPomiarow; pomiar++) { std::cout << pomiarNapiecia[badacz][pomiar] << "\t"; } std::cout << std::endl; } // Sumowanie pomiarow dla poszczegolnych badaczy // Srednia pomaiarow kazdego badacza for(int badacz = 0; badacz < iloscBadaczy; badacz++) { float sumaNapiecia = 0; float sredniaNapiecia = 0; for(int pomiar = 0; pomiar < iloscPomiarow; pomiar++) { sumaNapiecia += pomiarNapiecia[badacz][pomiar]; } sumaPomiarow[badacz] = sumaNapiecia; sredniaPomiarow[badacz] = sumaNapiecia/iloscPomiarow; } // Wykrywanie wartosci maksymalnej pomiaru dla poszczegolnych badaczy // Wykrywanie wartosci minimalnej pomiaru dla poszczegolnych badaczy for(int badacz = 0; badacz < iloscBadaczy; badacz++) { // inicjalizacja zmiennej do porownania int m1 = 0; // Nomer pozycji na kotrej znajduje sie najwiekszy element int x1 = 0; // inicjalizacja zmiennej do porownania int m2 = 0; // Nomer pozycji na kotrej znajduje sie najwiekszy element int x2 = 0; for(int pomiar = 0; pomiar < iloscPomiarow; pomiar++) { if (pomiarNapiecia[badacz][pomiar] > m1) { m1 = pomiarNapiecia[badacz][pomiar]; x1 = pomiar; } if(pomiarNapiecia[badacz][pomiar] < m2) { m2 = pomiarNapiecia[badacz][pomiar]; x2 = pomiar; } } maksPomiarow[badacz] = pomiarNapiecia[badacz][x1]; minPomiarow[badacz] = pomiarNapiecia[badacz][x2]; } // Wyswietlenie statystyk dla poszczegolnych badaczy std::cout << std::endl; std::cout << "Statystyki pomiarow zarejstrowane przez " << iloscBadaczy << " badaczy\n"; std::cout << "\t\t\t\t" << "SUMA\t" << " SREDNIA\t MAX. POM \t MIN. POM. \t \n"; for(int badacz = 0; badacz < iloscBadaczy; badacz++) { std::cout << "Statystyki badacza nr. " << badacz+1 << ". " << stBadaczeNapiecia[badacz] << ": "; std::cout << sumaPomiarow[badacz] << "\t"; std::cout << sredniaPomiarow[badacz] << "\t"; std::cout << maksPomiarow[badacz] << "\t"; std::cout << minPomiarow[badacz] << "\t"; std::cout << std::endl; } // Wyswietlenie czy pomiary sie zgadzaja float oczekiwanaSrednia = 0; float odchylkaSredniej = 0; float odchylkaPlus = 0; float odchylkaMinus = 0; std::cout << std::endl; std::cout << "Wprowadz teoretyczna wartosc sredniej: "; std::cin >> oczekiwanaSrednia; std::cout << "Wprowadz mozliwa odchylke od wartosci sredniej: "; std::cin >> odchylkaSredniej; odchylkaPlus = oczekiwanaSrednia+odchylkaSredniej; odchylkaMinus = oczekiwanaSrednia+odchylkaMinus; for(int badacz = 0; badacz < iloscBadaczy; badacz++) { std::cout << "Statystyki w postaci sredniej badacza nr. " << badacz+1 << ". " << sBadaczeNapiecia[badacz].name << ": "; if(sredniaPomiarow[badacz] > odchylkaPlus) { std::cout << "Odbiega od teoretycznej wartosci sredniej.\n"; } else if(sredniaPomiarow[badacz] < odchylkaMinus) { std::cout << "Odbiega od teoretycznej wartosci sredniej.\n"; } else { std::cout << "Nie odbiega od teoretycznej wartosci sredniej.\n"; } } std::cout << "Znak q konczy program\n"; std::cin >> znacznik; } return 0; }