ВВЕДЕНИЕ
Любаядеятельность человека связана с обработкой информации. При этом наибольшийуспех имеет тот, кто может качественно обработать достаточно большой объеминформации за приемлемое время. Естественно, что проблема создания различныхсредств и методов оперирования с информацией всегда привлекала вниманиеобщества.
Но качественный скачек произошел в концесороковых годов в результате изобретения электронно-вычислительныхмашин-компьютеров. Сейчас в некоторых развитых странах в сфере компьютерной обработкиинформации занято около половины трудоспособного населения. Известным примеромприменения компьютерной обработки информации является система “СИРЕНА” для резервирования мест на авиарейсы. Она обеспечивает хранениебольшого объема данных о свободных и занятых местах на различные рейсы, быстрыйпоиск необходимой пользователю информации, обмен информацией между компьютероми значительным количеством удаленных устройств ввода-вывода, установленных нарабочих местах кассиров-операторов. В настоящее время компьютерная индустрияпроникает во все области нашей жизни. Компьютер становится нашим повседневным помощником.Области применения ЭВМ непрерывно расширяются, все более захватывая и такие сторонычеловеческой деятельности, которые, как казалось, не приемлют каких либовычислений. Сюда можно отнести медицину, биологию, игру в шахматы, сочинениестихов и музыки, моделирование одежды и т.д. Применение ЭВМ в системах обработкиинформации и управления, для научно-технических расчетов и моделирования сталовполне естественным.
До сих пор продолжают говорить, что «ЭВМ-думает», «ЭВМ рассчитывает», «ЭВМ вычисляет». При этом создается мнение, чтодостаточно приобрести компьютер, как он станет за кого-то думать, рассчитывать и управлять. На самом деле это не так.ЭВМ — лишь, инструмент, реализующий алгоритм, разработанный человеком. Алгоритм- точное предписание, выполнение которого приводит к решению задач.
Многое из того, что мы видим и слышим по телевизору (рекламные ролики, заставки,фильмы, музыкальные клипы) сделано с помощью компьютера. Использованиекомпьютера дает возможность освободиться от большого количества бумажнойинформации (например: всевозможные бланки, справки). С помощью компьютера,используя компьютерные сети, можно посылать друг другу письма, не выходя издома, получать все мировые новости, общаться с коллегами из зарубежных стран.Компьютер поможет сделать покупки, не выходя из дома, разработать чертежи. Насовременных компьютерах создают мультфильмы (Транс-формеры,Король Лев.), художественные фильмы (Звездные войны, Терминатор 1-2, ПаркЮрского периода, Маска.). ЭВМ используют для обучения и игр, которых создановеликое множество. Использование компьютеров позволяет автоматизироватьпроизводство (примеры автоматизации: станки с ЧПУ, автоматизированные линиисборки, роботы-манипуляторы). Использование компьютера дома позволяетподготавливать и хранить всевозможные рукописи, письма. Можно спроектировать обстановку в вашей квартире, непереставляя мебель в реальности. Компьютер может стать вашим секретарем. Вкомпьютере вы можете хранить всевозможные картотеки,музыкальные клипы, живое видео и многое другое. На ЭВМ можно смоделироватьсложные химические и физические процессы, для которых раньше требовалисьспециальные приборы.
Но есть у компьютеров и негативные стороны.Например, сидя долго за компьютером вы ведете малоподвижный образ жизни, а этосказывается на вашем физическом состоянии.
Одна из областей применения компьютеров это обучение вождению автомобилем. Внастоящее время большое количество людей стремится получить водительскоеудостоверение. Но многие не могут поступить на учебу из-за ограниченного количествачеловек в группе. А группы ограничены по размерам из-за пропускной способностиэкзаменатора, который не может физически и морально принять экзамен у большогоколичества людей. Нижеописанная программа способна увеличить пропускнуюспособность экзаменатора, сняв с него большую нагрузку. Программа способнапринять сама экзамен и дать беспристрастную оценку ответам экзаменуемого. Впрограмме предусмотрен режим обучения, позволяющий экзаменуемому предварительноознакомиться с правильными ответами.Общедоступный формат билетов позволяет оперативно изменять вопросы с учетом существующих в настоящее времяправил. Программу можно полностью перепрофилировать на прием экзаменов подругим предметам. Использование этой программы поможет начинающему ближе узнатькомпьютер и его возможности. Используя компьютер, человек открывает дорогу в мир информации.
1 ОБЩАЯ ЧАСТЬ
1.1. КРАТКОЕ ОПИСАНИЕ
Описываемаяпрограмма состоит из трех основных подпрограмм(Меню, Контроль, Обучение).Этиподпрограммы могут работать не зависимо, что позволяет использовать их в другихпрограммах. Рассмотрим алгоритмы работы этих подпрограмм и всей программы вцелом. При загрузке программы выводится заставка, кратко описывающая назначениепрограммы, затем на экране отображается меню. В меню программы вы можетевыбрать один из трех пунктов меню: Выход, Контроль, или Обучение.
Выход: осуществляется выход в операционную систему (например: MS-DOS X.X,WINDOWS 3.X, WINDOWS 95, DR-DOSи.т.д. ).
Обучение: позволяет экзаменуемому выбрать любой билетс вопросами по экзамену и просмотреть правильные ответы на заданный билет.
Контроль: режим приема экзамена у экзаменуемого. Вэтом режиме программа случайным образом выбирает номер билета. Далееэкзаменуемый отвечает на вопросы выводимые на экран, в течении времениотведенного для ответа на билет. Послетого, как экзаменуемый ответит на все вопросы данного билета, программаавтоматически выставляет оценку и записывает данные о экзаменуемом и результатыэкзамена в файл.
Рассмотрим подробнее работу программы. При первомзапуске программа делает привязку к конкретному компьютеру, т.е. при попыткезапустить незарегистрированную копию программы на другом компьютере, программане будет работать. Это один из уровней защиты программы. При последующихзапусках программа тестирует среду запуска( объем свободной памяти, тип процессора,объем свободного пространства на жестком диске).Если тесты показали пригодностьсреды запуска то программа продолжает работать, иначе происходит выход ввызываемую среду с сообщением о причине выхода. При продолжении работывыполняется сохранение параметров вызываемой среды (вектора прерываний,настройки скорости срабатывания клавиатуры и т.д. ). Далее выводится заставкаотображающая назначение программы.Затем экран обновляется и появляется меню.Вменю вы можете, используя клавиши курсора или мыши, выбрать один из трехпунктов меню. Рассмотрим каждый пункт меню подробно:
1. Выход.Привыборе этого пункта программа переспросит вас, действительно ли вы хотитевыйти. Если вы ответите НЕТ вы вернетесь в меню программы. Если вы ответите ДА программавосстановит среду вызова (освободит занимаемую память, восстановит содержимоепеременных- адреса векторов прерываний,содержимое регистров, закроет все, открытые ею файлы), сохраненную при запускепрограммы. После произойдет реальный выход. Уточнение насчет выхода нужно длятого, чтобы пользователь при случайномвыборе данного пункта не вышел из программы.
2 Обучение.Выбравэтот пункт вам будет предложено выбратьномер билета, на который вы хотите знать ответы. Затем программа проверяет,введенный номер на предмет выхода за допустимые границы. Если произошла ошибка,вам будет предложено заново ввести номер билета.
При корректном вводе номера билета программа сделаетпопытку загрузить файл с данным билетом. При невозможности загрузить файл(отсутствие файла ) будет выведено сообщение об ошибке и программа выйдет в вызываемуюсреду. После успешной загрузки файла с билетом программа выведет первый вопросс отмеченным правильным ответом. Далее программа проверяет счетчик вопросовт.е. был ли это последний вопрос в билете. Если это был последний вопрос топрограмма предложит выбрать новый билет или вернуться в основное меню. Иначепрограмма увеличивает счетчик вопросов и обновив экран выводит новый вопрос.Цикл повторяется пока не кончатся вопросы в билете. Затем происходит выход восновное меню.
3 Контроль.В этомпункте программа тестирует экзаменуемого на предмет знания билета. Программаслучайным образом выбирает номер билета. Затем экзаменуемому предлагается ввести свои имя и фамилию. После этого производится попытка загрузить файл с данным билетом. Приневозможности загрузить данный файл программа выводит сообщение об ошибке ивыходит в среду запуска. При успешной загрузке программа засекает время необходимоедля ответа на билет. Производится обновление экрана и вывод первого вопроса избилета. Затем программа проверяет наличие оставшегося времени. Если время вышло,на экран выводится сообщение об окончании времени и программа переходит кобработке результатов ответа. Иначе программа ожидает ответ экзаменуемого, уменьшаяпри этом счетчик времени. Еслиэкзаменуемый ответил правильно увеличивается счетчик правильных ответов, иначеувеличивается счетчик неправильных ответов. После этого программа проверяет неисчерпаны ли вопросы.Если исчерпаны то происходит переход к обработке результатов.Иначе производится вывод новоговопроса и цикл повторяется до тех пор,пока не истечет время, или не кончатсявопросы. После окончания времени или вопросов происходит обработка результатовт.е. выставление оценки знаний экзаменуемого.
Программа записывает результат опроса и данныеэкзаменуемого в файл. Этот файл потом может быть объединен с другими такими жефайлами для составления списка успеваемости группы. После записи данных происходит выход в основное меню.
Подпрограммы имеют универсальный интерфейс обменамежду собой, что позволяет изменять отдельные модули, не «перекраивая» всейпрограммы в целом, т.е. по мереулучшения отдельных подпрограмм не нужно заменять все программу в целом уконечного пользователя, а только ее некоторую часть. В нескольких местах программы встраивается защита от несанкционированногокопирования (это сделано для того чтобы программа не распространялась безсогласия ее автора).В программе также предусмотрена система защиты от заражения компьютерным вирусом.Использование программой стандартного интерфейса для общения с операционнойсистемой предотвращает от фатальных ошибок (уничтожение данных на диске,зависание компьютера и.т.д. ) и конфликтовс операционной системой.
Программа написана на языке C++. На нем реализованывсе основные подпрограммы. Использованию этого языка его такие особенности, каклаконичность, мощность, гибкость, мобильность. Для компиляции программыиспользовался компилятор фирмы «WatcomSystemsInc». Такжеиспользовался язык ассемблера для выполнения наиболее критичных ко времени участковкода. Язык ассемблера, это символьное представление машинного языка, а какизвестно все критичные ко времени процедуры т.е., которые должны выполняться втечении короткого промежутка времени, пишутся на машинном языке. Программа реализована для компьютера IBM PC,а скомпилирована для процессора Intel™ 386 и выше.Выбор компьютера не случаен.Этоткомпьютер наиболее распространен на рынке настольных компьютеров и обладает достаточной вычислительноймощностью. Выбор типа процессора также не случаен так, как на более медленныхпроцессорах (i80286, i80186, i8086) программа может “притормаживать” т.е. оченьмедленно работать. Особенностью процессоров Intel™ является преемственность на уровне команд:программы написанные для младших моделей процессоров, без всяких изменениймогут быть выполнены на более старших моделях. Также нужен монитор и видеоадаптерподдерживающие режим «VGA». Для удобстваработы в программу введена поддержка манипулятора типа “мышь”. А сейчас рассмотрим подробнееалгоритм наиболее важной подпрограммы, которая распознает формат файла билета иинтерпретирует команды содержащиеся в этом файле.
1.2ОПИСАНИЕ АЛГОРИТМАПОДПРОГРАММЫ
В подпрограмму передается несколько параметров, аименно указатель- позиция текущего считываемого символа в массиве, сам массив,и его размер.
В самой подпрограмме в организуется цикл с условием- пока не встретится символ окончания вопроса или билета илиуказатель не станет больше размера массива. В первом случае программойсохраняется текущая позиция указателя в массиве и программа переходит дляобработки результата ответа пользователя, в зависимости от режима работы- контрольили обучение. Вовтором случае подпрограмма рисует заставку об информирующую об окончании билетаи выходит в основной модуль для окончательной обработки результата. Модульрисования распознает несколько команд«примитивов», а именно: рисование линии по заданным начальным и конечнымкоординатам с заданным цветом, рисование прямоугольников ( закрашенных и незакрашенных ) заданного цвета, рисование окружности, рисование прямых оттекущей координаты к указанным закрашивание области одним цветом, включение файла с описанными вышекомандами в определенную позицию на экране и включение файла с заданнымкоэффициентом масштабирования.
Рассмотрим подробнее реализацию рисования примитивов.Сначала подпрограммой распознается, чтосчитываемый графический файл имеет правильный формат. Затем уже в самом цикле происходит интерпретация команд.Рассмотрим наиболее сложную команду: рисование прямых от текущей точки доуказанных координат.
Если встречается символ рисования такой прямой топодпрограмма распознает начальные координаты откуда будут рисоваться прямые иих цвет. Затем организуется цикл сусловием — пока не встретится символ окончания рисования. Внутри циклапроисходит распознавание координат и их калькуляция в соответствии скоэффициентом масштабирования. После этого уже вычерчивается линия на экране.Ниже приведен формат файла рисования.
В файле используются несколько команд: C,F,L,M,P,PL,T,W,V.В начале файла должен стоять значок «*»,означающий, что этот файл являетсяфайлом графики. Ниже приведена таблица содержащая имя команды, ее описание,формат записи и пример.
Команда
Описание
Формат записи
Пример
С
рисование окружности с координатами x,y, радиусомrи цветом color
С x,y,r,color
C 120,50,40,3
Команда
Описание
Формат записи
Пример
F
рисование финальной заставки из файла filename
F filename
F exit.bil
L
рисование линии (прямоугольника закрашенного и не закрашенного по заданным координатам x1,y1,x2,y2cцветом color
L x1,y1,x2,y2,color,command
commandможет принимать значения L,Fи B
L- линия, F — закрашенный прямоугольник, B — не закрашенный прямоугольник
L 10,10,20,20,7,L 10,10,20,20,1,B 10,10,20,20,2,F
М
указывает количество вариантов ответов в вопросе N, правильный ответ (color=1), и координаты вывода рамки-курсора на экран x1,y1,x2,y2 … xn,yn,xn,yn,
M N x1,y1,x2,y2,color ......... xn ,yn, xn, yn, color
M
2 81,127,185, 147, 2
81,152,185,172, 1
P
закрашивает область цветом color1, до границ цвета colorначиная с точки x, y
P x,y,color,color1
P 30,26,3,2
PL
рисует прямые с указанными конечными координатами xn, yn, цветом color, с начальными координатами x1,y1,x2,y2, PL,0 — служит признаком конца рисования
PL x1,y1,x2,y2,color xn, yn
PL,0
PL 120,120,130,130,3 140,132 23,51 PL,0
Команда
Описание
Формат записи
Пример
T
вывод строки textв заданные координаты x1,y1, цветом color, XOR — служит признаком конца текста и, означает метод наложения текста на графику
T x1,x2,color,text, XOR
T 5,5,3,пример,XOR
W
включает из файла filenameграфику и выводит ее в позицию x1,x2т.е. x1,x2 — это новые координаты отсчета
W filename x1,x2
W zastavka 90,90
V
включает из файла filenameграфику и выводит ее в позицию x1,x2с коэффициентом масштабирования m
V filename x1,y1,m
V avto_100 100,100,300
Примечание: коэффициент подсчитывается по формуле -aspect= maxx/(m-x1); где maxx — максимальноеразрешение графического режима в пикселях.
Глубина вложения файлов равна единице т.е. вы не можете использовать команды Wи Vв уже включаемом файле. Это сделано для уменьшениятребований к ресурсам компьютера и дляуменьшения путаницы во включаемых файлах. Для составления билетов можно использовать любой текстовый редактор.
2 РАСЧЕТНАЯЧАСТЬ
2.1 Листингпрограммы
Программа была написана с использованием языка WatcomС++, поэтому в нейиспользуется специфический синтаксис этого языка. Ниже приведен листингописываемой программы.
char *massiv,*massiv1,*temp,*buff_image,command,mode='c',key;
unsignedchar f_mask[ 8 ] = { 255, 255, 255, 255,255, 255,255, 255 };
unsignedchar name[20],subname[20],massiv2[45];
char fon_buff[10];
int color=0,color1=0,punkt=1,m_x,m_y,m_k=0,row=20,maxx=640;
float x=0,y=0,x1=0,y_1=0,radius=0,xs=0,ys=0,ratio=1.000,asp=640,aspxs=1;
#define ENTER 0x0d
#define PGDW 0x51
#define PGUP 0x49
#define UP 0x48
#define DOWN 0x50
#define ESC 0x1b
#define SPACE 0x20
#include"graph.h"
#include"pgchart.h"
#include"stdarg.h"
#include"stdio.h"
#include"iostream.h"
#include"fstream.h"
#include"conio.h"
#include"stdlib.h"
#include"math.h"
#include"string.h"
#include"dos.h"
voidmouse (int on_off_xy, int *m_x,int *m_y,int*m_k) ;
void virusprot (void);
void grinit (void) ;
voidoutmenu (void);
voidoutcursormenu(int punkt);
voidchoise_cont_educ(char file[]);
void education(int index,int quest_num);
voidoutresult(int mark,char mode) ;
voidgetout(void );
voidany_key(void);
voidcalcxy(void);
voidclrbuff(void);
voiddraw_win(int x,int y,char msg[]);
voidgoodbye(void);
voidinp_data(unsigned char data[]);
voidinputfio(void);
voidmouse (int on_off_xy, int *m_x,int *m_y,int*m_k);
voidtimeout () ;
voidsavefio (int mark ) ;
int picture (intcount, char massiv[], intindex);
int choisebil(void);
int choiserandombil(void);
int control(intindex,int quest_num,int mark,int minute,int *timeout);
int fileop(char file[],char massiv[] ) ;
int msv_tmp(int count,char massiv[]) ;
voidmain() {
if (!(massiv =new char [20000])){cout
if (!(buff_image=newchar [4000 ])){cout
if (!(massiv1 =new char [20000])){cout
if (!(temp =new char [100 ])){cout
grinit();
virusprot();
while(1) {
intbilnum=1;
char file[13];
outmenu();
label1:
punkt=menu();
if (punkt==1){mode='c'; bilnum=choiserandombil();}
if (punkt==2){mode='e';bilnum=choisebil();}
if (punkt==3){getout();goto label1;}
sprintf(file, "%d.bil", bilnum);
choise_cont_educ(file);
}
}
void grinit (void) {
int mode, n;
mode = _ERESCOLOR;
struct videoconfig vc;
if( _setvideomode(mode ) == 0 ) {
puts( «Cannot initialize videomode» );
}
n = _registerfonts("*.fon" );
sprintf( fon_buff, "n%d", 1 );
_getvideoconfig(&vc);
maxx=vc.numxpixels;
_setfillmask(f_mask);
mouse (0,&m_x,&m_y,&m_k);
}
voidoutmenu (void) {
mouse (2,&m_x,&m_y,&m_k);
mouse(1,&m_x,&m_y,&m_k);
clrbuff();
_clearscreen(_GCLEARSCREEN);
_setcolor(9);
_floodfill(20,20,1);
int count=fileop("zastavka.prg",massiv);
picture (count,massiv,0);
_setcolor(0);
_rectangle(_GFILLINTERIOR,130,55,530,245);
_setcolor(7);
_rectangle(_GFILLINTERIOR,120,50,520,240);
_setcolor(0);
_setcharsize(16,16);
_setfont( fon_buff );
_setcharsize(50,40);
for (int i=1;i
_grtext(170+i,50," Êîíòðîëü");
_grtext(140+i,115," Îáó÷åíèå");
_grtext(180+i,182," Âûõîä") ;
}
_setfont( fon_buff );
_setcharsize(8,9);
_grtext(420,340,«CopyRigthby Andy (C) 1996»);
_setcharsize(50,40);
_setfont( fon_buff );
}
int picture (intcount, char massiv[], intindex){
int i=index;
while (i
switch(massiv[i]){
case 'C':{
i=msv_tmp(i,massiv);
sscanf(temp,"%f,%f,%f,%d",&x,&y,&radius,&color);
_setcolor(color);
float r_ratio=ratio;
double asp_radius=sqrt(radius*radius+radius*radius);
calcxy();
if (radius==12) r_ratio=int (ratio);
if (radius==40) r_ratio=1.0259;
radius=radius/r_ratio;
_ellipse(_GBORDER,x-radius,y-radius/1.4,x+radius,y+radius/1.4);
break;
}
case 'L': {
i=msv_tmp(i,massiv);
sscanf(temp," %f, %f, %f, %f, d,%s",&x,&y,&x1,&y_1,&color,&command);
calcxy();
_setcolor(color);
switch(command){
case 'B': {
_rectangle(_GBORDER,x,y,x1,y_1);
break;
}
case 'F': {
_rectangle(_GFILLINTERIOR,x,y,x1,y_1);
break;
}
case 'L': {
_moveto(x1,y_1);
_lineto(x,y);
break;
}
}
break;
}
case 'M': return (i);
case 'F': {
int count1=fileop("exit.bil",massiv);
picture(count1,massiv,0);
return(0);
}
case 'P': {
char cmd='p';
if (massiv[i+1]=='L'){i=i+1;cmd='l';}
i=msv_tmp(i,massiv);
if (cmd=='p') {
sscanf(temp,"%f,%f,%d,%d",&x,&y,&color,&color1);
calcxy();
_setcolor(color);
_floodfill(x,y,color1);
break;
}
else {
sscanf(temp,"%f,%f,%f,%f,%d",&x,&y,&x1,&y_1,&color);
calcxy();
_setcolor(color);
_moveto(x1,y_1);
_lineto(x,y);
_moveto(x1,y_1);
i=i++;
while (!(int(massiv[i])=='P') && i
i=i-2;
i=msv_tmp(i,massiv);
sscanf (temp,"%f,%f",&x,&y);
calcxy();
_lineto(x,y);
i=i++;
}
i=i+2;
break;
}
}
case 'T': {
i=i+2;
int schet=0,len=0,q=0;
char txtmassiv[80];
while (!(schet ==3) && i
if (int(massiv[i]==','))schet=schet++;
temp[q]=massiv[i];i++;q++;
}
sscanf(temp,"%f,%f,%d",&x,&y,&color);
while (!(int (massiv[i])==',')){
txtmassiv[len]=massiv[i];i++;len++;
}
txtmassiv[len]=0;
_setcharsize(16,16);
color1=_getpixel(x+1,y+1);
_setcolor