АЛМАТИНСКИЙ ИНСТИТУТ ЭНЕРГЕТИКИ И СВЯЗИ

Кафедра инженерной кибернетики

 

 

 

 

 

                  

 

 

 

 

 

 

ИНФОРМАТИКА. Основы С++

Часть 5

Методические указания к выполнению лабораторных работ

(для студентов всех специальностей)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Алматы 2006


СОСТАВИТЕЛИ: Л.К.Ибраева, Н.В.Сябина. Информатика. Основы С++. Часть 5. Методические указания к выполнению лабораторных работ (для студентов всех специальностей). - Алматы: АИЭС, 2006.- 35 с.

 

   

 

Методические указания по дисциплине «Информатика» состоят из 6 частей: части 1 и 2 содержат методические указания по работе с операционной системой Windows, офисными программами MS Word, MS Excel, MS Access, графическим редактором CorelDraw и Интернетом. Остальные части посвящены основам программирования: части 3 и 4 - на языке Turbo Pascal, части 5 и 6 – на языке С++ и разработаны в помощь первокурсникам для самостоятельного освоения раздела «Основы программирования», изучаемого в курсах информатики и технологий программирования.

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

Методические указания предназначены для студентов всех специальностей. 

    Ил. 1, табл. 7, библиогр. – 10 назв.

 

 

 

    Рецензент: канд. техн. наук, доц. Имангалиев Ш.И.

 

 

 

 

    Печатается по плану издания Алматинского института энергетики

и связи на 2006 г.

 

 

 

 

 

© Алматинский институт энергетики и связи, 2006 г.


Введение

 

Язык программирования высокого уровня C++ был разрабо­тан в США в начале 80-х годов сотрудником компании Bell Laboratories Бьерном Страуструпом (Bjarne Stroustrup) в результате рас­ширения и дополнения языка С средствами, необходимыми для объектно-ориентированного программирования. Среди современных языков С++ относится к классу универсальных и по праву считается господствующим языком, используемым для разработки коммерческих программных продуктов. Пожалуй, лишь такой язык программирования, как Java, может составлять ему конкуренцию. Разновидностью С++ является С# - новый язык, разработанный Microsoft для сетевой платформы. Несмотря на ряд принципиальных отличий, языки С++ и С# совпадают примерно на 90%.

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

К основным особенностям языка относят следующие:

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

- базовые типы данных С++ совпадают с типами данных Ассемблера, на преобразования типов налагаются незначительные ограничения;

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

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

- C++ содержит в себе все основные черты объектно-ориентированных языков программирования: наличие объектов и инкапсуляцию данных, наследование, полиморфизм и абстрак­цию типов;

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

Предлагаемые методические указания к выполнению лабораторных работ  (части 5 и 6) разработаны в помощь первокурсникам для самостоятельного освоения раздела «Основы программирования», изучаемого в курсах информатики и технологий программирования. Изложение основ программирования на языке С++ в рамках технологии структурного программирования подкрепляется конкретными примерами, сопровождается необходимыми комментариями и ориентировано на версию компилятора C++ 3.1, которая появилась на рынке программных продуктов в начале 90-х годов почти одновременно с Turbo Pascal 7.0. В приложениях содержится весь необходимый справочный материал.

Для достижения наилучшего результата при изучении изложенного материала необходимо придерживаться следующих общих требований и рекомендаций по выполнению лабораторных работ:

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

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

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

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

 

 

1 Лабораторная работа №1. Основные понятия языка. Стандартные типы данных. Оператор присваивания.

 

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

 

1.1 Основные понятия языка С++

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

Алфавитом называют присущий данному языку набор символов, из которых формируются все конструкции языка. Язык C++ оперирует со следующим набором символов:

- латинские прописные и строчные буквы (А, В, С, ..., х, у, z);

- арабские цифры (0, 1, 2, ..., 7, 8, 9);

- символ подчеркивания («_»);

- специальные символы (список специальных символов языка C++ приведен в таблице А1);

- символы-разделители (пробелы, комментарии, концы строк и т.д.).

С помощью перечисленных символов формируются имена, ключевые (служебные) слова, числа, строки символов, метки.

Идентификаторы (имена) используются для обозначения (идентификации) всех объектов, вводимых в программу (имен переменных, констант, функций, типов, меток и т.д.). Имена обязательно начинаются с латинской буквы или символа подчеркивания «_», за которыми могут следовать в лю­бой комбинации латинские буквы и цифры. C++ различает про­писные и строчные буквы. Не допускается использование для написания имен специальных символов и символов-разделителей. Например,

_х, В12, Stack     - правильно;

Label.4, Root-3    - неправильно.

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

Некоторые идентификаторы, имеющие специальное значение для компилятора, употребляются как ключевые слова. Их употребление строго определено, и они не могут использоваться иначе. Список зарезервированных слов в C++ приведен в таблице А2. Каждый компилятор может увеличивать количество ключевых слов, т.к. учитывает дополнительные возможности того типа компьютеров, для которых он создан.

Имя метки перехода представляет собой символьно-цифровую конструкцию, например, metkal, pass, cross15, и в программе не объявляются.

Строка символов — это последовательность символов, зак­люченная в кавычки. Например, «Строка символов».

Комментарий – это часть программы (пояснительный текст, оформленный определенным образом), которая игнорируется компилятором и служит для удобочитаемости исходного текста программы. В процессе компиляции комментарий заменяется пробелом, следовательно, он может располагаться в любом месте программы, где допустимо использование пробела. Любая последовательность символов, заключенная в ограничивающие скобки /* */,  в языках С и С++ рассматривается как многострочный комментарий, например,

/*Главная программа*/.

В языке С++ дополнительно имеется еще один вид комментария – однострочный: все символы,  следующие за знаком // (двойной слеш) до конца строки, рассматриваются как комментарий, например,

//Главная про­грамма.

Большинство программистов используют, в основном, комментарий стиля С++ (//), а комментарий стиля C (/* */) применяют для временного отключения больших участков программы. Но следует помнить, что комментарии не должны быть «переводом» неряшливо написанного кода, а в комментариях, разъясняющих очевидные места, мало толку. Комментарии, прежде всего, должны разъяснять, не что это за операторы, а для чего они здесь используются.

Числа, обозначающие целые и вещественные значения, запи­сываются в десятичной системе счисления. Перед любым числом может стоять знак «+» или «-». В вещественном числе целая часть числа отделяется от его дробной части точкой. Вещественные числа, содержащие десятичную точку, должны иметь перед ней или после нее, по край­ней мере, по одной цифре.

Директива препроцессора – инструкция, записанная в исходном тексте С-программы и выполняемая препроцессором.

 

1.2 Структура программы на языке С++

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

Структура программы на языке С++ представлена на рисунке 1.1.

Каждая программа на языке C++ начинается с директивы #include, которая подключает заголовочный файл (*.h), содержащий прототипы функций, которые сообщают компилятору информацию о синтаксисе функции, например,

# include   <iostream.h>

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

Каждая программа на C++ содержит, по крайней мере, одну функцию – main(), которая автоматически вызывается при запуске, может вызывать другие имеющиеся в программе функции и обычно имеет вид:

void main ( )

#include <имя.h>

Подключение заголовочных файлов

function1 ( )

{

  оператор;

}

 

function2 ( )

{

  оператор;

}

Определение функций программы

void main ( )

Определение главной функции

{

Начало тела главной функции

  оператор 1;

  оператор 2;

 

  оператор 3;

Операторы функции

function1 ( );

function2 ( );

Вызов функций программы

}

Конец тела главной функции

Рисунок 1.1 – Структура программы на языке С++

Обычную функцию необходимо вызывать (обращаться к ней) программно, в ходе выполнения кода. Функция main() вызывается операционной системой, и обратиться к ней из кода программы невозможно. Слово void служит признаком того, что программа не возвращает конкретного значения. В случае возврата значения операционной системе перед функцией main() указывается слово int, а в конце тела этой функции помещается выражение return() или return0.

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

 

1.3 Стандартные типы данных

1.3.1 Базовые типы данных и их объем

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

В С++ определены пять базовых типов данных: символьные (char), целые (int), вещественный с плавающей точкой (float), вещественный с плавающей точкой двойной длины (double), а также пустой, не имеющий значения тип (void).

На основе перечисленных типов строятся все остальные. Простейшим приемом является использование модификаторов типа, которые ставятся перед соответствующим типом: знаковый (signed), беззнаковый (unsigned), длинный (long) и короткий (short). В таблице А3 приведены все возможные типы с различными комбинациями модификаторов с указанием диапазона изменения и занимаемого размера в байтах.

При многократном использовании в программе типов данных с различными комбинациями модификаторов, например, unsigned short int, легко сделать синтаксические ошибки, во избежание которых в С++ предусмотрена возможность создания псевдонима (синонима) с помощью ключевого слова typedef. Например, строка typedef unsigned short int USHORT; создает новый псевдоним USHORT, который может использоваться везде, где нужно было бы написать unsigned short int.

 

1.3.2 Переменные, константы, символы

Переменная – это имя, связанное с областью памяти, которая отведена для временного размещения хранимого значения и его последующего извлечения. Для длительного (постоянного) хранения значений переменных используются базы данных или файлы. В С++ все переменные должны быть объявлены до их использования. Объявление предполагает наличие имени переменной и указание ее типа. Однако следует иметь в виду, что нельзя создать переменную типа void. Основная форма объявления переменных имеет вид

тип <список_переменных>;

В этом объявлении: тип – один из существующих типов переменных; <список_переменных> может состоять из одной или нескольких переменных, разделенных запятыми. Например,

int x, e, z;

float radius;

long double integral;

Можно объявлять переменные и одновременно присваивать им значения, т.е. инициализировать их. Инициализацией называется присваивание переменным начальных значений. Например,

int min=15; float p1=1.35;

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

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

- локальные переменные разных функций могут иметь одинаковые имена;

- две локальные переменные в одном блоке не могут иметь одинаковые имена.

Данные в языках программирования могут представляться также в виде констант. Константы используются в тех случаях, когда программе запрещено изменять значение какой-либо переменной. Для определения константы традиционным способом используется #define, которая просто выполняет текстовую подстановку. Например,

#define StudentsOfGroup 15

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

Наиболее удобным способом определения констант является следующий:

const тип имя_константы = значение_константы;

Этот способ облегчает дальнейшее сопровождение программы и предотвращает появление ошибок. Так как определение константы  содержит тип, компилятор может проследить за ее применением только по назначению (в соответствии с объявленным типом). Например,

const int Diapazon=20;

Литеральные константы (литералы) – это значения, которые вводятся непосредственно в текст программы. Поскольку после компиляции нельзя изменить значения литералов, их также называют константами. Например, в выражении int MyAge=19; имя MyAge является переменной типа int, а число 19 – литеральной константой, которой нельзя присвоить никакого иного значения.

Символьная константа состоит из одного символа, заключенного в апострофы: ‘q’, ‘2’, ‘$’. Например,

const char month=’December’;

К символьным константам относятся специальные символы (в том числе управляющие, список приведен в таблице А1).

Строковые константы состоят из последовательности символов кода ASCII, заключенной в кавычки, оканчивающейся нуле­вым байтом. Конец символьной строки (нулевой байт) обозна­чается символом NULL ('\0').

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

enum имя_константы {список_значений_константы};

Значения константы в списке значений разделяются запятыми. Например,

enum COLOR {RED, BLUE, GREEN, WHITE, BLACK};

Каждому элементу перечисляемой константы соответствует определенное значение. По умолчанию первый элемент имеет значение 0, а каждый последующий - на единицу большее. Каждому элементу константы можно присвоить произвольное значение, тогда последующие инициализируются значением на единицу больше предыдущего. Например,

enum COLOR {RED=100, BLUE, GREEN=200, WHITE=300, BLACK};

В этом примере значение RED=100, BLUE=101, GREEN=200, WHITE=300, BLACK=301.

Существует механизм явного задания типов констант с помощью суффиксов. Для констант целого типа в качестве суффиксов могут использоваться буквы u, l, h, L,H, а для чисел с плавающей точкой – l, L, f, F. Например,

12h 34H                              -   short int

23L -273l                         -   long int

23.4f 67.7E-24F                  -   float

89uL 89Lu 89ul 89 LU       -   unsigned short

 

1.3.3 Выражения, операции, операторы

Выражение в языке С++ представляет собой некоторую допустимую комбинацию операций и операндов (констант, переменных или функций).  Перечень операций языка C++ при­веден в таблице А4. Все перечисленные операции выполняются традиционным способом, за исключением операции деления. Особенность операции деления заключается в том, что если оба операнда целого типа, то она даст целый результат, например, 3/2 даст 1. Для получения действительного результата необходимо иметь хотя бы один действительный операнд, например, 3/2.0 даст 1.5.

Для каждой операции языка определено количество операндов:

а) один операнд – унарная операция, изменяющая знак, например, унарный минус –х;

б) два операнда – бинарная операция, например, операция сложения х+у;

в) три операнда – операция условие ?:, она единственная.

Каждая операция может иметь только определенные типы операндов. Каждая бинарная операция имеет определенный порядок выполнения: слева направо или справа налево. Наконец, каждая операция имеет свой приоритет. Приоритет и порядок выполнения операций приводятся в таблице А4.

Часто в выражениях используются математические функции языка C++, которые находятся в библиотеке math, расположен­ной в каталоге INCLUDE. Чтобы воспользоваться эти­ми функциями в начало программы необходимо включить заголовочный файл #include <math.h>. Основные математические функции приводятся в таблице А5.

Все выражения являются операторами.

Операторы в языке C++ предназначены для описания дей­ствий. Любой оператор может быть помечен меткой. Операто­ры отделяются друг от друга точкой с запятой (;).

В любом месте программы, где может быть размещен один оператор, можно разместить составной оператор, называемый блоком. Блок содержит несколько операторов, которые выполняются как одно выражение, ограничивается фигурными скобками {}, но не заканчивается точкой с запятой (;).

Объявление переменной в программе означает всего лишь выделение места в памяти компьютера для ее размещения. Программа же должна позволять оперировать данными. В этом процессе наиболее важна операция присваивания, которая выглядит следующим образом: переменная = выражение. Операция присваивания заменяет значение операнда, расположенного слева от знака «=», значением, вычисляемым справа от него.  При этом могут выполняться неявные преобразования типа. Знак «=» в С++ - это знак присваивания, а не равенства.

