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

Практикум по основам программирования. Скалярные типы. Управляющие операторы. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
На языке C любая последовательность операторов, заключенная в фигурные скобки, является составным оператором. Концом составного оператора служит сама закрывающаяся скобка. Внутри составного оператора каждый оператор должен ограничиваться символом ′;′.
Пример составного оператора:
{
I += a;
c = a * b;
n++;
}
Составной оператор может использоваться везде, где синтаксис языка допускает применение одного оператора, а необходимо выпол­нить несколько. Составной оператор называется оператором блоком, если кроме операторов он содержит определения переменных или кон­стант.
Примеры
1. Определить необходимые переменные и записать на языке C вы­ражение, истинное при выполнении указанного условия и ложное в противном случае:
а) x принадлежит отрезку [2, 5] или [-1, 1];
float x; 2 <= x && x <= 5  -1 <= x && x <= 1
б) x лежит вне отрезков [2, 5] и [-1, 1];
float x; x < -1 x > 1 && x < 2  x > 5
в) хотя бы одно из чисел x, y, z положительно;
11
float x, y, z; x > 0  y > 0  z > 0
г) целые n и k имеют одинаковую четность;
int n, k; n % 2 == k % 2
д) 0 < x < 1;
float x;
0 < x && x < 1
2. Определить необходимые переменные и записать на языке C следующие формулы:
а) (1 + x)2 ; б) 1 + 𝑥 ; в) │a + bx │;
a) float x; (1 + x) * (1 + x)
б) float x; sgrt(1 + x) в) float x, a, b; fabs (a + b * x)
3. Определить необходимые переменные и записать оператор при­сваивания, в результате выполнения которого будет вычислено значе­ние формулы:
а) cos2 x3 ; б) log2
8
; в) 𝑥8+ 8
5
𝑥
;
𝑥
а) float x, y; y = cos(x * x * x) * cos(x * x * x);
б) float x, y; y = log2(x / 5);
в) float x, y; y = pow(x * x * x * x * x * x * x * x + pow(8, x), 1. / 8);
4. Определить необходимые переменные и записать оператор при­сваивания, в результате выполнения которого переменная получает
12
[0,1]
[0,1]
значение true (ИСТИНА), если выполняется указанное условие, и зна­чение false (ЛОЖЬ) в противном случае:
а) числа x, y, z равны между собой;
float x, y, z, t; t = x == y && y == z;
б) из чисел x, y, z только два равны между собой;
float x, y, z, t; t = x == y && x != z  x == z && x != y  y == z && x != y;
в) цифра 5 входит в десятичную запись трехзначного натурального
числа;
int a, t; t = a % 10 == 5 a / 10 % 10 == 5 a / 100 == 5;
г) все цифры трехзначного натурального числа различны;
int a, t; t = a % 10 != a / 10 % 10 && a % 10 != a / 100 && a / 10 % 10 != a /
100;
Задачи для самостоятельной работы
1 Записать на языке C выражение, истинное при выполнении указан-
ного условия и ложное в противном случае: а) x принадлежит отрезку
б) x лежит вне отрезка
;
;
в) каждое из чисел x, y, z положительно; г) ни одно из чисел x, y, z не является положительным; д) только одно из чисел x, y, z положительно; е) логическая переменная a имеет значение true, а логическая пе-
ременная b имеет значение false;
13
ж) целое K делится на 7;
2
0 ( 0)ax bx c a  
( , )xy
(1,0)
max( , , )x x y z
max( , , )x x y z
4
1
3
7
24
4
3.3
) ; ) 2 ; ) 1 ;
10 lg4
) sin ; ) cos2 tg ; ) ;
1
) ; )10 3 ; ) (( ) ) .
5
x
xyz x y
а б в x
ab c
г b д y е
c ab
x y b
ж з и ax b x c x d
a x y


з) уравнение
не имеет вещественных кор-
ней;
и) точка
лежит вне круга радиуса r с центром в точке
;
к) натуральное n является полным квадратом; л)
м)
;
.
2 Записать на языке C следующие формулы:
3 Записать оператор присваивания, в результате выполнения которо-
го переменная получает значение true, если выполняется указанное условие, и значение false в противном случае:
а) из чисел x, y, z только одно отличается от двух других; б) x – положительное число; в) хотя бы одно из чисел x, y, z положительно; г) только одно из чисел x, y, z положительно; д) p делится нацело на q (p, q – натуральные числа); е) только одна из логических переменных a, b имеет значение true; ж) только одна из логических переменных a, b, c имеет значение
true;
14
з) цифра 3 входит в десятичную запись четырехзначного целого
числа; и) все цифры четырехзначного целого числа различны; к) год с порядковым номером y является високосным (год является
високосным, если его номер кратен 4, однако из годов кратных
100 високосными являются лишь кратные 400; например, 1700,
1800 и 1900 – невисокосные годы, а 2000– високосный);
л) уравнение ax2 + bx + c = 0, где a, b и c могут равняться 0, имеет
ровно один корень; м) поля (г1, в1) и (г2, в2) шахматной доски имеют одинаковый цвет
(г1, в1, г2, в2 заданы целыми числами от 1 до 8); н) ферзь, расположенный на поле (г1, в1) шахматной доски, «бьет»
поле (г2, в2) (г1, в1, г2, в2 заданы целыми числами от 1 до 8).
4 Поменять местами содержимое вещественных переменных A и B и
вывести новые значения A и B.
5 Даны вещественные переменные A, B, C. Изменить их значения,
переместив содержимое A в B, B – в C, C – в A, и вывести новые значения переменных A, B, C.
6 Дано целое трехзначное число. Вывести число, полученное при
прочтении исходного числа справа налево.
7 Дни недели пронумерованы следующим образом: 1 – понедельник,
2 – вторник, …, 6 – суббота, 7 – воскресенье. Дано целое число K, лежащее в диапазоне 1–365, и целое число N, лежащее в диапазоне 1–7. Определить номер дня недели для K-го дня года, если извест­но, что в этом году 1 января было днем недели с номером N.
8 Проверить истинность высказывания: «Среди трех данных целых
чисел есть хотя бы одна пара взаимно противоположных». Вывести полученное логическое значение.
9 Дано четырехзначное целое число. Проверить истинность выска-
зывания: «Данное число читается одинаково слева направо и спра­ва налево». Вывести полученное логическое значение.
15
10 Поменять местами содержимое вещественных переменных A и B и
вывести новые значения A и B.
11 Даны вещественные переменные A, B, C. Изменить их значения,
переместив содержимое A в B, B – в C, C – в A, и вывести новые значения переменных A, B, C.
12 Дано целое трехзначное число. Вывести число, полученное при
прочтении исходного числа справа налево.
13 Дни недели пронумерованы следующим образом: 1 – понедельник,
2 – вторник, …, 6 – суббота, 7 – воскресенье. Дано целое число K, лежащее в диапазоне 1–365, и целое число N, лежащее в диапазоне 1–7. Определить номер дня недели для K-го дня года, если извест­но, что в этом году 1 января было днем недели с номером N.
14 Проверить истинность высказывания: «Среди трех данных целых
чисел есть хотя бы одна пара взаимно противоположных». Вывести полученное логическое значение.
15 Дано четырехзначное целое число. Проверить истинность выска-
зывания: «Данное число читается одинаково слева направо и спра­ва налево». Вывести полученное логическое значение.
О практических заданиях
Методические указания к практическим заданиям являются ориен-
тиром в самостоятельной подготовке студентов по теме работы и со­держат требования, рекомендации, варианты практических заданий по теме работы и контрольные вопросы.
Цели практических заданий:
– формирование практических навыков программирования и рабо-
ты в современных вычислительных системах;
– овладение одним из алгоритмических языков высокого уровня (в
данном практикуме – языком C.
Основная концепция, заложенная в практических заданиях, – это
движение от простейших алгоритмов, управляющих структур и типов данных к более сложным средствам языка программирования C.
16
Выполнение практического задания состоит из следующих этапов.
1) Самостоятельное изучение необходимого материала по теме ра-
боты: понятие и особенности реализации алгоритмов в соответствии с темой задания, синтаксис и семантика языковых конструкций языка C.
2) Проектирование и реализация программы решения задачи (вари-
ант выдает преподаватель).
Этот этап включает: – анализ задачи, – разработку и описание алгоритма поставленной задачи, – написание программы в соответствии с требованиями к практи-
ческому заданию,
– трансляцию и отладку программы на тестовых примерах (набор
тестов подбирает студент).
3) Защита практического задания. К защите студент должен подготовить отчет по работе, продемон-
стрировать работу программы на тестовых примерах. Защита состоит в обсуждении алгоритма и программы, ответе на контрольные вопросы.
В случае успешной защиты задания в срок студент может повысить
баллы по данной теме, решив дополнительную задачу.
Отчет по практическому заданию включает следующие разделы:
1. Условие задачи
2. Анализ задачи
2.1. Входные данные задачи
2.2. Выходные данные задачи
2.3. Решение задачи
3. Алгоритм решения задачи
4. Текст программы
5. Набор тестов
6. Результаты работы программы Анализ задачи необходим для достижения следующих целей: – установить, что является входными данными и результатами (вы-
ходными данными) решения задачи;
– опираясь на предметную область, задачи найти и описать на язы-
ке математики решение задачи.
На основании этого определяется подход к разработке алгоритма
решения задачи, который позволяет в самом общем виде сформулиро-
17
вать, что должен делать алгоритм, чтобы преобразовать исходные дан­ные в результат.
Как правило, в условии задачи нет каких-либо ограничений на раз-
мер и множество значений входных данных. Поэтому студент должен не сужать, а максимально расширять класс входных данных, чтобы разработать наиболее универсальную программу.
Более подробно этап анализа задачи описан в учебном пособии [2]. Алгоритм решения задачи – это не программа ее решения, а способ
дать человеку (а не машине) представление о структуре алгоритма, о смысле его шагов и их логической взаимосвязи. Поэтому шаги алго­ритма должны описываться в терминах тех объектов и отношений ме­жду ними, о которых идет речь в условии задачи (это, конечно, не ис­ключает использования математической и другой условной символи­ки).
Структура алгоритма станет более ясной, если ее описывать в на-
глядной и достаточно формализованной форме. В данном практикуме необходимо использовать технологию структурного программирова­ния, которая предлагает небольшой набор действий (управляющих структур), каждое из которых имеет один вход и один выход. Требуе­мой формой описания алгоритма в данном практикуме является либо графическое представление алгоритма на языке блок-схем, либо опи­сание на специальном языке описания алгоритмов, например псевдо­языке (в данном практикуме на псевдо C). Более подробно этап описа­ния алгоритма решения задачи на псевдо C рассмотрен в учебном по­собии [2].
Тест представляет собой контрольный пример, на котором будет
проверяться правильность работы программы. Тест задает не только значения входных данных задачи, но и значения всех результатов, ко­торые должна вычислить программа на этих данных.
Набор тестов должен быть необходимым и достаточным, вклю-
чающим общие, частные и особые случаи решения. Тесты перечисля­ются, как правило, в порядке от простых к сложным. При этом счита­ется, что входные данные корректны. Как правило, сложная задача не всегда имеет решение, поэтому должны быть тесты для случая, когда решение есть, и когда его нет. Когда в задаче используются сложные данные, то возможно много вариантов их значений. Например, если
18
входные данные – это множество точек на плоскости, то это множест­во может быть пустым или непустым и состоящим только из одной точки или нескольких точек. В случае пустого множества задача, как правило, не имеет решения. В случае множества, состоящего из одной точки, решение может быть получено более простым способом (част­ное решение), чем для множества, число точек в котором больше еди­ницы. Таким образом, одна из задач, которая решается при выборе на­бора тестов, состоит в том, чтобы проверить адекватность разработан­ного алгоритма возможному разнообразию входных данных.
Если в программе есть ветвления (циклы), то должны быть тесты
для прохождения каждой из ветвей (условий управления циклом).
Другой важный вопрос, решаемый при выборе тестов, – это коли-
чественные ограничения на размеры используемых в программе дан­ных (для корректно заданных данных это ограничения сверху), на ве­личину значений. Обязательно должны быть тесты, в которых прове­ряется поведение программы при граничных значениях. Но следует отказаться от тестов, для которых время решения не укладывается в разумные рамки (для практических заданий не более 20 мин). Напри­мер, если в задаче требуется перебор всех подмножеств заданного множества, то при мощности множества n равной 20, имеется 20n раз­личных подмножеств. Такой тест требует значительного времени.
В отчете набор тестов желательно описать в виде таблицы, содер-
жащей исходные данные, результаты и назначение для каждого теста. Необходимо для наглядного представления теста (если это возможно) иллюстрировать его графически (например, график, рисунок и т. п.).
Рекомендации по разработке программы
Написание программы – это, по сути, продолжение разработки ал-
горитма с дальнейшей детализацией его шагов и их реализацией на языке программирования. Для улучшения качества программы необ­ходимо использовать структурное и модульное программирование. Язык C ориентирован на структурное программирование (операторы языка имеют один вход и один выход). Поэтому правильное использо­вание его управляющих структур обеспечивает получение хорошо структурированной программы, которая наглядна, легко читается и понимается не только автором, но и другими программистами (в том числе и преподавателем).
19
Принципы модульного программирования являются поддержкой
пошаговой разработки алгоритма. Полученные при пошаговой разра­ботке подзадачи необходимо оформить в виде отдельных подпро­грамм. Следует стремиться к тому, чтобы каждая подпрограмма имела один вход и один выход и выполняла самостоятельное действие, кото­рое можно описать одной фразой. Необходимо стремиться к тому, что­бы подпрограммы были максимально гибкими, в частности, по воз­можности они не должны зависеть от глобальных объектов, за исклю­чением общих для всех подпрограмм переменных. Операции по вводу­выводу не должны быть рассеяны по всей программе и должны быть отделены от вычислительных частей программы.
Главную подпрограмму нужно рассматривать как краткое описание
решения всей задачи. Ее действия – это вызовы подпрограмм, реали­зующих решение отдельных подзадач.
Для повышения наглядности программы рекомендуется: – снабжать текст программы комментариями, кратко и точно пояс-
няющими основное назначение фрагмента программы (не следует де­лать их слишком длинными и частыми);
– использовать содержательно осмысленные (но не чрезвычайно
длинные) имена переменных, функций;
– при расположении операторов, реализующих базовые управляю-
щие структуры, использовать отступы на 3 позиции (пробела) для вы­деления, как внутренней конструкции управляющей структуры, так и одной управляющей структуры от другой (это позволяет структуриро­вать текст программы);
– разумно ограничить длину строк в программе, чтобы обеспечить
более удобную дальнейшую отладку и исправление ошибок.
20
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]