Учебно-методический комплекс учебной дисциплины сдм. 02 «программирование» подготовки магистров по направлению 050200 «Физико-математическое образование» магистерская программа «Информатика в образовании»

Вид материалаУчебно-методический комплекс

Содержание


Ключ к тесту
Вызов функций.
Имена функций.
Необязательные аргументы функций
Подставляемые (inline) функции.
Функции с переменным числом параметров
Перегрузка функций
Доступ к элементам структур. И
Битовые поля
Динамические структуры данных.
Линейный однонаправленный список.
Адресное поле
Ссылка на себя.
Практическая работа №2
Самостоятельная работа.
Для студентов
Аттестация качества усвоения знаний
Подобный материал:
1   2   3   4   5   6

Ключ к тесту:

1в; 2в; 3в; 4в; 5в; 6г; 7б; 8г; 9в; 10г.


Модуль 3

Лекция №1. Функции в СИ++. Рекурсия

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

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

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

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

Определение функции содержит, кроме объявления, тело функции, которое представляет собой последовательность описаний и операторов.

тип имя_функции([список_формальных_параметров])

{

тело_функции

}

Тело_функции – это блок или составной оператор. Внутри функции нельзя определить другую функцию. В теле функции должен быть оператор, который возвращает полученное значение функции в точку вызова. Он может иметь 2 формы: 1) return выражение;

2) return;

Первая форма используется для возврата результата. Вторая –используется, если функция не возвращает значения, т. е. имеет тип void. Программист может не использовать этот оператор в теле функции явно, компилятор добавит его автоматически в конец функции перед }.

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

Список формальных параметров – это те величины, которые требуется передать в функцию. Элементы списка разделяются запятыми. Для каждого параметра указывается тип и имя. В объявлении имена можно не указывать.

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

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

double sqrt(double x); // функция sqrt с одним аргументом – вещественным числом двойной точности, возвращает результат типа double

int sum(int a, int b, int c); функция sum от трех целых аргументов возвращает целое число

После того, как функция объявлена, ее можно использовать в выражениях: double x = sqrt(3) + 1;

sum(k, l, m) / 15;

Если функция не возвращает никакого результата, т.е. она объявлена как void, ее вызов не может быть использован как операнд более сложного выражения, а должен быть записан сам по себе: func(a,b,c);

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

int

sum(int a, int b, int c)

{

int result;

result = a + b + c;

return result;

}

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

Аргументы a, b и c называются формальными параметрами. Это переменные, которые определены в теле функции (т.е. к ним можно обращаться только внутри фигурных скобок). При написании определения функции программа не знает их значения. При вызове функции вместо них подставляются фактические параметры – значения, с которыми функция вызывается. Выше, в примере вызова функции sum, фактическими параметрами (или фактическими аргументами) являлись значения переменных k, l и m.

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

Первое, что мы делаем в теле функции — объявляем внутреннюю переменную result типа целое. Переменные, объявленные в теле функции, также называют локальными. Это связано с тем, что переменная result существует только во время выполнения тела функции sum. После завершения выполнения функции она уничтожается – ее имя становится неизвестным, и память, занимаемая этой переменной, освобождается.

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

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

Имена функций. В языке Си++ допустимо иметь несколько функций с одним и тем же именем (перегрузкой имен функций), потому что функции различаются не только по именам, но и по типам аргументов. Если в дополнение к определенной выше функции sum мы определим еще одну функцию с тем же именем

double

sum(double a, double b, double c)

{

double result;

result = a + b + c;

return result;

}

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

int x, y, z, ires;

double p,q,s, dres;

. . .

// вызвать первое определение функции sum

ires = sum(x,y,z);

// вызвать второе определение функции sum

dres = sum(p,q,s);

При первом вызове функции sum все фактические аргументы имеют тип int. Поэтому вызывается первая функция. Во втором вызове все аргументы имеют тип double, соответственно, вызывается вторая функция.

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

Необязательные аргументы функций

При объявлении функций в языке Си++ имеется возможность задать значения аргументов по умолчанию. Первый случай – сокращение записи. Если функция вызывается с одним и тем же значением аргумента в 99% случаев, и это значение достаточно очевидно, можно задать его по умолчанию. Предположим, функция expnt возводит число в произвольную целую положительную степень. Чаще всего она используется для возведения в квадрат. Ее объявление можно записать так: double expnt (double x, unsigned int e = 2); Определение функции.

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

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

Подставляемые (inline) функции. Некоторые функции в СИ++ можно определить с использованием служебного слова inline. Такая функция называется подставляемой или встраиваемой. Например:

inline float Line(float x1,float y1,float x2=0, float y2=0)

