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

Skomentuj ten wpis