- •Содержание
- •Лабораторная работа №1 Линейные и разветвляющиеся вычислительные процессы
- •Краткие теоретические сведения
- •Алфавит языка с
- •Классификация данных
- •Декларирование объектов
- •Структура программы
- •Функции вывода информации
- •Функции ввода информации
- •Стандартные математические функции
- •Операция присваивания
- •Операторы перехода
- •If (условие ) оператор1;
- •Оператор выбора switch
- •Пример линейного алгоритма
- •Пример использования оператора if
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Циклы типа while и do–while
- •Вложенные циклы
- •Контрольные вопросы
- •Строки, как одномерные массивы символов
- •Примеры использования стандартных функций работы со строками
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа №4 Многомерные массивы, указатели, динамическое распределение памяти
- •Указатели и операции над адресами
- •Операции над указателями (адресная арифметика)
- •Указатели на указатели
- •Таким образом, указатели на указатели – это имена многомерных массивов.
- •Массивы указателей
- •Динамическое размещенея данных
- •Контрольные вопросы
- •Лабораторная работа №5 Функции пользователя
- •Краткие теоретические сведения
- •Область действия переменных
- •Пример работы с функциями Ввести массив NxN (не больше 50) целых чисел и в функции посчитать сумму его положительных значений.
- •Контрольные вопросы
- •Лабораторная работа № 6 Программирование алгоритмов с использованием структур
- •Краткие теоретические сведения
- •Пример на использование структур
- •Контрольные вопросы
- •Лабораторная работа №7 Файлы в языке с.
- •Контрольные вопросы
- •Лабораторная работа №8 Графический режим работы в языке с.
- •Функции для подготовки графической системы
- •Основные функции для получения изображения
- •Контрольные вопросы
- •Команды работы с блоками:
- •Задание опций интегрированной среды.
- •Набор текста программы.
- •Компиляция, редактирование связей, запуск программы на выполнение.
- •Многофайловая компиляция
- •Отладка программы.
- •Использование глобальных переменных, объявленных вне файла.
- •Литература
- •Лабораторный практикум
- •Редактор
- •Белорусский государственный университет
- •Отпечатано на ротапринте бгуир, 22000, Минск, п.Бровки, 6
Динамическое размещенея данных
В языке Си есть операция, с помощью которой можно определить размер участка памяти в байтах, который компилятор отводит под массив после его объявления, это операция sizeof. Формат записи:
sizeof(параметр);
параметр – тип объекта или его идентификатор (только не имя функции). Операция sizeof позволяет определить размер объекта по имени или типу, результатом является размер памяти в байтах (тип результата int).
Если указан идентификатор сложного объекта (массив, структура, объединение), то получаем размер всего сложного объекта. Например:
sizeof(int) -> 2 байта,
int b[5]; sizeof(b) -> 10 байт;
int c[3][4]; sizeof(c) -> 24 байта.
Операция sizeof применяется при динамическом распределении памяти:
float *x; // Указатель массива
int n; // Количество элементов массива
x=(float*)calloc(n,sizeof(float)); // Захват и очистка памяти
Прототипы функций работы с памятью находятся в библиотеке alloc.h, рассмотрим основные из них:
void *calloc(unsigned n, unsigned m); - возвращает указатель на начало области памяти для размещения n элементов по m байт каждый, при неудачном завершении возвращает значение NULL;
void *malloc(unsigned n); - возвращает указатель на блок памяти длиной n байт, при неудачном завершении возвращает значение NULL;
void *realloc(void *bf, unsigned n); - изменяет размер ранее выделенной памяти с адресом начала bf на n байт;
void free(void *bf); - освобождает ранее выделенный блок памяти с адресом bf;
coreleft(void); - возвращает значение объема неиспользованной памяти (тип возвращаемого результата unsigned – для моделей памяти tiny, small, medium; unsigned long – для других моделей памяти).
Приведем пример динамического размещения одномерного массива
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<alloc.h>
void main(void)
{ int i,n; float *a;
puts(“\n Input n:”); scanf(“%d”,&n);
printf(“\n Свободная память -%d”,coreleft());
a=(float *)calloc(n,sizeof(float)); // захват памяти
printf(“\n Array a \n”);
for(i=0; i<n; i++) {
*(a+i)=(float)random(10); // диапазон от 0 до 10
printf(“ %d“, a[i]);
}
printf(“\n Память после захвата -%d”,coreleft());
free(a); // освобождение памяти
getch(); }
Пример динамического размещения двумерного массива
. . .
void main(void)
{ int i,j,n,m; float **a;
puts(“\n Input n,m:”); scanf(“%d %d”,&n,%m);
printf(“\n Свободная память -%d”,coreleft());
a=(float **)calloc(n,sizeof(float*)); // захват памяти
for(i=0; i<n; i++)
a[i]=(float *)calloc(m,sizeof(float));
. . .
printf(“\n Память после захвата -%d”,coreleft());
for(i=0; i<n; i++) free(a[i]); // освобождение памяти
free(a);
getch(); }
Варианты индивидуальных заданий
11. Даны натуральное N и квадратная вещественная матрица А. Вычислить K-ю степень этой матрицы: А1=А, А2=А·А, А3=А2·А, А4=А3·А, А5=А4·А и т.д.
12. Дана вещественная матрица размером N x M. Переставляя ее строки и столбцы, добиться того, чтобы наибольший элемент (один из них) оказался в верхнем левом углу.
13. Дана вещественная матрица размером N x M. Упорядочить ее строки по неубыванию наибольших элементов в строках матрицы.
14. Задан массив размером N x N, состоящий из 0 и 1. Повернуть элементы массива на 900 по часовой стрелке.
15. Элемент матрицы назовем седловой точкой, если он наименьший в своей строке и наибольший (одновременно) в своем столбце (или наоборот, наибольший в своей строке и наименьший в своем столбце). Для заданной целой матрицы размером N x M напечатать индексы всех ее седловых точек.
16. Дана вещественная матрица размером N, все элементы которой различны. Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим элементом.
17. Определить, является ли заданная целая квадратная матрица размером N ортонормированной, т.е. такой, в которой скалярное произведение каждой пары различных строк равно 0, а скалярное произведение каждой строки на себя равно 1.
18. Определить, является ли заданная матрица N-го порядка магическим квадратом, т.е. такой, в которой сумма элементов во всех строках и столбцах одинакова.
19. Дана матрица размером N. Найти сумму наименьших элементов ее нечетных строк и наибольших элементов ее четных строк.
20. Дана действительная квадратная матрица порядка N. Рассмотрим те элементы, которые расположены в строках, начинающихся с отрицательного элемента. Найти сумму тех из них, которые расположены соответственно ниже, выше и на главной диагонали матрицы.
21. Дана вещественная квадратная матрица порядка N. Получить целочисленную квадратную матрицу того же порядка, в которой элемент равен 1, если соответствующий ему элемент исходной матрицы больше элемента, расположенного на главной диагонали, и равен 0 в противном случае.
22. Получить целочисленную квадратную матрицу порядка N, элементами которой являются числа 1, 2, 3, … , расположенные в ней по спирали:
23. Дана действительная квадратная матрица порядка 2n. Получить новую матрицу, переставляя ее блоки размера n x n:
а) б)
24. Дана действительная квадратная матрица порядка n. Найти наименьшее из значений элементов, расположенных в заштрихованной части матрицы.
25. Заданы два массива А(N) и В(M). Подсчитать в них количество элементов, меньших значения t, и первым на печать вывести массив, имеющий наибольшее их количество.
26. Задан массив А(N). Получить из него массив В, состоящий из элементов массива А, которые больше 0.
27. Задан массив А(N). Получить из него массив В, состоящий из элементов массива А, которые меньше 0.
28. Задан массив А(N). Получить из него массив В, состоящий из элементов массива А, которые кратны двум.
29. Задан массив А(N). Получить из него массив В, состоящий из элементов массива А, которые больше значения T.