{

return sqrt(pow(x1-x2)+pow(y1-y2,2));

}

//функция возвращает расстояние от точки с координатами(x1;y1)(по умолчанию центр координат) до точки с координатами (x2;y2).

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

Функции с переменным числом параметров

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

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

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

Перегрузка функций

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

Правила описания перегруженных функций:
  1. Перегруженные функции должны находиться в одной области видимости.
  2. Перегруженные функции могут иметь параметры по умолчанию, при этом значения одного и того же параметра в разных функциях должны совпадать. В разных вариантах перегруженных функций может быть разное количество умалчиваемых параметров.
  3. Функции не могут быть перегружены, если описание их параметров отличается только модификатором const или наличием ссылки.

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

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

Вопросы:
  1. Что такое функция? Для чего функции используются?
  2. Объявление и определение функции.
  3. Что такое формальные переменные?
  4. В чем смысл внутреннего связывания?
  5. Назовите конструкцию функции с переменным числом параметров.
  6. В чем цель перегрузки функций?
  7. Перечислите правила описания перегруженных функций.

Лекция №2. Структуры

Структура – это объединенное в единое целое множество поименованных элементов в общем случае разных типов. Сравнивая структуру с массивом, следует отметить, что массив – это совокупность однородных объектов одного и того же типа. Это не всегда удобно. Пусть, например, библиотечная карточка каталога должна включать сведения о книге:
  • Фамилия автора;
  • Заглавие книги;
  • Место издания;
  • Год издания;
  • Количество страниц.

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

В соответствии с синтаксисом языка определение структурного типа начинается со служебного слова struct, вслед за которым помещается выбранное пользователем имя типа. Описания элементов, входящих в структуру, помещаются в фигурные скобки, вслед за которыми ставиться точка с запятой. Элементы структуры могут быть как базовых, так и производных типов. Например, в структурах типа card будут элементы базового типа int и производного типа char *. Элементы структуры (поля) могут быть различного типа, они все должны иметь различные имена. Форматы определения структурного типа. Примеры. В первом случае описание структур определяет новый тип, имя которого можно использовать наряду со стандартными типами.

Во втором случае описание структуры служит определением переменных.

Структурный тип можно также задать с помощью ключевого слова typedef:

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

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

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

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

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

Линейный однонаправленный список. Описание простейшего элемента такого списка.

Информационное поле – это поле любого, ранее объявленного или стандартного типа.

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

Информационных полей может быть несколько. Примеры.

Каждый элемент списка содержит ключ, который идентифицирует этот элемент. Ключ обычно бывает либо целым числом, либо строкой.

