Имеется несколько возможностей для ввода и вывода строк, рассмотрим только основные из них.
С помощью форматируемого ввода-вывода. Форматируемый ввод и вывод можно осуществить с помощью функций scanf и printf из стандартной библиотеки stdio.h, которые были рассмотрены в лабораторной работе №1. Эти функции имеют существенный недостаток, так как останавливают ввод и вывод строки, не только если встретится нулевой символ, но и если встретится пробел. Поэтому являются не удобными при использовании.
С помощью неформатируемого ввода-вывода. Такой ввод и вывод осуществляется функциями gets и puts без указания формата из библиотеки stdio.h и имеют следующие прототипы:
char *gets(char *string);
int *puts(char *string);
Функция gets осуществляет ввод набора символов с клавиатуры в строку string, до тех пор, пока не будет нажата клавиша Enter. Возвращает адрес начала введенной строки или значение NULL, если произошла ошибка при вводе. Следует помнить, что функция gets не осуществляет выделение памяти под введенный набор символов и не отслеживает размер зарезервированной под него памяти.
Функция puts выводит строку string на монитор и переводит курсор на новую строку. Возвращает последний выводимый символ, которым обычно является символ новой строки '\n'.
Следующий пример иллюстрирует работу данных функций
#include <stdio.h>
#include <conio.h>
main()
{
char A[100];
char *B=new char [100];
char C[]="Ввод строки:";
char D[]="Вывод строки:";
puts(C);
gets(A);
puts(C);
gets(B);
puts(D);
puts(A);
puts(D);
puts(B);
getch();
}
С помощью потокового ввода-вывода. Наиболее распространенным способом ввода и вывода массивов символов является потоковый ввод-вывод, осуществляемый стандартной библиотекой классов, подключаемой к программе с помощью заголовочного файла iostream.h. Некоторые элементы потокового ввода – вывода были рассмотрены в лабораторной работе №1.
Если необходимо прочитать из входного потока (с клавиатуры) строку символов, содержащую пробелы, то можно воспользоваться перегруженными компонентными функциями get и getline объекта cin, которые имеют следующие прототипы
istream& get(char *string, int max_len, char=‘\n’);
istream& getline(char *string, int max_len, char=‘\n’);
Каждая из этих функций выполняет чтение последовательности символов с клавиатуры и перенос их в символьный массив string, задаваемый первым параметром. Второй параметр max_len определяет максимально допустимое количество вводимых символов. Третий параметр определяет ограничивающий символ при появлении, которого следует завершить ввод. Второй и третий параметры могут быть опущены, в этом случае размер вводимых символов не ограничен, а конец ввода будет осуществляться при нажатии клавиши Enter. Если из входного потока извлечены ровно max_len – 1 символов, а ограничивающий символ не встретился, то нулевой символ помещается после введенной последовательности автоматически, при этом массив, в который выполняется чтение, должен иметь длину не менее max_len символов. Различие между get и getline заключается в том, что в последней функции в конец строки помещается ограничивающий символ, который прервал ввод.
Потоковый вывод массива символов можно осуществить стандартным методом, а именно с помощью стандартного потока вывода на экран
cout << string;
Ниже представлен пример потокового ввода – вывода строк, подобный примеру, который был представлен выше с помощью функций gets и puts
#include <iostream.h>
#include <conio.h>
main()
{
char A[100];
char *B=new char [100];
char C[]="Ввод строки:";
char D[]="Вывод строки:";
cout << C;
cin.getline(A,100);
cout << C;
cin.getline(B,100);
cout << D << endl;
cout << A << endl;
cout << D << endl;
cout << B << endl;
getch();}
Также библиотека классов iostream.h содержит множество других удобных и интересных способов ввода и вывода, рассмотрении которых лежит вне данного учебного пособия.
Примеры программ, реализующие алгоритмы работы с массивами символов
Пример 1. Дана строка, содержащая текст. Определить слова, в которых количество согласных меньше, чем в предыдущем слове, а количество гласных больше, чем в последующем.
#include<iostream.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
main()
{
char *str=new char [100];
char *work=new char [100];
char *next,*current,*previous;
int gl_next,gl_current,sg_current,sg_previous;
int i,j;
int log;
char gl[]={128,133,136,142,147,155,157,158,159,
160,165,168,174,227,235,237,238,239,0};
char *s;
cin.get(str,100);
s=str;
do
{
while (s&&(*s==' '||*s==','||*s=='.'))
s++;
next=NULL;
current=NULL;
previous=NULL;
strcpy(work,s);
previous=strtok(work,". ,");
if (previous)current=strtok(NULL,". ,");
if (current)next=strtok(NULL,". ,");
if (previous&¤t&&next)
{
sg_previous=0;
sg_current=0;
gl_current=0;
gl_next=0;
i=0;
while (previous[i])
{log=(unsigned char) previous[i]>=128
&&
(unsigned char)previous[i]<=175;
log=log||((unsigned char)previous[i]>=224
&&
(unsigned char)previous[i]<=239);
if(log)
{
for(j=0;j<strlen(gl);j++)
if (previous[i]==gl[j]) break;
if(j==strlen(gl)) sg_previous++;
}
i++;
}
i=0;
while (current[i])
{log=(unsigned char)current[i]>=128
&&
(unsigned char)current[i]<=175;
log=log||((unsigned char)current[i]>=224
&&
(unsigned char)current[i]<=239);
if(log)
{
for(j=0;j<strlen(gl);j++)
if (current[i]==gl[j])
{
gl_current++;
break;
}
if(j==strlen(gl)) sg_current++;
}
i++;
}
i=0;
while (next[i])
{log=(unsigned char)next[i]>=128
&&
(unsigned char)next[i]<=175;
log=log||((unsigned char)next[i]>=224
&&
(unsigned char)next[i]<=239);
if(log)
for(j=0;j<strlen(gl);j++)
if (next[i]==gl[j])
{
gl_next++;
break;
}
i++;
}
log=sg_previous>sg_current&&gl_current>gl_next;
if (log) cout<<"Найденное слово: "<<current<<endl;
}
s=strpbrk(s,". ,");
}
while(next);
getch();
}
ЗАДАНИЕ I:
1. Дана строка, содержащая текст. Найти длину самого короткого и самого длинного слова.
2. Дана строка, содержащая текст, заканчивающийся точкой. Вывести на экран составляющие ее слова из трех букв.
3. Дана строка, содержащая текст. Определить, сколько в нем слов, заканчивающихся гласными буквами.
4. Дана строка, содержащая текст. Указать те слова, которые содержат хотя бы одну букву из звонких согласных.
5. Дана строка, содержащая текст. Найти в ней те слова, которые начинаются и оканчиваются одной и той же буквой.
6. Дана строка, содержащая текст. Вывести, в скольких словах этого текста встречаются гласные буквы. Ответ должен приводиться в грамматически правильной форме, например «а — 5 слов», «о — 3 слово» и т. д.
7. Дана строка, содержащая текст. Найти слова в тексте, которые можно составить из первого и последнего слова (буквы можно использовать не более одного раза).
8. Дана строка, содержащая текст в виде чисел, записанных в римской нотации, и разделенных знаками препинания. Найти самое наибольшее число.
9. Дана строка, содержащих текст из двух предложений. Найти слова, которые встречаются в каждом из двух заданных предложений.
10. Дана строка, содержащая текст. Вывести слова в алфавитном порядке.
11. Дана строка, содержащая текст. Найти те буквы, которые встречаются в каждом слове и только один раз.
12. Дана строка, содержащая текст. Часто встречающаяся ошибка начинающих наборщиков — дважды записанное подряд слово. Обнаружить в тексте такие ошибки.
13. Дана строка, содержащая текст. Найти слова в тексте, которые являются анаграммами с первым или последним словом. Анаграммы – пара слов, при прочтении каждого из которых в обратном направлении образуется другое слово пары, например, (ПОЛК, КЛОП); (БАР, РАБ).
14. Дана строка, содержащая текст. В данном тексте найти самое наибольшее слово из тех, длина которых больше двух. (Пример: Варвар> Академия).
15. Один из способов идентификации автора литературного произведения — подсчет частоты вхождения отдельных слов. В заданном тексте найти наиболее часто встречающееся слово.
16. В русском языке, как правило, после букв Ж, Ч, Ш, Щ пишется И, А, У, а не Ы, Я, Ю. Проверить заданный текст на соблюдение этого правила и вывести слова с ошибками (с учетом исключений: ЖЮРИ, БРОШЮРА, ПАРАШЮТ).
17. «Латинизатор кириллицы»-. При интернет-общении с русской диаспорой в других странах часто возникают проблемы отсутствия кириллицы у зарубежных респондентов, а также слабое знание иностранных языков у соотечественников. Один из выходов — набор русских слов похожими по начертанию буквами латинского алфавита. Среди прописных русских букв таких насчитывается одиннадцать: А, В, Е, К, М, Н, О, Р, С, Т, X. В заданном тексте выбрать те русские слова, которые
без искажения могут быть написаны латинскими буквами.
18. Дана строка, содержащая текст. Найти слова в тексте, которые являются палиндромами с первым или последним словом. (Палиндром - это выражение, которое читается одинакова слева направо и справа налево).
19. Дана строка, содержащая текст. Найти слова, которые содержат только одну гласную букву.
20. Дана строка, содержащая текст. Найти те слова в тексте, перед которыми в последовательности находятся только меньшие (по алфавиту) слова, а за ними - только большие;
21. Дана строка, содержащая текст. Найти слова в тексте, которые встречаются в последовательности по одному разу;
22. Дана строка, содержащая текст. Найти симметричные слова в тексте.
23. Даны две строки, содержащие текст. Найти и распечатать самые длинные слова, общие для этих строк. Если нужных слов нет – сообщить об этом.
24. Дана строка, содержащая текст. Определить пары слов в строке, расстояние между которыми наименьшее. (Расстояние между словами – это количество позиций, в которых слова различаются. Например, расстояние между словами МАМА и ПАПА или МЫШКА и КОШКА равно двум).
25. Дана строка, содержащая текст. Определить слова в строке, в которых либо буквы упорядочены по алфавиту, либо каждая буква входит в слово не менее двух раз (т.е. слова типа МАМА и ПАПА).
26. Дана строка, содержащая текст. Составить частотный словарь текста. Вывести его по алфавиту, а справа от каждого слова – частоту, с которой оно встретилось.
27. Дана строка, содержащая текст. Определить слова с наибольшим количеством различных пар букв. (Например, в слове babacabacd 5 различных пар букв.)
28. Дана строка, содержащая текст. Найти слово в тексте, длина которого наиболее близко к средней длине всех слов в тексте.
29. Во введенном тексте указать слово, в котором доля гласных в отношении к согласным составляет примерно столько же, сколько во всем тексте.
30. Во введенном тексте найти слова, которые могут быть полностью составлены из других слов с помощью конкатенации. (Например, БАЛКОН=БАЛ+КОН).
31. Во введенном тексте найти группы слов, записанных одними и теми же буквами и отличающиеся только их порядком, т.е. перестановкой. (Например, КОМАР, КОРМА).
32. Дана строка, содержащая текст. Определить все слова, в которых использованы только буквы, имеющиеся в заданном слове.
33. Во введенном тексте определить самое длинное слово, в котором все буквы разные.
34. Даны две строки, содержащие текст. Для этих двух строк найти самую длинную общую подстроку. Пробелы и знаки препинания игнорировать, строчные и прописные буквы считать неразличимыми.
35. Дан текст, содержащий слова, разделенные пробелами. Определить, какие буквы в словах совпадают чаще: первые, последние или средние. Позиция средней буквы в слове определяется по формуле: позиция_средней_буквы=(длина_слова mod 2) +1.
36. Дан текст, содержащий слова из букв и цифр. Определить произведение чисел в каждом слове, а затем найти сумму получившихся чисел.
37. Даны две строки, содержащие текст. Найти самое длинное слово из тех слов, которые встречаются в обеих строках.
38. Даны две строки, содержащие текст. Найти самое короткое слово из тех слов, которые не повторяются в обеих строках.
39. Дана строка, содержащая текст. В данном тексте найти самое наименьшее слово из тех, которые содержат более одной гласной. (Пример: Балкон > Балка).
40. Дана строка, содержащая текст. Найти слова, в которых буквы распложены по алфавиту. (Например: Абель).
41. Дана строка, содержащая текст. Определить, длина каких слов больше, четных или нечетных.
42. Дана строка, содержащая текст. Найти слово с наименьшим количеством гласных из первой половины текста, и с наибольшим количеством из второй. Если количество слов нечетно, то среднее слово во внимание не брать.
43. Дана строка, содержащая текст. Определить слово с наибольшим количеством одинаковых букв.
44. Дана строка, содержащая текст. Найти слова, в которых присутствуют буквы первого слова, но не присутствуют буквы последнего слова.
45. Дана строка, содержащая текст. Определить букву, которая встречается в наименьшем количестве слов.
46. Дана строка, содержащая текст. Определить в тексте длины одинаковых слов и их количество.
47. Дана строка, содержащая текст. Найти слово с наибольшим количеством букв, которые не встречаются в других словах.
48. Дана строка, содержащая текст. Определить, расположены ли в тексте слова по алфавиту, и каким образом, по убыванию или возрастанию.
49. Дана строка, содержащая текст. Определить буквы, которые встречаются в четных словах и не встречаются в нечетных.
50. Дана строка, содержащая текст. Определить, расположены ли в тексте слова по убыванию или возрастанию своих длин.
ЗАДАНИЕ II:
1. Дана строка, содержащая текст. Преобразовать строку так, чтобы все буквы в словах были отсортированы по алфавиту.
2. Дана строка, содержащая текст. Преобразовать строку так, чтобы все слова в ней стали идентификаторами, слова состоящие только из цифр и слова, которые начинаются с цифры - удалить.
3. Дана строка, содержащая текст. Преобразовать строку таким образом, чтобы в ее начале были записаны слова, содержащие только цифры, потом слова, содержащие только буквы, а затем слова, которые содержат и буквы и цифры.
4. Дана строка, содержащая текст. Преобразовать строку таким образом, чтобы все слова в ней были напечатаны наоборот.
5. Дана строка, содержащая текст. Отредактировать заданное предложение, удаляя из него те слова, которые встречаются в предложении несколько раз.
6. Дана строка, содержащая текст. Отредактировать заданное предложение, удаляя из него все слова с нечетными номерами и переворачивая слова с четными номерами.
7. Дана строка, содержащая текст. Удалить из нее каждое слово нечетной длины.
8. Дана строка, содержащая текст. В каждом слове переставить его первую букву на место последней. При этом вторую, третью,..., последнюю буквы сдвинуть влево на одну позицию, то есть осуществить циклический сдвиг влево.
9. Перенос. Примем следующие правила переноса русских слов: в каждой из разделяемых частей должно быть более одной буквы, из которых хотя бы одна — гласная;
- нельзя разделять согласную и следующую за ней гласную;
- буквы И, Ь, Ъ считать согласными, но перенос последних допустим.
Преобразовать текст таким образом, что в каждом из вводимых слов были поставлены все возможные знаки переноса, например: СЕ-ЛЬ-С-КО-ХО-ЗЯЙ-С-Т-ВЕ-Н-НАЯ. Строчные и прописные буквы считать неразличимыми.
10. Дана строка, содержащая текст. Переставить слова в тексте так, чтобы каждое следующее слово начиналось с той буквы, на которую закончилось предыдущее. Первое слово оставить на месте.
11. Дана строка, содержащая текст. Расставить слова в соответствии с алфавитом.
12. Дана строка, содержащая текст. Изменить порядок букв в словах на противоположный.
13. Дана строка, содержащая текст. Преобразовать строку, содержащую эти же слова, но расположенные в обратном порядке.
14. Дана строка, содержащая текст. Преобразовать каждое слово в строке, удалив из него все последующие вхождения первых двух букв этого слова.
15. Дана строка, содержащая текст и число k (0 < k < 10). Зашифровать строку, выполнив циклическую замену каждой буквы на букву того же регистра, расположенную в алфавите на k-й позиции после шифруемой буквы (например, для k = 2 "А" перейдет в "В", "а" — в "в", "Б" — в "Г", "я" — в "б" и т.д.). Букву "ё" в алфавите не учитывать, знаки препинания и пробелы не изменять.
16. Дана строка-предложение. Зашифровать ее, поместив вначале все символы, расположенные на четных местах, а затем, в обратном порядке, все символы, расположенные на нечетных местах (например, строка "Программа" превратится в "ргамамроП").
17. Даны две строки, содержащие текст из чисел, разделенные пробелами. Сформировать третью строку из сумм чисел, соответствующих порядковому номеру в строках. Если в одной строке чисел меньше, чем в другой, т.е. числу одной строки не будет соответствовать по порядковому номеру число другой строки, то это число оставить без изменений. (Например: “123 34 56 7 89”, “2 45 90 8” -> “125 79 146 15 89”).
18. Дана строка, содержащая текст. Преобразовать строку, удалив из нее слова, которые состоят менее чем из трех букв.
19. Осуществить шифрование и дешифрование введенного текста. Шифрование произвести следующим образом: записать текст в матрицу по строкам, а затем переписать по спирали от центра. Количество строк и столбцов в матрице должно быть нечетным, а недостающие значения букв заполнить случайным образом.
20. Дана строка, содержащая текст. Преобразовать слова, отличные от последнего следующим образом:
а) перенести последнюю букву в начало слова;
б) оставить в слове только первые вхождения каждой буквы.
21. Дано целочисленное арифметическое выражение, записанное как строка, в десятичной системе счисления. Проверить правильность записи и вычислить значение этого выражения. Выражение записывается без скобок, операции выполняются в порядке их следования.
22. Даны две строки, содержащие текст. Выделить из первой строки все слова, начинающиеся с гласной буквы, а из второй строки все слова, начинающиеся с согласной буквы. Образовать новую строку, состоящую из выделенных слов, так чтобы первым было слово из второй строки, затем из первой, потом из второй и т.д.
23. Дана строка, содержащая фамилии и инициалы студентов. Преобразовать текст, оставив лишь фамилии. Также требуется напечатать список студентов с указанием для каждого количества его однофамильцев.
24. Дана строка, содержащая текст. Преобразовать текст следующим образом: заменить в каждом слове первую встреченную букву ‘a’ буквой ‘o’, удалив все остальные. Если в слове нет такой буквы, оставить его без изменений.
25. Дана строка, содержащая текст. Преобразовать текст, удалив из него все кратные рядом стоящие символы, оставив по одному. (Например: ПППОООГГОДДДАААА -> ПОГОДА).
26. Дана строка, содержащая текст. Преобразовать слова, удалив из них одну среднюю букву, если длина слова нечетная, или две средних, если длина четная.
27. Произвести объединение двух строк, т.е. создать третью строку, состоящую из всех слов принадлежащих первой строке и из всех слов принадлежащих второй строке, за исключением повторяющихся.
28. Произвести пересечение двух строк, т.е. создать третью строку, состоящую из слов принадлежащих одновременно и первой и второй строке.
29. Произвести разность двух строк, т.е. создать третью строку, состоящую из слов принадлежащих первой строке и не принадлежащих второй строке.
30. Реализовать шифр подстановки, с помощью квадрата Полибия. Алфавит исходного сообщения записывается в виде матрицы, и каждая буква сообщения кодируется парой чисел (строка, столбец). Произвести кодирование и декодирование исходного сообщения на основе матрицы-ключа. Закодированное сообщение должно быть представлено символьной строкой.
31. Реализовать многобуквенную систему шифрования, с помощью таблицы Вижинера. Выбирается слово-ключ, которое записывается с повторениями над буквами сообщения. Буква зашифрованного сообщения находится на пересечении строки (буквы исходного сообщения) и столбца (буквы ключа) в таблице Вижинера. Произвести кодирование и декодирование исходного сообщения на основе слова-ключа. Таблица Вижинера:
А | Б | … | Ю | Я |
Б | В | … | Я | А |
… | … | … | … | … |
Ю | Я | … | Ь | Э |
Я | А | … | Э | Ю |
32. Реализовать шифр Цезаря с ключом. Выбирается слово-ключ, которое записывается с повторениями над буквами сообщения. Занумеровать алфавит исходного сообщения и ключа. Номер буквы зашифрованного сообщения находится как сумма по модулю длины алфавита сообщения и ключа. Произвести кодирование и декодирование исходного сообщения на основе слова-ключа для алфавита из букв, знаков препинания и цифр.
33. Реализовать парный шифр. Ключом является фраза, содержащая не менее половины разных букв алфавита исходного сообщения. Подписывая под этими буквами буквы в алфавитном порядке, не вошедшие в ключ, получаем разбиение букв алфавита на пары. Кодирование - замена каждой буквы исходного сообщения на ее парную. Произвести кодирование и декодирование исходного сообщения на основе слова-ключа для алфавита из букв, знаков препинания и цифр.
34. Реализовать XOR-кодирование. Представить исходное сообщение и ключ в двоичном виде. Кодирование и декодирование происходит следующим образом: каждый бит сообщения преобразуется с использованием нового бита ключа по следующему правилу: 0+0=0, 0+1=1, 1+0=1, 1+1=0. Произвести кодирование и декодирование исходного сообщения на основе слова-ключа для алфавита из букв, знаков препинания и цифр.
35. Реализовать шифрование с помощью постолбцовую транспозицию. Выбирается слово-ключ. Формируется матрица, с числом столбцов равным числу букв в ключе. Исходное сообщение посимвольно заносится в эту матрицу. Затем столбцы этой матрицы переставляются в соответствии с алфавитным порядком букв слова-ключа. Произвести кодирование и декодирование исходного сообщения на основе слова-ключа для алфавита из букв, знаков препинания и цифр.
36. Дана строка, содержащая текст. Преобразовать все слова следующим образом: переставить первую букву на место последней, вторую на место первой, третью на место второй и т.д., т.е. осуществить циклический сдвиг влево.
СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ:
1. | Подбельский В.В. Язык Си++. Учебное пособие. – М: Финанасы и статистика, 1992. – 600 с. |
2. | Громов Ю. Ю., Татаренко С. И. Программирование на языке СИ: Учебное пособие.- Тамбов, 1995.- 144 с. |
3. | Дерк Луис. Borland C++. Справочник / Пер. с нем. – М.: “Издательство БИНОМ”, 1997. – 560 с.: ил. |
4. | И.Г. Семакин, А.П. Шестаков Основы программирования: Учебник для сред. проф. образования. – 2-е изд., стер. – М.: Издательский центр “Академия”, 2003. – 432 с. |
5. | Д.А. Гуденко, Д.В. Петроченко Сборник задач по программированию. – СПб.: Питер, 2003. – 475 с.: ил. – (Серия “Компас”). |
6. | А.В. Крячков, И.В. Сухинина, В.К. Томшин Программирование на С и С++. Практикум: Учеб. пособие для вузов. – 2-е изд., исправ. – М.: Горячая линия. – Телеком, 2000. – 344 с.: ил. |
7. | А. Юркин Задачник по программированию. – СПб.: Питер, 2002. – 192 с. |
ПРИЛОЖЕНИЕ 1
СТАНДАРТНЫЕ БИБЛИОТЕКИ ФУНКЦИЙ ЯЗЫКА СИ
Таблица П1.1
Дата: 2019-02-02, просмотров: 571.