
- •1.Моделированьепроцесса решения.
- •2. Формализация процесса решения задачи.
- •1) Поиск решения эквивалентной задачи.
- •3.Интуитивное понятие алгоритма.
- •4.Основные свойства алгоритма.
- •5.Взаимосвязь между набором элементарных операций и исполнителем алгоритма.
- •6. Способы изображения алгоритма.
- •7.Введение в язык Си: истоки, парадигма программирования (отношение между набором алгоритмов и набором данных в программах).
- •8.Структура программ на языке Си. Директива процессора, комментарии.
- •11. Описание переменной: имя переменной; строчные и прописные буквы в идентификаторах, задание начального значения (инициализация).
- •15.Преобразование операндов в арифметических выражениях.
- •16.Сложние объявления и элементы объявления.
- •17.Указатели (2 категории).
- •19. Оператор постфиксного увеличения/ уменьшения.
- •20. Оператор префиксного увеличения/ уменьшения.
- •21. Простой оператор присваивания.
- •22. Составные операторы присвоения.
- •23. Условный оператор if.
- •24. Оператор выбора switch.
- •25. Понятие массива, описание массива, размерность массива, размещение в памяти.
- •26. Описание массива имеет вид:
- •27. Массивы символов и литеральные строки.
- •28. Операторы цикла (for, while и do-while) для работы с массивами.
- •29. Многомерные массивы: описание, размещение в памяти, инициализация, обращение к элементам.
- •30. Взаимосвязь массивов и указателей. Описание указателя.
- •32. Указатель типа void*. Преобразование указателя операцией приведения типа.
- •33. Доступ к переменным через указатели: операция & и операция *.
- •37.Синтаксис объявления (--заголовка, --прототипа ) функции. Оператор return
- •38. Понятие формальных параметров и фактических аргументов (при вызове ф-ции). Переменное число аргументов или аргументы с изменяющимися типами (многоточие).
- •39. Указатель на функцию
- •40. Перегрузка функций
- •41. Итерпритация сложных описаний изнутри наружу.
38. Понятие формальных параметров и фактических аргументов (при вызове ф-ции). Переменное число аргументов или аргументы с изменяющимися типами (многоточие).
Если ф-ция имеет аргументы, следует объявить переменные, которые будут принимать их зн-ия. Эти переменные называют формальными. Внутри ф-ции они ничем не отличаются от локальных.
Локальные переменные ф-ции размещаются в стеке, после окончания выполнения ф-ции стек-поинтер перейдет в начало стека, и область память, отводившаяся на лок. перем. снова станет «свободной».
Фактический параметр — аргумент, передаваемый в функцию при ее вызове.
int main(void){
…
myfunc(10,-4.5); //10, -4.5 -фактические параметры.
…}
myfunc (int a, float b)
{…
} //a, b – формальные парам-ы
Список выражений – это список фактических аргументов (любая величина основного типа, структура, перечисление, объединение или указатель, в том числе на массив или ф-цию)
При вызове вычисляются выражения в списке, сравниваются с типом соответствующих формальных парам-ов, если они не совпадают, то производится попытка преобразования к типу формального параметра, в случае неудачи – сообщение об ошибке, если эл-т в списке является вызовом ф-ции (суперпозиция), то он имеет тип и зн-ие возвращаемого рез-а ф-ции.
int f1(int k, char *, …); //ф-ция имеет переменное число парам, типы которых не контролируются в отличии от фиксированных парам-ов
printf( char * format, …);
39. Указатель на функцию
Действенным механизмом языка С являются указатели на функции (function pointed). Несмотря на то что функция не является переменной , она располагается в памяти, и , следовательно, ее адрес можно присваивать указателю. Этот адрес считается точкой входа в функцию. Именно он используется при ее вызове. Поскольку указатель может ссылаться на функцию, ее можно вызвать с помощью этого указателя. Это также позволяет передавать функции другим функциям в качестве аргументов.
Адрес функции задается ее именем, указанным без скобок и аргументов.
Пример: #include<iostream> using namespace std; int plus(int a, int b); int minus(int a, int b); int multiplication(int a, int b); int main() { int select; int a,b; cout<<"Enter a\n"; cin>>a; cout<<"Enter b\n"; cin>>b; typedef int (*PF)(int,int); cout<<"Choose option:\n0 +\n1 -\n2 *\n"; PF option[]={&plus, &minus,&multiplication}; cin>>select; cout<<"Result:\n"; cout<<option[select](a,b);} int plus(int a, int b)
{ return a+b; } int minus(int a, int b)
{ return a-b; } int multiplication(int a, int b)
{ return a*b; }
40. Перегрузка функций
Использование одного имени для похожих действий над различными типами параметров называется перегрузкой функции: · void print(int); · void print(char*); Порядок поиска функции среди перегруженных: 1. Если точного соответствия типов не найдено, то выполняется приведение младшего типа к старшему: char в int, float в double и т.д. 2. Далее выполняются стандартные преобразования типов, например int в double, указатель в void. 3. Далее выполняется преобразования типов, заданные пользователем, а также поиск соответствий за счет переменного числа аргументов функций. Если соответствие может быть получено на данном этапе более, чем одним способом, то вызов считается неоднозначным, и выдается сообщение об ошибке. Неоднозначности могут появится при: · Преобразовании типа; · Использовании параметров-ссылок; · Использовании аргументов по-умолчанию. Правила преобразования типов применяются не полностью, остаются: · int -> long; · int -> double; · 0 -> long; · 0 -> double; · 0 -> void* · Указатель на производный класс -> указатель на базовый класс. При перегрузке учитываются следующие ограничения: 1) Не могут перегружаться функции, имеющие одинаковые типы параметров, но разные типы возвращаемых значений: int max(int,*int); int *max(int,*int); float max(int,*int); 2) Не могут перегружаться функции, имеющие неявно-совпадающие типы параметров, например int <=> &int, float <=> &float: Пример: #include <iostream.h> int func1(int a, int b); float func1(float a, float b); void main(void) {int a=25, b=40; float c=2.45, d=6.15; cout<<”\ n Sum=”<<func1(a,b); cout<<”\n Разность =”<<func1(c,d); } int func1(int p1, int p2) {return (p1+p2);} float func1(float t1, float t2) {return (t1-t2);}