- •5.091405 «Обслуговування комп’ютеризованих інтегрованих та робототехнічних систем»
- •Виды алгоритмов
- •Структура програми. Алфавіт. Типи даних та операції
- •Структура программы
- •Алфавит языка
- •Знаки операций
- •Комментарии
- •Типы данных и операции
- •Описание меток
- •Описание переменных
- •Var имя переменной : тип;
- •Описание типов
- •Арифметические выражения
- •Логические выражения
- •Основные операторы
- •Операторы ввода и вывода
- •Ввод с консоли
- •Вывод на консоль
- •Форматный вывод
- •Условные операторы Условный оператор if
- •Оператор выбора case
- •Циклічні розрахункові процеси
- •Оператор цикла с параметром
- •Оператор цикла с условием
- •Регулярний тип (масив)
- •Сортировка массивов
- •Улучшенные сортировки
- •Сортировка Шелла
- •Символьный тип данных
- •Тип динамічні рядки (string)
- •Типи даних, що визначаються користувачем
- •Var Имя множества:Set of базовый тип;
- •Var Имя множества:Имя типа;
- •1. Var Имя записи:record
- •Var Имя записи:Имя типа для записи;
- •Складні програми. Робота з файлами Робота з процедурами та функціями
- •Види файлів. Робота з файлами
- •Когда нужно использовать файлы
- •Разновидности файлов
- •Открытие файла
- •Закрытие файла
- •Считывание из файла
- •Запись в файл
- •Модульна структура програми. Створення інтерфейсу користувача
- •Стандартные модули языка Pascal
- •Подключение модулей
- •Секция реализации
- •Секция инициализации
- •Взаимодействие модулей
- •Компиляция модулей
- •Пример модуля
- •Передача аргументов из командной строки
- •Створення інтерфейсу користувача Текстовый режим
- •Позиционирование
- •Ожидание
- •Пример использования текстовой графики
- •Решение
- •Создание дружественного интерфейса
- •Заставка
- •Ввод информации
- •Приглашения
- •Мова Сі Основні поняття та складові частини мови Сі
- •Структура програми на мові Сі. Елементи мови Сі
- •Типи даних та їх об"явлення. Базові типи даних.
- •1.2.1 Категории типов данных
- •Типи даних, що визначаються користувачем.
- •Вирази та присвоювання
- •Програмування на мові Сі
- •Види операторів. Умовні оператори
- •Оператори циклів
- •Оператори передачі керування
- •Процедури та функції
- •Виклик функцій зі змінною кількістю параметрів. Параметри функції main
- •Структура програми та класи пам"яті. Область життя та область видимості
- •Покажчики та операції над покажчиками
- •Масиви. Робота з масивами
- •Динамічний розподіл пам"яті. Динамічне розміщення масивів
- •Директиви препроцесора
- •Лінійні списки. Робота зі списками
- •Стеки та черги
- •Сортування та злиття списків
- •Пошук в лінійних списках
- •Технологія створення програм
- •Робота з файлами та потоками
- •Открытие файла: функция fopen
- •Константа null
- •Диагностика ошибок: функция perror
- •Функции бинарного чтения и записи fread и fwrite
- •Закрытие файла: функция fclose
- •Пример: подсчет числа символов и строк в текстовом файле
- •Форматный ввод-вывод: функции fscanf и fprintf
- •Понятие потока ввода или вывода
- •Функции scanf и printf ввода и вывода в стандартные потоки
- •Функции текстового преобразования sscanf и sprintf
- •Другие полезные функции ввода-вывода
- •Робота з рядками
- •Определение типов символов
- •Пример: программа "Записная книжка"
- •Аргументы командной строки
Ввод информации
Язык Pascal относится к процедурно-ориентированным языкам, поэтому последовательность ввода информации жестко задается самой программой2). Эта жесткость накладывает на программиста дополнительные обязательства при оформлении интерфейса.
Пользователь может вводить информацию двумя способами: свободным вводом или выбором из предоставленных возможностей.
Свободный ввод информации может потребоваться, например, при запросе имени файла, хранящего какие-либо объемные данные. Можно также просить пользователя ввести свое имя или несколько небольших чисел. Напомним, что ввод больших объемов информации (например, таблиц или матриц) желательно организовывать через файлы. В противном случае многократно возрастает вероятность ошибки и, как следствие, необходимость программировать дополнительные блоки, позволяющие эти ошибки исправлять.
Приглашения
Каждый раз, когда программа ждет свободного ввода от пользователя, она должна сообщать об этом, выводя на экран приглашение к вводу.
Приглашение вида "Введите х:" невозможно считать удовлетворительным, поскольку оно не содержит никакой информации об ожидаемых данных. Хорошее приглашение должно сообщать пользователю, что именно от него хотят получить в данный момент: тип, формат и размер вводимых данных.
Например:
Введите координаты центра окружности (два целых числа -10000<=x,y<=10000):
Защита При свободном вводе пользователь, вообще говоря, может вводить что угодно (а то и вовсе что попало) и совсем не обязательно информацию в ожидаемом программой формате. А в языке Pascal, как мы уже знаем, недопустимы несоответствия типов данных. Например, если не отключен контроль ввода/вывода (см. лекцию 6), то попытка ввести букву "О", когда ожидается цифра "0", приведет к аварийной остановке программы. Еще сложнее бывает разобраться с форматами дат, вещественных чисел (часто вместо десятичной точки пользователи ставят привычную русскому человеку запятую) и т.п. Таким образом, для надежности работы программы необходимо предусмотреть проверки любой введенной пользователем информации. Такой контроль получил в среде программистов не слишком вежливое название "защита от дурака". При правильной организации этой защиты ваша программа "не сломается" даже в том случае, если вместо ввода данных пользователь просто сядет на клавиатуру. Если по каким-либо причинам ввод все-таки получился ошибочным, сообщение об этом должно появиться немедленно, вместе с предложением ввести информацию заново. Кроме того, даже в случае правильного ввода полезно сразу же напечатать значение, которое получила переменная. Так можно уменьшить вероятность возникновения ошибки из-за ввода нескольких переменных там, где ожидается лишь одна: увидев, что результатом стало только первое число из введенной строки, пользователь тут же скорректирует свои действия. Меню Меню предоставляет пользователю возможность выбора из нескольких предложенных программой вариантов. Самое простое меню в программе на языке Pascal - это пронумерованный список возможных действий с запросом у пользователя номера выбранного варианта. При обработке этого номера также необходим контроль правильности ввода. Способы создания более сложных и красивых форм меню мы здесь рассматривать не будем, поскольку современные интерфейсно-ориентированные языки (например, Delphi) предоставляют для этого гораздо более мощные средства. Курсы по этим языкам мы и порекомендуем всем желающим. Вывод информации Не следует думать, что вывод информации происходит только в конце работы программы. Напротив, операторами вывода прошита вся ее ткань. Каждый раз, когда пользователь должен что-то ввести, этому предшествует вывод приглашения. Каждый раз, когда программа приступает к выполнению объемного блока работ, она должна сообщать об этом пользователю - чтобы исключить вероятность прерывания "по окончании терпения", а еще лучше, если на экране будет находиться какой-нибудь индикатор процесса, отображающий текущее "состояние дел". Какими же должны быть сообщения программы, выводимые на экран? В любом случае они обязаны быть доброжелательными и вежливыми. И, кроме того:
Это означает, что терминология сообщений должна соответствовать той области, к которой относится задача.
Например, если вы пишете обучающую программу для младших школьников, то в пояснениях не должно быть сложных предложений и "заумных" слов. А если вы создаете игру для своих сверстников, то в ее сообщениях возможен и молодежный сленг (однако мы настоятельно советуем избегать табуированной лексики, даже иноязычной).
Все запросы данных, относящихся к одному и тому же логическому блоку, стоит объединять и на экране. Например, если необходимо ввести информацию по нескольким налогоплательщикам, то не стоит сначала запрашивать все фамилии, а затем только номера банковских счетов.
Программа, как вы помните, должна сообщать результаты своей работы. Однако "голый" вывод неприемлем: результаты обязательно должны сопровождаться исчерпывающими пояснениями. Кроме того, помимо окончательного результата, нужно выводить и промежуточные результаты - по окончании обработки каждого логически самостоятельного крупного блока. Если же работа программы оказывается прерванной из-за какой-либо ошибки, сообщение о ее причинах должно появиться на экране.
Понятие эргономичность включает в себя минимизацию умственных и физических усилий пользователя: например, если есть возможность заменить ввод выбором, это нужно делать. Следует стремиться к кратким сообщениям - но, разумеется, не за счет потери части их смысла! Цветовое оформление также не должно становиться причиной дискомфорта или ошибок пользователя: например, не стоит выводить сообщение о неправильном вводе зеленым цветом, а сообщение об успешно пройденном тесте - красным. |
Пример пользовательского интерфейса В качестве примера мы приведем программу, реализующую широко известную игру "Быки и коровы". Эта программа отслеживает все варианты некорректного ввода (первая цифра вводимого числа - не ноль; все цифры различны; вводится именно цифра, а не любой другой символ), а также нажатие клавиш ESCAPE и BACK SPACE. Автор программы попытался застраховать ее и от пытающегося жульничать игрока, и от случая, когда игрок не понял правил игры или понял их неправильно; постарался учесть возможность "сдваивания" нажатой на клавиатуре клавиши, "промаха" мимо цифровой клавиши или случайного нажатия произвольной клавиши; организовал правильную реакцию на желание пользователя прервать игру. Мы приводим программу в полном, работающем виде, поскольку лишь 10% ее текста не относятся к обеспечению интерфейса: program bull_and_cow; uses crt; const cifr: set of '0'..'9' = ['0'..'9']; yes: set of char = ['Y','y','Д','д','L','l']; cifr10: set of 0..9 = [0..9]; type cifr_char = '0'..'9'; vector = array[1..10] of 0..9;
var zagadano,popytka: vector; i,j,jj,n: 1..10; flag: boolean; c: cifr_char; c1: char; set_of_popyt,set_of_zagad: set of 0..9; num_of_popyt,cow,bull,err: integer;
procedure error_(st: string; x,y: integer); begin textcolor(lightred); write(' Ошибка: ',st); gotoxy(wherex+x,wherey+y); textcolor(white); flag:= false; end;
function check(cc: char):integer; begin case cc of chr(27) : begin {Escape} check:= 1; textcolor(lightgreen); clreol; write('До свидания? Y/N'); if readkey in yes then begin clrscr; halt end else begin gotoxy(wherex-16,wherey); clreol; end; textcolor(white); end; chr(8) : begin {BackSpace} check:= 2; if j>1 then dec(j); if popytka[j]= zagadano[j] then dec(bull) else if popytka[j] in set_of_zagad then dec(cow); set_of_popyt:= set_of_popyt-[popytka[j]]; gotoxy(wherex-1,wherey); clreol; end; chr(13) : if (j<>n) {Enter} then begin writeln('Недостаточно цифр! Введите число заново.'); gotoxy(1,wherey-1); check:= 3; end; '0'..'9' : begin write(cc); check:= 0; end; else begin write(cc); check:= 4; end; end; {end-of-case} end;
begin clrscr; textcolor(lightmagenta); writeln(' Поиграем в "Быков и коров"?'); textcolor(yellow); writeln(' (бык - это цифра, стоящая на своем месте; а корова - просто верная)'); textcolor(green); writeln(' Итак... Я загадываю число из разных цифр. Вам отгадывать! '); writeln(' (Выход из программы - <ESC> )'); textcolor(cyan); write('Введите количество цифр в угадываемом числе: '); {$I-}; flag:= false; repeat textcolor(white); c1:= readkey; clreol; err:= check(c1); if err= 4 then error_('введена не цифра!',-27,0); if err = 0 then case c1 of '0' : begin writeln; error_('в числе должна быть хотя бы одна цифра!',-3,-1) end; '1' : begin c1:= readkey; flag:= true; case c1 of '0' : begin n:=10; writeln(c1) end; #13 : n:= 1; else begin writeln(c1); error_('в числе может быть не более 10 разных цифр!',-7,-1); end; end;{case} end; else begin val(c1,n,err); flag:= true; end; end; if n>10 then until flag; writeln;
{-- Zagadyvanie chisla --------------------} randomize; zagadano[1]:= random(9)+1; set_of_zagad:=[zagadano[1]]; for i:=2 to n do repeat zagadano[i]:= random(10); if not (zagadano[i] in set_of_zagad) then begin set_of_zagad:= set_of_zagad+[zagadano[i]]; flag:= true; end else flag:=false; until flag;
{--- Game --------------------------} textcolor(lightmagenta); write('Начинаем! '); textcolor(cyan); clreol; writeln('Вводите Ваши числа:'); textcolor(white); num_of_popyt:= 0; flag:= true; repeat {Ввод очередного числа} cow:= 0; bull:= 0; set_of_popyt:= []; j:=1; while j<=n do {Ввод по цифрам} repeat c:= readkey; err:= check(c); clreol; if err = 4 then error_('Введена не цифра! Измените последний символ.',-54,0); if err = 0 then if (c='0')and(j=1) then error_('Первой цифрой не может быть ноль! Повторите ввод.',-59,0) else begin val(c,popytka[j],err); if popytka[j] in set_of_popyt then error_('Одинаковых цифр быть не должно! Измените последнюю цифру.',-67,0) else begin set_of_popyt:= set_of_popyt+[popytka[j]]; flag:= true; if popytka[j]=zagadano[j] then inc(bull) else if popytka[j] in set_of_zagad then inc(cow); inc(j) end; end; until flag;
clreol; readln; textcolor(yellow); gotoxy(n+1,wherey-1); writeln(' Быков - ',bull,'; коров - ',cow); inc(num_of_popyt); textcolor(white); until bull = n; textcolor(green); if bull= n then writeln('Поздравляю! Вы выиграли за ',num_of_popyt,' шагов!'); readln; clrscr end. Графический режим Единицей изображения в графическом режиме служит один пиксель, поэтому линии на рисунках получаются почти гладкими. Графический режим используется довольно редко - например, для построения графиков и диаграмм или при создании обучающих программ, игр, скрин-сейверов и т.п. Для изучения богатых графических возможностей языка Pascal совершенно недостаточно даже целой лекции: здесь нужен как минимум полугодичный курс. Поэтому мы не станем и пытаться "объять необъятное". В качестве оправдания заметим лишь, что для того, чтобы писать примитивные графические программки и создавать "хороший" интерфейс, вполне достаточно уже рассмотренных возможностей текстового режима. |