В отличие от других языков, где присваивание – оператор по определению, в С++ существуют понятия «операция присваивания» и «оператор присваивания». Операция «превращается» в оператор, если в конце выражения поставить точку с запятой, например, ++x – это выражение, а ++х ; - это оператор. Оператор присваивания удобно использовать при инициализации переменных, например, j=k;. Кроме того, в C++ опера­ция присваивания может использоваться в выражениях, которые включают в себя операторы сравнения или логические операторы, например, if ((x=x+5)>0) cout<<"Вывод"; . В этом примере сначала переменная х увеличивается на 5, а затем ее значение сравнивается с нулем.

Еще одной особенностью использования операции присваивания в С++ является возможность многократного присваивания, которое выполняется справа налево. Например, для того, чтобы присвоить значение 2*k нескольким переменным, можно воспользоваться операцией: x=y=z=2*k.

В языке C++ имеются дополнительные операции присваивания +=, -=, *=, /= и %=. При этом величина, стоящая справа, добавляется (вычитается, умножается, делится или делится по модулю) к значению переменной, стоящей слева. Например, вместо оператора х=х+5; можно записать х+=5;. Причем, операция х+=5 выполняется быстрее, чем операция х=х+5.

Очень часто в программах к переменным добавляется (или вычитается) единица. В языке С++ увеличение значения на 1 называется инкрементом (++), а уменьшение на 1 - декрементом (--). Например, оператор с=с+1; эквивалентен оператору с++;, оператор с=с-1; эквивалентен оператору с--;.

Операторы инкремента и декремента существуют в двух вариантах: префиксном и постфиксном.

Префиксные операции увеличивают (или уменьшают) значение переменной на единицу, а затем используют это значение. Напри­мер, оператор х=++у; эквивалентен выполнению двух операторов у=у+1; х=у;. В этом примере сначала происходит увеличение на единицу значения переменной у, а затем присваивание этого значения пе­ременной х.

Постфиксные операции сначала используют значение перемен­ной, после чего увеличивают (или уменьшают) его. Например, оператор х=у--; эквивалентен выполнению двух операторов х=у; у=у-1;. В этом примере переменная х получает значение у, после чего значение у уменьшается на единицу.

1.3.4 Преобразование типов

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

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

б) выражения, не имеющие смысла (например, число с плавающей точкой в роли индекса), не пропускаются компилятором еще на этапе трансляции;

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

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

(имя типа) выражение;

Например, (int) i=2.5*3.2;

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

 

1.4 Задания к лабораторной работе

Изучить особенности использования среды Turbo С++ (или консольного приложения C++ Builder) и набрать в ней заготовку программы:

#include <math.h>

#include <math.h>

void main ()

{

// инициализация переменных

// вычисление выражения

cout<<”Result=”<<y;

// операция над результирующей переменной

cout<<”Result operation”<<y;

}

          1.4.1 Согласно варианту (таблица 1.1) записать арифметическое выражение, используя библиотеку стандартных математических функций.

1.4.2 Инициализировать все входные и объявить все выходные переменные, используя известные типы данных.

1.4.3 Разместить переменные и выражение в заготовке программы.

1.4.4 Выполнить с результирующей переменной операцию, указанную в варианте (таблица 1.1).

Таблица 1.1 – Варианты заданий

варианта

Арифметическое выражение

Входные переменные

Константы (const)

Операция

1

a, b

c

инкремент

2

x, z

a

декремент

3

x, z

a

*= const

4

a, b

c

-=const

5

x, z

a

+=const

6

a, b

x

/=const

7

x, z

a

декремент

8

x, z

b

декремент

9

a, b

x

*= const

10

a, b

x

-=const

11

x, z

a

+=const

12

x, z

b

/=const

13

x, z

b

инкремент

14

x, z

b

декремент

15

x, z

a

*= const

16

a, b

x

-=const

 

Окончание таблицы 1.1

17

x, z

b

+=const

18

a, b

x

/=const

19

a, b

x

инкремент

20

x, z

a

инкремент

21

x, z

a

*= const

22

x, z

a

-=const

23

a, b

x

+=const

24

a, b

c

/=const

25

a, b

x

инкремент

26

a, b

x

декремент

27

a, b

x

*= const

28

x, z

a

-=const

29

a, b

c

+=const

30

x, z

a

/=const

 

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

1.5.1 Какие особенности языка следует учитывать при идентификации переменных? Как инициализируется переменная?

1.5.2 Как подключаются необходимые библиотеки? Где они размещаются?

1.5.3 Какие типы комментариев существуют в С++ и в чем их разница?

1.5.4 В чем заключаются особенности функции main()?

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

1.5.6 Каковы особенности операции присваивания в С++?

1.5.7 Каковы преимущества использования ключевого слова const вместо директивы #define?

1.5.8 Что представляют собой перечислимые константы и как они объявляются?

1.5.9 Что представляют собой выражения и операции? Какие существуют типы операндов?

1.5.10 С какой целью выполняется преобразование типов и каких правил следует придерживаться при этом?

 

 

2 Лабораторная работа №2. Программирование алгоритмов линейной и разветвляющейся структуры

 

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

 

2.1 Линейные алгоритмы и операторы ввода-вывода

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

Редкая программа обходится без операций ввода-вывода. В языке С его авторами были реализованы две новаторские идеи: средства ввода-вывода были отделены от языка и вынесены в отдельную библиотеку stdio (стандартная библиотека ввода-вывода, входит в стандарты С/C++), а также была разработана и реализована концепция процесса ввода/вывода, независимого от устройств. Таким образом, С++ имеет большой набор функций, осуществляющих ввод-вывод данных различных типов.

Для реализации форматного ввода-вывода часто используются две функции, подключаемые с помощью заголовочного файла #include <stdio.h>: printf и scanf. Использование этих функций С++ унаследовал от своего «прародителя» языка С.

Функцию printf можно использовать для вывода любой комбинации символов, целых и вещественных чисел, строк, беззнаковых целых, длинных целых и беззнаковых длинных целых. Она описывается следующим образом:

printf (“управляющая_строка”, список_аргументов);

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

- обычные символы, выводимые на экран без изменений;

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

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

Спецификация преобразования начинается с символа % и заканчивается символом преобразования (таблица A6), между которыми могут записываться:

- знак «минус», указывающий на то, что выводимый текст выравнивается по левому краю, по умолчанию выравнивание происходит по правому краю;

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

- точка, являющаяся разделителем;

- строка цифр, задающая точность вывода;

- символ l, указывающий, что соответствующий аргумент имеет тип long.

Например,

printf ("\nВозраст Эрика - %d. Его доход $%.2f", age, income);

Предполагается, что целой переменной age (возраст) и вещественной переменной income (доход) присвоены какие-то значения. Последовательность символов \n переводит курсор на новую строку, поэтому последовательность символов «Возраст Эрика» будет выведена с начала новой строки. Символы %d являются символами преобразования формата (спецификацией) для переменной age. Затем следует литерная строка «Его доход $» и символы %.2f - спецификация для значения переменной income, а также указание формата для вывода только двух цифр после десятичной точки.

Функция ввода данных scanf описывается аналогично функции printf:

scanf (“управляющая_строка”, список_аргументов);

