Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Л_7. (2 пары) Симольная инф+.doc
Скачиваний:
7
Добавлен:
05.11.2018
Размер:
126.98 Кб
Скачать

МИНИСТЕРСТВО ПО НАУКЕ И ОБРАЗОВАНИю РФ

Государственное образовательное учреждение высшего профессионального образования

«Национальный исследовательский

ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

УТВЕРЖДАЮ

Директор ИК

_____________ М.К. Сонькин

«____»_____________2011 г.

Т.Е. Мамонова Лабораторная работа № 7

Обработка символьной информации в С++

Методические указания по выполнению лабораторных работ

по курсу «Информатика»

для студентов направлений 220000 – «Мехатроника и робототехника»,

220700 – «Автоматизация технологических процессов и производств».

Издательство

Томского политехнического университета

2011

УДК 519.6

ББК 00000

А00

Мамонова Т.Е.

А00 Обработка символьной информации в C++. Методические указания по выполнению лабораторных работ по курсу «Информатика» для студентов I курса, обучающихся по направлениям 220000 – «Мехатроника и робототехника», 220700 – «Автоматизация технологических процессов и производств» / Т.Е. Мамонова. – Томск: Изд-во Томского политехнического университета, 2011. – 10 с.

УДК 519.6

ББК 00000

Методические указания рассмотрены и рекомендованы к изданию методическим семинаром кафедры интегрированных

компьютерных систем управления ИК

«1» сентября 2011 г.

Зав. кафедрой ИКСУ

доктор технических наук _________________ А.М. Малышенко

Председатель учебно-методической

комиссии _________________ В.Н. Шкляр

Рецензент

Доцент ИКСУ ИК НИ ТПУ кандидат технических наук

В.Н. Шкляр

© ГОУ ВПО «Томский политехнический

университет», 2011

© Мамонова Т.Е., 2011

© Оформление. Издательство Томского

политехнического университета, 2011

Лабораторная работа № 7 Обработка символьной информации

Цель работы. Научиться обрабатывать символьную информацию на языке С++.

Теоретическая часть

Во многих языках есть специальный тип данных – строки (string). В языке С++ отдельного типа строки символов нет, а реализована работа со строками путем использования массивов символов (типа char). В языке С++ символьная строка – это одномерный массив типа char, который заканчивается нулевым байтом. Нулевой байт-это байт, все биты которого равны нулю. Для нулевого байта определена специальная символьная константа ‘\0’. Это следует учитывать при описании массива, т. к. если строка должна содержать n символов, то в описании следует указать n+1 элемент. В конце символьной строки не надо ставить символ ‘\0’ , это сделает сам компилятор. Символ ‘\0’ обозначается так же NULL.

Существуют очень простые способы ввода строки с клавиатуры.

Первый способ – воспользоваться функцией scanf() со спецификацией ввода %s. При этом очень хорошо надо помнить, что функция вводит символы до первого пробела.

Второй способ – это воспользоваться специальной библиотечной функцией gets(). Она находится в файле stdio.h. Данная функция позволяет вводить строки, содержащие пробелы. При этом можно исправлять введенные символы пока не нажата клавиша ENTER. Ввод информации заканчивается нажатием клавиши ENTER. Обе указанные функции автоматически ставят в конце строки (массива) нулевой байт. Но важно не забыть зарезервировать для строки место в памяти компьютера. Здесь используется, как было раньше показано, имя массива.

Вывод строк организуется через функции printf() или puts(). Обе эти функции выводят информацию строки до нулевого байта. Функция puts() предусматривает вывод в конце выводимой строки символа новой строки. Функция printf() не выводит этого символа в конце строки. Поэтому нужно это предусматривать в программе. То есть это значит, что надо предусматривать самим символы "\n" в конце формата для вывода строки.

Пример 1. Ввести строку (массив), состоящую не более чем из 80 символов. Воспользоваться двумя способами ввода и вывода информации.

#include <iostream.h>

#include <stdio.h>

#include <conio.h>

// Ввод строки с клавиатуры

void main(void)

{

char str[80]; /* Место для строки */

char str0[80];

clrscr(); // Очистить экран

cout<<"Vvedite stroku ne bolee 80 simvolov: "<<endl;

gets(str); /* Читает строку с клавиатуры */

cout<<"You enter: ";

puts(str);

cout <<"Vvedite stroku ne bolee 80 simvolov: "<<endl;

scanf("%s", str0); /* Читает строку с клавиатуры по-ка не встретится пробел */

cout <<"You enter: ";

printf("%s\n",str0);

getch();

}

