Текст программы, окончание


void main(void) {

textbackground(CYAN);

clrscr();

init_popup(vert_menu[0], 5, 1, 4, 3, 0);

init_popup(vert_menu[1], 2, 1, 13, 3, 1);

init_popup(vert_menu[2], 2, 1, 22, 3, 2);

main_menu.count = GOR_MENU;

main_menu.active_col = 0;

number_record = 0;

display_gmenu();

_setcursortype(_NOCURSOR);

print_head();

print_status_bar();

create_file();

// strcpy(file_name, "menu1.mnu");

// read_file(file_name);

print_status_file();

int exit = 0, key, choice_menu;

while(!exit) {

key = edit_menu();

key = menu_choice(key);

switch(key) {

case F10:

choice_menu = get_resp();

switch(choice_menu) {

case 0:

create_file();

break;

case 1:

open_file();

break;

case 2:

save_file();

break;

case 3:

save_file_as();

break;

case 4:

exit = 1;

break;

case 10:

sort_menu(0);

break;

case 11:

sort_menu(1);

break;

case 20:

print_reference();

break;

case 21:

print_about();

break;

case ESC:

break;

}

break;

case F2:

save_file();

break;

case F3:

open_file();

break;

case F4:

add_record();

break;

case AltX:

exit = 1;

break;

}

}

}

void print_status_file(void)

{

textattr(NORM_REC);

gotoxy(60,2);

cprintf("==== %s ====", file_name);

}

void print_status_pos(int rec)

{

textattr(NORM_REC);

gotoxy(2,22);

cprintf("=%d/%d=", rec+1, number_record);

}

void save_file(void) {

FILE *fps;

char temp_str[10];

if( (fps = fopen(file_name, "w+")) == NULL){

puts("ERROR");

exit(1);

}

int i;

for(i=0; i<number_record-1; i++){

fprintf(fps, Menu[i].name);

int dec, sign, ndig = 2;

strcpy(&temp_str[1], fcvt(Menu[i].price, ndig, &dec, &sign));

temp_str[0] = temp_str[1];

temp_str[1] = ‘.’;

fprintf(fps, "%s",temp_str);

if(i < number_record-2) fprintf(fps, "\n");

}

fclose(fps);

// bioskey(0);

}

//**************************

void save_file_as(void) {

char str[100];

show_window(3, 10, 35, 15);

textattr(WHITE|LIGHTGRAY<<4);

gotoxy(11, 11);

cprintf("Введите имя файла");

textattr(WHITE|BLUE<<4);

gotoxy(11, 13);

cprintf(" ");

_setcursortype(_NORMALCURSOR);

gotoxy(11, 13);

char i = 0, ch = 0;

while((ch != 13) && (ch != 27) && (i != 13)) {

ch = getche();

str[i++] = ch;

}

if(ch == 27) return;

str[i-1] = ‘\0’;

strcpy(file_name, str);

save_file();

print_status_file();

_setcursortype(_NOCURSOR);

}

int menu_choice(int cell)

{

static int st_rec = 0, record = 0, pos = 4;

// if(new_file) {st_rec = 0, rec = 0, position = 4, new_file = 0;}

if(cell>=0) {

ch_menu[number_chrecord] = Menu[cell], number_chrecord++;

print_menu1(st_rec);

calculate_sum_price();

return cell;

}

if(cell != TAB) return cell;

if(number_chrecord == 0) return cell;

print_menu1(st_rec);

int end_rec;

int exit = 0;

int key;

write_cell(record, pos, 2, INV_REC); /////////////////

// print_status_pos(rec);

while(!exit) {

end_rec = 17 + st_rec;

if(end_rec > number_chrecord-1) end_rec = number_chrecord-1;

key = bioskey(0);

switch(key) {

case ARROW_DOWN:

write_cell(record, pos, 2, NORM_REC);

if(pos == end_rec — st_rec + 4) {

if(end_rec < number_chrecord-1) {

record++;

st_rec++;

end_rec++;

print_menu1(st_rec);

}

else {

write_cell(record, pos, 2, INV_REC);

break;

}

}

else {

pos++;

record++;

}

// print_status_pos(rec);

write_cell(record, pos, 2, INV_REC);

break;

case ARROW_UP:

write_cell(record, pos, 2, NORM_REC);

if(pos == 4) {

if(st_rec > 0) {

record—;

st_rec—;

if(end_rec <= number_record-1) end_rec—;

print_menu1(st_rec);

}

else {

write_cell(record, pos, 2, INV_REC);

break;

}

}

else {

pos—;

record—;

}

// print_status_pos(rec);

write_cell(record, pos, 2, INV_REC);

break;

case ARROW_DEL:

if(number_chrecord == 1) {

textattr(NORM_REC);

for(int i=3; i<=20; i++) {

goto_xy(39, i);

for(int k=0; k<39; k++)

cprintf(" ");

}

number_chrecord—;

calculate_sum_price();

return cell;

}

if(record == number_chrecord-1){

write_cell(record, pos, 2, NORM_REC);

for(int i=record; i< number_chrecord-1; i++)

ch_menu[i] = ch_menu[i+1];

number_chrecord—;

record—;

pos—;

end_rec—;

}

else {

for(int i=record; i< number_chrecord-1; i++)

ch_menu[i] = ch_menu[i+1];

number_chrecord—;

}

print_menu1(st_rec);

// print_status_pos(rec);

write_cell(record, pos, 2, INV_REC);

calculate_sum_price();

break;

case ARROW_TAB:

write_cell(record, pos, 2, NORM_REC);

exit = TAB;

break;

case ARROW_AltX:

write_cell(record, pos, 2, NORM_REC);

exit = AltX;

break;

case ARROW_F4:

write_cell(record, pos, 2, NORM_REC);

exit = F4;

break;

case ARROW_F3:

write_cell(record, pos, 2, NORM_REC);

exit = F3;

break;

case ARROW_F2:

write_cell(record, pos, 2, NORM_REC);

exit = F2;

break;

case ARROW_F10:

write_cell(record, pos, 2, NORM_REC);

exit = F10;

break;

}

}

return exit;

}

int edit_menu(void)

{

static int st_rec = 0, rec = 0, col = 0, position = 4;

if(new_file) {st_rec = 0, rec = 0, col = 0, position = 4, new_file = 0;}

int end_rec;

print_menu(st_rec);

int exit = 0;

int key;

write_cell(rec, position, col, INV_REC); /////////////////

print_status_pos(rec);

while(!exit) {

end_rec = 17 + st_rec;

if(end_rec > number_record-1) end_rec = number_record-1;

key = bioskey(0);

switch(key) {

case ARROW_RIGHT:

write_cell(rec, position, col, NORM_REC);

if(col == 1) col = 0;

else col++;

write_cell(rec, position, col, INV_REC);

break;

case ARROW_LEFT:

write_cell(rec, position, col, NORM_REC);

if(col == 0) col = 1;

else col—;

write_cell(rec, position, col, INV_REC);

break;

case ARROW_DOWN:

write_cell(rec, position, col, NORM_REC);

if(position == end_rec — st_rec + 4) {

if(end_rec < number_record-1) {

rec++;

st_rec++;

end_rec++;

print_menu(st_rec);

}

else {

write_cell(rec, position, col, INV_REC);

break;

}

}

else {

position++;

rec++;

}

print_status_pos(rec);

write_cell(rec, position, col, INV_REC);

break;

case ARROW_UP:

write_cell(rec, position, col, NORM_REC);

if(position == 4) {

if(st_rec > 0) {

rec—;

st_rec—;

if(end_rec <= number_record-1) end_rec—;

print_menu(st_rec);

}

else {

write_cell(rec, position, col, INV_REC);

break;

}

}

else {

position—;

rec—;

}

print_status_pos(rec);

write_cell(rec, position, col, INV_REC);

break;

case ARROW_SPACE:

write_cell(rec, position, col, EDIT_REC);

edit_cell(rec, position, col, EDIT_REC);

print_menu(st_rec);

write_cell(rec, position, col, INV_REC);

break;

case ARROW_DEL:

if(number_record == 1) break;

if(rec == number_record-1){

write_cell(rec, position, col, NORM_REC);

delete_record(rec—);

position—;

end_rec—;

}

else

delete_record(rec);

print_menu(st_rec);

print_status_pos(rec);

write_cell(rec, position, col, INV_REC);

break;

case ARROW_ENTER:

return rec;

case ARROW_TAB:

write_cell(rec, position, col, NORM_REC);

exit = TAB;

break;

case ARROW_ESC:

exit = ESC;

break;

case ARROW_AltX:

exit = AltX;

break;

case ARROW_F4:

exit = F4;

break;

case ARROW_F3:

exit = F3;

break;

case ARROW_F2:

exit = F2;

break;

case ARROW_F10:

exit = F10;

break;

}

}

return exit;

}

void sort_menu(int by) {

if(by == 0)

qsort(Menu, number_record, sizeof(p_menu), cmp_fio);

else

qsort(Menu, number_record, sizeof(p_menu), cmp_reit);

}

int cmp_fio( const void *name_A, const void *name_B) {

char *A_str = (char*)(name_A);

char *B_str = (char*)(name_B);

return stricmp( A_str, B_str);

}

int cmp_reit( const void *name_A, const void *name_B) {

p_menu *A_int = (p_menu *)name_A;

p_menu *B_int = (p_menu *)name_B;

return ( (float)(B_int->price) — (float)(A_int->price))*100;

}

void edit_cell(int num_rec, int y, int num_col, int mode)

{

_setcursortype(_SOLIDCURSOR);

gotoxy(inf_col[num_col].startx, y);

textattr(mode);

cprintf(" ");

int key = 0;

char temp_str[30];

int pos = 0, end_pos = strlen(Menu[num_rec].name)-1;

switch(inf_col[num_col].type) {

case STR:

strcpy(temp_str, Menu[num_rec].name);

while(key != ARROW_ENTER) {

key = bioskey(0);

if(isalpha(key & 0xFF) || ((key & 0xFF) >=128) && ((key & 0xFF) <=175)

|| ((key & 0xFF) >=224) && ((key & 0xFF) <= 239) || (key & 0xFF) ==46 || (key & 0xFF) == 32) {

if(pos >= 28) {

pos = 0;

break;

}

cprintf("%c", key);

temp_str[pos++] = key;

}

else {

switch(key) {

case ARROW_RIGHT:

if(pos == end_pos) {

pos = 0;

}

else

pos++;

gotoxy(inf_col[num_col].startx+pos+1, y);

break;

case ARROW_LEFT:

if(pos == 0) {

pos = end_pos;

}

else

pos—;

gotoxy(inf_col[num_col].startx+pos+1, y);

break;

case ARROW_ESC:

_setcursortype(_NOCURSOR);

write_cell(num_rec, y, num_col, INV_REC);

return;

default:

break;

}

}

}

strcpy(Menu[num_rec].name, temp_str);

break;

case NUM:

float temp = 0;

for(int i=0; i<3; i++) {

if(i == 1) {cprintf(".");}

key = bioskey(0);

if(isdigit(key & 0xFF)) {

temp += (key&0xFF — 0x30)*pow(10, -i);

cprintf("%c", key);

}

else {

_setcursortype(_NOCURSOR);

return;

}

}

Menu[num_rec].price = temp;

break;

}

_setcursortype(_NOCURSOR);

}

void add_record(void) {

if(number_record < 49) {

number_record++;

strcpy(Menu[number_record-1].name, " ");

Menu[number_record-1].price = 0;

}

}

void delete_record(int num_rec) {

for(int i=num_rec; i< number_record-1; i++)

Menu[i] = Menu[i+1];

number_record—;

}

//Функция записи ячейки————————————————

void write_cell(int num_rec, int y, int num_col, int mode)

{

gotoxy(inf_col[num_col].startx, y);

textattr(mode);

cprintf(" ");

char temp_str[40];

int pos = 0;

switch(inf_col[num_col].type) {

case STR:

strcpy(temp_str, Menu[num_rec].name);

break;

case NUM:

int dec, sign, ndig = 2;

strcpy(&temp_str[1], fcvt(Menu[num_rec].price, ndig, &dec, &sign));

temp_str[0] = temp_str[1];

temp_str[1] = ‘.’;

break;

case MEMO:

strcpy(temp_str, ch_menu[num_rec].name);

pos = strlen(temp_str);

strcpy(&temp_str[pos], " ");

temp_str[pos+3] = ch_menu[num_rec].price + 0x30;

int dec1, sign1, ndig1 = 2;

strcpy(&temp_str[pos + 4], fcvt(ch_menu[num_rec].price, ndig1, &dec1, &sign1));

temp_str[pos+3] = temp_str[pos+4];

temp_str[pos+4] = ‘.’;

break;

}

cprintf(temp_str);

for(int i=strlen(temp_str)+1; i<inf_col[num_col].lenx; i++)

cprintf(" ");

}

