КулЛиб - Классная библиотека! Скачать книги бесплатно
Всего книг - 716135 томов
Объем библиотеки - 1422 Гб.
Всего авторов - 275431
Пользователей - 125272

Новое на форуме

Новое в блогах

Впечатления

Lena Stol про Небокрад: Костоправ. Книга 1 (Героическая фантастика)

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

Рейтинг: 0 ( 0 за, 0 против).
Lena Stol про Батаев: Проклятьем заклейменный (Героическая фантастика)

Бросила читать практически в самом начале - неинтересно.

Рейтинг: 0 ( 0 за, 0 против).
Masterion про Харников: Вечерний Чарльстон (Альтернативная история)

До Михайловского не дотягивает. Тема интересная, но язык тяжеловат.

2 Potapych
Хрюкнула свинья, из недостраны, с искусственным языком, самым большим достижением которой - самый большой трезубец из сала. А чем ты можешь похвастаться, ну кроме участия в ВОВ на стороне Гитлера, расстрела евреев в Бабьем Яру и Волыньской резни?.

Рейтинг: 0 ( 1 за, 1 против).
Lena Stol про Чернов: Стиратель (Попаданцы)

Хорошее фэнтези, прочитала быстро и с интересом.

Рейтинг: 0 ( 0 за, 0 против).
Влад и мир про серию История Московских Кланов

Прочитал первую книгу и часть второй. Скукота, для меня ничего интересно. 90% текста - разбор интриг, написанных по детски. ГГ практически ничему не учится и непонятно, что хочет, так как вовсе не человек, а высший демон, всё что надо достаёт по "щучьему велению". Я лично вообще не понимаю, зачем высшему демону нужны люди и зачем им открывать свои тайны. Живётся ему лучше в нечеловеческом мире. С этой точки зрения весь сюжет - туповат от

  подробнее ...

Рейтинг: 0 ( 0 за, 0 против).

Решение задач на языках программирования Си и Си++ [Александр Юрьевич Быков] (pdf) читать онлайн

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


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

Московский государственный технический университет
имени Н . Э. Баумана

А.Ю. Быков

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

Сии Си++

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

Москва
ИЗДАТЕЛЬСТВО
МГТУ им. Н. Э . баумана

2

О

17

УДКОО4.43
ББК

32.973-018.1
Б95
Издание доступно в электронном виде на портале

по адресу:

ebooks.bmstu.ru

http://ebooks.bmstu.ru/cata1og/117jЬook1572.html

Факультет
Кафедра >» - поразрядный сдвиг вправо;
«< 3") ;

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

2 на

печать

будет выводиться:

а

== 2
== 3

а

> 3

а

Управление передается на метку

case 2 : ,

и далее вьmолняются

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

ет принцип выбора несколько из нескольких. Чаще всего требуется
реализовать принцип выбора один из нескольких. Для этого в пере-

20

ключателе необходимо исполъзовать оператор

break;

-

оператор

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

int

а;

printf ( "а = ") ;
switch ( а)

&а )

