Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Практикум по основам программирования. Массивы. Строки. Подпрограммы. Учебное пособие
.pdf
виде записать действия над отдельными данными как над элементами
массива (используя обобщенное обозначение элемента массива).
Особенностью алгоритмов обработки массивов является то, что все
или большинство (или какое-то число) элементов обрабатываются
одинаково (по одному алгоритму). Поэтому, решая задачу, приходится
в том или ином порядке просматривать (перебирать) элементы массивов. Чтобы осуществить перебор надо определить правило изменения
индекса элементов (для многомерных массивов – индексов). В случае
многомерных массивов (если индексы не должны изменяться одновременно) изменение одного индекса должно быть вложено в правило
изменения другого.
Пример: для матрицы 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)
здесь a ⩾ b.
Выполнение действий в цикле происходит следующим образом:
в цикле (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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
