Пример улучшения качества предмашинной подготовки с вводом-выводом в консольное окно
Используем большинство рассмотренных элементов улучшения качества программного продукта на конкретном примере задачи о кладах, представленной в арифметических циклах с табличным заданием аргумента (разд. 5.2).
Постановка задачи, математическая модель и метод решения, остаются неизменными. Корректировке подвергаются алгоритм решения и его программная реализация.
Исходный алгоритм решения задачи (рис. 5.10) дополнен следующими элементами дружественности: повторение вычислений, очистка экрана, диалоговый ввод данных (рис. 6.3).
Модифицированный алгоритм и программа (в соответствии с рассмотренной методикой) реализован с организацией ввода-вывода в консольное окно. Откорректированная программа предусматривает диалоговый ввод данных с запросами на русском языке. Этот вариант требует преобразования символов из кодировки Windows в кодировку DOS. Перекодировка реализуется функцией CharToOem.
Структура функции:
CharToOem(ИС,ИРС);
где CharToOem – ключевое слово (преобразовать);
ИС – исходная символьная строка;
ИРС – имя (обозначение) результирующей строки;
, – разделитель ИС и ИРС;
() – ограничители аргументов;
; – символ оператора.
Функция предписывает преобразование исходной символьной строки (ИС) в символьный массив с заданным именем (ИСР). Описание массива ИСР как символьного – обязательно.
Так функция CharToOem (“Ввод переменной а”, buf) предписывает преобразование строки “Ввод переменной а” в символьный массив buf с предварительной перекодировкой.
Внимание! Здесь и далее операция перекодировки в алгоритме не указывается, поэтому имя символьного массива (buf) в таблице идентификации переменных отсутствует.
Функция CharToOem располагается в программе до использования оператора вывода запроса. Использование функции требует подключения библиотеки windows.h оператором #include <windows.h>.
Рис. 6.3. Улучшенный алгоритм задачи 5.2 с выводом в поток
Рис. 6.3. Продолжение улучшенного алгоритма
Рис. 6.3. Окончание улучшенного алгоритма
Откорректированная программа задачи 5.2
/* Программа с использованием цикла с параметром */
#include <stdlib.h>
#include <stdio.h> /* директивы */
#include <conio.h> /* препроцессора */
#include <windows.h> /*Подключение функции CharToOem*/
main() /* заголовок основной функции */
{
float c[7], /* массив значений стоимостей кладов */
p[7], /* массив значений начисленных премий */
pro; /* процент вознаграждения */
int n, i, /* размер массивов, параметр цикла */
t; /* переменная, определяющая повторение */
char buf1[40], buf2[40]; /*массивы для вывода*/
/*символьных сообщений*/
do /* начало цикла для повторения вычислений */
{
clrscr(); /* очистка экрана */
CharToOem("Введите размер массива (от 1 до 7): ",buf1);
printf("%s",buf1);
scanf("%d", &n); /* ввод размера массивов */
for( i=0 ; i < n ; i++ ) /* заголовок цикла ввода исходного массива (массив стоимостей кладов) */
{
CharToOem("Введите значение стоимости клада c",buf1);
CharToOem("тыс. р.:",buf2);
printf("%s (%d), %s", buf1,i+1,buf2);
scanf("%f", &c[i]); /* ввод значения элемента массива */
}
CharToOem("Введите размер вознаграждения, проц.:",buf1);
printf("%s",buf1);
scanf("%f", &pro); /* ввод процента вознаграждения */
/* вывод процента вознаграждения и шапки таблицы */
CharToOem("\n Размер вознаграждения....: ",buf1);
CharToOem("проц. \n",buf2);
printf("%s %.1f %s",buf1,pro,buf2);
printf(" +––––––––––––+–––––––––––+\n");
CharToOem(" | Стоимость | Премия |\n",buf1);
CharToOem(" | клада c(i) | п(i) |\n",buf2);
printf("%s%s",buf1,buf2);
printf(" +––––––––––––+–––––––––––+\n");
for( i=0 ; i < n ; i++ ) /* заголовок цикла вычисления зна-чения функции (расчет премий) */
{
p[ i ] = (c[ i ] * pro) / 100.;/*вычисление p[ i ] */
/* вывод текущих значений элементов массивов на экран */
printf(" | %9.2f | %9.3f |\n", c[ i ], p[ i ]);
}
printf(" +––––––––––––+–––––––––––+\n");
CharToOem("Повторение решения - 1, \n выход – 0”
“или другая цифра: ",buf1);
printf("%s",buf1);/* вывод запроса */
scanf("%d", &t);/*ввод значения переменной, определяющей повторение вычислений (ответ на запрос)*/
}while( t==1 );/*окончание цикла повторения решения*/
} /* завершающая скобка головной функции */
7 25. 492. 503. 948. 738. 892. 320. 250. – исходные данные.
Результаты решения представлены в приложении 6.1.