Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Программирование на языке Си

..pdf
Скачиваний:
15
Добавлен:
12.11.2023
Размер:
17.16 Mб
Скачать

524

 

 

 

Программирование на языке Си

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л

Глава 10. Задачи по программированию

 

529

где С,' = С° = 1, а остальные

элементы

определяются рекур­

рентной формулой: С гт = С

+ С

.

 

7.Введя значения т, п, г, определить трехмерный массив

Р= \ р ,jk }» значения элементов которого:

Рцк= — -ехр |—

О -* )2!, гдеi = l,и; j= 1,л; Л = 1,г.

i

п т г

 

10.4.2. Варианты для 2-й части задания по многомерным массивам

1. Из матрицы А с размерами ЗТУна 3М сформировать матри­ цу В с размерами N на М. Каждый элемент Ъу матрицы В вычис­ ляется как определитель матрицы третьего порядка, составленной из элементов матрицы А, лежащих на пересечении строк (3/ - 2), (3 /- 1), (3/) и столбцов (3 /- 2), (3 /- 1), (3j).

2.По заданной матрице А вычислить значения элементов равновеликой ей матрицы В по следующему правилу: если эле­ мент матрицы А больше нуля, соответствующий элемент матри­ цы В равен единице, в противном случае - равен 0.

3.Сформировать матрицу, элементами которой являются средние арифметические элементов исходной матрицы (без элемента, соответствующего формируемому). Например, пер­ вым элементом полученной матрицы будет среднее арифмети­ ческое всех элементов исходной матрицы без первого элемента, вторым - без второго и т.д.

4.По заданной квадратной матрице вычислить обратную матрицу. Правильность выполнения проверить путем умноже­ ния исходной матрицы на обратную (должна получиться еди­ ничная матрица).

5.Так переставить строки и столбцы квадратной матрицы А,

чтобы алгебраические суммы произведений элементов /-го

34 ~3,24

530

Программирование на языке Си

 

П

столбца и i-й строки

убывали при изменении / от 1

7=1

до и, где и - размер матрицы.

6.Считая, что элементами матрицы А с размерами « на т яв­ ляются координаты и точек /«-мерного евклидового пространст­ ва, определить диаметр этого множества точек и найти две точки, наименее удаленные друг от друга.

7.В прямоугольной матрице определить элемент, который по модулю наименее отличается от среднего арифметического всех элементов матрицы..

8.Считая, что элементами матрицы являются координаты т точек «-мерного евклидового пространства, определить мини­ мальный «-мерный гиперпараллелепипед, содержащий все т то­ чек. Вычислить объем найденного гиперпараллелепипеда и вы­ вести его "проекции" на оси координат.

9.Считая, что « первых элементов каждой строки матрицы А

сразмерами т на (и+1) являются координатами, а (и+1)-й эле­ мент - "весом" точки в «-мерном пространстве, определить центр тяжести точек и расстояния от всех точек до найденного центра тяжести.

10.По заданной прямоугольной матрице А с размерами и на

тсформировать матрицу В, каждый элемент ^которой равен

произведению средних арифметических значений элементов "диагоналей", проходящих в матрице А через элемент ау .

11. Сформировав равновеликие прямоугольные матрицы А и В, построить результирующую матрицу С по правилу.

если atJ < Ьи,

то ctJ = ау + b(J ;

если ау Щ ,

то су = ау - Ьу .

12. Вычислить

различные нормы прямоугольной матри-

Глава 10. Задачи по программированию

531

от-норма: ||Л||т = тах ^ Г |ау| ,

J

/-норма: | 4 = тах ^ Г |ау| ,

13.На основе прямоугольной матрицы получить два вектора: вектор, сформированный путем суммирования элементов строк матрицы; вектор, полученный путем умножения матрицы на первый вектор.

14.В массиве матриц транспонировать каждую матрицу. Размерности всех матриц и их количество одинаковы. Обратите внимание, что исходными данными для задачи служит трехмер­ ный массив.

15.Считая, что две прямоугольные матрицы с размерами п на от представляют распределение тепла в одном и том же пря­ моугольном сечении (в точках сечения), определить градиенты изменения температуры во всех точках (т.е. сформировать мат­ рицу приращений температуры).

16.Упорядочить матрицу (ее строки) по неубыванию наи­ больших элементов строк.

17.Целочисленную матрицу отсортировать следующим об­ разом: элементы с четными значениями должны быть упорядо­ чены внутри строк по убыванию, элементы с нечетными значениями - по возрастанию. Четные и нечетные элементы не должны меняться местами друг с другом.

18.Сформировать матрицу наибольших общих делителей элементов двух исходных целочисленных матриц.

19.Вычислить заданную пользователем с клавиатуры сте­ пень п предварительно сформированной матрицы В:

В ‘ = В ;

В2 = В В ;

В 3 = В 2 В.

34

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);

Глава 10. Задачи по программированию

533

if (matr = NULL)

{

printf("\n

He

создан‘динамический

"

"массив!");

*/

return;

/*

Завершение программы

}

for(i = 0; i < п; i++)

(

/* Строка-массив элементов типа float */ matr[i] = (float *)malloc(sizeof(float*)*n); if (matr[i] = NULL)

(

printf("\nHe создан динамический "

return;

"массив!");

/* Завершение программы */

}

for(j = 0; j<n; j++)/* Заполнение матрицы */

if(i != j)

/* Формирование нулевых элементов */

matr[i][j]

=

0.0,:

else

 

 

/* Формирование диагонали */

matr[i][j]

=

1.0;

>

 

i++)

for(i = 0 ; i < n;

{/* Цикл перебора строк */ printf("\n строка %d:", i+1); for(j = 0 ; j < n; j++)

/♦Печать элементов строки */

printf("\t %e", matr[i][j]);

)

for(i = 0 ; i < n; i++) free(matr[i]);

free(matr);

Результат выполнения программы:

Введите

порядок матрицы:

4

Строка

1 : 1

0

0

0

Строка

2:

0

1

0

0

Строка

3:

0

0

1

0

Строка

4:

0

0

0

1

Соседние файлы в папке книги