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

Практикум по основам программирования. Массивы. Строки. Подпрограммы. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
виде записать действия над отдельными данными как над элементами массива (используя обобщенное обозначение элемента массива).
Особенностью алгоритмов обработки массивов является то, что все
или большинство (или какое-то число) элементов обрабатываются одинаково (по одному алгоритму). Поэтому, решая задачу, приходится в том или ином порядке просматривать (перебирать) элементы масси­вов. Чтобы осуществить перебор надо определить правило изменения индекса элементов (для многомерных массивов – индексов). В случае многомерных массивов (если индексы не должны изменяться одно­временно) изменение одного индекса должно быть вложено в правило изменения другого.
Пример: для матрицы float x[10][10], перебор элементов можно ор-
ганизовать по строкам, столбцам или диагоналям. Если перебор идет по строкам, то первый индекс (индекс строки) изменяется 0 i 9, вто­рой индекс (индекс столбца) изменяется 0 j 9 для каждого значения
i.
Схема обработки всех элементов матрицы может быть представле-
на следующим образом:
i := v0; while (i  vn ) {S1; j := t0; while( j  tm ) { S2; j := j+1 ;} S3; i := i+1;}
Здесь i принимает последовательно значения v0, v0+1, v0+2, ... , vn.
Ее можно использовать в операторах S1, S2, S3 как один из индексов (номер строки или столбца) элемента матрицы. Переменная j принима­ет последовательно значения t0, t0+1, t0+2, ... , tm и ее можно использо­вать в операторе S2 как второй индекс (номер столбца или строки).
Если, обрабатывая массив, приходится перебирать все его элемен-
ты или известное количество, то удобно воспользоваться оператором цикла с заданным числом повторений (со счетчиком):
for (v=a; v ⩽ b; v++) S; (1)
где v – параметр цикла – переменная целого типа; a – начальное
значение параметра цикла; b – конечное значение параметра цикла (a и b задаются выражениями, при этом a b); S – оператор (тело цикла)
11
или
for (v =a; v⩾ b; v-- ) S; (2)
здесь ab. Выполнение действий в цикле происходит следующим образом:
в цикле (1):
v = a; while (v ⩽ b) {S; v++;}
в цикле (2):
v= a; while (v ⩾ b) {S; v--;}
Шаг изменения параметра цикла v может быть (по модулю) и
больше единицы.
В таких циклах, как правило, параметр цикла v используется в ка-
честве индекса элемента массива.
Так как размер массива фиксируется при его описании, задавайте
его, используя именованные константы, тогда вы получите более об­щее описание. В этом случае фактический размер массива может быть меньше или равен объявленному:
const int n = 20; const int m = 10;
void main ()
{
int p, k, i, j, x[n][m]; printf("Введите размер матрицы: "); scanf("%d %d ", &p, &k); // Ввод элементов массива x по строкам for (i= 0; i < p; i++) for (j = 0; j < k; j++) scanf("%f ", &x[i][j]);
// Элементы вводим через пробел по строкам // Ввод элементов массива x по столбцам
for (i = 0; i< k; i++ ) for (j = 0; j < p; j++) scanf("%f "&x[j][i]);
// После ввода столбца нажимайте ENTER для разделения }
12
Примеры
1. Написать программу решения задачи: а) Задана последовательность из n (n 50) вещественных чисел.
Вычислить выражение x
1
2
+ x
3
2
+ x
2
+ … + x
5
2
.
n
#include <stdio.h >
#include <conio.h >
const int Nmax = 50;
void main ()
{
int N = 0;
float s, x[Nmax];
printf("Введите размер последовательности: ");
scanf("%d ", &N);
printf("Введите последовательность: ");
for (int i = 0; i < N; i++ )
scanf("%f ", &x[i]);
for (i = 0, s = 0; i < N; i = i + 2 )
s += x[i] * x[i];
printf("%f \n ", s);
getch ( );
}
б) Задана последовательность X из n (n 50) вещественных чисел.
Вычислить выражение x1 + x1x2 + x1x2x3 + + x1x2…xm , где m– либо номер первого отрицательного элемента последовательно­сти X, либо число n, если в последовательности X нет отрица­тельных элементов.
#include <stdio.h >
#include <conio.h >
13
const int Nmax = 50;
void main ( )
{
int N = 0, i;
float s, b, x[Nmax];
printf("Введите размер последовательности: ");
scanf("%d ", &n);
printf("Введите последовательность: ");
for (i = 0; i < N; i++ )
scanf("%f ", &x[i]);
s = b = x[0];
for (i = 1; i < N && x[i-1] > 0; i++ )
{
b *= x[i];
s + =b;
}
printf("%f\n ", s);
getch ( );
}
в) Заданы две квадратные матрицы A и B n-го порядка каждая (n
20). Вычислить C = A + B.
#include <stdio.h > #include <conio.h >
const int Nmax = 20; void main ( ) { int N = 0, k, i, j; float A[Nmax][Nmax], B[Nmax][Nmax], C[Nmax][Nmax]; printf("Введите размер матрицы: "); scanf("%d ", &N); printf("Введите матрицы: ");
for (i = 0; i < N; i++)
14
for (j = 0; j < N; j++) scanf("%f ", &A[i][j]); for (i = 0; i < N; i++) for (j = 0; j < N; j++) scanf("%f ", &B[i][j]); for (i = 0; i < N; i++) for (j = 0; j < N; j++) C[i][j] = A[i][j] + B[i][j]; for (i = 0; i < N; i++ ) { for (j = 0; j < N; j++) printf("%.2f ", C[i][j]); printf("\n");} getch( ); }
г) Дана квадратная матрица A n-го порядка (n 20). Вычислить A =
A Т (транспонировать матрицу).
#include <stdio.h > #include <conio.h >
const int Nmax = 20; void main ( )
{
int N = 0, i, j; float A[Nmax][Nmax]; printf("Введите размер матрицы: "); scanf("%d ", &N); printf("Введите матрицу: "); for (i = 0; i < N; i++ ) for (j = 0; j < N; j++) scanf("%f ", &A[i][j]); for (i = 0; i < n - 1; i++ ) for (j = i + 1; j < n; j++) {
15
float r = A[i][j]; A[i][j] = A[j][i]; A[j][i] = r; } for (i = 0; i < n; i++ ) { for (j = 0; j < n; j++) printf("%.2f ", A[i][j]); printf("\n "); } getch( ); }
д) Дана прямоугольная матрица A размером n×m (n, m 20).
Сформировать последовательность B, k-й элемент которой равен единице, если k-тая строка матрицы A симметрична, в противном случае k-й элемент равен нулю.
#include <stdio.h > #include <conio.h >
const int Nmax = 20; void main ( ) { int N = 0, M = 0, k, i, j; int A[Nmax][Nmax], B[Nmax], r; printf("Введите размеры матрицы: "); scanf("%d %d ", &N, &M); printf("\n введите матрицу: "); for (i = 0; i < N; i++) for (j = 0; j < M; j++) scanf("%d ", &A[i][j]); for (i = 0; i < n; i++ ) { k = 1; for ( j = 0; j < M / 2 && k; j++)
16
if ( A[i][j] != A[i][M - j-1]) k = 0; B[i] = k; } printf("\n "); for (i = 0; i < N; i++) printf("%d ", B[i]); getch( ); }
6) Дана квадратная матрица A порядка n (n 50). Найти наиболь-
шее значение среди элементов главной диагонали матрицы A:
#include <stdio.h> #include <conio.h>
const int Nmax = 50;
void main() { int N, i, j; float A[Nmax][ Nmax], max; printf("Введите размер матрицы: "); scanf("%d ", &n); printf("Введите матрицу: "); for (int i = 0; i < N; i++ ) for (j = 0; j < N; j++) scanf("%f ", &A[i][j]); for (i = 1, max = A[0][0]; i < N; i++ ) if (A[i][i] > max) max = A[i][i]; printf("\n %.2f ", max); getch(); }
17
ПРАКТИЧЕСКОЕ ЗАДАНИЕ «МАССИВЫ» Тема
Использование сложных данных при решении задач. Регулярные
типы (массивы). Основные алгоритмы обработки массивов.
Цели
Знать свойства регулярных типов, способы их определения; уметь
решать задачи, связанные с обработкой массивов.
Содержание работы
1. Изучить правила определения массивов, их свойства и операции,
допустимые над этим типом.
2. Изучить оператор цикла с заданным числом повторений.
3. Спроектировать и отладить программу решения поставленной зада-
чи.
Требования к выполнению задания
В условии задачи не указаны ограничения сверху на размер слож-
ных данных. Эти ограничения студент определяет сам, исходя из раз­мера теста, на котором можно продемонстрировать решение задачи в самом общем случае, а также проверить корректность действий над элементами массива.
Варианты заданий
1 Даны натуральное число n, действительные числа x1, ... , xn. В по-
следовательности x1, ... , xn все члены, меньшие двух, заменить ну­лями. Кроме того, получить сумму членов, принадлежащих отрезку
[3, 7], а также число таких членов.
2 Даны натуральное число n, действительные числа f1, ... , fn. В по-
следовательности f1, ..., fn все неотрицательные члены, не принад­лежащие отрезку [1, 2], заменить на единицу. Кроме того, получить число отрицательных членов и число членов, принадлежащих от­резку [1, 2].
3 Даны натуральные числа n, b0, ... , bn. Вычислить f(b0) + f(b1) + ... +
f(bn), где
18
, 3,
2
( ) , 3 1,
,.
3
x
если x кратно
f x x если x при делении на дает остаток
x
в остальных случаях
  
 



