Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
сборник лабораторных работ.doc
Скачиваний:
6
Добавлен:
17.11.2019
Размер:
5.38 Mб
Скачать

16Краткая теоретическая справка

Работа с символами и строками в языке C подробно рассмотрена в конспекте лекций.

В языке C нет отдельного типа для представления строк. Строка – это последовательность байт, завершаемая байтом с кодом '\0'. В языке С длина строки, в отличие от буфера, нигде не хранится и может быть получена в цикле сканирования строки слева направо. Нулевой байт также считается принадлежащим строке, поэтому строка из n символов требует (n+1)*sizeof(char) байт памяти.

Стандартная библиотека содержит ряд функций для работы со строками.

Файл string.h содержит прототипы функций обработки строк.

Файл stdlib.h содержит прототипы функций преобразования типов (из внутреннего представления – переменной – во внешнее – строку, и наоборот).

Файл ctype.h содержит прототипы функций проверки и преобразования символов.

Список функций можно найти в справочной системе системы программирования, в документации к системе программирования, в конспекте лекций или в учебнике (Например, С.С. Фомин, В.В. Подбельский "Программирование на Си").

17Индивидуальные задания

Задача 1. Дана строка, содержащая некоторый текст (включая пробелы и знаки препинания). Под словом понимается набор символов, не содержащий пробелов и ограниченный пробелами или началом/концом строки. Требуется решить задачу, используя функции стандартной библиотеки.

Формулировка задачи

1

Найти в тексте все слова, начинающиеся на заданную букву русского алфавита. Определить их количество.

2

Провести частотный анализ текста. Построить столбиковую гистограмму (например, с помощью символов '*'), отражающую количество слов в тексте, начинающихся на буквы заданного алфавита (здесь алфавит – набор символов).

3

Провести частотный анализ текста. Построить столбиковую гистограмму (например, с помощью символов '*'), отражающую количество слов в тексте, заканчивающихся на буквы заданного алфавита (здесь алфавит – набор символов).

4

Провести частотный анализ текста. Построить столбиковую гистограмму(например, с помощью символов '*'), отражающую частоту появления букв заданного алфавита в тексте (здесь алфавит – набор символов).

5

Найти в тексте все слова, равные заданному. Подсчитать их количество.

6

Организовать принцип «Поиск и замена слов», т.е. найти в тексте все слова заданного вида, и заменить эти слова на новое заданное слово.

7

Описать функцию FillStr(S,C,Len), заполняющую строку S длины Len повторяющимися копиями строки-шаблона C (последняя копия строки-шаблона может входить в результирующую строку частично).

8

Все слова текста заключить в кавычки. Знаки препинания должны остаться за пределами кавычек.

9

Заменить все вхождения четных цифр на символ '+', а нечетные – на символ '–'.

10

Заменить все вхождения цифр на последовательность символов '+' (количество символов равно значению цифры), заключенных в круглые скобки. Например, для строки "Дом 43, кв. 22" должно получиться "Дом (++++)(+++), кв. (++)(++)".

11

Заменить все числа на фразу "(здесь было число)". Например, для строки "Дом 43, кв. 22" должно получиться "Дом (здесь было число), кв. (здесь было число)".

12

Заменить символ '@' на фразу "_собачка_".

13

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

14

Часто встречающаяся ошибка начинающих наборщиков – дважды записанное слово. Обнаружить такие ошибки в тексте.

15

В строке записано выражение вида <число><знак><число>, где <знак> – знак арифметической операции ('+', '-', '/', '*'), <число> – целое неотрицательное число. Вычислить значение выражения.

16

Задано целое число n – основание системы счисления(2≤n≤16). В строке записано выражение вида <число><знак><число>, где <знак> – знак арифметической операции ('+', '-', '/', '*'), <число> – целое неотрицательное число, заданное в n-ичной системе счисления. Вычислить значение выражения (в 10-ичной системе счисления).

17