Над списками можно выполнять следующие операции:
  1. начальное формирование списка (создание первого элемента);
  2. добавление элемента в конец списка;
  3. добавление элемента в начало списка;
  4. удаление элемента с заданным номером;
  5. чтение элемента с заданным ключом;
  6. вставка элемента в заданное место списка (до или после элемента с заданным ключом;
  7. упорядочивание списка по ключу и др.

Вопросы:
  1. Что такое структура, список? Приведите примеры.
  2. В чем смысл доступа к элементам структуры? Назовите общую форму записи уточненных имен. Приведите примеры таких имен.
  3. Дайте определение битовому полю. В чем смысл таких полей?
  4. Что такое объединение? Приведите пример.
  5. Приведите примеры динамических структур. Что такое однонаправленный список?
  6. Назовите операции, которые можно выполнять над списками.

Лекция №3. Классы и члены

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

struct date { int month, day, year; };

date today;

void set_date(date*, int, int, int);

void next_date(date*);

void print_date(const date*);

// ...

Никакой явной связи между функциями и структурой date нет. Ее можно установить, если описать функции как члены структуры:

struct date

{

int month, day, year;

void set(int, int, int);

void get(int*, int* int*);

void next();

void print();

};

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

date today;

date my_birthday;

void f()

{

my_birthday.set(30,12,1950);

today.set(18,1,1991);

my_birthday.print();

today.next();

}

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

void date::next()

{

if (++day > 28 )

{

// здесь сложный вариант

}

}

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

Классы. Можно установить ограничение, описав класс вместо структуры:

class date

{

int month, day, year;

public:

void set(int, int, int);

void get(int*, int*, int*);

void next();

void print()

};

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

Ссылка на себя. В функции-члене можно непосредственно использовать имена членов того объекта, для которого она была вызвана. При первом вызове readm() m обозначает aa.m, а при втором - bb.m. У функции-члена есть дополнительный скрытый параметр, являющийся указателем на объект, для которого вызывалась функция. Можно явно использовать этот скрытый параметр под именем this. Считается, что в каждой функции-члене класса X указатель this описан неявно как X *const this; и инициализируется, чтобы указывать на объект, для которого функция-член вызывалась. Этот указатель нельзя изменять, поскольку он постоянный (*const). Явно описать его тоже нельзя, т.к. this - это служебное слово. Типичный пример - функция, которая вставляет элемент в список с двойной связью.

Инициализация. Программисту предоставляется возможность описать функцию, явно предназначенную для инициализации объектов. Поскольку такая функция конструирует значение данного типа, она называется конструктором. Эту функцию легко распознать - она имеет то же имя, что и ее класс. Если в классе есть конструктор, все объекты этого класса будут проинициализированы. Если конструктору требуются параметры, их надо указывать. Часто бывает удобно указать несколько способов инициализации объекта. Для этого нужно описать несколько конструкторов. Параметры конструкторов подчиняются тем же правилам о типах параметров, что и все остальные функции. Пока конструкторы достаточно различаются по типам своих параметров, транслятор способен правильно выбрать конструктор.

Когда используется стандартное значение параметра, оно должно отличаться от всех допустимых значений параметра. В случае месяца и дня очевидно, что при значении нуль - это так, но неочевидно, что нуль подходит для значения года.Объект класса без конструктора может инициализироваться присваиванием ему другого объекта этого же класса. Это незапрещенно и в том случае, когда конструкторы описаны: date d = today; //инициализация присваиванием

На самом деле, имеется стандартный конструктор копирования, определенный как поэлементное копирование объектов одного класса.

Удаление. Пользовательские типы чаще имеют, чем не имеют, конструкторы, которые проводят надлежащую инициализацию. Для многих типов требуется и обратная операция – деструктор, гарантирующая правильное удаление объектов этого типа. Деструктор класса X обозначается ~X («дополнение конструктора»). В частности, для многих классов используется свободная память, выделяемая конструктором и освобождаемая деструктором.

Когда объект типа char_stack выходит из текущей области видимости, вызывается деструктор. Когда начинает выполняться f(), вызывается конструктор char_stack, который размещает массив из 100 символов s1 и массив из 200 символов s2. При возврате из f() память, которая была занята обоими массивами, будет освобождена.

Подстановка. Программирование с классами предполагает, что в программе появится множество маленьких функций. По сути, всюду, где в программе с традиционной организацией стояло бы обычное обращение к структуре данных, используется функция. То, что было соглашением, стало стандартом, проверяемым транслятором. В результате программа может стать крайне неэффективной. Хотя вызов функции в C++ и не столь дорогостоящая операция по сравнению с другими языками, все-таки цена ее много выше, чем у пары обращений к памяти, составляющих тело тривиальной функции. Преодолеть эту трудность помогают функции-подстановки (inline). Если в описании класса функция-член определена, а не только описана, то она считается подстановкой. Это значит, например, что при трансляции функций, использующих char_stack из предыдущего примера, не будет использоваться никаких операций вызова функций, кроме реализации операций вывода! Другими словами, при разработке такого класса не нужно принимать во внимание затраты на вызов функций. Любое, даже самое маленькое действие, можно смело определять как функцию без потери эффективности. Это замечание снимает наиболее часто приводимый довод в пользу общих членов данных.

Вопросы:
  1. Что такое класс? Функция-член и друзья?
  2. Что используется для создания объектов класса?
  3. Можно ли описать специальную функцию-член для удаления объектов класса при его уничтожении. Объясните свой ответ.
  4. В каком случае все объекты класса будут быть проинициализированы?
  5. Когда используется стандартное значение параметра?
  6. Можно ли описать функцию-член со спецификацией inline? В каком случае?

Практическая работа №1

Цель: получение навыков работы с функциями.

Задачи:

1. Написать программу вычисления числового треугольника (использование функции, например, треугольник числа 5 будет равен: 1+2+3+4+5=15).

2. Написать программу проверки на простое число с использованием функции.

3. Написать программу, которая находила наибольший общий делитель.

4. Написать программу разложения числа на простые множители.

5. Генератор случайных чисел (от 0 до N-1).

6. Вычисление факториала с помощью рекурсивной функции.

7. Рекурсивная генерация чисел Фибоначчи.

Дополнительные задачи:
  1. Напишите функцию print_out, печатающую все целые числа в диапазоне от 1 до N. Проверьте работу функции, поместив ее в программу и передав ей число n – число, введенное с клавиатуры. Возвращаемый тип функции print_out должен быть void; функция не возвращает значение. Функция может быть вызвана простой инструкцией: print_out(n);.
  2. Напишите программу, которая находит первое простое число, которое больше одного миллиарда (1000000000).
  3. Напишите программу, которая вычисляет факториалы, используя рекурсивную функцию.
  4. Напишите генератор случайных чисел, возвращающий число в диапазоне от 1 до N, где N – это целочисленный аргумент, передаваемый в функцию.


Практическая работа №2

1. Программа создает определенный пользователем тип структуры Time с тремя целыми элементами: hour, minute и second. Программа определяет единственную структуру типа Time, названную dinnerTime, и использует операцию точка для присвоения элементам структуры начальных значений 18 для hour, 30 для minute и 0 для second. Затем программа печатает время в военном (24-часовом) и стандартном (12-часовом) форматах.

Дополнительные задачи:

1. Структура "Человек":
  • фамилия, имя, отчество;
  • год рождения;
  • рост;
  • вес.

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

2. Структура «Школьник»:
  • фамилия, имя, отчество;
  • класс;
  • номер телефона;
  • оценки по предметам (математика, физика, русский язык, литература).

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

3. Структура «Покупатель»:
  • фамилия, имя, отчество;
  • домашний адрес;
  • номер телефона;
  • номер кредитной карточки.

Удалить 3 элемента из начала файла, добавить 3 элемента в конец файла.


Практическая работа №3

1. Программа выполняет несколько простых тестов над классом Point, используя его для присвоения и получения некоторых данных.

2. Напишите две новые функции для класса Point: функции set_x и set_y, которые устанавливают значения членов x и y по отдельности. Не забудьте инвертировать отрицательное значение, если такое появится, как это сделано в функции set. (на основе первой задачи)

3. Программа использует простой класс, названный Count, с открытым элементом данных x типа int и открытой функцией – элементом print, чтобы проиллюстрировать доступ к элементам класса с помощью операций выбора элемента. Программа создает три экземпляра переменных типа Count – counter, counterRef (ссылка на объект типа Count) и counterPtr (указатель на объект типа Count), переменная counterRef объявлена, чтобы ссылаться на counter, переменная counterPtr объявлена, чтобы указывать на counter. Элемент данных х сделан открытым просто для того, чтобы продемонстрировать способы доступа к открытым элементам.

Самостоятельная работа.

На самостоятельное изучение выносятся следующие вопросы:

1) Теоретические:
  1. Функции в СИ++. Прототип функции и параметры функции.
  2. Передача одномерных массивов как параметров функции.
  3. Передача многомерных массивов в функцию.
  4. Передача строк в качестве параметров функций.
  5. Функции с начальными значениями параметров.
  6. Шаблоны функций. Указатель и ссылки на функцию.
  7. Однонаправленный и двунаправленный список.
  8. Стеки и очереди.
  9. Интерфейсы и реализации. Примеры разработки, реализации и использования классов.
  10. Конструкторы и деструкторы. Создание объектов как автоматический, статический или как объект в свободной памяти.
  11. Работа с файлами.

