книги / Программирование на языке Си
..pdf524 |
|
|
|
Программирование на языке Си |
|
free(input); |
/* |
Количество частей |
*/ |
||
ks = |
(Len+2)/3; |
||||
с = |
(char |
**)calloc |
(ks, sizeof(char |
*) ); |
|
/* Деление строки на ks "частей" */ |
|
||||
for(j = 0 ; |
j < |
ks; |
j++) |
|
{/* Память для части: */ *(c+j) = (char *)malloc(4);
for (i = 0; (i < 3 && * (h+n)); i++) *(*(c+j)+i) = * (h+n++); *(*(c+j)+i) = '\0 ';
}
/* Удаление иэ памяти обработанной строки: */ free(h);
/* Вывод "частей" исходной строки */ for (j = 0; j < ks; j++)
{
printf("\n %s", *(c+j));
)
/* Освободить память от динамических массивов:*/ for (j = 0; j < ks; j++)
free(*(c+j)); free(c) ;
. }
Пример выполнения программы:
Введите максимальный размер строки: 60 Введите строку: World_Wide_Web!
Wo г ld _
Wid e_W eb!
В программе следует обратить внимание на ряд особенно стей.
Чтение символов входного потока выполняется двумя раз ными функциями. В цикле (окончанием которого служит появ ление символа '\п') с помощью getchar() читается последовательность символов в область памяти, адресуемую указателем char* input. Перед этим с помощью функции scanf("%d",&LenMax) считывается значение LenMax. Здесь
Глава 10. Задачи по программированию |
525 |
возникает одно неудобство. Функция scanf() при вводе "оставляет" во входном потоке признак '\п' конца вводимой по следовательности. Если затем следует ввод с помощью функции getchar(), то первым считанным значением будет '\п'. Именно поэтому перед циклом с помощью getchar() из входного потока удаляется ненужный символ '\п'.
Следующая особенность - отсутствие индексированных пе ременных. Для доступа к элементам массивов, в которых раз мещаются символы строк, используются разыменования указателей и выражений с указателями, например: *(*(c+j)+i). В качестве упрюкнения рекомендуем написать вариант программы с индексированными переменными для доступа к отдельным символам строк.
Еще одна особенность - отсутствие обращений к стандарт ным функциям для работы со строками. Программу можно уп ростить, если использовать функции для определения длины строк strlen(), для копирования строк strcpy() и др.
10.4.Многомерные динамические массивы
спеременными размерами
Порядок выполнения задания (общая схема алгоритма):
1.Ввести размеры многомерных массивов.
2.Сформировать динамические массивы заданных размеров
спомощью функций malloc() и/или са11ос().
3.Заполнить массивы значениями, т.е. определить значения элементов массивов (удобнее сделать это не вручную, т.е. не вводя значения элементов с клавиатуры, а алгоритмически).
4.Выполнить действия над массивами, необходимые для решения конкретной поставленной задачи, сформировать новый массив-результат (или новые массивы).
5.Напечатать в наглядном виде массив-результат.
6.Удалить динамические массивы с помощью функции free().
526 |
Программирование на языке Си |
Входные данные:
•размеры массивов;
•данные, определяющие значения элементов массивов.
Выход: Представление на экране одного или нескольких массивов-результатов.
Схема обработки многомерного динамического массива (для матрицы).
1.Определяем указатель на массив указателей на объекты заданного типа (т и п **uk).
2.Вводим размеры матрицы N, М.
3.Создаем динамический массив из N указателей на указате
ли:
vk -{m u n **)malloc(N*sizeof(/mw *));
или
uk = (т и п **) calloc(N, sizeof[т и п *));
4.В цикле создаем N массивов-строк (по М элементов в каж
дом)
for (...) uk[i] = {т и п *)malloc(M*sizeof(/m/«);
или
for (...) uk[i] = (т и п *) calloc(M, sizeof(т ип))-,
5.Обработка массива (работа с индексированными элемен тами uk[i][j]...);
6.В цикле удаление N массивов-строк:
for (... i ...) free(uk[i]);
7.Удаление массива указателей: free(uk);
Каждое задание данного подраздела логически делится на две части:
\ 1) формирование многомерного массива требуемых разме ров и определение значений его элементов;
2) решение задачи, для которой один или более массивов (заполненных при выполнении первой части задания) являются исходными данными.
Глава 10. Задачи по программированию |
527 |
10.4.1. Варианты задач для 1-й части задания по многомерным массивам
(правила формирования многомерного массива)
1. Ввести предельные значения xmjn , хтах , у тщ , у тах и коли чество значений пх и пу , принимаемых соответственно пере менными
{х тт ^ х , |
i = h n I ; |
||
У / ( у т1„ £ |
У} ^ У т а х \ |
j = |
l n y - |
Сформировать матрицу А |
с размерами п х |
на пу и присвоить ее |
|
элементам значения |
|
|
|
где функции F ( X j , y ) могут быть определены следующими
аналитическими соотношениями:
F\ (*,,y j) = 8.9 х, |
у j |
+ 2.3 х} - 8 х, у) ; |
|
||||
F i i f n |
У i) = s i n Уj |
-cosx,; |
|
|
|
||
t |
\ |
/ |
|
\ |
~ { x } + x i У / +У21> |
|
|
F i ( x i’ y J ) = { 5 x >+ 7 y l ~ 2 5 ) e V |
> |
|
|||||
Ъ (*,. у.,) = х , у2, |
- |
05 x i - |
004 У}; |
|
|||
FS(x i>yj) = J 2 - ( x i - a)2~ ьу] |
+ а х <у.п |
|
|||||
где а = |0,2 -ь 0.4j , |
Ъ - 10,8 +1.0}. |
|
|
|
|||
2. Ввести |
значение |
п |
- |
размерность |
вектора |
||
А - |а,, а2, . . . , а „} |
и значения его элементов а , , i = 1, п . |
|
528 Программирование на языке Си
Сформировать квадратную матрицу В с размерами п на п и оп ределить значения ее элементов по следующему правилу:
_ | |
2^“^°' , |
если у*/ |
|
|
° ч ~ 1 |
а{, |
для |
i=j. |
|
3. Введя размеры п, т матрицы X = {*/ |
}> определить зна |
|||
чения ее элементов */у ^/= 1, n \j= \, |
wj с |
помощью датчика |
псевдослучайных чисел из библиотеки стандартных функций компилятора. "Заполнение" матрицы выполнять по строкам, т.е. последовательно определять значения: х и , х и , ... х„т_,, х пт.
4. Введя значения п и т , сформировать матрицу Z = {ztj J с
размерами п на т. Считая, что каждые т членов последователь
ности |
|
|
х, =[1003 |
+19] mod 7777, |
(/ = 1,2,..., х0- задано). |
определяют значения элементов |
очередной строки матрицы, |
определить значения элементов матрицы Z = |z ^ J .
Предварительно ввести значение х0 . |
|
|
||
5. Ввести размеры п, т матрицы А = |
) |
и определить зна |
||
чения ее элементов по следующему правилу: |
|
|||
= expi- |
fc(/-l) + d{n + \- i) |
j - |
1 |
|
п |
т |
|||
|
где b, с, d - величины, значения которых должны быть опреде лены, например, таким образом: Ъ = 1,5; с = 3,0; d = 0,5.
6. Введя значение п, сформировать квадратную матрицу (часть треугольника Паскаля):
с ° |
с } |
. |
4 - 1 |
С ” |
4 |
|
|
'-'л |
|
Г ° |
с ' |
•• |
С ”-1 |
С п |
Ч - |
|
'“'Л |
4+1 |
|
г ° |
С'п |
|
/оЛ-1 |
с п |
4 - 1 |
|
с 2л-2 |
с 2л-1 |
|
с ° |
г |
|
/тЯ-1 |
с п |
|
4л -1 |
|||
'“'Л |
4+1 |
|
с 2л |
530 |
Программирование на языке Си |
|
П |
столбца и i-й строки |
убывали при изменении / от 1 |
7=1
до и, где и - размер матрицы.
6.Считая, что элементами матрицы А с размерами « на т яв ляются координаты и точек /«-мерного евклидового пространст ва, определить диаметр этого множества точек и найти две точки, наименее удаленные друг от друга.
7.В прямоугольной матрице определить элемент, который по модулю наименее отличается от среднего арифметического всех элементов матрицы..
8.Считая, что элементами матрицы являются координаты т точек «-мерного евклидового пространства, определить мини мальный «-мерный гиперпараллелепипед, содержащий все т то чек. Вычислить объем найденного гиперпараллелепипеда и вы вести его "проекции" на оси координат.
9.Считая, что « первых элементов каждой строки матрицы А
сразмерами т на (и+1) являются координатами, а (и+1)-й эле мент - "весом" точки в «-мерном пространстве, определить центр тяжести точек и расстояния от всех точек до найденного центра тяжести.
10.По заданной прямоугольной матрице А с размерами и на
тсформировать матрицу В, каждый элемент ^которой равен
произведению средних арифметических значений элементов "диагоналей", проходящих в матрице А через элемент ау .
11. Сформировав равновеликие прямоугольные матрицы А и В, построить результирующую матрицу С по правилу.
если atJ < Ьи, |
то ctJ = ау + b(J ; |
если ау Щ , |
то су = ау - Ьу . |
12. Вычислить |
различные нормы прямоугольной матри- |
532 |
Программирование на языке Си |
20.Упорядочить строки матрицы по возрастанию значений сумм их элементов.
21.Из заданной матрицы сформировать новую, удалив стро ку и столбец, которым принадлежит минимальный (один любой из минимальных, если их несколько) элементов.
22.Вычислить суммы элементов строк квадратной матрицы
исформировать из этих сумм вектор. Умножить исходную мат рицу на этот вектор-столбец и умножить этот вектор (считая его строкой) на исходную матрицу. Вывести полученные одномер ные массивы.
10.4.3. Пример выполнения задания по многомерным динамическим массивам
Условие задачи. Введя целое значение переменной п, сфор мировать единичную диагональную матрицу с размерами и на и
ивывести ее на экран дисплея.
Вотличие от основных задач этого параграфа в данном слу чае для простоты не требуется обрабатывать сформированную матрицу. В приводимой ниже программе реализовано в соответ ствии с условиями задачи только формирование матрицы. Этого достаточно для демонстрации механизмов построения много мерных динамических массивов и работы с их элементами.
/* Единичная диагональная матрица с изменяемым порядком */
#include <stdio.h> void main()
{
int n; /*Порядок матрицы */ int j ,i ;
/* Указатель на массив указателей */ float ** matr;
/* Определяются размеры массива: */ printf("\п Введите порядок матрицы: "); scanf("%d", &п);
/* Создаем массив для указателей float *: */ matr = (float **)malloc(sizeof(float)*n);