Пример улучшения качества предмашинной подготовки с вводом-выводом в консольное окно

Используем большинство рассмотренных элементов улучшения качества программного продукта на конкретном примере задачи о кладах, представленной в арифметических циклах с табличным заданием аргумента (разд. 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.