
Программирование4172 / Лекции / Лекция 10. Разработка программ сверху вниз.Примеры зачетных задач
.docЛекция 10. Разработка алгоритмов и программ сверху вниз. Примеры зачетных задач
Разработка алгоритмов и программ сверху вниз и снизу вверх
Любая сложная система состоит из более мелких частей, таким же образом можно представить любой алгоритм или программу. На первом этапе проектируемый алгоритм представляется в виде одного блока. Затем определяется структура этого блока, исходный алгоритм разбивается на части и т.д. На рис.10.1 представлены нисходящая (сверху вниз) и восходящая (снизу вверх) технологии алгоритмизации.
Рис. 10.1. Нисходящая и восходящая технологии алгоритмизации
Часто отдельные части сложной программы оформляют в виде отдельных подпрограмм. При разработке программы по принципу «сверху вниз» вначале проектируется алгоритм главной программы (функции main), на втором этапе – блоков или подпрограмм, вызываемых из главной программы, затем – блоков или подпрограмм следующего уровня и т.д.
Задача. Сортировка числовой последовательности.
Дано целое n и вещественные x1, x2, ..., xn. Составить программу печати заданных вещественных чисел в порядке возрастания (не убывания).
Тест. Вход: Введите количество чисел 5
Введите числа 12.5 6 14 -3 10
Выход: Упорядоченные числа: -3.0 6.0 10.0 12.5 14.0
Разработаем алгоритм программы нисходящим методом.
Для хранения данных нужен массив. Исходные данные вводятся в массив, там сортируются по возрастанию, а затем выводятся. Оформим в виде отдельных подпрограмм ввод данных и сортировку массива.
Функциональную структуру программы можно представить в виде дерева на рис. 10.2.
Рис. 10.2. Функциональная структура программы
1 этап. Разработка алгоритма функции main().
Алгоритм (на псевдокоде):
1. n = Vvod(x); // Ввод n и массива x
2. Sort (x,n); // Сортировка массива x по возрастанию;
3. Вывод сортированного по возрастанию массива x;
2 этап. Детализируем шаги алгоритма. Это можно делать в любом порядке. Начнем, например, с вывода упорядоченного массива x.
// 3. Вывод массива x
Вывод заголовка "Упорядоченные числа:";
for (i=0; i<n; i++)
Вывод x[i];
Теперь рассмотрим алгоритм функции ввода данных.
int Vvod (float x[])
{
Ввод n;
for (i=0; i<n; i++)
Ввод x[i];
Возврат n;
}
Осталось рассмотреть функцию сортировки массива x. Существует много различных методов сортировки массивов. Рассмотрим метод последовательного нахождения максимума.
Вначале наибольший элемент ищется среди всех n элементов, после чего происходит перестановка его с последним элементом. Далее максимальный элемент ищется уже среди n-1 элементов и меняется местами с предпоследним элементом. Затем эта процедура повторяется для n-2 элементов и т.д. Последний раз наибольший элемент находится из первых двух элементов и переставляется местами со вторым элементом.
2.5 6 14 -3 10 // рассматривается n элементов
2.5 6 10 -3 14
2.5 6 10 -3 // рассматривается n-1 элементов
2.5 6 -3 10
2.5 6 -3 // рассматривается n-2 элементов
2.5 -3 6
2.5 - 6 // рассматривается n-3 элементов
-3 2.5
Алгоритм функции сортировки массива x по возрастанию:
void Sort (float x[], int n)
{ for (k=n-1; k>0; k--)
{ Определение максимума среди элементов x[0], ... , x[k] и
его индекса imax.
Обмен: x[imax] <--> x[k];
}
3 этап. Рассмотрим определение максимума среди элементов x[0], ... , x[k] и его индекса imax.
imax =0;
for (i =1; i <= k; i++)
if (x[i] > x[imax]) imax = i;
Программа:
#include <stdio.h>
#define NMAX 100 /* Макс-е количество входных чисел */
/* Функция ввода данных * /
int Vvod (float x[])
{
int n; /* Количество чисел */
int i; /* Индекс текущего числа */
printf ("\nВведите количество чисел\n");
scanf ("%d", &n);
printf ("Введите числа\n");
for (i=0; i<n; ++i)
scanf("%f", &x[i]);
return n;
}
/* Функция сортировки x массива по возрастанию */
void Sort (float x[], int n)
{
int k; /* Максимальный индекс просмотра*/
float r; /* Для обмена */
int imax; /* Индекс максимального элемента */
int i; /* Индекс текущего числа */
for (k=n-1; k>0; k--)
{ imax =0;
for (i =1; i <= k; i++)
if (x[i] > x[imax]) imax = i;
/* Обмен x[imax] и x[k] */
r = x[imax];
x[imax] = x[k];
x[k] = r;
}
}
/* Главная функция */
void main (void)
{ float x[NMAX]; /* Обрабатываемые числа */
int n; /* Количество чисел */
int i; /* Индекс текущего числа */
/* 1. Ввод массива x */
n = Vvod(x);
/* 2. Сортировка массива x по возрастанию */
Sort(x,n);
/* 3. Вывод массива x */
printf("Упорядоченные числа:\n");
for (i=0; i<n; ++i)
printf (" %4.1f", x[i]);
}
Примеры зачетных задач
Рассмотрим примеры задач, предлагаемых на зачете по программированию студентам заочной и очно-заочной форм обучения. Билет включает две задачи разных типов. В 1-й задаче дана готовая программа с подпрограммой, нужно составить к программе схему алгоритма и определить результат работы программы при заданных исходных данных. Ко второй задаче необходимо составить схему алгоритма, программу на языке С и трассировочную таблицу выполнения программы для одного или двух тестов (тесты подобрать самим).
Пример билета:
Билет № 3
1. Составить схему к программе:
#include <stdio.h>
int f3 (char s[81])
{ int i, pr=0;
for ( i=0; s[i]!='.'; i++ )
if ( s[i] == ' ' ) pr++;
return pr;
}
void main()
{ char s1[81], s2[81];
gets (s1);
gets (s2);
printf ("%d %d\n",f3(s1),f3(s2));
}
Что выведет программа, если ввести следующие строки:
Зима весна лето.
Осень.
2. Дана числовая последовательность в виде n, x1 , x2 , ..., xn .
Проверить, упорядочены ли числа x1 , x2 , ..., xn по убыванию.
Решение задачи 1:
Функция f3 определяет и возвращает главной функции число пробелов в заданной строке. Результат выполнения программы:
2 0
Выводится число пробелов в первой и во второй строках.
Решение задачи 2:
Тесты для проверки программы:
-
№
п/п
n
Исходная последовательность
Ожидаемый результат
1
2
3
4
5
4
1
4
100 45 30.5 36 20
10 5 1.2 -20.4
5
50 20 20 10
не упорядочены
упорядочены
n < 2
упорядочены
Табл. 10.1.Трассировочная таблица исполнения алгоритма 2 с тестом №1
f = |
1 |
|
|
|
|
|
n = |
5 |
|
|
|
|
|
xp = |
|
100 |
45 |
30.5 |
36 |
20 |
i = |
|
1 |
2 |
3 |
4 |
5 |
x = |
|
45 |
30.5 |
36 |
20 |
|
n < 2 |
нет |
|
|
|
|
|
i < n |
|
да |
да |
да |
да |
нет |
xp < x |
|
нет |
нет |
да |
нет |
|
f = 1 |
|
|
|
|
|
нет |
Результат: не упорядочены
Программа:
#include <stdio.h>
main( )
{ float xp, x; /* предыдущее и текущее числа последовательности */
int f = 1; /* признак, упорядочены ли числа по убыванию */
/* f=1, если упорядочены, 0 – нет */
int n; /* количество чисел */
int i; /* порядковый номер очередного числа */
printf ("\nВведите количество чисел\n");
scanf ("%d", &n);
printf ("\nВведите последовательность чисел\n");
scanf ("%f", &xp);
for (i =1; i<n; i++)
{
scanf ("%f", &x);
if (xp < x) f = 0;
xp = x;
}
if (f) printf ("Числа упорядочены по убыванию");
else printf ("Числа не упорядочены по убыванию");
return 0;
}