Аргументы функции scanf должны быть указателями на соответствующие значения (более подробно указатели будут рассмотрены позже), для чего перед именем переменной записывается символ &. Как и в функции printf,  управляющая строка содержит спецификации преобразования и  используется для установления количества и типов аргументов. В ней допустимо использование пробелов, символов табуляции и перехода на новую строку, которые игнорируются при вводе. В управляющей строке спецификации преобразования должны быть отделены теми же разделителями, что и при вводе с клавиатуры. Например, scanf (“%d %f %c”, &i, &a, &ch);

Пример 2.1 - Составить программу вычисления объема V и площади поверхности полого шара S по заданным внешнему R и внутреннему r радиусам, если известно, что S = 4p (R2-r2), V = 4/3p (R3-r3).

#include <stdio.h>                  //подключение заголовочных файлов

#include <math.h>

#define Pi 3.1415926              //определение символической константы Pi

void main ( )

{

double S, V;

float R, r;

printf (“Введите внешний и внутренний радиусы R и r:”);

scanf (“S=%g,V=%f\n”,S=4*Pi*(R*R-r*r),V=4/3*Pi*(pow(R,3)-pow(r,2)));

}

Программы на С/С++ не имеют дело ни с устройствами, ни с файлами - они работают с потоками. Ввод информации осуществляется из входного потока, вывод производится в выходной поток, которые связаны с устройством или с файлом. В C++ концепция независимого от устройств ввода/вывода получила дальнейшее развитие в виде объектно-ориентированной библиотеки ввода/вывода iostream, в которую входят объект cout для вывода данных на экран и объект cin, используемый для ввода информации.

Опе­ратор вывода cout выглядит следующим образом:

cout<<переменная1<<...<<переменнаяN;

Знак “<<” называется операцией вставки, которая вставляет символы в выходной поток. Для перевода курсора в начало следующей строки в операторе cout часто используется символ endl (конец строки), например, cout<<xl<<endl;. В операторе вывода можно использовать специальные сим­волы, которые должны быть заключены в одинарные кавычки, если они используются самостоятельно, например: соut<<'\а'<<"Звонок";. Если же специальные символы используются внутри двойных кавычек, то дополнительно заключать их в апострофы не нужно.

Например,

cout<<"Вывод\tx="<<x<<endl;

По умолчанию в C++ числа выводятся в десятичной системе счисления. Для вывода чисел в восьмеричной или шестнадцатеричной системе счисления внутри выходного потока нужно раз­местить модификаторы oct или hex. Чтобы вернуться к десятич­ной системе счисления, следует воспользоваться модификатором dec.

Например,

cout<<”8-cc:    <<oct<<x<<endl;

cout<<”16-cc:  “<<hex<<x<<endl;

cout<<”10-cc:  “<<dec<<x<,endl;

Для организации форматного вывода чисел с помощью оператора cout можно воспользоваться функциями, предоставляемыми библиотекой iomanip,  включив в программу заголовочный файл #include <iomanip.h>:

а) с помощью модификатора setw можно в явном виде указать число позиций, отводимых под число (ширину вывода), например,

cout<<"Число"<<setw (10)<<5<<endl;

В результате выполнения этого оператора на экран дисплея будет выведено:

Число          5

Тот же результат можно получить, воспользовавшись функцией cout.width:

cout<<"Число";

cout.width (10);

cout<<5<<endl;

б) функция cout.fill позволяет указать символ заполнения пустого пространства, который cout будет использовать вместо пробела при выводе данных с помощью модификатора setw или функции cout.width, например,

cout. fill ('.') ;

cout<<"Число"<<setw (10)<<5<<endl;

В результате выполнения этих операторов на экран дисплея будет выведено:

Число…..5

в) для управления форматом вывода чисел с плавающей точкой можно воспользоваться манипулятором setprecision, который определяет количество цифр после де­сятичной точки, например,

float   x=3.14159265359;

cout<<setprecision(5)<<x<<endl;

В результате выполнения этого оператора на экран будет выведено: 3.14159

г) для посимвольного вывода на экран исполь­зуется функция cout.put, например,

char с[ ]="Си++";

cout.put (c[0]);

cout.put (c[2]) ;

cout.put (c[3]);

Результатом выполнения блока будет: C++.

Оператор ввода cin имеет вид:

cin>>переменная1>>...>>переменнаяN;

Знак “>>” называется операцией извлечения (эта операция извлекает данные из входного потока, присваивая зна­чение указанной переменной). Значения вводимых переменных должны со­ответствовать типам переменных, указанным в операторах объяв­ления, а при вводе с клавиатуры отделяют­ся друг от друга хотя бы одним пробелом, например, 1.5 2.15 -1.1 25.

Значения символьных переменных и строк при вводе записываются во входном потоке без апост­рофов или кавычек. Для их ввода C++ предоставля­ет дополнительно две функции: cin.get и cin.getline. В случае, когда необходимо считывать по одному символу, следует воспользоваться функцией cin.get, например, cl=cin.get();. Тогда символьная переменная, объявленная char cl, получит значение символа, введенного с клавиатуры. Если же нужно ввести с клавиатуры целую строку, можно воспользоваться функцией cin.getline, указав имя символьной строки и ее длину (с учетом нулевого байта), например, cin.getline(c2,11);. В этом случае в символьную строку, объявленную char с2 [64], будет записано 10 символов, введенных с клавиатуры.

Пример 2.2 – Вычислить целую часть и остаток от деления чисел x и y.

#include <iostream.h>    //подключение заголовочных файлов

void main ( )

{

int x, y;                             /* переменные х и у объявлены как целочисленные,

т.к. остаток от деления даст операция %, применяемая исключительно к целым переменным, а целую часть можно получить, если учесть, что при обычном делении двух целых чисел остаток отбрасывается */

cout<<“Введите значения х и у:”<<endl;

cin>>x>>y;

cout<<’\n’<<”Целая часть от деления:”<<x/y<<endl;

cout<<’\n’<<”Остаток от деления:”<<x%y<<endl;

}

Для оформления внешнего вида программы можно воспользоваться функциями, которые описываются в заголовочном файле #include <conio.h>:

а) цвет фона текста устанавливается с помощью функции:

void textbackground (int bkcolor);

где bkcolor (цвет фона) – число от 0 до 7 или одна из констант (BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY);

б) цвет символов устанавливается с помощью функции:

void textcolor (int txcolor);

где txcolor (цвет текста) может быть числом от 0 до15, либо одной из констант (BLACK, …, LIGHTGRAY, DARKGRAY, LIHGTBLUE, …, LIGHTMAGENTA, YELLOW, WHITE);

в) для очистки экрана или текущего текстового окна используется функция:

void clrscr ();

 

2.2 Разветвляющиеся алгоритмы и операторы передачи управления

Для изменения естественной последовательности вы­полнения операторов (передачи управления) в C++ содержится ряд специальных конструкций, относящихся к конструкциям принятия решений и по своему смыслу совпадающих с аналогичными конструкциями алгоритмов.

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

Оператор безусловного перехода имеет вид:

goto  метка;

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

Оператор условного перехода предназна­чен для выбора одного из двух вариантов развития решения задачи в зависимости от значения некоторого проверяемого условия, и его полная форма имеет вид:

if (условие) оператор1; else оператор2;

