Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
8
Добавлен:
03.03.2016
Размер:
112.13 Кб
Скачать

28

ЛАБОРАТОРНАЯ РАБОТА №4

РЕШЕНИЕ ЗАДАЧ ОБРАБОТКИ СТРОК И ПРОСТЕЙШИХ СТРУКТУР ДАННЫХ

Цель работы: практика изучения методов и работы со строками и простейшими структурами данных.

4.1 Требования к выполнению работы:

  • для всех задач составить блок-схему алгоритма, а потом программу решения индивидуальной задачи;

  • предусмотреть печать исходных строк, промежуточных и результирующих строк;

4.2 Теоретические положения

Строкой в СИ называется последовательность из одного или нескольких символов, которые заканчиваются “\0” –ноль-символом.

Имеется несколько способов описания и задания строк:

  • Строковая константа.

  • Символьный массив как строка.

  • Указатель на символьный тип как строку.

  • Многомерный символьный массив как набор строк.

  • Массив указателей символов как набор строк.

Рассмотрим различные способы описания строк:

  • Задание строки в форме строковой константы. При этом строка заключается в двойные апострофы, а компилятор сам добавляет в конце строки симол \0.

printf(“Исходные данные \n”);

  • Задание строки в виде массива символьного типа. При этом возможны два случая: явное указание длины и неявное указание длины массива.

Явное:

char имя [N]; char ks[25];

char aud[20]=”аудитория 8.712”;

Неявное: при этом организуется массив такой длины, сколько символов в строке +1 (0 символ).

char имя []=”последовательность символов”;

  • Строка в виде указателя на символьный тип. В этом случае создается указатель на символьный тип и ему присваивается адрес размещения строки.

char *pst1= “композитор”;

  • Многомерный символьный массив как набор строк.

char fruits[5][10] = { “яблоко”,

“ сливы”,

“ абрикосы”};

  • Массив указателей на символьный тип как набор строк.

В таком представлении pfood - это адрес и имя i-строки.

char *pfood[4] = { “хлеб”,

“молоко”,

“колбаса”,

“крупа” };

Для ввода используются следующие функции:

scanf () с форматом %s;

gets(имя строки);

Для вывода:

printf() с форматом %s;

puts(имя строки);

Обе функции выводят все содержимое строки на экран без 0-символа. Отличие состоит в том, что printf() может переводить курсор на другую строку или нет, а puts() – переводит обязательно.

В таблице 3.1 приведены основные функции для работы со строками.

Таблица 4.1 Основные функции для работы со строками

Функция

Описание функции

Пример

1

2

3

strlen(s)

Определяет длину строки и возвращает количество символов без нулевого символа.

L =strlen(s)

strcat( s1, s2)

Производит сцепку, соединение двух строковых переменных s1 и s2, причем s2 присоединяется в конец s1.

char str1 [10 ]=” adcdef”;

*str2 = “nijk”;

strcat( str1, str2);

Результат:

str1 =”abcdefnijk”

strncat(s1, s2, n )

Соединяет n литер из строки s2 с s1.

char str1 [10 ]=” adcdef”;

*str2 = “nijk”;

strncat( str1, str2,2); Результат:

str1 =”abcdefni”

strcmp (s1, s2)

Производит сравнение двух строк s1 и s2.Строки должны быть одинаковой длины и при сравнении происходит посимвольное вычитание кодов символов.

Результат:

strcmp(“AAA”,”AAA”) = 0

strcmp(“AAB”,”AAA”)= 1

strcmp(“AAA”,”AAB”)= -1

strncmp(s1, s2, n)

Аналогична strcmp(), но для n символов

#include <string.h>

#include <stdio.h>

int main(void)

{char *buf1 = "aaabbb", *buf2 = "bbbccc;int ptr;

ptr =strncmp(buf2,buf1,3);

if (ptr > 0)printf("buffer 2 is greater than buffer 1\n");

else printf("buffer 2 is less than buffer 1\n");

return(0);}

strcpy( s1, s2)

Выполняет копирование строки s2 в строку s1

#include <stdio.h>

#include <string.h>

int main(void)

{char string[10];

char *str1 = "abcdefghi";

strcpy(string, str1);

printf("%s\n", string); return 0; }

strncpy( s1, s2, n)

Копирует не более n символов строки s2 в s1.

#include <stdio.h>

#include <string.h>

int main(void)

{char string[10];

char *str1 = "abcdefghi";

strncpy(string, str1, 3);

string[3] = '\0';

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

return 0;}

strstr(str1,str2)

Функция strstr() возвращает указатель на первое вхождение подстроки, адресуемой параметром str2, в строку, адресуемую параметром str1. Если совпадение не обнаружено, возвращается нулевой указатель.

#include <stdio.h> #include < string. h> int main(void) {char *p;p = strstr("хлопот невпроворот", "от"); printf(p);return 0; }

Результат: от невпроворот

strchr(str,ch)

Функция strchr() возвращает указатель на первое вхождение младшего байта параметра ch в строку str. Если указанный символ не найден, возвращается нулевой указатель.

#include <stdio.h> #include <string.h> int main(void) {char *p; p = strchr("строка из примера", ' '); printf(p); return 0;}

Результат:

строка из примера

strpbrk(str1, str2)

Функция strpbrk() возвращает указатель на первый символ в строке, адресуемой параметром str1, который совпадает с любым символом в строке, адресуемой параметром str2. Если совпадений нет, возвращается нулевой указатель.

#include <stdio.h> #include <string.h> int main(void) {   char *p;  p = strpbrk("это тест",

"есою");    printf(p); return 0;}

Результат:

о тест

strspn (str1, str2)

