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

МЕТОДИЧЕСКОЕ ПОСОБИЕ ПО ПРОГРАММИРОВАНИЮ

Язык Си ++

Хабаровск 2004

Министерство образования Российской Федерации

Государственное образовательное учреждение

высшего профессионального образования

"Хабаровский государственный технический университет"

ИНФОРМАТИКА

Методическое пособие

по выполнению лабораторных работ № 1 – 8

для студентов I курса специальности 210100

"Управление и информатика в технических системах"

дневной формы обучения

Хабаровск

Издательство ХГТУ

2004

” ВВОДНО-ОЗНАКОМИТЕЛЬНАЯ ЛАБОРАТОРНАЯ РАБОТА

Язык Си давно завоевал особую популярность у программистов вслед­ствие уникального сочетания возможностей языков высокого и низкого уровней. Язык Си разработан в. 1972 г. Д. Ритчи во время работы над операционной системой Unix. Изначально предполагалось, что этот язык будет ис­пользоваться профессиональными программистами. Язык Си является доста­точно трудным для начального ознакомления с программированием, но в тоже время достаточно гибким, позволяющим с помощью небольшого числа конструкций решать трудные задачи. Главное преимущество языка Си за­ключается в библиотеках, поддерживаемых компилятором, и библиотеках, создаваемых программистами.

Знаменательной вехой, в эволюции языка Си стало появление системы Турбо Си, получившей признание как одно из самых удачных инструмен­тальных средств для персональных компьютеров. Язык Си называют скром­ным, быстрым, удобным. Иногда его называют вероломным [15], потому как программы на Си беззащитны для класса ошибок, от которых другие языки защищают. На такие ошибки в пособии обращается особое внимание. Язык Си - относительно мобильный язык. Программы, написанные на этом языке для одной операционной системы, с небольшими доработками могут исполь­зоваться в другой операционной системе.

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

Д

2

ля того чтобы хорошо овладеть программированием, необходимо знать, что такое компьютер. Слово "компьютер" означает "вычислитель", т. е. устройство для вычислений. Потребность в автоматизации обработки дан­ных, в том числе вычислений, возникла очень давно. Многие тысячи лет на­зад для счета использовались счетные палочки, камешки и т.д. В дальнейшем стали использовать счеты. В 1642 г. Блез Паскаль разработал устройство, ме­ханически выполняющее сложение чисел, а в 1673 г. Готфрид Вильгельм Лейбниц сконструировал арифмометр, позволяющий механически выполнять четыре арифметических действия. В XIX в. математик Чарльз Беббидж по­пытался построить вычислительное устройство, которое должно было вы­полнять вычисления без участия человека, т. е. уметь исполнять программы. Но осуществить эту мечту удалось ученым только в XX в., когда для по­строения вычислительных устройств стали использовать электромеханические реле. С 1943 г. группа специалистов под руководством Джона Мочли и Преспера Экерта в США начала конструировать вычислительную машину на основе электронных ламп. Машина работала: достаточно быстро, но для зада­ния ее программы приходилось в течение нескольких часов или даже не­скольких дней соединять провода. Вот тогда и стали конструировать машину, которая могла бы хранить программу в своей памяти. К этой работе был привлечен знаменитый математик Джон фон Нейман, который ясно и просто сформулировал основные принципы функционирования универсальных вы­числительных устройств. Первый компьютер, в котором воплощены принци­пы фон Неймана, был построен в 1949 г. английским исследователем Мори­сом Уилксом. С той поры компьютеры стали гораздо более мощными, но по­давляющее большинство из них работает в соответствии с принципами фон Неймана.

Фон Неймана описал, как должен быть устроен компьютер для того, чтобы он был универсальным и эффективным устройством для обработки информации [2]. Прежде всего, компьютер должен иметь следующие устрой­ства (рис.1):

процессор, осуществляющий арифметические и логические операции, а также организующий процесс выполнения программ;

запоминающее устройство, или память для хранения программ и дан­ных;

внешние (периферийные) устройства для ввода/вывода информации.

Рис.1

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

На рис. 1 одинарные линии показывают управляющие связи, двойные - информационные.

В

3

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

Как Правило, после выполнения одной команды процессор начинает об­рабатывать команду из ячейки памяти, которая находится непосредственно за только что выполненной командой. Однако этот порядок может быть из­менен с помощью Команд управления (перехода). Эти команды указывают процессору, что ему следует продолжить выполнение программы, начиная с команды, содержащейся в некоторой другой ячейке памяти. Такой "скачок", или переход, осуществляется в программе не" всегда, а только при соблюде­нии некоторых условий. Например, если некоторые числа равны, если в ре­зультате предыдущей арифметической операции получился нуль, Это позво­ляет использовать одни и те же последовательности команд в программе много раз (организовывать циклы), выполнять различные последовательно­сти команд в зависимости от соблюдения определенных условий и т.д., од­ним словом, создавать сложные программы.

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

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

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

Совокупность программных средств можно разделить на три категории [2]:

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

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

и

4

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

Рассмотрим некоторые системные программы. Одной из важнейших системных программ является операционная система. Операционная система - это программа, которая загружается при включении компьютера. Она осу­ществляет диалог с пользователем, управление, компьютером, его ресурсами (оперативной памятью, местом на дисках и т. д.), запускает другие (приклад­ные) программы на выполнение. Операционная система обеспечивает поль­зователю и прикладным программам удобный способ общения (интерфейс) с устройствами компьютера. Для компьютеров типа IBM PC чаще всего ис­пользуется операционная система MS DOS, Unix, OS/2, Windows.

Важным классом системных программ являются программы-драйверы. Они расширяют возможности DOS по управлению устройствами ввода-вывода компьютера (клавиатурой, жестким диском, мышью и т.д.). С помо­щью драйверов можно подключать к компьютеру новые устройства или не­стандартно использовать имеющиеся устройства.

C++ относится к инструментальным системам и включает в себя как язык программирования, так и среду, предназначенную для написания, от­ладки и запуска программ.

Этапы решения задачи на ЭВМ

Так как ЭВМ является "слепым" исполнителем программ, то успешное решение задачи полностью определяется квалификацией программиста.