scanf_ s ( " %d",

;

{

1 ") ; break;
case 1 : printf (" \n а 2 ,,) ; break;
2
:
p
r
intf
("
\n
case
а
З ") ; break;
case 3 : printf(" \n а default :
print f (" \n а > З ") ;

При вводе с клавиатуры значения
а

==

2,

2

будет выводиться значение

затем осуществляется выход из переключателя оператором

break;
Некоторые функции ввода-вывода
Функции для вывода в поток

stdout

Ниже представлены сокращенные заголовки некоторых функций
для вывода в стандартный поток

stdout, связанный с экраном монито­

ра (консольным окном) .
Вывод (печать) символа:

i nt

putchar (i n t

с) ;

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

putchar ( 'А' ) ;
Вывод (печать) строки:

int puts (con st char
где

s-

*

s);

указатель на строку, строка заканчивается символом с кодом О,

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

-

«\n»

(переход на

код последнего символа

21

«\n»

или значение

EOF

в случае ошибки.

EOF (End Of File) -

станта, объявленная в заголовочном файле

stdi o . h ,

кон ­

ее значение

-1.

Пример вызова:

p uts ("Hello world") ;
Вывод данных в соответствии с заданным форматом

(форматиро­

ваю1ый вывод):

int pri ntf (con st c h ar *f ormat,

... ) ;

Эта функция с переменным количеством параметров, параметр
- указатель на строку, данная строка выводится на консоль без

f orma t

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

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

преобразования заменяется параметром в заданном им формате. Воз­
вращаемое значение

-

количество выведенных (напечатанных) сим­

волов.

Шаблон преобразования в строке всегда начинается с символа

«%».

Формат шаблона преобразования:

%[flags ] [width] [ . prec] [h : l : L]type
flags
«- » -

может быть одним из символов:
надпись выравнивается по левому краю (по умолчанию, по

правому) ;

«+» -

числу должен предшествовать знак (перед положительным

числом ставится знак

«#» width -

«+»);

случай будет рассмотрен ниже , после разбора поля type;
целая константа, задает минималъную ширину поля выво­

да в символах;

prec -

целая константа , задает максимальное количество выводи ­

мых символов или цифр после точки при выводе вещественных чисел;

h :1 : L -

префиксы, используемые для работы с целыми или веще­

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

long

22

( douЬle ) ;

short,

t уре значения

«d»,

определяет тип аргумента и формат его вывода; возможные

-

это символы:

«i» -

тип

int,

вывод целого числа в десятичной системе

счисления;

«о»

-

тип

int,

вывод целого числа в восьмеричной системе счис­

ления (без О впереди);
«х», «Х»

тип

-

int,

вывод целого числа в шестнадцатеричной си­

стеме счисления (без Ох или ох впереди) с применением соответствен­

но цифр aЬcdef и AВCDEF;

«u» -

тип

unsigned int, вывод целого числа

без знака в десятич­

ной системе счисления;

«с»

-

тип

int

(к нему приводится тип

char),

вывод отдельного

символа, символ задается своим кодом;

«s» -

тип

char

*, вывод символов строки, строка должна закан­

чиваться символом с кодом О;

«f» -

тип

«е», «Е»

douЬle, вывод вещественного в форме с точкой;
тип douЬle, вывод вещественного в форме со знаком

-

экспоненты (печатается символе или Е);

«g», «G» - тип douЫe, использует более короткий из форматов
%е/ %Е ИЛИ %f;
«р» - тип void *, печать значения указателя;
« %» - преобразование аргументов не вьmолняется, печатается
символ « %» .
Рассмотрим назначение в качестве флага символа «#». Данный
символ используется с некоторыми типами аргументов. Поставленный
перед кодами

g, G, f, е и Е, он гарантирует наличие десятичной точки

даже в случае отсутствия десятичных цифр после точки. Если поставить
символ

«#»

перед кодами формата х и Х, шестнадцатеричное число

будет выведено с префиксом Ох или ОХ. Если же его поставить перед
форматом «о», восьмеричное число будет выведено с префиксом О.
Следует отметить, что существует более современная и безопасная
функция форматированного вьmода
головок, что и

printf.

заключается в том, что

printf _ s,

она имеет такой же за­

Основное различие между

printf_ s

printf_s

и

printf

проверяет строку форматирования на

наличие допустимых символов форматирования, тогда как

printf

только проверяет, не является ли строка формата указателем со значе­
нием

NULL.

Примеры использования функции:

#include
#i ncl ude

23

void main ()
{
douЬle x=l0 . 55 ,
у=- 12.333;
int al=lO , а2=20 ;
char Str [] ="Hello world" ;
char Ch=' А';
printf ("x=%fy=%fa1=%da2=%d" , х, у , al, а2);
/ / Печать x=lO. 550000у=12 . 333000а1=10а2=20
printf ("\nx=%8 . 2fy=%- 8. 2fa1=%+4da2=%3d", х, у, al , а2);
// Печать x=lO.SSy=-12.33
al= +10а2= 20
printf ("\n%s %с %%\n", Str, Ch) ; /* Печатается Hello
world А % */
system("pause") ; /* Остановка программы до нажатия любой

клавиши

*/

Функции для считьmания из потока

stdin

Рассмотрим некоторые функции для считывания из стандартного
потока

stdin,

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

функции останавЛJ1вают вьmолнение программы и ждут ввода с кла­

виатуры, после ввода данных требуется нажать клавишу

«Enter».

Чтение символа:

int getchar () ;
Функция возвращает код символа. Пример вызова:

char Ch;
Ch=getchar() ;
Чтение строки символов:

char
где

s -

* gets (char * s);
указатель на массив, куда записывается строка; строка чита­

ется, пока во входном потоке не появится символ
нажата клавиша

),

кодом О, возвращаемое значение
ошибки. Пример вызова:

24

«\n» (на клавиатуре

при этом в строку записывается символ с

-

адрес строки ИЛJ1

NULL

в случае

char Str [ 64] ;
printf ("Введите

строку

gets (Str);

символов:");

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

Microsoft Visual

gets

С++

2013

вы­

(более ранние компиляторы

выдавали предупреждение), сообщается, что функция

gets

является

небезопасной и устаревшей, и предлагается воспользоваться другой

функцией

- gets_ s .

Эту ошибку можно игнорировать, если в окне свойств проекта от­
ключить проверку безопасности (рис.
Функция

gets_ s

1.1).

за счет механизма шаблона функций, который

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

Следующий фрагмент программы демонстрирует особенности при­
менения

gets_ s

char Strl [ 32] ;
printf ("Strokal: ");
gets_s (Strl); /* Здесь
массива

определен

такая

статически

форма

то

требуется

указать

размер

*/

char *Str2 = (char *)malloc (32);
printf ("Stroka2: ");
gets_s (Str2 , 31); /* Так как память
ски,

разрешена ,

вь:щелена

максимальную длину

динамиче­

строки

*/

Считывание данных и запись их в переменные в соответствии с за­
данным форматом:

int scanf (const char * format, ... );
Функция с переменным количеством параметров внешне похожа на

printf,

обязательный параметр

format

содержит шаблоны преобра­

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

успешно преобразованных, или

EOF при

-

количество параметров,

ошибке. В строке, определя­

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

Шаблон преобразования начинается с символа

« %» . Формат ша­

блона преобразования:

25

Стран ицы свойств

ty

MyProg

Конфигурация: / А1СТивная (Debug)
1> Общие свойства

(,.
,. Свойства конфигурации •
Общие
Отладка
Каталоги

,,,

VC++

Общие
Оmимизация
Препроцессор

д!1сnетчер конфигураций ...
,,.

Включить минимальное перестроЕ Да

VGm)

Включить С++ исключения

Да

VEHsc)

Проверка м еньших типов

Нет

VRTO, жвивалентно / RTCsu) VRTO)

Библиотека времени выполнения

Многопоточная отладка

Выравнивание членов структур

П о умолчанию

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

Отключить проверку безопасности

DLL VMDd)
VGS-)

4

в

Включить создание параллельногс

Язык
Предварительно о·

Выходные файлы

Включить расширенный набор ин, Не задано

Модель вычислений с мавающей Точный

Vfp:precise)

Включить исключения для вычисл

Информация об и,

..,.

Создать образ с обновлением

Дополнительно

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

Все параметры

Командная строка



•] \

Включить объединение строк

Включ~пь компоновку на уровне

j

Создание кода

т

Плат_ф_орма: [А1СТивная (Win32)

Основные проверки времени выпс Оба

С/С++

,-------.

•]

~

G

Проверка безопас ности помогает обнаруживать переполнения буфера стека, что является
обычной попыткой обхода защиты программы. VGS-, / G5)