Удалить лишние пробелы (в том числе в начале и в конце предложения), оставив в строке по одному пробелу между словами.

18

"Перевернуть" в строке все слова. (Например: "Жили были дед и баба" – "илиЖ илиб дед и абаб").

19

В строке, содержащей абзац текста, найти концы предложений, обозначенные символом "точка". В следующих за ними словах первую строчную букву заменить на прописную. Между словами количество пробелов может быть любым.

20

Заменить в строке принятое в С обозначение символа с заданным кодом в восьмеричной СС (например, \101) на сам символ (в данном случае – A).

21

Найти слово, начинающееся с самой младшей латинской буквы и возвратить индекс его начала.

22

Удалить из строки комментарии вида "/* ... */". Игнорировать вложенные комментарии.

23

Заменить в строке символьные константы вида 'А' на соответствующие шестнадцатеричные (т.е. 'А' на 0x41, в константе использовать 2 цифры для представления байта).

24

Заменить в строке все цифры соответствующим повторением следующего за ними символа, если этот символ не является цифрой (например "abc5xacb14y" – " abcxxxxxacb1yyyy").

25

Найти самое короткое и самое длинное слово в тексте.

26

Уровнем комментированности текста будем считать отношение объема комментариев к объему всего текста. Определить уровень комментированности данного текста (язык программирования С, используются комментарии вида "/* ... */").

27

Подсчитать количество слов, содержащих цифры.

28

Сравнить две строки: 1) по длине, 2) по алфавиту, 3) с какого символа различаются строки, 4) есть ли общие символы, 5) является ли одна строка частью другой.

29

Удалить из текста все фразы Sf (вводятся пользователем, могут повторяться).

30

Удалить в тексте все фразы Sf (вводятся пользователем, могут повторяться) на фразу "удалено модератором".

Задача 2. Дана строка, содержащая некоторый текст (включая пробелы и знаки препинания). Под словом понимается набор символов, не содержащий пробелов и ограниченный пробелами или началом/концом строки. Требуется решить задачу, без использования стандартных функций, описанных в string.h или stdlib.h.

Формулировка задачи

1

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

2

Написать и протестировать функцию StoI(n, str), которая преобразует строку десятичных цифр в целое число.

3

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

4

Написать и протестировать функцию Delete(s1, s2), которая удаляет из строки s1 все символы, встречающиеся в строке s2.

5

Морзянка. Вводимый с клавиатуры или файла текст перевести в последовательность точек и тире с помощью азбуки Морзе.

Для справки – азбука Морзе:

А, A

.-

Б, B

-...

В,W

.--

Г, G

--.

Д, D

-..

Е, Ё, E

.

Ж, V

...-

З, Z

--..

И, I

..

Й, J

.---

К, K

-.-

Л, L

.-..

М, M

--

Н, N

-.

О, O

---

П, P

.--.

Р, R

.-.

С, S

...

Т, T

-

У, U

..-

Ф, F

..-.

Х, H

....

Ц, C

-.-.

Ч

---.

Ш

----

Щ, Q

--.-

Ъ

.--.-.

Ы, Y

-.--

Ь, X

-..-

Э

...-...

Ю

..--

Я

.-.-

1

.----

2

..---

3

...--

4

....-

5

.....

6

-....

7

--...

8

---..

9

----.

0

----

.

.-.-.-

,

--..--

:

---...

?

..--..

‘,’

.----.

-

-....-

/

-..-

,

-.--.-

6

Дан текст, записанный азбукой Морзе, буквы разделены пробелом, слова - двумя или более пробелами. Перевести его в обычную запись.

7

В заданном тексте найти самое длинное слово.

8

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

9

В имеющемся тексте найти пары слов (анаграммы), при прочтении каждого из которых в обратном направлении образуется другое слово пары, например, (ПОЛК, КЛОП); (БАР, РАБ).

10