Результат работы программы:

Библиотечные функции для работы со строками содержатся в заголовочном файле string.h. Наиболее часто используемые функции:

strcpy(), strcat(), strlen(), strcmp().

  • Функция strcpy(s1, s2) используется для копирования содержимого строки s2 в строку s1. Если нужного места не хватает, то компилятор не выдает сообщение об ошибке или хотя бы предупреждение. Программа не прервет свою работу. Однако же все это вполне может привести к порче данных или самой программы. В результате программа может работать, но неправильно.

  • Вызов функции strcat() имеет вид: strcat(s1, s2). Эта функция присоединяет строку s2 к строке s1 и помещает новую строку в массив, где находилась строка s1. Строка s2 не изменяется. При этом, как и в предшествующем случае, нет никакого контроля. Нулевой байт строки s1 заменяется первым символом строки s2. Новая строка автоматически завершится нулевым байтом.

  • Функция strcmp(s1, s2) сравнивает строки s1 и s2 и возвращает значение 0, если строки равны. Сравнение происходит посимвольно. Если s1 лексикографически больше s2, то функция возвращает положительное значение. Если меньше, то – отрицательное значение.

  • Функция strlen(s) возвращает длину строки, при этом нулевой байт не учитывается.

Пример 2. Дана символьная строка, содержащая слова, разделенные запятыми. Подсчитать, сколько слов начинаются на букву «w».

#include <iostream.h>

#include <string.h>

#include <conio.h>

void main (void)

{

char stroka [100] ; int i, l, kol=0; /* Место для строки */ cout <<”Vvedite slova cheres zapyatuyu: ”;

cin >> stroka;

if (stroka[0]==’w’) kol++;

l=strlen(stroka); //длина строки

for (i=0; i<l; i++)

if ((stroka[i]==’,’) && (stroka[i+1]==’w’)) kol++;

cout <<” V stroke ”<< kol << “ slov na bukvu <w>”;

getch();

}

Результат работы программы:

Для ввода строки с клавиатуры можно использовать функцию cin.getline. При использовании этой функции необходимо указать символьную строку, в которую будут вводиться символы и размер этой строки, для чего можно использовать функцию sizeof.

Пример 3. Дана символьная строка, содержащая слова, разделенные запятыми. Найти самое короткое слово. Ввод строки символов с клавиатуры произвести с помощью функции cin.getline.

#include <iostream.h>

#include <string.h>

#include <conio.h>

void main (void)

{

char stroka[128] ; int len, n, k, min=1000, i ,dl, n1, n2;

cout << "Vvedite slova cheres zapyatuyu, v konse–tochka: ";

cin.getline (stroka, sizeof (stroka)) ;

len=strlen(stroka); // длина строки

n=0; //начало первого слова

for (i=0; i<len; i++)

if (stroka[i]==',' || stroka[i]=='.')

{

k=i; // конец слова

dl=k-n; //длина слова

if(dl<min)

{

min=dl; // длина минимального слова

n1=n; // начало минимального слова

n2=k; // конец минимального слова

}

n=i+1; // начало следующего слова

}

cout<<"V min slove kol bukv: " << min<<endl;

cout<<"Min slovo: \n";

for (i=n1; i<n2; i++)

cout<<stroka[i];

getch();

}

Результат работы программы:

Массив из нескольких слов можно рассматривать как матрицу из символов (букв), тогда каждое слово – это строка матрицы. Первая буква каждого слова (строки матрицы) имеет номер 0.

Пример 4. Дан массив из слов. Определить, сколько слов и какие слова относятся к среднему роду (оканчиваются на «о» или «е»).

#include<iostream.h>

#include<string.h>

#include <conio.h>

void main ()

{

char a[10][10], b[10][10]; /* 10 слов, в каждом максимум по 10 букв

a – исходный массив слов,

b – массив из слов среднего рода */

int kol, len, k = 1;

cout << " Vvedite kol slov: " ;

cin >> kol;

for ( int i = 1; i <= kol; i++)

{ cin >> a[i];

len = strlen (a[i]); // длина слова

if ((a[i][len-1] == 'o' )||( a[i] [len-1] == 'e'))

strcpy(b[k++], a[i]); /* копирование строки <а> в строку <b> */

}

k=k-1;

cout << " \nk sred. rodu otnosatsa " << k << " slov:\n";

for ( int i = 1 ; i <= k; i++ )

cout << b[i] << endl;

getch ();

}

Результаты работы программы: