- •Структура программы на языке Си. Этапы выполнения программы
- •1.1. Алфавит языка Си
- •1.3. Идентификаторы и ключевые слова
- •1.4. Знаки операций
- •2. Переменные и константы. Типы данных
- •2.1. Основные типы данных
- •2.2. Декларация (объявление) объектов
- •2.4. Целочисленные константы
- •2.5. Константы вещественного типа
- •2.6. Символьные константы
- •2.7. Строковые константы
- •3. Обзор операций
- •3.2. Арифметические операции
- •3.3. Операции сравнения
- •3.4. Логические операции
- •4.1. Операция присваивания
- •Примеры недопустимых выражений:
- •4.2. Сокращенная запись операции присваивания
- •4.3. Преобразование типов операндов бинарных операций
- •4.4. Преобразование типов при присваивании.
- •4.5. Операция явного приведения типа
- •4.6. Операция «,» (запятая)
- •5.3. Консольные функции вывода данных на экран
- •5.4. Консольные функции ввода информации
- •6. Операторы языка с.
- •7.1. Условные операторы
- •If (выражение) оператор;
- •If (выражение) оператор 1 ;
- •If (выражение 1) оператор 1;
- •If (выражение 2) оператор 2;
- •If (выражение 3) оператор 3;
- •7.2. Оператор выбора альтернатив (переключатель)
- •7.3. Условная операция «? :»
- •8. Составление циклических алгоритмов
- •8.1. Оператор с предусловием while
- •8.2. Оператор цикла с постусловием do – while
- •8.3. Оператор цикла с предусловием и коррекцией for
- •9. Операторы передачи управления.
- •9.1. Оператор безусловного перехода goto
- •9.2. Операторы continue, break и return
- •10. Массивы
- •10.1. Одномерные массивы
- •10.2. Примеры алгоритмов, использующих одномерные массивы.
- •10.3. Многомерные массивы
- •11.5. Операция sizeof
- •11.6. Побитовые логические операции. Операции над битами
- •12.1. Строки как нуль-терминированные массивы char.
- •12.4. Преобразования строковых типов.
- •13. Функции пользователя и классы памяти.
- •13.1. Сущность и предназначение функций.
- •13.2. Определение и вызов функции.
- •13.3. Прототип функции.
- •13.4. Область видимости.
- •13.5. Классы памяти объектов в языке Cи.
- •13.6. Разбиение программы на модули.
- •14. Структуры и объединения
- •14.1. Понятие структуры
- •14.2. Декларация структурного типа данных
- •14.3. Объявление структурных переменных
- •14.4. Обращение к полям структуры
- •14.5. Операции со структурой как единым целым
- •14.6. Вложенные структуры
- •14.7. Массивы структур
- •14.8. Размещение структурных переменных в памяти
- •14.10. Объединения
- •16. Файлы в языке с
- •16.1. Типы файлов.
- •16.2. Открытие файла
- •16.3. Закрытие файла
- •16.4. Запись - чтение информации
- •А) Посимвольный ввод-вывод
- •Б) Построчный и форматированный ввод-вывод
- •В) Блоковый ввод-вывод
- •Int fflush(file *stream);
- •16.5. Текстовые файлы
- •16.6. Перенаправление стандартного ввода-вывода
- •16.7. Бинарные файлы
- •16.8. Дополнительные полезные функции
- •16.9. Простейший пример создания собственной базы данных
- •17. Указатели
- •17.1. Определение указателей
- •17.2. Связь указателей и массивов.
- •17.3. Операции над указателями (косвенная адресация)
- •17.4. Операции над указателями (косвенная адресация)
- •17.5. Массивы указателей.
- •17.6. Указатели на указатели.
- •17.7 . Указатели как параметры функций.
- •Void f1(int, const double *);
- •17.8 . Указатели на структуры
- •17.10. Указатели на функции
- •Id_функции(список аргументов);
- •18.1. Динамическое выделение и освобождение памяти.
13.2. Определение и вызов функции.
Каждая функция в программе должна быть определена (только один раз). Определение функции – это код функции, включающий ее заголовок и полный текст функции. Оно имеет следующий вид:
тип_результата имя_функции ( список параметров )
{
код функции
return выражение;
}
Параметры - это переменные, доступные внутри функции, значения которым присваиваются при вызове функции. Результат - это значение, передаваемое из функции обратно в вызывающую программу. Таким образом, параметры являются "входными данными" функции, а результат - "выходными данными".
В языке Си каждая функция – это отдельный блок программы, вход в который возможен только через вызов (использование) данной функции. Такие вызовы могут находиться в различных местах программы и должны иметь следующий формат:
имя_функции (список аргументов);
где в качестве аргументов можно использовать константы, переменные, выражения. Аргументы при вызове функции будут подставляться на место параметров функции.
Пример:
Функция, определяющей наименьшее значение из двух целочисленных переменных:
int Min (int x, int y)
{
return x<y ? x : y;
}
Вызов такой функции может иметь вид:
int a,b,c;
...
a=Min(b,c);
Рассмотрим подробно составные части определения пользовательской функции.
Список параметров состоит из перечня типов и идентификаторов параметров, разделенных запятыми. Список параметров определяет объекты, которые требуется передать в функцию при ее вызове.
Список аргументов. в вызове также перечисляется в круглых скобках через запятую. При вызове функции параметрам будут присваиваться значения соответствующих аргументов, в порядке следования (первому параметру - значение первого аргумента, второму - второго и т.д.) Аргументы в списке вызова должны совпадать со списком параметров вызываемой функции по количеству и порядку следования, а типы аргументов при передаче в функцию будут преобразованы, если это возможно, к типу соответствующих им параметров.
Заметим, что в списке параметров перед каждым параметром нужно непосредственно указывать его тип - нельзя, например, писать (double x, y), а нужно писать (double x, double y).
Функция может не иметь параметров, но круглые скобки необходимы в любом случае (и в определении, и в вызове). Если у функции отсутствует список параметров, то при декларации такой функции можно (для наглядности) в круглых скобках указать тип void ("пустой"). Например, main(void){ ... }.
Тип результата определяет тип выражения, значение которого возвращается в точку вызова функции при помощи оператора возврата return выражение; Выражение, указанное в операторе return, преобразуется к типу_результата, указанному в заголовке функции, и передается в точку вызова. Чтобы в точке вызова использовать полученное значение результата, этот вызов должен находиться в составе какого-либо оператора (например, оператора присваивания, либо любого другого, аналогично использованию стандартных функций языка Си).
Тип возвращаемого функцией значения может быть любым базовым типом, а также указателем на массив или функцию (см. тему "Указатели"). Если функция не должна возвращать значение, указывается тип void ("пустой"). В данном случае оператор return можно не ставить. Из функции, которая не описана как void, необходимо возвращать значение, используя оператор return. Если тип функции не указан, то по умолчанию устанавливается тип int.
В функции может быть несколько операторов return (например, в разных ветвях оператора if): выполнение любого из них завершает работу функции и передает управление обратно в точку ее вызова. После выполнения последнего оператора кода функции также происходит возврат в точку вызова.
При вызове функции параметрам присваиваются значения аргументов. Обратного же присваивания при возврате из функции не происходит, поэтому изменение обычных параметров внутри функции не окажет влияние на значения аргументов. Передавать результаты работы из функции вовне надо либо с помощью оператора return, либо другими способами, описанными ниже (глобальные переменные; параметры-указатели).
В программе может быть много вызовов одной и той же функции. Каждый из них может находиться в любой другой функции. Он может находиться и в самой вызываемой функции: в этом случае функция будет вызывать сама себя. Такой прием программирования называется рекурсией; при этом, чтобы избежать зацикливания, в функции необходимо предусмотреть условие прекращения рекурсивных вызовов.
Заметим, что вызов функции называют также обращением к функции. Иногда параметры функции называют формальными параметрами, а аргументы - фактическими параметрами.
Задача 1. Вычислить выражение
#include<iostream.h>
#include<conio.h>
double fact(int m) { // Хотя факториал - целое число,
double f=1; int i; // используем тип double, т.к.
for (i=1; i<=m; i++) f*=i; // результат может выйти за пределы
return f; // диапазона типа int
}
void main(){
int N,K; double D;
cout<<"Vvedite N,K :";
cin>>N>>K;
D=fact(N)+fact(K)+fact(N+K);
cout<<D<<endl;
getch();
}
Задача 2. Вычислить синус, косинус, тангенс и котангенс введенного числа. Каждое вычисленное значение выводить в отдельной строке, а перед ним - строку из звездочек.
#include<iostream.h>
#include<conio.h>
#include<math.h>
void st(void){ cout<<"\n***********************************\n "; }
void main(){
double x;
cout<<"Vvedite x :";
cin>>x;
st();
cout<<"sin="<<sin(x);
st();
cout<<"cos="<<cos(x);
st();
cout<<"tg="<<tan(x);
st();
cout<<"ctg="<<1/tan(x)<<endl;
getch();
}
Результат работы программы (подчеркнуто число, введенное человеком):
Vvedite x :
3
***********************************
sin=0.14112
***********************************
cos=-0.989992
***********************************
tg=-0.142547
***********************************
ctg=-7.015253