Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
!1-25.doc
Скачиваний:
11
Добавлен:
28.10.2018
Размер:
2.62 Mб
Скачать

24.4 // Сформировать числовой файл и отсортировать его компоненты с помощью двух стеков.

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <io.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

// Структура, описывающая элемент стека

struct stack {

int info; stack* prev;

stack() { prev=0; info=0; }

};

// Указатель на вершину стека

stack *stack_top1=0;

stack *stack_top2=0;

// Проверка содержимого вершины стека

int top(stack **stack_top)

{

if((*stack_top)==0)

return(0);

return((*stack_top)->info);

}

// Добавление элемента в стек

void push(stack **stack_top, int value)

{

stack *p = new stack;

p->info = value;

p->prev = *stack_top;

*stack_top = p;

}

// Снятие верхнего элемента стека

char pop(stack **stack_top)

{

char value;

stack *p;

value = (*stack_top)->info;

p = (*stack_top)->prev;

delete *stack_top;

*stack_top = p;

return(value);

}

// Проверка стека на пустоту

int empty(stack **stack_top)

{

if((*stack_top)==0) return(1);

return(0);

}

char buffer[100];

void main()

{

int fh;

unsigned int i, cnt=0, nbytes = 100, bytesread;

/* Open file for input: */

if((fh = _open("file.dat", _O_RDONLY)) == -1)

{

perror("open failed on input file");

exit(1);

}

/* Read in input: */

if((bytesread = _read(fh, buffer, nbytes)) <= 0) {

perror("Problem reading file");

exit(1);

}

char str[100];

memset(str,0,100);

int digit;

for(i=0; i<bytesread; i++) {

if(buffer[i]==0x0a) continue;

else {

sprintf(str, "%c", buffer[i]);

digit = atoi(str);

if(!empty(&stack_top1)) {

if(top(&stack_top1) >= digit)

push(&stack_top1, digit);

else {

while((!empty(&stack_top1))&&(top(&stack_top1) < digit)) {

push(&stack_top2, pop(&stack_top1));

}

push(&stack_top1, digit);

while(!empty(&stack_top2)) {

push(&stack_top1, pop(&stack_top2));

}

}

}

else {

push(&stack_top1, digit);

}

}

}

while(!empty(&stack_top1)) {

printf("%d ", pop(&stack_top1));

}

printf("\n");

_close(fh);

}

25.1 Функции dos , используемые при создании пользовательского вектора прерывания (Проиллюстрировать программой)

DataSg Segment

myInt db ‘xxxxxxxxx’

db ‘MyInterrupt Int 65h’

db ‘xxxxxxxxx’

oldint dd 0

srt1 db ‘My Int’,13,10,’$’

DataSg ends

CodeSg Segment

MyInt PROC

Push ax bx cx dx

Pop ax cx bx dx

IERT

MyInt EndS

BeginAsm PROC FAR

Moc ax,datasq

Mov cx,ax

;сохраняем значения старых прерываний

Mov ah,35h

Mov al,65h

Int 21h

Mov WORD PTR oldint,bx

Mov WORD PTR oldint+2,es

; устанавливаем собственный обработчик прерывания

Mov ah,25h

Mov al,65h

Mov dx,offset myint

Push ds

Push cs

Pop ds

Int 21h

Pop ds

Mov ah,9h

Mov dx,offset str1

Int 21h

Stop

Int 65h

Lds dx,oldint

Mov ax,2565h

Int 21h