Главная страница
Случайная страница
КАТЕГОРИИ:
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Примеры программирования
Пример 7.13. Дана строка символов. Вывести на экран четыре самых коротких слова строки.
#include < string.h>
#include < iostream>
#include < conio.h>
using namespace std;
void main(void)
{
char str[80];
| // str - исходная строка
| clrscr();
| // Очистить экран
| cout< < " Введите строку > ";
|
| cin.get(str, 80);
| // Ввести строку
| char word[10][20];
| // word - массив слов
| int k=0;
| //k - количество слов в строке str
| /* Формирование массива слов word из строки str */
for(int i=0; i< strlen(str); i++)
| // Пока не конец строки
| {
|
| while(str[i]==' ') continue;
| // Пропуск пробелов в str
| int j=0;
| // Количество символов в слове
// word[k]
| /* Пока текущий символ не пробел и не нуль-символ */
while(str[i]! =' ' & & str[i]! ='\0')
|
| word[k][j++]=str[i++];
| // Формирование k-го слова в
//массиве word
| word[k++][j]='\0';
| // Нуль-символ в конец слова
| }
|
| | | | | /* Сортировка слов в порядке увеличения их длины */
char* sh_word=new char[20];
| // sh_word - короткое слово из //неотсортированных слов
| for(i=0; i< k; i++)
| // Цикл по всем словам
// массива word
| {
|
| strcpy(sh_word, word[i]);
| // Пусть i-е слово будет
// самым коротким
| int num=i;
| // Номер короткого слова в
// массиве = i
| /* Поиск короткого слова среди неотсортированных в массиве слов */
for(int j=i; j< k; j++)
|
| /* Если длина текущего слова меньше, чем длина короткого слова */
| if(strlen(word[j])< strlen(sh_word))
|
| { /*Короткое слово - это текущее слово */
|
| | strcpy(sh_word, word[j]);
|
| num=j;
| // Номер короткого слова в //массиве = j */
| }
|
| strcpy(word[num], word[i]);
| // Обмен местами i-го слова и //короткого слова
| strcpy(word[i], sh_word);
|
| }
|
| for(i=0; i< 4; i++)
| // Вывод на экран четырех
| cout< < word[i]< < " ";
| // самых коротких слова
| delete[ ] sh_word;
| //Освобождение динамической
//памяти
| getch();
| // Ожидание нажатия ENTER
| }
|
| | | | | |
Результат выполнения программы.
Введите строку > один два три четыре пять шесть
два три один пять
Пример 7.14. Дана строка символов, разделенных пробелами, точками, запятыми. Сформировать новую строку, содержащую слова исходной строки, поставив перед самыми короткими словами в строке символ * (звездочка).
/* Директивы препроцессору о подключении заголовочных файлов */
#include < string.h>
#include < iostream>
#include < conio.h>
using namespace std;
/* Начало программы */
void main(void)
{
char* str = new char[80];
| // str - исходная строка
| char* word = new char[20];
| // word - слово в строке
| char* newstr = new char[80];
| // newstr - новая строка
| cout< < " Введите строку > ";
|
| cin.get(str, 80);
| // Ввод строки
|
| /* Пусть длина самого короткого слова = длине строки */
| int minlen = strlen(str);
|
|
| // stroka = str + 'пробел'
| char* stroka = new char[strlen(str)+2];
|
| strcpy(stroka, str);
|
| strcat(stroka, " ");
|
| word=strtok(str, ",.? ");
|
| while(word)
| // word - первое слово в строке
| {
|
| | | | | /* Если длина короткого слова меньше длины текущего слова, то длина короткого слова = длине текущего слова */
if(minlen> strlen(word)) minlen=strlen(word);
|
| word=strtok(NULL, ",.? ");
| // Следующее слово
| /* Выделение динамической памяти */
|
| word=new char[20];
|
| | | | | /* Формирование новой строки */
int n;
|
| newstr[0]='\0';
| // newstr - пустая строка
| str[0]='\0';
| // str - пустая строка
|
| // word указывает на символ-разделитель в stroka
| word=strpbrk(stroka, ",.? ");
|
| while(word! =NULL)
| // Цикл по всем словам
| {
|
| n=word-stroka;
| // n - длина слова
| strncpy(str, stroka, n);
| // str - текущее слово
| str[n++]='\0';
|
| | | | | /* Если длина текущего слова равна длине самого короткого слова, то в newstr заносим символ '*' */
if(strlen(str)==minlen) strcat(newstr, " *");
|
| strcat(newstr, str);
| // В newstr записывается
// текущее слово
| strcat(newstr, " ");
| // В newstr записывается пробел
| stroka+=n;
| // Анализ следующей части строки
| word=strpbrk(stroka, ",.? "); // Поиск символа разделителя
// в stroka
| }
|
| cout< < newstr;
| // Вывод новой строки на экран
| }
|
| | | | | Результат выполнения программы.
Введите строку > один, два три, еще три, еще один
один *два *три *еще *три *еще один
Пример 7.15. Дана строка. В строке имеются символы '*'. Подсчитать количество подстрок, заключенных между символами '*'. Определить самую длинную подстроку.
/* Директивы препроцессору о подключении заголовочных файлов */
#include < string.h>
#include < iostream>
#include < conio.h>
using namespace std;
/* Начало программы */
void main(void)
{
char* str = new char[80];
| // str - исходная строка
| cout< < " Введите строку > ";
|
| cin.get(str, 80);
| // Ввод строки
| int count = 0,
| // Количество подстрок
| maxlen = 0,
| // Длина наибольшей подстроки
| pos = 0,
| // Номер текущей позиции в str
| j = 0;
| // Счетчик символов в подстроке
| char* substr = new char[80];
| // substr - текущая подстрока
| char maxstr[80];
| // maxstr - наибольшая подстрока
| maxstr[0]='\0';
| // maxstr - пустая строка
| for(int i=0; i< strlen(str); i++)
| // Цикл - по всей исходной
// строке
| if(str[i]=='*')
| // Если текущий символ = '*'
| { /* Формирование подстроки */
|
| substr[j]='\0';
|
| count++;
| // Увеличение количества
// подстрок на 1
| if(count> 1)
| // Если это не первый символ '*'
| {
|
| if(maxlen< =i–pos)
|
| | | | | /* Если длина наибольшей подстроки меньше или равна длине текущей подстроки, то длина наибольшей подстроки = длине текущей подстроки, а наибольшая подстрока = текущей подстроке */
{
|
| maxlen=i–pos;
|
| strcpy(maxstr, substr);
|
| }
|
| }
|
| substr[0]='\0';
| // substr - пустая строка
| pos=i+1;
| //Анализ следующей части
// исходной строки
| j=0;
| // Установка начальных значений
| }
|
| | | | | /* Если текущий символ не '*', то переписываются текущие символы из исходной строки в подстроку */
else substr[j++]=str[i];
|
| |
| // Вывод результатов
| | cout< < " Количество подстрок > ", – –count< < endl;
|
| | cout< < " Наибольшая подстрока > " < < maxstr< < ", длиной " < < maxlen;
|
| getch();
| // Ожидание нажатия ENTER
| | }
|
| | | | | | | |
Результат выполнения программы.
Введите строку > один *два и три *еще три *еще один
Количество подстрок > 2
Наибольшая подстрока > два и три, длиной 10
Контрольные вопросы
1. Что представляют собой строки?
2. Каким образом строки описываются и определяются?
3. Какие функции используются для ввода строки и чем они отличаются друг от друга?
4. Какие функции используются для вывода строки?
5. Каким образом можно выделить слово из строки?
6. Где находится описание прототипов функции обработки строк?
Варианты заданий
Номер варианта
| Задание
| 1, 16
| Дана строка слов, разделенных пробелами. Сформируйте новую строку, вставив перед каждым вхождением слова " and" запятую. Определите, сколько в строке симметричных слов.
| 2, 17
| Дана строка слов, разделенных пробелами. Сформируйте новую строку, вставив перед каждым вхождением слова " no" запятую. Подсчитайте количество подстрок между запятыми. Определите, сколько в этой строке слов, у которых первая буква содержится в слове более одного раза.
| 3, 18
| Дана строка слов. Сформируйте новую строку, удалив пробелы, с которых может начинаться строка, а каждую внутреннюю группу пробелов замените одним пробелом. Подсчитайте количество слов в данной строке и количество слов, у которых первая и последняя буквы совпадают.
| 4, 19
| Дана строка слов, разделенных пробелами. Определите количество слов, которые встречаются более одного раза. Сформируйте строку из неповторяющихся слов.
| 5, 20
| Дана строка слов, разделенных пробелами. Сформируйте строку из неповторяющихся слов, расположив их в алфавитном порядке.
| 6, 21
| Дана строка слов, разделенных пробелами, запятыми, точками. Сформируйте новую строку из пяти самых длинных слов. Определите количество слов, начинающихся первой буквой алфавита (русского или латинского).
| 7, 22
| Дана строка символов и некоторый символ sym. Сформируйте новую строку, вставив после каждого вхождения символа sym пробел. Подсчитайте количество различных слов в образовавшейся строке.
| 8, 23
| Дана строка символов и некоторый символ sym. Сформируйте новую строку, вставив после каждого вхождения символа sym запятую. Определите самое длинное слово в строке.
| 9, 24
| Дана строка слов, разделенных пробелами и запятыми. Подсчитайте количество подстрок (заключенных между запятыми) в строке. Определите длину самого короткого слова.
| 10, 25
| Дана строка слов, разделенных пробелами и запятыми. Подсчитайте количество слов в строке и сформируйте новую строку из самых длинных слов подстрок (заключенных между запятыми).
| 11, 26
| Дана строка символов, представляющих собой арифметическое выражение. Порядок операций определен слева направо. Подсчитайте результат данного выражения.
| 12, 27
| Дана строка слов, разделенных пробелами. Сформируйте новую строку, заменив каждую группу внутренних пробелов одним пробелом. Оставьте в строке только первые вхождения слов. Определите самое короткое слово.
|
Номер варианта
| Задание
| 13, 28
| Дана строка слов, разделенных пробелами, запятыми, точками. Сформируйте новую строку из трех самых коротких слов. Определите количество слов, заканчивающихся последней буквой алфавита (русского или латинского).
| 14, 29
| Дана строка слов. Сформируйте новую строку, вставив перед каждым из слов " а" и " но" запятую. Подсчитайте количество подстрок, разделенных запятыми. Сформируйте строку из слов, с которых начинаются подстроки.
| 15, 30
| Дана строка слов. Сформируйте новую строку, вставив перед каждым из слов " а" и " но" запятую. Определите самую короткую подстроку и слово, с которого она начинается.
|
|