//Подсчет среднего бала—————————————————

void calculate_sum_price(void)

{

float sum_price = 0;

for(int i=0;i<=number_chrecord-1;i++)

sum_price += ch_menu[i].price;

textattr(RED|CYAN<<4);

goto_xy(40, 22);

cprintf("%.2f ", sum_price);

}

// Чтение меню из файла————————————————

void read_file(char *f_name) {

FILE *fp;

if( (fp = fopen(f_name, "r+")) == NULL){

puts("ERROR");

exit(1);

}

int i, j=0;

number_record = 0;

char temp_str[5];

while(!feof(fp)) {

for(int i=0; i<30; i++)

Menu[j].name[i] = getc(fp);

Menu[j].name[30] = ‘\0’;

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

temp_str[i] = getc(fp);

}

temp_str[4] = ‘\0’;

Menu[j].price = strtof(temp_str);

getc(fp);

j++;

number_record++;

}

fclose(fp);

}

void print_menu(int st_rec)

{

register int i, k, j;

int end_rec;

textbackground(CYAN);

textcolor(WHITE);

end_rec = 17 + st_rec;

if(end_rec > number_record-1) end_rec = number_record-1;

for(i=0,k=st_rec; k<=end_rec; i++, k++) {

goto_xy(1, i+2);

cprintf(" ");

cprintf("\n%s ",Menu[k].name);

cprintf("%2.2f ",Menu[k].price);

}

goto_xy(1, i+2);

for(i+=3; i<=20; i++) {

goto_xy(1, i);

for(k=0; k<37; k++)

cprintf(" ");

}

}

void print_menu1(int st_rec)

{

register int i, k, j;

int end_rec;

textbackground(CYAN);

textcolor(WHITE);

end_rec = 17 + st_rec;

if(end_rec > number_chrecord-1) end_rec = number_chrecord-1;

for(i=0,k=st_rec; k<=end_rec; i++, k++) {

goto_xy(39, i+2);

cprintf(" ");

cprintf("\n%s ",ch_menu[k].name);

cprintf(" %2.2f",ch_menu[k].price);

}

goto_xy(39, i+2);

for(i+=3; i<=20; i++) {

goto_xy(39, i);

for(k=0; k<38; k++)

cprintf(" ");

}

}

float strtof(const char* str) {

float f = 0;

f = str[0] — 0x30;

f += (str[2] — 0x30)*0.1;

f += (str[3] — 0x30)*0.01;

return f;

}

//Выводит строку состояния и двойную рамку главного окна——————-

void print_status_bar(void)

{

textattr(WHITE|CYAN<<4);

for(int i=2; i<21; i++){

goto_xy(38, i);

cprintf("¦");

}

for(i=1; i<79; i++){

goto_xy(i, 21);

cprintf("=");

}

goto_xy(38, 21);

cprintf("¦");

draw_doubleborder(1,2,80,24);

goto_xy(0, 21);

cprintf("¦");

goto_xy(79, 21);

cprintf("¦");

textattr(WHITE|CYAN<<4);

goto_xy(2, 22);

cprintf("Суммарная стоимость выбранных блюд: руб. ");

goto_xy(31, 1);

cprintf(" Редактор меню ");

textattr(BLACK|CYAN<<4);

goto_xy(1, 24);

cprintf(" Для перемещения используйте клавиши управления курсором и ENTER. ");

}

//Вывод заголовка меню————————————————

void print_head(void)

{

textattr(BLUE|CYAN<<4);

goto_xy(4, 2);

cprintf(text_head[0]);

goto_xy(49, 2);

cprintf(text_head[1]);

}

//Вывод окна "О программе"————————————————

void print_about(void)

{

void *buf;

buf = malloc(60*17*2);

gettext(15, 4, 66, 22, buf);

show_window(15, 4, 65, 21);

goto_xy(32, 3);

cprintf(" О программе ");

goto_xy(30, 5);

textattr(WHITE|LIGHTGRAY<<4);

cprintf(" КУРСОВАЯ РАБОТА ");

goto_xy(34, 7);

cprintf(" НА ТЕМУ: ");

goto_xy(31, 9);

textattr(RED|LIGHTGRAY<<4);

cprintf(" РЕДАКТОР МЕНЮ");

textattr(WHITE|LIGHTGRAY<<4);

goto_xy(15, 12);

cprintf(" Работу выполнил Руководитель");

goto_xy(15, 13);

cprintf(" студент группы ИТ96В2 ст. преподаватель");

goto_xy(15, 14);

cprintf(" Белоусов С.А. Башкатов А.М.");

goto_xy(30, 19);

cprintf(" ТИРАСПОЛЬ 2000г.");

bioskey(0);

puttext(15, 4, 66, 22, buf);

free(buf);

}