В качестве условия используется некоторое произвольное выражение, задающее условие выбора выполняемого оператора; оператор1 и оператор2 могут быть как простыми, так и состав­ными. Если условие истинно (TRUE или любое ненулевое значение), то вы­полняется оператор1, если же условие ложно (FALSE или нуль), то выполня­ется оператор2. Например, if (x==3) b=1; else b=0;

Краткая форма оператора условного перехода имеет вид:

if (условие) оператор;

В этом случае, если условие истинно, то выполняется опера­тор, если же условие ложно, то управление передается следующему оператору программы. Например, if (x==3) b=1; х=у;

Чаще всего условие представляет собой логическое выражение, состоя­щее из операндов и знаков операций. В качестве операций в ло­гическом выражении, прежде всего, используются операции срав­нения (==, !=, <, >, <=, >=). Кроме операций сравнения, для по­строения логических выражений можно использовать логические операции (!, ||, &&). Значение логического выражения вычисляет­ся путем выполнения указанных в нем операций с учетом их при­оритета и расставленных круглых скобок, например,

(abs(x)<=2) - значение х по модулю не превышает 2;

((х>=1)&&(х<=2)) - точка принадлежит отрезку [1,2];

(х*х+у*у<1) - точка с координатами (х, у) принад­лежит единичному кругу с центром в начале координат.

Поскольку в C++ истина представляется как ненулевое значе­ние, а ложь как нуль, то возможно и другое использование оператора условного перехода:

х = значение;

if (x) оператор;

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

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

if (выражение1) оператор1;

      else if (выражение2) оператор2;

              else if (выражениеN) операторN;

else оператор_по_умолчанию;     // необязательная часть

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

Если в программе необходимо выбрать один из многочисленных вариантов, то вместо вложенной конструкции if целесообразнее применять оператор-переключатель switch, называемый оператором выбора или варианта, который имеет вид:

switch (выражение)

{

case n1 : оператор1; break;

case n2 : оператор2; break;

case nk : операторК; break;

default : операторN; break;

}

Выполнение оператора варианта начинается с вычисления значения выражения (селектора). Затем оператор выбора передает управле­ние тому оператору, перед которым стоит константа, совпадаю­щая с вычисленным значением переключателя switch. Если совпа­дений не обнаружено, выполняется оператор, стоящий после default. Например,

switch (i)

{

case l: x=0; break;

case 2: x=2*x; break;

case 100: x=sin (x); break;

default: x=cos(x); break;

}

z=x; …

В этом примере, если селектор i, предположим, принимает значение 100, то выполняется оператор x=sin(x), после чего управление передается оператору z=x.

Допускается конструкция switch, в которой оператор default может отсутствовать. Оператор break, расположенный в каждой ветви опера­тора варианта, предписывает завершить выполнение текущего оператора и передать управление следующему оператору про­граммы. Отсутствие оператора break предписывает программе продолжать выполнение до первого оператора break либо до конца оператора switch.

Альтернативой оператору условного перехода в С++ является троичный условный оператор ?: - единственный оператор, который работает с тремя операндами. Этот оператор получает три выражения и возвращает значение:

(выражение1) ? выражение2: выражение3;

Выполнение оператора начинается с вычисления выражения1. Если выражение истинно, то результатом будет являться значение выражения2, в противном случае результатом будет значение выражени3. Например,  оператор mах = (х>у) ? х: у; определяет наибольшее из двух чисел х и у.

 

 

 

2.3 Задания к лабораторной работе

2.3.1 Составить блок-схему и два варианта программы для вычисления заданной величины (с использованием библиотек stdio и iostream). Текст программы должен содержать все необходимые комментарии, а для создания наглядного и удобного пользовательского интерфейса следует использовать форматный ввод-вывод с комментариями.

В вариантах 1 – 18 вычислить:

1. Площадь параллелограмма.

2. Объем параллелепипеда.

3. Через сколько времени после начала движения нормальнее ускорение an точки будет вдвое больше тангенциального, если известно, что точка движется по окружности радиусом R с постоянным тангенциальным ускорением at?

4. Площадь треугольника, если известна длина основания и высоты.

5. Площадь треугольника, если известны длины двух его сторон и величина угла между этими сторонами.

6. Общее сопротивление электрической цепи, состоящей из двух последовательно соединенных сопротивлений.

7. Силу тока в электрической цепи по известным значениям напряжения и сопротивления.

8. Расстояние между населенными пунктами, изображенными на карте с учетом ее масштаба.

9. Действительные корни квадратного уравнения с заданными коэффициентами, с положительным дискриминантом.

10 Скорость, с которой бегун пробежал заданную дистанцию с учетом времени бега.

11. Объем пирамиды, заданных размеров.

12. Площадь поверхности шара.

13. Стороны равнобедренного прямоугольного треугольника, если известно значение высоты h, опущенной на гипотенузу.

14. Высоту равностороннего треугольника  с заданными сторонами.

15. Сумму цифр числа  n.

16. Сопротивление электрической цепи, состоящей из двух параллельно соединенных сопротивлений.

17. Произведение цифр числа  k.

18. Среднюю скорость автомобиля, который одну часть пути движется со скоростью v1, а другую – со скоростью v2.

В вариантах 19 – 30 выполнить перевод:

19. Заданной величины угла из радианной меры в градусную.

20. Скорости ветра из «метров в секунду» в «километры в час».

21. Температуры в градусах Кельвина в градусы Фаренгейта и Цельсия.

22. Заданного расстояния (в метрах) в русские неметрические единицы длины: версты и сажени.

23. Заданной величины в метрические единицы с префиксами фемто, нано, микро, гекто.

24. Величины временного интервала, заданного в минутах, в величину, выраженную в часах и минутах.

25. Заданного веса (в кг) в следующие единицы: фунты и унции.

26. Заданного расстояния (в км) в следующие единицы длины: мили и ярды.

27. Мощности (в Вт) в величины, выраженные в лошадиных силах и эрг/сек.

28. Заданной величины работы (в Дж) в величины, выраженные в  килокалориях и Вт*ч.

29. Заданного давления (в мм ртутного столба) в величины, выраженные в физических атмосферах (атм.) и мм водяного столба 

30. Площади (в кв.м.) в русские неметрические единицы: в ары и гектары.

 

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

В вариантах 1 – 18 определить:

1. Частное двух произвольных чисел; если делитель равен нулю, сообщить об ошибке.

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

3. Скорость движения автомобиля v, преодолевающего расстояние S за время t, с учетом возможности равномерного или равнопеременного движения.

4. Стоимость разговора по телефону с учетом 20% скидки, предоставляемой по субботам и воскресеньям; длительность разговора и день недели вводится пользователем.

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

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

7. Сумму чисел из произвольной последовательности, введенной пользователем, равных по модулю заданному числу А.

8. Стоимость междугородного телефонного разговора; исходными данными для программы являются код города и длительность разговора, дополнительными сведениями для вывода - название города и тариф.

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

10. Среднюю скорость автомобиля, который часть времени движения едет со скоростью v1, а другую – со скоростью v2. При каком условии средняя скорость не превышает значения v2?

11. Размер стипендии, которая назначается студенту, с учетом его результатов после сдачи 5 экзаменов: при суммарном балле 25-32 назначается стипендия в размере k тенге, 33-39 баллов – добавляется 25%, 40-45 баллов – добавляется 50%. На экран необходимо вывести результаты каждого экзамена и суммарный балл студента с сообщением о размере стипендии.

