Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++v 1.0_студенты.doc
Скачиваний:
7
Добавлен:
03.11.2018
Размер:
626.69 Кб
Скачать

Лабораторная работа № 5. Алгоритмизация задач обработки символьной информации

1. Цель работы

Изучение строкового типа данных и принципов его обработки. Изучение принципов алгоритмизации задач, связанных с обработкой символьной информации.

2. Порядок выполнения работы

    1. Изучить особенности объявления, обработки и представления в памяти ЭВМ символьного типа данных. Изучить определение пользовательского типа данных (typedef).

    2. Изучить типы char и string, особенности их использования, изучить отличия символьной и строковой константы (к последней всегда добавляется нулевой байт).

    3. Изучить работу с функциями библиотеки string.h: strlen, strupr, strchr, strlwr, strcat, strcpy, strcmp memset; библиотеки ctype.h: isdigit, isalnum, isalpha, tolower, toupper.

    4. Изучить пример выполнения задания. Обратите внимание, что значение строковой переменной всегда должно заканчиваться нулевым байтом.

    5. Разработать алгоритм решения индивидуального задания, удовлетворяющий требованиям из пункта 2.6, используя метод пошаговой детализации.

    6. Требования к алгоритму. Алгоритм должен соответствовать требованиям структурного подхода. Необходимо организовать интерфейс ввода – вывода всех требуемых данных, организовать проверку входных данных на допустимые значения. Для решения задачи использовать символьный массив и указатель на строку. Предусмотреть инициализацию массива и строк на выбор пользователя ручным способом или с помощью строковых констант. Использовать объявление символьного массива с предварительным заданием типа.

    7. Разработать программу на языке С++ для алгоритма п. 2.5.

    8. Выполнить отладку и компиляцию программы, получить исполняемый файл.

    9. Выполнить тестирование программы несколькими наборами входных данных.

3. Пример выполнения задания

Даны символы s1, s2 … Известно, что символ s1 отличен от пробела и что среди s2, s3 … имеется хотя бы один пробел. Рассматриваются s1, … , sn - символы, предшествующие первому пробелу (n заранее неизвестно). Преобразовать последовательность s1, … , sn, удалив все символы, не являющиеся буквами или цифрами, и заменив каждую большую букву одноименной малой.

3.1 Текст программы на С++.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

// модуль lab5.cpp

#include "stdafx.h"

#include <Windows.h>

typedef char string_user[100]; //пользовательский тип строка из 99 символов //(в последний компилятор записывает 0, для обозначения конца строки)

using namespace std; //область видимости для встроенного типа //string из библиотеки string.h

int main()

{ setlocale(LC_ALL, "RUS");

//char st1[100]; // вариант объявления символьного массива из 99 символов

// инициализация строковой константой----------------------------------------------

string_user st1("Ис2х!од)(ны:й тЕКСт 2: abcDF1+2=3!!!");

//или ввод исходной строки пользователем-----------------------------------------------

printf("Введите последовательность символов - строку: \n");

std::cin.getline(st1, 99);

printf("\n");

//проверка на допустимость входных данных

while ((strlen(st1)==0) || (st1[0]==' ') || strchr(st1, ' ')==NULL) //strchr(st1, ' '); { printf("Повторите ввод, первый символ не должен быть пробелом\n");

std::cin.getline(st1, 99);

printf("\n");

}

OemToAnsi(st1, st1); //преобразует введенные данные в символьный набор

cout << "#Исходная последовательность символов" << endl;

cout << st1 <<endl;

//поиск первого пробела-----------------------------------------------------------------------

int n = 0; //переменная для сохранения позиции пробела

char buf[100] = "";

for (n = 0; st3[n] != ' '; n++);

//удаляем все символы, кроме букв и цифр----------------------------------------------

memset (buf, 0, 100); //очищаем строку, заполняя все символы нулями

j = 0;

for (int i = 0; i < n; i++)

// для русского алфавита (маленькие и большие буквы)

if (((int(st1[i]) >= -64)&&(int(st1[i]) <= -1)) ||

//добавляем английский алфавит ((int(st1[i]) >= 65 &&int(st1[i]) <= 90)||(int(st1[i]) >= 97 && st1[i] <= 122))

//добавляем цифры

||((int(st1[i]) >= 48 && int(st1[i]) <= 57)))

buf[j++] = st1[i];

strcpy(st1, buf);

//преобразуем большие буквы в маленькие (приводим к нижнему регистру)-----

char * pst3 = strlwr(buf);

cout << "#Преобразованная последовательность символов " << endl;

cout << pst3 << endl;

system("pause");

return 0;

}

4. Контрольные вопросы

1. Какие существуют способы организации символьных данных?

2. Объявление и инициализация символьных массивов.

3. В чем отличие символьной и строковой константы?

4. Как хранится строковое значение в памяти ЭВМ?

5. Общие принципы работы с символьными данными.

6. Библиотеки и функции для работы со строками.

7. Какие возможны операции над строками?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]