- •3. Правила формального описания синтаксиса языка программирования
- •5. Идентификаторы языка Си
- •6. Понятие функции. Стандартная функция printf.
- •7. Стандартная функция scanf
- •8. Простейшие арифметические операции.
- •9. Операция присваивания. Оператор - выражение.
- •10. Использование в выражениях операндов разных типов. Операция преобразования типов.
- •11. Стандартные математические функции.
- •12. Простейшие функции, определяемые программистом.
- •13. Дополнительные арифметические операции. Дополнительные операции присваивания.
- •14. Побитовые операции.
- •15. Операции отношения. Операция определения размера данных.
- •16. Приоритеты операций.
- •17. Понятие о препроцессоре языка Си: директива «include», директива «define».
- •18. Основные положения структурного программирования. Понятие оператора (statement). Пустой и составной операторы.
- •19. Условный оператор и условная операция.
- •20. Оператор цикла «while». Оператор прерывания цикла. Оператор продолжения цикла. Множественный выбор. Оператор переключения.
- •21. Оператор цикла «do-while».
- •22.Перечисления. Работа с клавиатурой ibm pc
- •23. Массивы. Описание массива.
- •24. Ввод-вывод массива
- •25. Инициализация массива
- •26. Программа вычисления длины строки символов
- •32. Двумерные массивы (массивы массивов)
- •32. Адресная арифметика языка Си
- •33. Указатели и одномерные массивы
- •34. Указатели и двумерные массивы
- •35. Указатели и функции
- •36. Оператор typedef
- •39. Области видимости и глобальные данные
- •40. Время жизни переменных и классы памяти языка Си
- •41. Передача аргументов в функцию
- •42. Возврат значений из функций
- •47. Общий случай двумерного массива.
- •48. Особенности работы с массивами большого размера
- •49. Описание структуры.
- •50. Трактовка имени структуры.
- •51. Доступ к элементу структуры.
- •52. Инициализация структур.
- •53. Структуры и функции.
- •54. Поля бит в структурах.
- •55. Объединения.
- •56. Динамические данные.
- •57. Линейные списки.
- •58. Организация данных в виде стека.
- •59. Организация данных в виде очереди.
- •60. Организация данных в виде деревьев.
41. Передача аргументов в функцию
В правильно организованной функции использование списка аргументов (параметров) и возвращаемого значения является единственным способом связи этой функции с остальными.
При вызове функции в стеке создаются локальные переменные соответствующие по типу формальным параметрам функции. Затем они инициализируются значениями фактических параметров, задаваемых при вызове функции строго в том порядке в котором они перечислены.
42. Возврат значений из функций
Возврат единственного значения можно осуществить с помощью оператора return. При этом результат возвратится как значение самой функции и должен иметь соответствующий тип.
Если же необходимо вернуть несколько значений, поступают одним из следующих образов:
1)"Запаковать" в структуру и вернуть как единое целое.
2)Передавать в списке аргументов не копии, а адреса пользовательских переменных (указатели).
3)В исключительных случаях прибегают к глобальным переменным.
43. Стандартные функции управления динамической памятью
Динамическая память выделяется и уничтожается блоками по требованию программиста. Делается это с помощью специальных функций описанных в заголовочном файле malloc.h
1. void* malloc(size_t size);// эта функция выделяет блок размера size байт. В случае успеха возвращает адрес начала выделенного блока, в случае неудачи NULL. 2. void* calloc(size_t n_items,size_t size);//size - размер одного элемента, n_items - кол-во элементов. 3.void free(void *block); //особождает память блока block. В качаестве аргумента функции free можно передовать один из адресов, выделенных ф-ми malloc и calloc. Повторно освобождать память запрещается (действие непредсказуемо). 4.void *realloc(void *block,size_t new_size);//перевыделяет память и гарантирует сохранность старых элементов в рамках new_size. 5.unsigned long coreleft(); //возвращает остаток динамической памяти правее самого старшего занятого участка (не общее кол-во)
44. Пример использования динамической памяти printf("Введите количество элементов массивов: "); scanf("%d",&n); double *p=NULL; p=(double *)Malloc(n*sizeof(double)); for(int i=0;i<n;i++) { p[i]=...;
}
free(p);
45. Пересчет индексов вручную.
Пользуясь тем, что строки двумерного массива располагаются в памяти друг за другом мы можем аналагично организовать работу с динамическим двумерным массивом, в этом случае требуется пересчет индексов i j в одномерный k. k=i*n+j, l=n*m Способ индексации одинаков как в вызывающей функции, так и в вызываемых.
void RandomMatr (double *Matr, int n, int m)
{
int i, j;
for(i = 0; i < n; i++)
for(j = 0; j < m; j++)
Matr[i*m+j] = random(MAXVAL) + 1;
}
void OutMatr( char *name, double *Matr, int n, int m )
{
int i, j;
printf("\nМатрица %s\n---------------\n", name);
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
printf("%8.1lf ", Matr[i*m+j]);
printf("\n");
}
}
46. Массивы с постоянной длиной строки. Если длина строки постоянна и известна на стадии компиляции, то можно описать указатель на массив постоянной длины строки и использовать обычную двойную индексацию, при этом память нужно выделить динамически а потом освободить.