~1

[

Рис.

1.1.

Окно свойств проекта

ОК

J[

Отмена

][

Применить

] 1~1

%[*] [width] [h:l:L]type
«*» - необязательный символ;

в этом случае поле сканируется, но

в память не записывается; используется для пропуска полей;

width -

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

символов, считанных из входного потока;

[h: 1 : L] - то же самое, что и в printf;
type - определяет тип аргумента и его формат; возможные зна~1е­
ния это символы:
«d» - тип int * (при вводе в качестве параметра передается адрес
переменной - передача параметра по указателю), целая переменная в
десятичной системе счисления;

«i» -

int *,

тип

целое число может вводиться в десятичной,

восьмеричной (О в начале) или шестнадцатеричной (Ох или ОХ в на­
чале) системах счисления;
«о»

-

тип

int *, целая переменная в восьмеричной системе счис­

ления (с нулем или без нуля впереди);

«х»,

- тип int *, целая переменная в шестнадцатеричной си­

стеме счисления (с или без Ох/ ОХ впереди);

«u» -

тип

unsigned int *,

целая переменная в десятичной си­

стеме счисления без знака;

«s» «с»

char *, ввод отдельного символа;
тип char *, ввод строки, автоматически

тип

в конец строки

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

«f»,

«е»,

«Е»,

«g», «G»

-

тип

float *,

при вводе эти сим­

волы эквивалентны, ввод вещественного числа в форме с точкой или
со знаком экспоненты;

«%» -

присваивание не выполняется, в строке символ«%» обозна­

чает, что во входном потоке должен быть символ

«%».
Следует отметить, что компилятор Microsoft Visual С++ 2013 вы­
дает ошибку при использовании scanf (более ранние компиляторы
вьщавали предупреждение), сообщается, что функция scanf небезопас­
на и устарела и предлагается воспользоваться функцией scanf_ s с
таким же заголовком. Эту ошибку можно игнорировать, если в окне
свойств проекта отключить проверку безопасности (см. рис.
В отличие от

scanf,

scanf_s

1.1).

требует, чтобы размер буфера бьm

задан для всех входных параметров типа

с,

s

(см. пример ниже).

Примеры использования функции:

#include
#include
27

void main ()
float х;
int а ;
char Ch;
douЬle

Х;

char Str [ 64 ] ;
p rintf ("x , а , Ch : ");
scanf_s ("%f %d %с", &х , &а , &Ch, 1 );
/ / Для scanf вызов будет
scanf ("%f %d % с ", &х, &а ,
/ / &Ch);
/ / Ввод значений через пробелы, как в строке format
printf ("x=%f a=%d Ch=%c ", х , а , Ch) ;
printf (" \nX=" ) ; s canf _ s (" %l f ", &Х) ; / / Ввод типа douЬle
printf ("Str : " );
scan f_s ("%s ", Str, 63 ); /* Ввод строки, указать размер
строки, чтобы не выйти за границу массива * /
/ / Для scan f вызов будет scan f ("%s ", Str) ;
printf(" propusk : "); scanf_s ("%*d. %d" , &а) ;
/ * Если в потоке вводится 10 .12 , то в переменной а за­
пишется 12 * /
printf ("X=%f Str : %s a =%d\n", Х, Str, а) ;
s ystem ("pause");
/* Остановка программы до нажатия любой клавиuм

*/

1.1.3.

Задачи и порядок выполнения работы

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

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

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

[2, 4].

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

28

Исходные данные в задании могут быть любыми

-

они задаются

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

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

Примеры выполнения работы
Пример

1

Условие задачи
Даны х, у (знаqения вводят с клавиатуры). Вычислить а, если

а=

я2 - ~
2 •
х

у

1+- +2

4

Все значения вещественные.
Для решения задачи в среде

Microsoft Visual Studio 2013

бьmо соз­

дано стандартное консольное приложение (проект тюта Win32

Console

Application, в русифицированной версии - Консольное приложение
Wm32) с установленным свойством (Empty project).
В проект добавлен файл с расширением . срр, исходный код которого
приведен ниже.

Листинг программы с ком м ентариями

#include
#include
#include
voi d main ()
{
douЬle

х,

у,

а;

//

Определение

переменных .

/ / Ввод исходных данных .
printf_s ("x="); scanf s ("%lf", &х) ;
p rintf_s ("y="); scanf _s ("%lf" , &у) ;
/ / Вычисление значения выражения .
а = (sqrt ( faЬs (х - 1 )) - pow (faЬs ( у), 1 . / 3 ) ) /
(1 +
х*х / 2 + у*у / 4 ) ;
printf_ s ("a =%f\n ", а ) ;
system ("pause");
/ * Остановка программы до нажатия то­
бой клавиши

*/
29

Пример

2

Условие задачи

Определить, какая из двух точек

М1 (х 1 , у 1 ) или М/х2, у2 )

-

-

рас­

положена ближе к началу координат. Вывести на экран дисплея коор­
динаты этой точки.

Для решения задачи в среде Мicrosoft

Visual Studio 2013

бьmо соз­

дано стандартное консольное приложение (проект типа Wш32

Console
Application) с установленным свойством (Empty project).
В проект добавлен файл с расширением . срр, исходный код которого
приведен ниже .

Листинг программы

с

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

#incl ude
#include
#incl ude
// Определить , какая из двух точек Ml(xl , yl) или М2 (х2 , у2)
/ / расположена ближе к началу координат.
// Вывести на экран дисплея координаты этой точки .
void main ()
{

//
douЫe

Исходные

xl ,

yl ,

данные
х2 ,

задачи .

у2 ;

/ / Ввод ИСХОДНЫХ данных .
printf_ s ( " xl=" ) ; scanf_ s (" %lf" , &xl) ;
printf_s ("yl="); scanf_s ("%lf", &yl ) ;
printf_s ("х2=" ); scanf_s ("%lf" , &х2) ;
printf_s (" у2="); scanf_s (" %lf" , &у2 ) ;
douЫe r l, r2 ; / / Переменные для расчета расстояний .
/ / Расчет расстояний.
rl = sqrt (xl *xl + yl *yl ) ;
r2 = sqrt (х2*х2 + у2*у2 );
if (rl
t>

Плат.sl;!орма:

1

"" Свойстsа конфиrурlщии

Каталоги

J

Расширения Аf1Я удаления при очи •,cdf;*.cache;*.obj;*,ilk;*.reюurces;•.tlb;*.tli;*,tll,;*.tmp;
Фойп журнО110 сборки

S(lntDir)S(MSBuildProjectName).log

Набор инструментов платформы

Visшl

Studio 2013 (v120)

Ра.3реwитъ управляемую добавочн Нет

Набор СИМВОJЮВ
Ука3ывает, какой набор ,нi!lков СЛедУет испольюв11ть компилятору, актуально при
локалю.аци ~, .

ОК

Рис.1.12. Отключение набора символов

96

J I Отм•н• 11 При!,!•ниn.

Unicode

J

DialogBox(hinstance,
Di alogFun) ;
return О ;

МAКEINTRESOURCE(IDD_DIALOGl ) ,

О,

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

в окне свойств проекта отключить использование кодировки

Unicode,

т. е. установить оrщию в состояние , как
показано на рис .

1.12.
Задания для самоконтроля

1. Раскройте особенности модальных диалоговых окон и их отличия
от немодальных.

2.

Перечислите основные шаги создания диалогового окна в

Wm

API.
3. Перечислите основные элементы управления в диалоговом окне.
4. Расскажите, как обрабатываются сообщения от элементов управ­
ления в диалоговом окне.

5.

Назовите функции

Wm API для

изменения состояний элементов

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

Часть

2

РЕШЕНИЕ ЗАДАЧ НА ЯЗЫКЕ
ПРОГРАММИРОВАНИЯ СИ++

С ИСПОЛЬЗОВАНИЕМ
ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПОДХОДА

Лабораторная работа №

2.1

Изучение классов языка Си++

2.1.1.

Цель и задачи работы, требования
к результатам ее вьmолнения

Цель работы состоит в изуqении основных понятий объектно-ори­
ентироваmюго языка программирования Си++

-

классов и объектов

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

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



изучить учебные материалы , посвященные основам объектно­

ориентированного программирования на языке Си+ +



[3, 7];

разработать программу на языке Си+ + для решения заданного

варианта;




отладить программу;
вьmошrnть решение контрольного примера с помощью програм­

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

Вьшолнив работу, нужно подготовить отчет.

2.1.2.

Краткая характеристика объекта изучения
Понятие класса и объекта

Класс в языке Си+ +

-

новый тип, определяемый программистом,

вкmоqающий в себя данные (поля класса) и методы (функции) для их
обработки. Переменные такого типа называются объектами
Формат объявления класса:




[3, 7].



};
В качестве ключевого используется одно из трех слов:

struct

class

union .

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

языке Си: класс

-

это структура, в которую введены методы для об­

работки полей.

Объекты

-

это переменные типа класса. Формат определения объ­

ектов:



, ... ;

Обращение к полям и методам класса внугри методов класса

сто по имени, а за пределами класса

«.>>или через имя указателя на

-

-

про­

через имя объекта и операцию

объект и операцию «- >>>. Каждый объ­

ект класса имеет в оперативной памяти свои копии полей класса.

Пример работы с полями

struct А {i nt i; void p r int () {prin tf ("i =%d ", i ); }
};
А al ;
А *pA=&al ;
pA- >i =lO ; pA- >print ();
al. i =lO ; al . p rint ();
al.A : : i =lO ; al . A: : print(); рА- >А : : i = lO ; рА->А : : print () ;
Доступность компонент класса

Свойство доступности определяет возможность доступа к полям и
методам за пределами класса (через имя объекта или указатель на объ­

ект).
Существует три статуса доступа:

• puЫic (полностью доступны за пределами класса);
• p r i vate (недоступны за пределами класса, можно обращаться к
компонентам только в методах своего класса);

• p r otected (доступны только в своем классе и в производных
классах).
По умолчанию: если класс определен с ключевым словом

struct,

то все компоненты имеют статус доступа puЫ i c , если со словом

union -

тоже

puЫic, но все поля каждого объекта располагаются

99

в памяти, начиная с одного адреса. Если класс определен с ключевым

class, то
ступа private.
словом

все поля и методы по умолчанию имеют статус до­

Статус доступа можно изменить с помощью соответствующих мо­
дификаторов , что продемонстрировано в следующем примере:

struct

А

{

... // Статус доступа puЫic
private :
... // Статус доступа private
protected:
... // Статус доступа protected
};

class

в

{

... //

Статус

доступа

p rivate

доступа

puЫic

доступа

protected

puЫic :

... // Статус
protected:
// Статус
};

Основные элементы класса
Компонентные да1mые и функции класса. Компонентные данные (по­
ля класса) и функции класса (методы класса) уже во многом рассмо­
трены вьШiе. Следует дополнить, что методы класса могут быть опре­
делены внутри класса

-

в этом случае они, если нет ограничений,

являются подставляемыми, но чаще всего класс содержит описание

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

. h (заголовочный: файл),

в котором находится описание класса вместе с полями и заголовками

методов. Определения методов находятся в файле реализации класса
(файле с расширением

. срр).

В этом случае, чтобы использовать класс

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

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

100

struct Complex
{
douЫe real ,
image ; / / Поля класса .
void define (douЬle re=O . О , douЬle im=O . О )
ление

метода

внутри

класса

/*

Опреде-

*/

{

real=re ; image=im; //

Обращение к полям внутри метода.

}

voi d pr int () ;

//

Описание

метода .

};

void Complex : :print ()
ми класса

/*

Определение метода

за предела­

*/
printf (" \nreal=%f

image=%f", real ,

Конструктор класса. Конструктор класса

-

i mage );

специальный блок опе­

раторов (инструкций:) , вызываемый при создании объекта. Назначение:
присвоение начальных значений полям, вьщеление памяти, открытие

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

Формат определения конструктора внутри класса:
Имя_класса(Список_формальных_параметров )

{

Операторы_тела

}

конструктора

По умолчанию, класс всегда имеет конструктор копирования вида
А(А& а){ ...

} (А -

имя класса) , создающий копию объекта (происходит

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

Примеры вызовов конструкторов:
А

раметров
А

//

А*

al ;
а2

pA=new

А;

/*

Вызываются

конструкторы без

па­

*/

(3,

4);

А

Вызываются

* pA2=new

А (З,

конструкторы

с

4 );
двумя

параметрами.

101

Для конструктора с одним параметром можно использовать
форму:
А

а1=5;

А

a2=al;

вместо

А

Деструктор класса. Деструктор

al (5);

-

А

а2

(al);

специальный блок операторов

(инструкций), служащий для де инициализации объекта (освобождения
памяти, закрытия файлов и т. п.). Вызьmается автоматически при уда­
лении объекта, например, оператором

delete или при выходе из бло­

ка, в котором существует объект. Не имеет возвращаемого значения
и параметров. Может определяться как внутри класса, так и за его

пределамя. Пример деструктора:
~имя_класса

()

{
тело_деструктора

2.1.3.

Задачи и порядок выполнения работы

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

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

са в языке Си++: полей, методов (функций класса), конструкторов,

деструктора. Нужно обратить внимание на способы создания массива
объектов класса динамически.

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

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

Условие задачи
Класс . Содержит поля (статус доступа
звание (марка); средний расход топлива (в литрах на

private): на­
100 км).

Методы и конструкторы: конструктор для инициализации полей;

метод расчета требуемого объема топлива для заданного пробега (метод

102

имеет один параметр, который задает требуемый пробег в километрах,
возвращает требуемый объем тошшва в литрах); метод печати параме­

тров объекта.
При необходимости можно использовать другие методы и конструк­
торы.

Требуется создать массив объектов класса, рассчитать требуемый

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

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



в класс нужно включить конструктор без параметров и отдельный

метод для инициализации полей, например, с именем set и количеством
параметров , которые соответствуют количеству инициализируемых

полей класса;



объявить указатель на массив объектов; если имя класса

MyClass,



это объявление может иметь вид

MyClass

*рОЬ;

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

значение целой переменой

pOb=new MyClass [n];

n

и создать массив объектов динамически

здесь при создании каждого объекта вызывает­

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



в цикле для каждого объекта ввести параметры для его инициа­

лизации и инициализировать уже созданный объект с помощью вы­
зова метода

set,

это действие может иметь вид рОЬ

[i] . set (... ),

где

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

Особенности второго способа (здесь не нужен конструктор без па­
раметров и метод


са

MyCl ass,



set):

объявить указатель на указатель массива объектов; если имя клас­
это объявление может иметь вид:

MyClass

**ррОЬ;

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

значение целой переменой

n и создать массив указателей динамически

ppOb=new MyClass* [n];



в цикле для каждого объекта ввести параметры для его инициа­

лизации и создать объект динамически с помощью вызова конструк-

103

тора с параметрами, это действие может иметь вид ррОЬ

MyClass (... ); ,

[ i ] =new

где вместо многоточия передаются фактические пара­

метры для конструктора класса.

Ниже в JШстинге показаны оба способа, один из способов пред­
ставлен в виде комментариев. Для решения задачи в среде Microsoft
Visual Studio 2013 было создано стандартное консольное приложение
(проект типа Wm32 Console Application, в русифицированной версии Консольное приложение Wm32). Исходные коды основного файла
проекта (файла с расширением . срр) и файла stdafx . h приведены
ниже.

Листинг программы

с

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

/ / Основной файл проекта.
#include "stdafx.h"
using namespace std; /* В этом пространстве
дятся объекты cin и cout * /
/* cin - стандартный объект ввода , cout объект вывода * /
class Avt / / Класс «автомобиль».

имен

нахо­

стандартный

{

char marka [ 64] ; / / Марка.
rash; / / Расход топлива

douЬle

на

100

км.

puЬlic :

Avt ()
стоЙ>>

объект

/*
*/
rash

Конструктор

=

marka[0]

полей

для

=

параметров

создает

«пу-

О;

douЬle

void set (char mar [],
циализации

без

созданного

r)

/*

«пустого»

Функция

для ини­

объекта

*/

{

strcpy_s (marka,
содержащей марку

автомобиля

rash = r; /*
на

км

100

Копирование

строки ,

значение расхода

топлива

/*

mar) ;
*/

Задать

*/

}

Avt (char mar [] ,
ализации полей * /

douЬle

strcpy_s (marka,
содержащей марку

104

автомобиля*/

r) /*

mar) ;

Конструктор для иници­

/*

Копирование

строки ,

rash
на

км

100

Задать

r ; /*

значение

расхода

топлива

*/

}
douЫe getRash (douЫe
ное

количество

dlina) /*

Функция возвращает нуж­

топлива для пробега заданного расстояния*/

return rash*dlina / 100 .;
}

void print ()

Функция

//

для

печати

cout > установить значение
или (см. рис. 2.6). Все остальные параметры при
создании проекта можно оставить без изменений (значения по умол­
чаЮ1Ю) .
Для хранения данных внутри приложения задают необходимые по­
ля в классе «Документ>>, вывод графики осуществляют через методы
класса .

165

[

Со,даn. npoea
t, Г10

)\

Готово

Внешний вид окна со свойствами проекта

]\

ОТМ 1000
#pragma once
#endif / /
МSС VER > 1000
class MyLine: puЬlic CObj ect
#if

{
puЬlic :

чало

void add(MyLine *&pF) ; /* Добавление элемента в насписка * /
MyLine();
MyLine (CPoint pl , CPoint р2);
virtual ~MyLine () ;
CPoint pl, р2 ; // Координаты концов отрезка.
MyLine *pNext; / / Указатель на следукщий элемент.
static int Num; // Счетчик созданных объектов .
DECLARE_SERIAL(MyLine)

};

#endif / / ! defined (AFX- МYLINEН
65С81С1Е бFED 4С5Е ...
/ / MyLine. срр: implementation of the MyLine class.

//////////I/I///////////I///////I///////I////////I/
#include «stdafx . h»
#include «MyLinel. h»
# include «МуLine . h»
#ifdef DEBUG
#undef THIS FILE
static char THIS- FILE [] =- FILE#define new DEBUG NEW
#endif

;

167

//////////////////////////////////////////////////
// Construction/Destruction

/////////////////////////////////////////////////
IМPLEМENT_SERIAL(MyLine,

CObject,

1)

int MyLine : : Num=0;
MyLine : : MyLine ()
{

Num++;
MyLine: : ~MyLine ()
{

Num--;
MyLine: :MyLine (CPoint pl ,

CPoint

р2)

{

this- >pl=pl;
this- >p2=p2 ;
Num++;
void MyLine: : add (MyLine * & pF)
{

pNext=pF;
pF=this;

В класс документа включаем данные:

/ / Attributes
puЫic :

MyLine *pF; // Указатель на первый элемент списка линий.
bool flagFigl, flagFig2; / * Флаги-признаки, что геометрические фигуры нарисованы * /
CString text ; / / Строка текста, которая выводится.
В начало файла оrшсания документа добавляем:

#include "MyLine. h"
Конструктор класса документа имеет вид

CMyLine lDoc : : CMyLine lDoc()

168

/ / TODO : add one-time construction code here
p F=0 ;
flagFi gl=flagFig2=false ; / / Фигуры не нарисованы .
tex t=""; / / Строка текста пустая .

В описание класса добавляем поля:

C Point pl , р2 ; // Точки, задакщие рисуемый отрезок.
CPen penl ; / / Перо для рисования фигур через меню.
CBrush brushl ; / / Кисть для рисования фигур через меню.
В конструктор класса ;
ввод символа.

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

открыть меню в файле ресурсов;




выделить необходимый элемент меню и нажать правую клавишу

мыши

-

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

элемент , появляется
диалоговое окно (рис .

Мастер обработчика событиR

f

2.8).
l,.i1

- MFCApplication

11,,,,tз,,,,ij

Добро пожаловать в масrер обработчика собь1Т1U1

И11я-ды:

r:_..."-,......

~

ТИ!J сообщен1я:

С(!\'СОК классов:

r•• а Фi•

CAЬoutDlg
CМFCApplicationApp
CМFCAooicэtionDoc

UPDAТE_COММAND_UI

~:,•··,1_,.
cмaлframe

!1ня фун,щ,,и-обработчика:
ОnЗ2П1

е "':

lбоrчнка:

jВыJьвается поспе 1!Ыбор,, nvжта r,ен,о ,.,., ЮiОА,

Найти длину диагонали параллелепипеда, по­

строенного на векторах А, В, С как на сторонах.

181

Вариант №

26

Определить периметр правильного п-угольника, описанного около
окружности радиусом

Вариант №

r.

27

Известна длина окружности. Найти площадь круга, ограниченного
этой окружностью.

Часть
Вариант №

2

1

Даны действительные положительные 'IИСла х, у,
ществует ли треугольник с длинами сторон х, у,

Вариант №

z.

Выяснить, су­

z.

2

Дано действительное а. Для функцииf(а), график которой пред­
ставлен на рисунке, вьr'IИслить/(а).
у=4

у = 1 /х

2

Вариант №

3

Даны три действительных ,шсла. Выбрать из них те, которые при­
надлежат интервалу

(1, 3),

или вывести сообщение, что таких чисел

нет.

Вариант №

4

Даны действительные числа х, у. Если х, у отрицательные, каждое
значение заменить его модулем; если отрицательное только одно из

них, оба значения увеличить на 0,5; если оба значения неотрицательные

182

и ни одно из них не принадлежит отрезку
уменьшить в
Вариант №

10 раз;

[0,5; 2,0],

оба значения

в остальных случаях х, у оставить без изменения.

5

Определить и вывести на печать номер квадранта, в котором рас­

положена точка М(х, у); х и у -

Вариант №

заданные вещественные числа.

6

Из величин, определяемых выражениями а

= sin х, Ь = cos х, с = Ini.xl

при задаююм х, опредеmпь и вывести на экран дисплея минимальное

значение.

Вариант №

7

Определить, какая из двух точек

-

М1 (х 1 , у 1 ) или М/х2 , У)

-

рас­

положена ближе к началу координат. Вывести на экран дисплея коор­
динаты этой точки.

Вариант №

8

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

r. Вы­

вести на экран название и значение rшощади большей фигуры.
Вариант №

9

Определить, попадает ли точка М(х, у) в круг радиусом



центром

в точке (х0 , у0).
Вариант №

10

Найти количество положительных
четырех целых чисел А, В, С,
Вариант №

(отрицательных)

чисел среди

D.

11

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

183

Вариант №

12

Пройдет JШ кирпич со сторонами а, Ь и с через прямоугольное от­
верстие со сторонами

r

и

s?

Стороны отверстия должны быть парал­

лельны граням кирпича.

Вариант №

13

Может ли шар радиусом
диагоналями р и
Вариант №

r пройти

через ромбообразное отверстие с

q?

14

Выч:и:сJШть значение выражения у=
возможно (т. е. есJШ (2Х -

1)>= О).

sqrt (2Х - 1) в случае,

когда это

В противном случае вывести на со­

общение «Задайте другое значение Х>>.

Вариант №

15

Запросить рост и массу пользователя вашей программы. В случае,

если масса больше, чем рост

(-100),

то вывести сообщение . В противном случае вывсти сообщение >

на работу, должность,
базовый оклад

По окладу

4

5

6

>
26

"¼ctor&

int

Yector&

int

Поразрядный сдвиг вправо; реализовать для
ЦИКJIИЧеского сдвига всех элементов вектора

вправо на заданное число позиций (число по-

зиций определяет второй операнд операции)

Варианты заданий
для лабораторной работы №
Вариант №

2.3

1

Создать базовый класс > . Элементы класса: поле, задающее
длину стороны (статус доступа

protected);

конструктор для инициа­

лизации поля; функция для вычисления площади квадрата; функция
для печати поля и площади квадрата. Создать производный класс «Куб».

Элементы класса: конструктор для инициализации поля; переопреде-

227

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

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

Вариант №

4

Создать базовый класс . Элементы класса: поля,
задающие длины сторон (статус доступа

pr otected);

конструктор для

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

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

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

Вариант №

19

Создать базовый класс