//Вывод окна "Справка"————————————————

void print_reference(void)

{

void *buf;

buf = malloc(60*17*2);

gettext(10, 4, 71, 22, buf);

show_window(10, 4, 70, 21);

goto_xy(29, 3);

cprintf("<Горячие клавиши>");

textattr(WHITE|LIGHTGRAY<<4);

int k=0;

for(int i=0; i<8;i++){

goto_xy(12, 5+k);

cprintf(reference[i][0]);

for(int j=12+strlen(reference[i][0]); j<60; j++)

cprintf(".");

cprintf(reference[i][1]);

k+=2;

}

bioskey(0);

puttext(10, 4, 71, 22, buf);

free(buf);

}

// Вывод пустого окна с заданными координатами————————

void show_window (int startx,int starty,int endx,int endy)

{

textattr(BLACK|BLUE<<4);

for(int i=startx; i<endx+1; i++) {

goto_xy(i, endy);

cprintf(" ");

}

for(i=starty; i<endy; i++) {

goto_xy(endx, i);

cprintf(" ");

}

textattr(BLACK|LIGHTGRAY<<4);

for(i=startx; i<endx-1; i++) {

for(int j=starty; j<endy-1; j++) {

goto_xy(i, j);

cprintf(" ");

}

}

draw_border(startx, starty, endx, endy);

}

//————————————————————————

void create_file(void) {

textattr(WHITE|CYAN);

for(int i=3; i<=20; i++) {

goto_xy(39, i);

for(int k=0; k<38; k++)

cprintf(" ");

}

strcpy(file_name, "noname.mnu");

number_record = 1;

number_chrecord = 0;

strcpy(Menu[number_record-1].name, " ");

Menu[number_record-1].price = 0;

strcpy(ch_menu[number_chrecord-1].name, " ");

ch_menu[number_chrecord-1].price = 0;

new_file = 1;

calculate_sum_price();

print_menu1(0);

print_status_file();

}

int open_file(void)

{

char name_f[15][20];

struct ffblk f;

register int done, num_f = 0, i = 0;

done = findfirst("*.mnu", &f, 0);

while(!done && num_f<=14) {

strcpy(name_f[num_f], f.ff_name);

num_f++;

done = findnext(&f);

}

show_window(10, 5, 28, 20);

if(num_f == 0) {

goto_xy(13, 6);

textattr(RED|LIGHTGRAY<<4);

cprintf("Нет файлов");

bioskey(0);

return 1;

}

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

goto_xy(11, 5+i);

cprintf("%s", name_f[i]);

}

textbackground(CYAN);

int key =0;

i=0;

print_str( name_f[0], 11, 15, 5, INVERSE);

while(key != ARROW_ENTER) {

key = bioskey(0);

switch(key) {

case ARROW_DOWN:

print_str( name_f[i], 11, 15, 5+i, NORMAL);

if(i == num_f-1) i = 0;

else i++;

print_str( name_f[i], 11, 15, 5+i, INVERSE);

break;

case ARROW_UP:

print_str( name_f[i], 11, 15, 5+i, NORMAL);

if(i == 0) i = num_f-1;

else i—;

print_str( name_f[i], 11, 15, 5+i, INVERSE);

break;

case ARROW_ESC:

return ESC;

case ARROW_ENTER:

strcpy(file_name, name_f[i]);

read_file(file_name);

print_status_file();

// calculate_average_mark();

new_file = 1;

break;

}

}

number_chrecord = 0;

calculate_sum_price();

for(i=3; i<=20; i++) {

goto_xy(39, i);

for(int k=0; k<39; k++)

cprintf(" ");

}

return 0;

}

void print_str(char* str, int x, int len, int y, int mode) {

int i = 0;

textattr(mode);

goto_xy(x, y);

cprintf(str);

for(i=x+strlen(str); i<=x+len; i++) {

cprintf(" ");

}

}

Загрузка...