- •1. Постановка задачи:
- •1.1. Характеристика задачи.
- •1.2. Выходная информация.
- •1.3. Входная информация.
- •2. Алгоритм решения.
- •3 Руководство пользователя.
- •3.1. Введение.
- •4.1. Общие сведения о программе.
- •4.2. Структура программы.
- •4.3. Настройка программы.
- •4.4. Сообщения системному программисту.
- •5. Приложение.
- •5.1. Листинг программы.
- •5.2.Результат работы программы.
- •5.3. Файл
- •5.4.Контрольный пример.
4.3. Настройка программы.
Для корректной работы программы необходимо чтобы файл data.txt находился в одной директории с файлом 13.exe. В случае отсутствия файла, этот файл будет создан в самой программе путём добавления новых записей.
4.4. Сообщения системному программисту.
Сообщения программы |
Действия пользователя |
Каталог не найден! |
Проверьте правильность пути к файлу с данными, указанного в программе. |
Не могу открыть файл! |
Зайти в пункт меню ВВОД и ввести информацию для создания файла. |
Не хватает памяти. Слишком много открытых файлов! |
Закройте все открытые файлы. |
5. Приложение.
5.1. Листинг программы.
.186
.MODEL SMALL
.STACK 100h
include maclib1.inc
sved struc
nzala db 2 dup(0) ; номер зала
kolvop db 2 dup(0) ; кол-во пэвм
;mash db 13 dup(' ')
bit db 00000000b ; байт признаков
sved ends
;---Программа.
.DATA
s sved <> ;опpеделение стpуктуpы
ijk db 0
koor db 13
handle dw ?
fl db 'data.txt',0
count db ?
kolvo db ?
nz db 0
index db 0
cehsrav db 13 dup (' ')
a db 1
p db 1
fon db 7
strel db 'Перемещение по пунктам меню осуществляется клавишами ','$'
priv1 db 'О программе','$'
priv2 db 'Ввод данных','$'
priv3 db 'Просмотр файла','$'
priv4 db 'Поиск по № зала','$'
priv5 db 'Выход','$'
priv6 db 'О программе.','$'
helpstr1 db 'Программа "Сведения об изделиях"','$'
helpstr2 db 'курсовая работа студента группы ИВТ12','$'
helpstr3 db 'Бондарева Максима.','$'
helpstr4 db 'Программа позволяет:','$'
helpstr5 db '-Добавить данные в файл,или заполнить пустой файл,','$'
helpstr6 db '-Просмотреть содержание файла data.txt,','$'
helpstr7 db '-Вывести данные о машинах по № зала,','$'
helpstr8 db 'Выход из программы.','$'
svednet db 'Сведений нет!!!','$'
presskey db 'Нажмите любую клавишу...','$'
error1 db '','$'
error11 db 0c9h,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0bbh,'$'
error12 db 0bah,'Невозможно открыть файл!',0bah,'$'
error13 db 0c8h,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0cdh,0bch,'$'
error2 db 'Каталог не найден!','$'
error3 db 'Не хватает памяти. Слишком много открытых файлов!','$'
ex_esc db 'Есть ещё детали? "Esc"-Нет','$'
ex_esc1 db 'Есть ещё изделия? "Esc"-Нет','$'
vnzalap db 'Введите № зала/2цифры/: ','$'
vkolvop db 'Введите Количество ПЭвм/2цифры/: ','$'
;vmash db 'Введите шифр машины/12символов/: ','$'
otv db 'Расставьте хар-ки машин:/1-да,0-нет/','$'
pr db 'Есть принтер: ','$'
mon db 'Жк монитор: ','$'
port db 'USB порт: ','$'
disk db 'CD-RW дисковод: ','$'
disket db 'Дисковод для дискеты: ','$'
xp db 'Windows XP: ','$'
pasc db 'Pascal: ','$'
delp db 'Delphi: ','$'
tabest db 'Да','$'
tabnet db 'Hет ','$'
tab0 db ' ╔═══════════════════════════════════════════════════════════════════╗','$'
tab1 db ' ║ ║','$'
tab3 db ' ║Машинный зал №: Количество ПЭВМ: ║','$'
tab4 db ' ╠══════╦═══════╦═══════╦════╦════════╦════════╦═══════╦══════╦══════╣','$'
tab5 db ' ║ Шифp ║ Есть ║ Жк ║USB ║ CD-RW ║Дисковод║Windows║Pascal║Delphi║','$'
tab6 db ' ║машины║принтер║монитор║порт║дисковод║для дис-║ XP ║ ║ ║','$'
tab6a db' ║ ║ ║ ║ ║ ║ кеты ║ ║ ║ ║','$'
tab7 db ' ╠══════╬═══════╬═══════╬════╬════════╬════════╬═══════╬══════╬══════╣','$'
tab8 db ' ║ ║ ║ ║ ║ ║ ║ ║ ║ ║','$'
tab9 db ' ╚══════╩═══════╩═══════╩════╩════════╩════════╩═══════╩══════╩══════╝','$'
vnzala db 'Введите № машинного зала: ','$'
.CODE
start:
mov ax,@data
mov ds,ax
window 0,0,80,25,3,15 ;
nocursor ; Выключение курсора
window 0,0,80,3,1,15
window 0,1,80,25,1,15
do:
cmp p,1 ;;; Меню
je p1
jmp p2
p1:
mov fon,3
jmp p3
p2:
mov fon,1
p3:
window 0,0,15,0,fon,15
window 0,1,80,25,1,15
gotoxy 2,0
puts priv1
gotoxy 10,24
puts strel
cmp p,2
je pp1
jmp pp2
pp1:
mov fon,3
jmp pp3
pp2:
mov fon,1
pp3:
window 15,0,30,0,fon,15
window 0,1,80,25,1,15
gotoxy 17,0
puts priv2
gotoxy 10,24
puts strel
cmp p,3
je pp13
jmp pp23
pp13:
mov fon,3
jmp pp33
pp23:
mov fon,1
pp33:
window 30,0,48,0,fon,15
window 0,1,80,25,1,15
gotoxy 32,0
puts priv3
gotoxy 10,24
puts strel
cmp p,4
je ppp1
jmp ppp2
ppp1:
mov fon,3
jmp ppp3
ppp2:
mov fon,1
ppp3:
window 48,0,66,0,fon,15
window 0,1,80,25,1,15
gotoxy 50,0
puts priv4
gotoxy 10,24
puts strel
cmp p,5
je pn1
jmp pn2
pn1:
mov fon,3
jmp pn3
pn2:
mov fon,1
pn3:
window 66,0,79,0,fon,15
window 0,1,80,25,1,15
gotoxy 68,0
puts priv5
gotoxy 10,24
puts strel
getch
cmp al,75
je met
jmp met1
met:
cmp p,1
je next
jmp next1
next:
mov p,5
jmp met2
next1:
dec p
jmp met1
do1:
jmp do
met1:
cmp al,77
je me
jmp met2
me:
cmp p,5
je nex
jmp nex1
nex:
mov p,1
jmp met2
nex1:
inc p
met2:
cmp al,13
jne do1
jmp do3
do2:
jmp do1
do3:
cmp p,1
je pom
cmp p,2
je pom1
cmp p,3
je pom1a
cmp p,4
je pom2
cmp p,5
je fin
pom1:
jmp pom11
pom2:
jmp pom22
pom1a:
jmp pompr
fin:
jmp finn
pom:
call help
jmp do2
pom11:
call vvod
jmp do2
pompr:
call prosm
jmp do2
pom22:
call vivod
jmp do2
;****************************************************
;Просмотр файла
;****************************************************
prosm PROC near
openfile fl,handle
mov koor,13
mov ijk,0
snv:
mov ah,3Fh
mov bx,handle
mov cx,48 ;сколько читать
mov dx,offset s
int 21h
cmp ax,0 ;Пока не конец файла
je konecp
mov ijk,1
call tablout
jmp snv
konecp:
cmp ijk,1
je clos
window 28,10,50,12,4,15
gotoxy 28,10
puts error11
gotoxy 28,11
puts error12
gotoxy 28,12
puts error13
readkey
window 28,10,50,12,3,3
clos:
closefile fl,handle
window 2,4,77,24,3,3
ret
endp
;****************************************************
;Пpоцедуpа ввода данных
;****************************************************
vvod PROC near
openfile fl,handle
vvodst1:
;ramka 13,5,66,19,1,15,18
gotoxy 15,6
puts vnzalap
getnumber s.nzala,2
gotoxy 15,7
puts vkolvop
getnumber s.kolvop,2
nachv:
;window 14,8,65,18,1,15
;gotoxy 15,8
;puts vmash
;getnumber s.mash,12
gotoxy 15,9
puts otv
gotoxy 15,10
puts pr
gotoxy 15,11
puts mon
gotoxy 15,12
puts port
gotoxy 15,13
puts disk
gotoxy 15,14
puts disket
gotoxy 15,15
puts xp
gotoxy 15,16
puts pasc
gotoxy 15,17
puts delp
c0: ;есть принтер
gotoxy 48,10
getch
cmp al,'1'
ja c0
cmp al,'0'
jb c0
outch al
cmp al,'0'
je c0_1
or s.bit,00000001b
jmp c1
c0_1:
and s.bit,11111110b
c1: ; жк монитор
gotoxy 48,11
getch
cmp al,'1'
ja c1
cmp al,'0'
jb c1
outch al
cmp al,'0'
je c1_1
or s.bit,00000010b
jmp c2
c1_1:
and s.bit,11111101b
c2: ; usb порт
gotoxy 48,12
getch
cmp al,'1'
ja c2
cmp al,'0'
jb c2
outch al
cmp al,'0'
je c2_1
or s.bit,00000100b
jmp c3
c2_1:
and s.bit,11111011b
c3:
gotoxy 48,13 ; cd-rw дисковод
getch
cmp al,'1'
ja c3
cmp al,'0'
jb c3
outch al
cmp al,'0'
je c3_1
or s.bit,00001000b
jmp c4
c3_1:
and s.bit,11110111b
c4: ;дисковод для дискеты
gotoxy 48,14
getch
cmp al,'1'
ja c4
cmp al,'0'
jb c4
outch al
cmp al,'0'
je c4_1
or s.bit,00010000b
jmp c5
c4_1:
and s.bit,11101111b
c5: ; windows xp
gotoxy 48,15
getch
cmp al,'1'
ja c5
cmp al,'0'
jb c5
outch al
cmp al,'0'
je c5_1
or s.bit,00100000b
jmp c5
c5_1:
and s.bit,11011111b
c6: ; паскаль
gotoxy 48,16
getch
cmp al,'1'
ja c6
cmp al,'0'
jb c6
outch al
cmp al,'0'
je c6_1
or s.bit,01000000b
jmp c6
c6_1:
and s.bit,10111111b
c7: ; дельфи
gotoxy 48,17
getch
cmp al,'1'
ja c7
cmp al,'0'
jb c7
outch al
cmp al,'0'
je c7_1
or s.bit,10000000b
jmp s7
c7_1:
and s.bit,01111111b
jmp s7
vvodst:
jmp vvodst1
vodnotend:
jmp nachv
s7:
mov ah,42h
mov bx,handle
xor cx,cx
xor dx,dx
mov al,2h
int 21h
mov ah,40h
mov bx,handle
mov cx,48 ;сколько писать
mov dx,offset s
int 21h
gotoxy 22,18
puts ex_esc
mov ah,8h
int 21h
cmp al,1bh
jne vodnotend
gotoxy 22,18
puts ex_esc1
mov ah,8h
int 21h
cmp al,1bh
jne vvodst
closefile fl,handle
window 15,5,65,20,3,3
ret
vvod ENDP
;****************************************************
; Пpоцедуpа поиска
;****************************************************
vivod PROC near
;ramka 20,10,60,12,1,15,18
gotoxy 21,11
puts vnzala
getnumber nz,2 ;Ввод № зала
mov al,count
mov kolvo,al
mov koor,13
;ramka 20,10,60,12,4,15,18
openfile fl,handle
mov index,0
snova:
mov ah,3Fh
mov bx,handle
mov cx,48 ;сколько читать
mov dx,offset s
int 21h
cmp ax,0 ;пока не конец файла
je kons11
mov di,0
mov si,0
mov cx,0
mov di,0
mov si,0
e:
mov cl,kolvo
cyc:
mov al,s.nzala[di]
cmp nz[si],al
je el
snova1:
jmp snova
el:
inc si
inc di
loop cyc
call tablout
inc index
jmp contin
kons11:
jmp kons
contin:
jmp snova
kons:
cmp index,0
jne net
gotoxy 34,11
puts svednet
readkey
net:
closefile fl,handle
window 2,4,77,24,3,3
ret
vivod ENDP
;****************************************************
;Пpоцедуpа помощи
;****************************************************
help PROC near
;ramka 15,4,66,21,3,15,18
gotoxy 33,5
window 16,5,65,20,3,15
puts priv6
gotoxy 25,6
puts helpstr1
gotoxy 23,7
puts helpstr2
gotoxy 33,8
puts helpstr3
;// window 21,9,58,9,1,11
;// gotoxy 37,9
;// puts priv2
;// outch '.'
gotoxy 33,10
puts helpstr4
;// window 21,11,58,11,1,11
;// gotoxy 35,11
;// puts priv3
;// outch '.'
gotoxy 16,11
puts helpstr5
;// window 21,13,58,13,1,11
;// gotoxy 37,13
;// puts priv4
;// outch '.'
gotoxy 16,13
puts helpstr6
gotoxy 16,15
puts helpstr7
gotoxy 16,16
puts helpstr8
;// window 21,17,58,17,1,11
;// gotoxy 37,17
;// puts priv5
;// outch '.'
;// gotoxy 29,18
;// puts helpstr9
;// window 26,20,58,20,1,11
gotoxy 30,20
puts presskey
readkey
;// window 20,4,60,22,3,3
ret
help ENDP
;****************************************************
;Пpоцедуpа вывода шапки таблицы
;****************************************************
shapka proc near
ramka 2,4,76,23,1,15,18
gotoxy 3,5
puts tab0
gotoxy 3,6
puts tab1
gotoxy 3,7
puts tab3
gotoxy 3,8
puts tab4
gotoxy 3,9
puts tab5
gotoxy 3,10
puts tab6
gotoxy 3,11
puts tab6a
gotoxy 3,12
puts tab7
ret
endp
;****************************************************
;Пpоцедуpа вывода таблицы на экpан
;****************************************************
tablout PROC near
call shapka
gotoxy 3,13
puts tab8
gotoxy 21,7
puts s.nzala
gotoxy 49,7
puts s.kolvop
; gotoxy 5,13
;puts s.ceh
gotoxy 3,14
puts tab9
mov al,s.bit
and al,00100000b
cmp al,0
jne portk
gotoxy 68,13
puts tabnet
jmp neportk
portk:
gotoxy 68,13
puts tabest
neportk:
mov al,s.bit
and al,00010000b
cmp al,1
jge diskk
gotoxy 60,13
puts tabnet
jmp nediskk
diskk:
gotoxy 60,13
puts tabest
nediskk:
mov al,s.bit
and al,00001000b
cmp al,1
jge disketk
gotoxy 49,13
puts tabnet
jmp nedisketk
disketk:
gotoxy 49,13
puts tabest
nedisketk:
mov al,s.bit
and al,00000100b
cmp al,1
jge xpk
gotoxy 38,13
puts tabnet
jmp nexpk
xpk:
gotoxy 38,13
puts tabest
nexpk:
mov al,s.bit
and al,00000010b
cmp al,1
jge monk
gotoxy 30,13
puts tabnet
jmp nemonk
monk:
gotoxy 30,13
puts tabest
nemonk:
mov al,s.bit
and al,00000001b
cmp al,1
jge prk
gotoxy 22,13
puts tabest
jmp neprk
prk:
gotoxy 22,13
puts tabest
neprk:
gotoxy 28,22
puts presskey
readkey
ret
tablout endp
finn:
clrscr
prog_exit
END start
Подключаемый модуль maclib1.inc
************************************************************
; Ввод строки из одних чисел getnumber(string,max_len)
; Ввод строки getstr(string,max_len)
; Ввод строки из одних рус. букв getword(string, max_len)
; Вывод строки puts(str)
; Ввод символа без отображения getch
; Вывод символа outch(ch)
; Задержка пока не нажата клавиша readkey
; Выход из программы prog_exit
; Очистка экрана clrscr
; Установка курсора gotoxy(x,y)
; Выключает курсор nocursor
; Рисования окна window(x1,y1,x2,y2,c_f,c_s)
; Рисования рамки ramka(x1,y1,x2,y2,c_f,c_s,c_t)
; Открытие файла openfile(filename,handle)
; Закрытие файла closefile(filename,handle)
;*****************************************************************
;===========================
; Ввод строки из одних чисел
;===========================
getnumber macro buf,max_len
local m,mm,mmm,konecm,back,succ
pusha
mov cx,max_len
xor bx,bx
m: mov buf[bx],' ';запробеливаем строку
inc bx
loop m
xor bx,bx
mmm:
getch ;считываем символ без отображения
cmp al,8 ;если backspase
je back ;то переходим на затирку символа
jmp succ ;иначе
back:
cmp bx,0 ;если кол-во ддлина строки равна 0
je succ ; то переходим
dec bx ;иначе из длину уменьшаем на 1
outch 8 ;переход курсора на 1 влево
outch 32 ;затираем предыдущий символ(ставим пробел)
outch 8 ;смещаем курсор на 1 влево
succ:
cmp al,13 ;сравниваем введённый символ с enter
je konecm ;если равно то переход
cmp bx,max_len ;сравниваем длину строки с заданной
je mmm ;если равно то на начало ввода
cmp al,'0' ;если код меньше кода 0
jl mmm ;то на начало ввода
cmp al,'9' ;если код больше кода 9
jg mmm ;то на начало ввода
outch al ;отображаем символ
mov buf[bx],al ;записываем его в строку
inc bx ;увеличеваем длину на 1
jmp mmm ;на начало ввода
konecm:
mov buf[bx],'$' ;записываем конец строки
mov count,bl ;в count длину строки
popa
endm
;==================================
; Ввод строки из одних русских букв
;==================================
getword macro buf,max_len
local m,mm,mmm,konecm,back,succ
pusha ;ПО АНАЛОГИИ СМ. ВВОД СТРОКИ ИЗ ОДНИХ ЧИСЕЛ
mov cx,max_len
xor bx,bx
m: mov buf[bx],' ';запробеливаем строку
inc bx
loop m
xor bx,bx
mmm:
getch
cmp al,8
je back
jmp succ
back:
cmp bx,0
je succ
dec bx
outch 8
outch 32
outch 8
succ:
cmp al,13
je konecm
cmp bx,max_len
je mmm
cmp al,45
je nes
cmp al,'А' ;выкидываем из таблицы всё кроме отрезка от А до я
jl mmm
cmp al,'я'
jg mmm
cmp al,'_' ; из этого отрезка выкидываем символы псевдографики
jl nes
cmp al,'_'
jg nes
jmp mmm
nes:
outch al
mov buf[bx],al
inc bx
jmp mmm
konecm:
mov buf[bx],'$'
mov count,bl
popa
endm
;==========================================
; Ввод символа с клавиатуры без отображения
;==========================================
getch macro
;На выходе - в al введённый символ.
mov ah,08h
int 21h
endm
;==========================
; Вывод символа на экран
;==========================
outch macro ch
push ax
push dx
mov ah,02h
mov dl,ch
int 21h
pop dx
pop ax
endm
;=========================
; Вывод строки на экран
;=========================
puts macro str
pusha
lea dx,str
mov ah,9
int 21h
popa
endm
;==========================================
; Задержка экрана пока не нажата клавиша
;==========================================
readkey macro
pusha
mov ah,7 ;номер функции
int 21h ;задержка экрана
popa
endm
;========================
; Выход из программы.
;========================
prog_exit macro
pusha
mov ah,4ch
int 21h
popa
endm
;=================================================
; Очистка экрана путём установки нового режима
;=================================================
clrscr macro
pusha
mov ah,0 ;;номер функции установки режима дисплея
mov al,3 ;;код режима 80*25 2:чёрно-белого, 3:цветного
int 10h ;;очистка экрана
popa
endm
;========================================
; Установка курсора.
;========================================
gotoxy macro x,y ; Переход на указанные координаты
pusha
mov ah,02h
mov dh,y ; строка
mov dl,x ; столбец
int 10h
popa
endm
;=======================
; Выключение курсора
;=======================
nocursor macro
pusha
mov ah,01h
mov ch,4
mov cl,0
int 10h
popa
endm
;=======================
; Включение курсора
;=======================
cursor macro
push ax
push cx
mov ah,01h
mov ch,3
mov cl,4
int 10h
pop cx
pop ax
endm
;=============================
; Рисования окна без рамки
;=============================
window macro x1,y1,x2,y2,c_f,c_s
pusha
mov cl,x1 ;верхний левый угол
mov ch,y1
mov dl,x2 ;нижний правый угол
mov dh,y2
mov ax,10h
mov bl,c_f ;цвет фона
mul bl
add al,c_s ;цвет текста
mov bh,al
mov al,24
mov ah,6h
int 10h
popa
endm
;====================
; Рисование рамки
;====================
ramka macro x1,y1,x2,y2,c_f,c_s,c_t
local m1,m2,m3,m4 ;;c_f цвет заливки окна
pusha ;;c_s цвет рамки окна
window x1+1,y1+1,x2+1,y2+1,0,0 ;тень ;;c_t цвет текста
window x1,y1,x2,y2,c_f,c_s
gotoxy x1,y1
outch '+'
mov cx,x2
sub cx,x1
dec cx
push cx
m1:
outch '-'
loop m1
outch '+'
mov al,y1
add al,1
mov cx,y2
sub cx,y1
dec cx
push cx
push ax
m2:
gotoxy x1,al
inc al
outch '¦'
loop m2
pop ax
pop cx
m3:
gotoxy x2,al
inc al
outch '¦'
loop m3
gotoxy x1,y2
outch '+'
pop cx
m4:
outch '-'
loop m4
outch '+'
window x1+1,y1+1,x2-1,y2-1,c_f,c_t
popa
endm
;===================
; Открытие файла
;===================
openfile macro filename,handle
local m,m1,m2,m3,m4,m5,m6,exit
pusha
mov ah,3Dh
mov al,2h
mov dx,offset filename
int 21h
cmp ax,02h
je m1
cmp ax,03h
je m2
cmp ax,04h
je m3
jmp exit
m1:
puts error1
jmp m
m2: puts error2
jmp m
m3: puts error3
m: mov ah,3Ch
mov cx,0
mov dx,offset filename
int 21h
cmp ax,03h
je m5
cmp ax,04h
je m6
jmp exit
m5: puts error2
jmp exit
m6: puts error3
exit:
mov handle,ax
popa
endm
;===================
; Закрытие файла
;===================
closefile macro filename,handle
pusha
mov dx,offset filename
mov ah,3Eh
mov bx,handle
int 21h
popa
endm