12. Тип треугольника (равносторонний, равнобедренный или разносторонний), если известны длины его сторон: a, b и c.

13. Расстояние S, которое преодолеет поезд, движущийся со скоростью v за время t, с учетом возможности равномерного или равнопеременного движения.

14. Размер оплаты при договорной форме обучения студента за интересующий пользователя период T с учетом скидок, предоставляемых за отличную успеваемость (30%), малоимущим (25%), сиротам (50%).

15. Наименьшее из четырех введенных пользователем чисел.

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

17. Стоимость проезда студента с учетом предоставляемых сезонных льгот на разных видах транспорта.

18. Наибольшее из четырех, введенных с клавиатуры чисел.

19. Доход, который может получить вкладчик банка, разместив свои средства на депозите (s%) с капитализацией процентов на срок T.

В вариантах 19 – 30 проверить:

19. Является ли треугольник тупоугольным, прямоугольным или остроугольным, если заданы длины его сторон, используя теорему косинусов?

20. Могут ли быть введенные числа a, b и c сторонами треугольника, если условия его существования: a<=b+c; b<=a+c; c<=a+b?

21. Можно ли коробку размером a x b x c упаковать в посылку размером r x s x t? «Углом» укладывать нельзя.

22. Число, введенное пользователем, на кратность девяти.

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

24. Число, введенное пользователем, на четность и отрицательность.

25. Является ли введенное число N совершенным, т.е. равным сумме всех своих простых делителей (например, 6=1+2+3)?

26. Число N на кратность четность и кратность 5.

27. Является ли число А, введенное пользователем, одновременно положительным и кратным двойке?

28. Пройдет ли кирпич со сторонами a, b и c сквозь прямоугольное отверстие со сторонами r и s?

29. Число, введенное пользователем, на кратность трем.

30. Можно ли на прямоугольном участке застройки размером a на b метров разместить, параллельно его сторонам, два дома размерами p на q и r на s метров?

 

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

2.4.1 Какие операторы используются в С++ для ввода-вывода данных?

2.4.2 Что представляют собой операции извлечения и вставки?

2.4.3 Как организуются форматный и бесформатный вывод в С++?

2.4.4 Какие функции используются для оформления программы?

2.4.5 Какие конструкции относятся к конструкциям принятия решений?

2.4.6 Подумайте, отрицательные числа – это значения TRUE или  FALSE?

2.4.7 Как строится условное выражение?

2.4.8 С какой целью в операторе выбора используется оператор break?

2.4.9 Почему следует избегать оператора goto в программах?

2.4.10 Что представляет собой троичный условный оператор?

 

 

3 Лабораторная работа №3. Программирование алгоритмов циклической структуры

 

Цель работы – ознакомление с особенностями программирования алгоритмов циклической структуры.

 

3.1 Алгоритмы циклической структуры. Операторы цикла

Алгоритм, в котором предусмотрено многократное выполнение одной и той же последовательности действий, называется алгоритмом циклической структуры, а эта последовательность – циклом. Циклический алгоритм позволяет существенно сократить объем программы. В С++ используются операторы циклов трех видов: с предварительным условием, с последующим условием и с параметром.

Оператор цикла с предварительным условиемпредусловием) относится к базовым конструкциям, выполняет повторяющиеся действия до тех пор, пока заданное условие истинно, и имеет вид:

while (условие)               или                 while (условие)

{                                                              оператор;

оператор1;

оператор2;

операторN;

}

где условие представляет собой  любое простое или сложное выражение языка С++; оператор – любой допустимый оператор или блок операторов (тело цикла).

Цикл выполняется до тех пор, пока условие принимает значение TRUE. При ложном значении (FALSE) цикл завершается, и программа передает управление следующему оператору программы.

Пример 3.1 – Выводить на экран значения переменной counter до тех пор, пока они не превысят 11.

#include <iostream.h>

void main()

{ int counter;

cout <<”Вывод чисел от 1 до 10”<<endl;

counter=1;                              // начальное значение переменной равно 1

while (counter<=10)                   // пока значение counter не превышает 11

{                                            // начало тела цикла

    cout<<counter<<endl;      // выводить на экран его значение

    counter++;                        // увеличить значение counter на 1

}                                            // конец тела цикла

}                                      

Так как проверяемым условием в цикле while может быть любое допустимое выражение С++, то, в принципе, возможно использование и выражения true. Однако в этом случае цикл не завершится никогда, став бесконечным, что приведет к зависанию компьютера. Бесконечные циклы следует использовать очень осторожно и тщательно проверять. Если анализируемое условие с самого начала ложно, ни один из операторов, образующих тело цикла, не будет выполнен ни одного раза, т.е. цикл будет полностью пропущен.

Если необходимо гарантировать выполнение операторов цикла хотя бы один раз, следует воспользоваться оператором цикла с последующим условиемпостусловием), синтаксис которого имеет вид:

do                                    или                 do {

{ оператор;}                                            оператор1;

while (условие);                                        оператор2;

                                                                   операторN;

                                                               } while (условие);

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

Пример 3.2 – Вывести на экран значение переменной с, изменяющейся от ‘A’ до ‘Z’:

#include <iostream.h>

void main()

{ int c;

cout <<”Алфавит”<<endl;

c=’A’;                                      // начальное значение c инициализируется

                                                // с величиной A

do {                                          // начало тела цикла                                       

    cout<<c<<endl;                // выводить на экран значение c

    c++;                                   // увеличить значение c на 1

} while (c<’Z’);                        // условие продолжения цикла, конец цикла

}                       

Тело цикла с постусловием, как и в случае с while, обязательно должно содержать действия, влияющие на результат выполнения выражения, которое является условием входа/выхода из цикла, иначе цикл станет бесконечным, например,

counter=1;                             

do                                           

{                                            // начало тела цикла

    cout<<counter<<endl;     

// counter++;                         // при отключении оператора инкремента

                                              // влияющего на условие выхода из цикла

// программа «зациклится»

}  while (counter<=10)        // конец тела цикла

И, наконец, последний используемый в С++ оператор цикла – оператор цикла с параметром имеет вид:

for (инициализация; проверка; приращение)

оператор;

Оператор инициализация устанавливает начальное значение счетчика. Оператор проверка – это любое выражение С++, результат которого проверяется на каждой итерации: если результат TRUE, то выполняется тело цикла. После изменения счетчика на величину приращения (по умолчанию увеличение на 1), действия повторяются. Все эти выражения не являются обязательными.

Инициализирующее выражение, если оно есть, будет выполняться  всегда. Вычисление конечного выражения (проверка) может не производиться, если условие ложно с самого начала. Приращение, как правило, определяет закон изменения параметра цикла, но и это необязательно. Более того, цикл for в С++ не является классическим циклом с параметром: параметр цикла может быть вещественным значением. Можно сделать так, чтобы значение параметра цикла возрастало, например, в геометрической прогрессии:

for (d=1; d<15; d=d*5)

cout<<d; 

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

a=1;

for (n=2; a<15;)

a=a*n;  

Тело цикла  

  for ( ; ; )

cout<<”Бесконечный цикл”<<endl;

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

Пример 3.3 – Вывести на экран все значения y.