2) Задачи:
  1. Создание и печать однонаправленного списка.
  2. Удаление из однонаправленного списка элемента с номером k.
  3. Создать двунаправленный список, удалить элемент с заданным номером, добавить элемент с заданным номером, напечатать полученные списки.
  4. Написать функцию с переменным числом параметров для перевода чисел из восьмеричной системы счисления в десятичную.
  5. Написать функцию square, которая находит площадь треугольника по его сторонам.
  6. Написать функцию sum, которая находит сумму чисел типа int.
  7. Написать функцию mult, которая находит произведение чисел типа float.
  8. Написать функцию sum, которая находит сумму чисел типа int по формуле: .
  9. Написать функцию min, которая находит минимальное из чисел типа int или из чисел типа double.
  10. Написать функцию kvadr, которая определяет количество чисел, являющихся точными квадратами (2, 4, 9, 16,. . . ) типа int.

Контрольные вопросы к модулю 3.

  1. Что такое структура, список? Что такое объединение? Что такое однонаправленный список?
  2. В чем смысл доступа к элементам структуры?
  3. Назовите операции, которые можно выполнять над списками.
  4. Что такое функция? Что такое формальные переменные?
  5. Перечислите правила описания перегруженных функций.
  6. Что такое класс? Функция-член и друзья?
  7. Что используется для создания объектов класса?
  8. Что такое конструктор и деструктор?

Рубежный тест

1. Какая функция в С++ очищает экран?
  1. delscr();
  2. clsscr();
  3. cleane();
  4. clrscr().

2. В какой из строк аргументы функции main написаны правильно (выберите несколько вариантов)?
  1. (int argc, char *argv[], char *envp[]);
  2. (int argc, char argv[], char envp[]);
  3. (int argc, char *envp);
  4. (int argc, char *argv[]).

3. К чему может привести широкое использование функций в программе?
  1. программа начнет работать гораздо медленнее;
  2. будет перегружена память компьютера;
  3. размер исполняемого файла увеличится;
  4. размер исполняемого файла уменьшится.

4. Какая из 3-х функций: – будет вызвана первой при вычислении значения переменной a в выражении ?
  1. функции ;
  2. функции ;
  3. функции ;
  4. нельзя точно сказать.

5. Когда функция в языке С++ завершает свое выполнение?
  1. только при достижении оператора return;
  2. только при достижении завершающей фигурной скобки;
  3. только при достижении оператора break;
  4. в случаях а или б.

6. Функция, которая прямо или косвенно вызывает сама себя, называется ____________________________.

7. Повторный запуск рекурсивного механизма вызовов функции приводит:
  1. к нарастающим затратам процессорного времени и требуемого объема памяти;
  2. к отказу действии компилятора;
  3. к завершению программы до начала выполнения;
  4. к перезагрузке программы.

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

9. Какие из перечисленных ниже утверждений неверны (выберите несколько вариантов)?
  1. компоненты структуры могут быть различных типов;
  2. структура представляет собой совокупность данных;
  3. компоненты структуры должны быть различных типов;
  4. компоненты структуры имеют атрибут private по умолчанию.

10. Какие из перечисленных ниже утверждений неверны?
  1. класс представляет собой набор переменных;
  2. компоненты класса имеют атрибут public по умолчанию;
  3. компоненты класса должны быть различных типов;
  4. в языке С++ недопустима вложенность классов;
  5. описание класса не может производиться в другом классе;
  6. все утверждения верны.

11. Какое ключевое слово начинает определение структуры?
  1. class {};
  2. struct {};
  3. main {};
  4. void {}.

12. Функция определенная внутри класса, называется ________________.

13. Какое ключевое слово начинает определение класса?
  1. class {};
  2. struct {};
  3. void {}.
  4. main {};

14. Препятствиями к созданию новых типов данных с помощью struct являются:
  1. возможность существования данных, не имеющих начальных значений;
  2. возможность существования данных с неправильными начальными значениями;
  3. необходимость изменения всех программ, использующих struct, при изменении реализации struct;
  4. отсутствие средств защиты, гарантирующих, что данные не содержат несогласованных значений;
  5. все утверждения верны.

15. Каково различие между оператором точка и оператором доступа к члену класса по имени класса?
  1. оператор точка именуется оператором доступа к члену класса по имени класса, а оператор доступа – оператором прямого доступа к члену класса;
  2. оператор точка именуется оператором прямого доступа к члену класса, а оператор доступа – оператором доступа к члену класса по имени класса;
  3. оператор точка именуется оператором закрытого доступа к члену класса, а оператор доступа – оператором доступа к члену класса по имени класса;
  4. различий нет.


Ключ к тесту:
  1. г
  2. а, г
  3. г
  4. г
  5. г
  6. рекурсия
  7. а
  8. структуры
  9. в, г
  10. е
  11. б
  12. функция-член
  13. а
  14. д
  15. б






Методические рекомендации по изучению курса

Для преподавателей

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

Курс разделен на три модуля, в каждом модуле по три лекции. На каждое лекционное занятие должно быть предусмотрено минимум одно практическое занятие и 4 часа на самостоятельную работу. В каждой практической работе помимо основных задач есть дополнительные, которые по усмотрению преподавателя могут быть включены в практику. Таким образом на изучение курса отводится 15 лекционных часа, 24 практических и 36 часа самостоятельных занятий.

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

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

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

Для студентов

Для повышения уровня знаний и качества подготовки студентам рекомендуется:
  1. при подготовке к практическим занятиям тщательно прорабатывать теоретический материал заданного раздела лекций, обращая особое внимание на терминологию. Кроме курса лекций необходимо пользоваться основной и дополнительной литературой;
  2. при выполнении практических работ необходимо учитывать, что основной объем выполняется самостоятельно на базе тех знаний, которые были получены на занятиях в компьютерном классе, поэтому желательно иметь домашний компьютер с установленным программным обеспечением;
  3. все задачи должны быть самодокументированы, т.е. в тексте задачи должно быть достаточно комментариев для понимания кода программы;
  4. самостоятельно (на основе решенных в аудитории задач) выполнять решение дополнительных задач, заданных преподавателем по изучаемому разделу;
  5. проходить тестирование по изученным разделам для контроля своих знаний.


АТТЕСТАЦИЯ КАЧЕСТВА УСВОЕНИЯ ЗНАНИЙ