ПРАКТИЧЕСКАЯ ЧАСТЬ. Пример 1. Написать программу считывания строк разной длины с использованием массива указателей, когда строки вводятся с клавиатуры
Пример 1. Написать программу считывания строк разной длины с использованием массива указателей, когда строки вводятся с клавиатуры, и вывода считанных строк на дисплей. Примем количество символов в строке 79, что позволит разместить ее на экране дисплея. Программный код решения примера
Динамическое распределение памяти при каждом вводе новой строки осуществляется с помощью функции calloc(). Предусматривается проверка возвращаемого значения данной функции, которое не должно быть нулевым указателем (NULL). В функции gets_s() используется универсальное средство определения размерности массива (sizeof(str)/sizeof(char)). Рис. 9.1. Пример динамического считывания строк различной длины Задание 1 1. Вывод символьного массива осуществите на основе его разыменования. 2. Вместо функции calloc() примените функцию malloc() и введите (а потом выведите) свои фамилию, имя, номер группы, специальность (буквами латинского алфавита). 3. Видоизмените программу для ввода одной строки с несколькими словами различной длины (с различным количеством символов), а затем сформируйте массив строк из заданных слов. Предусмотрите вывод строк сформированного символьного массива. 4. Отсортируйте символьный массив по убыванию длин введенных слов, считая, что прописные буквы имеют приоритет над строчными. Сделайте вывод отсортированного массива на дисплей. Пример 2. Написать программу для представления нижней треугольной матрицы, размер которой задается пользователем с клавиатуры и заполняется случайными равномерно распределенными числами из интервала [0; 12]. Квадратная матрица [ aik ] называется нижней треугольной, если из условия i < k следует, что aik = 0, где i – номер строки, k – номер столбца квадратной матрицы размера n. В случае прямоугольной матрицы размером n × m переменные i и k изменяются в пределах: 1 £ i £ n, 1 £ k £ m. Программный код решения примера
В программе применена препроцессорная директива #define¼ – макрос для ввода размерности матрицы. Применение макросов требует внимания и осторожности. В программе применен указатель на массив указателей double **triMatr. Поэтому определено двойное обращение к функции calloc(), с помощью которой выполняется динамическое распределение памяти. Следует обратить внимание также на то, что в программе дважды используется функция free() для освобождения выделенной памяти. Рис. 9.2. Динамическое формирование нижней треугольной матрицы Задание 2 1. Строки нижней треугольной матрицы заполните числами, равными номерам строк, т. е. число 1 – в первой строке, 2 – во второй, 3 – в третьей и т. д. 2. Оператор условия? замените на другой оператор условия. 3. Заполните матрицу целыми случайными числами, равномерно распределенными из интервала [–2Х; 2Х], где Х – номер компьютера, на котором выполняется лабораторная работа. 4. Напишите программу с динамическим формированием треугольной матрицы из данной прямоугольной матрицы. 5. Напишите программу динамического формирования верхней треугольной матрицы. 6. В приведенной программе предусмотрите вывод матрицы, в которой ниже главной диагонали (и сама диагональ) расположены случайные числа, а выше нее нули. Пример 3. Написать программу заполнения одномерного массива случайными числами, распределенными по стандартному нормальному закону. Размерность массива вводится с клавиатуры пользователем. Для решения примера выберем метод Марсальи – Брея [3]. Его этапы: 1) генерируются два равномерно распределенных случайных числа R 1, R 2 из интервала [0; 1]; 2) формируются два соотношения: V 1 = –1 + 2 R 1, V 2 = –1 + 2 R 2; 3) Составляется сумма: S = V 12 + V 22; 4) Если S ³ 1, то пункты 1 – 3 повторяются; 5) Если S < 1, то вычисляется первая пара случайных чисел z 1, z 2:
,
Примечание. Нормальный закон характеризуется двумя параметрами: математическим ожиданием и среднеквадратическим отклонением. Эти параметры соответственно равны 0 и 1 для стандартного нормального закона Для оценки математического ожидания используется среднее значение данного объема n выборки случайных чисел. Для оценки дисперсии D могут быть использованы следующие формулы:
где m – среднее значение заданного массива. Программный код решения примера
Рис. 9.3. Массив нормально распределенных случайных чисел
Задание 3 1. Рассчитайте минимальные и максимальные значения сформированных случайных чисел. 2. Размерность массива случайных чисел примите за 100Х, где Х – номер компьютера, на котором выполняется лабораторная работа. Вывод на экран дисплея не производите. 3. С учетом п. 2 рассчитайте среднее значение сформированного массива. Сравните с теоретическим значением. 4. Напишите программу расчета массива нормально распределенных случайных чисел, для которых среднее значение отличается от теоретического математического ожидания на заданную величину (вводимую с клавиатуры): первый вариант – за счет увеличения размерности массива, второй вариант – за счет увеличения числа прогона программы с заданной величиной размерности массива. Пример 4. Написать программу заполнения одномерного символьного массива заданным числом (вводимым с клавиатуры) символов с добавлением символа восклицательного знака! в конце массива. Для решения примера используем функции динамического распределения памяти malloc() и realloc(). Программный код решения примера
В функции malloc() размер требуемой памяти установлен с учетом символа окончания строки '\0'. Аналогично сделан запас количества символов для функции realloc(), так как функция strlen() возвращает количество символов в строке без нулевого символа. Рис. 9.4. Пример определения динамического массива символов Размерность выделяемой памяти превышает число вводимых символов. поэтому функция realloc() уменьшает ее. Задание 4 1. Проверьте размерность итогового массива символов. 2. Выведите сформированный массив символов в обратном порядке. 3. Осуществите вывод массива символов с дополнительным случайным символом без применения функции strcat_s(). Пример 5. Написать программу транспонирования матрицы, размерности которой (количество строк и количество столбцов) вводятся с клавиатуры, а элементы – вещественные случайные числа, распределенные по равномерному закону из интервала [0; 15]. Транспонированная матрица – это матрица полученная из исходной матрицы заменой строк на столбцы. Программный код решения примера
Возможный результат работы программы показан на рис. 9.5. Задание 5 1. Выполните двойное транспонирование исходной матрицы. Выведите на консоль результат первого и второго транспонирования. 2. Выполните решение примера с применением указателей на указатели. 3. Заполните исходную матрицу натуральными числами начиная с номера компьютера, на котором выполняется лабораторная работа.
Контрольные вопросы 1. Что такое динамическая память? 2. Какие средства языка С используются для хранения данных с динамическим выделением памяти компьютера? 3. Какие основные библиотечные функции языка С используются для динамического распределения памяти? 4. Каково различие в действии функций malloc() и calloc()? 5. Как осуществляется перераспределение динамической памяти? 6. Для каких типов данных возможно динамическое распределение памяти? 7. В каком случае функции динамического распределения памяти возвращают нулевой указатель?
|