4 У прилавка в магазине выстроилась очередь из n покупателей.
Время обслуживания продавцом i-го покупателя равно ti (i = 1, ... , n). Если даны натуральное n и действительные t1, ... , tn, то:
а) получить c1, ... , cn, где ci – время пребывания i-го покупателя в
очереди (i = 1, ... , n);
б) указать номер покупателя, для обслуживания которого продавцу
потребовалось самое малое время.
5 В некоторых видах спортивных состязаний выступление каждого
спортсмена оценивается несколькими судьями, затем из всей сово­купности оценок удаляются наиболее высокая и наиболее низкая, а для оставшихся вычисляется среднее арифметическое, которое и идет в зачет спортсмену. Если наиболее высокую оценку выставля­ли несколько судей, то из совокупности оценок удаляется только одна такая оценка; аналогично поступают с наиболее низкими оценками.
6 Даны натуральное число n, действительные положительные числа
f1, ... , fn (n ⩾ 3). Считая, что числа f1, ... , fn – это оценки, выставлен­ные судьями одному из участников соревнований, определить оценку, которая пойдет в зачет этому спортсмену.
7 Даны натуральное число n, действительные числа a1, ... , an. Полу-
чить max(|a1|, ... , |an|).
8 Даны натуральное число n, действительные числа a1, ... , an. В по-
следовательности a1, ... , an определить число соседств: а) двух положительных чисел; б) двух чисел разного знака;
19
)1ji(1b
ij
случае; противном в
j;i если
),1ji(1
,)1ji(1
b
ij
в) двух чисел одного знака, причем модуль первого числа должен
быть больше модуля второго числа.
9 Даны натуральное число n, действительные числа a1, ... , an. Выяс-
нить, является ли последовательность a1, ... , an упорядоченной по убыванию.
10 Дан многочлен P(x) степени n. Получить многочлен P(x+1) – P(x). 11 Даны действительное число a, многочлен P(x) степени n. Получить:
а) многочлен (x – a)P(x); б) многочлен (x2 – a2)P(x);
12 Даны целые числа a1, ... , an, действительная квадратная матрица
порядка n. Заменить нулями в матрице те элементы с четной сум­мой индексов, для которых имеются равные среди a1, ... , an.
13 Даны две действительные квадратные матрицы порядка n. Полу-
чить новую матрицу: а) умножением элементов каждой строки первой матрицы на наи-
большее из значений элементов соответствующей строки второй матрицы;
б) прибавление к элементам каждого столбца первой матрицы про-
изведения элементов соответствующих строк второй матрицы;
14 В данной действительной квадратной матрице порядка n найти
наибольший по модулю элемент. Получить квадратную матрицу порядка n-1 путем выбрасывания из исходной матрицы какой­нибудь строки и столбца, на пересечении которых расположен элемент с найденным значением.
15 Дано натуральное n. Получить матрицу B, элементы матрицы B
вычисляются по формуле: а)
б)
;
20
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]