Структура: Необходимо организовать ввод данных в массив структур и поиск записи по имени. - Assembler

Узнай цену своей работы

Формулировка задачи:

Мне необходимо организовать ввод данных в массив структур и поиск записи по имени. Проблема заключается в том, что я не совсем понимаю как работать с этим массивом. Для начала я пытался просто вывести 1 имя, и на выходе получил какой-то мусор
Листинг программы
  1. ;pril_8.asm
  2. .286
  3. ;MASM
  4. .MODEL small
  5. .STACK 100h
  6.  
  7. worker struc
  8. nam db 20 dup (' ')
  9. age db 3 dup (' ')
  10. len dw 0
  11. worker ends
  12. .data
  13. mas worker 10 DUP (<>)
  14. rec worker <>
  15. i db 0
  16. msgNameInput db 10,13,"Input name : $";
  17. msgCountInput db 10,13,"Input count: $"
  18. msgAgeInput db 10,13,"Input age: $"
  19. nextRow db 10,13,'$'
  20. inpstr db 20 dup('$')
  21. index dw 0
  22. .code
  23. assume ds:@data,es:@data
  24.  
  25. inputString proc
  26. lea dx,nextRow
  27. mov ah,09h
  28. int 21h
  29. lea dx,msgNameInput
  30. mov ah,09h
  31. int 21h
  32. mov bl,0
  33. mov si,0
  34. while2:
  35. mov ah,01h
  36. mov al,00h
  37. int 21h
  38. cmp al,0Dh
  39. je break1
  40. mov [rec].nam+si, al
  41. inc si
  42. jmp while2
  43. mov inpstr+si,'$'
  44. break1:
  45. lea di,rec
  46. mov [di].len,si
  47. ret
  48. endp
  49. inputAge proc
  50. lea dx,msgAgeInput
  51. mov ah,09h
  52. int 21h
  53. mov ah,01h
  54. mov al,00h
  55. int 21h
  56. mov [di].age, al
  57. mov ah,01h
  58. mov al,00h
  59. int 21h
  60. mov [di].age+1, al
  61. ret
  62. endp
  63.  
  64. main:
  65. push @data
  66. pop ds
  67. lea dx, msgCountInput
  68. mov ah,09h
  69. int 21h
  70. mov ah,01h
  71. mov al,00h
  72. int 21h
  73. sub al,30h
  74. mov ah,0
  75. mov cx,ax
  76. mov bx, type worker
  77. lea di,mas
  78. do:
  79.  
  80. call InputString
  81. mov si,0
  82. call InputAge
  83.  
  84. add di, bx
  85. inc index
  86. loop do
  87. mov cx,index
  88. dec cx
  89. sub di, bx
  90.  
  91. lea dx,nextRow
  92. mov ah,09h
  93. int 21h
  94. lea dx,[di].nam
  95. mov ah,09h
  96. int 21h
  97.  
  98. mov ax,4c00h
  99. int 21h
  100. end main

Решение задачи: «Структура: Необходимо организовать ввод данных в массив структур и поиск записи по имени.»

