- •1. Основные этапы решения задач на эвм
- •Формулировка задачи
- •Математическая постановка задачи
- •Разработка алгоритма решения задачи
- •Написание текста программы на языке программирования
- •Ввод текста программы в эвм
- •Поиск и устранение синтаксических ошибок
- •Тестирование программы. Поиск и устранение логических ошибок в программе
- •Этапы создания исполняемой программы
- •Базовые компоненты программ
- •Буквы и цифры
- •Пробельные символы
- •Знаки пунктуации и специальные символы
- •Идентификаторы
- •Ключевые слова
- •Комментарии
- •Лексемы
- •Типы данных
- •Целые константы
- •Константы с плавающей точкой
- •Константа-символ
- •Строковые литералы
- •Универсальные функции ввода и вывода любых типов данных
- •Структуры и форма написания программы
- •Программирование разветвляющихся вычислительных процессов
- •Цикл while – цикл с предусловием.
- •Цикл do while – цикл с постусловием
- •Цикл for
- •Безусловная передача управления внутри цикла
- •Описание некоторых стандартов алгоритмов
- •Работа с файлами (функции ввода вывода верхнего уровня)
- •Указатели
- •Одномерные массивы Объявление массива.
- •Стандартные функции обработки строк
- •Многомерные массивы на примере двумерных
- •Классы памяти
- •Способы передачи данных в функцию
- •Функции и строки
- •Функции и одномерные числовые массивы
- •Функции и двумерные массивы
- •Функции с параметрами по умолчанию
- •Перегрузка функции
- •Шаблоны функции
- •Типы данных, определяемые пользователем
- •4.1. Структуры
- •Шаблон структуры
- •Структурные переменные
- •Инициализация структуры
- •Доступ к полям структуры
- •Массив структур
- •Вложенные структуры
- •Битовые поля структур
- •Передача структуры в функцию
- •Двоичный ввод-вывод структур
- •Функции двоичного ввода-вывода
- •Динамические структуры данных
- •4.2. Объединения
- •4.3. Перечисления
- •Файловые операции ввода/вывода
- •Файловый ввод/вывод с прямым доступом
Функции с параметрами по умолчанию
Иногда при объявлении функции, конкретное значение аргумента может быть известно заранее, тогда оно указывается в заголовке функции и не передается при вызове
getline(char*p, int n, char s='\n');
Функция может быть вызвана с двумя аргументами, при этом третий принимается по умолчанию. Или с тремя аргументами.
Параметры по умолчанию назначаются с конца списка параметров.
Перегрузка функции
Удобно когда функции, реализующие одно и то же действие для разных данных, имели бы одно и то же имя.
Использование нескольких функций с одним и тем же именем, но с разным списком параметров - называется перегрузкой функции. Список параметров должен отличаться либо количеством, либо типами, либо тем и другим. Тип функции не участвует в перегрузке. Компилятор определяет какую функцию вызвали по набору аргументов, при этом вызов должен быть однозначным.
Неоднозначность может возникнуть при:
1. Преобразовании типа
2. Использовании параметров ссылок
3. Использовании параметров по умолчанию
1
/
float f(float a);
double f(double a);
int main (void)
{
int a =...;
float b =...;
double c =...;
f (b);
f (c);
f (a); // неоднозначность. возникнет ошибка компиляции
f ((double)a); // таким образом можно устранить неоднозначность
return 0;
}
2
/
void f1(int a);
void f1(int&a);
int main (void)
{
int a =...;
f1(a); // неоднозначность
return 0;
}
3
/
void f2 (int a);
int f2 (int a, int b=3);
int main (void)
{
int a =...;
f2(a); // неоднозначность
return 0;
}
Шаблоны функции
Многие алгоритмы не зависят от типов данных, с которыми они работают. С помощью шаблона функции можно определить алгоритм, который будет применяться к данным различного типа. Формат функции шаблона:
template <class T>
имя функции
{
тело функции
}
T - имя параметризованного типа, который используется в имени функции при объявлении параметров и внутри тела функции при объявлении дополнительных переменных. Шаблон может содержать несколько параметризованных типов.
Пример:
Написать функцию-шаблон для вывода двумерного массива на экран.
Функция должна выводить двумерный массив любого типа, следовательно, параметризованный тип выражает тип массива
shablon.h
----------------------
#ifndef SHABLON_H
#define SHABLON_H
#include<iostream> //подключение системных средств для
using namespace std; //возможности использовать потоки ввода-вывода
#include <iomanip>
template <class T>
void OutMas(T*p,int n,int m) {
int i,j;
for (i=0; i<n;i++) {
for (j=0; j<m;j++) {
cout << setw(5) << *(p+i*m+j);
}
cout << endl;
}
return;
}
#endif
----------------------
main.cpp
----------------------
#include<iostream> //подключение системных средств для
using namespace std; //возможности использовать потоки ввода-вывода
#include "shablon.h"
int main (void)
{
int A[2][3]= {1,2,3,4,5,6};
double B[3][3] = {1.5,2.6,3.7,4.8};
cout << "\n Целый массив:\n";
OutMas(A[0],2,3);
cout << "\n Дробный массив:\n";
OutMas(B[0],3,3);
return 0;
}
----------------------
При компиляции этой программы компилятор по вызову функции первый раз, определяет, что тип массива - целый и создает экземпляр функции OutMas, заменяя имя параметризованного типа T на int. Аналогично, видя вызов функции с типом массива - double, компилятор создает еще один экземпляр функции OutMas, заменяя T на double. Процесс создания экземпляра функции называется инстанцирование.
Если имя параметризованного типа не участвует в параметрах, его конкретное значение не может быть определено по умолчанию из вызова функции и должно быть задано явным образом.
Например: OutMas <int>(A[0],2,3);