#include <iostream.h>

void main()

{ int k, y;

for (k=1;k<=10;k++)

  {                                            // начало тела цикла 

y=y*k;                              

    cout<<y<<endl;                // выводить на экран значение y

}                                            // конец тела цикла

}

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

Пример 3.4 – Вывести на экран все числа, кратные 5, от 1 до 100.

#include <iostream.h>

void main()

{ int k;

for (k=1;k<=100;k++)

  {                                            // начало тела цикла

      if (k %5) continue;               // если k не кратно 5, то следует

// перейти к началу цикла for             

    cout<<k<<endl;                // выводить на экран значение k кратные 5

}                                            // конец тела цикла

}

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

Пример 3.5 – Вывести на экран значения y, не превышающие 60.

#include <iostream.h>

void main()

{ int k, y;

for (k=1;k<=10;k++)

  {                                            // начало тела цикла 

if (y*y-5>60) break;         // выйти из цикла   for, если y>60

    cout<<y*y-5<<endl;         // выводить на экран значение y

}                                            // конец тела цикла

}

И continue, и break следует использовать очень осторожно, т.к. их свободное применение способно запутать даже простой цикл while и сделать его нечитабельным. Это наиболее опасные команды после goto.

 

3.2 Задания к лабораторной работе

В вариантах 1 – 14 вычислить:

1. Через сколько лет арендатором накопится сумма S, достаточная для покупки собственного помещения, если его стартовый капитал – k тенге, ежемесячный доход – n%, аренда помещения – m тенге.

2. Факториал числа, введенного с клавиатуры.

3. Среднее арифметическое последовательности дробных чисел,  вводимой с клавиатуры; количество чисел должно задаваться пользователем.

4. Высоту поднятия жидкости в капиллярной трубке, если заданы радиус трубки r, плотность жидкости ρ, коэффициент поверхностного натяжения α, а краевой угол θ изменяется от 0 до π.

5. Число π с заданной пользователем точностью, для чего воспользоваться числовым рядом , значение частичной суммы которого при суммировании достаточно большого количества членов приближается к значению π/4.

6. Наибольший общий делитель двух целых чисел.

7. Все смещения точки, совершающей гармонические колебания с заданной амплитудой А, периодом колебаний Т и начальной фазой φ, от положения равновесия при изменении t от 0 до 10 сек с шагом 0,5 сек.

8. Момент времени t, в который будет достигнуто максимальное ускорение точки, если уравнение движения точки дано в виде: .

9. Максимальное значение среди сгенерированной последовательности из k случайных чисел в диапазоне от 0 до 50, вывести эти числа на экран.

10. Сопротивление проводника, если известны (задаются пользователем): удельное сопротивление ρ, площадь поперечного сечения S, а длина проводника L изменяется от 1 до 20 см.

11. Момент времени t, в который будет достигнута максимальная скорость точки, если уравнение движения точки дано в виде: .

12. Минимальное значение среди сгенерированной последовательности из k случайных чисел в диапазоне от 0 до 100, вывести эти числа на экран.

13. Все смещения точки при распространении незатухающих колебаний заданной амплитудой А, периодом колебаний Т и скоростью распространения с, отстоящей от источника колебаний на расстоянии L при изменении t от 0 до 10 сек с шагом 0,5 сек.

14. Среднее геометрическое среди сгенерированной последовательности из 10 случайных чисел в диапазоне от 1 до 10, вывести эти числа на экран.

В вариантах 15 – 20 вывести на экран:

15. Таблицу степеней (от нулевой до k-ой) числа Z; количество степеней k задается пользователем.

16. Таймер, который по истечении заданного промежутка времени t, величина которого вводится с клавиатуры, выдает звуковой сигнал.

17. Таблицу умножения на число n, задаваемое пользователем.

18. Изображение шахматной доски: черные клетки отображать «звездочкой», белые - пробелом.

19. Работающие «электронные часы», которые функционируют до нажатия любой клавиши.

20. Таблицу квадратов m первых целых положительных чисел.

В вариантах 21 – 23 проверить:

21. Знание пользователем таблицы умножения: вывести k примеров и выставить оценку (90-100% правильных ответов - «отлично», 75-89% - «хорошо», за 55-74% - «удовлетворительно», менее 55% - «плохо»).

22. Являются ли k целых чисел, введенных пользователем, простыми?

23. Является ли функция периодической, если аргумент х изменяется в интервале [0;5T], а период Т=2π?

24. Предложить пользователю угадать сгенерированное компьютером целое число в диапазоне от 1 до 10 за 5 попыток.

В вариантах 25 - 30 численно убедиться в справедливости равенства, для чего для заданного пользователем значения аргумента х вычислить левую его часть и разложение, стоящее в правой части с заданной погрешностью:

25. .

26.

27.

28.

29.

30.

 

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

3.3.1 Какие операторы цикла предусмотрены в С++?

3.3.2 В чем разница между циклами while и do-while?

3.3.3 Как с помощью цикла while можно смоделировать другие циклы?

3.3.4 Какой цикл называется открытым?

3.3.5 Как можно организовать бесконечный цикл?

3.3.6 В чем отличие цикла for в С++ от подобных циклов в других языках?

3.3.7 Можно ли организовать цикл while внутри цикла for?

3.3.8 Каким способом можно прервать выполнение цикла?

3.3.9 Каких рекомендаций следует придерживаться при выборе цикла?

3.3.10 В чем заключается разница между циклами while (true) и for ( ; ; )?


Приложение А

Основные элементы языка С++

 

Таблица А1 - Специальные и управляющие символы

 

Вид

Название

Вид

Название

Специальные символы

+

Плюс

|

Черта

++

Приращение

||

Логическое ИЛИ

-

Минус

!

Восклицательный знак

--

Уменьшение

->

Стрелка

*

Звездочка

=

Операция присваивания

/

Наклонная черта

= =

Знак равенства

\

Обратный слеш

!=

Не равно

//

Двойной слеш

> 

Больше

.

Точка

< 

Меньше

,

Запятая

<=

Меньше или равно

:

Двоеточие

<< 

Сдвиг влево

::

Разрешение

>> 

Сдвиг вправо

;

Точка с запятой

< >

Угловые скобки

Апостроф

( )

Круглые скобки

Кавычки

[ ]

Квадратные скобки

^

«Крышка»

{ }

Фигурные скобки

%

Знак процента

/* */

Скобки комментария

&

Амперсанд

#

Знак номера

&&

Логическое И

~

Тильда

Управляющие символы

\a

Сигнал динамика

\t

Горизонтальная табуляция

\b

BS, забой символа

\v

Вертикальная табуляция

\f

Новая страница

\\

Обратная косая черта

\n

Новая строка

\0

Нулевой символ (байт)

\r

Возврат каретки

\000

Восьмеричная константа

\”

Двойная кавычка

\xhhh

Шестнадцатеричная константа

\’

Апостроф

\?

Знак вопроса

 

Таблица А2 - Зарезервированные слова в C++

and

char

false

int

private

switch

virtual

and_eq

class

float

long

protected

template

void

asm

compl

for

mutable

public

this

volatile

auto

const

else

namespace

register

throw

while

bitand

continue

enum

new

return

true

xor

bitor

default

explicit

not

short

try

xor_eq

bool

delete

friend

not_eq

