Решение задач на языках программирования Си и Си++ [Александр Юрьевич Быков] (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
Определить, попадает ли точка М(х, у) в круг радиусом
rс
центром
в точке (х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
Создать базовый класс
Последние комментарии
2 дней 5 часов назад
2 дней 5 часов назад
2 дней 5 часов назад
2 дней 6 часов назад
2 дней 8 часов назад
2 дней 8 часов назад