Студентам с вопросами о лабораторных работах сюда

Тема в разделе "WASM.BEGINNERS", создана пользователем IceStudent, 11 ноя 2006.

  1. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    AHAPXUCT
    Опять двадцать пять... Попробую объяснить более подробно.
    Хэндл не становился частью буфера. Само слово handle - это часть адреса, а именно - смещение. Ваша инструкция
    mov handle,ax
    равносильная следующей:
    mov ds:handle, ax
    , т.е. адрес, по которому записывается значение регистра ax вычисляется следующим образом: ds*10h + handle, где handle - это некое число, являющееся смещением переменной handle относительно начала сегмента данных. Очевидно, что при изменении значения ds также изменится и значение выражения ds*10h + handle. В Вашем случае
    mov handle, ax
    запишет значение регистра ax в область видеопамяти, т.к. Вы сами засунули в ds указатель на область видеопамяти (уменьшенный в 16 (10h) раз, если быть точным).
    Аналогично инструкция
    mov bx,handle
    , которая равносильна инструкции
    mov bx,ds:handle
    будет брать данные не из памяти, где реально лежит переменная handle, а из области видеопамяти (а у Вас там в Вашем последнем коде ничего даже близко похожего на хэндл открытого файла нету). Теперь какие есть выходы:
    1) Настроить, например, es на начало сегмента данных (т.е. присвоить ему старое значение ds) и выполнять обращение к сегменту данных через переопределение сегмента:
    mov bx,es:handle
    2) Вернуть значение ds на место перед тем, как обращаться к сегменту данных (а также изменять его на новое значение тоже после обращения к сегменту данных), в частности к переменной handle.
    3) Хранить значение хэндла не в сегменте данных, а, например, в стеке.

    Как я уже сказал, нет необходимости открывать файл повторно. А Вы упорно оставляете вызов функции 3Dh. Если убрать кусок кода, обращающийся к этой фунции, то проблема решается простой перестановкой инструкций подмены ds и обращения к handle. Ну и следите же Вы наконец, чтобы НИ ОДНО обращение к handle — ни чтение ни запись — не происходило через новый указывающий на видеопамять ds!
    Ну и собственно... не знаю... если так задумано, что сохранённый файл должен хранить помимо самих символов ещё и их цвета... ну что ж... по большому счёту можно это оставить и так.
     
  2. AHAPXUCT

    AHAPXUCT New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2009
    Сообщения:
    8
    l_inc Я извиняюсь, но возник глюк : После изменений с файлами как Вы сказали, все работает отлично , если только я не нажму "этот злополучный Ентер"
    Я давно заметил но не оброщал внимание, если нажать на ентер а потом стрелками перейти на освободиашееся место - то курсор зеленеет
    Странно потому что если я держу пробел и добиваюсь того же еффекта (перехода на новый ряд) никакой зелени, и файл сохроняется отлично
    А с ентером Глюки !
    А ведь ентер я в принцыпе пробелами и делаю ! Я измеряю растояние от последнего символа в строке и заполняю его пробелами
    Опять я чето упустил, или чтото о чем я не знаю ?

    Вот последняя версия кода :
    Код (Text):
    1. ; редактор
    2. .model small
    3. .stack 100h
    4. .data
    5. InfoMess db 'Text editor.',0ah,0dh
    6. db 'Any key - run programm',0ah,0dh,'$'
    7. Xmax equ 80
    8. Ymax equ 25
    9. entr  db     0ah,0dh,'$'
    10. tab             equ     09h
    11. cOff db 10,13,'saving... !','$',10,13
    12. FileName db 'asm_file.txt',0
    13. beginMessage DB 10,13,'enter file name !$',10,13
    14. Handle   DW ?
    15.  
    16.  
    17. .code
    18.  
    19. MoveCursor proc
    20.  
    21. cmp dl,0
    22. jge mc_next1
    23. mov dl,Xmax-1
    24. dec dh
    25. cmp dh,0
    26. jge test_cur
    27. xor dx,dx
    28. jmp test_cur
    29. mc_next1:
    30. cmp dl,Xmax-1
    31. jle mc_next2
    32. xor dl,dl
    33. inc dh
    34. cmp dh,Ymax-1
    35. jle mov_cur
    36. mov dl,Xmax-1
    37. mov dh,Ymax-1
    38. jmp test_cur
    39. mc_next2:
    40. cmp dh,0
    41. jge mc_next3
    42. xor dh,dh
    43. jmp test_cur
    44. mc_next3:
    45. cmp dh,Ymax-1
    46. jle test_cur
    47. mov dh,Ymax-1
    48. test_cur:
    49. call AddrSym
    50. cmp si,bp
    51. jg no_move
    52.  
    53. mov_cur:
    54.  
    55. xor bx,bx
    56. mov ax,0200h
    57. int 10h
    58. ret
    59. no_move:
    60. mov dx,bx
    61. ret
    62. MoveCursor endp
    63.  
    64. DelSym proc
    65.  
    66. call AddrSym
    67. dec bp
    68. mov cx,bp
    69. sub cx,si
    70. mov di,si
    71. inc si
    72. shl si,1
    73. shl di,1
    74. push ds
    75. push es
    76. pop ds
    77. cld
    78. rep movsw
    79. pop ds
    80. mov word ptr es:[di],0720h
    81. ret
    82.  
    83. DelSym endp
    84.  
    85.  
    86.  
    87. InsSym proc
    88.  
    89. cmp bp, 80*25
    90. jae exit_InsSym
    91. call AddrSym
    92. push cx
    93. mov cx,bp
    94. sub cx,si
    95. jcxz no_sym
    96. push si
    97. mov di,bp
    98. mov si,bp
    99. dec si
    100. shl si,1
    101. shl di,1
    102. push ds
    103. push es
    104. pop ds
    105. std
    106. rep movsw
    107. pop ds
    108. pop si
    109. no_sym:
    110. shl si,1
    111. mov word ptr es:[si],ax
    112. inc dl
    113. inc bp
    114. call MoveCursor
    115. pop cx
    116. exit_InsSym:
    117. ret
    118.  
    119. InsSym endp
    120.  
    121.  
    122.  
    123. AddrSym proc
    124.  
    125. push cx
    126. push ax
    127. push bx
    128. mov si,dx
    129. xor ax,ax; =0
    130. xor bx,bx; =0
    131. and si,00ffh
    132. mov bl,dh
    133. mov al,dh
    134. shl al,1
    135. shl al,1
    136. mov cx,4
    137. add ax, bx ;
    138. shl ax, cl
    139. add si,ax
    140. pop bx
    141. pop ax
    142. pop cx
    143. ret
    144. AddrSym endp
    145.  
    146.  
    147.  
    148. label1:
    149. push ax
    150. push bx
    151. push cx
    152. push dx
    153. push si
    154. push di
    155.  
    156.  
    157. push ds
    158. pop es
    159.  
    160.  
    161.     xor ax,ax
    162.     mov ah,09h
    163.     mov dx,offset cOff;beginMessage
    164.     int 21h
    165.      
    166.  
    167.     mov ah,3Ch         ;Функция создания файла
    168.     mov dx,offset FileName
    169.     xor cx,cx         ;Атрибуты обычные
    170.     int 21h
    171.  
    172.     mov handle,ax          
    173.  
    174.   ; mov dx,offset FileName      ; put offset of filename in dx
    175.   ; mov al,2            ; access mode -read and write
    176.   ; mov ah,3Dh          ; function 3Dh - open the file
    177.   ; int 21h    
    178.    
    179.  
    180.   push 0b800h
    181.   pop ds
    182.  
    183.        
    184.   mov ah,40h
    185.   mov bx,es:handle    ;В BX - номер файла
    186.   xor si,si
    187.   mov si,bp
    188.   add si,bp  
    189.   xor dx,dx      
    190.   mov cx,si      
    191.   int 21h        
    192.  
    193.  
    194.  
    195.  mov ah,3Eh
    196.  mov bx,es:handle
    197.  int 21h
    198.        
    199.        
    200.       ; pop ds
    201.        pop di
    202.        pop si
    203.        pop dx
    204.        pop cx
    205.        pop bx
    206.        pop ax
    207.  
    208.  jmp getchar
    209.  
    210.  
    211.  
    212.  
    213.  
    214. .startup
    215.  
    216. mov dx,offset InfoMess
    217. mov ax,0900h
    218. int 21h
    219.  
    220. mov ax,0c07h
    221. int 21h
    222.  
    223. run:
    224. mov ax,0f00h
    225. int 10h
    226.  
    227. mov ah,bh
    228. push ax
    229.  
    230.  
    231. mov ax,0003h
    232. int 10h
    233.  
    234.  
    235. mov ax,0b800h
    236. mov es,ax
    237.  
    238.  
    239.  
    240. xor dx,dx
    241.  
    242. xor bp,bp
    243.  
    244.  
    245. getchar:
    246. mov ax,0700h
    247. int 21h
    248.  
    249.  
    250. cmp al,0dh;enter
    251. jne save
    252. jmp endl
    253.  
    254.  
    255.  
    256. save:
    257. cmp al,9h
    258. jne esc
    259. jmp label1
    260.  
    261.  
    262.  
    263. hz2:
    264. call MoveCursor
    265. call InsSym
    266. dec ch
    267. jmp hz1
    268.  
    269. esc:
    270. cmp al,27;Esc
    271. jne edit
    272. jmp exit
    273.  
    274.  
    275. endl:
    276. mov ch,80
    277. sub ch,dl
    278.  
    279.  
    280. hz1:
    281. cmp ch,0
    282. jne hz2
    283. jmp getchar
    284.  
    285.  
    286.  
    287.  
    288.  
    289. edit:
    290. mov bx,dx
    291. cmp al,8
    292. jne edit0
    293. test dx,dx
    294. jz getchar
    295. dec dl;сдвинуть курсор влево
    296. call MoveCursor
    297. call DelSym;удалить символ под курсором
    298. jmp getchar
    299.  
    300.  
    301. edit0:
    302. cmp al,20h
    303. jb edit1
    304.  
    305. cmp al,7dh
    306. ja edit1
    307. call InsSym
    308. jmp getchar
    309.  
    310.  
    311.  
    312. edit1:
    313. cmp al,0; расширенный ASCII
    314. jne getchar
    315. mov ax,0700h
    316. int 21h
    317.  
    318.  
    319. cmp al,48h; стрелка вверх
    320. jne kDown
    321. dec dh
    322. jmp lSetCursor
    323. kDown:
    324. cmp al,50h; стрелка вниз
    325. jne kLeft
    326. inc dh
    327. jmp lSetCursor
    328. kLeft:
    329. cmp al,4bh; стрелка влево
    330. jne kRigth
    331. dec dl
    332. jmp lSetCursor
    333. kRigth:
    334. cmp al,4dh; стрелка вправо
    335. jne getchar
    336. inc dl
    337. lSetCursor:
    338. call MoveCursor
    339. jmp getchar ; вернутся к опросу клавиатуры
    340.  
    341. exit:
    342. pop dx
    343. mov ax,0000h
    344. mov al,dl
    345. int 10h
    346.  
    347. mov ax,0500h
    348. mov al,dh
    349. int 10h
    350.  
    351. exit1:
    352. mov ax, 4c00h ; закончить программу
    353. int 21h
    354.  
    355. end
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    AHAPXUCT
    Честно говоря, код слишком накручен, чтобы было не лень разбираться. :) Поэтому так... навскидку... зелёный цвет курсора означает, что Вы заполнили в этом месте в видеопамяти байты цвета в качестве зелёного. По всей видимости, происходит это заполненение здесь:
    Код (Text):
    1. no_sym:
    2. shl si,1
    3. mov word ptr es:[si],ax
    А вот теперь вопрос: а откуда Вы знаете, что в ax то, что Вам нужно? Видимо, значение ax в этом месте сохранилось ещё с момента вызова функции установки курсора:
    Код (Text):
    1. mov_cur:
    2. xor bx,bx
    3. mov ax,0200h
    4. int 10h
    5. ret
    Подозреваю, что, после замены инструкции
    mov word ptr es:[si],ax
    на
    mov word ptr es:[si],0720h
    курсор зеленеть перестанет. Но багов ещё полно... И ИМХО проще написать с нуля по предложенному FatMoon принципу, чем попереправить все эти баги. И реализация всех действий при этом существенно упростится.
     
  4. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Вот для примера процедура print выводит буфер по адресу ds:si длиной cx на экран, при этом учитывается Enter.
    Код (Text):
    1. org 100h
    2. mov ax,3
    3. int 10h
    4.  
    5. mov  cx,16
    6. mov  si,text
    7. call print
    8. int 16h
    9. ret
    10.  
    11. text db 'asdasdasd',13,'qweqwe'
    12.  
    13. print:pusha
    14.       push 0B800h
    15.       pop  es
    16.       xor  di,di
    17.       xor  ax,ax
    18.       mov  bx,160
    19.       textout:movsb
    20.               inc di
    21.               sub bx,2
    22.               cmp byte[ds:si],13
    23.               jne @f
    24.               inc si
    25.               dec cx
    26.               add di,bx
    27.               mov bx,160
    28.               @@:
    29.               cmp di,4000
    30.               ja @f
    31.               dec cx
    32.       jne textout
    33.       @@:
    34.       popa
    35. ret
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    murder
    А вот к примеру по сути та же самая процедура, только парой строк короче :derisive: :

    Код (Text):
    1. mov ah,09h
    2. int 21h
     
  6. AHAPXUCT

    AHAPXUCT New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2009
    Сообщения:
    8
    :)
    l_inc
    murder и всем остальным СПАСИБО за сотруднечество !
    l_inc Ваше предположение по поводу
    Код (Text):
    1. mov word ptr es:[si],0720h
    оказалось верным, только пришлось сделать копию всей процедуры InsSym вместе с этой заменой строго для кнопки Ентер (ах не зря стоит в изначальной версии этой же процедуры :) )
    Всем еще раз спасибо и с наступающим вас праздником 9го Мая !
     
  7. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Р-р-р... Если делать как ты, то в самом деле сложновато. А если вставлять 2 байта в массив в памяти (не видео-памяти!!!), а потом печатать на экран, то ... все прекрасно само без твоего участия напечатается с новой строки после энтера. Именно 0dh 0ah надо вставлять, иначе может быть либо затертая строка, либо начало строки от середины экрана =)
     
  8. Noga

    Noga New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2008
    Сообщения:
    92
    Доброго времени суток,

    Я на досуге написал простой сканер портов и столкнулся с проблемой.

    Я заношу открытые порты вот так:
    Код (Text):
    1. .data?
    2.        EditText db 1000 dup(?)
    3. .code
    4.  
    5. ConThr proc
    6.        ....
    7.        mov ebx,dword ptr [sin.sin_port]
    8.        bswap ebx
    9.        shr ebx,16
    10.        invoke wsprintf,ADDR szPort,ADDR ifmt,ebx
    11.  
    12.        invoke lstrcat,offset EditText,ADDR szPort
    13.        invoke lstrcat,offset EditText,ADDR comma
    14.        next:
    15.        ....
    Соответственно после повторного сканирования, те же порты дописываются в массив например (145, 240, 912, 145, 240, 912). Как мне лучше всего обнулить массив ?

    И еще один вопрос. Я встречал конструкции, где используется $CTA0

    Например вот :
    Код (Text):
    1.        push ebx
    2.        push $CTA0('%i')
    3.        push offset szPort
    4.        call wsprintfA
    Я предполагаю, что это макрос, где можно его взять?
     
  9. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Noga
    в KmdKit 1.8 by Four-F
     
  10. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    в простейшем случае записать 0 в начало.
    mov byte ptr EditText,0
    Но красивше (поскольку это все-таки ассемблер) сделать как-то так:

    Код (Text):
    1. mov [ptEditText], EditText   ;before loop. Make a pointer to string position
    2. ...
    3. ...
    4. invoke wsprintf, ptEditText, "%i %s", ebx, ", "   ; Is that right???
    5. ;MSDN note:
    6. ;It is important to note that wsprintf uses the C calling convention (_cdecl),
    7. ;rather than the standard call (_stdcall) calling convention. As a result, it is
    8. ;the responsibility of the calling process to pop arguments off the stack, and
    9. ;arguments are pushed on the stack from right to left.
    10.  
    11. add ptEditText, eax   ;Now you can again do wsprintf, to continue string formation
    12. ...
    13. ...
    14. mov byte ptr [ptEditText], 0   ;before output
    Чего-то я тут мог наврать, насчет косвенной адресации :) не проснулся еще. Но смысл должен быть понятен. И чего-то там с порядком аргументов и освобождением стека, не зря наверно написано...
     
  11. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Конечно наврал... Причем круто... такой адресации вообще не существует =) Но вот это работающий код, толко что проверил: (fasm)
    Код (Text):
    1. include 'win32ax.inc'
    2.  
    3. .data
    4. sFrmt db "%i %s",0
    5. sComma db ", ",0
    6. align 4
    7. NumArray dd 915, 124, 8080, 9099, 16350, 4
    8. ptEditText dd ?
    9. EditText db 1000 dup(?)
    10.  
    11. .code
    12.   start:
    13.   mov [ptEditText], EditText   ;before loop. Make a pointer to string position
    14.   mov ebx, 6
    15.   mov esi, NumArray
    16. @lp:
    17.     invoke wsprintf, [ptEditText], sFrmt, dword [esi], sComma
    18.     add esi,4
    19.     add [ptEditText], eax   ;Now we can again do wsprintf, to continue string formation
    20.     add esp, 16
    21.     dec ebx
    22.     jnz @lp
    23.   mov esi, [ptEditText]
    24.   mov byte ptr (esi-2), 0   ;remove last comma =)
    25.   invoke  MessageBox,HWND_DESKTOP,EditText,"Win32 Assembly",MB_OK
    26.   invoke  ExitProcess,0
    27. .end start
     
  12. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    как всегда, без редактирования... Вдогонку: если не понятно, к чему это я - это иллюстрация к созданию такой же строки, как у тебя, БЕЗ lstrcat, с очисткой стека после wsprintf, и без дублирования строки. Естественно, чтоб было без дублирования, надо перед формированием новой строки заново сделать mov [ptEditText], EditText
     
  13. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    епрст, верните редактирование!!!
    вдогонку: вот что значит не привыкший к С и вызовам wsprintf... конечно же, запятую отдельно вовсе не надо, ее включить в шаблон форматирования =)
    Код (Text):
    1. .data
    2. sFrmt db "%i, ",0
    3. ; sComma db ", ",0
    4. ...
    5.     invoke wsprintf, [ptEditText], sFrmt, dword [esi]
    6.     ...
    7.     add esp, 12
    8. ...
     
  14. Noga

    Noga New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2008
    Сообщения:
    92
    Y_Mur
    FatMoon

    Спасибо!
     
  15. Noga

    Noga New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2008
    Сообщения:
    92
    Доброго времени суток.

    У меня возникла проблема в данных кусках кода http://www.everfall.com/paste/id.php?sqw0p7oge3sk

    А именно:

    Я пытаюсь закрыть тред, но программа падает на этом куске. Олли говорит, что Invalid Handle.

    Если я закоменчу:

    Код (Text):
    1.    invoke getservbyport,eax,ADDR ProtoTCP          ; db "TCP",0
    2.         mov esi,eax                 ;â esi óêàçàòåëü íà SERVENT
    3.         mov esi,[esi+4]
    4.         mov esi,[esi]
    5.         mov pServ,esi
    То всё работает.

    P.S. Медленно конечно сканит, но в ближайшем будущем я это поправлю ).
     
  16. Noga

    Noga New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2008
    Сообщения:
    92
    Может мне необходимо что-то сохранять?
     
  17. Student

    Student New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2009
    Сообщения:
    7
    У меня два вопроса. 1. Для выполнения задания необходимо знать как умножаются перестановки и как находится обратная перестановка. Я посмотрел десяток книг по дискретной математике, в некоторых есть раздел "Перестановки", но необходимая информация отсутствует. Объясните кому несложно или подскажите книгу где это есть.
    2. Нужно написать программу для нахождения остовного графа методом обхода в ширину. Я реализовал это на Builder 6.0 в следующем виде. Но проблема в том что остовной цикл это минимальный подграф не имеющий циклов. Т.е. при создании должны учитываться веса ребер, которые в данной задаче задаются растоянием между точками. И я не могу понять как это привязать к условию.
    Код (Text):
    1. //---------------------------------------------------------------------------
    2.  
    3. #include <vcl.h>
    4. #pragma hdrstop
    5.  
    6. #include <stdlib.h>
    7. #include <conio.h>
    8. #include <stdio.h>
    9. #include <math.h>
    10. #include <iostream.h>
    11. #include <alloc.h>
    12. #define QUEUE struct queue
    13.  
    14. #include "Unit1.h"
    15. //---------------------------------------------------------------------------
    16. #pragma package(smart_init)
    17. #pragma resource "*.dfm"
    18. TForm1 *Form1;
    19. //---------------------------------------------------------------------------
    20. __fastcall TForm1::TForm1(TComponent* Owner)
    21.         : TForm(Owner)
    22. {
    23. }
    24. //---------------------------------------------------------------------------
    25. //стуктура элемента очереди
    26. QUEUE
    27. {
    28.    int info ;
    29.    QUEUE *next ;
    30. };
    31. //координаты точек
    32. int koord[5][2] =
    33. {
    34.         {200, 100},
    35.         {100, 200},
    36.     {200,400},
    37.     {500,100},
    38.     {400, 300}
    39. };
    40. //матрица смежности
    41. int edge[12][2] =
    42. {{0,1},{0,4},{1,0},{1,2},{2,1},{2,3},{2,4},{3,2},{3,4},{4,0},{4,2},{4,3}};
    43.  
    44. int vess (int x0, int y0, int x1, int y1)
    45. {
    46.  
    47. }
    48.  
    49. int fnd(int z,int v)
    50. {
    51.   for(int i=0;i<16;i++)
    52.    {
    53.      if(edge[i][0]==z && edge[i][1]==v ) return 1;
    54.    }
    55.  return 0;
    56. }
    57.  
    58.  
    59. //рисование линии
    60. void line(int x0, int y0, int x1, int y1)
    61. {
    62.         Form1->Image1->Canvas->MoveTo(x0, y0);
    63.         Form1->Image1->Canvas->LineTo(x1, y1);
    64. }
    65. //установка цветы линии
    66. void setcolor(int color)
    67. {
    68. Form1->Image1->Canvas->Pen->Width=3;
    69. if(color==1)Form1->Image1->Canvas->Pen->Color=clBlue;
    70. else if(color==4)Form1->Image1->Canvas->Pen->Color=clRed;
    71. }
    72.  
    73. //структура точки
    74. struct point
    75. {
    76.    float x,y;   //координаты точки
    77.    int info;    //номер точки
    78. } points[5];
    79.  
    80. // добавление в конец очереди
    81. void append( QUEUE **q, int item )
    82. {
    83.    // указатель на текущий и предшествующий элементы
    84.    QUEUE *current = *q, *prev = 0;
    85.  
    86.    QUEUE *new_node = (QUEUE * ) malloc (sizeof(QUEUE) );
    87.    new_node -> info = item; // информационная часть
    88.    // адресная часть последнего элемента = 0
    89.    new_node -> next = 0;
    90.  
    91.    while(current)       // пока не конец очереди
    92.    {
    93.       // переход на следующий элемент
    94.       prev = current; current = current->next;
    95.    }
    96.    if (prev) prev->next = new_node; // если очередь не пуста
    97.    else *q = new_node;  // если пуста
    98. }
    99.  
    100. // извлечение первого элемента
    101. int take_out ( QUEUE **q, int *error)
    102. {
    103.    QUEUE *old_item = *q ;   // начало очереди
    104.    int old_info = 0 ;
    105.    if ( *q )    // если очередь не пуста
    106.    {
    107.       old_info = old_item -> info;
    108.       *q = ( *q ) -> next;
    109.       free (old_item ); // уничтожение элемента
    110.       *error = 0;
    111.    } else *error = 1;
    112.    return ( old_info );
    113. }
    114.  
    115. int isempty(QUEUE **q)
    116. {
    117.    if(*q) return 0; // если очередь не пуста, возвращается 0
    118.    else return 1;
    119. }
    120. //подпись точек
    121. void text(int i,int x,int y)
    122. {
    123. Form1->Image1->Canvas->TextOutA(x,y,
    124. "Point "+IntToStr(i)+" ("+IntToStr(x)+", "+IntToStr(y)+" )");
    125. }
    126.  
    127. int c[5]; //массив раскраски
    128.  
    129. void __fastcall TForm1::Button1Click(TObject *Sender)
    130. {
    131. QUEUE  *q=0;
    132.             int  err;
    133.             int i,j,p;
    134.             //инициализация координат точек
    135.             for(i=0;i<5;i++)
    136.             {
    137.             points[i].x=koord[i][0];
    138.             points[i].y=koord[i][1];
    139.             points[i].info=i;
    140.             }
    141.             //изображение графа
    142.             for(i=0;i<5;i++)
    143.                 for(j=0;j<5;j++)
    144.                  {
    145.                         setcolor(1);
    146.                         if(fnd(i,j))
    147.             line(points[i].x,points[i].y,points[j].x,points[j].y);//ребро
    148.             text(i,points[i].x,points[i].y);                    //вершина
    149.  
    150.                        }
    151. //Метод обхода в ширину
    152. // Установить c[i] = -1, для всех i = 0, 1, ..., n-1.
    153.    for (i=0;i<5;i++)
    154.      c[i]=-1;           //расраска вершин
    155.  
    156. c[0]=0;
    157. append(&q,0);   // запомнить в очередь
    158.  
    159.    while( !isempty(&q) )    // пока очередь не пуста
    160.           {
    161.       p=take_out(&q,&err);// извлечь вершину из очереди
    162.       for(i=0;i<5;i++)
    163.       if(fnd(p,i)&&c[i]<0)
    164.       {
    165.        c[i]=p;
    166.        append(&q,i); // нераскрашенные смежные
    167.           // вершины запомнить в очередь
    168.       }
    169.         }
    170. }
    171. //---------------------------------------------------------------------------
    172. void __fastcall TForm1::Button2Click(TObject *Sender)
    173. {    //изображение остовного графа
    174.     for(int i=0;i<5;i++) {
    175.            setcolor(4);
    176.            line(points[c[i]].x,points[c[i]].y,points[i].x,points[i].y);
    177.                        }
    178. }
    179. //---------------------------------------------------------------------------
    P.S. я написал прогу для нахождения количества неугрожающих друг другу сверхферзей. Из будет не 64, а 6 =)
     
  18. Noga

    Noga New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2008
    Сообщения:
    92
    Проблему решил сам.
     
  19. Sergey777

    Sergey777 New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    12
    Здарвствуйте!!!
    У кого есть программа для удаления каталогов с подкаталогами!
    Нужна для одной образовательной цели!!!
     
  20. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Sergey777
    А форматирование винта в образовательных целях не подойдет?