В общем случае решение задачи на ЭВМ можно разбить на следую­щие этапы:

постановка задачи;

разработка алгоритма;

составление программы;

трансляция программы;

отладка и выполнение программы;

анализ результатов.

Слово "алгоритм" произошло от имени узбекского математика Аль Хорезми, который в IX в. разработал правила четырех арифметических дей­ствий над числами в десятичной системе счисления. Примерами алгорит­мов могут служить врачебные и кулинарные рецепты, способы решения квадратных и дифференциальных уравнений.

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

Алгоритм должен обладать следующими основными свойствами:

детерминированность (определенность) - при заданных исходных дан­ных обеспечивается однозначность искомого результата;

м

5

ассовость - пригодность для задач данного типа при исходных данных, принадлежащих заданному подмножеству;

результативность - реализуемый вычислительный процесс выполняет­ся за конечное число этапов с выдачей осмысленного результата;

дискретность - разбиение на отдельные этапы, выполнение которых не вызывает сомнений.

Под программой понимают описание, воспринимаемое ЭВМ и доста­точное для решения на ней определенной задачи. Для создания программы используются искусственные языки, называемые языками программирова­ния. ЭВМ, как правило, непосредственно воспринимает и выполняет про­граммы, написанные только на одном из языков программирования - ма­шинном языке для данной ЭВМ. С помощью специальных программ мож­но получить опосредованное "понимание" других языков. Одна из таких программ - транслятор. Транслятор - это программа, осуществляющая пере­вод текстов с одного языка на другой, т. е. с входного языка (Паскаль, Си, Пл-1 и т. д.) на машинный язык реальной ЭВМ. Программа, попадаю­щая на вход транслятора, называется исходной, а результат трансляции - объектной программой.

Графический способ описания алгоритмов

Одним из самых трудоемких этапов решения задачи на ЭВМ является разработка алгоритма. Человечество разработало эффективный алгоритм за­вязывания шнурков на ботинках. Многие дети с пятилетнего возраста могут это делать. Но дать чисто словесное описание этого алгоритма без картинок и демонстрации - очень трудно.

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

Рассмотрим два способа: графический и с помощью языков программи­рования.

Графический способ записи алгоритмов - наиболее наглядный и распро­страненный. Он основан на использовании геометрических: фигур (блоков), каждая из которых отображает конкретный этап процесса обработки дан­ных, соединяемых между собой прямыми линиями, называемыми линиями потока. Обозначение и назначение элементов графических схем алгоритмов приведено в табл. 1. В поле каждого блочного символа указывают выполняемую функцию. При необходимости справа можно поместить комментарии, относящиеся к данному блоку или направлению потока. Каждый блочный символ (кроме начального и конечного) помечается порядковым номером. Для отличия ситуаций пересечения и слияния потоков последняя изображается точкой. Линии потока, имеющие направление вверх или направо, до­полняются стрелками.

6

Таблица 1

7

По своей структуре различают следующие типы алгоритмов; линейные, разветвляющиеся и циклические. В линейных схемах алгоритмов все пред­писания выполняются одно за другим. Например, алгоритм вычисления дли­ны окружности по известной площади круга (рис.2). В разветвляющихся схемах алгоритмов для конкретных исходных данных выполняются не все заданные предписания. Однако какие именно предписания будут выполнять­ся, конкретно определяется в процессе выполнения алгоритма в результате проверки некоторых условий. Разветвляющийся алгоритм всегда избыточен. Примером разветвляющегося алгоритма является алгоритм, приведенный на рис.3 и определяющий, пройдет ли график функции у=3х+4 чepeз точку с координатами x1,y1.

Циклическим алгоритмом называется такой алгоритм, в котором можно выделить многократно повторяющуюся последовательность предписаний, называемую циклом. Для таких алгоритмов характерно наличие параметра цикла, которое перед входом в цикл имеет начальное значение, а затем изме­няется внутри цикла. Имеется также предписание о проверке условия окон­чания цикла. Применение циклов сокращает текст алгоритма и, в конечном итоге, длину программы. Примером циклического алгоритма может слу­жить алгоритм, приведенный на рис.4 и определяющий факториал нату­рального числа n. В этом алгоритме введена дополнительная переменная i, которая является параметром цикла и изменяется от начального значения 1 до конечного значения n с шагом 1. На каждом шаге итерации искомая вели­чина f умножается на переменную цикла. В реальных задачах, как прави­ло, сочетаются все три типа алгоритмов. Способ описания алгоритма с по­мощью алгоритмического языка подробно рассматривается в следующем разделе.

8

Задачи для составления схем алгоритмов

1. Дано натуральное число n. Вычислить произведение

2. Дано натуральное число n и действительное число а. Вычислить произведение а(а+1)(а+2)*...*(а+n-1).

3. Дано натуральное число n и действительные числа х и h. Вычислить

4. Дано натуральное число n. Вычислить сумму n первых слагаемых

5. Дано натуральное число n. Вычислить сумму n первых слагаемых

6. Дано натуральное число n. Вычислить сумму n первых слагаемых

7. Дано натуральное число n. Вычислить сумму n первых слагаемых

8. Дано натуральное число n. Вычислить сумму n первых слагаемых

9. Дано натуральное число n. Вычислить сумму n первых слагаемых

10. Дано натуральное число n. Вычислить произведение n первых со­множителей

11. Дано натуральное число n. Вычислить сумму n первых слагаемых

12. Дано натуральное число n. и действительное число х. Вычислить сумму n первых слагаемых

1

9

3. Дано натуральное число n. Вычислить произведение n первых со­множителей

14. Дано натуральное число n. Вычислить сумму n первых слагаемых

15. Дано натуральное число n и действительное число х. Вычислить сумму n первых слагаемых

16. Дано натуральное число n. Вычислить произведение n первых со­множителей

17. Дано натуральное число n и действительное число х. Вычислить сумму n первых слагаемых

18. Дано натуральное число n. Вычислить произведение n первых со­множителей

19. Дано натуральное число n и действительное число х. Вычислить сумму n первых слагаемых

20. Дано натуральное число n. Вычислить сумму n первых слагаемых

21. Дано натуральное число n и действительные числа х и h. Вычислить

22. Дано натуральное число n. Вычислить произведение

23. Дано натуральное число n. Вычислить произведение n первых со­множителей

10

ЛАБОРАТОРНАЯ РАБОТА № 1

ЛИНЕЙНЫЕ ПРОГРАММЫ

Цель работы:

ознакомится с сеансом работы в среде C++; освоить структуру программы; изучить оператор присваивания; научиться записывать выражения на C++; научиться пользоваться функциям» scanf и printf.

Порядок выполнения работы:

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

Общие сведения

Чтобы иметь представление о том, как программируют на языке С++, приведем пример программы pr1, определяющей сумму двух чисел:

/* Пример pr1 */

#include <stdio.h>

#include <conio.h>

//Главная функция

void main()

{

int a,b,result ;

printf(”\nВведите a и b:”);

scanf(”%d%d”,&a,&b);

result =a+b;

printf(”result =%d”,result);

getch();

}

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

Структура программы на языке С++ в общем случае представляет собой некоторую совокупность функций, из которых одна является главной и присутствует в каждой программе. Эта функция носит стандартное Имя main и с неё начинается выполнение программы. Язык C++ является языком сво­бодного формата, что позволяет размещать в строке как один, так и несколь­ко операторов.

Р

11

ассмотрим каждую строчку программы.

Первая строка программы - комментарий. Комментарий начинается с символов/*, а завершается - */. Комментарий компилятором игнорируется и служит для улучшения читаемости программы. Две следующие строчки программы - директивы препроцессора, которые помещают на своё место соответственно файлы Stdio.h и conio.h, содержащие заголовки функций ввода и вывода. Это необходимо потому, что в языке C++ нет встроенных функций для ввода и вывода. Из файла Stdio.h в нашей программе исполь­зуются функции printf и scanf. Функция scanf служит для ввода исходных данных с клавиатуры, а printf- для вывода результатов на экран монитора. Из файла coniо. h используется функция getch, которая читает с клавиатуры символ. В данном случае она служит для ожидания нажатия любой клавиши, чтобы можно было успеть рассмотреть результаты работы программы. Син­таксис директивы препроцессора следующий:

#include < имя_файла >

#include "имя_файла"

В первом случае поиск файла происходит только в пределах специфици­рованных каталогов включаемых файлов (include directories). При исполь­зовании второй формы сначала просматривается текущий каталог, а затем каталоги включаемых файлов [3]. С помощью директивы include можно включить в текст программы любой другой исходный файл.

Четвертая строка также является комментарием. Этот комментарий од­нострочный: всё, что расположено в текущей строке после двух косых линий считается комментарием. Синтаксис комментария первой строки использует­ся как для многострочных, так и однострочных пояснительных текстов.

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

В

12

приведенном примере описаны три переменные с идентификаторами (именами) a,b,rezult. В языке C++, как и во многих других языках, действует правило: пока переменная, константа и т. д. не описаны, он не может исполь­зоваться. При описании переменных указывается тип переменных. В данном примере все переменные целого типа (int). Описание переменных позволяет определить, сколько байт памяти необходимо выделить под конкретную пе­ременную и какие операции над ней можно выполнять. Идентификаторы (или имена) используются в программе для обозначения переменных, меток, типов, функций, констант. На имена (идентификаторы) накладываются неко­торые ограничения. Важным ограничением при выборе идентификаторов является невозможность использования ключевых слов, например main или void. Идентификатор должен начинаться с буквы и может содержать буквы латинского алфавита, цифры и знаки подчеркивания. Длина идентификатора может быть любой, но значащими являются первые 63 символа. Имена мо­гут нести смысловую нагрузку, как, например, rezult, но могут и не нести. Использование осмысленных имен предпочтительнее, так как это делает про­грамму более простой для понимания. В идентификаторах, как и во всей про­грамме на языке C++, имеет значение разница в высоте букв: это разные сим­волы.

Восьмая строка программы содержит вызов функции printf, которая выводит на экран с новой строки сообщение: Введите а и b:. Вывод с но­вой строки обеспечивается за счет использования параметра \n. Девятая строка программы содержит вызов функции scanf, которая читает с клавиа­туры значения в переменные а и Ь, в соответствии с форматом %d для це­лых чисел. Более подробно об этих функциях читайте в разделе 3.1.4.

Десятая строка программы содержит оператор присваивания, вычис­ляющий сумму целых чисел а и b и размещающий результат в переменной rezult. В следующей строке содержится вызов функции printf, которая вы­водит на экран значение переменной rezult. В предпоследней строке содер­жится вызов функции getch, которая ждет нажатия любой клавиши, чтобы дать возможность пользователю просмотреть результат: В последней строке программы находится фигурная скобка, завершающая тело функции main.

Для выполнения программы необходимо [3]:

подготовить её текст в файле с расширением .срр (для этого необходимо загрузить C++, выбрав команду bc\bin\bc);

передать этот файл на компиляцию (ALT-F9);

устранить синтаксические ошибки, выявленные компилятором;

безошибочно откомпилировать (получится объектный файл с расшире­нием .obj);

дополнить объектный файл нужными библиотечными функциями (ком­поновка CTRL-F9)n получит исполняемый Модуль программы в файле с расширением .ехе.

Схема подготовки исполняемой программы приведена на рис.5, где пе­ред шагом компиляции показан шаг препроцессорной обработки текста программы. В приведенном выше примере обрабатывается директива include. Следует сказать, что препроцессор не только добавляет к тексту программы функции для ввода и вывода, но и обрабатывает текст программы.

Рассмотрим подробнее описания переменных и операторы, необходи­мые для написания линейной программы.

13

Рис. 5

14

Описание переменных

В языке C++ возможна обработка данных «различных типов. Тип лю­бого объекта определяет множество допустимых значений и множество допустимых операций над этими значениями. Любой идентификатор, ис­пользуемый в исполняемых операторах, должен быть предварительно описан в любом месте программы, но обязательно до начала применения.

Рис. 6

В этом строгом требовании языка C++ проявляется тенденция разви­тия языков программирования в сторону повышения надежности созда­ваемых программ, При описании переменных их можно инициализировать. На рис.6 приведена структура типов данных C++. В данном разделе рассматриваются только целые и вещественнее типы данных.

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

15

Таблица 2

Описание переменных целого типа может выглядеть так:

int а, b=0;

long с;

unsigned int d;

В данном случае переменная b инициализирована при описании.

Основные операции над целыми числами:

“+” – сложение; “*” – умножение; “/ ” - деление;

“-” – вычитание; “%” – получение остатка от целовычисленного деления. Следует обратить внимание на операцию деления. В языке С++ специальной операции целочисленного деления нет, поэтому тип операции определяется типами операндов. Если оба операнда целые, то операция деления выполняется как операция целочисленного деления. Если хотя бы один из операндов с плавающей точкой, то операция деления выполняется не как целочисленная. Приоритеты выполнения операций такие же, как в математике.

Например, 5/2 дает результат 2, 6/2 – 3, 5%2 – 1.

Под данными вещественного типа понимаются числа, записанные с десятичной точкой. Значение числа вещественного типа представляется в ЭВМ лишь с некоторой конечной точностью, которая зависит от внутреннего формата вещественного числа. В табл.3 приведены названия вещественных типов, их длина в байтах, а также диапазон возможных значений. Существует две формы представления вещественных чисел: с фиксированной и с плавающей точками. Примеры записи вещественных чисел с фиксированной точкой приведены в первом столбце, а с плавающей – во втором:

1.36 1.36е0

0.0013 1.3е-3

16

123.123 1.23123е2

Переменные вещественного типа можно описать так:

float a,b;

double c,d;

long double l,m,n;

Таблица 3

В табл.4 приведены наиболее часто используемые функции, для разработки данных вещественного типа. Следует знать, что этими функциями можно пользоваться только после подключения файла math.h с помощью директивы препроцессора include.

Следует заметить, что для вычисления модуля целого числа использует­ся функция abs(x).

Таблица 4

Оператор присваивания

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

<

17

переменная> = выражение.

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

int x,y;

float a, b;

то можно записать операторы присваивания

х = 2;

х=х+5;

у = х;

а = b = 3.1;

b = 5.33*х + у/2;

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

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

signed char => short => int => long

float => double => long double

unsigned char => unsigned short => unsigned int => unsigned long

Значит, для описанных выше переменных оператор х = а будет невер­ным, так как невозможно точно преобразовать вещественный тип к целому, а оператор а = х будет верным. При этом следует заметить, что сообщение об ошибке выдаваться не будет, так как язык С++ относится менее жестко, чем скажем Паскаль, к соответствию типов.

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

(имя_типа) операнд,

имя_типа (операнд).

Во второй форме не может использоваться составное наименование типа (например, unsigned short). Как и при автоматическом преобразовании ти­пов, ответственность за сохранение значения и точности результата лежит на разработчике программы.

Следующий пример рг2 демонстрирует, какие последствия можно иметь от преобразования типов:

//Пример рг2

#include <stdio.h>

#include <conio.h>

v

18

oid main()

{

long a=123456789;

float b;

int rezult1,rezult2;

rezult1=1.6+1.7;

rezult2=(int)1.6+(int) 1.7;

printf("\n rezult1=%d",rezult1); // Печатаем rezult1=3

printf("\n rezult2=%d",rezult2); // Печатает rezult2=2

b=(float)a;

printf("\n a=%ld",a); // Печатает а=123456789

printf("\n b=%е",b); // Печатает b=1.2345689е + 08

a=(long)b;

printf("\n а=%ld",а); // Печатает a=1.23456892

b=2.222222е+2;

rezult1=(int)b;

printf("\n b=%f",b); // Печатает b=222.222198

printf("\n rezult1=%d",rezult1); // Печатает rezult1=222

b=(float) rezult1;

printf("\nb=%f",b) // Печатает rezult1=222,000000

getch();

}

Кроме классической записи оператора присваивания, в языке C++ мож­но использовать операции увеличения ++ и уменьшения --. Операция уве­личения увеличивает свой операнд на 1, а операция уменьшения уменьшает свой операнд на 1. Существует две формы этих операций: постфиксная и префиксная. Разница между ними заключается в том, что они показывают, в какой момент осуществляется увеличение или уменьшение операнда:

х++, х-- постфиксная запись;

++х, --х префиксная запись.

В данных примерах форма записи никак не отражается на результате, а следующий пример ргЗ иллюстрирует разницу:

// Пример ргЗ

#include <stdto.h>

#include <conio.h>

void main()

{int a,b,x;

x=0;

a=5+x++;

b=5+ ++x;

printf("a = %d\nb = %d",a,b);

getch();

}

Р

19

езультатом работы этой программы будет вывод значений:

а = 5

b = 7

При вычислении а сначала к 5 добавляется х=0, а потом х увеличива­ется на 1. При вычислении b сначала х увеличивается на 1 и становится рав­ным 2, а затем значение х добавляется к 5.

В операторах присваивания можно использовать укороченную форму записи, например, запись a+=%5 эквивалентна записи а=а+5:

// Пример рг4

#include <stdio.h>

#include <conio.h>

void main()

{float a,b,x;

а=b=x=1;

a+=5; // эквивалентно а=а+5

b/=5+x; // эквивалентно b=b/(5+x)

printf("\na=%f\nb=%f",a,b);

a-=5; // эквивалентно a=a-5

b*=5+x; // эквивалентно b=b*(5+х)

printf("\na=%f\nb=%f",a,b);

getch();

}

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

Функции ввода и вывода

Ввод/вывод связан с обменом информацией между оперативной памя­тью и внешними устройствами. Как уже говорилось, в языке C++ нет встро­енных функций ввода и вывода. Поэтому, чтобы воспользоваться функциями ввода и вывода, необходимо с помощью директивы препроцессора подклю­чить файл, содержащий соответствующие функции. Функций ввода/вывода много, но в данный момент рассматриваются функции ввода scanf и вывода printf. Функция ввода scanf служит для чтения информации с клавиатуры и имеет следующий синтаксис;

scanf (<управляющая строка><список ввода>);

<Управляюи1ая строка> - строка символов, содержащая специфи­кации преобразования. Каждому идентификатору из списка ввода должна со­ответствовать строго одна спецификация преобразования.

Спецификацию преобразования можно формально определить следую­щим образом [1]:

%[флаг][ширина][.точность][1,L] символ_формата

В

20

качестве флага могут выступать следующие символы:

- выровнять значение по левому краю поля (т.е. добавить пробелы справа);

+ выровнять значение по правому краю поля, вывести обязательно знак значения.

При отсутствии флага выравнивание идет по правому краю и для неот­рицательных значений знак не выводится. Ширина определяет минимальный размер поля вывода. Точность используется для определения количества вы­водимых позиций после запятой в поле вывода вещественного числа. 1 или L служат для указания целых длинных типов,

Назначение некоторых спецификаций преобразования приведены в табл.5.

Таблица 5

<Список ввода> - это последовательность из одного или более иден­тификаторов переменных строкового типа, а также любого целого или веще­ственного типа. Перед каждым идентификатором должен стоять символ &, который означает, что в функцию передается адрес переменной, а не значе­ние. Подробнее о передаче параметров в функции читайте в разд.5. При вво­де числовых переменных функция scanf вначале выделяет подстроку во входном потоке по следующему правилу: все ведущие пробелы, символы табуляции и маркеры конца строки пропускаются, выделяется первый зна­чащий символ, признаком конца подстроки является любой из вышеперечис­ленных символов или символ конец файла. Выделенная таким образом под­строка рассматривается как символьное представление числовой константы, которое преобразуется в соответствии с типом переменной, и полученное значение присваивается переменной. Если значащих символов в строке нет, а список ввода еще не исчерпан, то автоматически осуществляется пе­реход к новой строке.

p

21

rintf (<управляющая строка><список вывода>);

<Управляющая строка> - это строка символов, содержащая информа­цию, печатаемую текстуально, спецификации преобразования и специальные символы. Управляющая строка определяет, каким образом будет распечатана информация.

В C++ чаще всего используются следующие специальные символы:

\n - перевод курсора на новую строку;

\t - символ табуляции;

\b -шаг назад;

\r —возврат каретки.

Также можно использовать константы \007 (выдается короткий звуко­вой сигнал).

<Список вывода> - это последовательность идентификаторов пере­менных, констант, выражений, вычисляемых перед выводом на печать. Каж­дому аргументу из списка вывода должна соответствовать одна специфика­ция преобразования. В рr5 показано различное использование операторов ввода и вывода, но чтобы разобраться во всех нюансах, необходимо провести эксперименты.

// Пример рг5

#include <stdio.h>

#include <conio.h>

void main()

{ float a, b;

int x,y;

printf("Bведите целые х и у");

scanf("%d%d",&x,&y); // При вводе числа разделяются

// пробелами или символом конец строки

printf("x=%d y=%d \n x=%7d y=%2d",x,y,x,y);

printf("Bведите вещественные a и b);

scanf("%g%f",&a,&b); // нажимается клавиша Enter

//Вывод с различными спецификациями преобразования

printf("a=%g b=%g\na=%f b=%f\na=%е b=%е \n",a,b,a,b,a,b);

//Вывод с различной точностью

printf("a=%10.3f b=%10.3f\na=%7.2e b=%7.2e\n",a, b, a, b);

getch();

}

Если введем х=12345, у=6789, а=1.2345 и b=0.0000007, то полу­чим следующий результат:

х=12345 у=6789

х=12345 у=6789

а=1.2345 b=1e-07

а=1.234500 b=0.000000

а=1234500e+00 b=1.000000e-07

а=1.2345 b=1е-07

а

22

=1.23е b=0.000

а=1.23е+00 b=1.00е-07

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

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

Теперь, когда мы ознакомились с операторами, необходимыми для со­ставления линейной программы, рассмотрим пример такой Программы. Пусть дано два числа а и b - длины сторон прямоугольника. Найти площадь s и периметр р прямоугольника. На рис.7 представлена графическая схема алгоритма решения данной задачи, а программа приведена в примере pr6.

//Пример рr6

#include <stdio.h>

#include <conio.h>

main()

{ float a,b,s,p;

printf("Введите длины сторон

прямоугольника:");

scanf("%f%f",&a,&b);

s=a*b;

р=(а+b)*2;

printf ("Площадь =%5.3f ",s);

printf ("Периметр =%5.3f",p);

getch();

}

В этой программе все операторы выполняются последова­тельно друг за другом. Выполнение программы начинается с вызова функции вывода printf, которая выводит на экран подсказку "Введите длины сторон прямоугольника:", что обеспечивает удобный интерфейс с пользователем. Вы­зов функции scanf приводит к прерыванию программы до тех пор, пока пользователь не введет два числа. Далее вы­числяются площадь и периметр прямоугольника и выводят­ся результаты на экран.

23

Рис.7

Контрольные вопросы

1. Что значит отладить программу?

2. Что такое транслятор?

3. Чем управляющая строка функции scanf отличается от управляю­щей строки функции printf?

4. Для чего предназначена спецификация преобразования?

5. Как будет выведено число 12345.6789, если для него использовалась спецификация преобразования %7.2f?

6. Что значит описать переменную?

7. Для чего предназначен символ \n?

8. Как записать на языке C++ выражение

9. Этапы решения задачи на ЭВМ.

10. Назначение оператора присваивания.

11. Чем отличается постфиксная операция увеличения от префиксной?

12. Какое значение х будет напечатано в результате работы следующей программы:

#include <stdio.h>

main()

{

float x=1, y=2;

int a=3, b=4;

x

24

= x/a + y/x + a/b;

printf ("x=%5.3f ",x);

}

Варианты заданий

1. Смешано v1 литров вода температуры t1 с v2 литрами воды температуры t2. Написать программу вычисления объема и температуры образовавшейся смеси.

2. Поменять местами значения целых переменных х и у, не используя дополнительных переменных (х < 1000 и y < 1000).

3. Идет k-я секунда суток. Определить, сколько полных часов (h) и полных минут (m) прошло к этому моменту (например, h=3 и m=40, если

4. Вычислить расстояние между двумя точками с координатами x1, y1, x2, y2.

5. Треугольник задан координатами своих вершин. Найти периметр треугольника.

6. Присвоить целой переменной h третью от конца цифру в записи целого положительного числа k (k больше 100. Например, если k=130985, то h=9).

7. Присвоить целой переменной d первую цифру из дробной части по­ложительно вещественного числа х (так, если х=32.597, то d=5).

8. Целой переменной s присвоить сумму цифр трехзначного целого числа k.

9. Определить f - угол (в градусах) между положением часовой стрелки в начале суток и ее положением в h часов, m минут и s секунд (0≤ h ≤ 11,0 ≤ m,s ≤ 59).

10. Определить h — полное количество часов и m полное количество ми­нут, прошедших от начала суток до того момента (в первой половине дня), когда часовая стрелка повернулась на f градусов;(0 ≤ f ≤ 360, f - вещест­венное число).

11. Пусть k - целое число от 1 до 365. Присвоить целой переменной n значение 1,2, ..,6 или 7 в зависимости от того, в какой день недели (поне­дельник, вторник, ..., суббота или воскресенье) приходится к-ый день не ви­сокосного года, в котором 1 января - понедельник.

12. Три сопротивления R1,R2,R3, соединены параллельно. Найти сопро­тивление соединения.

13. Определить силу притяжения F между телами массы m1, m2, нахо­дящимися на расстоянии r друг от друга.

1

25

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

15. Треугольник задан координатами своих вершин. Найти площадь тре­угольника.

16. Дано вещественное число х. Вычислить

17. Дано вещественное число х. Вычислить

18. Дано вещественное число х. Вычислить

19. Дано вещественное число х. Вычислить

20. Дано вещественное число х. Вычислить

21. Дано вещественное число х. Вычислить

22. Дано вещественное число х. Вычислить

23. Дано вещественное число х. Вычислить

24. Дано вещественное число х. Вычислить

25. Дано вещественное число х. Вычислить

26

ЛАБОРАТОРНАЯ РАБОТА № 2

РАЗВЕТВЛЯЮЩИЕСЯ ПРОГРАММЫ

Цель работы:

продолжить знакомство с работой в среде C++;

изучить операцию условия;

изучить условный Оператор;

изучить оператор множественного выбора.

Порядок выполнения работы:

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

Общие сведения

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

На рис.8 приведена графическая схема алгоритма, а программа - в примере рr 7.

27

Рис.8

//Пример рr7

#include <stdio.h>

#include <conio.h>

#include <math.h>

void main()

{

float x,y;

printf ("Bвeдитe x:");

scanf ("%f",&x);

if (x>0)

y=x*x*x+3;

else

y=х*sin(x);

printf ("y=%4.2 f\n",y);

getch();

}

В этой программе впервые встречается условный оператор, который служит для выбора формулы вычисления y в зависимо­сти от введенного значения x.

Условный оператор

Условный оператор служит для ветвлений в программе и имеет сле­дующий синтаксис:

if(<условие>) <onepamop1>; else <onepamop2>.

Здесь if, else - ключевые слова (пер. с англ.: если, иначе соответствен­но);

<условие> - это условное выражение типа сравнения (например, а>b, c<=d, f=1);

<оператор1> и < оператор2> любой оператор С++.

Оператор работает следующим образом: если условие истинно, то вы­полняется <оператор1> и управление передается на следующий за услов­ным оператор; если условие ложно, то выполняется <оператор2> и управление передается на следующий за условным оператор. Таким обра­зом, всегда выполняется один из двух операторов: либо <оператор1>, либо <оператор2>.

Кроме вышеприведенной формы условного оператора, существует со­кращенная форма условного оператора, в которой отсутствует ветвь else:

If <условие> <оператор1>.

О

28

ператор работает следующим образом: если условие истинно, то вы­полняется <оператор1> и управление передается на следующий за услов­ным оператор; если условие ложно, то управление сразу передается на следующий за условным оператор. Таким образом, в зависимости от условия, <оператор1> либо выполняется, либо не выполняется.

Рассмотрим фрагменты схем алгоритмов и соответствующие им фраг­менты программ.

if(a>b) if(a>c) max-a; else max=c;

if(a>b) if(a>c) max-a; else max=c;

if(a>b)

max = a;

else

max = b;

if(k>0)

s=s+k;

if(a>b)

if(a>c)

max = a;

else

max = c;

29

if(a>b)

if(a>c)

max=a;

else max=c;

else

if(b>c)

max=b;

else max=c;

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

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

Подробнее остановимся на понятии условное выражение. В С++ исполь­зуются следующие операции отношения:

< меньше;

<= меньше равно;

> больше;

>= больше равно;

== равно;

!

30

= неравно;

В языке C++ нет логического типа, но любое выражение имеет значение, в том числе и условное. "Истина" - это все ненулевые значения, и только 0 -"ложь" [5]. В программе рr8 это иллюстрируется:

// Пример рr8

#include <stdio.h>

#include <conio.h>

void main()

{

int true false;

true=10>2;

false=10=2;

printf("true=%d; false=%d\n",true,false);

if(200)

printf("200 - это истина \n");

if(-200)

printf("-200 - это истина \n");

if(0);

else

printf("0 - это ложь \n");

getch();

}

В результате работы этой программы будут выведены следующие сооб­щения:

true=1; false=0;

200 - это истина

-200 - это истина

0 - это ложь

В последнем условном операторе после условного выражения стоит так называемый пустой оператор, о чем свидетельствует знак точка с запятой при отсутствии какого-либо оператора. Исходя из предыдущих рассуждений, можно фрагмент if(a!=0) k++; заменить фрагментом if(a) k++;.

Если нужно проверить несколько условий, то можно воспользоваться булевыми операциями. Эти операции образуют инструментальный фундамент булевой логики, алгебры логики, разработанной в Х1Хв, математиком Джорджем Булем. Рассмотрим три основные булевы операции.

Операция && - логическое пересечение (умножение, операция "и"). Если а и b - условные выражения, например k>l или d==5, то выражение а && b дает значение истина только в том случае, если а и b имеют значения истина, в остальных случаях - ложь.

Операция || - логическое сложение (объединение, операция "или"). Вы­ражение а || b дает ложное значение в том и только в том случае, если а и b имеют значения ложь, в остальных случаях – результат истина.

31

if(a>b && a>c)

max=а;

if(x==y || x==z)

z=y;

Операция ! - отрицание (операция "не"). Выражение !а имеет значение, противоположное значению а.

Эти операции полезны, если нужно проверить сложное условие:

Е сли исследовать приоритеты выполнения операций, то самый высокий приоритет у операций сравнения, затем идет операция логического отрица­ния, затем - логическое умножение, а потом - логическое сложение.

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

Составной оператор

К

32

огда необходимо довиться того, чтобы последовательность операто­ров работала как единый оператор, можно помещать эту последователь­ность между открывающейся и закрывающейся фигурными скобками. Такая конструкция называется составным оператором, или операторными скобка­ми. Каждый оператор, входящий в состав составного оператора, заканчивает­ся точкой с запятой. Рассмотрим примеры:

if(c>0)

{ s=s+c;

k=k+1;

}

else c=c-1;

if(n<m)

{ n=n+1;

m=m-1;

}

else

{ n=n-1;

m=m+1;

}

Здесь следует обратить внимание на правила употребления точки с за­пятой:

каждое описание переменных и определение константы заканчивается точкой с запятой;

каждый оператор в теле программы завершается точкой с запятой.

33

Оператор условия

Оператор условия - это короткий способ записи условного оператора. В общем случае синтаксис этого оператора следующий:

<выражение1>?<выражение2>:<выражениеЗ>

Здесь <выражение1> - условное выражение и, если оно истинно, то вычисляется <выражение2>, которое становится результатом. Если <выражение1> - ложно, то результатом будет <выражениеЗ>. Класси­ческий пример:

х=(у<0)?-у: у;

Выражение возвращает абсолютное значение переменной у.

Оператор switch

Оператор switch предназначен для организации выбора из множества различных вариантов. В общем случае оператор switch выглядит следующим образом: switch (<выражение>)

{

case <выражение_1>:<операторы>;

case <выражение_2>: <операторы>;

case <выражение_n>: <операторы>;

default: <операторы>;

}

Здесь switch, case, default - ключевые слова (пер. с англ.: переключа­тель, состояние, невыполнение обязательств); <выражение> - выражение любого целого типа;

<выражние_1>, <выражение_2>, <выражение_n> - константа или константное выражение того же типа, что и <выражение>;

<операторы> - один или несколько операторов C++.

Р

34

абота оператора начинается с вычисления <выражения>. Значение этого выражения является критерием для выбора из нескольких вариантов. Если полученное значение выражения совпадает с одной из, констант, то вы­полняется та группа операторов, которой предшествует эта константа, а по­том все группы операторов, расположенные ниже. Но так как часто програм­мист использует этот оператор, чтобы выполнить только одну группу, то в конце каждой группы используется специальный оператор break, осуществ­ляющий выход из оператора switch (а также из всех операторов цикла). Если такой константы не обнаруживается, то выполняется оператор, следующий за ключевым словом default. Ветвь default может отсутствовать, и в этом слу­чае управление переедается оператору, следующему за оператором switch.

Рассмотрим примеры, демонстрирующие работу: оператора выбора. В примере рr9 определяется, является ли введенное число n четным.

// Пример рr9

#include <stdio.h>

#include <conio.h>

void main()

{

int n;

printf("Bведите число");

scanf("%d",&n);

switch (n%2)

{ case 1: printf("%d - нечетное\n",n); break;

case 0: printf("%d - четное\n",n);

}

getch();

}

Следующая программа prl0 по номеру месяца определяет время года:

// Пример prl0

#include <stdio.h>

#include <conio.h>

void main()

{

int month; printf("Bведите число - номер месяца: ");

scanf("%d",&month); switch (month)

{case 12:

case 1:

case 2: printf("%d - зимний месяц",month); break;

case 3:

case 4:

case 5: printf("%d - весенний месяц",month); break;

case 6:

case 7:

case 8: printf("%d- Летний месяц ", month); break;

case 9:

case 10:

case 11: printf("%d - осенний месяц'',month); break;

default: printf("Про это мне неизвестно!");

}

getch();

35

}

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

// Пример pr11

#include <stdio.h>

#include <conio.h>

void main()

{

char op; // Знак арифметической операции

float x,y,z; //Операнды и результат

printf("\n Введите операнды х,у:");

scanf("%f%f ",&x,&y);

vvhile(getchar()!='\n'); // Очистка входного потока

printf("Введите знак арифметической операции:")

scanf(''%c",&op); switch(op)

{

case '*' z = x*y; printf("z=%f ", z); break;

case '/ ' if (y) { z = x/y; printf("z=%f ", z); }

else printf("Деление на ноль"); break;

case '+' z = x+y; printf("z=%f ", z); break;

case '-' z = x-y; printf("z=%f ", z); break;

default: printf("Увы! Это не арифметическая операция! ");

}

getch();

}

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

Оператор перехода

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

Безусловный переход приводит к передаче управления из одного места программы в другое. Структура оператора перехода следующая:

goto <метка>

Здесь goto- ключевое слово (англ.: перейти на [метку]).

М

36

етка - это произвольный идентификатор, позволяющий пометить не­который оператор, чтобы, ссылаться на него. Метка ставится перед операто­ром, получающим управление, и отделяется от него двоеточием. Метки в языке C++не требуют предварительного описания.

...............

goto 1;

m: ………

goto loop;

l: ..............

goto m;

Пример разветвляющейся программы

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

Поле шахматной доски определяется парой натуральных чисел, каж­дое из которых не превосходит восьми: первое число - номер вертикали (при счете слева направо), второе - номер горизонтали (при счете снизу вверх). Даны натуральные числа k,l,m,n, каждое из которых не превосходит восьми. Требуется выяснить, являются ли поля (k,l) и (m,n) полями одного цвета.

Прежде чем приступать к составлению алгоритма и программы, необ­ходимо внимательно рассмотреть шахматную доску и прийти к выводу, что поля будут иметь одинаковый цвет, если сумма номеров горизонтали (k+l) и вертикали (n+m) того и другого поля будет четной или того (k+l) и другого (n+m) поля нечетной. Схема алгоритма приведена на рис.9, а программа на языке C++ - в примере pr13.

// Пример pr13

#include <stdio.h>

#include <conio.h>

void main()

{ int k,l,n,m;

printf("\nBведите координаты полей k,l,n,m:");

scanf("%d%d%d%d",&k,&l,&n,&m);

if((k+l)%2==0 && (n+m)%2==0 || (k+l)%2!=0 &&

(n+m)%2!=0)

printf("\nПоля однго цвета");

else printf("\nПоля разного цвета");

getch();

}

37

Рис. 9

Контрольные вопросы

1. Для чего служит условный оператор? Как он работает?

2. Какое значение х будет напечатано в результате работы следующей программы:

#include <stdio.h>

main()

{

float x=l,y=2;

int a=3, b=4;

if(a<b)

if(x<y)

x=x/a + у/x + a/b;

printf("x=%5.3f ",x);

}

3. Какие ошибки допущены в следующей программе:

#include <stdio.h>

main()

{

float x=l,y=2;

int a=3,b=4;

if(a<b) x=x+1

else

if(0<x<y)

x= x/a+ y/x +a/b;

38

printf("x=%5.3f ",x); }

4. Для следующего фрагмента схемы алгоритма составьте фрагмент программы на языке С++:

5. Что такое истина в С++?

6. Для чего используется оператор множественного выбора?

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

Варианты заданий

1. Дано вещественное х. Составить программу вычисления z=f(x), если

Предусмотреть разрешение аварийных ситуаций.

2. Дано вещественное х. Составить программу вычисления y=f(x), если

Предусмотреть разрешение аварийных ситуаций.

3. Дано вещественное х. Составить программу вычисления y=f(x), если

Предусмотреть разрешение аварийных ситуаций.

4

39

. Дано вещественное х. Составить программу вычисления y=f(x), если

Предусмотреть разрешение аварийных ситуаций.

5. Дано вещественное х. Составить программу вычисления y=f(x), если

Предусмотреть разрешение аварийных ситуаций.

6. Дано вещественное х. Составить программу вычисления y=f(x), если

Предусмотреть разрешение аварийных ситуаций.

7. Дано вещественное х. Составить программу вычисления y=f(x), если

Предусмотреть разрешение аварийных ситуаций.

8. Дано вещественное х. Составить программу вычисления z=f(x), если

Предусмотреть разрешение аварийных ситуаций.

9. Дано вещественное х. Составить программу вычисления z=f(x), если

Предусмотреть разрешение аварийных ситуаций.

10. Дано вещественное х. Составить программу вычисления z=f(x), если

Предусмотреть разрешение аварийных ситуаций.

11. Дано вещественное х. Составить программу вычисления y=f(x), если

Предусмотреть разрешение аварийных ситуаций.

1

40

2. Дано вещественное х. Составить программу вычисления y=f(x), если

Предусмотреть разрешение аварийных ситуаций.

13. Дано вещественное х. Составить программу вычисления y=f(x), если

Предусмотреть разрешение аварийных ситуаций.

14. Поле шахматной доски определяется парой натуральных чисел, каж­дое из которых не превосходит восьми: первое число - номер вертикали (при счете слева направо), второе - номер горизонтали (при счете сверху вниз). Даны натуральные числа k, l, m, n, каждое из которых не превосходит вось­ми. Требуется выяснить, угрожает ли ферзь полю (k, l), если он расположен на поле (m, n).

15. Поле шахматной доски определяется парой натуральных чисел, каж­дое из которых не превосходит восьми: первое число - номер вертикали (при счете слева направо), второе - номер горизонтали (при cчете сверху вниз). Даны натуральные числа k, I, m, n, каждое из которых не превосходит восьми. Требуется выяснить, угрожает ли конь полю (k, l), если он расположен на поле (m, n).

16. Даны целые числа m и n (0 < m <= 12, 0 <= n < 60), указываю­щие момент времени: "m часов, n минут". Определить наименьшее время (число полных минут), которое должно пройти до того момента, когда часо­вая и минутная стрелки на циферблате совпадут.

17. Даны целые числа m и n (0 < m <= 12, 0 <= n < 60), указываю­щие момент времени: "m часов, n минут". Определить наименьшее время (чис­ло полных минут), которое должно пройти до того момента, когда часовая и минутная стрелки на циферблате расположатся перпендикулярно друг к другу.

18. Составить программу, определяющую, лежит ли точка c координа­тами х1,у1 на прямой у=4х-3, выше или ниже прямой.

19. Дано: х и у - произвольные вещественные числа. Определить z по следующей формуле:

20. Определить, принадлежит ли точка с координатами (х,у) кругу ра­диуса r с центром в начале координат.

21. Написать программу определения суммы большего и меньшего из трех заданных чисел.

2

41

2. Написать программу нахождения номера N четверти координатной плоскости, которой принадлежит заданная точка (х,у), где х ≠ 0, у ≠ 0.

23. Даны три точки, заданные своим координатами, определить принад­лежат ли эти точки одной прямой.

24. Дано вещественное x. Составить программу вычисления f(x), если f(x) задана графически на рис.10.

25. Дано вещественное x. Составить программу вычисления f(x), если f(x) задана графически на рис.11.

Рис. 10

Рис. 11

42

ЛАБОРАТОРНАЯ РАБОТА № 3

ЦИКЛИЧЕСКИЕ ПРОГРАММЫ

Цель работы:

ознакомиться с операторами цикла;

научиться пользоваться отладочным режимом в среде C++;

научиться выполнять программу по шагам.

Порядок выполнения работы:

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

Примечание. Для открытия отладочного окна выбираем "в главном меню Debug, пункт Watches, а в нём пункт Add watch (или CTRL+F7). В от­крывшемся окне нужно набрать имя переменной, изменение которой вы на­мерены контролировать. Для выполнения программы по шагам выбираем в главном меню Run, пункт Trace into (F7) или Step over (F8) в зависимо­сти от того, собираетесь ли вы выполнять по шагам написанные вами функ­ции.

Все задачи решаются без вложенных циклов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]