signed

typedef

 

break

do

goto

operator

sizeof

typename

 

case

double

if

or

static

union

 

catch

extern

inline

or_eq

struct

unsigned

 

Таблица А3 – Типы данных с разными комбинациями модификаторов

Тип

Диапазон изменения

Размер в байтах (битах)

от

до

void

-

-

0

char (signed char)

-128

127

1 (8)

unsigned char

0

255

1 (8)

wchar_t

0

65535

2 (16)

bool

True (Истина)

False (Ложь)

1 (8)

int (signed int, short int, signed short int)

-32768

32767

2 (16)

unsigned int (unsigned short int)

0

65535

2 (16)

long int (signed long int)

-2147483648

2147483647

4 (32)

unsigned long int

0

4294967295

4 (32)

float

3.4E-38

3.4E+38

4 (32)

double

1.7E-308

1.7E+308

8 (64)

long double

3.4E-4932

3.4E+4932

10 (80)

Примечание – Размер в байтах и диапазон изменения могут варьироваться в зависимости от компилятора, процессора и операционной системы (среды).

 

Таблица А4 – Перечень операций С++, их приоритет и порядок выполнения

Уровень

Оператор

Порядок

Уровень

Оператор

Порядок

1

( ) . [ ] -> ::

Þ

9

&

Þ

2

* & ! ~ ++ -- + - sizeof new delete

Ü

10

^

Þ

3

. * -> *

Þ

11

|

Þ

4

* / %

Þ

12

&&

Þ

5

+ -

Þ

13

| |

Þ

6

<< >>

Þ

14

?:

Ü

7

< <= > >=

Þ

15

= *= /= += -= %= <<= >>= &=  ^=  |=

Ü

8

== !=

Þ

16

,

Þ

Примечания

1 Наивысший приоритет имеют операторы 1 уровня, низший – 16 уровня.

2 Знак Þ обозначает выполнение операций слева направо, а знак Ü - выполнение операций справа налево.

3 Унарные операторы (+) и (-), находящиеся на уровне 2, обладают более высоким приоритетом, чем арифметические (+) и (-) с уровня 5. Символ & на уровне 2 - оператор обращения по адресу, а символ & на уровне 9 битовый оператор AND. Символ * на уровне 2 - оператор обращения к указателю, а символ * на уровне 4 – оператор умножения.

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

Таблица А5 – Основные математические функции

Наименование функции

Функция

Тип

Заголовочный файл

результата

аргумента

Абсолютное значение

abs(x)

cabs(x)

fabs(x)

int

double

float

int

double

float

<stdlib.h>

<math.h>

<math.h>

Арккосинус

acos(x)

double

double

<math.h>

Арксинус

asin(x)

double

double

<math.h>

Арктангенс

atan(x)

double

double

<math.h>

Косинус

cos(x)

double

double

<math.h>

Синус

sin(x)

double

double

<math.h>

Экспонента ex

exp(x)

double

double

<math.h>

Степенная функция xy

pow(x,y)

double

double

<math.h>

Логарифм натуральный

log(x)

double

double

<math.h>

Логарифм десятичный

log10(x)

double

double

<math.h>

Корень квадратный

sqrt(x)

double

double

<math.h>

Тангенс

tan(x)

double

double

<math.h>

 

Таблица А6 – Символы преобразования в функциях ввода-вывода

Формат

вывода

Значение

Формат ввода

Значение

%c

вывод символа (char)

%c

чтение символа (char)

%d

целое десятичное число (int)

%d

целое десятичное число (int)

%i

целое десятичное число (int)

%i

целое десятичное число (int)

%e (%E)

число (float/double) в виде

х.хх е+хх  (х.хх Е+хх )

%e

чтение числа типа float/double

%f (%F)

число float/double с фиксиро-ванной запятой хх.хххх

%h

чтение числа типа short int

%g (%G)

число  в виде f (F) или е(E) в зависимости от значения

%o

чтение восьмеричного числа

%s

строка символов

%s

чтение строки символов

%o

целое число (int) в восьмеричном представлении

%x

чтение шестнадцатеричного числа (int)

%u

беззнаковое десятичное число (unsigned int)

%p

чтение указателя

%x (%X)

целое число (int) в шестнад-цатеричном представлении

%n

чтение указателя в увеличенном формате

%p (%n)

указатель

 

 

Примечание – К форматам можно применять модификаторы l и h, например,  %ld (long в десятичном виде), %lo (long в восьмеричном виде), %lu (unsigned long), %lx (long в шестнадцатеричном виде), %lf (long float c фиксированной точкой), %le (long float в экспоненциальной форме), %lg (long float в виде f или е в зависимости от значения).


Список литературы

 

1. ГОСТ 19.701-90. ЕСПД. Схемы алгоритмов и программ. Обозначения условные, графические. – М.: Издательство стандартов,1990.

2  . Ю.Аляев, О.Козлов. Алгоритмизация и языки программирования Pascal, C++, Visual Basic: Учебно-справочное пособие. – М.: Финансы и статистика, 2004.

3. Дж.Либерти. Освой самостоятельно С++ за 21 день. – М.: Издательский дом «Вильямс», 2001.

4. И.В.Ашарина. Основы программирования на языках С и С++. – М.: Горячая линия-Телеком, 2002.

5.    Б.И,Березин, С.Б.Березин. Начальный курс С и С++. – М.: ДИАЛОГ-МИФИ, 1999.

6.    А.Б.Крупник. Самоучитель С++. – СПб.: Питер, 2005.

7.    Дж.Бентли. Жемчужины программирования. - СПб.: Питер, 2003.

8.    А.Л.Марченко. С++. Бархатный путь. - М.: Горячая линия-Телеком, 2002.

9.    А.Я.Архангельский. C++ Builder 6. Справочное пособие. Книга 1. Язык С++. – М.: Бином-Пресс, 2002.

10.    Культин Н.Б. Самоучитель С++Builder. – СПб.: БХВ-Петербург, 2004.

 

 

Содержание

 

Введение......................................................................................................... 3

1 Лабораторная работа №1. Основные понятия языка. Стандартные типы

данных. Оператор присваивания................................................................... 4

2 Лабораторная работа №2. Программирование алгоритмов линейной

и разветвляющейся структуры ...................................................................... 15

3     Лабораторная работа №3. Программирование алгоритмов

циклической структуры................................................................................. 25

Приложение А................................................................................................ 32

Список литературы........................................................................................ 35

 

 

 

 

 

 

 

 

 

 

 

 

 

Сводный план 2006 г., поз. 20

 

 

 

Лида Куандыковна Ибраева

Наталья Валерьевна Сябина

 

 

 

 

 

 

 

 

 

 

ИНФОРМАТИКА. Основы С++

Часть 5

Методические указания к выполнению лабораторных работ

 (для студентов всех специальностей)

 

 

 

 

 

 

 

Редактор    Сластихина Л.Т.

 

 

 

 

 

 

Подписано в печать __. __. __.                                     Формат 60х84  1/ 16

Тираж  600 экз.                                                            Бумага типографская №1

Объем 2,3 уч.-изд. л.                                                   Заказ _____. Цена 126 тг.

 

 

 

 

Копировально-множительное бюро

 Алматинского института энергетики и связи

050013, Алматы, Байтурсынова, 126

наверх назад