Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Программирование на языке Си

..pdf
Скачиваний:
15
Добавлен:
12.11.2023
Размер:
17.16 Mб
Скачать

514

Программирование на языке Си

два слова из базы, после чего - опять слово из предложения и т.д. "База" - набор слов, допустимых при выполнении програм­ мы, либо набор пар слов, как в приведенном ниже примере.

2. Напишите дешифратор.

Допустимые символы - прописные русские буквы; символразделитель

П рим ер .

Шифруемое предложение:

ДЕЛ0_ЗАК0НЧЕН0_ХАДС0Н_РАССКАЗАЛ_ВСЕ_БЕРЕГИТЕСЬ

База шифра:

С_ДИЧЬЮ_Я_ПОЛАГАЮ_ГЛАВА_ПРЕДПРИЯ ТИЯ_ ПО_СВЕДЕНИЯМ_0_МУХОВОЙКАХ_ФАЗАНЬИХ_КУРОЧЕК

Результат шифровки:

С_ДИЧЬЮ_ДЕ Л0_Я_Л0ЛАГАЮ_3АКОНЧЕНО_

ГЛАВА_ПРЕДПРИЯТИЯ_ХАДСОН_ПО_СВЕДЕНИЯМ_ РАССКАЗМ1_0_МУХ0В0ЙКАХ_ВСЕ_ ФАЗАНЬИХ_КУРОЧЕК_БВ РЕГИТЕСЬ

Вариант 20.

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

буквами, например

а -

э, b -

б,

с - с, d - д, е - э, f —ф, g - г,

h - (пустой символ),

i -

и, j -

ж

и т.д. С клавиатуры задается не­

которое предложение на английском языке. (Слова разделяются символами подчеркивания: Программа выводит "по ее мне­ нию" правильный вариант произношения каждого слова. Если пользователь соглашается с вариантом произношения, предло­ женным программой, он нажимает <Enter>. Если не соглашается^ - вводит свой вариант произношения.

Допустимые символы - прописные английские буквы; сим­ вол-разделитель

П рим ер .

кавычках - выводимые программой произношения)

Введите предложение на английском языке: ТНIS_IS_A_TABLE

THIS - "тис" -> Зис

Глава 10. Задачи по программированию

515

IS

- "ис"

-> из

 

А- "э" ->

TABLE - "тэбле" -> тэйбл

ТНIS_IS_A_TABLE -> Зис из э тэйбл

Вариант 21.

