Лабораторная работа № 7. Обработка строк — КиберПедия 

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Лабораторная работа № 7. Обработка строк

2017-09-30 565
Лабораторная работа № 7. Обработка строк 0.00 из 5.00 0 оценок
Заказать работу

Цель работы: изучение приемов обработки текстовой информации

Объем работы: 2 часов

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

В С++ символьная строка определяется как массив символов, который заканчивается нуль-символом – маркером конца строки ≪\0≫ (см. рисунок 12). Если маркер конца строки в символьном массиве отсутствует, то такой массив строкой не является. Маркер конца строки позволяет отслеживать реальную длину строки, которая может быть меньше размера массива.

Рисунок 12 – Внутреннее представление строки

Обращение к элементам строки осуществляется по индексу

· прямо – по номеру элемента

· косвенно – по значению переменной, которая индексирует массив

Нумерация элементов (значение индекса) начинается с 0!!!

Строение строковых данных в С (С++)

Объявление строки как одномерного массива

char <Имя>[<Объем памяти>] [= <Значение>];

Объявление указателя на строку

char *<Имя указателя>[= <Значение>];

Память под строку, объявленную как одномерный массив, выделяется статически на этапе компиляции.

Память под строку, объявленную как указатель на строку необходимо выделить самостоятельно на этапе выполнения из области динамической памяти. (За исключением тех, которые инициализируются при объявлении.)

Примеры:

а) char str[6];

б) char *ptrstr;

ptrstr=new char[6] или ptrstr=(char*)malloc(6);

 

в) char str1[5] = {‘A’,’B’,’C’,’D’,’\0’}; Система выделит 5 байт и в них разместятся символы. Символ «\0» нужно обязательно задать!!

г) char str1[12] = {‘A’,’B’,’C’,’D’,’\0’}; Система выделит 12 байт и в них разместятся 5 символы. Символ «\0» нужно обязательно задать!! Остальные символы заполнятся символом «\0».

д) char str1[ ] = “ABCD”; Система выделит 4 байта для размещения символов и 1 байт под символ «\0»!

е) char *str2 = “ABCD”;

Инициализировать можно только статические и внешние строки!!

Однако, хотя строки описаны разными способами, во всех случаях имя строки является ее адресом (указателем).

Но имя строки, описанной как одномерный символьный массив, является константным (к нему нельзя применять адресную арифметику)

Достаточно часто используются строковые константы, которые представляют собой последовательность символов, заключенных в кавычки, например: “Это строка”. При компиляции строковые константы размещаются в статической памяти, а в оператор помещается ее адрес. Строковые константы используются в строковых функциях, при инициализации строк и в других местах программы.

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

1. Ввод строк

Ввод строки можно произвести с помощью двух функций – gets и scanf,

А также с помощью потоко-ориентированных средств (cin).

Функция gets() прототип char * gets(const * char s);:

Функция читает символы до символа новой строки (“\n”), который создается при нажатии на клавиатуре клавиши enter. Функция считывает все символы до символа конца строки (исключая его), присоединяет к символам строки символ “\0” и передает строку программе. Если при считывании строки произошел сбой или вводилась пустая строка, то функция gets возвращает NULL (нулевой адрес).

Функция scanf() работает по формату %s и читает строку до первого пустого символа (пробела, знака табуляции, конца строки). Если в формате указывается размер, например %10s, то функция читает не более 10 символов строки или до первого пустого символа. Функция scanf() возвращает количество считанных символов или EOF(символ конца строки), если он встретился.

2. Вывод строк

Вывод строк выполняется с помощью двух функций puts() и printf().

Функция puts() прототип: int puts(char *s);

Функция выводит строку, указанную в качестве аргумента. Вывод происходит до символа конца строки «\0», поэтому он обязательно должен быть. В качестве аргумента можно указать строковую константу. Каждая выводимая по puts строка начинается с новой строки. В качестве результата возвращает количество выведенных символов.

Функция printf() использует указатель на строку в качестве аргумента. Функция менее удобна, чем puts, но более гибка. Функция выводит строку по формату %s, но автоматического перехода на новую строку не выполняет. Для перехода необходимо указать в форматной строке символ «\n». Вывод по формату %s позволяет выводить строки только до пробельного разделителя, поэтому используются для вывода строк без пробельных разделителей. Преимущество функции printf() заключается в возможности объединения при выводе в одной строке нескольких строк.

3. Функции, работающие со строками

Для обработки строк в С++ предусмотрено большое количество функций, размещенных в библиотеках: string.h, stdlib.h. Ниже приведены прототипы наиболее часто используемых функций. В зависимости от ситуации часть из них может использоваться как функции, и как процедуры.

1) size_t strlen(char *s); // функция возвращает длину строки - параметра.

2) char *strcat(char *dest,const char *src); // функция объединяет строки (добавляет вторую строку к первой) и возвращает дубликат адреса первой строки, содержащей объединение строк.

3) int strcmp(const char *s1,const char *s2); // функция сравнения строк, возвращает разницу кодов в ASCII первого различного символа строк (s1-s2), если строки равны возвращает 0.

4) char *strcpy(char *dest,const char *src); // функция копирует вторую строку в первую и возвращает дубликат адреса первой строки.

