C/C++ в задачах и примерах [Никита Культин] (pdf) читать онлайн

-  C/C++ в задачах и примерах  [3-е издание, дополненное и исправленное] 7.72 Мб, 273с. скачать: (pdf) - (pdf+fbd)  читать: (полностью) - (постранично) - Никита Культин

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

Никита Культин
1

C/C++

в задачах и примерах
З-е издание,
дополненное и исправленное

Санкт-Петербург
«БХВ-Петербург»

2019

УДК 004.438 С
ББК 32.973.26-018.1
К90

К90

Культин Н. Б.
C/C++ в задачах и примерах. —
3-е изд., доп. и исправл. — СПб.: БХВ-Петербург, 2019. —
272 с.: ил.
ISBN 978-5-9775-3996-8
Сборник примеров и задач для самостоятельного решения по
программированию на языке C/C++ охватывает практически все
разделы начального курса программирования: от задач консоль­
ного ввода/вывода, использования циклов и операций с массива­
ми до работы со строками, файлами и объектами. Примеры пред­
ставлены в виде хорошо документированных исходных текстов
программ. Книга содержит справочник — описание основных
типов данных, операторов и наиболее часто используемых функ­
ций. Адресована студентам, школьникам старших классов и всем
тем, кто изучает программирование в учебном заведении или
самостоятельно. В третьем издании добавлены и обновлены при­
меры.
Для начинающих программистов
УДК 004.438 С
ББК 32.973.26-018.1

Группа подготовки издания:
Руководитель проекта
Зав. редакцией
Компьютерная верстка
Дизайн серии
Оформление обложки

Евгений Рыбаков
Екатерина Капалыгина
Ольги Сергиенко
Инны Тачиной
Марины Дамбиевой

Подписано в печать 09.01.19.
Формат 60х901/1в. Печать офсетная. Усл. печ. л. 17.
Тираж 1000 экз. Заказ №8257.
"БХВ-Петербург”, 191036, Санкт-Петербург, Гончарная ул., 20.
Отпечатано с готового оригинал-макета
ООО "Принт-М", 142300, М.О., г. Чехов, ул. Полиграфистов, д. 1

ISBN 978-5-9775-3996-8

© ООО "БХВ", 2019
© Оформление ООО "БХВ-Петербург", 2019

Оглавление
Предисловие....................................................................................... 7
О компиляторе и среде разработки.................................................................. 8
Как работать с книгой?........................................................................................8
Оформление решений..........................................................................................9

ЧАСТЬ 1. Примеры и задачи........................................................ 11
Объявление переменных...................................................................................13
Инструкция присваивания................................................................................ 15
Вывод на консоль..............................................................................................20
Ввод с консоли................................................................................................... 26
Программы с линейной структурой...............................................................28
Выбор................................................................................................................... 44
Инструкция if..............................................................................................44
Инструкция switch..................................................................................... 69
Циклы....................................................................................................................80
Цикл/ог........................................................................................................80
Цикл do... while........................................................................................ 110
Цикл while..................................................................................................121
Массивы............................................................................................................. 125
Символы и строки............................................................................................ 157
Функции............................................................................................................. 181
Классы и объекты............................................................................................ 198
Файлы................................................................................................................ 209
Рекурсия.............................................................................................................227

ЧАСТЬ 2. Справочник.................................................................233
Структура программы.................................................................................... 235
Основные типы данных.................................................................................. 236
Целые числа.............................................................................................. 236

4

Оглавление

Вещественные числа............................................................................... 236
Символы................................................................................................... 236
Строки........................................................................................................237
Массивы.............................................................................................................237
Инструкция присваивания..............................................................................237
Выбор................................................................................................................. 238
Инструкция if............................................................................................238
Инструкция switch................................................... ...............................239
Циклы................................................................................................................. 239
Цикл for..................................................................................................... 239
Цикл do ... while...................................................................................... 240
Цикл while................................................................................................. 240
Объявление функции...............................................................
241
Стандартные функции.................................................................................... 241
Функции ввода/вывода................................................................................... 242
printf...........................................................................................................242
scanf.........................................................................................
243
puts....................................................................................................... 243
gets.............................................................................................................. 244
putch...........................................................................................................244
getch..................................................................................................... 244
cputs............................................................................................................244
245
cprintf......................
sprintf..........................................................................................................245
Функции работы с файлами...........................................................................245
fopen...........................................................................................................245
Jprintf..........................................................................................................246
fscanf...........................................................................................................247
fgets...................................................................................................... 247
fputs............................................................................................................247
ferror...........................................................................................................248
feof.............................................................................................................. 248
fclose...........................................................................................................248
Функции работы co строками....................................................................... 248
streat...........................................................................................................248
strepy...........................................................................................................249
strlen...........................................................................................................249
stremp.........................................................................................................249
strlwr...........................................................................................................249
strupr.................................................................................................... 250

Оглавление

5

strset............................................................................................................250
strchr...........................................................................................................250
Математические функции.............................................................................. 250
abs,fabs..................................................................................................... 250
acos, as in, atan, acosl, asinl, atanl......................................................... 251
cos, sin, tan, cosl, sinl, tanl...................................................................... 251
exp, expl............................................................................................... 251
pow, powl................................................................................................... 252
sqrt..............................................................................................................252
rand...................................................................................................... 252
srand...........................................................................................................252
Функции преобразования............................................................................... 253
atof..............................................................................................................253
atoi, atol..................................................................................................... 253
gcvt.............................................................................................................. 253
itoa, Itoa, ultoa...........................................................................................254

ПРИЛОЖЕНИЯ............................................................................255
Приложение 1. Таблица ASCII кодировки символов........... 257

Приложение 2. Представление информации
в компьютере: десятичные, двоичные
и шестнадцатеричные числа.................................................... 259
Предметный указатель.............................................................. 263

Предисловие

Чтобы стать программистом, недостаточно прослушать курс лек­
ций или прочитать самоучитель по языку программирования, —
нужно писать программы, решать конкретные задачи. Но где их
взять? В учебниках, как правило, приводятся типовые задачи,
в основе которых лежат расчеты по формулам. Они, несомненно,
полезны, но не всем интересны.
В книге, которую вы держите в руках, начинающему програм­
мисту предлагаются задачи, которые, с одной стороны, ему по
плечу, с другой — полезны и занимательны.

Состоит книга из двух частей и двух приложений:

□ первая часть книги содержит примеры и задачи для самостоя­
тельного решения. Они сгруппированы по темам и охватыва­
ют практически все разделы базового курса программирова­
ния: от объявления переменных и программ с линейной струк­
турой до работы с массивами и файлами;
О вторая часть представляет собой краткий справочник по язы­
ку программирования С. В нем приведено описание основных
типов данных, инструкций, реализующих алгоритмические
структуры выбора и циклов, а также наиболее часто исполь­
зуемых функций.

8

Предисловие

О КОМПИЛЯТОРЕ
И СРЕДЕ РАЗРАБОТКИ
Если вы только начинаете осваивать язык C/C++, то перед вами
встанет задача выбора среды разработки, компилятора. Сущест­
вует достаточно много инструментов разработки на C/C++, среди
которых можно выделить Microsoft Visual Studio, Qt Creator и
Embarcadero C++ Builder. Какой из этих сред отдать предпочте­
ние, на чем остановить свой выбор? По большому счету, особой
разницы между этими средами для решения задачи освоения
языка программирования нет. Скорее всего, при выборе среды
программирования вы будете ориентироваться на рекомендации
преподавателя или потенциального работодателя.
Решения, приведенные в книге, представляют собой исходные
тексты консольных Win32 приложений. Они не ориентированы
на конкретную среду разработки, хотя тестировались в Microsoft
Visual Studio, поэтому вы можете использовать любую среду раз­
работки, которую выберете.

Внимание!
Чтобы консольное Win32 приложение правильно отображало бук­
вы русского алфавита, строковую константу, содержащую буквы
русского алфавита, необходимо преобразовать в кодировку ASCII.
Сделать это можно, например, так, как показано в решении зада­
чи 37.
В решениях (текстах программ) для наглядности все сообщения
записаны русскими буквами, поэтому читателю при вводе про­
грамм в компьютер придется или заменить русские сообщения
эквивалентными на английском языке, или применить к строковым
константам, содержащим русские буквы, функцию rus, текст и
пример использования которой приведены в решении задачи 37.

КАК РАБОТАТЬ С КНИГОЙ?
Группы задач следуют в книге в том порядке, в котором традици­
онно изучаются соответствующие разделы в курсе программиро­
вания. Прежде чем приступить к решению задач, нужно изучить
соответствующую тему— прочитать посвященный ей раздел

Предисловие

9

учебника. Если сразу справиться с задачей не получается, то
можно посмотреть решение и затем еще раз попытаться решить
задачу самостоятельно. Перед тем как начать работать на компь­
ютере (набирать программу в редакторе кода), рекомендуется
«набросать» блок-схему алгоритма решения на бумаге.
Задача считается решенной, если написанная программа работает
так, как сказано в условии задачи.

ОФОРМЛЕНИЕ РЕШЕНИЙ
Важно, чтобы программа (решенная задача) соответствовала пра­
вилам хорошего стиля программирования, была правильно
оформлена. Это предполагает:
□ использование несущих смысловую нагрузку имен перемен­
ных, констант и функций;
□ запись инструкций выбора и циклов с применением отступов;
□ комментирование назначения переменных, функций и клю­
чевых точек программы.

Правильно оформленную программу легче читать, в ней легче
найти ошибку, кроме того, программа, соответствующая прави­
лам хорошего стиля программирования, характеризует уровень
профессионализма ее разработчика.
Еще раз повторю: научиться программировать можно только
программируя. Поэтому, чтобы получить максимальную пользу
от книги, вы должны работать с ней активно. Решайте задачи са­
мостоятельно. Изучайте приведенные решения, вводите их
в компьютер. Не бойтесь экспериментировать— вносите изме­
нения в программы. Чем больше вы сделаете самостоятельно, тем
большему научитесь!

Часть *1

Примеры и задами
ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ
Общие замечания
Приступая к решению задач этого раздела, следует вспомнить,
что:
□ каждая переменная программы должна быть объявлена;
□ объявления переменных обычно помещают в начале функции,
сразу за заголовком. Обратите внимание: хотя язык C++ до­
пускает объявление переменных практически в любом месте
функции, объявлять переменные лучше все-таки в начале
функции, снабжая инструкцию объявления кратким коммен­
тарием о назначении переменной;

□ инструкция объявления переменной выглядит так:
Тип ИмяПеременной;

□ инструкцию объявления переменной можно использовать для
инициализации переменной. В этом случае объявление пере­
менной записывают следующим образом:
Тип ИмяПеременной = НачальноеЗначение;

□ в имени переменной допустимы буквы латинского алфавита
и цифры (первым символом должна быть буква);
□ компилятор C++ различает прописные и строчные буквы,
поэтому, например, имена Sum и sun обозначают разные пере­
менные;

14

Часть 1

□ основными числовыми типами языка C++ являются: int (це­
лый) и float (дробный);
□ после инструкции объявления переменной рекомендуется по­
местить комментарий — указать назначение переменной.

Задачи
1. Объявить переменные, необходимые для вычисления площади
прямоугольника.
Задача 1
float а, Ь; // ширина и длина прямоугольника

float s;

// площадь прямоугольника

2. Объявить переменные, необходимые для пересчета веса из
фунтов в килограммы.
Задача 2

float funt; 11 вес в фунтах
float kg;

11 вес в килограммах

3. Определить исходные данные и объявить переменные, необхо­
димые для вычисления дохода по вкладу.
Задача 3
float

summa;

srok;
stavka;
int
float dohod;
int

// сумма вклада
// срок вклада (дней)

// процентная ставка (годовых)
// величина дохода

4. Объявить переменные, необходимые для вычисления площади
круга.

5. Объявить переменные, необходимые для вычисления площади
кольца.
Задача 5
float rl, г2; // внешний радиус и радиус отверстия
float s;

// площадь кольца

15

Примеры и задачи

6. Объявить переменные, необходимые для вычисления объема
и площади поверхности цилиндра.
7. Объявить переменные, необходимые для вычисления стоимо­
сти покупки, состоящей из нескольких тетрадей, карандашей и
линейки.
Задача 7
float

CenaTetr;

int

KolTetr;

float

CenaKar;

и цена тетради
// количество тетрадей
и цена карандаша

int

KolKar;

float

CenaLin;

// количество карандашей
// цена линейки

float

Summa;

// стоимость покупки

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

ИНСТРУКЦИЯ ПРИСВАИВАНИЯ
Общие замечания
Приступая к решению задач этого раздела, следует вспомнить,
что:

□ инструкция присваивания служит для изменения значений
переменных, в том числе и для вычислений «по формуле»;
□ в отличие от большинства языков программирования, в С++
инструкция присваивания, изменяющая значение переменной,
может быть записана несколькими способами— например,
вместо x=x+dx можно написать x+=dx, а вместо i=i+l воспользо­
ваться оператором инкремента: i++;
□ значение выражения в левой части инструкции присваивания
зависит от типа операндов и операции, выполняемой над опе­
рандами. Целочисленное сложение и вычитание выполняются
без учета переполнения. Например, если переменная п, объяв­
ленная как int, имеет значение 32767, то в результате выполне­

Часть 1

16

ния инструкции n=n+l, значение переменной п будет равно
-32768;
□ результатом выполнения операции деления над целыми опе­
рандами является целое, которое получается отбрасыванием
дробной части результата деления.

Задачи
9. Записать инструкцию, которая присваивает переменной^ зна­
чение 1,5.
10. Написать инструкцию, которая присваивает переменной summa
нулевое значение.
11. Записать инструкцию, которая увеличивает на единицу зна­
чение переменной п.
Задача 11

п++;
12. Записать инструкцию, которая уменьшает на два значение
переменной counter.
Задача 12

counter -= 2;
13. Написать инструкцию вычисления среднего арифметического
переменных xl и х2.
14. Записать в виде инструкции присваивания формулу вычисле­
ния значения функции у = -2,7х3+ 0,23х2- 1,4.
Задача 14

у:=-2.7*х*х*х + 0.23*х*х - 1.4;
15. Написать инструкцию, которая увеличивает значение пере­
менной х на величину, находящуюся в переменной dx.
Задача 1S
х += dx;

17

Примеры и задачи

16. Записать в виде инструкции присваивания формулу пересчета
веса из фунтов в килограммы (один фунт = 405,9 г).
Задача 16
kg = funt*0.4059;

17. Записать в виде инструкции присваивания формулу пересчета
расстояния из километров в версты (одна верста = 1066,8 м).
18. Записать в виде инструкции присваивания формулу вычисле­
ния площади прямоугольника.
19. Записать в виде инструкции присваивания формулу вычисле1
ь
а л, где a— длина основания,
ния площади треугольника:
h — высота треугольника.

20. Записать в виде инструкции присваивания формулу вычислеa+b 1
к
ния площади трапеции: s=——" > гДе a и Ь — длины основании,
h — высота трапеции.

21. Записать в виде инструкции присваивания формулу вычисле­

ния площади круга: s=7t-r2.
Задача 21
// Константа М_Р1, равная числу "ПИ", объявлена в файле math.h

s = М_Р1 * г * г;

22. Записать в виде инструкции присваивания формулы вычис­
ления площади поверхности и объема цилиндра.

5 = 2 • я ■ r(h + г)
v = n-r2 -h

18

Часть 1

Задача 22
// Константа М_Р1, равная числу "ПИ", объявлена в файле math.h

s = 2*M_PI*r*(h+r);
v = M_PI *r*r*h;

23. Записать в виде инструкции присваивания формулу вычисле­
ния объема параллелепипеда.
24. Объявить необходимые переменные и записать в виде инст­
рукции присваивания формулы вычисления объема и площади
поверхности шара.

Задача 24
float г;

// радиус шара

float v, s;

// площадь поверхности и объем шара

v = (3*М_Р1*г*г*г)/4; // константа М_Р1 объявлена в math.h

s = 4*М_Р1*г*г;

25. Записать в виде инструкции присваивания формулу вычисле­
ния объема цилиндра.
26. Записать в виде инструкции присваивания формулу вычисле­
ния объема полого цилиндра.
v=7t-A-(r,2-r22)
t\ — радиус цилиндра

,—I———1-.
к------- Ч

г2 — радиус отверстия
h — высота цилиндра

19

Примеры и задачи

27. Записать в виде инструкции присваивания формулу вычисле­
ния объема конуса.

28. Записать в виде инструкции присваивания формулу пересчета
температуры из градусов Фаренгейта в градусы Цельсия:

C=|(F-32).
29. Записать в виде инструкции присваивания формулу для вы­
числения тока по известным значениям напряжения и сопротив­
ления электрической цепи.
30. Записать в виде инструкции присваивания формулу вычисле­
ния сопротивления электрической цепи по известным значениям
напряжения и силы тока.
31. Записать в виде инструкции присваивания формулу вычис­
ления сопротивления электрической цепи, состоящей из трех
последовательно соединенных резисторов.
32. Записать в виде инструкции присваивания формулу вычис­
ления сопротивления электрической цепи, состоящей из двух
параллельно соединенных резисторов: г= г1‘г2
г1+г2

33. Записать в виде инструкции присваивания формулу пересчета
сопротивления электрической цепи из омов в килоомы.
34. Объявить необходимые переменные и записать в виде инст­
рукции присваивания формулу вычисления стоимости покупки,
состоящей из нескольких тетрадей, обложек к ним и карандашей.
Задача 34
float ctetr, cobl, ckar; // цена тетради, обложки и карандаша
int

ntetr, nkar;

float summ;

11 кол-во тетрадей и карандашей

// сумма покупки

Часть 1

20
11 предполагается, что к каждой тетради

// покупается обложка
summ = ntetr*(ctetr+cobl) + nkar*ckar;

ВЫВОД НА КОНСОЛЬ
Общие замечания
Приступая к решению задач этого раздела, следует вспомнить,
что:
□ функция printf обеспечивает вывод на экран (консоль) сооб­
щений и значений переменных;
□ первый параметр функции printf — строка вывода (формати­
рования), определяющая выводимый текст и формат отобра­
жения значений переменных, имена которых указаны в ка­
честве остальных параметров функции;
□ формат вывода значения переменной задается при помощи
спецификатора преобразования (формата)— последователь­
ности символов, начинающейся с

□ при выводе числовых значений наиболее часто используются
следующие спецификаторы:

• %i — целое со знаком;
• %и — беззнаковое целое;
• %f — вещественное, в виде числа с плавающей точкой;
• %n.mf — вещественное в формате с фиксированной точкой,
где п — общее количество символов (количество цифр це­
лой и дробной частей числа, десятичный разделитель, знак
числа); ш — количество цифр дробной части;

□ некоторые символы могут быть помещены в строку вывода
только как последовательность других, обычных символов:


\п — новая строка;



\t — табуляция;



\" — двойная кавычка;



\\ — символ \;

Примеры и задачи

21

□ наряду с функцией printf, для вывода сообщений на экран
можно использовать функцию puts;
□ чтобы после окончания работы программы ее окно не было
сразу закрыто, в конец программы нужно поместить следую­
щие инструкции:

printf("To exit press ");
getchar();
□ чтобы программа могла выводить сообщения на русском язы­
ке, необходимо программно изменить кодировку строки со­
общения — преобразовать ANSI-строку в ASCII-строку. Сде­
лать это можно, например, при помощи функции rus, текст и
пример использования которой приведен в решении задачи 37.

Внимание!
Чтобы консольное Win32 приложение правильно отображало бук­
вы русского алфавита, строковую константу, содержащую буквы
русского алфавита, необходимо преобразовать в кодировку ASCII.
Сделать это можно, например, так, как показано в решении зада­
чи 37.

Задачи
35. Написать программу, которая выводит на экран имя сына Го­
мера Симпсона.
36. Написать программу, которая выводит на экран имена детей
Гомера и Мардж Симпсонов (имя каждого — с новой строки).
Задача 36

#include
void main()
{
printf("Bart Simpson\nLisa Simpson\nMaggi Simpson\n");
printf("To exit press ");
getchar(); // ждет нажатия клавиши

}

Часть 1

22

37. Написать программу, которая выводит на экран имена детей
Гомера и Мардж Симпсонов по-русски.
Задача 37
♦include
♦include

11 преобразует ANSI-строку в ASCII-строку
char* rus(char st[])

{
char* st2 = new char[strlen(st)

+ 2];

int i = 0;
while (st[i] != 0)

{

unsigned char ch = st[i];
if (( ch >= 192) && ( ch ");

scanf(”%f", &г)■,
printf("Высота цилиндра -> ");

scanf("%f", &h);

Часть 1

28

50. Объявить необходимые переменные и написать инструкции
ввода исходных данных для программы вычисления дохода по
вкладу. Предполагается, что процентную ставку программа опре­
деляет на основе данных о сумме и сроке вклада.
Задача 50
float sum;

// сумма

int period;

// срок (кол-во месяцев)

float rate;

// процентная ставка

float profit; // доход
float value; // сумма в конце срока вклада

printff'CyMMa (руб.) -> ");
scanf("%f, &sum);
printf("Срок (мес.) ->");
scanf("%i", &period);

ПРОГРАММЫ
С ЛИНЕЙНОЙ СТРУКТУРОЙ
Общие замечания
Приступая к решению задач этого раздела, следует вспомнить,
что:
□ программы с линейной структурой являются простейшими и
используются, как правило, для реализации несложных вы­
числений по формулам;
□ в программах с линейной структурой инструкции выполняют­
ся последовательно, одна за другой;
□ алгоритм программы с линейной структурой может быть
представлен следующим образом:

Примеры и задачи

29

Задачи
51. Написать программу вычисления площади прямоугольника.
Далее приведен рекомендуемый вид экрана программы (данные,
введенные пользователем, выделены полужирным).
Вычисление площади прямоугольника
Введите исходные данные:
Длина (см) -> 9
Ширина (см) ->7.5
Площадь прямоугольника: 67.50 кв. см.

Задача 51
// Вычисление площади прямоугольника
#lnclude

void main()

(
float l,w; 11 длина и ширина прямоугольника

float s;

И площадь прямоугольника

printf("\пВычисление площади прямоугольника\п");
printf("Введите исходные данные:\п");
printf("Длина (см.)

-> ");

Часть 1

30
scanf("%f", &1);

printf("Ширина (см.) -> ");
scanf("%f", &w);

s = 1 * w;
printf("Площадь прямоугольника: X10.2f кв. см\п", s);

printf("\n\nflnfl завершения наймите “);
getchar();

}
52. Написать программу вычисления площади параллелограмма.
53. Написать программу вычисления объема параллелепипеда.
Далее приведен рекомендуемый вид экрана программы (данные,
введенные пользователем, выделены полужирным).
Вьмисление объема параллелепипеда
Введите исходные данные:
Длина (см) -> 9
Ширина (см) ->7.5
Высота (см) -> 5

Объем: 337.50 куб. см.

54. Написать программу вычисления площади поверхности па­
раллелепипеда. Далее приведен рекомендуемый вид экрана про­
граммы (данные, введенные пользователем, выделены полужир­
ным).
Вьмисление площади поверхности параллелепипеда
Введите исходные данные:
Длина (см) -> 9
Ширина (см) -> 7.5
Высота (см) -> 5
Площадь поверхности: 90.00 кв. см.

Задача 54
// Вычисление площади поверхности параллелепипеда
#include

void main()

{
float l,w,h; // длина, ширина и высота параллелепипеда

float s;

// площадь поверхности параллелепипеда

31

Примеры и задачи
printf("\nBbi4Mcnewie площади поверхности параллелепипеда\п");

printf("Введите исходные данные:\п“);

printf("Длина (см)

-> ”);

scanf("%f”, &1);
printf("Ширина (см) -> ");
scanf("%f", &w);

printf("Высота (см) -> ”);
scanf("%f", Sw);

s = (l*w + l*h + w*h)*2;
printf("Площадь поверхности: %6.2f кв. CM\n",s);

printf("\n\nHnfl завершения нажмите ");
getchar();

}

55. Написать программу вычисления объема куба. Далее приве­
ден рекомендуемый вид экрана программы (данные, введенные
пользователем, выделены полужирным).
Вычисление объема куба
Введите длину ребра (см) и нажните
-> 9.5
Объем куба: 857.38 куб. см.

56. Написать программу вычисления объема цилиндра. Далее
приведен рекомендуемый вид экрана программы (данные, вве­
денные пользователем, выделены полужирным).
Вычисление объема цилиндра
Введите исходные данные:
Радиус основания (см) -> 5
Высота цилиндра (см) -> 10
Объем цилиндра 1570.80 см. куб.
Для завершения нажните

Задача 56
// Вычисление объема цилиндра
#include
void main()

{
float r,h,v; // радиус основания, высота и объем цилиндра

Часть 1

32
printf("Вычисление объема цилиндра\п");
printf("Введите исходные данные:\п");
printf("Радиус основания (см) -> ");

scanf("%f", &г);
printf("BbicoTa цилиндра (см) -> ");

scanf("%f", &h);
v = 2*3.1415926*r*r*h;

printf("\n06beM цилиндра %6.2f куб. см\п", v);
printf("\пДля завершения нажмите ");

getcharQ;
}

57. Написать программу вычисления стоимости покупки, со­
стоящей из нескольких тетрадей и карандашей. Далее приведен
рекомендуемый вид экрана программы (данные, введенные поль­
зователем, выделены полужирным).
Вычисление стоимости покупки
Введите исходные данные:
Цена тетради (руб.) -> 2.75
Количество тетрадей -> 5
Цена карандаша (руб.) -> 0.85
Количество карандашей -> 2
Стоимость покупки: 15.45 руб.

Задача 57
// Вычисление стоимости покупки

#include
void mainQ

{

float kar,tetr; // цена карандаша и тетради
int nk,nt;

// количество тетрадей и карандашей

float summ;

// стоимость покупки }

printf("ХпВычисление стоимости покупки\п");

printf("Введите исходные данные:\п");
printf("Цена тетради (руб.) -> ");

Примеры и задачи

33

scanf("%f", &tetr);

printf("Количество тетрадей -> ");
scanf("%i", &nt);

printf("Цена карандаша (руб.) -> ");

scanf(”%f", &kar);
printf("Количество карандашей -> ");
scanf("%i", &nk);

summ=tetr*nt + kar*nk;
printf("ХпСтоимость покупки: %6.2f руб.Хп", summ);
printf("\пДля завершения нажмите ");
getcharQ;
}

58. Написать программу вычисления стоимости покупки, со­
стоящей из нескольких тетрадей и такого же количества обложек
к ним. Далее приведен рекомендуемый вид экрана программы
(данные, введенные пользователем, выделены полужирным).
Вычисление стоимости покупки
Введите исходные данные:
Цена тетради (руб.) -> 2.75
Цена обложки (руб.) -> 0.5
Количество комплектов (шт.) -> 7

Стоимость покупки: 22.75 руб.

59. Написать программу вычисления стоимости некоторого ко­
личества (по весу), например, яблок. Далее приведен рекомен­
дуемый вид экрана программы (данные, введенные пользовате­
лем, выделены полужирным).
Вычисление стоимости покупки
Введите исходнье данные:
Цена за килограмм (руб.) -> 8.5
Вес яблок (кг) -> 2.3
Стоимость покупки: 19.55 руб.

60. Написать программу вычисления площади треугольника, ес­
ли известна длина его основания и высота. Далее приведен реко­
мендуемый вид экрана программы (данные, введенные пользова­
телем, выделены полужирным).

34

Часть 1

Вычисление площади треугольника
Введите исходные данные:
Основание (см) -> 8.5
Высота (см) -> 10
Площадь треугольника 42.50 кв. см.

61. Написать программу вычисления площади треугольника,
если известны длины двух его сторон и величина угла между этими
сторонами. Далее приведен рекомендуемый вид экрана програм­
мы (данные, введенные пользователем, выделены полужирным).
Вычисление площади треугольника
Введите в одной строке длины сторон
-> 25 17
Введите величину угла между сторонами
-> 30
Площадь треугольника: 106.25 кв. см.

Задача 61
// Вычисление площади треугольника по двум
// сторонам и величине угла между ними

#include
#include "math.h"

// sin и константа M_PI - число "ПИ"

void mainQ
{
float a,bj 11 длины сторон
float u;
float s;

11 величина угла, выраженная в градусах

И площадь треугольника

printf("\пВычисление площади треугольника^");

printf("Введите в одной строке длины сторон ");
printf("(cM) -> ");
scanf("%f%f", &а, &b);

printf(”Введите величину угла между сторонами ");
printf("(rpafl.) -> ");

scanf("%f", &u);

/* s=a*h/2, где a - основание, h - высота.
h - может быть вычислена по формуле h=b*sin(u).
Аргумент функции sin должен быть выражен в радианах.

Примеры и задачи

35

1 рад. = 180/pi, где pi - число "ПИ").
*/
s = a*b*sin(u*M_PI/180)/2;

printf("Площадь треугольника: %6.2f кв. cm",s);
printf("\п\пДля завершения нажмите ");

getchar();

}

62. Написать программу вычисления сопротивления электриче­
ской цепи, состоящей из двух параллельно соединенных сопро­
тивлений. Далее приведен рекомендуемый вид экрана программы
(данные, введенные пользователем, выделены полужирным).
Вычисление сопротивления электрической цепи
при параллельном соединении элементов.
Введите исходные данные:
Величина первого сопротивления (СМ) -> 15
Величина второго сопротивления (СМ) -> 20
Сопротивление цепи: 8.57 Ом

Задача 62
// Вычисление сопротивления электрической цепи,
//

состоящей из двух параллельно соединенных элементов.

«include
void main()

{
float rl,r2; // сопротивление элементов цепи

float r;

11 суммарное сопротивление цепи

printf("ХпВычисление сопротивления электрической цепи\п”);
printf("при параллельном соединении элементовХп");

printf("BBeflirre исходные данные:\п");
printf("BeBH4HHa первого сопротивления (Ом) -> ");
scanf("%f",&rl);
printf("Величина второго сопротивления (Ом) -> ");

scanf("%f",&r2);
r=rl*r2/(rl+r2)j

36

Часть 1

printf("Сопротивление цепи: %6.2f Ом",г);

printf("\n/Vifl завершения наложите ")j
getchar();

}

63. Написать программу вычисления сопротивления электриче­
ской цепи, состоящей из двух последовательно соединенных
сопротивлений. Далее приведен рекомендуемый вид экрана про­
граммы (данные, введенные пользователем, выделены полужир­
ным).
Вычисление сопротивления электрической цепи
Введите исходные данные:
Величина первого сопротивления (Ом) -> 15
Величина второго сопротивления (0м)-> 27.3

Сопротивление цепи (последовательное соединение): 42.Зв Ом

64. Написать программу вычисления силы тока в электрической
цепи. Далее приведен рекомендуемый вид экрана программы
(данные, введенные пользователем, выделены полужирным).
Вычисление силы тока в электрической цели
Введите исходные данные:
Напряжение (вольт) -> Зв
Сопротивление (Ом) -> 1500

Сила тока: 0.024 Ампер

65. Написать программу вычисления расстояния между населен­
ными пунктами, показанными на карте. Далее приведен рекомен­
дуемый вид экрана программы (данные, введенные пользовате­
лем, выделены полужирным).
Вычисление расстояния между населенными пунктами
Введите исходные данше:
Масштаб (количество километров в одном сантиметре) -> 120
Расстояние между точками (см) -> 3.5
Расстояние между точками 420 км.

66. Написать программу вычисления стоимости поездки на авто­
мобиле. Исходные данные: расстояние (км); количество бензина
(в литрах), которое потребляет автомобиль на 100 км пробега;

Примеры и задачи

37

цена одного литра бензина. Далее приведен рекомендуемый вид
экрана программы (данные, введенные пользователем, выделены
полужирным).
Вычисление стоимости поездки на автомобиле
Расстояние (км) -> 67
Расход бензина (литров на 100 км) -> 8.5
Цена литра бензина (руб.) -> 19.20
Поездка обойдется в 109.34 руб.

Задача 66
// Вычисление стоимости поездки на автомобиле
#include

void main()

{

float гаst;

// расстояние

float potr;

// потребление бензина на 100 км пути

float сепа;

// цена одного литра бензина

float summ;

// стоимость поездки

printf("\nBbNHaieHHe стоимости поездки на автомобиле\п");

printf("Расстояние (км) -> ");

scanf(”%f",&rast);
printf("Расход бензина (литров на 100 км) -> ");

scanf("%f", &potr);
printf("Цена литра бензина (руб.) -> ");

scanf("%f",&cena);

summ = 2 * potr/100 * rast * cena;
printf("Поездка обойдется в %6.2f руб.",summ);
printf("\n\nflnfl завершения нажмите ");

getchar();
}

67. Написать программу, которая вычисляет скорость, с которой
спортсмен пробежал дистанцию. Далее приведен рекомендуемый
вид экрана программы (данные, введенные пользователем, выде­
лены полужирным).

38

Часть

Вычисление скорости бега
Введите длину дистанции (метров) -> 1000
Введите время (минут.секунд)-> 3.25

Дистанция: 1000
Время: 3 мин 25 сек = 205 сек
Скорость: 17.56 км/час

Задача 67
// Скорость бега
#include
void main()

{

■float s;

11 дистанция

float t;

11 время

float v;

// скорость

int min;

// минут

int sek;

// секунд

float

ts; // время в секундах

printf("Вычисление скорости бега\п");
printf("Введите длину дистанции (метров) -> ");
scanf("%f", &s);

printf("Введите время (минут.секунд)-> ");

scanf("%f”, &t);

min = t;

sek = (t - min) * 100;
ts = min * 60 + sek;
v = (s /1000) I (ts / 3600);
printf("Дистанция: %4.0f м\п", s);

printf("Время: %i мин %i сек = %4.0f сек\п", min, sek, ts);
printf("Скорость %2.2f км/час\п", v);
printf("\пДля завершения нажмите ");

getcharQ;

Примеры и задачи

39

68. Написать программу вычисления объема цилиндра. Далее
приведен рекомендуемый вид экрана программы (данные, вве­
денные пользователем, выделены полужирным).
Вычисление объема цилиндра
Введите исходные данные:
радиус основания (см) -> 5.5
высота цилиндра (см) -> 7
Объем цилиндра 665.23 см куб.

69. Написать программу вычисления площади поверхности
цилиндра. Далее приведен рекомендуемый вид экрана про­
граммы (данные, введенные пользователем, выделены полу­
жирным).
Вьнисление площади поверхности цилиндра
Введите исходные данные:
радиус основания цилиндра (см) -> 5.5
высота цилиндра (см) -> 7
Площадь поверхности цилиндра: 431.97 кв. см.

Задача 69
// Вычисление площади поверхности цилиндра
#include

«include "math.h"

// константа M_PI - число "ПИ"

void main()
(

float r; // радиус основания цилиндра
float h; // высота цилиндра
float s; // площадь поверхности цилиндра

printf("\пВычисление площади поверхности цилиндра\п");
printf("Введите исходные данные:\п");
printf("paflnyc основания цилиндра (см) ->");

scanf("%f", &г);

printf("высота цилиндра (см) ->");
scanf("%f", &h);

s = 2*M_PI*r*r +2*M_PI*r*hj
printfC'rinouiaflb поверхности цилиндра %6.2f кв. см\п", s);

Часть 1

40
printf("\n/Vifl завершения нажмите ");
getcharQ;
}

70. Написать программу вычисления объема параллелепипеда.
Далее приведен рекомендуемый вид экрана программы (данные,
введенные пользователем, выделены полужирным).
Вычисление объема параллелепипеда
Введите в одной строке длину, ширину
и высоту параллелепипеда (в сантиметрах).
Числа разделяйте пробелами.
После ввода последнего числа наймите
-> 7.5 2.5 3
Объем параллелепипеда 56.25 см куб.

71. Написать программу пересчета расстояния из миль в кило­
метры (1 миля равна 1600,94 м). Далее приведен рекомендуемый
вид экрана программы (данные, введенные пользователем, выде­
лены полужирным).
Пересчет расстояния из миль в километры
Введите расстояние в милях -> 100

100 миль -это 160.09 км

Задача 71
// Пересчет расстояния из миль в километры
ttinclude
void main()
{

float m; // расстояние в милях

float k; // расстояние в километрах
printf("\nnepec4eT расстояния из миль в километры\п");
printf("Введите расстояние в милях ->“);
scanf("%f", &ш);
k = т*1.60094;

printf("%6.2f миль - это %6.2f км\п", v,k);
printf("\rWifl завершения нажмите ”);

getcharQ;
}

Примеры и задачи

41

72. Написать программу пересчета веса из фунтов в килограммы
(1 российский фунт равен 405,9 г). Далее приведен рекомендуе­
мый вид экрана программы (данные, введенные пользователем,
выделены полужирным).
Пересчет веса из фунтов в килограмм»!
Введите вес в фунтах -> 5
5 фунтов - это 2.05 кг

73. Написать программу вычисления дохода по вкладу. Сумма,
процентная ставка (% годовых) и срок вклада (в месяцах) задают­
ся во время работы программы. Далее приведен рекомендуемый
вид экрана (данные, введенные пользователем, выделены полу­
жирным).
Вычисление дохода по вкладу
Введите исходные данные:
Сумма вклада (руб.) -> 25000
Срок вклада (месяцев) -> 6
Процентная ставка (годовых) -> 10
Доход: 1250.00 руб.
Сумма по окончании срока вклада: 262500.00 руб.

Задача 73
// Вычисление дохода по вкладу
«include
void main()
{

float summ;

// сумма вклада

int srok;

// срок вклада

float stavka;

11 процентная ставка

float dohod;

// доход по вкладу

printf("ХпВычисление дохода по вкладу\п");

printf("Введите исходные данные:\п");
printf("Сумма вклада (руб.) -> ”);

scanf("%f", &summ);
printf("Срок вклада (месяцев) -> ");

42

Часть 1

scanf("%i", &srok);

printf("Процентная ставка (годовых) -> ");
scanf("%f", &stavka);

dohod = summ * stavka/12/100 * srok; году
summ = summ + dohod;

printff'............................ -..... \n");

printf("Доход: %9.2f руб.\п", dohod);

printf("Cyiwia по окончании срока вклада: %9.2f py6.\n",sumn);
printf("\пДля завершения нажмите ");

getcharQ;
}

74. Написать программу пересчета величины временного интер­
вала, заданного в минутах, в величину, выраженную в часах и
минутах. Далее приведен рекомендуемый вид экрана программы
(данные, введенные пользователем, выделены полужирным).
Введите временной интервал (в минутах)-» 150
150 минут - это 2 ч. 30 мин.

Задача 74
// Преобразование величины, выраженной в минутах,
// в значение, выраженное в часах и минутах

#include
void main()
{

int min; // интервал в минутах

int h;

// количество часов

int m;

// количество минут

printf("Введите временной интервал (в минутах) -> ");

scanf("%i",Smin);
h = (int)min /

60;

m = min % 60;

printf(”%i мин. - это %i час.%1 мин.\п", min, h, m);

Примеры и задачи

43

printf("\rWifl завершения нажмите ");

getcharQ;
}

75. Написать программу, которая преобразует введенное с кла­
виатуры дробное число в денежный формат. Например, число
12.5 должно быть преобразовано к виду 12 руб. 50 коп. Далее
приведен рекомендуемый вид экрана (данные, введенные пользо­
вателем, выделены полужирным).
Преобразование числа в денежный формат
Введите дробное число -> 23.6
23.6 руб. - это 23 руб. 60 коп.

Задача 75
// Преобразование числа в денежный формат

#include
void main()
{

// дробное число

float f;

int г;

11 целая часть числа (рубли)

int k;

/I дробная часть числа (копейки)

printf("^Преобразование числа в денежный формат\п");
printf("Введите дробное число -> “);
scanf("%f",&f);

г =

(int)f;

k = f * 100 - г*100;

printf("%6.2f руб. - это %i руб. %i коп.\п", f, г, к);

printf("\nflnfl завершения нажмите i4HcneHHe сопротивления электрической цепи\п");
printf("Введите исходные данные:\п");

Часть 1

46
printf("Величина первого сопротивления (Ом) ->");
scanf("%f", &rl);

printf("Величина второго сопротивления (Ом) ->");
scanf("%f", &г2);

printf("Тип соединения элементов ");

printf("(1-последовательное, 2-параллельное) ->");
scanf("%i", &t);
if (t == 1)

г = rl + r2;
else г = rl*r2 / (rl+r2);
printf("Сопротивление цепи: %6.2f Ом\п", г);
printf("\пДля завершения нажмите ");
getchar();

}

79. Написать программу вычисления дохода по вкладу. Исход­
ные данные: сумма и срок вклада. Процентная ставка зависит от
суммы. Если сумма меньше 5000 руб., то процентная ставка 10%,
если больше, то 13%. Далее приведен рекомендуемый вид экрана
(данные, введенные пользователем, выделены полужирным),
доход
Сумма, руб. -> 10000
Срок вклада, мес. -> 12

Сумма: 10000.00 руб.
Срок вклада: 12 мес.
Процент годовой: 13
Доход: 1300.00 руб.
Сумма в конце срока вклада: 11300.00 руб.

Задача 79
// Доход по вкладу

#include "stdio.h"
#include "conio.h"
void main()
{

float sum;

11 сумма вклада

int period;

// срок

Примеры и задачи____________________________________________ 47_
float percent; // процент, зависит от суммы
float profit;

11 доход

float total;

// сумма в конце срока вклада

printf("\nflOXQfl\n");
printf("Сумма, руб. -> ");

scanf("%f",&sum);
printf("CpoK вклада, мес. -> ");

scanf("%i",&period);

if ( sum < 5000)

percent = 10;

else
percent = 13;

profit = sum * percent/100/12 * period;

total = sum + profit;
printf(”\nCyMMa: %3.2f руб.", sum);

printf("\nCpoK вклада: %i мес.”, period);
printf("\nnpoueHT годовой: %2.2f", percent);
printf("\nfloxofl: %3.2f руб.”, profit);

printf("\nCyMMa в конце срока вклада:%3.2f руб.", total);
printf("\n\nflnn завершения нажмите ");

getcharQ;
}

80. Написать программу вычисления дохода по вкладу. Исход­
ные данные: сумма и срок вклада. Процентная ставка зависит от
суммы. Если сумма меньше 5000 руб., то процентная ставка 9%,
если больше 5000 руб., но меньше 10 000 руб., то 11%, а если
больше 10 000, то 13%. Далее приведен рекомендуемый вид эк­
рана (данные, введенные пользователем, выделены полужир­
ным).

Часть 1

48

доход
Сумма, руб. -> 15000
Срок вклада, мес. -> б
Суииа: 15000.00 руб.
Срок вклада: б мес.
Процент годовой: 13.00
Доход: 975.00 руб.
Сумма в конце срока вклада: 15975.00 руб.

Задача 80
// Доход
#include "stdio.h"
#include "conio.h"

void main()
{

float sum;

// сумма

int period;

// срок

float percent; // период
float profit;

// доход

float total;

// сумма в конце срока вклада

printf("\пДОХОД\п");

printf("CyMMa, руб. -> ");

scanf("%f",&sum);
printf("Срок вклада, мес. -> ");

scanf("%i",&period);
if ( sum < 5000)

percent = 9;

else
if ( sum < 10000)

percent = 11;

Примеры и задачи

49

else
percent = 13;
profit = sum * percent/100/12 * period;

total = sum + profit;
printf("\n........................... '•);
printf("\пСумма: %3.2f руб.", sum);

printf("\nCpoK: %i", period);
printf(”\пПроцент: %3.2f", percent);

printf("\nfloxofl: %3.2f руб.”, profit);

printf("\nCyM4a в конце срока вклада: %3.2f руб.", total);
printf("\п\пДля завершения нажмите ");

getcharQ;

}

81. Написать программу вычисления стоимости печати фотогра­
фий. Формат фотографий 9x12 или 10x15. Если количество фото­
графий больше 10, то заказчику предоставляется скидка 5%.
Далее приведен рекомендуемый вид экрана (данные, введенные
пользователем, выделены полужирным).
ФОТО
Формат (1 - 9x12; 2 - 10x15) -> 2
Количество, шт. -> 15
Цена: 3.20 руб.
Количество: 15 шт.
Сумма: 48.00 руб.
Скидка: 2.40 руб.
К оплате: 45.60 руб.

Задача 81
// Фото - вычисляет стоимость печати фотографий с учетом
// размера и возможной скидки

#include "stdio.h"
#include "conio.h"
void mainQ

Часть 1

50
{

int format; Ц формат: 1 - 9x12; 2 - 10x15
int koi;

// количество

float cena; // цена за штуку
float sum;

// сумма

float discount = 0; // скидка
float total;

// к оплате

printf("\пФОТО\п");

printf("Формат (1 - 9x12; 2 - 10x15) -> ");
scanf("Xi",&format);

printf("Количество, шт. -> ");

scanf("Xi“,&kol);

if ( format =» 1 )

cena = 2.50;

else
cena = 3.20;
sum = cena * koi;
if ( koi > 10 )

{
discount = sum * 0.05;

total = sum - discount;

}

printf(”\n........-..... -.......... ");
printf(“\nUeHa: X3.2f руб.", cena);
printf("\nKonH4ecTBo: Xi", koi);
printf(”\пСумма: X3.2f руб.", sum);

Примеры и задачи

51

if ( discount != 0)

{
printf("\nCKWKa: %3.2f руб.'1, discount);
printf("\nK оплате: %3.2f руб.", total);

}
printf("\n\nfln« завершения наймите ");
getcharQ;

}

82. Написать программу, которая вычисляет величину тока, по­
требляемого электроприбором (/ = P/U, где: I— ток, А; Р —
мощность, Вт; U— напряжение, В). Программа должна прове­
рять правильность введенных пользователем данных и, если они
неверные (делитель равен нулю), выводить сообщение об ошиб­
ке. Далее приведен рекомендуемый вид экрана программы (дан­
ные, введенные пользователем, выделены полужирным).
Ток в электрической цепи
Мощность, Вт -> 60
Напряжение, В -> 0
Ошибка! Напряжение не должно быть равно нули.

Задача 82
// Ток в электрической цепи
«include
void mainQ

{
float P,U,I; 11 Мощность, напряжение, ток
printf("\nT0K в электрической цепи\п");
printf(”Moi4HocTb, Вт -> ");

scanf(“%f", &Р);
printf("Напряжение, В -> ");
scanf("%f", &U);

Часть 1

52
if (U != 0)

{
I = P / U;
printf("Ток

в

цепи: %5.2f A, I);

}
else

printf("Ошибка! Напряжение не доммо быть равно нуло!\п");
printf("\пДля завершения нажмите ");
getchar();

}

83. Написать программу вычисления площади кольца. Програм­
ма должна проверять правильность исходных данных. Далее при­
веден рекомендуемый вид экрана программы (данные, введенные
пользователем, выделены полужирным).
Вьмисление площади кольца
Введите исходные данные:
радиус кольца (см) ->3.5
радиус отверстия (см) -> 7

Ошибка! Радиус отверстия не моокет быть больше радиуса кольца

Задача 83
// Вычисление площади кольца

«include
void main()

{
float rl,r2; // радиус кольца и отверстия
float s;

11 площадь кольца

printf("\nBeewTe исходные данные:\п");
printf("радиус кольца (см) -> ");

scanf("Xf",&rl);

printf("pawyc отверстия (см) -> ");
scanf("%f",&r2);

if (rl > r2)
{

s = 2 * 3.14 * (rl - r2);

Примеры и задачи

53

printf("\пПлощадь кольца %6.2f кв.см\п", s);
}

else
{

printf("ХпОшибка! Радиус отверстия не может быть”);
printf("6onbuie радиуса кольца.\п");

}
printf("\пДля завершения нажмите ");

getcharQ;
}

84. Написать программу, которая переводит время из минут и се­
кунд в секунды. Программа должна проверять правильность вве­
денных пользователем данных и в случае, если данные неверные,
выводить соответствующее сообщение. Далее приведен рекомен­
дуемый вид экрана программы (ошибочные данные, введенные
пользователем, выделены полужирным).
Введите время (минут.секунд) ->2.90
Ошибка! Число секунд не может быть больше 60
Для завершения нажмите 60)
(

printf("Ошибка I");

Часть 1

54
printf("Число секунд не может быть больше 60");

}
else
{
ts = min * 60 + sek;

printf("%i мин %i сек = %i сек", min, sek, ts);
}
printf("\nflnn завершения нажмите ");

getcharQ;
}

85. Написать программу, которая проверяет, является ли год ви­
сокосным. Далее приведен рекомендуемый вид экрана програм­
мы (данные, введенные пользователем, выделены полужирным).
Введите год и нажмите
->2001
2001 год - не високосный
Для завершения нажмите

Задача 85
// Проверяет, является ли год високосный
#include

void mainQ
{

int year;
int r;

// остаток от деления year на 4

printf("Введите год и нажмите ");
printf("->");
scanf("%i", Syear);

г = year % 4;
if ( г )

printf("%i год - не високосный\п", year);

else
printf("%i год - високосный\п", year);

printf("\пДля завершения нажмите ");
getcharQ;

}

Примеры и задачи

55

86. Написать программу решения квадратного уравнения. Про­
грамма должна проверять правильность исходных данных и в
случае, если коэффициент при второй степени неизвестного ра­
вен нулю, выводить соответствующее сообщение. Далее приве­
ден рекомендуемый вид экрана программы (данные, введенные
пользователем, выделены полужирным).
Решение квадратного уравнения
Введите в одной строке значения коэффициентов и нажмите 12 27 -10
Корни уравнения:
х1= -25.551
х2= -28.449

Задача 86
// Решение квадратного уравнения
«include

«include "math.h"
void main()
{

// коэффициенты уравнения

float a,b,c;

-Float xl,x2;
■float d;

// корни уравнения

// дискриминант

printf("\nPeuieHHe квадратного уравнения\п");

printf("Введите в одной строке значения коэффициентов”);

printff' и нажмите ”);

printf("-> ");
scanf("%f%f%f", &а, &b, &с); // ввод коэффициентов
d = ь*Ь - 4*а*с;

// дискриминант

if (d < 0)

printf("Уравнение не имеет решения\п");

else {

xl = (-b + sqrt(d))/(2*a);
х2 = (-Ь - sqrt(d))/(2*a);
printf("Корни уравнения: xl=%3.2f x2=%3.2f\n", xl, х2);

}

56

Часть 1
printf("\n/Vifl завершения нажмите ");
getcharQ;

}
87. Написать программу вычисления стоимости покупки с уче­
том скидки. Скидка в 10% предоставляется, если сумма покупки
больше 1000 руб. Далее приведен рекомендуемый вид экрана
программы (данные, введенные пользователем, выделены полу­
жирным).
Вычисление стоимости покупки с учетом скидки
Сумма покупки -> 1200
Вам предоставляется скидка 10%
Сумма покупки с учетом скидки: 1080.00 руб.

88. Написать программу вычисления стоимости покупки с уче­
том скидки. Скидка в 3% предоставляется, если сумма покупки
больше 500 руб, в 5% — если сумма больше 1000 руб. Далее при­
веден рекомендуемый вид экрана программы (данные, введенные
пользователем, выделены полужирным).
Вычисление стоимости покупки с учетом скидки
Введите сумму покупки и наймите
-> 640
Вам предоставляется скидка 3%
Сумма с учетом скидки: 620.80 руб.

Задача 88
// Вычисление стоимости покупки с учетом скидки

#include
void main()

{
float summ; // сумма покупки

printf("\nBbi4HcneHne стоимости покупки с учетом скидки\п");

printf("Введите сумму покупки и нажмите ");

printf("-> ");
scanf("%f", Ssumm);

if (summ < 500)
printf("Скидка не предоставляется.\n");

Примеры и задачи

57

else,{

printf("BaM предоставляется скидка ");

if (summ > 1000) {
printf("5%\n”);

summ = 0.97 * summ;
}
else {

printf("3%\n");

summ = 0.97 * summ;
};
printf("Сумма с учетом скидки: %3.2f руб.\п", summ);

}

printf("\n/Vifl завершения нажмите ”);
getcharQ;
}

89. Написать программу проверки знания истории — например,
даты основания Санкт-Петербурга. В случае неправильного отве­
та пользователя программа должна выводить правильную дату.
Далее приведен рекомендуемый вид экрана программы (данные,
введенные пользователем, выделены полужирным).
В каком году был основан Санкт-Петербург?
Введите число и наймите
-> 1705
Вы ошиблись, Санкт-Петербург был основан в 1703 году

Задача 89
// Проверка знания истории
#include

void main()
{

int year;

// ответ испытуемого

printf("\nB каком году был основан Санкт-Петербург?\п");
printf("Введите число и нажмите ");
printf("-> ");
scanf("%i", &year);

Часть 1

58
if (year == 1703)

printf (" Правильно
else {

printf("Вы ошиблись, ");
printf("Санкт-Петербург был основан в 1703 году.\п");

}
printf("\пДля завершения налмите “);

getcharQ;

}

90. Написать программу проверки знания даты начала Второй
мировой войны. В случае неправильного ответа пользователя
программа должна выводить правильную дату. Далее приведен
рекомендуемый вид экрана программы (данные, введенные поль­
зователем, выделены полужирным).
В каком году началась Вторая мировая война?
Введите число и наймите
-> 1939
Правильно

91. Написать программу проверки знания истории архитектуры.
Программа должна вывести вопрос и три варианта ответа. Поль­
зователь должен выбрать правильный ответ и ввести его номер.
Далее приведен рекомендуемый вид экрана программы (данные,
введенные пользователем, выделены полужирным).
Архитектор Исаакиевского собора:
1. Доменико Трезини
2. Огюст Ионферран
3. Карл Росси

Введите номер правильного ответа и наймите

-> 3
Вы ошиблись.
Архитектор Исаакиевского собора - Огюст Монферран

Задача 91
// Проверка знания истории архитектуры
#include

Примеры и задачи

59

void main()

{

int otv; // номер выбранного варианта ответа
printf("Архитектор Исаакиевского собора:\п");
printf("l. Доменико Трезини\п");
printf("2. Огюст Монферран\п");

printf("3. Карл Росси\п");

printf("Введите номер правильного ответа и нажмите ");
printf("-> ");

scanf(”%i", &otv);
if (otv == 2)
printf("Правильно.");

else {
printf("Вы ошиблись.\n Архитектор Исаакиевского ");
printf("собора Огюст Монферран\п");

}
printf("\пДля завершения нажмите ");

getchar();
}

92. Написать программу проверки знания истории архитектуры.
Программа должна вывести вопрос и три варианта ответа. Поль­
зователь должен выбрать правильный ответ и ввести его номер.
Далее приведен рекомендуемый вид экрана программы (данные,
введенные пользователем, выделены полужирным).
Невский проспект получил свое название:
1. По имени реки, на берегах которой расположен Санкт-Петербург.
2. По имени близко расположенного монастьря Александро-Невской лавры.
3. В память 6 знаменитом полководце Александре Невском.
Введите номер правильного ответа и нажмите

-> 1
Вы ошиблись.
Правильный ответ: 2

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

60

Часть 1

щение. Далее приведен рекомендуемый вид экрана программы
(данные, введенные пользователем, выделены полужирным).
Введите в одной строке два целых числа и наймите
-> 34 67
34 меньше 67

Задача 93
// Сравнение двух целых чисел
#include

void main()

{
int a,b; // сравниваемые числа
printf("\пВведите в одной строке два целых ");

printf("4Hcna и наймите ");
printf(”

scanf(”%i%i", &а, &b);
if (a == b)

printf("4ncna равны");
else if (a < b)
printf("%i меньше %i\n", a, b);

else

printf("%i больше %i\n", a, b);

printf("\nflnfl завершения нажмите ");

getcharQ;

}

94. Написать программу, которая выводит пример на умножение
двух однозначных чисел, запрашивает ответ пользователя, прове­
ряет его и выводит сообщение «Правильно!» или «Вы ошиблись»
и правильный результат. Далее приведен рекомендуемый вид
экрана программы (данные, введенные пользователем, выделены
полужирным).
Сколько будет 6x7 ?
Введите ответ и нахмите
-> 56
Вы ошиблись. 6x7=42

Примеры и задачи

61

Задача 94
// Проверка умения умножать числа
«include
«include

11 для доступа к srand

«include

И для доступа к time

void main()

{

int ml, m2, p; // сомножители и произведение
int otv;

// ответ испытуемого

time_t t;

// текущее время - для инициализации
// генератора случайных чисел

srand((unsigned) time(frt));; // инициализация генератора

// случайных чисел
ml = randQ % 9 +1;

// остаток от деления rand() на 9 лежит
// в диапазоне от 0 до 8

m2 = rand() % 9 +1;
р = ml * m2;
printf("Сколько будет %ix%i ?\n", ml, m2);

printf("Введите ответ и наймите ");
printf("-> ");

scanf("%i", &otv);
if (p == otv)
printf("Правильно.");

else
printf("Bbi ошиблись.\n%ix%i=%i", ml, m2, p);
printf("\nAnfl завершения наймите “);

getcharQ;

}

95. Написать программу, которая выводит пример на вычитание
(в пределах 100), запрашивает ответ пользователя, проверяет его
и выводит сообщение «Правильно!» или «Вы ошиблись» и пра­
вильный результат. Далее приведен рекомендуемый вид экрана

62

Часть 1

программы (данные, введенные пользователем, выделены полу­
жирным).
Сколько будет 83-17 ?
Введите ответ и нахмите
-> 67
Вы ошиблись. 83-17=66

96. Написать программу, которая проверяет, является ли введен­
ное пользователем целое число четным. Далее приведен реко­
мендуемый вид экрана программы (данные, введенные пользова­
телем, выделены полужирным).
Введите целое число и нахмите
-> 23
Число 23 - нечетное.

Задача 96
// Проверяет на четность введенное с клавиатуры число
#include

void main()

(
int n; /I введенное пользователем число

printf("ХпВведите целое число и нахмите ");
printf("-> ");
scanf("%i", &n);
printf("Число %i ");

if (n % 2 == 0)
printf("- четное.");

else
printf("- нечетное.");
printf("\п\пДля завершения нахмите ”);

getchar();

)
97. Написать программу, которая проверяет, делится ли на три
введенное с клавиатуры целое число. Далее приведен рекомен­
дуемый вид экрана программы (данные, введенные пользовате­
лем, выделены полужирным).

Примеры и задачи

63

Введите целое число и нажните
-> 451
451 на три не делится

98. Написать программу вычисления стоимости разговора по
телефону с учетом 20%-ной скидки, предоставляемой по субботам
и воскресеньям. Далее приведен рекомендуемый вид экрана
программы (данные, введенные пользователем, выделены полу­
жирным).
Вычисление стоимости разговора по телефону
Введите исходные данные:
Длительность разговора (целое количество минут) -> 3
День недели (1 - понедельник, ... 7 - воскресенье) -> 6
Предоставляется скидка 20%.
Стоимость разговора: 5.52 руб.

Задача 98
// Вычисление стоимости телефонного разговора с учетом

//

скидки, предоставляемой по субботам и воскресеньям

#include
void main()
{
int time;

11 длительность разговора

int day;

// день недели

float summa;

// стоимость разговора

printf("\пВычисление стоимости разговора по телефону\п");
printf("Введите исходные данные:\п“);
printf("Длительность разговора ");

printf("(целое кол-во минут) ->");
scanf("Xi", &time);

printf("День недели");

printf(" (1-понедельник,..,7-воскресенье) ->");
scanf("%i", &day);

summa = 2.3 * time;

11 цена минуты 2.3 руб.

if (day == 6 11 day = 7)

{
printf("Предоставляется скидка 20%\п");

Часть 1

64
summa = summa * 0.8;
};
printf("Стоимость разговора: %3.2f руб.\n",summa);
printf("\nflnn завершения нажмите ");

getcharQ;
}

99. Написать программу, которая вычисляет оптимальный вес
человека, сравнивает его с реальным и выдает рекомендацию
о необходимости поправиться или похудеть. Оптимальный вес
вычисляется по формуле: Рост (см) - 100. Далее приведен реко­
мендуемый вид экрана программы (данные, введенные пользова­
телем, выделены полужирным).
Введите в одной строке, через пробел,
рост (см) и вес (кг), затем нажмите
->170 68
Вам надо поправиться на 2.00 кг.

Задача 99
// Контроль веса

#include
void main()
(

float w;

// вес

float h;

/I рост

float opt; // оптимальный вес
float d;

// отклонение от оптимального веса

printf("\BBeflHTe в одной строке, через пробел,\п”);

printf(”pocT (см) и вес (кг), затем нажмите “);
printf("->");

scanf("%f%f", &h, &w);
opt = h - 100;

if (w == opt)
printf("Ваш вес оптимален!");

else
if (w < opt)

Примеры и задачи

65

{
d = opt - w;

printff'BaM надо поправиться на %2.2f кг.\п", d);

}
else
{

d = w - opt;

printf("BaM надо похудеть на %2.2f кг.\п", d);

}
printf("\nflnn завершения нажмите ");

getcharQ;

}

100. Написать программу, которая запрашивает у пользователя
номер месяца и затем выводит соответствующее название време­
ни года. Если пользователь введет недопустимое число, програм­
ма должна вывести сообщение «Ошибка данных». Далее приве­
ден рекомендуемый вид экрана программы (данные, введенные
пользователем, выделены полужирным).
Введите номер месяца (число от 1 до 12)
-> 11
Зима

Задача 100
// Определение времени года по номеру месяца

#include
void mainQ

{

int month; // номер месяца
puts("\nBBewTe номер месяца (число от 1 до 12)");
printf(”-> ");
scant("%i", Smonth);

if (month < 1 && month > 12)
printf("Число должно быть от 1 до 12");

else if (month >= 3 && month ");
scanf("%i“, &п);

printf("%i ", n);
// правильная форма слова определяется последней
// цифрой, за исключением чисел от 11 до 14
if (п > 100)

г

=

п % 100;

else г = п;

// здесь г - последние две цифры
if ( г >= 11 && г = 2 && г 31 12 2008
Последний день месяца!
С наступающим Новый годом!
Завтра 1.1.2009

Задача 104
// Вычисление даты следующего дня

«include
void main()

{

int day;
int month;

int year;
int last;
int r;

// 1, если текущий день последний день месяца
// если год високосный, то остаток от
// деления year на 4 равен нулю

Часть 1

68
printf("Введите в одной строке (цифрами) ");
printf("сегодняшним дату\п");
printfС(число месяц год) -> ");

scanf("XiXiXi", &day, «month, ftyear);
last = 0;

if (month == 2) {

if ((year X 4) != 0 && day == 28) last = 1;

if ((year X 4) == 0 && day == 29) last = 1;

}
else if ((month == 4 11 month == 6 11

month == 9 || month == 11)
&& (day =- 31))

last = 1;
else if (day == 31)

last = 1;
if (last == 1) {

printf("Последний день месяца I\n“);

day = 1;
if (month

12) {

month = 1;
year++;

printf("С наступамщим Новьм годом!\n");

}

else month++;
}
else day++;

printf ("Завтра Xi Xi Xi",day,month,year);

printf("\nflnn завершения наймите “);
getcharQ;

Примеры и задачи

69

Инструкция switch
Общие замечания

Приступая к решению задач этого раздела, следует вспомнить, что:
□ инструкция switch используется для выбора одного из не­
скольких возможных вариантов дальнейшего хода программы;
□ алгоритм, реализуемый инструкцией switch, выглядит так:

□ выбор действия осуществляется в зависимости от равенства
значения переменной-селектора константе, указанной после
слова case;
□ если значение переменной-селектора не равно ни одной из
констант, записанных после case, то выполняются инструкции,
записанные после слова default;
□ в качестве переменной-селектора можно использовать пере­
менную целого или символьного типа.
Задачи

105. Написать программу, которая позволяет вычислить цену
жалюзи. Исходные данные: размер (ширина и высота, выражен­
ные в сантиметрах) и тип материала (пластик, текстиль, алюми­
ний). Далее приведен рекомендуемый вид экрана программы
(данные, введенные пользователем, выделены полужирным).
Жалюзи
Ширина (см) -> 75

Часть

70
Высота (см) -> 150
Материал:
1 - пластик
2 - текстиль
3 - алиминий
Ваш выбор -> 3

Цена за кв. м: 350.00 руб.
Площадь: 1.13 кв. м.
К оплате: 393.75 руб.

Задача 105
// Жалюзи - вычисляет цену жалюзи
// в зависимости от размера и материала
#include "stdio.h"

#include "conio.h"
void main()
{

float w,h; // ширина, высота
int m;

// материал:

// 1 - пластик; 2 - текстиль; 3 - алюминий;
float cena; // цена за 1 кв. м.

float s;

11 площадь

float sum; // сумма
printf("\пЖАЛЮЗИ\п");
printf(”\пШирина (см.) -> ");

scanf("%f",&w);
printf("Высота (см) -> ");

scanf("%f“,&h);
printf("Материал:\n");
printf("1 - пластик\п");
printf("2 - текстиль\п");

printf("3 - алюминий\п");

printf("Baui выбор ->");

Примеры и задачи____________________________________________ 71
scanf("%i”,&m);
switch ( m )
{

case 1: cena = 200; break;
case 2: cena = 250; break;
case 3: cena = 350; break;
default: cena = 0; break;

}
if ( cena != 0 )

{
s = (w * h) / 10000;
sum = s * cena;
printf("\nl4eHa за кв. м: %3.2f руб.”, cena);

printfC'XnlTnoiuaflb: %3.2f kb. m", s);

printf("\nK оплате: %3.2f руб.", sum);

}
else
printf("ХпНеправильно указан код материала");
printf("\п\пДля завершения нажмите ");

getchar();

}

106. Написать программу, которая позволяет вычислить стои­
мость печати фотографий. Исходные данные: размер фотографий
(9x12, 10x15 или 18x24) и их количество. Если заказанных фото­
графий больше 10, заказчику должна предоставляться скидка
10%. Далее приведен рекомендуемый вид экрана программы
(данные, введенные пользователем, выделены полужирным).
Фото
Размер:
1 - 9x12
2 - 10x15
3 - 18x24
Ваш выбор -> 1
Количество -> 12
Цена: 3.50 руб.

Часть

72
Количество: 12 шт.
Сумма: 42.00 руб.
Скидка: 4.20 руб.
К оплате: 37.80 руб.

Задача 106
// Фото - вычисляет цену заказа печати фотографий
#include "stdio.h"

#include "conio.h"
void main()
{

int k; // количество фотографий
int f; // формат: 1 - 9x12; 2 - 12x15; 3 - 18x24

float cena;

// цена за 1 шт.

float sum;

// сумма

float discount; // скидка
float itog;
printf("\пФОТО\п");
printf("Формат:\n");
printf("1 - 9xl2\n");

printf("2 - 12xl5\n");
printf("3 - 18x24\n");

printf("Ваш выбор ->");

scanf("%i",8f);
switch ( f )

{

case 1: cena = 3.50; break;
case 2: cena = 5.00; break;

case 3: cena = 8.50; break;
default: cena = 0; break;

}

Примеры и задачи

73

printf("Количество (шт.) -> ");

scanf("%i",&k);

х

if ( cena != 0 )

{
sum = к * cena;

printf("\пЦена за шт.: %3.2f руб.", cena);
printf("\пКоличество: %i шт.", к);
if ( к > 10 )

{

discount = sum * 0.1;
itog = sum - discount;
printf(”\nCyMMa: %3.2f руб.", sum);
printf("\nCKMflKa: %3.2f руб.", discount);

printf("\nK оплате: %3.2f руб.",itog);
}

else
printf(”\nK оплате: %3.2f руб.", sum);
}
else
printf("ХпНеправильно указан код материала");

%
printf("\n\n/lnB завершения нажмите ");

getcharQ;
}

107. Написать программу, которая позволяет вычислить стои­
мость заправки автомобиля. Исходные данные: тип топлива (бен­
зин 92, 95, 98 или дизельное топливо) и количество литров. Далее
приведен рекомендуемый вид экрана программы (данные, вве­
денные пользователем, выделены полужирным).
Бензин
Марка бензина:
1- 92
2- 95
3- 98
4 - DT
Ваш выбор -> 2

74

Часть 1

Литров -> 25
Цена за литр: 20.30 руб.
Литров: 25
К оплате: 507.50 руб.

Задача 107
// Бензин - вычисляет стоимость заправки автомобиля

♦include "stdio.h"
♦include "conio.h"
void main()
{

int m; I/ марка бензина: 1 - 92; 2 - 95; 3 - 98; 4 - DT

float cena;

// цена за 1 литр

float litr;

// литров

float sum;

// сумма

printf("\пБЕНЗИН\п");
printf("Марка бензина:\n");

printf("1 - 92\n");

printf("2 - 95\n");
printf("3 - 98\n");
printf("3 - DT\n");

printf("Bam выбор ->");

scanf("%i",8m);
switch ( m )
{

case 1: cena = 17.50; break;
case 2: cena = 20.30; break;
case 3: cena = 25.40; break;

case 4: cena = 18.50; break;
default: cena = 0; break;
}

printf("Литров -> ");

scanf("%f",&litr);

75

Примеры и задачи
if ( сепа != в )
{

sum = litr * сепа;
printf("\пЦена за литр: %3.2f руб.”, сепа);
printf("\пЛитров: %3.2f", litr);
printf(”\пК оплате: %3.2f руб.”, sum);

}
else
printf("\пНеправильно указан код топлива");
printf("\п\пДля завершения нажните ");

getchar();

}

108. Написать программу, которая запрашивает у пользователя
номер дня недели и затем выводит его название. Если введены
неправильные данные, программа должна вывести сообщение об
ошибке.
Задача 108
// Выводит название дня недели
«include

void main()

{
int nd; // номер дня недели
puts("\nBBeflHTe номер дня недели (1..7");

printf("->");

scanf("%i", &nd);
switch (nd)

{

case 1:

puts("Понедельник”); break;

case 2:

puts("BTopHHK");

break;

case 3:

puts("Cpefla");

break;

case 4:

puts("Четверг”);

break;

case 5:

puts("Пятница");

break;

case 6:

puts("Суббота");

break;

case 7:

puts("BocKpeceHbe"); break;

76

Часть 1
default: puts("Число должно быть в диапазоне 1..7");

}
getcharQ;
}

109. Написать программу, которая вычисляет доход по вкладу.
Процентная ставка зависит от срока вклада:
Срок

3 мес.

6 мес.

12 мес.

18 мес.

24 мес.

36 мес.

9,0%

11,5%

13,5%

15,0%

18,0%

24,0%

Процент

Задача 109
// Доход по вкладу
#include "stdio.h"
#include "conio.h”

void mainQ

{

float value;
int period;
float rate;

float profit;
printf("value->");

scanf("%f",&value);
printf("period->");

scanf("%i",&period);
switch ( period )
{

case 3:

rate=9.0; break;

case 6:

rate=11.5; break;

case 12: rate=13.5; break;

case 18: rate=15.0; break;
case 24: rate=18.0; break;

77

Примеры и задачи
case 36: rate=24; break;

default: period = 0;

if ( period !=0 )

{
printf("\nrate: %6.2f", rate );
profit = value * rate/100/12 * period;

printf("\nprofit: %6.2f”, profit);

}
else
printf(”Not valid period”);

printf(”");

getcharQ;

}
110. Написать программу, которая вычисляет стоимость между­
городнего телефонного разговора (цена одной минуты зависит от
расстояния до города, в котором находится абонент). Исходные
данные для программы: код города и длительность разговора.
Далее приведены коды некоторых городов и рекомендуемый вид
экрана программы (данные, введенные пользователем, выделены
полужирным).
Город

Код

Цена минуты (руб.)

Владивосток

423

2,2

Москва

495

1,0

Мурманск

815

1,2

Самара

846

1,4

Вычисление стоимости разговора по телефону
Введите исходные данные:
Код города ->423
Длительность разговора (целое кол-во минут) -> 3
Город: Владивосток
Цена минуты: 2.20 руб.
Стоимость разговора: 6.60 руб.

Часть

78

Задача 110
// Определение стоимости междугороднего
// телефонного разговора
«Include
void main()

{

int kod;

// код города

float cena;

// цена минуты

int dlit;

// длительность разговора

float summ;

// стоимость разговора

prirrtf("\nESbi4HcneHne стоимости разговора по телефону.\п");

printff'BBeflHTe исходные данные:\п");

printf("Длительность разговора (целое кол-во минут) ->");

scanf("%i", &dlit);
puts("Kofl города");

put s("Владивосток\1432");
puts("MocKBa\t\t495");

puts("MypMaHCK\t815“);

puts("CaMapa\t\t846");
printf("->");

scanf("%i", &kod);
printf("Город: ");
switch (kod)

{
case 432: puts(“Владивосток");

cena = 2.2;

break;
case 495:

puts("MocKBa");
cena = 1;

break;
case 815: puts("Мурманск");

cena =1.2;

break;

case 846: puts("Самара");
cena = 1.4;

break;

79

Примеры и задачи
default:

printf("Неверно введен код.");
села = 0;

}
if (cena != 0) {

summ = cena * dlit;
printf("LleHa минуты: %i руб.\п", cena);
printf("Стоимость разговора: %3.2f руб.\п", summ);

}
printf("\пДля завершения нажмите ");

getchar();

111. Написать программу, которая по дате определяет соответст­
вующий ей день недели. Для вычисления дня недели воспользуй­
тесь формулой:

с
|(13w-l)
+У+
+
-2с+ 777) mod 7.
J
L5
.4. .4.

Здесь d — число месяца, т — номер месяца, если начинать счет
с марта, как это делали в Древнем Риме (март— 1, апрель — 2,...,
февраль — 12), Y — номер года в столетии, с — количество сто­
летий. Квадратные скобки означают, что нужно взять целую
часть от заключенного в них значения. Вычисленное по формуле
число определяет день недели: 1 — понедельник, 2 — втор­
ник, ..., 6 — суббота, 0 — воскресенье.
Задача 111
И По дате определяет день недели

#include

void main()

{
int day,month,year; // день, месяц, год

int с,у;

II столетие и год в столетии

int m;

Ц месяц по древнеримскому календарю

int d;

// день недели

рЩ:5("\п0пределение дня недели по дате");
putsf'BeeflHTe дату: день месяц год.");

80

Часть 1
puts("HanpnMep, 5 12 2001");

printf("->");
scanf("%i %i %i", &day, &month, &year);
if (month == 1 || month == 2)

year--;

// январь и февраль относятся

11 к предыдущему году
m = month - 2;

// год начинается с марта

if (m ");
scanf("%f”,&tl);
printf("t2 ->");

scanf("%f",&t2);
printf("dt ->");

scanf(”%f”,&dt);
n = (t2 - tl)/dt + 1;
c = tl;

printf ("\n................ \n“);

printf("\n

C

F\n");

printf("\n................ \n”);
for (int i=0; i 20
Сумма первых 20 положительных чисел равна 210

Задача 120
// Вычисляет сумму первых п целых положительных чисел
#include

void main()

{
int n;

// кол-во суммируемых чисел

int summ;

// сумма

int i;

// счетчик циклов

printf("Вычисление суммы положительных чисел\п");
printf("Введите количество суммируемых чисел -> ");

scanf("%i", &п);

summ = 0;
for (i = 1; i 12
Сумма первых 12 положительных четных чисел равна 156

122. Написать программу, которая вычисляет сумму первых
« членов ряда: 1, 3, 5, 7 ... Количество суммируемых членов ряда
задается во время работы программы. Далее приведен рекомен­
дуемый вид экрана программы (данные, введенные пользовате­
лем, выделены полужирным).
Вычисление частичной суммы ряда: 1,3,5,7, ...
Введите количество суммируемых членов ряда -> 15
Сумма первых 15 членов ряда равна 330

Задача 122
// Вычисляет частичную сумму ряда: 1,3,6,9 ...
#include

void mainQ

{

int e;

и член ряда
и кол-во суммируемых членов
int summ = 0; И частичная сумма ряда
int i;
и счетчик циклов
int n;

printf("BbNHcneHMe частичной суммы ряда: 1,3,6,9, ...\п");
printf("Введите количество суммируемых членов ряда -> ");

scanf("%i", &п);
е = 1;

for (i = 1; i 15
Сумма первых 15 членов ряда равна 3.3182

Задача 123
// Вычисление суммы ряда 1+1/2+1/3+ ...
#include
void main()

{
int n;

11 кол-во суммируемых членов ряда

float i;

11 номер элемента ряда; если объявить как int,
// то при вычислении 1/i будет выполнено
// усечение дробной части

float elem;

// значение элемента ряда

float summ = 0 ; // сумма элементов ряда
printf("Вычисление частичной суммы ряда 1+1/2+1/3+...\п“);

printf(“Введите кол-во суммируемых членов ряда\п");
printf("-> ");
scanf("%i“,&n);

summ = 0;
for (i = 1; i ");
scanf("Xf", &a);

sum += a;
printf(“Введено чисел: Xi ", n);

printf("Сумма: X6.2f\n", sum);

}

94

Часть 1
sred = sum / L;
printf("Сред, арифметическое: %6.2f\n", sred);
printf("\пДля завершения нажмите ");

getchar();

}

129. Написать программу, которая вычисляет среднее арифме­
тическое последовательности дробных чисел, вводимых с кла­
виатуры. После ввода последнего числа программа должна вы­
вести минимальное и максимальное числа последовательности.
Количество чисел последовательности должно задаваться во
время работы программы. Далее приведен рекомендуемый вид
экрана программы (данные, введенные пользователем, выделены
полужирным).
Обработка последовательности дробных чисел.
Введите количество чисел последовательности -> 5
Вводите последовательность.
После ввода каждого числа нажимайте
-> 5.4
-> 7.8
-> 3.0
-> 1.5
-> 2.3

Количество чисел: 5
Среднее арифметическое: 4.00
Минимальное число: 1.5
Максимальное число: 7.8
Для завершения наймите

Задача 129
// Вычисляет среднее арифметическое и определяет
// минимальное и максимальное число последовательности
// дробных чисел, вводимых с клавиатуры
«include
void main()

{
float a;

// очередное число

int n;

11 количество чисел

float sum;

// сумма введенных чисел

Примеры и задачи

95

float sred;

// среднее арифметическое

float min;

// минимальное число последовательности

float max;

// максимальное число последовательности

int i;

// счетчик циклов

printf("06pa6oTKa последовательности дробных чисел.\п");

printf("Введите количество чисел последовательности ->");
scanf("%i", &п);

printf("Вводите последовательность.\п");
printf("После ввода каждого числа нажимайте ");
printf("->");

scanf(”%f",&a);

// вводим первое число последовательности

// предположим, что:

min = а; // пусть первое число является минимальны*!
max = а; // пусть первое число является максимальным
sum = а;

// введем остальные числа

for (i = 1; i < n; i++)
{

printf("->");
scanf("%f", &a);

sum += a;
if (a < min)

min = a;

if (a > max)

max = a;

}
sred = sum / n;

printf("KonH4ecTBo чисел: %i\n", n);
printf("Среднее арифметическое: %6.2f\n", sred);
printf("Минимальное число: %6.2f\n", min);

printf("Максимальное число: %6.2f\n", max);
printf("\nflnfl завершения нажмите ");

getcharQ;
}

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

96

Часть 1

Случайные числа
1

3
4
2
7
4
9
6
2
1
Сред, арифм.: 3.90

131. Написать программу, которая генерирует три последо­
вательности из десяти случайных чисел (в диапазоне от 1 до 10).
Для каждой последовательности программа должна рычислить
среднее арифметическое. Далее приведен рекомендуемый вид
экрана программы.
Случайные числа
6 10 42581773 сред. арифм.: 5.30
10 361 10 13876 сред. арифм.: 5.50
522542216 10 сред. арифм.: 3.90
Для завершения работы нажмите

Задача 131
// Вычисление среднего арифметического случайных
// последовательностей

#include
#include

// для доступа к srand и rand

#include

#define L 10

11 длина последовательности

#define N 3

// количество последовательностей

void

main()

{
int г;

и случайное число

int sum;

и summa чисел последовательности
и среднее арифметическое
и счетчики циклов

float sred;

int i,j;

Примеры и задачи
time_t t;

97

II текущее время - для инициализации
// генератора случайных чисел

srand((unsigned) time(&t));; // инициализация генератора
// случайных чисел
for (i = 1; i 16.50
!С, Гр.

100
200
300
400
500
600
700
800
900
1000

Стоимость, руб.
1.65
3.30
4.95
6.60
8.25
9.90
11.55
13.20
14.85
16.50

98

Часть 1

133. Написать программу, которая выводит таблицу значений
функции у = | х |. Диапазон изменения аргумента от -4 до 4, шаг
приращения аргумента 0,5.
Задача 133
// Таблица функции у=|х|

#include
#include "math.h"
«define

LB -4 // нижняя граница диапазона изменения аргумента

«define

НВ

4 // верхняя граница диапазона изменения аргумента

«define

DX

0.5

// приращение аргумента

void main()
{

float х, у;

// аргумент и значение функции

int п;

// кол-во точек

int i;

// счетчик циклов

printf("ХпТаблица значений функции у=|х| \п");

п = (НВ - LB)/DX + 1;
х = LB;

for (i = 1; i ”);
scanfC'Xf", &а);

printf("Верхняя граница отрезка -> ");
scanf("%f", &b);

printf("Приращение аргумента -> ");

scanf("%f", &dx);
n = (b - а) / dx;
x = a;

s = 0;
for (i = 1; i 49
Десятичному числу 49 соответствует двоичное 00110001
Для завершения нажните

Задача 141
Преобразование десятичного числа в двоичное

//

ffinclude

void main()

{

int dec;

// десятичное число

int v;

// вес формируемого разряда

int i;

// номер формируемого разряда

printf("\nnpeo6pa3OBaHne десятичного числа в двоичное\п");
printf("Введите целое число от 0 до 255 и нажните ");

printf("-> ");
scanf("%i", &dec);

printf("Десятичному числу %i соответствует двоичное ", dec);
v = 128;

// вес старшего (восьмого) разряда

for (i = 1; i = v)

{
printf("1");

dec -= v;
}

else printf("0");

v = v / 2; // вес следующего разряда в два раза меньше

}
printf("\n\n/Vifl завершения нажмите ");

getchar();

}

142. Написать программу проверки знания таблицы умножения.
Программа должна вывести 10 примеров и выставить оценку: за
10 правильных ответов — «отлично», за 9 и 8 — «хорошо», за 7

Часть 1

106

и 6 — «удовлетворительно», за 6 и менее — «неудовлетвори­
тельно». Далее приведен рекомендуемый вид экрана программы
(ответы пользователя выделены полужирным).
*** Проверка знания таблицы умножения ***
После примера введите ответ и нажмите .
5x3=15
7x7=49
1x4=4
4x3=12
9x4=36
8x8=64
7x8=52
Вы ошиблись! 7x8=56
4x7=28
3x5=15
2x5=10
Правильных ответов: 9
Оценка: Хорошо.

Задача 142
// Программа проверяет знание таблицы умножения
♦include

♦include

// для доступа к srand и rand

♦include
void main()

{
int numbl,numb2; и сомножители
int res;
и произведение

int koi = 0;

и ответ испытуемого
и количество правильных ответов

int ij
time_t t;

и счетчик циклов
// текущее время - для инициализации

int otv;

// генератора случайных чисел

printf("\*** Проверка знания таблицы умножения ***\п");
printfС После примера введите ответ и нажните ");

srand((unsigned) time(&t));; // инициализация генератора
// случайных чисел

Примеры и задачи

107

for (i = 1; i ");
scanf("%f",&xl);



printf(”х2 -> ");

scanf(”%f",&x2);
printf("dx -> ");

scanf("%f",&dx)j
X = xl;

printf(”....... —........ \n");

printf("

x

|

y\n");

printff'...................... .........\n")j
do
{

у = -2.4*x*x+5*x-3;
printf("%6.2f

| %6.2f\n" ,x ,y);

x += dx;

}
while ( x 0
t2 -> 10
dt-> 1

С
0.00

F

32.00

Примеры и задачи
00
00
00
00
00
00
00
00
00
00

113

33.80
35.60
37.40
39.20
41.00
42.80
44.60
46.40
48.20
50.00

Задача 146
// Таблица перевода температуры из градусов Цельсия
// в градусы Фаренгейта
«include "stdio.h"
«include "conio.h"
void main()

{

float tl,t2,dt;
float c,f;

printf("\nnepeeofl температуры из градусов Цельсия");
printf("\nB градусы Фаренгейта\п");

printf("tl -> ”);
scanf("%f",&tl);

printf("t2 -> ");
scanf(”%f",&t2);

printf("dt -> ");
scanf("%f”,&dt);
printf("\n..................... \n”);

printf("\n

C

F\n");

printf("\n..... ......... ...... \n");

c = tl;
do

Часть 1

114
{

f = (float)9/5 * с + 32;
printf("%5.2f

%5.2f\n", c,f);

с = c + dt;

}
while ( c 45
-> 23
-> 15

-> 0
Введено чисел:'3
Сумма чисел: 83
Среднее арифметическое: 27.67

Задача 147
// Вычисление среднего арифметического
// последовательности положительных чисел

#include

void mainQ

(
int a;
int n;

H число, введенное с клавиатуры
u количество чисел

int s;
float m;

// сумма чисел
// среднее арифметическое

Примеры и задачи

115

s = 0;
п = 0;
printf("\Вычисление среднего арифметического");
printf("последовательности положительных чисел.\п");
printf("Вводите числа. Для завершения введите ноль.\п");
do {

printf("-> ");
scanf("%i", &а);

if (а > 0)

{

s += а;
n++;
}

} while (a > 0);
printf("Введено чисел: %i\n", n);
printf("Сумма чисел: %i\n", s);

m

=

(float) s / n;

printf("Среднее арифметическое: %3.2f", m);
printf("\n\rWifl завершения нажмите ");

getcharQ;
}

I

148. Написать программу, которая определяет максимальное
число из введенной с клавиатуры последовательности положи­
тельных чисел (длина последовательности не ограничена). Далее
приведен рекомендуемый вид экрана программы (данные, вве­
денные пользователем, выделены полужирным).
Определение максимального числа из последовательности положительных чисел.
Вводите числа. Для завершения ввода введите ноль.
-> 56
-> 75
-> 43
-> 0
Максимальное число: 75

Задача 148
// Определение максимального числа
// в последовательности положительных чисел
Sinclude

Часть 1

116
void main()

{
int a; // очередное число
int m; 11 максимальное число

р1Л5("\п0пределение максимального числа");
puts("последовательности положительных чисел.");

puts("Вводите числа. Для завершения введите ноль.");
ш = 0;

do {
printf("-> ");

scanf("Xi", &a);

(a > m)

if

m

-

a;

}
while (a >0);
printf("Максимальное число: Xi", m);
printf("\рДля завершения нахмите ");

getcharQ;
}

149. Написать программу, которая определяет минимальное чис­
ло во введенной с клавиатуры последовательности положитель­
ных чисел (длина последовательности не ограничена). Далее при­
веден рекомендуемый вид экрана программы (данные, введенные
пользователем, выделены полужирным).
Определение минимального числа в последовательности положительных чисел.
Вводите числа. Для завершения ввода введите ноль.

->
->
->
->

12
75

9

-> 23

-> 0
Минимальное число: 9

Задача 149
// Определение минимального числа
// в последовательности положительных чисел

ttindude

Примеры и задачи

117

void main()
{

int а;

// очередное число

int min;

// минимальное число

printf("\пОпределение минимального числа\п");

printf("e последовательности положительных чисел.\п");
printf("Вводите числа. Для завершения ввода введите ноль.\п”);

printf("-> ");
scanf("%i", &а);

// пусть первое число минимальное

min = а;

while ( а > 0)

{
if (а < min) min = а;

printf("-> ");
scanf("%i", &а);

}
printf("Минимальное число последовательности: %i\n", min);

printf(”\пДля завершения нажните ”);
getchar();

}

150. Написать программу, которая проверяет, является ли вве­
денное пользователем целое число простым (простым называет­
ся число, которое делится только на единицу и на само себя). Да­
лее приведен рекомендуемый вид экрана программы (данные,
введенные пользователем, выделены полужирным).
Введите целое число и нажните
-> 17
17 - простое число.

Задача 150
// Проверяет, является ли число простым

#include
void main()

{
int n;

// число

118

Часть 1
int d;

// делитель

int г;

// остаток от деления п на d

printf("Введите целое число и наймите \n-> ");
scanf("Xi", &n);

11 сначала будем делить на два

d = 2;

do {
г = n % d;

if (г != 0) d++;

}

while ( r != 0 ); // пока n не разделится на d
if (d == n)
printf("%i - простое число" ,n);

else

printf("%i - не простое число",n);

printf("\п\пДля завершения нажните ");
getcharQ;

}

151. Написать программу приближенного вычисления интеграла
методом прямоугольников. Интервал и точность вычисления
должны задаваться во время работы программы, функция —
в программе. После каждого цикла вычислений программа долж­
на выводить вычисленное значение интеграла.
Задача 151
// Вычисление интеграла методом прямоугольников
«include
«include
void mainQ

{

float xl,x2; // границы отрезка
float е;
// точность вычисления
float dx;
int n;

и приращение аргумента
и количество интервалов

float x;

и аргумент

float y;

и значение функции в начале интервала

Примеры и задачи
float st;

/I значение интеграла на текущем шаге

float sp;

11 значение интеграла на текущем шаге

int i;

рг^^"\Приближенное вычисление интеграла\п");
printf("Нижняя граница интервала -> ");
scanf("%f"j &xl);

printf("Верхняя граница интервала -> ");
scanf("%f", &х2);

printf("Tpe6yeMafl точность вычисления -> ");

scanf("%f", &е);
dx = 0.5;

st = 0;
do

{

sp = st;
dx = dx / 2;
n = (x2 - xl) / dx;

x = xl;

st = 0;

for (i = 0; i e);

printf("\nflnfl завершения нажмите ");
getchar();

119

Часть 1

120

152. Написать программу, которая «задумывает» число в диапа­
зоне от 1 до 10 и предлагает пользователю угадать его за пять
попыток. Далее приведен рекомендуемый вид экрана программы
(данные, введенные пользователем, выделены полужирным).
Компьютер "задумал" число от 1 до 10.
Вы должны его угадать за пять попыток.
Введите число и наймите
-> 5
Нет.

-> 3
ВЫ ВЫИГРАЛИ! Поздравляю!

Задача 152
// Игра "Угадай число"
«include

11 для доступа к srand

«include
«include
void main()

{
int comp;

// задуманное число

int igrok;

// вариант игрока

int n;

// количество попыток

time_t t;

// текущее время - для инициализации
// генератора случайных чисел

srand((unsigned) time(&t));

comp = rand () % 10 +1 ;

// число от 1 до 10

clrscr();
срг1пН("\п\гКомпыотер \”задумал\" число от 1 до 10.\п\г");

cprintf("Bbi должны его угадать за пять попыток.");
сprintf("Введите число и намните ");

п = 0;

do {
cprintf(”\n\r->");

Примеры и задачи

121

cscanf(”%i",&igrok);
п++;

}

while ((igrok != comp)&&(n < 3));

if (igrok == comp)

{
cprintf("\n\rBbl ВЫИГРАЛИ! Поздравляю!");

}
else

{
cprintf("\n\rBbi проиграли.);
cprintf("KoMnbrarep \"задумал\" число %d",comp);

}
cprintf("\n\rflnfl завершения нажмите любую клавишу...");

getcharQ;
getcharQ;

}

153. Написать программу приближенного вычисления интеграла
методом трапеций. Интервал и точность вычисления должны
задаваться во время работы программы. После каждого цикла
вычислений программа должна выводить вычисленное значение
интеграла, число интервалов и шаг изменения аргумента.

Цикл while
Общие замечания
Приступая к решению задач этого раздела, следует вспомнить,
что:
□ while — это цикл с предусловием, т. е. возможна ситуация, при
которой инструкции тела цикла не будут выполнены ни разу;
□ алгоритм, реализуемый инструкцией while, выглядит так:

722

Часть 1

□ инструкции цикла while выполняются до тех пор, пока усло­
вие истинно (значение выражения Условие не равно нулю);
□ для того чтобы цикл while завершился, в его теле должны при­
сутствовать инструкции, влияющие на значения переменных,
входящих в условие выполнения цикла;

□ цикл while обычно используется для организации приближен­
ных вычислений, а также в задачах поиска и обработки дан­
ных, вводимых с клавиатуры или из файла.
Задачи

154. Написать программу, которая выводит на экран таблицу
значения функции у - 2х2 - 5т - 8 в диапазоне от -4 до 4. Шаг
изменения аргумента равен 0,5.
Задача 154
// Выводит таблицу функции

#include
void main()
{

float x,dx;
float xl,x2;

float у;
xi = -4;
х2 = 4;

И аргумент и его приращение
// диапазон изменения аргумента
// значение функции

Примеры и задачи___________________________________________ 123
dx = 0.5;
х = xl;
printfC-.... -...... \n");

printf("

x

I

y\n");

printfC.............. \n");

while (x < x2)

{
у = x*x + 2;
printf("%3.2f

| %3.2f\n", x, y);

x += dx;
}

printfC.....................-An-);
printf("\пДля завершения нажмите ”);

getcharQ;
}

155. Написать программу, которая вычисляет число «Пи»
с заданной пользователем точностью. Для вычисления числа л
воспользуйтесь тем, что значение частичной суммы ряда
1 - 1/3 + 1/5 - 1/7 + 1/9 ..., при суммировании достаточно боль­
шого количества членов, приближается к я/4. Далее приведен
рекомендуемый вид экрана программы (данные, введенные поль­
зователем, выделены полужирным).
Задайте точность вычисления Пи -> 0.001
Значение числа Пи с точностью 0.001000 равно 3.143589
Просуммировано 502 членов ряда.
Для завершения нахмите

Задача 155
// Вычисление числа "Пи”
^include

void main()
{

float p;

// вычисляемое значение Пи

float t;

// точность вычисления

Часть 1

124
int n;

11 номер члена ряда

float el;

// значение члена ряда

р = 0;
п — 1;
el = 1; // начальное значение
printf("\пЗадайте точность вычисления Пи -> ");
scanf("%f", &t);

while (el >= t )
{
el = (float) 1 / (2*n -1);
if ((n % 2) == 0)

P -= el;
else p += el;

n++;

}
p = P*4;
printf(”\пЗначение Пи с точностью Xf равно %f\n”, t, р);
printf("Просуммировано %i членов ряда.\п", n);
printf("\пДля завершения наймите ");

getchar();

}

156. Написать программу, которая вычисляет наибольший об­
щий делитель двух целых чисел.
Задача 156
// Вычисление наибольшего общего делителя

// двух целых чисел (алгоритм Евклида)
#include
void main()

{

int

nl,n2;

int

nod;

11 наибольший общий делитель

int

г;

И остаток от деления nl на п2

I/ числа, НОД которых надо вычислить

printf("ХпВычисление наибольшего общего делителя ”);
printf("для двух целых чисел.\п");

Примеры и задачи

125

printf("Введите в одной строке два числа ");
printff'M наймите ");
printf("-> ");
scanf("XiXi", &nl, &n2);

printf("НОД чисел Xi и Xi - это ", nl, n2);

while (nl X n2)
{
г = nl X n2; // остаток от деления

nl = п2;
п2 = г;

}
nod = п2;
printf("Xi\n", nod);
printf("\nflnn завершения нажмите ")j
getchar();

}

МАССИВЫ
Общие замечания
Приступая к решению задач этого раздела, следует вспомнить,
что:
□ массив — это структура данных, представляющая собой сово­
купность элементов одного типа;
□ в инструкции объявления массива указывается количество
элементов массива;
□ элементы массива нумеруются с нуля;
□ доступ к элементу массива осуществляется путем указания
индекса (номера) элемента. В качестве индекса можно исполь­
зовать константу, переменную или выражение целого типа.
Индекс может меняться от 0 до и - 1, где п — число элементов
массива;
□ доступ к элементам массива можно осуществить при помощи
указателя;

126

Часть 1

□ в инструкции объявления массива удобно использовать име­
нованную константу, объявленную в директиве #define;
□ для ввода, вывода и обработки массивов удобно использовать
инструкции циклов (for, while);
□ типичной ошибкой при работе с массивами является обра­
щение к несуществующему элементу, т. е. выход индекса за
допустимые пределы значений.

Задачи
157. Написать программу, которая записывает введенные с кла­
виатуры данные в одномерный массив целого типа, состоящий из
семи элементов. Перед вводом каждого элемента должна выво­
диться подсказка с номером элемента. После ввода последнего
элемента программа должна вывести введенный массив и вычис­
лить среднее арифметическое его элементов. Далее приведен
рекомендуемый вид экрана программы (данные, введенные поль­
зователем, выделены полужирным).
Ввод массива целых чисел
После ввода каждого числа нажмите
а[0] -> 10
а[1] -> 16
а[2] -> 14
а[3] -> 5
а[4] -> 10
а[5] -> 22
а[6] -> 22

16
10
14
Массив: 10
5
Среднее арифметическое: 14.00

22

22

Задача 157
// Ввод, вывод и обработка массива

#include

void main()
{
int a[7]; // массив

int sum;

// сумма элементов массива

float m;

// среднее арифметическое

127

Примеры и задачи
int j;

printf("\nBBOfl массива целых чисел”);
printf("После ввода каждого числа нажмите \n");

// ввод массива
for ( j = 0; j < 7; j++)

{
printf("na[%i] -> ", j);

scanf("%i“,&a[j]);
}
// вывод массива
printf("\nMaccHe: \n“);

for ( j = 0; j < 7; j++)

{
printf("%i

", a[j]);

}
sum = 0;

// вычислить сумму элементов

for ( j = 0; j < 7; j++)
{

sum = sum + a[j];
}

m = sum / 7;
printf("Среднее арифметическое: %f", m);
printf("\пДля завершения нажмите ");

getcharQ;
}

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

Часть 1

128

ром элемента. Далее приведен рекомендуемый вид экрана про­
граммы (данные, введенные пользователем, выделены полужир­
ным).
Введите массив целых чисел.
После ввода каждого числа нажимайте
а[1] -> 12
а[2] -> 0
а[3] -> 3
а[4] -> -1
а[5] -> 0

В массиве 3 ненулевых элемента

Задача 158
// Подсчет ненулевых элементов массива

// (доступ к элементам по номеру)

♦include

♦define SIZE 5 // размер массива

void main()

{
int a[SIZE];

// массив

int n = 0;

// кол-во ненулевых эл-тов

int i;

// индекс

printf("ХпВведите массив целых чисел.\n");
printf("После ввода каждого числа ");
printf("нажимайте \n");

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

{
printf("a[%i] ->",i+l);

scanf("Xi", &a[i]);

if (a[i] != 0)

n++;

)
printf("В массиве %i ненулевых элемента.\n", n);

printf("\nflnfl завершения нажмите ");
getcharQ;
}

Примеры и задачи

129

159. Написать программу, которая выводит минимальный эле­
мент введенного с клавиатуры массива целых чисел. Далее при­
веден рекомендуемый вид экрана программы (данные, введенные
пользователем, выделены полужирным).
Поиск минимального элемента массива
Введите в одной строке 5 целых чисел
и наймите
-> 23 0 45 -5 12
Минимальный элемент массива: -5

Задача 159
// Поиск минимального элемента массива
tfinclude
#define НВ

5

// размер массива

void main()

{
int a[HB];

11 массив

int min;

// номер минимального элемента

int i;

// индекс массива

printf("\nnoncK минимального элемента массива\п");
printf("Введите в одной строке ");

printf("%i целых чисел и нажмите \n", НВ);
printf("-> ");

for (i = 0; i < HB; i++)
scanf("%i",&a[i]);

min = 0; // предположим, что первый эл-т минимальный

// сравним оставшиеся эл-ты массива с минимальньм
for (i = 1; i < НВ; i++)
if (a[i] < a[min])

min

=

i;

printf("Минимальный элемент массива: a[%i]=%i ",

min+1, a[min]);
printf("\nflnfl завершения работы программы нахмите ");

getcharQ;

130

Часть 1

160. Написать программу, которая выводит минимальный эле­
мент введенного с клавиатуры массива целых чисел. Для доступа
к элементам массива используйте указатель.
Задача 160
// Поиск минимального элемента массива
// (доступ к элементам при помощи указателя)

«include
«define НВ

5

и размер массива

void main()

{
int a[HB];

int *min;

// массив
// номер минимального элемента

int *p;

// указатель на элемент массива

int i;

printff'\пПоиск минимального элемента массива\п");
printf("Введите в одной строке элементы массива,\п");

printf("%i целых чисел и нажмите \n", НВ);

printff'-> ”);
р = а;

for (i = 1; i 23 0 45 -5 12 0 -2 30 0 64

Сумма элементов массива: 184
Количество ненулевых элементов: 7
Среднее арифметическое ненулевых элементов: 23.86

162. Написать программу, которая вычисляет среднее арифмети­
ческое элементов массива без учета минимального и максималь­
ного элементов массива. Далее приведен рекомендуемый вид эк­
рана программы (данные, введенные пользователем, выделены
полужирным).
Среднее арифметическое без учета min и max значений
Введите массив (10 целых чисел в одной строке)
-> 12 10 5 7 15 4 10 17 23 7

Минимальный элемент: 4
Максимальный элемент: 23
Среднее арифм. без учета min и шах значений:

163. Написать программу, которая вычисляет среднюю (за неде­
лю) температуру воздуха. Исходные данные должны вводиться
во время работы программы. Далее приведен рекомендуемый вид
экрана программы (данные, введенные пользователем, выделены
полужирным).
Введите температуру воздуха:
Понедельник -> 12
Вторник -> 10
Среда -> 16
Четверг -> 18
Пятница -> 17
Суббота -> 16
Воскресенье -> 14

Средняя температура за неделю: 14.71 град.

132

Часть 1

Задача 163
// Вычисление средненедельной температуры воздуха
«include

void main()
{

11 названия дней недели - массив строковых констант
char *day[] = {"Понедельник","Вторник","Среда",

"Четверг","Пятница","Суббота","Воскресенье"};

float t[7];

11 температура

float sum;

11 сумма температур за неделю

float sred;

// средняя температура за неделю

int i;

printf("\nBeewTe температуру воздуха:\п");
for (i = 0; i b[i])
с[пн-+] = b[i++];

else {
c[m++] = a[k++];
c[m++] = b[i++];

}
} while ( к < SZ && i < SZ); // один из двух исходных

11 массивов полностью не переписан в массив С

while (к < SZ) // есть эл-ты А, не переписанные в С
с[пи+] = а(к++];
while (i < SZ) // есть эл-ты В, не переписанные в С

с[пн-ь] = b[i++];

140

Часть 1
printf("Массив - результат: \n");

i

for (i = 0; i < 2 * SZ; i++)

printf("%i ", c[i]);
printf("Для завершения работы нажмите \n");

getcharQ;

}

171. Написать программу, которая, используя метод бинарного
поиска, выполняет поиск в упорядоченном по возрастанию мас­
сиве.
Задача 171
// Бинарный поиск в упорядоченном массиве
«include
// размер массива

«define SZ 10

void main()

{
int a[SZ]; // массив целых
int obr;

// образец для поиска

int ok;

I/ 1 -

int verh,niz;

//
//

int sred;

//

int found;

и

int n;
int i;

//

11 ввод массива

printf("*** БинарнЛ поиск в упорядоченном массиве ***\п");
printf("Введите массив (в одной строке %i ", SZ);
printf("uenbix чисел) и нажмите \n");

printf("-> ");

for (i = 0; i < SZ; i++)
scanf("%i", &a[i]);

Примеры и задачи

141

// проверим, упорядочен ли массив по возрастанию
ok = 1; // пусть массив упорядочен

i = 0;
do

if (a[i] 175
-> 170
-> 180
-> 168
-> 170
-> 0

Средний рост: 172.6 см
У 2 учеников рост превмиает средний

Задача 172
// Анализ роста учеников

«include
«define

SZ 30

// максимальное кол-во учеников

void main()
{

int

г;

int

rost[SZ]; // рост всех учеников

int

п = 0;

// рост ученика
// кол-во учеников, о которых
// введены сведения

float sred;

// средний рост

int m = 0;

// кол-во учеников, у которых

int sum = 0;

// суммарный рост

// рост больше среднего
int i = 0;

Примеры и задачи___________________________________________ 143
printf("*** Анализ роста учеников ***\п");
printf("Введите рост (см) учеников\п");
printf("Для завершения введите 0 и нажмите \n");

do {
printf(”-> ");
scanf("%i", &r);

if ( r )

{

rost[i++] = r;
sum += r;
n++;

}

} while (r && i < SZ);
if ( n )

{
sred = (float) sum I n;
m = 0;

11 сравним рост каждого co средним
for (i = 0; i < n; i++)
if (rost(i] > sred) m++;
printf("Средний рост: X3.2f см\п", sred);
printf("У %i учеников рост превышает средний\п", m);

}
printf("\пДля завершения нажмите ”);

getcharQ;

}

173. Написать программу, которая вводит по строкам с клавиа­
туры двумерный массив и вычисляет сумму его элементов по
столбцам.
Задача 173
// Вычисление суммы элементов массива (по столбцам)

«include

144

Часть 1

#define

ROW 3

// кол-во строк

♦define

COL 5

// кол-во столбцов

void main()

{
int a[ROW][COL]; // массив

int s[COL];

/1 zywa элементов

int i,j;

printf("\nBBeflMTe массив\п");
printf("После ввода элементов каждой строки,");

printf("\n%i целых чисел, нажимайте \n", COL);
for (i = 0; i < ROW; i++) // ROW строк

{

printf("->");
for (j = 0; j < COL; j++)
scanf(”%i", &a[i][j]);

}

printf("\nBBefleHHbw массив\п");
for (i = 0; i < ROW; i++)
{

for (j = 0; j < COL; j++)
printf("%i " , a[i][j]);

printf("\n”);
}

11 "очистим" массив s
for (i = 0; i < COL; i++)
s[i] = 0;
// обработка

for (j = 0; j < COL; j++)

// для каждого столбца

for (i = 0; i < ROW; i++) // суммируем эл-ты
s[j] += a[i][j];
printf("............................ ~\n");

for (i = 0; i < COL; i++)
printf("%i ", s[i]);

145

Примеры и задачи
printf("\nXUifl завершения нажните ");
getcharQ;
}

174. Написать программу, которая вводит по строкам с клавиа­
туры двумерный массив и вычисляет сумму его элементов по
строкам.

175. Написать программу, которая обрабатывает результаты эк­
замена. Для каждой оценки программа должна вычислить про­
цент от общего количества оценок. Далее приведен рекомендуе­
мый вид экрана программы (данные, введенные пользователем,
выделены полужирным).
Обработка результатов экзамена
Введите исходные данные:
пятерок-> 12
четверок-> 10
троек-> 7
двоек-> 1

Результаты экзамена:
12%
пятерок
четверок 10%
7%
троек
двоек
1%

Для завершения нажните

Задача 175
// Обработка результатов экзамена
«include
void mainQ
{

int n[6];

// количество двоек, ... пятерок

int s = 0;

// всего оценок

float р[б]; // процент каждой оценки
char *mes[6] ={"\0", "\0", ”двоек\0","троек\0",
”четверок\0","пятерок\0"};

int i;

Часть 1

146
puts("Обработка результатов экзамена");

риЬ5("Введите исходные данные:");
for (i = 5; i >= 2; i~)

{
printf("%s

mes[i]);

scanf("Xi", &n[i]);

s += n[i];
}

11 вычислим процент каждой оценки

for (i = 2; i < б; i++)
p[i] = (float)n[i]/s*100;
puts("Результаты экзамена");

puts("..........-.................. ");
for (i = 5; i >= 2; i~)
printf("%8s

%2i

%2.0f%\n",mes[i], n[i], p[i]);

puts("............................. ");
puts("Для завершения программы наймите ");
getchar();

}

176. Написать программу, которая вводит по строкам с клавиа­
туры двумерный массив дробного типа (3x5— три строки по
пять элементов) и вычисляет среднее арифметическое элементов
строк. Далее приведен рекомендуемый вид экрана программы
(данные, введенные пользователем, выделены полужирным).
Ввод по строкам
Введите элемента строки (5 чисел) и наймите
Строка 1 -> 12 15 10 22 3
Строка 2 -> 10 10 3 5 12
Строка 3 -> 11 17 10 9 7
Массив:
15
12
10
10
17
11

10
3
10

22
5
9

Среднее арифметическое:
Строка 1: 12.40

3
12
7

Примеры и задачи
Строка 2: 8.00
Строка 3: 10.80

Для завершения наймите

Задача 176
#include

void main()
{

int a[3][5]; // массив 3x5 - 3 строки по 5 элементов
int г;

// номер строки

int с;

// номер столбца

int sum;

// сумма элементов строки

float m;

// среднее арифметическое

int к;

printf("\пВвод по строкам\п");
printf("Введите элементы строки (5 чисел) и наймите \n");

// ввод массива

к =1;
for ( г = 0; г < 3; г++)
{
printf("Строка %i -> ", к);

for ( с = 0; с < 5; с ++)
{

scanf("%i",&a[r][c]);

}

к++;
}

printf("\n.......................... \п");

// вывод массива
printf("\пМассив\п");
for ( г = 0; г < 3; г++)

147

Часть 1

148

■for ( с » 0; с < 5; с ++)
{

printf("X5i",a[r][с]);
}
printf("\n");

11 обработка массива

printf("Среднее арифметическое:\n");
k ■ 1;

for ( г - 0; г < 3; r++)

{
11 вычислить среднее арифметическое
// элементов строки

sum » 0;

for ( с » 0; с < 5; с ++)

{
sum = sum + a[r][c];

}
m » (float) sum / 5;
printf("Строка Xi: X5.2f\n", k, m);

k++;

printf("\пДля завершения нажмите ");
getcharQ;

}

177. Написать программу, которая определяет номер строки
двумерного массива, сумма элементов которой максимальна.
Задача 177
// Строка с максимальной суммой элементов
«include

«define N 3

// размер квадратной матрицы

149

Примеры и задачи
void main()

{

int m[N][N+l]; // последний столбец используем
// для хранения суммы эл-тов строки

int max;

// строка с максимальной суммой

int i,j;

11 индексы

// элементов

р1Л5("\п0пределение строки с максимальной");
puts("суммой элементов");
printf("Введите матрицу %ix%i\n", N, N);

for (i = 0; i < N; i++)
{

printf("Элементы Xi-й строки -> ", i+1);
for (j = 0; j < N; j++)
scanf(”%i", &m[i][j]);
}
11 для каждой строки вычислим сумму эл-тов

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

{

m[i][N] = 0;
for(j = 0; j < N; j++)
m[i][N] += m[i][j];

}
// найдем строку с максимальной суммой

max = 0;
for (i = 1; i < N; i++)
if ( m[i][N] > m[max][N] )

max = i;
printf("\nB %1-й строке сумма элементов", max+1);

printf("максимальна и равна %i\n", m[max][N]);
printf("\пДля завершения нажмите \n”);
getcharQ;

}

150

Часть 1

178. Написать программу, которая проверяет, является ли вве­
денная с клавиатуры квадратная матрица «магическим квадра­
том». Магическим квадратом называется матрица, у которой
сумма чисел в каждом горизонтальном ряду, в каждом верти­
кальном и по каждой из диагоналей одна и та же (см. приведен­
ный далее рисунок).
2

9

4

7
6

5
1

3
8

13
2
3
16

8 12 1
11 7 14
10 6 15
5 9 4

Задача 178
// Проверяет, является ли матрица "магическим" квадратом

#include
«define

SZ 5

// максимальный размер матрицы

void main()
{
int a[SZ][SZ];

H матрица

int n;

и размер проверяемой матрицы

int ok;
int i,j;

// матрица - "магический" квадрат"
и индексы массива

int sum;

// сумма эл-тов главной диагонали

int temp;

// сурма элементов текущей строки, столбца
И или второй диагонали матрицы

printf("*** МАГИЧЕСКИЙ КВАДРАТ ***\п");

printf("ХпВведите размер матрицы (3..Xi) -> ", SZ);
scanf("%i", &n);

printf("Введите строки матрицы\п");
printf("После ввода строки, Xi целых чисел, ", п);

printf("нажимайте \n");
for (i = 0; i < n; i++)

{
printf("->“);

for (j = 0; j < n; j++)

151

Примеры и задачи
scanf("%i", &a[i][j]);

}
// пусть матрица - "магический" квадрат

ok = 1;

// вычислим сумму элементов главной диагонали
sum = 0;

for (i = 0; i < n; i++)
sum += a[i][i]j

I/ вычисляем суммы по строкам

i = 0;
do {

temp = 0; // сумма эл-тов текущей строки
for (j = 0; j < n; 3++)

temp += a[i][j]j
if (temp != sum)

ok = 0;

i++J

} while (ok && i < n);
if ( ok )

{

11 здесь сумма элементов каждой строки
// равна сумме элементов главной диагонали
// вычисляем суммы по столбцам
j = 0;
do {
temp = 0; // сумма эл-тов текущего столбца

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

temp += a[i][j]j
if (temp != sum)

ok = 0;

3++;
} while (ok && i < n);

}
if ( ok ) {

11 здесь сумма элементов каждой строки
// равна сумме элементов каждого столбца
// и сумме элементов главной диагонали.

Часть 1

152
11 вычислим сумму элементов второй

// главной диагонали
temp = 0;

i = п - 1;
for (j = 0; j < n; j++)
temp += a[i~][j];
if (temp != sum)

ok = 0;

}
printf("Введенная матрица ");

if ( !ok )
printf("не
printf("является магическим квадратом.\n");
printf("\пДля завершения наймите ");

getcharQ;

}

179. Написать программу, которая вычисляет доход по вкладу.
Процентная ставка по вкладу определяется на основе данных,
приведенных в таблице.
Срок вклада и процентная ставка

Сумма,
тыс. руб.

3 мес.

6 мес.

12 мес.

18 мес.

24 мес.

36 мес.

до 50

15,0%

16,5%

18,0%

19,5%

21,0%

22,0%

до 250

16,5%

18,0%

19,5%

21,0%

22,5%

24,0%

свыше 250

18,5%

19,5%

21,0%

22,5%

24,0%

27,0%

Задача 179
// Доход по вкладу
#include
#include
void mainQ

{

Примеры и задачи
// процентная ставка

■float rate[3][6] =
{

15.0,16.5,18.0,19.5,21.0,24.0,
16.5,18.0,19.5,21.0,22.5,24.0,
18.0,19.5,21.0,22.5,24.0,27.0

Ь
float value;

// сумма

int period;

// срок (месяцев)

float profit; // доход

int r,c;
// вывести таблицу
for (int r=0; r 0 11
Германия-) 10 2
Норвегия-) 4 2 1
Россия-) 2 3 2
Финляндия-) 12 2

1
2
3
4
5

Команда Зол. Сер. Бр. Всего Очков
7
Норвегия 4
2
1
45
Россия
2
3
2
7
42
29
2
2
5
Финляндия 1
0
17
2
Германия 1
3
1
2
11
1
0
Австрия

155

Примеры и задачи

Задача 180
// Результат соревнований
«include
«include
«include

// число команд

«define NC 5

void main()
{
char *team[] = {
"Австрия","Германия","Норвегия",
"Россия“,"Финляндия"

};

// таблица результатов

int result[NC+l][6];
// result[i][0] - золотых
// result[i][l] - серебряных
// result[i][2] - бронзовых
И result[i][3] - всего

// result[i] [4] - очков
// result[i][5] - номер команды

// NC+1-я строка используется как буфер
// при сортировке таблица
int i,j;
int max;

// номер строки таблицы, в которой
// количество очков максимально

printf("Введите в одной строке”);
printf("количество золотых,\п");

printf(”cepe6pHHHX и бронзовых медалей\п");
// ввод исходных данных
for (i = 0; i < NC; i++)
{

printf("%s ->", team[i]);

Часть

156
scanf("%i%i%i", &result[i][0],

// золотых

&result[i][l],

11 серебряных

&result[i][2]);

11 бронзовых

result[i][5] = i; // номер команды

// вычислим общее количество медалей и очков
for (i = 0; i < NC; i++)
{
result[i][3] =

result[i][0]+result[i][l]+result[i][2];
result [i] [4] =

result[i][0]*7+result[i][l]*6+

result[i][2]*5;
}

// сортировка строк (методом простого выбора)

// в соответствии с количеством очков
for (i = 0; i < NC+1; i++)
{

11 в части таблицы, начиная со строки i,

// найти j-ю строку, в которой элемент
// result[j][5] максимальный
max = i; //

пусть это строка с номером i

for (j = i+1; j < NC; j++)

{
if (result[j][4] > result[max][4])

max = j;
}
// поменяем местами i-ю строку co строкой

// с номером max
11 в качестве буфера используем последний)

// строку таблицы
for (j = 0; j < 6; j++)
result[NC][j] = result[i][j];

for (j = 0; j < 6; j++)
result[i][j] = result[max][j];

Примеры и задачи___________________________________________ 757

for (j - 0; j < б; j++)
result[max][j] - result[NC][j];

>
11 здесь таблица упорядочена

printf("%3s%12s%8s%8s%8s%8s%8s",
■"•/•Команда",
"Золото","Серебро","Бронза",

"Всего","Очков");

for (i = 0; i < NC; i++)
{
printf("\nX12s", team[ result[i][5]
for (j = 0; j < 5; j++)
printf("X8i“, result[i][j]);
}

]);

printf("\nflnfl завершения нахмите ");
getcharQ;

}

СИМВОЛЫ И СТРОКИ
Общие замечания
Приступая к решению задач этого раздела, следует вспомнить,
что:

□ каждому символу соответствует число — код этого символа;
□ строка — это массив символов;
□ последним символом строки обязательно должен быть нуль —
символ, код которого равен 0, и который в тексте программы
изображается так: \0;
□ сообщения или подсказки, используемые в программе, удобно
представить как массив указателей на строки. При этом ини­
циализировать массив и задать сообщения можно в инструк­
ции объявления массива:
char *mes[] ={"Сообщение 1","Сообщение 2", ... , "Сообщение”};

Часть 1

158

□ если вводимая во время работы программы строка содержит
пробелы, то функция scanf вводит только часть строки — до
первого пробела, а функция gets — всю строку, в том числе и
соответствующий клавише символ \п.

Задачи
181. Написать программу, которая запрашивает имя пользовате­
ля и здоровается с ним. Далее приведен рекомендуемый вид эк­
рана программы (данные, введенные пользователем, выделены
полужирным).
Введите свое имя и фамилию, затем нажмите
-> Вася Иванов
Здравствуйте, Вася Иванов!

Задача 181
// Приветствие
«include

void mainQ

(
char name[15]; // имя
char fam[20];

// фамилия

printf("Введите свое имя и фамилию, затем нажните ");

printf("-> ");

// функция scanf читает из буфера клавиатуры символы
// до разделителя - пробела
scanf("%s", Sname);
scanf("%s", &fam);

printf("Здравствуйте, %s %s!\n", name, fam);

printf("\nflnH завершения нажмите ”);

getcharQ;

}

Примеры и задачи

159

182. Написать программу, которая запрашивает у пользователя
имя и отчество, затем здоровается с ним. Для ввода используйте
функцию getch().
Задача 182

// Приветствие (посимвольный ввод строки)
#include

void main()
{
char name[40]; // имя и отчество пользователя
char ch;
int i;
printf("Baiue имя-> ");
i = 0;
while ((ch=getch()) != 13 && i < 40) // пока не
{
putch(ch);
name[i++] = ch;
}
name[i] = ’\0’;
printf("ХпПривет, Xs!\n", name);
printf("\n/Vw завершения нахмите “);
getchar();
}

183. Написать программу, которая вычисляет длину введенной
с клавиатуры строки.
Задача 183

// Вычисляет длину строки
#include
void main()
{
char st[80]; // буфер для ввода строки
int i = 0; Ц длина строки

Часть 1

160
puts("\nBBeflHTe строку и нажмите ");

printf("->");

gets(st);
while( st[i++] != '\0')
9

printf("Длина введенной строки: %i\n”, i);
printf("Для завершения работы нажмите ");

getcharQ;
}

184. Написать программу, которая выводит на экран сообщение
в «телеграфном» стиле: буквы слов сообщения должны быть раз­
делены символами тире.
Задача 184
// Посимвольный вывод сообщения

ttinclude
void mainQ
{

char msg[] = "\п\гПриветствую великого программиста!\0";
// номер символа

int i;

i = 0;
while(msg[i])

{

putch(msg[i]);
if ( msg[i+l] != ' '
putch('-');
i++;

}
printf("\п\пДля завершения нажмите ");

getcharQ;
}

185. Написать программу, которая выводит код введенного поль­
зователем символа. Программа должна завершать работу в ре-

Примеры и задачи

161

зультате ввода, например, точки. Далее приведен рекомендуемый
вид экрана программы (данные, введенные пользователем, выде­
лены полужирным).
Вводите символы.
Для завершения введите точку.
->1
Символ: 1 Код: 49
->2
Символ: 2 Код: 50
->ы
Символ: ы Код:235
->.

Задача 185
// Выводит код символа

#include
void main()

{
unsigned char ch;

// Если ch объявить как char, то буквам русского
// алфавита будут соответствовать отрицательные числа
printf("\пВводите символы.\п");
printf('7Vifl завершения введите точку.\п");

do {

ch = getch();
printf("Символ: %c Код: %i\n", ch, ch);

} while ( ch != '.');
printf("\п\пДля завершения нажмите ");
getch();

}
186. Написать программу, которая выводит на экран первую
часть таблицы кодировки символов (символы с кодами от О
до 127). Таблица должна состоять из восьми колонок и шестна­
дцати строк. В первой колонке должны быть символы с кодом
от 0 до 15, во второй — от 16 до 31 и т. д.

162

Часть 1

Задача 186
И ASCII-таблица кодировки символов

«include
SM 128

«define

//

0

- символы с кодами 0 - 127

// 128 - символы с кодами 128 - 256
void main()

{
// Если ch объявить как char, то буквам русского

// алфавита будут соответствовать отрицательные числа
unsigned char ch;

// символ

int i, j;
printf("\nASCII-Ta6nnua кодировки символов\п");

for (i = 0; i ");

gets(full);

pi = full;

// извлечь имя
р2 = first;

*р2 = '\0';
while ( (*pl != ' ') && ( *pl != NULL ) )

{

*р2 = *р1;
pi++;
р2++;

}

*р2 = *\0';
// извлечь отчество
р2 = mid;

*р2 = 1\0’;

166

Часть 1
if ( *pl == ' ')

{
pi++;
while ( (*pl != 1 ') && ( *pl != NULL ) )

{

*p2 = *pl;
pl++;

P2++;

}

*p2 = ’\0’;

// извлечь фамилию
p2 = last;
*P2 = -\0';

if ( *pi == 1 ■)

{
pl++;

while ( (*pl != ' ') && ( *pl != NULL ) )
{

*p2 = *pl;
pl++;

P2++;

}
*p2 = '\0';

// Проверить, сколько подстрок удалось извлечь
// из строки. Если две, то вторая подстрока

// это фамилия, а не отчество
if ( *last == '\0' )

{
strcpy(last,mid);
♦mid = '\0';

}
printf (" \п14ля: %s", first);

printf("\nOT4ecTBo:%s”,mid);

printf("\пФамилия:%s",last);

Примеры и задачи___________________________________________ 167
printf("\пДля завершения нажмите ");

getcharQ;
}

190. Написать программу, которая проверяет, является ли вве­
денная с клавиатуры строка целым числом. Далее приведен
рекомендуемый вид экрана программы (данные, введенные поль­
зователем, выделены полужирным).
Введите целое число и нажмите
->23.5
Введенная строка не является целый числом.

Задача 190
// Проверяет, является ли строка целый числом

#include
void mainQ
{

char st[40];

// строка

int i;

11 номер проверяемого символа

printfСВведите целое число и нажмите ");

printf("->");
scanf("%s",&st);

i = 0;
while (st[i] >= '0' && st[i] 11101010
Двоичному числу 11101010 соответствует десятичное 234
Для завершения нажмите

Задача 194
// Преобразует двоичное число в десятичное

ttindude
#include

I

void main()

{
char bin[16];

// изображение двоичного числа

long int dec;

// десятичное число

int i;

// номер разряда двоичного числа

int v;

Ц вес i-ro разряда двоичного числа

printf("Введите восьмиразрядное двоичное число ");
printf("и нажмите ");
printf("->");

scanf("%s", &bin);
dec = 0;
v = 1;

// вес младшего (0-го) разряда двоичного числа

for ( i = strlen(bin) -1; i >= 0; i--)
{
if ( bin[i] == '1' )

Примеры и задачи

171

dec += v;

v *= 2;

// вес следующего разряда

}
printf("Двоичному числу %s", bin);

printf(" соответствует десятичное %d", dec);
printf("\пДля завершения нажмите ”);

getcharQ;
}

195. Написать программу, которая преобразует введенное с кла­
виатуры двухразрядное шестнадцатеричное число в десятичное.
Задача 195
// Преобразует шестнадцатеричное число в десятичное
«include
«include
void main()
{

char st[5];

// шестнадцатеричное число

unsigned int dec;// десятичное число

int v;

// вес разряда шестнадцатеричного числа

int err = 0;

// err == 1 - в строке недопустимый символ

int i;
printf("Введите шестнадцатеричное ");

printf("(He более 4-х знаков) число\п");

printf("-> '■);
scanf("%s",&st);

// преобразуем введенную строку к верхнему регистру
strupr(st);

dec = 0;

v = 1;

Ц вес младшего разряда шестнадцатеричного числа

for ( i = strlen(st) -1; i >= 0; i--)
{

Часть 1

172
//printf("\n%d\n",v);
if (st[i] >= '0' && st[i] = 'A' && st[i] 67
Введите основание системы счисления -> 2
Десятичному числу 67 соответствует число 100011 по основанию 2

Задача 196
// Преобразует десятичное число в другую
// систему счисления (от 2 до 10)
#include

Примеры и задачи

173

void main()
{

Ц основание системы счисления

int osn,
п,

// исходное число

сп,

// копия исходного числа

г;

II остаток от деления числа
// на основание сист. счисл.

char st[17]; 11 представление числа в заданной сист. счисл.

int i;

printf("\Введите целое число ->");

scanff'Xd", &п);
printf("Введите основание системы счисления -> ");

scanf("%d", &osn);

cn = n;
11

делим исходное число на основание системы

//

счисления до тех пор, пока остаток от деления

//

больше основания системы счисления.

//

Остаток от деления на каждом шаге - очередная цифра

st[16] ='\0';

i = 15;
do {
г = n

% osn;

11 очередная цифра

n = n / osn; /I целая часть деления

11 printff цифра :%d остаток:Xd\n", r,n);
st[i--] = r + 48; 11 преобразование цифры в символ

} while ( n > 0);

11 "сдвинем" сформированную строку в начало
i++;
int j = 0;

while(st[i])
st[j++] = st[i++];

stfj] = '\0';

st[i~] = ' ';
printf("Десятичному числу %d соответствует ", cn);
printf("4Hcno %s по основанию %d\n", st, osn);

Часть 1

174
printf("\пДля завершения нажмите ");

getchar();

}

197. Написать программу, которая преобразует введенное поль­
зователем десятичное число в шестнадцатеричное.
Задача 197
// Преобразует десятичное число в шестнадцатеричное
«include
void main()

{

int n;

// Исходное число

int г;

Ц Остаток от деления числа на основание сист. счисл.

char st[5]; // Представление числа в заданной сист. счисл.

int i;

printf("\nnpeo6pa3OBaHHe десятичного числа );
printf("e шестнадцатеричное\п");
printf("Введите целое число ->");

scanf("%d”, &п);

// делим исходное число на 16 до тех пор,
// пока остаток от деления больше 16

printf("\nflecflTH4HOMy числу %d", п);
printf(" соответствует шестнадцатеричное ");

st(5] = '\0';

1=4;
do {

г = п % 16;

// очередная цифра

n = п / 16;

// целая часть рез-та деления

if (г < 10)

st[i--] = г + 48;

// (int)'0'==48, (int)'l,==49 и т. д.

else st[i--] = г + 55; // (int)’A'=65, (int)'B'=66 и т. д.

} while ( п > 0);
// удалим начальные пробелы
i++;

Примеры и задачи

175

int j = 0;
while( st[i] )

st[j++] = st[i++];

st[j] = '\0'J
printf("Xs\n", st);

printf("\nflnfl завершения нажмите ");
getcharQ;

}

198. Написать программу, которая вычисляет значение выраже­
ния NoOiNjC^-.OkNk, где N;— целое одноразрядное число, Oj —
один из двух знаков простейших арифметических действий: сло­
жения (+) или вычитания (-). Далее приведен рекомендуемый
вид экрана программы (данные, введенные пользователем, выде­
лены полужирным).
Введите арифметическое вьражение,
например, 45+5-3-125+2 и нажмите (пробелы и другие знаки недопустимы)
->9-5+4+2-6
Значение введенного выражения: 4
Для завершения нажмите

Задача 198
// Вычисление значения арифметического выражения
«include

«include
void main()

{
char st[40];

// строка

char buf[10]; // изображение очередного числа

char op;

// оператор

int rez;

// значение выражения

int n;

// очередное число

int i,j;

printf("\пВведите арифметическое выражение,\n");
printf("например, 45+5-3-125+2 и нажмите ");

176

Часть 1

printf("(пробелы и другие знаки недопустима)\п");
printf("->");
scanf("%s", &st);
rez = 0; // значение выражения

op = ' ';
i = j = 0;

while( st[i] )

{
/I выделить число

j = 0;
while (st[i] >= '0' && st[i] ");

gets(mes);

for (i = 0; i < strlen(mes); i++)
{
if (mes[i] >= 'A' && mes[i] ';

else if (a < b)

res = '= '0' && ch FullName());
}

// освободить память, занимаемую объектами
for (int i = 0; i < HB; i++)

{

persones[i]->~TPerson();
}
printf("\nTo exit press ");

int ch = getcharQ;
return 0;
}

227.

Объявите класс TPerson и производные от него классы TStud

и TProf. Класс TPerson должен содержать общую информацию

Примеры и задачи

205

о персоне. Классы TStud и TProf должны расширять информацию
о персоне как о студенте и, соответственно, преподавателе.
Задача 227
class TPerson

{

char *fname;
char *lname;

public:

TPerson() {} 11 чтобы иметь

возможность создать массив объектов

TPerson(char* FirstName, char* LastName)

{
fname = new char[strlen(FirstName) + 1];
strcpy(fname, FirstName);

lname = new char[strlen(LastName) + 1];
strcpy(lname, LastName);
}

~TPerson()
{
delete[] fname;

delete[] lname;

char* FullName()

{
char* fullname =

new char[strlen(fname) + strlen(lname) + 2];
sprlntf(fullname, ”%s %s", fname, lname);
return fullname;

};
virtual void print()

};

{ }

206

Часть 1

И студент
class TStud : public TPerson

{
int group;

public:

TStud() {};
TStud(char* FirstName, char* LastName, int Group):
TPerson(FirstName,LastName)

{
group = Group;

}
~TStud()
{

}

void print()

// выводит информацию о студенте

{
printf("%s, gr. %i\n", this->FullName(), group);

}
};

// профессор
class TProf : public TPerson

{
char* kafedra;

public:
TProf() {};

TProf(char* FirstName, char* LastName, char* Kafedra):

TPerson(FirstName, LastName)
{

kafedra = new char[strlen(Kafedra) + 1];

strcpy(kafedra, Kafedra);
}

Примеры и задачи

207

-TProf()
{
delete[] kafedra;
}

// вьводит информацию о профессоре

print()

void

{
printf("%s, dep. %s\n", this->FullName(), kafedra);

}

};

228. Напишите программу, которая хранит в одном массиве ин­
формацию о студентах и преподавателях (см. задачу 227).
Задача 228
#include
#include
#include
II

11 Сюда поместить объявление классов TPerson, TStud и TProf
//

int main()

{
TPerson *pers[10]; //

// Внимание!

студенты и преподаватели

Значение, возвращаемое sizeof,

// зависит от разрядности платформа!

int К = sizeof(pers) / sizeof(TPerson*);

printf("Size of pers is %i\n", K);
// инициализация массива ОБЯЗАТЕЛЬНА
for (int i = 0; i < К; i++)

pers[i] = NULL;

Часть 1

208
pers[0] = new TStud(”Bart", "Simpson", 1358);
pers[l] = new TStud("Lisa", "Simpson", 1358);
pers[2] = new TProf("Homer", "Simpson",

"Nuclear Energy Systems");
1111 Вывод списка. Вариант 1

//for (int i = 0; i < К; i++)

//{
11

if ( pers[i] != NULL)

//

pers[i]->print();

//}

11 Вывод списка. Вариант 2

int i = 0;
while (pers[i] != NULL)

{

pers[i]->print();
i++;

}

11 чтобы typeid стала доступной,
11 надо добавить #include
printf("\nStudents:\n");

i = 0;
while (pers[i] != NULL) {
if (typeid(*pers[i]) == typeid(TStud)) {

pers[i]->print();
}
i++;

}
//// освободить память

//i = 0;
//while (pers[i] != NULL) {
11

delete pers[i];

//

i++;

//}

Примеры и задачи

209

printf("\nTo exit press ");
int ch = getchar();
return 0;

}
229. Объявите структуру book для программы работы с информа­
цией о книгах, например, в книжном магазине.
230. Напишите программу, формирующую массив структур book
(см. задачу 229). Информация о книгах должна вводиться с кла­
виатуры во время работы программы.

231. Объявите класс твоок для программы работы с информацией
о книгах, например, в книжном магазине.
232. Напишите программу, формирующую массив объектов твоок
(см. задачу 229). Информация о книгах должна вводиться с кла­
виатуры во время работы программы

ФАЙЛЫ
Общие замечания
Приступая к решению задач этого раздела, следует вспомнить,
что:
□ в программе, которая выполняет операции чтения из файла
или запись в файл, должна быть объявлена переменнаяуказатель на тип file;
□ для того чтобы файл стал доступен, его нужно открыть, ука­
зав, для выполнения какой операции открывается файл (чте­
ние, запись или обновление данных) и тип файла (двоичный
или текстовый);
□ при работе с файлами возможны ошибки. Поэтому рекоменду­
ется проверять результат выполнения потенциально опасных,
с точки зрения возникновения ошибок, операций с файлами
(например, fopen);

□ если в инструкции открытия файла путь к файлу не указан, то
по умолчанию предполагается, что файл находится в том же
каталоге, что и выполняемый файл программы;

Часть 1

210

□ при записи в тексте программы пути к файлу следует помнить,
что символ \ в строковых константах обозначает начало спе­
циальной последовательности символов (например, \п). По­
этому, чтобы путь к файлу был интерпретирован правильно,
символ \ следует продублировать (например: с: \\temp);
□ чтение данных из текстового файла обеспечивает функция
f scanf, запись — функция fprintf;
□ по завершении работы с файлом его нужно обязательно за­
крыть (функция fclose).

Задачи
233. Написать программу, которая создает на диске файл
numbers.txt и записывает в него 5 целых чисел, введенных пользо­
вателем с клавиатуры. Откройте созданный программой файл и
убедитесь, что каждое число находится в отдельной строке.
Задача 233
// Создает на диске файл

#include
#include
#define FIWIE "c:\\temp\\numbers.txt\0"
// количество чисел

«define N5

// Создает на диске файл и записывает в него
// целые числа, введенные пользователем

void main()

{
char fname[40] = FIWIE;

FILE *f;

// файл чисел

int n;

// число

puts("\nCo3flaHne файла");
printf("Введенные числа будут записаны в файл %s\n",

fname);
puts("После ввода каждого числа нажимайте \n");

Примеры и задачи

211

// Открыть файл в режиме записи (w) текста (t)

// Если файл с таким именем уже есть, то новые
// данные будут записаны поверх старых
// Для добавления в конец файла используйте
// режим добавления (а)
if ((f = fopen(fname, "wt")) == NULL)
{

printf("Ошибка открытия файла для записи");
getchQ;
return;
}

for (int i = 0; i < N; i++)
{

printf("->");
scanf("Xi", &n);

fprintf(f,"%i",n);
}
fclose(f);

11 закрытьфайл

printf("Введенные числа записаны в файл %s\n", fname);
puts("\nflnfl завершения нажмите ");

getchQ;

}

234.

Написать программу, которая дописывает в файл numbers.txt

три целых числа, введенных пользователем. Убедитесь, открыв

файл при помощи редактора текста, что в файле находятся 8 чи­
сел.

Задача 234
// добавляет данные в файл
#include

#include
ftdefine FNAME "c:\\temp\\numbers.txt\0" // имя файла

#define N 3

// количество чисел

// Дописывает в находящийся на диске файл numbers.txt

// целые числа, введенные пользователем

Часть 1

212
void main()

{

char fname[40] = FNAME;
FILE *f;

// файл чисел

int n;

11 число

puts("\nAo6auiemie в файл");
printf("BBefleHHbie числа будут добавлены в файл Xs\n",
fname);

puts('*nocne ввода каждого числа нажимайте \n");

// Открыть файл в режиме добавления (а) текста (t)
// Если файла с таким именем нет, то он будет создан
if ((f = fopen(fname, "at")) == NULL)

{
printf("Ошибка открытия файла для добавления");

getch();

return;

}
for (int i = 0; i < N; i++)

{
printf("->”);
scanf("Xi", &n);

fprintf(f,”Xi\n",n);

}
fclose(out);

11 закрыть файл

printf("Введенные числа добавлены в файл Xs\n", fname);

puts("\nflnfl завершения нажмите ");

getch();
}

235. Написать программу, которая выводит на экран содержимое
файла numbers.txt.
Задача 235
// Выводит на экран содержимое файла
«include
«include

Примеры и задачи___________________________________________ 213
«define FNAME "c:\\temp\\numbers.txt\0" // имя файла

void main()

{

char fname[40] = FNAME;

FILE *f;

11 текстовый файл

char st[80];

// строка из файла

printf("ХпСодержимое файла %s\n", fname);
puts("........-............ -.......... ”);

11 Открыть файл в режиме чтения (г) текста (t)
if ((f = fopen(fname, "rt")) == NULL)
{
printf("Ошибка открытия файла для чтения”);

getch();
return;

}
while (!feof(a))

{
fscanf(f,"%s", &st);
printf("%s\n", st);

}
fclose(f);

// закрыть файл

putsC—-............................. ");

puts("\n/Vw завершения наймите ");
getch();
}

236. Написать программу, которая вычисляет среднее арифмети­
ческое чисел, находящихся в файле numbers.txt.
Задача 236

// Вычисляет среднее арифметическое чисел,
// находящихся в файлах

«include
«include

214

Часть 1

«define FNAME "nc:\\temp\\numbers.txt\0" // имя файла
void main()

{
char fname[40] = FNAME;

FILE *f;

// текстовый файл

int a;

I/ число

int n = 0;

11 количество чисел

int sum = 0; // сумма чисел
float sr;

// среднее арифметическое

р1Л5("\пВычисление среднего арифметического”);

printf(“чисел, находящихся в файле %s", fname);

// Открыть файл в режиме чтения (г) текста (t)
if ((f = fopen(fname, "rt")) == NULL)

{
printf(“Ошибка открытия файла для чтения");

getch();
return;

}
while (!feof(f))
{

fscanf(f,"%i“, &a);
sum += a;
n++;

}
fclose(f);

// закрыть файл

sr = (float) sum / n;
printf("Введено чисел: %i\n", n);

printf("CyMMa чисел: %i\n“, sum);
printf("Среднее арифметическое: %3.2f", sr);
puts("\nflnfl завершения наймите ");
getch();

}

Примеры и задачи

215

237. Написать программу, которая записывает в файл данные,
находящиеся в двумерном массиве дробного типа.
Задача 237
// Запись данных из массива в файл
#include

#include
«include

void main()

{
«define NR 3
«define NC 6

// массив данных
float a[NR][NC] =

{
15.0,16.5,18.0,19.5,21.0,24.0,

16.5,18.0,19.5,21.0,22.5,24.0,
18.0,19.5,21.0,22.5,24.0,27.0

H
FILE *f; 11 файл

int r,c; 11 номер строки и столбца
// показать данные
printf("ХпДанные:\п");
for ( г = 0; г < NR; г++)

{
for (с = 0; с < NC; C++)

{
printf("%5.2f

", а[г][с]);

}
printf(“\п");
}

// предполагается, что строки текстового файла
// будут содержать значения строк элементов массива

216

Часть 1
11 Открыть для записи (w) текстовый файл (t)

// Если файл с указанным именем уже существует,
// он будет заменен новым
if ((f = fopen("c:\\temp\\a.dat", "wt")) == NULL)

{

printf("Ошибка создания файла\п");
printf("Для завершения нажмите ");

getch();

return;
}

for ( r = 0; r < NR; r++)
{

for (c = 0; c < NC; C++)
{
fprintf(f, "%5.2f ", a[r][c]);

} ,
if ( r != NR-1)
fprintf(f, ”\n");

}

fclose(f);
printf("Данные записаны в файл\п");

printf("\пДля завершения нажмите ");

getch();

}

238. Написать программу, которая загружает из файла данные
в двумерный массив дробного типа.
Задача 238
«include
«include
«include

void main()
{
«define NR 3
«define NC 6

Примеры и задачи

217

float a[NR][NC]; // массив NRxNC - NR строк из NC элементов

FILE *f; Ц файл
// предполагается, что строки текстового файла
// содержат значения строк элементов массива

// Открыть для чтения (г) текстовый файл (t)
if ((f = fopen("с:\\tempWa.dat", "rt")) == NULL)

{
printf("HeT файла c: WtempWa.dat");
printf("\пДля завершения нахмите ");

getch();
return;

}

int r,c; // номер строки и столбца
for ( г = 0; г < NR; r++)
{

for (с = 0; с < NC; C++)
{

fscanf(f, "%f", &a[r][c]);
}
}
fclose(f);

printf(“\nflaHHbie, загруженные в массив из файла :\n");

// показать прочитанные данные
for ( г = 0; г < NR; г++)
{

for (с = 0; с < NC; C++)
{

printf("%7.2f

}
printf("\n°);

}

", a[r][c]);

Часть 1

218
printf("\rWifl завершения нажмите ");

getchQ;

}

239. Написать программу, которая позволяет просматривать тек­
стовые файлы (выводит на экран их содержимое)— например,
файлы исходных программ C/C++. Имя просматриваемого файла
должно вводиться пользователем во время работы программы.

Задача 239
// Выводит на экран содержимое файла,
// имя которого указано пользователем

#include
#include
#include
#define

MAXLEN 80

// максимальная длина строки в файле

void maln()
{

char fname[40];

FILE *a;

// имя файла
11 текстовый файл

char st[MAXLEN+2];// строка, прочитанная из файла

int n = 0;

Ц кол-во строк, выведенных на экран

char key;

// клавиша, нажатая пользователем

puts("Просмотр текстового файла”);
рЛ5("Введите полное имя файла и нажмите ");

printfС->");
scanf("%s“,&fname);

// Открыть файл в режиме чтения (г) текста (t)
if ((f = fopen(fname, "rt”)) == NULL)

{
printf("Ошибка при обращении к файлу %s\n”, fname);

getchQ;
return;

}

219

Примеры и задачи

while ( !feof(f) )
{

fgets(st, MAXLEN, f);
printf("%s", st);
if (++n > 21)
{

printf("\пДля продолжения наймите ");
key = getch();
n = 0;
}

}

fclose(f);

// закрыть файл

printf("\пДля завершения наймите ");
getchQ;
}

240. Написать программу, которая дописывает в находящийся на
диске компьютера файл contacts.txt имя, фамилию и номер
телефона, например, вашего товарища. Если файла на диске нет,
то программа должна создать его. В файле каждый элемент дан­
ных (имя, фамилия, телефон) должен находиться в отдельной
строке. Далее приведен рекомендуемый вид экрана программы
(данные, введенные пользователем, выделены полужирным).
Добавление информации в телефонный справочник
Фамилия -> Сидоров
Имя -> Вася
Телефон -> 234-84-37
Информация добавлена
Для завершения наймите

Задача 240

// Дописывает в файл contacts.txt фамилию, имя и номер телефона
«include
«include
«define FNAME "c:\\temp\\contacts.txt\0" // имя файла
void ntain()

Часть 1

220
{
char fname[20] = FNAME;

FILE *f;

11 файл

char fam[15];

// фамилия

char name[15]; // имя
char tel[9];

// номер телефона

puts("\nflo6aeneHHe информации в телефонный справочник\п");

// Открыть файл в режиме добавления (а) текста (t)
// Если файла с таким именем нет, то он будет создан
if ((out = fopen(fname, "at")) == NULL)

{

printf("Ошибка открытия файла для добавления”);
getch();
return;

}
11 получим данные от пользователя
printf("Фамилия ->");

scanff'Xs", efam);
printf("Имя ->");

scanf("%s", &name);
printf("Телефон ->");

scanf(”%s", &tel);
11 запишем данные в файл

fprintf(f,"%s %s %s", fam, name, tel);
р1Л5("\пИнформация добавлена");

fclose(f);

// закрыть файл

printf("\п\пДля завершения нахмите \n");

getch();

}

241. Усовершенствуйте программу работы с телефонным спра­
вочником (см. задачу 240) так, чтобы за один сеанс работы в файл

Примеры и задачи

221

contacts.txt можно было добавить информацию о нескольких
людях. Далее приведен рекомендуемый вид экрана программы
(данные, введенные пользователем, выделены полужирным).
Добавление информации в телефонный справочник
Для завершения вместо ввода фамилии нажмите
Фамилия -> №анов
Имя -> Иван
Телефон -> 234-84-37
Информация добавлена
Фамилия -> Орлов
Имя -> Андрей
Телефон -> 552-18-40
Информация добавлена
Фамилия ->
Ввод завершен
Для завершения нахмите

242. Написать программу, которая позволяет найти в телефонном
справочнике (в файле contacts.txt) нужную информацию. Про­
грамма должна запрашивать у пользователя фамилию человека
и выводить информацию о нем. Если в справочнике есть люди
с одинаковыми фамилиями, то программа должна вывести список
всех этих людей. Далее приведен рекомендуемый вид экрана
программы (данные, введенные пользователем, выделены полу­
жирным).
Поиск в телефонном справочнике
Фамилия -> Петров
Данных об абоненте Петров в ЕД нет.
Фамилия -> Иванов
Иванов Вася 578-12-45
Иванов Сергей 244-34-02
Фамилия ->

Задача 242
// Поиск в телефонном справочнике
«include

«include

Часть 1

222
#define FNAME "c:\\temp\\contacts.txt\0" // имя файла
void main()

{

char fname[20] = FNAME;

FILE *f;

// файл - телефонный справочник

char obr[15];

// фамилия - образец для поиска в БД

// найденная информация

char fam[15];

// фамилия

char name[15]; // имя
char tel[9];

// номер телефона

int n = 0; // количество записей, удовлетворяющих запросу
puts("\nnoHCK в телефонном справочнике");

// Открыть файл в режиме чтения (г) текста (t)
if ((f = fopen(fname, "rt")) == NULL)

{
printf("Ошибка открытия файла %s", fname);

getch();

return;
}
// получим данные от пользователя
printf("Фамилия ->");
scanf("%s", &obr);

// образец для поиска в БД

while (!feof(f))

{

fscanf(f,"%s %s %s", &fam, Sname, &tel);
if (fam == obr)

{

printf("%s %s %s",fam, name, tel);
n++;

}
}
if (n )
printf("Найдено записей: %i", n);

Примеры и задачи___________________________________________ 223
else
printf("Данных об абоненте %s в БД нет", obr);
fclose(f);

// закрыть файл

puts("\nflnfl завершения работы нажмите ");

getch();
}

243. Написать программу, которая объединяет возможности про­
грамм «Добавление информации в телефонный справочник»
(см. задачу 24 Г) и «Поиск в телефонном справочнике» (см. зада­
чу 242). При запуске программы на экране должно отображаться
меню следующего вида:
***
1 2 0 -

Телефонный справочник ***
Добавление
Поиск
Завершение работы

Ваш выбор ->

244. Написать программу, при помощи которой можно автомати­
зировать процесс проверки знаний. Сам тест, содержащий после­
довательность вопросов и вариантов ответа, должен находиться
в текстовом файле. Имя файла теста программа должна получать
из командной строки ее запуска. Количество вопросов теста не
ограничено. Вместе с тем, предлагается ввести следующее огра­
ничение: текст вопроса и альтернативных ответов не должен за­
нимать более одной строки.

Программа должна выставлять оценку по следующему правилу:
отлично — за правильные ответы на все вопросы, хорошо — если
испытуемый правильно ответил не менее чем на 80% вопросов,
удовлетворительно — если правильных ответов более 60%, и не­
удовлетворительно — если правильных ответов меньше 60%.
Далее приведены структура файла теста (N;— количество вари­
антов ответа к i-му вопросу, К; — номер правильного ответа) и
пример файла теста.

224

Часть 1

Структура файла теста
Вопрос1

N1 К1
0твет1

ОтветЬП
Вопрос2

N2 К2
0твет1
0тветК2

ВопросМ
NM КМ

Пример файла теста
В инструкции do ... wile после while записывают
2 2
условие завершения цикла
условие повторения инструкций цикла
Переменная unsigned int может принимать значение
2 1
0 ... 65535
0 ... 32767
Какая из приведенных ниже инструкций содержит ошибку
2 2
scanf ("%f", Skurs);
scanf("%f", kurs);

Далее приведен рекомендуемый вид экрана программы (данные,
введенные пользователем, выделены полужирным).
Сейчас Вам будет предложен тест.
К каждому вопросу дается несколько вариантов ответа.
Вы должны ввести номер правильного ответа и нажать

В инструкции do ... wile после while записьваюг
1 - условие завершения цикла
2 - условие повторения инструкций цикла
Ваш выбор-> 2

Примеры и задачи

225

Переменная unsigned int может принимать значение
1 - 0 ... 65535
2 - 0 ... 32767
Ваш выбор-> 1
Какая из приведенных далее инструкций содержит ошибку
1 - scant
fikurs);
2 - scanf("%f", kurs);
Ваш выбор-> 2
,

Ваша оценка ОТЛИЧНО!
Для завершения нахмите

Задача 244
// Универсальная программа проверки знаний
// имя файла теста задается в инструкции запуска программы
#include
#include
#include

void main(int argc, char* argv[])

{
char fname[40]; // имя файла теста

FILE* f;

// файл теста

int VsegoVopr = 0; // количество вопросов теста
int PravOtv = 0;

// количество правильных ответов

// для текущего вопроса

int nOtv;

// i

int Prav;

II i

int Otv;

U 1

int p;

и 1

char st[80];

И <

int i; // сче тчик
if (: iargc )

puts("\nHe задан файл вопросов теста!");

Часть 1

226
puts("Командная строка: test ИмяФайлаТеста\п");
return;

strcpy(fname,argv[l]); // имя файла из командной строки

// Открыть файл в режиме чтения (г) текста (t)
if ((f = fopen(fname, "rt")) == NULL)

{
printf("Ошибка открытия файла %s", fname);
getchQ;
return;

clrscrQ;

puts("\nCeft4ac Вам будет предложен тест.");

puts("К каждому вопросу дается несколько вариантов ответа.");
puts("Вы должны ввести номер правильного ответа");

puts("H нажать клавишу \n");
printf
("Для начала тестирования нажмите “);

getchQ;
textbackground(BLUE);

clrscrQ;
while (!feof(f))

{
VsegoVopr++;
fgets(st, 80, f);

11 читаем из файла вопрос

printf("\n%s\n", st);

// вопрос на экран

fscanf(f,,'%i %i", UnOtv, &Prav);// кол-во вариантов
// ответа
11 и номер прав, ответа
fgets(st,80,f); // дочитать конец предыдущей строки

// читаем и выводим альтернативные ответы
for (i = 1; i = 60 && р Строка2.

Заголовочный файл:

strlwr
Синтаксис:
char* strlwr(char* Строка)

Преобразует строчные символы строки в прописные (обрабаты­
вает только буквы латинского алфавита).

Заголовочный файл:

Часть 2

250

strupr
Синтаксис:

char* strupr(char* Строка)
Преобразует прописные символы строки в строчные (обрабаты­
вает только буквы латинского алфавита).

Заголовочный файл:

strset
Синтаксис:
char* strset(char*

Строка,

char Символ)

Заполняет строку указанным при вызове функции символом.
Заголовочный файл:

strchr
Синтаксис:
char* strchr(const char*

Строка,

int Символ)

Выполняет поиск символа в строке и возвращает указатель на
первый найденный символ или, если символ не найден, NULL.

Заголовочный файл:

МАТЕМАТИЧЕСКИЕ ФУНКЦИИ
abs, fabs
Синтаксис:
int
abs(int x);
double fabs(double x);
Возвращают целое (abs) или дробное (fabs) абсолютное значение
аргумента, в качестве которого можно использовать выражение
соответствующего типа.

Заголовочный файл:

Справочник

251

acos, asin, atan, acosl, asinl, atanl
Синтаксис:
double acos (double x);
double asin (double x);
double atan (double x);

long double acosl(long double x);
long double asinl(long double x);
long double atanl(long double x);
Возвращают выраженную в радианах величину угла, косинус,
синус или тангенс которого передан соответствующей функции
в качестве аргумента. Аргумент функции должен находиться
в диапазоне от -1 до 1.

Заголовочный файл:

cos, sin, tan, cosl, sinl, tanl
Синтаксис:
double cos (double x);
double sin (double x);
double tan (double x);
long double cosl(long double x);
long double sinl(long double x);
long double tanl(long double x);

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

Заголовочный файл:

exp, expl
Синтаксис:
double exp(double x);
long double expl(long double (x));
Возвращают значение, равное экспоненте аргумента (ех, где е —
основание натурального логарифма).

Заголовочный файл:

252

Часть 2

pow, powl
Синтаксис:
double pow (double x, double y);
long double powl(long double (x), long double (y));

Возвращают значение, равное х?.
Заголовочный файл:

sqrt
Синтаксис:
double sqrt (double x);

Возвращает значение, равное квадратному корню из аргумента.
Заголовочный файл:

rand
Синтаксис:
int rand(void);

Возвращает случайное целое число в диапазоне от 0 до rand_max.
Перед первым обращением к функции rand необходимо инициа­
лизировать генератор случайных чисел, вызвав функцию srand.
Заголовочный файл:

srand
Синтаксис:
void srand(unsigned х);

Инициализирует генератор случайных чисел. Обычно в качестве
параметра функции используют переменную, значение которой
предсказать заранее нельзя, — например, это может быть текущее
время.

Заголовочный файл:

Справочник

253

ФУНКЦИИ ПРЕОБРАЗОВАНИЯ
Приведенные далее функции выполняют преобразование строк
в числовое значение и чисел в строковое представление.

atof
Синтаксис:
double atof(const char* s);

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

Заголовочный файл:

atoi, atol
Синтаксис:
int atoi(const char* s);
long atol(const char* s);

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

Заголовочный файл:

gcvt
Синтаксис:
char *gcvt(double Значение, int Цифр, char* Строка);

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

Заголовочный файл:

Часть 2

254

itoa, Itoa, ultoa
Синтаксис:

char* itoa (int Значение, char* Строка, int Основание);
char* Itoa (long Значение, char* Строка, int Основание);
char* ultoa(unsigned long Значение, char* Строка, int
Основание);

Соответственно преобразуют целое, длинное целое и длинное
беззнаковое целое в строку. Число изображается в указанной при
вызове функции системе счисления.


Строка — указатель на строку, куда будет помещено изобра­
жение числа.



Основание — задает

основание системы счисления (от 2 до 36).

Максимальная длина строки, формируемой функцией itoa,—
17 символов, функциями Itoa и ultoa — 33 символа.
Заголовочный файл:

ПРИЛОЖЕНИЯ

I

ПРИЛОЖЕНИЕ 1

Таблица ASCII кодировки
символов
Символы с кодами 0—127

012345678910111213141516-

@

»

1


Й

#


1617181920212223242526272829303132-


«
I
!!
А
S
:
Т
1
*
_
*
*


3233343536373839404142434445464748-

!
"
«
$
У.
&

(
)
»
*
,
.
/
0

4849505152535455565758596061626364-

0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
е

6465666768697071727374757677787980-

@
А
В
С
D
Е
F
G
Н
I
J
К
L
М
N
0
Р

8081828384858687888990919293949596-

Р
0
R
S
Т
U
V
W
X
V
Z
I
\
1
~

1

96979899100101102103104105106107108109110111112-

'
а
Ь
с
d
е
f
g
h
i
.j
k
1
DI
n
0
p

112113114115116117118119120121122123124125126127-

p
q
г
s
t
u
v
w
x
v

z
{
|
}
~
A

Символы с кодами 128—255

128129130131132133134135136137138139140141142143144-

A
Б
В
Г
Д
E
Ж
3
И
Й
К
А
М
Н
0
П
Р

144145146147148149150151152153154155156157158159160-

Р 160- а
С 161- 6
Т 162- в
У 163- г
Ф 164- д
X 165- е
Ц 166- ж
Ч 167- з
111 168- и
Ц 169- й
Ъ 170- к
Ы 171- л
Ь 172- м
3 173- н
Ю 174- о
Я 175- п
а 176- «

176177178179180181182183184185186187188189190191192-

1921931 194195196197198■ 199ч 200■ 2012022033 204J 2052062071 208-

j

L
±
Т
1-

208209210211212+ 213214215L 216217I 218т 219220221i 2221 223л. 224-

А

224- р

т
1
и

226227228229230231232233234235236237238239240-

240- Е

т 225- с 241- ё

г
г

+
+
J
г
|

Г
1

р

т
у
ф

х
ц
ч
ш
щ
ъ
ы
ь
э
»
я
Е

242243244245246247248249250251252253254255256-

е
е
I
I
9
у
*


7
IF
0


ПРИЛОЖЕНИЕ 2

Представление
информации в компьютере:
десятичные, двоичные
и шестнадцатеричные числа
В повседневной жизни человек имеет дела с десятичными числа­
ми. В десятичной системе счисления для представления чисел
используются цифры от 0 до 9. Значение числа определяется как
сумма произведений цифр числа на их весовые коэффициенты,
определяемые местами цифр в числе. Весовой коэффициент са­
мой правой цифры равен единице, цифры перед ней — десяти,
затем ста и т. д. Например, число 2703 равно:

2х 1000 +7 х 100 + 0 х 10 + 3 х 1.
Если места цифр (разряды) пронумеровать справа налево и самой
правой позиции присвоить номер ноль, то можно заметить, что
вес г-го разряда равен г'-й степени десятки (рис. П2.1).

Рис. П2.1. Вес разрядов в десятичной системе счисления

260

Приложение 2

Для внутреннего представления чисел в компьютере использует­
ся двоичная система счисления. Двоичные числа записываются
при помощи двух цифр: нуля и единицы. Как и десятичная, дво­
ичная система — позиционная. Весовой коэффициент i-го разря­
да равен двум в /-Й степени (рис. П2.2).

Можно задать одно и то же число так:
1x128 + 1x64+0x32+ 0x16+ 1x8 + 1x4 +0x2 + 1 х1 =205
или
(11001101)2= (205) ю
Рис. П2.2. Вес разрядов в двоичной системе счисления

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

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

Представление информации в компьютере...____________________ 261

Шестнадцатеричное число получается из двоичного следующим
образом (рис. П2.3).

Цифры двоичного числа делятся на группы по четыре. Каждой
группе ставится в соответствие сначала десятичное число, яв­
ляющееся десятичным эквивалентом четырехзначного двоично­
го, затем полученное десятичное число записывается шестнадца­
теричной цифрой. В табл. П2.1 приведены десятичные числа от
нуля до 15 и соответствующие им шестнадцатеричные цифры.

1011 0101

I1 I
11

5

Десятичные цифры

1

I
В

Двоичное число, разделенное
на группы по четыре бита

5

Шестнадцатеричные цифры

\ /
Шестнадцатеричное число
Рис. П2.3. Перевод двоичного числа в шестнадцатеричное

Таблица П2.1. Перевод десятичных чисел в шестнадцатеричные
Десятичное число

Шестнадцатеричная цифра

0

0

1

1

2

2

3

3

4

4

5

5

6

6

7

7

8

8

9

9

262

Приложение 2
Таблица П2.1 (окончание)

Десятичное число

Шестнадцатеричная цифра

10

А

11

В

12

С

13

D

14

Е

15

F

В тексте программы первая цифра шестнадцатеричного числа
предваряется символами 0х. Вот примеры шестнадцатеричных
чисел: 0х2А, 0xFF, 0x01.

Предметный указатель

D
do while 110

F
for 80

1
if 44

P
printf 20

s
scanf 26
switch 69

w
while 121

В
Ввод данных 26
Выбор
0 инструкция if 45, 46
0 инструкция switch 69
0 множественный 46,69
Вывод данных 20
Вычисление числа Пи 123

д
Данные: ввод 26

И
Инструкция
0 for 80
0 if 44
0 switch 69
0 while 121
Интеграл
0 метод прямоугольников 101
118
0 метод трапеций 103

264

К
Класс
О деструктор 199
О конструктор 199
9 метод 201
9 наследование 204
9 объявление 199
9 полиморфизм 207
9 производный 204
Код символа 160

м
Массив 125
9 ввод с клавиатуры 126,143
9 двумерный 143
9 доступ к элементу
по указателю 130
9 запись в файл 215
9 объектов 203
9 поиск методом половинного
деления 140
9 поиск минимального элемента
129
9 поиск элемента 132,140
9 слияние массивов 138
9 сортировка 135,137
9 среднее арифметическое
элементов 131
9 структур 198
9 чтение из файла 216
Массив двумерный
9 ввод 146
9 сортировка 154

н
Наибольший общий делитель 124

Предметный указатель

п
Поиск
9 в массиве 132
9 в упорядоченном массиве 140
Преобразование
9 двоичное в десятичное 170
9 десятичное в двоичное 104
9 десятичное
в шестнадцатеричное 174
9 прописные в строчные 162
9 шестнадцатеричное
в десятичное 171
Простое число 117

Р
Рекурсия 227

С
Символ
9 код символа 160
9 таблица кодировки символов
161
Система счисления
9 двоичная 260
9 десятичная 259
9 шестнадцатеричная 260
Сортировка
9 массива 135,137
9 методом «Пузырька» 137
9 методом обмена 135
Строка
9 ввод 158
9 разбиение на подстроки 164
Структура 198

т
Таблица: значений функции 111

265

Предметный указатель

Ф
Файл
О добавление данных 211
О запись в файл 210
О поиск в файле 221
О просмотр 218
О создание 210
О чтение данных 212
Формат вывода 20
Функции
0 abs 250
О acos 251
О atof253
О atoi 253
О atoi 253
О cos 251
О cprintf 245
О cputs 244
О ехр251
О fclose 248
О feof248
О ferror 248
О fgets 247
О fopen 245
О fprintf 246
О fputs 247
О fscanf 247
О gcvt253
О getch 244
О gets 244

О itoa 254
О Itoa 254
О pow 252
О printf 242
О putch 244
О puts 243
О rand 252
О scanf 243
О sin 251
О sprintf 245
О sqrt 252
О srand 252
О strcat 248
О strchr 250
О strcmp 249
О strcpy 249
О strlen 249
О strlwr 249
О strset 250
О strupr 250
О tan 251
О utoa254
Функция программиста 181

ц
Цикл
О do while 110
О for 80
О while 121

Культин Н.

www.bhv.ru

Microsoft Visual C++ в задачах и примерах,
2-е изд.

Отдел оптовых поставок
E-mail: opt@bhv.spb.su

Базовые компоненты

Программирование графики,
баз данных, игр



Справочник по компонентам
и функциям

базовые компоненты

Если вы хотите научиться програм.
„ ...
, „
мировать
в Microsoft Visual C++ то
г
Справочник
С
ЭТа КНИГЗ даЯ ВЗСВ ней вы найдете хорошо докумен­
тированные примеры программ —
от простейших, демонстрирующих
назначение базовых компонентов,
до приложений работы с файлами,
графикой и базами данных Microsoft
Access и Microsoft SQL Server Com­
pact Edition, раскрывающих тонкости программирования в Microsoft
Visual C++. Предлагаемые для самостоятельного решения задачи по­
зволят закрепить полученные знания. Справочник, входящий в книгу,
содержит описание базовых компонентов, событий, исключений и наи­
более часто используемых функций. На FTP-сервере издательства нахо­
дятся коды примеров из книги.
программирование
графики, баз данных, игр


'
>Y¥
JLjLXJbULJUt
'■

Никита Борисович Культин, кандидат технических наук, доцент СанктПетербургского государственного политехнического университета, где чи­
тает курс «Теория и технология программирования». Автор серии книг по
программированию в Microsoft Visual C++, Microsoft Visual C#, Microsoft
Visual Basic, Delphi, Pascal, которые вышли общим тиражом более 350 тыс.
экземпляров.

^bhv

Полубенцева M.

C/C++. Процедурное программирование ■+

www.bhv.ru
Отдел оптовых поставок
E-mail: opt@bhv.spb.su

«Программировать — значит понимать»
Кристиан Нюгард (Kristen Nygaard), норвежский математик,
один из пионеров в разработке языков программирования