В русском языке, как правило, после букв Ж, Ч, Ш, Щ пишется И, А, У, а не Ы, Я, Ю. Проверить заданный текст на соблюдение этого правила и исправить ошибки (с учетом исключений: ЖЮРИ, БРОШЮРА, ПАРАШЮТ).

11

По правилам пунктуации пробел может стоять после, а не перед каждым из следующих знаков: . , ; : ! ? ) ] } ... ; перед, а не после знаков: ( [ {. Заданный текст проверить на соблюдение этих правил и при необходимости исправить. Вместо пробела может быть перевод строки или знак табуляции.

12

Преобразовать вещественное число из внешней формы представления (строки) во внутреннюю (переменную типа double).

13

Вводимый с клавиатуры русский текст перевести на транслит.

А

Б

В

Г

Д

Е

Ж

З

И

Й

К

Л

М

Н

О

П

Р

С

Т

У

Ф

Х

Ц

Ч

Ш

Щ

Ъ

Ы

Ь

Э

Ю

Я

A

B

V,W

G

D

E

Zh

Z

I

J

K

L

M

N

O

P

R

S

T

U

F

H

C,Tc

Ch

Sh

Cch

`

Y

'

]

Ju,Yu

Ja,Ya

14

Перевести английский текст в русскую запись по правилам транслитерации.

15

Описать функцию IsIdent(S) целого типа, проверяющую, является ли строка S допустимым идентификатором языка C. При утвердительном ответе возвращается 0. Если S является пустой строкой, то возвращается –1, если строка начинается с цифры, то возвращается –2. Если S содержит недопустимые символы, то возвращается номер первого недопустимого символа.

16

Найти в строке самую внутреннюю пару скобок и возвратит индекс открывающейся, например “a(bb(c(d)e(f ( ggg)h)))(d)”. Предполагается, что данные корректны (хотя можно выполнить проверку).

17

Найти в тексте все слова, которые содержат более чем заданное число букв.

18

Все слова текста заключить в кавычки. Знаки препинания должны остаться за пределами кавычек.

19

Найти в тексте все слова, которые являются палиндромами, т.е. читаемыми в прямом и обратном направлении (например, «шалаш», «кок» - палиндромы).

20

Найти в тексте все слова, равные заданному. Подсчитать их количество.

21

Найти в строке и удалить из нее последовательности повторяющихся символов (например, "abcxxxxxacbyyyyyyyyyyyyyyyz" - "abcacbz").

22

Найти в тексте слова, которые содержат хотя бы один слог «НА», «ПРИ», «ЗА».

23

Перевести число, записанное римскими цифрами, в десятичную систему счисления, и наоборот. Проверить правильность записи римского числа.

24

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

25

Описать функцию FillStr(S,C,Len), заполняющую строку S длины Len повторяющимися копиями строки-шаблона C (последняя копия строки-шаблона может входить в результирующую строку частично).

26

Описать функцию UpCase(S), преобразующую все строчные буквы строки S в прописные (остальные символы строки S не изменяются).

27

Описать функцию PosLast(subS,S), возвращающую номер позиции, с которой в строке S содержится последнее вхождение подстроки subS. Если в строке S отсутствуют подстроки subS, то функция возвращает -1.

28

Описать функцию WordN(S,k,Sres), возвращающую Sres – k-е слово строки S. Если количество слов в строке меньше k, то функция возвращает пустую строку. Используя эту функцию, выделить из данной строки S слова с номерами k1, k2, k3.

29

Описать функцию NumberToN(S,n,Sres) Перевести целое число, записанное в строке S в n-ичную систему счисления (2≤n≤16), результат записать в строку Sres без начальных нулей.

30

Описать функцию NumberTo10(S,n,Sres) Перевести целое число, записанное в строке S в n-ичной системе счисления (2≤n≤16) в десятичную систему счисления, результат записать в строку Sres без начальных нулей.

Тема: Работа со структурами

Цели: получение навыков обработки структур.