5) char *strncpy(char *dest, const char *src, size_t maxlen); // функция копирует maxlen символов из src в dest и возвращает дубликат адреса dest.

6) char *strchr(const char *s, int c); // функция определяет адрес первого вхождения c в строку s, иначе возвращает NULL.

7) char *strstr(const char *s1, const char *s2); // функция возвращает адрес первого вхождения s2 в строку s1, иначе возвращает NULL.

8) char *strtok(char *str1,const char *str2); // возвращает указатель на следующую лексему в строке str1. Символы, образующие строка str2, являются разделителями, определяющими лексему. Если лексемы не обнаружены – возвращается нулевой указатель.

9) int atoi(const char *s); // функция возвращает целое число, в символьном виде записанное в s.

10) double atof(const char *s); //функция возвращает вещественное число двойной точности, в символьном виде записанное в s.

11) char *itoa(int value,char *s,int radix); // функция осуществляет преобразование целого числа value в строку s в соответствии с заданной системой счисления radix (от 2 до 36).

12) char *_gcvt(double value, int digits, char *buffer); //

13) char *_ecvt(double value,int count,int *dec,int *sign);

count - количество цифр, dec,sign – позиции точки и знака

14) char *_fcvt(double value,int count,int *dec,int *sign);

count - количество десятичных цифр

Пример. Дана строка не более 40 символов, состоящая из слов, разделенных пробелами. Разработать программу удаления «лишних» пробелов. Лишними считать пробелы в начале строки до первого символа, второй и более пробелы между словами и пробелы в конце строки.

При решении данной задачи с использованием строкового типа отпадает необходимость посимвольного анализа строки. Функция strdel, которой в качестве подстроки заданы два пробела подряд, позволит определить все места в строке, где записаны несколько пробелов подряд. Поочередно удалив лишние пробелы, получим строку, в которой останется только проверить и при необходимости удалить пробел в начале и пробел в конце (рис. 13).

Рисунок 13 – Схема алгоритма программы удаления «лишних» пробелов

Ниже приведен текст программы.

#include <locale.h>

#include <stdio.h>

#include <conio.h>

#include <string.h>

#include <stdlib.h>

char *strdel(const char *source,char *result)

{ char *ptr;

strcpy (result, source);

while ((ptr=strstr(result, " "))!=NULL)

strcpy(ptr,ptr+1);

return result;

}

int main(int argc, char* argv[])

{char st[40], stres[40]; int k;

Puts(“Enter string <= 40 символов”);

gets(st);

printf(“String: %s \n”, &st);

strdel(st,stres) //ищем сдвоенные пробелы

if stres[1]=' ' Delete(st,1,1); //удалили пробел в начале

k= strlen(stres);

if st[k]=' ' Delete(st,k,1); {удалили пробел в конце}

puts(“Result:”);

if strlen(stres)<>0 puts(stres)

else puts(“Only spaces are in string.”);

return 0;

}

Другие примеры программ, содержащих обработку строк приведены в [1].

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

1. Прочитать и проанализировать задание в соответствии со своим вариантом.

2. Разработать схему алгоритма решения задачи.

3. Написать программу.

4. Вызвать среду программирования Turbo Delphi, создать новый проект консольного приложения и ввести текст программы в среду программирования.

5. Подобрать тестовые данные (не менее 3-х вариантов).

6. Отладить программу на выбранных тестовых данных.

7. Продемонстрировать работу программы преподавателю.

8. Составить отчет по лабораторной.

9. Защитить лабораторную работу преподавателю.

Требования к отчету

Отчет должен быть выполнен на бумаге формата А4 или А5 в том числе в тетрадях или на тетрадных листах. Если отчет выполняется на отдельных тетрадных листах, то они должны быть аккуратно обрезаны по линии подшивки и скреплены. Неаккуратно выполненные, оборванные или грязные отчеты не принимаются.

Все записи в отчете должны быть либо напечатаны на принтере, либо разборчиво выполнены от руки синей или черной ручкой (карандаш – не допускается). Схемы также должны быть напечатаны при помощи компьютера или нарисованы с использованием чертежных инструментов, в том числе карандаша.

Каждый отчет должен иметь титульный лист, на котором указывается:

а) наименование факультета и кафедры;

б) название дисциплины;

в) номер и тема лабораторной работы;

г) фамилия преподавателя, ведущего занятия;

д) фамилия, имя и номер группы студента;

е) номер варианта задания.

Кроме того отчет по лабораторной работе должен содержать:

1) схему алгоритма, выполненную вручную или в соответствующем пакете;

2) текст программы;

3) результаты тестирования, которые должны быть оформлены в виде таблицы вида:

Исходные данные Ожидаемый результат Полученный результат
     

4) выводы.

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

1. Что такое «строка»? В каких случаях используется эта конструкция?

2. Как реализована строка Паскаля?

3. Как показать ввод-вывод и обработку строк в программе?

4. Какой синтаксис имеет описание строки?

5. Объясните, почему в вашей программе следует использовать строки. Какие приемы со строками вы применили?

6. Как подбирают тесты для отладки программ, содержащих строки?



Поделиться с друзьями:

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.032 с.