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(" ");
}
}
