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;
}

Laboratoria nr 8 program nr 1

Tablice, deklaracja tablicy jednowymiarowej, inicjalizacja elementów tablicy. Przykłady kodu w C/C++.

#include "stdafx.h"
#include <iostream>
#include <cmath>

const int MAX = 5;

/**
*
* Program Główny prezentujący funckje C++ wyprowadzania treści na wyjście konsoli.
* Program prezentujący zastosowanie tablic jednowymiarowych. Użytkownik proszony jest
* o podanie rezystancji które wczytywane są do tablicy, a następnie obliczane są wymagane wskaźniki.
*
* @author Marcin Mirończuk
*
*/
int main()
{
	using namespace std;

	// Znak oznaczający komendę
	char komenda = 'd';

	std::cout << "Prosze podac wartosc rezystancji swoich rezystorow. \n";
	std::cout << "Maksymalnie mozna podac " << MAX << " rezystancji <q konczy program>.\n";

	while (komenda != 'q') {
		// licznik petli nr 1
		int i = 0;

		// licznik petli nr 2
		int k = 0;

		// licznik petli nr 3
		int j = 0;

		// inicjalizacja zmiennej do porownania
		int m = 0;

		// Nomer pozycji na kotrej znajduje sie najwiekszy element
		int x;

		double sumaRezystancji = 0;
		double rezystancja[MAX];
		double srednia = 0;
		bool znacznik = false;

		while(i < MAX) {
			std::cout << "Wartosc rezystancji nr. " << i+1 << ": ";
			std::cin >> rezystancja[i];
			i++;
		}

		std::cout << "Podales nastepujace rezystancje:\n";

		for(k = 0; k < MAX; k++) {
			
			if(rezystancja[k] < 0) {
				rezystancja[k] = abs(rezystancja[k]);
				znacznik = true;
			}
			
			std::cout << k+1 << ". " << rezystancja[k] << " Oh \n";

			sumaRezystancji += rezystancja[k];
		}
		
		for (j = 1; j < MAX; j++) {
			 if (rezystancja[j] > m) {
				m = rezystancja[j];
				x = j;
			 }
		}

		if(znacznik) {
			std::cout << "Jedna z podanych przec Ciebie rezystancji miala wartosc ujemna. Zmieniona zostala na dodatnia" << std::endl;
		}

		std::cout << "Suma podanych przez Ciebie rezystancji wynosi: " << sumaRezystancji << std::endl;
		std::cout << "Srednia rezystancja wynosi: " << sumaRezystancji/MAX << std::endl;
		std::cout << "Najwieksza wartosc podanej przez Ciebie rezystancji to: " << rezystancja[x] << " znajdujaca sie na " << x << " pozycji" << std::endl;
		
		std::cout << "Czy zakonczyc dzialanie programu? \n";
		std::cin >> komenda;
	}

	return 0;
}