Функция strspn() возвращает длину начальной подстроки строки, адресуемой параметром str1, которая состоит только из символов, содержащихся в строке, адресуемой параметром str2. Другими словами, функция strspn() возвращает индекс первого символа в строке str1, который не совпадает ни с одним из символов в строке str2.

#include <stdio.h> #include <string.h> int main(void) {   int len;    len=strspn("это строка из примера", "акортэ с");    printf("%d", len); return 0; }

Результат:

11

strrchr(str,ch)

Функция strrchr() возвращает указатель на последнее вхождение младшего байта параметра ch в строку, адресуемую параметром str. Если совпадение не обнаружено, возвращается нулевой указатель.

#include <stdio.h> #include <string.h> int main(void) {char *p; p = strrchr("по полю пыль  летит", 'п');  printf(p);return 0;}

Результат:

пыль летит

strtok(str1,str2)

Функция strtok() возвращает указатель на следующую лексему в строке, адресуемой параметром str1. Символы, образующие строку, адресуемую параметром str2, представляют собой разделители, которые определяют лексему. При отсутствии лексемы, подлежащей возврату, возвращается нулевой указатель.Чтобы разделить некоторую строку на лексемы, при первом вызове функции strtok() параметр str1 должен указывать на начало этой строки. При последующих вызовах функции в качестве параметра str1 нужно использовать нулевой указатель. Этим способом вся строка разбивается на лексемы.При каждом обращении к функции strtok() можно использовать различные наборы разделителей.

Эта программа разбивает строку "Травка зеленеет, солнышко блестит" на лексемы, разделителями которых служат пробелы и запятые. В результате получится строка: Травка|зеленеет|солнышко|блестит

#include <stdio.h> #include <string.h>

int main(void) {char *p; p = strtok("Травка зеленеет, солнышко блестит", " "); printf(p); do { p = strtok('\0', ", ");   if(p) printf("|%s", p); }

while(p); return 0; }

Пример.

Задана строка. Определить первое вхождение некоторого префикса в заданную строку.

Текст программы.

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<conio.h>

//Задаемся максимальной длиной строки

#define L 300

main()

{

char s[L];

char *slovo;

char *ss;

// Определение префикса

char *prefix="abc";

clrscr();

//Ввод и печать исходной строки

printf("Vvedite nathalnui text(do %d simvolov\n",L);

gets(s);

printf("\n Nathalnui text:\n");

puts (s);

//Поиск слова по символу пробел

slovo= strtok(s," ");

//Поиск префикса в слове

ss = strstr(slovo, prefix);

printf("\nThe substring is: %s\n", slovo);

printf("\nThe is: %s\n", ss);

//Если не найден префикс, то продолжаем поиск, пока не просмотрим все слова

if (strncmp(slovo,ss,strlen(prefix))!=0)

{

for(;slovo;)

{

slovo= strtok(NULL," ");

ss = strstr(slovo, prefix);

printf("\nThe substring is: %s\n", slovo);

printf("\nThe is: %s\n", ss);

//Если префикс найден, то заканчиваем работу программы

if(ss)

{

if (strncmp(slovo,ss,strlen(prefix))==0)

{printf("VHOD NAYDENO slovo=%s",slovo);return(0);

}

}

}

//Если просмотрев строку, префикс так и не был найден, печатаем соответствующее сообщение!

printf("VHOD ne NAYDENO");

}

else

//Печать результатов для случая, когда префикс в первом слове!

{ printf("VHOD NAYDENO slovo=%s",slovo); }

return(0);

}

4.3 Варианты индивидуальных задач

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

Таблица 4.2 Варианты индивидуальных задач

Задание

1

2

1

Найти длину самого длинного слова и все остальные слова добавить пробелами до длины этого слова.

2

Определить количество пар одинаковых соседних символов и в впереди поставить их номер.

3

Определить количество слов, нечетные слова заменить пробелами.

4

Определить количество предложений, удалить нечетные предложения.

5

Определить количество знаков и заменить их знаком *.

6

Разбить текст на строки не более 20 символов, перенос осуществлять на месте пробела.

7

Определить количество слов, у которых первый и последний символы совпадают между собой.

8

Удалить все символы, не являющиеся буквами; подсчитать их количество.

9

3аменить все точки цифрами, с соответствующими им номерами.

10

Определить количество слов, поменять местами четные и нечетные слова.

11

Определить количество знаков; сформировать текст, в котором знаков нет.

12

Найти предложение, содержащее максимальное количество запятых.

13

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

14

Определить максимальное количество пробелов, идущих подряд.

15

Определить количество минус, заменить их знаком +, впереди которых поставить их номер

16

Определить, сколько слов в тексте содержит удвоенную согласную.

17

Определить количество 4-буквенных слов и взять их в скобки.

18

Определить длины слов и преобразовать текст, дополнив слова знаками * до одинаковой длины.

19

Определить количество групп цифр и заменить их соответствующими порядковыми номерами

20

Найти длину самого короткого слова и заменить его сочетанием символов *.

21

Определить количество слов, после каждого слова вставить точку.

22

Определить количество пар повторяющихся символов и заменить их порядковыми номерами.

23

Определить количество пробелов и преобразовать текст, оставив везде по одному пробелу.

24

0пределить количество предложений, сформировать текст, в котором предложения разделялись бы тремя пробелами.

25

Определить, сколько раз в тексте встречается заданное слово, заменить их сочетанием символа М.

26

Найти длину самого длинного слова и заменить его номером.

27

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

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

  1. Какие существуют способы описания строк?

  2. Каким образом происходит обращение к елементам строки?

  3. Как выполняется инициализация строк?

  4. Приведите варианты печати строковых данных.

  5. Назовите основные функции для работы со строками.