18 maj
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