- •1) Базовые элементы языка с. Алфавит и словарь языка (в1б1, в3б3)
- •2) Основные типы данных. Классификация их типов. Модификация базовых типов. (в1б2, в3б17)
- •3) Константы (в1б3, в3б2)
- •4) Переменные (в1б4, в3б16)
- •5) Структура с-программы. Понятие локальных и глобальных переменных. Функция main(). Директивы препроцессора (# include и #define). Комментарии. (в1б5, в3б1)
- •6) Операции языка с. Арифметические, логические операции. Поразрядные операции. (в1б6, в3б15)
- •7. Операции языка с. Операция присваивания и отношения. Операция определения размера. Оператор последовательного вычисления. (в1б7, в2б30)
- •8. Операции языка с. Условная операция. Операция (), операция []. (в1б8, в3б14)
- •9) Приоритет операций и порядок вычислений (в1б9, в2б29)
- •10) Основные сведения о вводе-выводе. (в1б10, в3б13)
- •11) Ввод-вывод символов (в1б11, в2б28)
- •12) Форматированный ввод-вывод. Модификаторы формата. Спецификаторы преобразования. Подавление ввода. (в3б12, в1б12)
- •13) Операторы языка с. Условные операторы (if, switch). (в1б13, в2б27)
- •14) Операторы цикла (while, for, do while )(в1б14, в3б11)
- •15) Операторы безусловного перехода ( break, continue, go to, return) (в1б15, в2б26)
- •16) Одномерные массивы. (в1б16, в3б10)
- •17) Строковый литерал. Чтение и запись строк. (в1б17, в2б25)
- •18)Двухмерные массивы. Массивы строк (в1б18, в3б9)
- •19) Инициализация массива. (в1б19, в2б24)
- •20) Способы доступа к элементом массива. (в1б20, в3б8)
- •22) Указательные переменные. Операции получения адреса (&) и раскрытие ссылка (*) (в1б22, в3б7)
- •23) Указательные выражения. Адресная арифметика. (в1б23, в2б22)
- •24) Связь массивов и указателей (в1б24,в3б6)
- •25) Функции динамического распределения памяти (в1б25, в2б21)
- •26) Динамическое выделение памяти для массивов. (в1б26, в3б5)
- •27) Функции. Определения функций. Оператор return.( в1б27, в3б20)
- •28) Функции. Прототипы функции. (в1б28, в3б4)
- •29) Функции. Вызов функций: вызов по значению и по ссылке. (в1б29, в2б19)
- •30) Передача массива в функцию. (в1б30, в3б27)
- •31) Классы памяти. Область видимости. (в2б1, в3б28)
- •32) Аргумент функции main(): argv и argc (в2б2, в3б26)
- •33) Рекурсия. (в2б3, в3б29)
- •34) Вызов библиотечных функций(в2б4, в3б25)
- •35) Директива препроцессора #define: создание макрофункций с помощью директивы #define (в2б5, в3б30)
- •36) Директивы условной компиляции #if, #else, #elif, #endif, #ifdef, #ifndef (в2б6, в3б24)
- •37) Понятие структуры. Доступ к членом структуры (в2б7)
- •38) Присваивание структур (в2б8, в3б23)
- •39) Массивы структуры(в2б9)
- •40) Передача членов структур функциям. Передача целых структур функциям. (в2б10, в3б22)
- •41) Указатели на структуры. Средство typedef (в2б11)
- •42) Понятие объединение и перечисления. Битовые поля. (в2б12,в3б21)
- •44) Методы поиска: последовательный и двоичный поиск. (в2б14, в3б20)
- •45) Основы файловой системы. Стандартные потоки. Указатель файла. Открытые файлы. Закрытые файлы. (в2б15)
- •46) Форматированный ввод-вывод в файл (в2б16, в2б17, в3б19)
- •48) Понятие очереди, стеков, связанных списков и деревьев. (в2б12, в3б18)
26) Динамическое выделение памяти для массивов. (в1б26, в3б5)
При динамическом распределении памяти для массивов следует описать соответствующий указатель и присваивать ему значение при помощи функции calloc. Одномерный массив a[10] из элементов типа float можно создать следующим образом :
float *a;
a=(float*)(calloc(10,sizeof(float));
Для создания двумерного массива вначале нужно распределить память для массива указателей на одномерные массивы, а затем распределять память для одномерных массивов. Пусть, например, требуется создать массив a[n][m], это можно сделать при помощи следующего фрагмента программы:
#include
main () {
double **a;
int n,m,i;
scanf("%d %d",&n,&m);
a=(double **)calloc(m,sizeof(double *));
for (i=0; i<=m; i++)
a[i]=(double *)calloc(n,sizeof(double)); . . . . . . . . . . . .
}
Аналогичным образом можно распределить память и для трехмерного массива размером n,m,l. Следует только помнить, что ненужную для дальнейшего выполнения программы память следует освобождать при
помощи функции free.
#include
main ()
{
long ***a;
int n,m,l,i,j;
scanf("%d %d %d",&n,&m,&l);
/* -------- распределение памяти -------- */
a=(long ***)calloc(m,sizeof(long **));
for (i=0; i<=m; i++)
{
a[i]=(long **)calloc(n,sizeof(long *));
for (j=0; i<=l; j++)
a[i][j]=(long *)calloc(l,sizeof(long));
} . . . . . . . . . . . .
/* --------- освобождение памяти ----------*/
for (i=0; i<=m; i++)
{
for (j=0; j<=l; j++)
free (a[i][j]);
free (a[i]);
}
free (a);
}
27) Функции. Определения функций. Оператор return.( в1б27, в3б20)
Определения функций
Определение функции задает тип возвращаемого значения, имя функции, типы и число формальных параметров, а также объявления переменных и операторы, называемые телом функции, и определяющие действие функции. В определении функции также может быть задан класс памяти. В соответствии с синтаксисом языка С определение функции имеет следующую форму:
[спецификатор-класса-памяти] [спецификатор-типа] имя-функции
([список-формальных-параметров])
{ тело-функции }
Необязательный спецификатор-класса-памяти задает класс памяти функции, который может быть static (видимость в пределах модуля, в котором определена функция) или extern (глобальная видимость во
всех модулях программы по умолчанию).
Спецификатор-типа функции задает тип возвращаемого значения и может задавать любой тип. Если спецификатор-типа не задан, то предполагается, что функция возвращает значение типа int.
Список-формальных-параметров – это последовательность объявлений формальных параметров, разделенная запятыми. Формальные параметры – это переменные, используемые внутри тела функции и получающие значение при вызове функции путем копирования в них значений соответствующих
фактических параметров. Список-формальных-параметров может заканчиваться запятой (,) или запятой с многоточием (,...), это означает, что число аргументов функции переменно. Однако предполагается, что функция имеет, по крайней мере, столько обязательных аргументов, сколько формальных параметров задано перед последней запятой в списке параметров. Такой функции может быть передано большее число аргументов, но над дополнительными аргументами не проводится контроль типов.
Тело функции – это составной оператор, содержащий операторы, определяющие действие функции.
Пример:
#include
int sqr(int x);
int main(void)
{
int t = 10;
printf("%d%d", sqr(t), t);
}
int sqr(int x);
{
x = x*x;
return(x);
}
Функция возвращает значение, если ее выполнение заканчивается оператором
return [выражение];
Указанное выражение вычисляется, преобразуется, если необходимо, к типу возвращаемого значения и возвращается в точку вызова функции в качестве результата. Если оператор return не содержит выражения или выполнение функции завершается после выполнения последнего ее оператора (без
выполнения оператора return), то возвращаемое значение не определено. Для функций, не использующих возвращаемое значение, должен быть использован тип void, указывающий на отсутствие возвращаемого значения. Если функция определена как функция, возвращающая некоторое значение, а в операторе return при выходе из нее отсутствует выражение, то поведение вызывающей функции после передачи ей управления может быть непредсказуемым.
Пример:
int f1(){return 1;} // эта запись правильная
void f2(){return 1;} // неправильно, f2 не должна возвращать значение
double f3(){return 1;} //правильно: 1 преобразуется к типу double
Функция не может возвращать массив или функцию, но может возвращать указатель на любой тип, в том числе и на массив и на функцию.