Индивидуальное задание к лабораторной работе №11.
Составить программу для обработки символьных данных согласно индивидуальному заданию приведенному в таблице 11.1.
Таблица 11.1
Вариант | Задание |
Ввести с клавиатуры предложение (слова отделенные пробелом). Пометить местами первое и последнее слова. | |
Ввести с клавиатуры предложение. Поменять местами четные и нечетные, по порядку слова. | |
Ввести с клавиатуры предложение. Произвести перестановку слов в предложении в обратном порядке. | |
Ввести с клавиатуры предложение. Произвести перестановку букв в словах в обратном порядке. | |
Ввести два предложения. Добавить второе предложение к первому, отделив их пробелом. | |
Ввести с клавиатуры предложение. Произвести вставку слова «не» перед каждым третьим словом в предложении. | |
Ввести с клавиатуры предложение. Произвести вставку запятой после слов заканчивающихся на «й». Вывести на экран количество таких вставок. | |
Ввести с клавиатуры предложение. Произвести вставку запятой перед словами начинающихся с букв «по». | |
Ввести с клавиатуры предложение. Слова заканчивающиеся на «ие» удалить. | |
Ввести с клавиатуры предложение. В словах заканчивающихся на «е» заменить эту букву на «я». | |
Ввести с клавиатуры предложение и слово. Произвести вставку слова между словами предложениями. | |
Ввести с клавиатуры предложение. Поменять местами второе и последнее слово. | |
Ввести с клавиатуры предложение. Произвести преобразование нижнего регистра в верхний. | |
Ввести с клавиатуры предложение. Произвести преобразование из верхнего в нижний. | |
Вывести строку с буквами верхнего и нижнего регистра. Произвести инвертирования регистра. | |
Ввести с клавиатуры предложение. Произвести перестановку букв в строке согласно таблице. | |
Ввести с клавиатуры предложение. Отсортировать слова в предложении в алфавитном порядке. | |
Ввести с клавиатуры предложение. Отсортировать слова в предложении по возрастанию. | |
Ввести с клавиатуры предложение. Подсчитать количество гласных букв в каждом слове предложения. | |
Ввести с клавиатуры предложение. Подсчитать количество согласных букв в каждом втором слове предложения. | |
Ввести с клавиатуры предложение. Отсортировать буквы в каждом слове предложения в порядке убывания: букву «а» считая последней, букву «я» считая первой. | |
Ввести с клавиатуры предложение. Подсчитать длину каждого слова в предложении. Найти номер самого длинного и самого короткого слова. | |
Ввести с клавиатуры предложение. Найти самое длинное и самое короткие слова и поменять их местами. | |
Ввести с клавиатуры предложение. Сформировать массив из длин слов в предложении. | |
Ввести с клавиатуры предложение. Найти среднюю длину слов в предложении. Вывести на экран самое длинное слово, и самое короткое слово, самое «среднее» слово. | |
Ввести с клавиатуры предложение. Произвести упаковку и распаковку предложений (повторяющиеся комбинации символов заменить каким-либо одним символом). | |
Вывести два предложения. Соединить предложения и отсортировать слова в порядке обратном алфавитному. | |
Ввести с клавиатуры предложение. Разбить предложение на два. |
|
Контрольные вопросы для подготовки и самостоятельной работы
|
1 Укажите способы объявления символьных строк (переменных и констант).
2 Какой символ ставится в конце строки?
3 Сколько памяти занимает один символ строки?
4 Сколько памяти занимает строка (слово) из 6 букв?
5 Можно ли использовать указатели для адресации символьных строк, содержащихся в массивах?
6 Сколько указателей можно использовать для работы с массивами?
7 Какой объект адресуется указателем, смещенным относительно начала строки на n байтов?
8 Какая функция позволяет определить длину строки?
9 Какие операции применимы к указателям и необходимы для работы со строками?
10 Можно ли инициализировать массивы с данными типа char строками символов?
11 Можно ли инициализировать указатели на тип char строками символов?
12 Какие символьные последовательности называют управляющими, что они означают?
Лабораторная работа № 12
Использование библиотечных функций для работы с символьными данными
(2 часа)
Цель работы: выработать практические навыки в написании программ с использованием библиотечных функций для работы с символьными данными.
Теоретические сведения
Функции для работы с символьными данными
Для работы с символьными данными разработан ряд библиотечных функций. Рассмотрим некоторые из них:
char *strcat(char *dest, const char *src); - добавляет копию строки src в конец dest. Длина результирующей строки равна strlen(dest) + strlen(src).
strcat() - возвращает указатель на результирующую строку.
Функция char *strchr(const char *s, int c); - просматривает строку в прямом направлении для отыскания в ней заданного символа. Функция strchr() ищет первое вхождение символа с в строку s. Символ конца строки считается частью строки, поэтому - strchr(strs, 0) вернет значение указателя на нулевой конечный символ строки strs. Функция strchr() возвращает указатель на первое вхождение символа с в s, если c не обнаружен в s, то strchr() возвращает нуль.
|
int strcmp(const char *s1, const char *s2); - осуществляет беззнаковое сравнение строк s1 и s2, начиная с первого символа каждой строки, до тех пор, пока очередные соответствующие символы в строках не будут различны или пока не будут достигнуты концы строк. Функция strcmp () возвращает значение:
< 0 если s1 меньше чем s2;
= = 0 если s1 равна s2;
> 0 если s1 больше чем s2.
int strcmpi(const char *s1, const char *s2); - сравнивает одну строку с другой аналогично s trcmp(), но без различия больших и маленьких букв. Функция strcmpi() определена как макрос в string.h и преобразует вызовы strcmpi() к вызовам strcmp(). Макрос обеспечивает совместимость с другими компиляторами С.
int strncmp(const char *s1, const char *s2, size_t maxlen); - сравнивает часть одной строки с частью другой. Функция strncmp() производит такое же беззнаковое сравнение, как и strcmp(), но просматривает не более, чем maxlen символов. Она начинает с первого символа каждой строки и заканчивает, когда очередные символы в строках различны или когда проверено maxlen символов. Функция strncmp () возвращает значение типа int, смысл которого аналогичен strncmp().
char *strcpy(char *dest, const char *src); - копирует строку src в dest, завершая работу после копирования символа окончания строки. Функция strcpy() возвращаетуказатель на результирующую строку (dest).
size_t strcspn(const char *s1, const char *s2); - ищет в строке первый сегмент, не содержащий ни одного символа из заданного набора символов. Функция strcspn() возвращает длину первого встретившегося сегмента строки s1, состоящего только из символов, не входящих в строку s2.
size_t strlen(const char *s); - вычисляет длину строки s. Функция strlen() - возвращает число символов в s, не считая символ конца строки.
char *strlwr(char *s); - преобразует буквы верхнего регистра (А-Z) строки s в буквы нижнего регистра (a-z). Другие символы не изменяются. Функция strlwr() возвращает указатель на строку s.
char *strnset(char *s, int ch, size_t n); - заменяет заданное количество символов n в строке s на указанный символ ch. Функция strnset() копирует символ ch в первые n байтов строки s. Если n > strlen(s), тогда strnset() заменяет,всесимволы и останавливается, когда достигнут конец строки (обнаружен нулевой символ).
Функция strnset() - возвращает указатель на изменённую строку s.
char *strpbrk(const char *s1, const char *s2); ищет в строке первое вхождение любого символа из переданного функции набора символов. Функция strpbrk() - осуществляет поиск в строке s1 первого вхождения любого из символов, определяемых строкой s2. Функция strpbrk() - возвращает указатель на первое вхождение любого символа строки s2. Если ни один символ из символов s2 не обнаружен в s1, то функция возвращает нуль.
char *strrchr(const char *s, int ch); - ищет в строке последнее вхождение заданного символа. Функция strrchr() проверяет строку s в обратном направлении, производя поиск заданного символа. Функция strrchr() находит последнее вхождение символа ch в строку s. Предполагается, что символ окончания строки является частью строки. Функция strrchr() возвращает указатель на последнее вхождение символа ch. Если ch не обнаружен в s, то strrchr() возвращает нуль.
char *strrev(char *s); - переворачивает строку. Функция strrev(), переустанавливает все символы в строке в обратном порядке, за исключением завершающего нулевого символа. Например, "строка\0" будет преобразована в "акортс\0". Функция strrev() возвращает указатель на перевернутую строку.
char *strset(char *s, int ch); - заменяет все символы строки s на заданный символ ch, заканчивая работу при обнаружении символа конца строки. Функция strset() - возвращает указатель s на результирующую строку.
char *strstr(const char *s1, const char *s2); - осуществляет поиск в строке s2 первого вхождения в нее подстроки s1. Функция strstr() - возвращает указатель на элемент в строке s2, с которого начинается s1 (указатель на s1 в s2). Если s1 не обнаружена в s2, то strstr() возвращает нуль.
Пример
/* ЗАНЯТИЕ N 12
Разработал Петров Ю.В.
Использование библиотечных функций для обработки символьных данных.
Выпполнить сортировку элементов массива list[N][4], использовать
функции strcpy(), qsort(), strcmp(), stricmp(). Разработать функцию
сравнения строк с учетом и без учета регистра -sort_function(). */
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define N 8
int sort_function(const void *a, const void *b);
char list[N][4]={"1a3","d34","1c4","235","2h5","012","135","102"};
//list[N][4]-глобальный массив
int registr=1; //Глобальная переменная для управления режимом
//работы функции sort_function(): 0 -с учетом регистра, 1-без
int main(void)
{ clrscr();
int i,j;
char *pch=NULL;
printf("\n\tИсходный (глобальный) массив char list[N][4]:\n");
for (i=0; i<N; i++) printf("%s ", list[i]);
printf("\n");
for (i=0; i<N; i++) //Cортировка массива
for (int j1=i+1;j1<N;j1++)
{j=sort_function((void *)list[i], (void *)list[j1]);
if(j>0) //Замена строк: char *strcpy(char *dest,
{ strcpy(pch,list[i]); // const char *src);
strcpy(list[i],list[j1]);
strcpy(list[j1],pch);
}
}
printf("\n\tРезультат сортировки:\n");
for (i=0; i<N; i++) printf("%s ", list[i]);
printf("\n");
printf("\n\tИсходный (локальный) массив char list[N][4]:\n");
char list[N][4]={"abc","cad","tre","Cab","abb","Abc","cam","Cap"};
for (i=0; i<N; i++) printf("%s ",list[i]);
printf("\n");
qsort((void *)list, N, sizeof(list[0]), sort_function);
//Функция использует для сортировки алгоритм quicksort
// void qsort(void *base, size_t nelem, size_t width,
//int (*fcmp)(const void *, const void *));
printf("\n\tРезультат сортировки без учета регистра:\n");
registr=1;
for (i=0; i<N; i++) printf("%s ",list[i]);
printf("\n");
registr=0;
qsort((void *)list, N, sizeof(list[0]), sort_function);
printf("\n\tРезультат сортировки c учетом регистра:\n");
for (i=0; i<N; i++) printf("%s ",list[i]);
printf("\n");
// Функции strrev() strcat()
char *s = "Герой ";
char *m = "- Gerakl";
char *t = "retro";
char *sapr = "cae";
printf("\t Исходная строка: %s \n", t);
char *g = strrev(t);
printf("\t Перевернутая строка: %s \n", g);
s = strcat(s,m);//char *strcat(char *dest, const char *src);
printf("\t Конкатенация строк: %s\n",s);
getch();
return 0;
}
int sort_function(const void *a, const void *b)
{ if (registr==0) //C учетом регистра
return(strcmp((const char *)a,(const char *)b));
//int strcmp(const char *s1, const char*s2); Возвращает:
// (<0) если s1<s; (==0) если s1==s2; (>0) если s1>s2
else //Без учета регистра
return(stricmp((const char *)a,(const char *)b));
}
/* Исходный (глобальный) массив char list[N][4]:
1a3 d34 1c4 235 2h5 012 135 102
Результат сортировки:
012 102 135 1a3 1c4 235 2h5 d34
Исходный (локальный) массив char list[N][4]:
abc cad tre Cab abb Abc Cap cam
Результат сортировки без учета регистра:
abb Abc abc Cab cad cam Cap tre
Результат сортировки c учетом регистра:
Abc Cab Cap abb abc cad cam tre
Исходная строка: retro
Перевернутая строка: orter
Конкатенация строк: Герой - Gerakl */
Ход работы
1 Изучить теоретические сведения
2 В соответствии с индивидуальным заданием разработать алгоритм решения задачи. На базе лабораторной работы №11 реализовать задание, при этом использовать библиотечные функции, рассмотренные на лекции и в теоретической части лабораторной работы. Результаты обработки строк (выделенные элементы) представить в массиве указателей. Обеспечить возможность передачи данных из окружения (из командной строки). При работе со строками использовать функции поиска одиночных символов и последовательностей в заданной строке.
3 Разработать программу.
4 Набрать программу на компьютере, отладить её и изучить работу операторов.
5 Получить результаты.
6 Оформить отчет.
7 Подготовиться к защите лабораторной работы, изучив вопросы по данной теме.