Имеется некоторая база данных, в которой некоторым анг­ лийским словам поставлены в соответствие их русские эквива­ ленты, например "THIS" - "ЭТО", "IS" - "", "А" - "", "TABLE" - "СТОЛ" и т.д. С клавиатуры задается некоторое предложение на английском языке (слова разделяются символами подчеркива­ ния: Программа ищет каждое слово у себя в базе данных и выдает его перевод. Если введенное слово в базе не обнаружено, в результирующую строку записывается исходное английское слово.

Допустимые символы - прописные английские буквы; сим­ вол-разделитель

Пример выполнения программы:

Введите предложение на английском языке: ТНIS_IS_A_TABLE

Перевод: ЭТО_СТОЛ

Если, например, в базе нет перевода слова TABLE, результат выполнения программы должен быть таким:

Введите предложение на английском языке: ТНIS_IS_A_TABLE

Перевод: 3T0_TABLE

Вариант 22.

С клавиатуры вводится исходная строка. Если в строке име­ ются цифры, то она считается зашифрованной и нужно выпол­ нять пункт 2 этого задания.

1. Если исходная строка не содержит цифр (т.е. символов с кодами 48(0x)-f57(0x)), то она по определению считается неза­ шифрованной. Вам необходимо заменить все символы с кодами 33(0x21)-Н?9(0х63) на их двузначные коды.

33*

516

Программирование на языке Си

Символы с другими кодами выводятся без изменения. Допустимые символы - символы с кодами от 33(0x21) до

255(0xFF), за исключением цифр (48(0x30)^57(0x39)).

Пример выполнения программы:

Введите исходную строку: Hello! Строка не зашифрована. Шифр: 72е11оЗЗ

2. Если исходная строка содержит цифры, то она по опреде­ лению считается зашифрованной. Напишите дешифратор. При невозможности дешифрации напечатайте сообщение об ошибке и укажите место в строке, где произошла ошибка.

Примерный диалог с программой:

Введите исходную строку: 72е11оЗЗ Строка зашифрована. Расшифровка: Hello!

Введите исходную строку: 72е131оЗЗ Строка зашифрована.

Ошибка в исходной строке: 72е13

Вариант 23.

Из двух заданных с клавиатуры слов составить различные виды кроссвордов. При невозможности составить кроссворд (во введенных словах нет ни одной одинаковой буквы) напечатать сообщение об ошибке.

Допустимые символы - прописные русские буквы.

Пример выполнения программы:

Введите два слова, разделенных пробелом:

КАРАБАС БАРАБАС

 

Кроссворд 1:

Кроссворд

Б

Б

КАРАБАС

А

Р

Р

А

А

Б

Б

А

КАРАБАС

С

С

Глава 10. Задачи по программированию

517

Вариант 24.

С клавиатуры вводится предложение, слова в котором разде­ лены символом подчеркивания Подсчитайте число вхожде­ ний в предложение используемых букв, запишите результат в строку (парами: буква - цифра) и напечатайте ее.

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

Введите предложение: КАРАБАС_БАРABAC Результат: А6БЗК1Р2С2

Вариант 25.

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

Допустимые символы — прописные русские буквы.

Пример выполнения программы:

Введите количество слов: 7 Введите слова, разделенные пробелами:

ТИНА КОМА ПЛОТ КАМА ОМАР МАЗ ТОК

Результат:

КОМАР

ПЛОТИНА

КАМАЗ

Вариант 26.

Склавиатуры вводятся четыре массива слов:

1)существительные в именительном падеже единственного числа (СТОЛЯР-КРАСНОДЕРЕВЩИК, ТОРМОЗ, ДИСКОВОД, ...);

2)глаголы несовершенного вида в 1-м лице единственного

числа (ЕСТ, САЖАЕТ, ТРАВИТ, ВАРИТ, КОСИТ, ПИЛИТ, ...);

3) качественные прилагательные во множественном числе

(ЯДОВИТЫЕ, ПРЕКРАСНЫЕ, КОШМАРНЫЕ, НЕВЗРАЧНЫЕ, УБОЙНЫЕ, УБОГИЕ, ...);

4) существительные в винительном падеже множественного числа (КОЛОНКИ, ДИСКЕТЫ, ВЕТВИ, ЗАБОРЫ, БАНКИ,...).

518

Программирование на языке Си

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

Допустимые символы - прописные русские буквы.

П ри ме р д и а л о г а с пр ог раммо й:

Введите массив существительных: СТОЛЯР-КРАСНОДЕРЕВЩИК ТОРМОЗ ДИСКОВОД

Введите массив глаголов: ЕСТ САЖАЕТ ТРАВИТ ВАРИТ КОСИТ ПИЛИТ

Введите количество предложений: 2

Результат:

СТОЛЯР-КРАСНОДЕРЕВЩИК ТРАВИТ ЯДОВИТЫЕ ЗАБОРЫ. ДИСКОВОД ПИЛИТ НЕВЗРАЧНЫЕ ДИСКЕТЫ.

Вариант 27.

С клавиатуры вводится предложение. Выведите это предло­ жение на экран, расположив буквы "по вашей любимой функ­ ции" (экспонента, квадратный корень и т.п.).

Допустимые символы - прописные русские буквы; знаки препинания.

П рим ер (выбрана синусоида):

БАТЬ

 

ОЛЕБ

Л_ВЕ

ЛИ

ЛЕ

СЯ

 

АТ

ЩА

О

_

_

И

Е

К

К

 

С

В

 

 

к

Я

 

Я

А

I

 

ол

ЬС

 

3

 

 

ЕБАТ

 

ТАК

 

ИНУС

Глава 10. Задачи по программированию

519

Вариант 28.

С клавиатуры вводится предложение, слова в котором разде­ лены символом подчеркивания Напечатайте все предложе­ ния, которые получаются при перестановке слов исходного предложения.

Допустимые символы - прописные русские буквы; символ - разделитель

Пример.

Исходное предложение: КОШКА_СЬЕЛА_МЬШКУ

Перестановки: СЪЕЛА_КОШКА_МЫШКУ МЫШКУ_СЬЕЛА_КОШКА КОШКА_МЫШКУ_СЬЕЛА

Вариант 29.

С клавиатуры или из файла вводится текст - некоторая ста­ тья. После этого задается содержимое письма, которое вы хоти­ те "скроить" из текста предложенной статьи. Вам необходимо выяснить, можно ли слова письма "вырезать" из текста статьи.

Если некоторое слово "вырезать" возможно - напечатать его большими буквами, если нет - маленькими. Границы "вырезов" отмечать символом

Допустимые символы - прописные русские буквы; символыразделители или пробел).

Пример.

Текст:

ЕСЛИ КТО-НИБУДЬ БУДЕТ СТАРАТЬСЯ ВНУШИТЬ ВАМ, ЧТО ТА ОТРАСЛЬ ПРОМЫШЛЕННОСТИ, В КОТОРОЙ ВЫ ЛИЧНО ЗАИНТЕРЕСОВАНЫ, НАХОДИТСЯ ПОД ЗАЩИТОЙ ПРОТЕКЦИОННЫХ ТАРИФОВ, ДЕРЖИТЕСЬ ПОДАЛЬШЕ ОТ

ТАКИХ ЛЮДЕЙ, ИБО РАССУДОК ДОЛЖЕН ВАМ ПОДСКАЗАТЬ, ЧТО ПОДОБНАЯ СИСТЕМА В КОНЦЕ КОНЦОВ ПОДОРВЕТ НАШ ИМПОРТ И НАРУШИТ НОРМАЛЬНУЮ ЖИЗНЬ НАШЕГО ОСТРОВА, ИНТЕРЕСЫ КОТОРОГО ДОРОГИ ВСЕМ НАМ.

Письмо:

ЕСЛИ РАССУДОК И ЖИЗНЬ ДОРОГИ ВАМ ДЕРЖИТЕСЬ ПОДАЛЬШЕ ОТ ТОРФЯНЫХ БОЛОТ.

520

Программирование на языке Си

Результат:

ЕСЛИ I РАССУДОК | И | ЖИЗНЬ | ДОРОГИ I ВАМ | ДЕРЖИТЕСЬ ПОДАЛЬШЕ ОТ | торфяных болот

10.3.2. Рекомендации по обработке строк

Кратко напомним некоторые особенности обработки строк, хотя все средства языка, необходимые для выполнения заданий со строками, уже были рассмотрены в первых главах пособия.

1. Определение символьного массива фиксированного раз­ мера:

char Array [25] ;

Нельзя размер массива задавать с помощью переменной, т.е. будет ошибкой определение (если N - непрепроцессорный идентификатор):

char Array [N]

2. Определение динамического массива:

char *р; int N = 25;

р= (char*) malloc(N);

3.Обращение к элементу массива:

выражения Array[0] и *Array - эквивалентны. Также эквива­ лентны выражения:

Array[i], *(Array+i), * (i+Array), i[Array]

Для динамического массива, адресованного указателем р, эк­ вивалентны выражения:

Р [ 0 ] ,

* р ;

i [p]

p[i]f

* (p+i) / *(i+p),

4. Переход к соседнему (i+l)-My элементу динамического массива:

следующие выражения эквивалентны:

p[i+l], p++[i],

* (р++ +i)

Глава 10. Задачи по программированию

521

Н еверно-. Array++[i] - имя массива есть константа, по опре­ делению ее нельзя изменять.

5. Варианты перебора элементов массива,

int

i;

0;

i <

25; i++) {Array[i]...}

for

(i=

for

(i=

0;

i <

25; i++) {*(Array+i)...}

for

(i=

0;

i <

25;

i++) {*(p+i)...}

for

(i=

0;

i <

25;

i++) {p[i]...}

Опасный вариант (можно забыть начало массива):

for (i = 0; i < 25; i++)

{*p++...}

6.Строки в языке Си "размещаются" в символьных массивах. Признаком окончания строки служит '\0'.

Если определен массив

char string[25] = "это строка";

то в массиве string[ ] длиной 25 байт будет размещена строка длиной в 11 байт и string[10] = = '\0'.

Строки могут быть заданы в программе и так:

char

*ps

= "строка";

/* Длина строки 7 байт;

char

str

p s [6]=='\0';

* (ps+ б ) = ’\0' */

[ ] = "это

строка";

/* Строка и

 

 

 

массив одинаковой длины */

7. Для ввода строк (набираемых на клавиатуре) удобно ис­ пользовать функцию char* gets(char* s), которая размещает введенную последовательность символов в область памяти, ад­ ресуемую указателем s. При этом признак конца ввода '\п', до­ бавляемый во входной поток при нажатии клавиши <Enter>, функция gets() заменяет признаком конца строки '\0'.

Использование для ввода строк функции scanf("%s"...) не позволяет вводить последовательности символов, в которых со­ держатся пробелы или обобщенные пробельные символы. Ввод по спецификации %s выполняется до ближайшего пробела.

8. Вычислить длину (1еп) строки, находящуюся в массиве string или адресуемую указателем char * string; можно так:

522

Программирование на языке Си

int

len;

for

(len=0; * (string+len)•='\0'; len ++);

Еще более удобно применять функции для работы со стро­ ками из стандартной библиотеки. Они описаны в заголовочном файле string.h (см. Приложение 3). Например, для определения длины строки используйте функцию с прототипом unsigned strlen(char *str). (Возвращает длину строки без учета завер­ шающего строку символа '\0'.)

9. Копировать строку из массива string или из строки, адре­ суемой указателем char * string, в новый массив, адресуемый указателем char * s, можно таким образом:

int

j ;

s =

(char

*)malloc(len);

char

*s;

for

(j=0;

j <=

len;

j++)

* (s+j)=*(string+j) ;

здесь len - длина исходной строки.

Вариант, смещающий указатель с начала области памяти:

char *а; а = (char *)malloc(1еп5); for (; *a++=*s++;);

10.Функции с параметрами-строками:

1)применение указателей

int

length

(const

char *s) /* const - защита

int

i ;

от изменения фактического параметра */

 

* (s+i) != '\0';

i++)

{ for

(i=0;

 

/*

Даже

выражение * (s++)

не меняет

 

 

"настройку" параметра на внешний массив */

return

i;

/* Длина строки

*/

}

 

 

 

 

 

 

 

2) применение массива

 

int

length

(char а[ ]) /*а - есть const по

{ int

i=0;

 

синтаксису массива */

 

!= '\0'>;

 

 

while

(a[i++]

 

 

return

i-1; /* Длина (строки)*/

}

Глава 10. Задачи по программированию

523

10.3.3.Пример выполнения задания по обработке строк

Ввести символьную строку и разделить ее на части фиксиро­ ванной длины. Вывести на экран полученные части строки "в столбик", т.е. каждую часть с новой строки дисплея. Пусть в каждой части строки будет не более трех символов.

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

/* Динамические символьные массивы, указатели и строки */

#include <stdio.h> #include <string.h> void main ()

{

int LenMax, Len = 0;

 

 

 

 

char

*h,

*input;

 

"частей" строки

*/

 

int ks;

/* Количество

*/

/* Указатель

на массив

указателей

на части:

char

**с;

 

 

 

 

 

 

int

п =

0;

 

 

 

 

 

 

int

j =

0;

 

 

 

 

 

 

int

i ;

 

 

 

 

 

 

 

printf("\n Введите максимальный размер"

 

 

 

 

" строки:");

 

 

 

 

 

scanf("%d",

fiLenMax);

вводимой строки:

*/

 

/* Выделить

память

для

 

input =

(char *)malloc(LenMax);

 

 

 

printf("\n Введите

строку:");

 

 

*/

/* Удаление

символа

'\п' из входного потока:

getchar () ;

 

 

 

 

 

 

/*

Чтение строки: */

 

 

 

 

while

((*(input+Len++)=getchar())!='\п');

 

Len—

;

 

 

 

 

 

 

 

/* Len - количество введенных символов */

 

/* Добавить

признак

конца строки:

*/

 

 

* (input+Len)= ’\0';

для

введенной

строки: */

 

/* Выделить

память

 

h=(char

*)malloc(Len+1);

 

 

 

/* Копируем информацию из исходной строки */

 

while

(*(h+j++)=*input++);

 

*/

 

/* Удаление из памяти исходной строки:

 

Соседние файлы в папке книги