Л а б о р а т о р н а я р а б о т а N 3
Обработка числовых последовательностей
Существует круг задач, в которых необходимо как-то обработать заданную числовую последовательность, причем для получения результата достаточно просмотреть последовательность один раз. Например,чтобы вычислить среднее арифметическое заданной последовательности чисел, можно суммирование чисел и подсчет их количества совместить со вводом. Тогда не нужно будет хранить всю последовательность в памяти компьютера (в виде массива), достаточно иметь одну скалярную переменную целого или вещественного типа и поочередно присваивать ей вводимые значения.
Числовая последовательность может задаваться с указанием количества чисел или иметь какой-то признак конца.
Пусть последовательность задается в виде
A1, A2,..., An, W
(n заранее неизвестно, W - признак конца последовательности), тогда процесс обработки в общем виде можно представить одной из двух схем:
А) цикл с постусловием б) цикл с предусловием
![]() |
![]() | |||
![]() | |||
да нет
Фрагменты программ на Cи, соответствующие этим схемам:
а) scanf ("%f",&a); б) scanf ("%f",&a);
do while (a!=W)
{ /* обработка a */ { /* обработка a */
......
scanf ("%f",&a); scanf ("%f",&a);
} }
while (a!=W);
В этих фрагментах предполагается, что переменная a вещественного типа (float), поэтому указан формат %f. Eсли же последовательность состоит из целых чисел типа int, то следует выбрать формат %d. W - символическая константа, которая должна быть определена с помощью директивы #define.
Числовая последовательность может быть задана и с указанием количества вводимых чисел:
n, A1, A2,..., An.
Тогда процесс обработки можно представить в виде:
a) б) более короткая форма
![]() | ![]() | ||
![]() | ![]() | ||
На языке Си этот процесс можно записать с помощью оператора цикла while или лучше оператора цикла for:
а) scanf ("%d",&n); i=1; б) scanf ("%d",&n);
while (i<=n) for (i=1; i<=n; i++)
{ {
scanf ("%f",&a); scanf ("%f",&a);
/* обработка a */ /* обработка a */
......
i++; }
}
Процесс обработки очередного числа может иметь линейную структуру (состоять из нескольких последовательно выполняемых операторов) или структуру ветвления, которая программируется с помощью оператора if:
If (условие) оператор1
Else оператор2
![]() |
![]() |
В операторе if оператор1 и оператор2 могут быть составными операторами, конструкция " else оператор2 " может отсутствовать, например:
if (a % 2!= 0)
{ s=s+a;
k++;
}
Пpимечание. В опеpатоpах if, while, do-while можно использовать не только условные выpажения, но и вообще любые. Это связано с тем, что в Си значение "ложь" - это 0, а "истина" - любое ненулевое число. Поэтому пpедыдущий опеpатоp if можно записать иначе:
if (a % 2) { s=s+a; k++; }
Пример решения задачи
Задача. Даны целые числа n, A1,A2,...,An. Вычислить сумму тех чисел последовательности, которые удовлетворяют условию |Ai | < i2.
Программа:
#include <stdio.h>
#include <math.h>
main()
{
int n; /* количество чисел */
int a, /* очередное число */
s=0, /* сумма */
i; /* порядковый номер числа в посл-ти */
printf ("\nВведите количество чисел: ");
scanf ("%d",&n);
printf ("Введите числовую последовательноть:\n");
for (i=1; i<=n; i++)
{
scanf ("%d",&a);
if (abs(a) < i*i) s=s+a;
}
printf ("сумма=%d\n",s);
}
Тесты для проверки программы:
№ п/п | n | Исходная последовательность | Ожидаемый результат |
1 -2 3 16 -5 40 -1 5 10 -20 | сумма=-4 сумма=0 |
Результаты тестирования программы:
Введите количество чисел: 6
Введите числовую последовательноть:
1 -2 3 16 -5 40
сумма=-4
Введите количество чисел: 4
Введите числовую последовательноть:
-1 5 10 -20
сумма=0
Порядок выполнения работы
1. Получить задание у преподавателя.
2. Составить схему и программу на языке Си, подобрать тесты для проверки программы на компьютере.
3. Отладить программу на компьютере и показать результаты тестирования преподавателю.
4. Оформить и сдать отчет по лабораторной работе.
Задания
1. Даны натуральные числа n, A 1, A2,..., An. Определить количество членов Ak последовательности A1,..., An:
а) кратных 3 и не кратных 5;
б) имеющих четные порядковые номера и являющихся нечетными числами;
в) удовлетворяющих условию 2k < Ak < k!.
2. Даны натуральное число n, действительные числа A1,A2,...,An.Получить:
а) удвоенную сумму всех положительных членов последовательности A 1, A2,..., An
б) сумму отрицательных и количество положительных членов последотельности A 1, A2,..., An
в) min(|A1 |,..., |An |);
г) min(A1, A3,...) + max(A2, A4,...).
3. Даны натуральные числа A1, A2,.... Признак конца последовательности 0. Получить
а) количество и сумму тех членов последовательности, которые делятся на 5 и не делятся на 7;
б) наибольший член последовательности;
в) min(A1+ A2, A2 + A3,...).
4. Даны целые числа A1, A2,....Признак конца последовательности число 9999. Выяснить, составляют ли числа возрастающую последовательность.