Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции программирование.doc
Скачиваний:
38
Добавлен:
05.11.2018
Размер:
4.73 Mб
Скачать

Позиционирование курсора

Ввод-вывод информации на экран монитора выполняется с текущей позиции строки, определяемой месторасположением курсора. При необходимости указания конкретных точек начала ввода-вывода используется специальная функция позиционирования курсора. Вызов функции оформляется оператором следующей структуры:

gotoxy( поз_x , поз_y );

, где gotoxy – имя функции (перейти к x,y );

поз_x – координата столбца;

поз_y – координата строки;

( , ) – ограничители и разделитель аргументов функции;

; – признак простого оператора.

  • Внимание ! Функция используется только при работе с экраном монитора, для принтера – неприменима.

Функция предписывает установку курсора в позицию, задаваемую координатами. В качестве координат используются целые константы, переменные, арифметические выражения. Размеры экрана монитора составляют 80 столбцов на 25 строк. Поэтому диапазон изменения координаты x (столбца) от 1 до 80, а диапазон координаты y (строки) от 1 до 25.

Н

int a=3, b=5;

float r;

. . .

gotoxy( a , b );

scanf( "%f" , &r );

. . .

апример, оператор gotoxy( 40 , 12 ); предписывает установку курсора в центр экрана монитора, а фрагмент программы

определяет начальную позицию поля (3-й столбец 5-й строки) для ввода численного значения вещественной переменной r.

Предлагаемый фрагмент позволяет вводить информацию в конкретные поля заранее заготовленной таблицы.

Так при желании ввести численные значения индексированной переменной xi в таблицу формируется её шаблон:

+––––––––+–––––––––+

+ X + Y +

+––––––––+–––––––––+

| | |

+––––––––+–––––––––+

| | |

+––––––––+–––––––––+

Оператор вывода таблицы на экран вставляется в программу до операторов ввода численных значений таблицы.

При этом фрагмент программы ввода имеет вид

int s, k;

. . .

gotoxy( s , k );

scanf("%f" , &x[0] );

gotoxy( s , k+2 );

scanf("%f" , &x[1] );

. . .

До начала использования функции позиционирования необходимо сформировать численные значения s и k. Например, s=7 (4 пробела до таблицы + 1 ограничитель + 1 пробел + 1-я позиция ввода), k=4 (3 строки шапка + 1 строка ввода).

Применение позиционирования при выводе позволяет задавать, например, сдвиг таблицы вправо. При этом операторы позиционирования используются при формировании шапки, а также в теле цикла перед оператором вывода текущей строки таблицы.

Фрагмент программы для вывода таблицы, начиная с задаваемой координатами (s, k) позиции, может иметь вид

int s, k;

. . .

scanf(“%d%d”,&s,&k);

. . .

gotoxy( s , k );

printf("+––––––––+–––––––––+");

gotoxy( s , k+1 );

printf("| x(i) | y(i) |");

gotoxy( s , k+2 );

printf("+––––––––+–––––––––+");

. . .

gotoxy( s , k+3+i ); /* в теле цикла до оператора вывода */

printf("| %6.2f | %7.2f |", x[i] , y[i]);

. . .

Пример улучшения качества

Используем все рассмотренные варианты улучшения качества программного продукта на примере корректировки алгоритма и программы задачи о кладах, рассмотренной в арифметических циклах с табличным заданием аргумента (разд. 5.2). Улучшенный алгоритм имеет вид рис. 6.1.

Рис. 6.1. Схема улучшенного алгоритма задачи о кладах

Рис. 6.1. Продолжение

Рис. 6.1. Окончание

Улучшенная программа задачи 5.2

/* Программа с использованием цикла с параметром */

#include <stdlib.h>

#include <stdio.h> /* директивы */

#include <math.h> /* препроцессора */

#include <conio.h>

main() /* заголовок основной функции */

{

float c[7], /* массив значений стоимостей кладов */

p[7], /* массив значений начисленных премий */

pro; /* процент вознаграждения */

int n, i, /* размер массивов (количество кладов), параметр цикла */

d, t; /* переменные, определяющие печать на принтер и повторение */

do /* начало цикла для повторения вычислений */

{

clrscr(); /* очистка экрана */

printf("Вывод на печать – 1, \n"

"иначе – другая цифра: "); /* вывод запроса */

scanf("%d", &d); /* ввод значения переменной, определяющей печать на принтер (ответ на запрос) */

printf("Введите размер массива (от 1 до 7): ");

scanf("%d", &n); /* ввод размера массивов */

for( i=0 ; i < n ; i++ ) /* заголовок цикла ввода исходного массива (массив стоимостей кладов) */

{

printf("Введите значение стоимости клада "

"c(%d), тыс. р.: ", i+1);

scanf("%f", &c[i]); /* ввод значения элемента массива */

}

printf("Введите размер вознаграждения, проц. : ");

scanf("%f", &pro); /* ввод значения процента вознаграждения */

/* вывод процента вознаграждения и шапки таблицы на экран */

printf("\n Размер вознаграждения....: %.1f проц. \n", pro);

printf(" +––––––––––––+–––––––––––+\n"

" | Стоимость | Премия |\n"

" | клада c(i) | п(i) |\n"

" +––––––––––––+–––––––––––+\n");

if( d == 1 ) /* проверка условия вывода на принтер */

{

/* вывод процента вознаграждения и шапки таблицы на принтер */

fprintf(stdprn,"\n Размер вознаграждения: "

"%.1f проц. \n", pro);

fprintf(stdprn," +––––––––––––+–––––––––––+\n"

" | Стоимость | Премия |\n"

" | клада c(i) | п(i) |\n"

" +––––––––––––+–––––––––––+\n");

}

for( i=0 ; i < n ; i++ ) /* заголовок цикла вычисления значения функции (расчет премий) */

{

p[ i ] = ( c[ i ] * pro ) / 100.; /* вычисление текущего значения */

/* вывод текущих значений элементов массивов на экран */

printf(" | %7.2f | %8.3f |\n", c[ i ], p[ i ]);

if( d == 1 ) /* проверка условия вывода на принтер */

{

/* вывод текущих значений элементов массивов на принтер */

fprintf(stdprn," | %7.2f | %8.3f |\n"

, c[ i ], p[ i ]);

}

}

printf(" +––––––––––––+–––––––––––+\n");

if( d == 1 ) /* проверка условия вывода на принтер */

{

fprintf(stdprn, " +––––––––––––+–––––––––––+\n");

}

printf("Повторение решения – 1, \n"

"выход – другая цифра: "); /* вывод запроса */

scanf("%d", &t); /* ввод значения переменной, определяющей повторение вычислений (ответ на запрос) */

}while( t==1 ); /* окончание цикла, организующего повторение */

} /* завершающая скобка головной функции */

Численные значения вводимых данных не показаны.

Принципы улучшения дружественности, используемые в программе, являются универсальными и пригодны для алгоритмов и программ любых видов и типов.

Вопросы для контроля

  1. Что такое улучшение качества программных продуктов и в чём оно заключается?

  2. Для чего используются укороченные спецификаторы ввода-вывода?

  3. Как влияет максимально укороченный спецификатор на точность выводимых вещественных переменных?

  4. Как выглядят фрагменты алгоритмов и программ для организации диалогового ввода переменных?

  5. Каковы варианты организации ввода массивов?

  6. Как формулируется методика оформления выводимых данных?

  7. Как формируются и используются составные присваивания?

  8. Каковы фрагменты организации выбора устройства вывода?

  9. Для чего и как реализуется в программе повторение расчётов?

  10. Что такое позиционирование курсора, как реализуется?