textual
Листинг программы
  1. model   tiny
  2. .code
  3. org 100h
  4. szName  equ 20
  5. worker  struc
  6.     nxt dw  ?
  7.     nam db  szName dup(?)
  8.     age dw  ?
  9. worker  ends
  10. szWorker    =szName + 4
  11. begin:
  12.     xor ax,ax
  13.     lea si,arrayWorker
  14.     mov [si].nxt,ax
  15. Menu:   mov ah,9
  16.     lea dx,dbMenu
  17.     int 21h
  18.     xor ax,ax
  19.     int 16h
  20.     and ax,0Fh
  21.     cmp al,3
  22.     ja  Menu
  23.     shl ax,1
  24.     lea bx,dwMenu
  25.     add bx,ax
  26.     call    [bx]
  27.     jmp Menu
  28. dbMenu  db  10,13,13,'1-Add new Worker;'
  29.     db  10,13,'2-Show all worker;'
  30.     db  10,13,'3-Find worker;'
  31.     db  10,13,'4-Save data;'
  32.     db  10,13,'5-Load data;'
  33.     db  10,13,'0-Exit.$'
  34. dwMenu  dw  offset ExitWorker;0
  35.     dw  offset ReadWorker;1
  36.     dw  offset ShowWorker;2
  37.     dw  offset FindWorker;3
  38.     dw  offset SaveWorker;4
  39.     dw  offset LoadWorker;5
  40. ExitWorker  proc
  41.     pop ax
  42.     ret
  43. ExitWorker  endp
  44. ReadWorker  proc
  45.     lea si,arrayWorker
  46. RW1:    mov ax,[si].nxt
  47.     or  ax,ax
  48.     jz  RW2
  49.     mov si,[si].nxt
  50.     jmp short RW1
  51. RW2:    mov ah,9
  52.     lea dx,dbName
  53.     int 21h
  54.     mov ah,10
  55.     lea dx,dbMax
  56.     int 21h
  57.     xor ch,ch
  58.     mov cl,dbLen
  59.     or  cx,cx
  60.     jz  RW0
  61.     xor bx,bx
  62. RW3:    mov al,dbStr[bx]
  63.     mov [si+bx].nam,al
  64.     inc bx
  65.     loop    RW3
  66.     mov al,'$'
  67.     mov [si+bx].nam,al
  68.     mov ah,9
  69.     lea dx,dbAge
  70.     int 21h
  71.     call    InputNumber
  72.     mov [si].age,ax
  73.     mov ax,szWorker
  74.     add ax,si
  75.     mov [si].nxt,ax
  76.     mov si,[si].nxt
  77.     jmp short RW2
  78. RW0:    xor ax,ax
  79.     mov [si].nxt,ax
  80.     ret
  81. ReadWorker  endp
  82. dbName  db  10,13,'input worker name:$'
  83. dbAge   db  10,13,'input worker age:$'
  84. dbMax   db  szName
  85. dbLen   db  ?
  86. dbStr   db  szName dup(?)
  87. ShowWorker  proc
  88.     mov ah,9
  89.     lea dx,dbShow
  90.     int 21h
  91.     lea si,arrayWorker
  92. SW1:    mov ax,[si].nxt
  93.     or  ax,ax
  94.     jz  SW0
  95.     xor bx,bx
  96. SW2:    mov al,[si+bx].nam
  97.     mov dbStr[bx],al
  98.     inc bx
  99.     cmp al,'$'
  100.     jnz SW2
  101.     mov ah,9
  102.     lea dx,dbStr
  103.     int 21h
  104.     mov al,' '
  105.     int 29h
  106.     mov ax,[si].age
  107.     call    OutputNumber
  108.     mov si,[si].nxt
  109.     jmp short SW1
  110. SW0:    ret
  111. ShowWorker  endp
  112. dbShow  db  10,13
  113.     db  'Worker list:'
  114.     db  10,13,'$'
  115. FindWorker  proc
  116.     mov ah,9
  117.     lea dx,dbName
  118.     int 21h
  119.     mov ah,10
  120.     lea dx,dbMax
  121.     int 21h
  122.     lea si,arrayWorker
  123. FW1:    mov ax,[si].nxt
  124.     or  ax,ax
  125.     jz  FW0
  126.     mov bx,-1
  127. FW2:    inc bx
  128.     mov al,[si+bx].nam
  129.     cmp al,dbStr[bx]
  130.     jz  FW2
  131.     cmp al,'$'
  132.     jz  FW4
  133. FW3:    mov si,[si].nxt
  134.     jmp FW1
  135. FW4:    cmp dbStr[bx],13
  136.     jnz FW3
  137.     mov ah,9
  138.     lea dx,dbYes
  139.     int 21h
  140.     mov ax,0924h
  141.     mov dbStr[bx],al
  142.     lea dx,dbStr
  143.     int 21h
  144.     mov al,' '
  145.     int 29h
  146.     mov ax,[si].age
  147.     call    OutputNumber
  148. FW0:    or  ax,ax
  149.     jnz FW01
  150.     mov ah,9
  151.     lea dx,dbNot
  152.     int 21h
  153. FW01:   ret
  154. FindWorker  endp
  155. dbNot   db  10,13,'Worker not found',10,13,'$'
  156. dbYes   db  10,13,'Worker: $'
  157. SaveWorker  proc
  158.     ret
  159. SaveWorker  endp
  160. LoadWorker  proc
  161.     ret
  162. LoadWorker  endp
  163. InputNumber proc
  164.     mov bx,10
  165.     xor di,di
  166. IN1:    xor ax,ax
  167.     int 16h
  168.     cmp al,13
  169.     jz  IN0
  170.     cmp al,'0'
  171.     jb  IN1
  172.     cmp al,'9'
  173.     ja  IN1
  174.     int 29h
  175.     and ax,0Fh
  176.     xchg    di,ax
  177.     xor dx,dx
  178.     mul bx
  179.     add di,ax
  180.     jmp short IN1
  181. IN0:    mov ax,di
  182.     ret
  183. InputNumber endp
  184. OutputNumber    proc
  185.     mov bx,10
  186.     xor cx,cx
  187. ON1:    xor dx,dx
  188.     div bx
  189.     push    dx
  190.     inc cx
  191.     or  ax,ax
  192.     jnz ON1
  193. ON2:    pop ax
  194.     or  al,'0'
  195.     int 29h
  196.     loop    ON2
  197.     mov al,10
  198.     int 29h
  199.     mov al,13
  200.     int 29h
  201.     ret
  202. outputNumber    endp
  203. ;тут типа массив
  204. arrayWorker label   word
  205.     end begin

Объяснение кода листинга программы

  1. В коде объявляется структура worker с полями nxt (следующий элемент в массиве), nam (имя работника) и age (возраст).
  2. Создается массив структур arrayWorker для хранения информации о работниках.
  3. Вводится меню для пользователей с различными опциями.
  4. Опции обрабатываются через процедуры, например:
    • ReadWorker для добавления нового работника в массив;
    • ShowWorker для отображения информации о всех работниках;
    • FindWorker для поиска работника по имени;
    • SaveWorker и LoadWorker для сохранения и загрузки данных.
  5. Используются процедуры InputNumber и OutputNumber для ввода числовых значений и вывода чисел соответственно.
  6. Имеются также определения для вывода различных сообщений, таких как Worker not found и Worker: $.
  7. После всех процедур и опций программы, используется массив arrayWorker для хранения данных о работниках.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы