Консультация № 187530
01.09.2013, 18:54
101.41 руб.
0 0 0
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

Имеется рабочий скрипт от задачи по структуре данных, учитель дал задание добавить к скрипту пару дополнительных функций и написать отчёт о структуре программы, функциональных требованиях, структуре данных и структуре алгоритма.
Какие дополнительные функции можно добавить я не знаю, учитель сказал любые, связанные с предметом.

Описание программы фондовой биржы:


В данной программе, акционер при помощи различных средств может отправить заявку на сделку в фондовую биржу. Каждая заявка содержит информацию об акционере, об акциях, о цене и колличестве. При совершении сделки, первыми учитваются цена и время, то есть, кто предложил набольшую цену покупки, покупает первым, а кто предложил наименьшую стоимость продажи, первым продаёт. Две заявки на сделку могут считаться успешнимы только про соответствии их цен, не завершённые сделки отправляются в очередь в порядке их стоимости. Имеются два вида очередей: покупка и продажа. Только когда цена у заявки на покупку выше или равна цене заявки на продажу, сделка будет считаться завершённой, сумма сделка равна средней величине цен обех заявок, торговый оборот сделки равен минимальному значению колличеств акций в обеих сделках. Сделка может быть завершена полностью, либо частично, сделка завершённая частично остаётся в очереди.

Сейчас в программе имеются следующие функции:


1. Предложение заявки на сделку:
входные данные: каждая заявка состоит из четырёх цифровых данных, кодовый номер акций (четырёзначное число), стоимость (число с плавающей точкой), колличество акций (целое число), покупка или продажа(B/S)
выходные данные: а) каждой заявке присваивается уникальный номер (%04d), порядок начинается с цифры 1; б) каждая успешная сделка состоит из стоимости сделки (%6.1f), торговый оборот сделки (%4d), порядковый номер заявки покупателя (%04d), порядковый номер заявки продавца (%04d).

2. Поиск незаконченных заявок:
входные данные: кодовый номер акций
выходные данные: в соответствии с порядковым номером в очереди, по отдельности распечатать незаконченные заявки, каждая незаконченная заявка состоит из порядкового номера заявки (%04d), кодового номера акций (%04d), стоимости (%6.1f), колличества (%04d), покупка или продажа(B/S)

3. Отменить заявку
входные данные: номер заявки, которую надо отменить
выходные данные: если получилось удалить, то вывести на печать информацию об удалённой заявке: номер заявки, кодовый номер акций, стоимость, колличество, покупка или продажа(B/S); если не получилось удалить, то напечатать «not found».



Приложение:
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#include "string.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define UNDERFLOW -3

typedef int Status;
typedef struct {
int orderid;
int stockid;
float price;
int quantity;
char bs;
} ElemType;

typedef struct Node {
ElemType data;
struct Node *next;
} Node, *List;

Status GetElem(List L, int i, ElemType *e);

Status ListInsert(List L, int i, ElemType e);

Status ListDelete(List L, int i, ElemType *e);

void ClearList(List L);

List InitList();

void DestroyList(List L );

Status ListTraverse(List L, Status (* visit)(ElemType));

int LocateElem(List L, ElemType e, Status (* compare)(ElemType, ElemType));

int ListLength(List L);

Status ListEmpty(List L);

Status PutElem(List L, int i, ElemType e);

#define MAXSTOCKID 9999

Status GetElem(List L, int i, ElemType *e) {
Node *p;
int j;

p = L->next; j = 1;
while (p && j<i) { p = p->next; ++j;}
if ( !p || j>i )
return ERROR;

*e = p->data;
return OK;

}

Status ListInsert(List L, int i, ElemType e) {
Node *p, *s;
int j;

p = L; j = 0;
while (p && j < i-1) {
p = p->next; ++j; }
if (!p || j > i-1)
return ERROR;
s = (List) malloc ( sizeof (Node));
s->data = e;
s->next = p->next; p->next = s;
return OK;
}

Status ListDelete(List L, int i, ElemType *e) {
Node *p, *q;
int j;

p = L; j = 0;
while (p->next && j < i-1) { p = p->next; ++j; }
if (!(p->next) || j > i-1)
return ERROR;
q = p->next; p->next = q->next;
*e = q->data; free(q);
return OK;
}

void ClearList(List L) {
Node *p, *q;

p=L->next;
while (p) {
q=p->next;
free(p);
p=q;
}
L->next = NULL;
}

List InitList() {
List L;
L = (List)malloc(sizeof(Node));
if (!L) exit(OVERFLOW);
L->next = NULL;
return L;
}

void DestroyList(List L ) {
Node *p, *q;

p = L;
while (p) {
q=p; p=p->next;
free(q);
}
}

Status ListTraverse(List L, Status (* visit)(ElemType)) {
Node *p;

p = L->next;
while (p) {
if (!visit(p->data)) return ERROR;
p=p->next;
}
return OK;
}

int LocateElem(List L, ElemType e, Status (* compare)(ElemType, ElemType)) {
Node *p;
int j;

p = L->next;
j = 1;

while ( p && !(*compare)(p->data, e)) {p = p->next; j++;}
if (p) return j;
return 0;
}

int ListLength(List L) {
int j;
Node *p;

p = L; j = 0;

while (p->next) { p = p->next; j++;}
return j;
}

Status ListEmpty(List L) {
return (L->next == NULL);
}

Status PutElem(List L, int i, ElemType e) {
Node *p;
int j;

p = L->next; j = 1;
while (p && j < i) {
p = p->next; ++j; }
if (!p || j > i)
return ERROR;
p->data = e;
return OK;
}


int getselect(void)
{
int s;
printf("\n");
printf("\n");
printf(" MENU\n");
printf(" 1. Input An Order\n");
printf(" 2. Query Uncompleted Order\n");
printf(" 3. Delete An Order\n");
printf(" 0. Exit\n");
printf("\n");
printf("\n");
printf("Your Selection:");
scanf("%d", &s);
return s;
}

void getorder(ElemType *order)
{
char s[10];


printf("\n");
printf("please input an order:\n");
printf(" stockid: "); scanf("%d", &order->stockid);
printf(" price: "); scanf("%f", &order->price);
printf(" quantity: ");scanf("%d", &order->quantity);
printf(" buy or sell: ");
scanf("%s", s);
order->bs = s[0];
return;
}

Status printorder(ElemType order)
{
printf("orderid: %04d, stockid:%04d, price: %6.1f, quantity: %4d, b/s: %c\n",
order.orderid, order.stockid, order.price, order.quantity, order.bs);
return OK;
}

Status lessorder(ElemType e1, ElemType e2) {
return (e1.price < e2.price);
}

Status greaterorder(ElemType e1, ElemType e2) {
return (e1.price > e2.price);
}

Status equalorder(ElemType e1, ElemType e2) {
return (e1.orderid == e2.orderid);
}

void matchbuyorder(ElemType *buyorder, List selllist) {
ElemType sellorder;
float dealprice;
int dealquantity;

while (1) {
if (!GetElem(selllist, 1, &sellorder)) return;
if (buyorder->price >= sellorder.price) {
dealprice = (buyorder->price + sellorder.price)/2;
if (buyorder->quantity >= sellorder.quantity)
dealquantity = sellorder.quantity;
else
dealquantity = buyorder->quantity;
buyorder->quantity -= dealquantity;
sellorder.quantity -= dealquantity;
printf("deal--price:%6.1f quantity:%4d buyorder:%04d sellorder:%04d\n",
dealprice, dealquantity, buyorder->orderid, sellorder.orderid);
if (sellorder.quantity)
PutElem(selllist, 1, sellorder);
else
ListDelete(selllist, 1, &sellorder);
if (!buyorder->quantity) return;
}
else return;
}
}

void matchsellorder(ElemType *sellorder, List buylist) {
ElemType buyorder;
float dealprice;
int dealquantity;

while (1) {
if (!GetElem(buylist, 1, &buyorder)) return;
if (sellorder->price <= buyorder.price) {
dealprice = (sellorder->price + buyorder.price)/2;
if (sellorder->quantity >= buyorder.quantity)
dealquantity = buyorder.quantity;
else
dealquantity = sellorder->quantity;
sellorder->quantity -= dealquantity;
buyorder.quantity -= dealquantity;
printf("deal--price:%6.1f quantity:%4d sellorder:%04d buyorder:%04d\n",
dealprice, dealquantity, sellorder->orderid, buyorder.orderid);
if (buyorder.quantity)
PutElem(buylist, 1, buyorder);
else
ListDelete(buylist, 1, &buyorder);
if (!sellorder->quantity) return;
}
else return;
}
}


int main()
{
int s;
List buylist[MAXSTOCKID + 1], selllist[MAXSTOCKID + 1];
ElemType order;
int pos, orderid, i;

for (i = 0; i <= MAXSTOCKID; i++) {
buylist[i] = InitList();
selllist[i] = InitList();
}
orderid = 1;

while (1) {
s = getselect();
switch (s) {
case 1: {
getorder(&order);
order.orderid = orderid++;
printf("orderid: %04d\n", order.orderid);
if (order.bs == 'b') {
pos = LocateElem(buylist[order.stockid], order, lessorder);
if (!pos) pos = ListLength(buylist[order.stockid]) + 1;
if (pos == 1) matchbuyorder(&order, selllist[order.stockid]);
if (order.quantity)
ListInsert(buylist[order.stockid], pos, order);
}
else {
pos = LocateElem(selllist[order.stockid], order, greaterorder);
if (!pos) pos = ListLength(selllist[order.stockid]) + 1;
if (pos == 1) matchsellorder(&order, buylist[order.stockid]);
if (order.quantity)
ListInsert(selllist[order.stockid], pos, order);
}
break;
}
case 2: {
printf("Stock ID: ");
scanf("%d", &order.stockid);
printf("buy orders:\n");
ListTraverse(buylist[order.stockid], printorder);
printf("sell orders:\n");
ListTraverse(selllist[order.stockid], printorder);
break;
}
case 3: {
printf("Order ID: ");
scanf("%d", &order.orderid);
for (i = 0; i <= MAXSTOCKID; i++) {
pos = LocateElem(buylist[i], order, equalorder);
if (pos) {
ListDelete(buylist[i], pos, &order);
printf("deleted order:");
printorder(order);
break;
}
pos = LocateElem(selllist[i], order, equalorder);
if (pos) {
ListDelete(selllist[i], pos, &order);
printf("deleted order:");
printorder(order);
break;
}
}
if (i > MAXSTOCKID)
printf("not found\n");
break;
}
default: return 0;
}
}
}

Обсуждение

Форма ответа