- •1. Основные понятия информатики
- •1.1. Понятие и задачи информатики
- •1.2. Системы счисления
- •1.2.1. Двоичная система счисления
- •1.2.2. Восьмеричная система счисления
- •1.2.3. Шестнадцатеричная система
- •1.3. Обобщенная структура и состав персонального компьютера
- •1.4. Организация вычислительных процессов при решении инженерных задач
- •1.5.1. Алгоритм: основные свойства и способы представления
- •1.5.2. Базовые элементы и структуры программирования
- •1.5. Алгоритмы
- •1.5.3. Представление линейных, разветвленных и циклических структур
- •2. ОБщие сведения об операционных системах
- •2.1. Общие сведения об операционных системах
- •2.1.1. Предпосылки создания и краткая история операционных систем ms-dos и Windows
- •2.1.1.1. Операционная система ms-dos
- •2.1.1.2. История создания операционной системы Windows
- •2.1.2. Основные отличия версий операционных систем
- •2.1.2.1. Операционная система Mac os
- •2.1.1.2. Операционная система Linux
- •2.1.1.3. Операционная система Windows
- •2.1.3. Основные команды операционной системы ms-dos
- •2.2. Основные элементы интерфейса операционной системы Windows
- •2.2.1. Элементы интерфейса ос Windows
- •2.2.2. Работа с файловыми системами операционной системы
- •3.2. Элементы языка с
- •3.2.1. Алфавит языка с (используемые символы)
- •3.2.2. Идентификаторы
- •3.2.3. Константы
- •3.2.4. Ключевые слова
- •3.2.5. Знаки операций
- •3.2.6. Комментарии
- •3.3. Лекция 6. Типы данных и их объявление
- •3.3.1. Основные типы данных
- •3.3.2. Объявление типов данных
- •3.4. Лекция 7. Указатели и массивы
- •3.4.1. Объявление указателей
- •3.4.2. Инициализация указателей
- •3.4.3. Составные указатели
- •3.4.4. Операции над указателями
- •3.4.5. Ссылки
- •3.5. Лекция 8. Массивы
- •3.5.1. Одномерные массивы
- •3.5.2. Многомерные массивы
- •3.5.3. Динамические массивы
- •3.5.3.1. Одномерные динамические массивы
- •3.5.3.2. Динамический многомерный массив
- •3.5.4. Символьные массивы (строки)
- •3.6. Лекция 9. Выражения и присваивания
- •3.6.1. Операции инкремента и декремента (увеличения и уменьшения на 1)
- •3.6.2. Операция определения размера типа
- •3.6.4. Операции деления ( / ) и нахождения остатка от деления ( % )
- •3.6.7. Поразрядные операции
- •3.6.8. Логические операции
- •3.6.9. Операции присваивания
- •3.6.10. Условная операция
- •3.6.11. Приоритеты выполнения операций
- •3.6.12. Преобразование типов
- •3.7. Лекция 10. Операторы
- •3.7.1. Операторы ветвления
- •3.7.1.1. Условный оператор if
- •If (выражение) [оператор_1]; [ else оператор_2 ; ]
- •3.7.1.2. Оператор switch
- •3.7.2. Операторы цикла
- •3.7.2.1. Цикл с предусловием (while)
- •3.7.2.2. Цикл с постусловием (do while)
- •3.7.2.3. Цикл с параметрами ( for )
- •3.7.3. Операторы передачи управления
- •3.7.3.1. Оператор безусловного перехода goto
- •3.7.3.2. Оператор прерывания break
- •3.7.3.3. Оператор пропуска continue
- •3.7.3.4. Оператор возврата из функции return
- •4. Модульное программирование
- •4.1. Лекция 11. Функции
- •4.1.1. Объявление функций
- •4.1.2. Определение функций
- •4.1.3. Вызов функций
- •4.1.4. Передача параметров в функцию
- •4.1.5. Передача массивов в функцию
- •В примере:
- •4.1.6. Функции с переменным числом параметров
- •4.1.7. Рекурсивные функции
- •4.1.8. Функция main()
- •4.1.9. Перегрузка функций
- •4.1.10. Шаблоны функций
- •4.2. Лекция 12. Директивы препроцессора
- •4.2.1. Директива #include
- •4.2.1. Директива # define
- •4.2.3. Директивы условной компиляции
- •4.2.4. Директивы #undef
- •4.3. Лекция 13. Пользовательские типы данных
- •4.3.1. Переименование типов
- •4.3.2. Перечисления
- •4.3.3. Структуры
- •4.3.4. Битовые поля
- •4.3.5. Объединения
- •5. Программирование графических изображений в языке с
- •5.1. Лекция 14. Программирование графических изображений
- •5.1.1. Графический режим видеоадаптера
- •5.1.2. Функции управления графическим окном
- •5.1.3. Управление цветом и стилем заполнения фигур
- •5.1.4. Рисование простейших графических фигур
- •5.1.5. Отображение текстовой информации в графическом режиме
- •5.1.7. Преобразование координат и анимационные эффекты
- •6.1.1.3. Функция gets()
- •6.1.1.4. Функция puts()
- •6.1.1.5. Функции printf() и scanf()
- •Потоковые объекты ввода/вывода (форматируемые):
- •6.1.2.1 Форматирование данных с помощью флагов и методов
- •6.2. Функции файлового ввода и вывода
- •6.2.1. Файловый ввод и вывод средствами с
- •6.3. Строки: операции с текстовыми файлами
- •6.3.1. Операции над строками
- •6.3.2. Методы и функции ввода и вывода строк
- •6.4. Лекция 18. Операции со структурами и бинарными файлами
- •6.5. Лекция 19. Списки: операции с динамическими структурами данных; организация списков и их обработка
- •6.5.1. Линейные списки
- •6.5.2. Стеки
- •6.5.3. Очередь
- •6.5.4. Бинарные деревья
4.1.9. Перегрузка функций
Использование нескольких функций с одним и тем же именем, но с различными типами параметров называется перегрузкой функции.
Компилятор по типу фактических параметров (аргументов) определяет, какую именно функцию следует вызвать. Если точного соответствия не найдено, то выполняется продвижение типов в соответствии с правилами (см. пункт 3.6.12, тема 3). После этого выполняются преобразования типов и т.д.
Если соответствие на одном этапе получается более чем одним способом, то возникает неоднозначность вызова.
Избежать неоднозначности можно используя явное преобразование типов аргументов.
Примеры:
/* 1) Перегрузка функций */
…
// Имеется 4-е варианта функции, определяющей наибольшее знач-е
int max(int , int) ; // (1) наибольшее из двух целых
char* max(char* , char*) ; // (2) наиболее длинная из двух строк
int max(int , char*) ; // (3) наибольшее из 1-го и длины 2-го
int max(char* , int) ; // (4) наибольшее из длины 1-го и 2-го
…
void func(int a , int b , char* c , char* d)
{ cout<<max(a , b)<<max(с , d)<<max(a , c)<< max(d , b);
} // (1) (2) (3) (4)
…
В примере:
— выбор варианта функции max осуществляется на этапе компиляции программы в соответствии с типом фактических параметров (аргументов);
— в данном примере все четыре варианта функции вызываются последовательно.
/* 2) Перегрузка функций (неоднозначность) */
#include <iostream.h>
float f(float i)
{
cout<< ''Function float f(float i)'' << endl ;
return i ;
}
double f(double i)
{
cout<< ''Function double f(float i)'' << endl ;
return i+2 ;
}
int main()
{
float x=10.09 ;
double y=10.09 ;
cout<< f(x) << endl ; // вызывается f (float)
cout<< f(y) << endl ; // вызывается f (double)
cout<< f(10) << endl ; // возникает неоднозначность
// преобразования 10 во float
// или double
return 0 ;
}
В примере:
При вызове функции f(10) возникает неоднозначность и компилятор выдает ошибку. Для устранения неоднозначности в примере требуется '10’ преобразовать явным образом к требуемому типу f(float(10)) или f(double(10)).
Правила описания перегруженных функций:
1. Перегруженные функции должны находиться в одной области видимости, иначе произойдет сокрытие функций аналогично одинаковым именам переменных во вложенных блоках (в операторах, функциях и т.п.).
2. Перегруженные функции могут иметь параметры по умолчанию, при этом значения одного и того же параметра в разных функциях должны совпадать. В различных вариантах перегруженных функций может быть различное количество параметров по умолчанию.
3. Функции не могут быть перегружены, если описание их параметров отличается только модификаторами const или использованием ссылки:
int и const int
или
int и int & .
4.1.10. Шаблоны функций
Шаблоны функций предназначены:
— для повышения эффективности программы, содержащей однотипную обработку данных различных типов, например, сортировка чисел типа int и double;
— чтобы не возникало необходимости создавать несколько перегружаемых функций с полностью одинаковыми алгоритмами обработки данных.
Шаблон функций — это программно расписанный алгоритм, применяемый к данным различных типов.
Вызов функции, который использует конкретный тип данных, приводит к созданию компилятором кода для соответствующей версии функции. Этот процесс называется созданием экземпляра (instantiation) шаблона.
Формат определения шаблона функции:
template <class список_типов> имя_функции (список параметров)
{
/* тело функции */
}
Здесь:
список_типов — список типов, которые определяются при вызове функции;
список параметров — список параметров, передаваемых в функцию.
Примечания:
1. Конкретный тип данных передаётся функции в виде параметров на этапе компиляции. Компилятор автоматически генерирует правильный код, соответствующий переданному в функцию типу, т.е. создается функция, которая автоматически перегружает сама себя.
2. В общем случае шаблон функции может содержать несколько параметров, каждый из которых может быть не только типом, но и просто переменной:
template <class TypeA , class TypeB>
void f(TypeA x, TypeB y, int i) { … }
3. При вызове шаблона функции на месте параметра шаблона, являющегося не типом, а переменной, должно указываться константное выражение.
4. Типы параметров, передаваемых в функцию при вызове шаблона функции, могут определяться автоматически. А могут быть установлены принудительно («вручную»).
Пример:
/* Автоматическое определение типа параметров функции */
#include <iostream.h>
template <class Type> void SortVybor(Type *b, int n);
main() { const int n=20;
int i, b[n] ;
double a[n] ;
for (i=1; i<n; i++) cin>>b[i] ;
SortVybor(b, n) ; //сорт-ка целочисленного массива
for (i=1; i<n; i++) cin>>a[i] ;
SortVybor(a, n) ; // сорт-ка вещественного массива
return 0;
}
/* Шаблон функции сортировки методом прямого выбора: */
template <class Type> void SortVybor (Type *b, int n)
{
Type a; // буфер для обмена элементов
int imin ; // номер наименьш. эл-та в исходн. массиве
for (int i=0 ; i<n–1 ; i++)
{ imin=i ;
for (int j=i+1 ; j<n ; j++) // выбор
if (b[j]<b[imin]) imin=j ; // наименьшего
a=b[i] ; b[i]=b[imin] ; b[imin]=a ; // и обмен
}
}
/* Принудительное определение типа параметров функции */
// Шаблон функции определен как
template <class X, class Y, class Z> void Func(Y, Z) ;
// Вызовы функции:
Func <int, char*, float> (“University”, 3.3); //1
Func <int, char*> (“University”, 3.3); //2
Func <int> (“University”, 3.3); //3
Func (“University”, 3.3); //4
Здесь:
//1 — все определено программистом;
//2 — принудительно определены X и Y, параметр Z определен автоматически как double;
//3 — принудительно определен X, автоматически определены Y — char*, Z — double;
//4 — ОШИБКА: невозможно определить тип X
