#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define TAB 9
#define ENTER 13
#define ESC 27
#define UP 72
#define PgUP 73
#define LEFT 75
#define RIGHT 77
#define DOWN 80
#define PgDOWN 81
#define DELETE 83
#define R 114
#define S 115
#define V 118
typedef struct
{
unsigned long long id;
char day[16]; // дата
unsigned long long recipe; //номер рецепта
unsigned long long exemption; //льгота
char surname[100]; //фамилия больного
char drug_form[15];
//double rec_numb;
unsigned long long cost;
unsigned long long paid;
}DATA;
typedef struct node
{
DATA *data;
struct node *next, *prev;
}ITEM;
typedef struct hnode
{
int number;
ITEM *first, *last;
}HITEM;
int pos_g=1, pos_x=1, pos_y=1, LastID=0;
char day_of_today[12];
HITEM *head=NULL;
void bg();
void table();
void print_menu();
int print_list(int f, int l, int sel);
void print_sel_line(int y, int sel);
void print_line(int y, int sel, ITEM *CurrNODE);
void print_cell(int cell, int y, int sel);
void print_sel_cell(int sel_x);
void print_edit_line(int sel, int sel_x, ITEM *CurrNODE);
void print_sort_list(int f, int l, int sel_x, int sel);
void select();
void add();
void AddList(int y);
void AddStatBar(char *str, int y);
void view();
void DeleteList(int n);
void edit(int n, int sel);
void EditList(int sel, int sel_x, ITEM *CurrNODE);
void search();
void sort_control();
void sort(int sel_x);
void filter();
void date();
void write_db();
void read_db();
void AddDATA(DATA data);
void EmptyList();
int sel_cell();
int getN(char *str);
int sfN(int sel_x, char *str, int k);
int sN(int sel_x, char *str, int k, int i_find);
void ERRORS(char *str);
void Escape()
{
for(;;)
{
if(getch()==ESC)
{
clrscr();
break;
}
else
{
continue;
}
}
}
void main()
{
int key;
EmptyList();
date();
for(;;)
{
bg();
key=getch();
if(key!=0)
{
if(key==ESC)
{
pos_g=1;
}
else
{
if(key==ENTER)
{
select();
}
else
{
if(key==TAB)
{
pos_x=-1;
pos_g=1;
view();
pos_x=1;
}
else
{
continue;
}
}
}
}
else
{
key=getch();
if(pos_g==1)
{
if(key==RIGHT)
{
if(pos_x<7)
pos_x++;
}
else
{
if(key==LEFT)
{
if(pos_x>1)
pos_x--;
}
else
{
continue;
}
}
}
else
{
if(pos_g==0)
{
if(key==UP)
{
if(pos_y>1)
pos_y--;
}
else
{
if(key==DOWN)
{
if(pos_y<3)
pos_y++;
}
else
{
continue;
}
}
}
}
}
}
}
void bg()
{
window(1,1,80,1); //head_bg
textbackground(WHITE);
textcolor(GREEN);
clrscr();
table();
print_menu(); //menu
window(1,25,80,25); //footer
textbackground(WHITE);
textcolor(GREEN);
clrscr();
window(61,25,80,25); //date
textbackground(WHITE);
textcolor(GREEN);
clrscr();
cprintf("Сегодня: %s", day_of_today);
}
void table()
{
int i;
window(1,2,80,24); //center
textbackground(LIGHTBLUE);
textcolor(GREEN);
clrscr();
puts("╔═════╦═════════════╦═════════╦═════════╦════════╦════════╦════════╦═══════════");
puts("║ № ║ Фамилия ║Лек.форма║№ рецепта║ Цена ║ Льгота ║Оплачено║ Дата ");
puts("╠═════╩═════════════╩═════════╩═════════╩════════╩════════╩════════╩═══════════");
for(i=0;i<=18;i++)
puts("║");
puts("╚══════════════════════════════════════════════════════════════════════════════");
window(80,2,80,25); //center_left
clrscr();
cputs("╗║╣");
for(i=0;i<=18;i++)
cputs("║");
cputs("╝");
window(80,25,80,25);
textbackground(WHITE);
clrscr();
}
void print_menu()
{
char menu0[7][15]={" Правка ", " Поиск ", "Сортировка", " Фильтр ", "Статистика", " Помощь ", " Выход "};
char menu1[3][15]={" Добавить ", " Редактировать"," Удалить "};
int i, x, y;
for(i=x=1; i<8; i++, x+=10)
{
window(x,1,x+10,1);
textbackground(pos_x==i?MAGENTA:WHITE);
textcolor(GREEN);
clrscr();
puts(menu0[i-1]);
}
if(pos_g==0)
{
window(1, 2, 16, 6);
textbackground(WHITE);
textcolor(BLACK);
clrscr();
puts("┌──────────────┐");
puts("│ │");
puts("│ │");
puts("│ │");
puts("└──────────────┘");
for(i=1; i<4; i++)
{
window(2, (i+2), 15, (i+2));
textbackground(pos_y==i?MAGENTA:WHITE);
textcolor(GREEN);
clrscr();
puts(menu1[i-1]);
}
}
}
int print_list(int f, int l, int sel)
{
ITEM *CurrNODE=head->first;
int i, y;
for(i=y=1; CurrNODE!=NULL && i<=l; CurrNODE=CurrNODE->next, i++)
{
if(i>f && i<=l)
{
print_sel_line(y, sel);
print_cell(1, y, sel);
cprintf("%d. ", CurrNODE->data.id);
print_cell(2, y, sel);
cputs(CurrNODE->data.surname);
print_cell(3, y, sel);
cputs(CurrNODE->data.drug_form);
print_cell(4, y, sel);
cprintf("%d ", CurrNODE->data.recipe);
print_cell(5, y, sel);
cprintf("%d", CurrNODE->data.cost);
print_cell(6, y, sel);
cprintf("%d%", CurrNODE->data.exemption);
print_cell(7, y, sel);
cprintf("%d", CurrNODE->data.paid);
print_cell(8, y, sel);
cputs(CurrNODE->data.day);
//cprintf("%f ", CurrNODE->data->rec_numb);
y++;
}
}
return y;
}
void print_sel_line(int y, int sel)
{
window(2, (y+4), 79, (y+4));
textbackground(sel!=y?BLUE:MAGENTA);
textcolor(WHITE);
clrscr();
}
void print_cell(int cell, int y, int sel)
{
switch(cell) //выпадающий список
{
case 1:
window(2,(y+4),6,(y+4));
break;
case 2:
window(8,(y+4),20,(y+4));
break;
case 3:
window(22,(y+4),30,(y+4));
break;
case 4:
window(32,(y+4),40,(y+4));
break;
case 5:
window(42,(y+4),49,(y+4));
break;
case 6:
window(51,(y+4),58,(y+4));
break;
case 7:
window(60,(y+4),67,(y+4));
break;
case 8:
window(69,(y+4),79,(y+4));
break;
default:
break;
}
textbackground(sel!=y?BLUE:MAGENTA);
textcolor(WHITE);
clrscr();
}
void select()
{
if(pos_g==0)
{
pos_g=1;
pos_x=-1;
print_menu();
switch(pos_y) //выпадающий список
{
case 1:
add();
break;
case 2:
edit(getN("id:"), 1);
break;
case 3:
DeleteList(getN("id:"));
break;
default:
break;
}
pos_x=1;
}
else
{
switch(pos_x)
{
case 1:
pos_g=0;
print_menu();
break;
case 2:
pos_x=-1;
search();
pos_x=1;
break;
case 3:
pos_x=-1;
sort_control();
pos_x=1;
break;
case 4:
filter();
break;
case 5:
//stat
break;
case 6:
//help
break;
case 7:
write_db();
exit(0);
break;
default:
break;
}
}
}
void add()
{
int key, f, l, y=1, i, n=head->number;
table();
AddList(y);
for(;;)
{
table();
l=head->number;
f=((l-n)>18?(l-18):n);
y=print_list(f, l, -1);
key=getch();
if(key==TAB)
break;
else
if(key==ENTER)
AddList(y);
else
continue;
}
}
void AddList(int y)
{
DATA data;
data.id=++LastID;
strcpy(data.day, day_of_today);
AddStatBar("Фамилия больного?", y);
gets(data.surname);
AddStatBar("Лекарственная форма?", y);
gets(data.drug_form);
AddStatBar("№ рецепта?", y);
scanf("%d", &data.recipe);
AddStatBar("Розничная цена, руб.?", y);
scanf("%d", &data.cost);
AddStatBar("Вид льготы?", y);
scanf("%d", &data.exemption);
data.paid=(data.exemption*data.cost)/100;
//AddStatBar("Количество рецептурных номеров?", y);
//scanf("%f", new_node->rec_numb);
AddStatBar("", -1);
//вычисление new_node->paid
AddDATA( data);
}
void AddDATA(DATA data)
{
ITEM *CurrL=head->last, *new_node=NULL;
if((new_node=(ITEM *)malloc(sizeof(ITEM)))!=NULL)
{
if(head->number!=0)
{
CurrL->next=new_node;
new_node->prev=CurrL;
}
else
{
new_node->prev=NULL;
head->first=new_node;
}
new_node->next=NULL;
new_node->data=&data;
head->number++;
head->last=new_node;
}
else
{
ERRORS("Memory error");
}
}
void AddStatBar(char *str, int y)
{
window(1,25,60,25);
textbackground(WHITE);
textcolor(BLACK);
clrscr();
cputs(str);
if(y!=-1)
{
window(2,(y+4),79,(y+4));
textbackground(MAGENTA);
textcolor(WHITE);
clrscr();
fflush(stdin);
}
}
void view()
{
int n=head->number, f=1, l, i, key, sel=1;
l=(n<=19?n:19);
print_menu();
for(;;)
{
table();
if(n!=0)
{
n=head->number;
l=(n<=19?n:l);
print_list((f-1), l, sel);
key=getch();
if(key!=0)
{
if(key==TAB)
break;
else
if(key==ENTER)
{
edit(((f+sel)-1), sel);
}
else
{
continue;
}
}
else
{
key=getch();
if(key==UP)
{
if(sel>1)
{
sel--;
}
else
{
if(f>1 && sel==1)
{
f--;
l--;
}
}
}
else
{
if(key==DOWN)
{
if(sel<19 && sel!=n)
{
sel++;
}
else
{
if(l<n && sel==19)
{
f++;
l++;
}
}
}
else
{
if(key==DELETE)
{
DeleteList(((f+sel)-1));
if(sel>n)
sel=n;
if(l>n)
l=n;
}
else
{
continue;
}
}
}
}
}
else
{
ERRORS("List is empty");
break;
}
}
}
void date()
{
time_t now_time;
struct tm *timeinfo;
time(&now_time);
timeinfo = localtime(&now_time);
strftime(day_of_today, 100, "%d.%m.%Y",timeinfo);
}
void write_db()
{
FILE *DB;
ITEM *Curr;
DB=fopen("DB.DAT", "w+b");
if(DB!=NULL)
{
fwrite(&LastID, sizeof(int), 1, DB);
for(Curr=head->first; Curr!=NULL; Curr=Curr->next)
{
fwrite(&Curr->data, sizeof(DATA), 1, DB);
}
}
fclose(DB);
}
void read_db()
{
FILE *DB;
DATA data;
DB=fopen("DB.DAT", "rb");
if(DB!=NULL)
{
fread(&LastID, sizeof(int), 1, DB);
while(fread(&data, sizeof(DATA), 1, DB)!=0)
{
AddDATA(data);
}
}
fclose(DB);
}
int getN(char *str)
{
ITEM *Curr;
int id=0, i;
window(29,11,51,15);
textbackground(WHITE);
textcolor(BLACK);
clrscr();
cputs(" ╒═══════════════════╕ ");
cputs(" │ │ ");
cputs(" ╞═══════════════════╡ ");
cputs(" │ │ ");
cputs(" ╘═══════════════════╛");
window(31,12,49,12);
textbackground(WHITE);
textcolor(WHITE);
clrscr();
cputs(str);
window(31,14,49,14);
textbackground(CYAN);
textcolor(BLACK);
clrscr();
fflush(stdin);
scanf("%d", &id);
table();
if(id>LastID)
{
ERRORS("ID error");
}
else
{
for(Curr=head->first, i=1; id!=Curr->data.id; Curr=Curr->next, i++);
if(Curr==NULL)
{
ERRORS("ID error");
}
else
{
return i;
}
}
return 0;
}
void DeleteList(int n)
{
ITEM *CurrNODE=head->first, *PrevNODE=NULL, *NextNODE;
int i;
if(n>0)
{
for(i=1; n!=i; i++, PrevNODE=CurrNODE, CurrNODE=CurrNODE->next);
NextNODE=CurrNODE->next;
PrevNODE->next=NextNODE;
if(n==head->number)
PrevNODE->next=NULL;
if(n==1)
head->first=NextNODE;
free(CurrNODE);
head->number--;
}
}
void EmptyList()
{
if((head=(HITEM *)malloc(sizeof(HITEM)))!=NULL)
{
head->number=0;
head->first=NULL;
head->last=NULL;
read_db();
}
else
{
ERRORS("Memory error");
}
}
void edit(int n, int sel)
{
ITEM *Curr;
int sel_x=1, key, i;
if(n<1)
return;
for(Curr=head->first, i=1; i!=n; i++, Curr=Curr->next);
for(;;)
{
print_edit_line(sel, sel_x, Curr);
key=getch();
if(key==TAB)
{
sel_x++;
if(sel_x>5)
sel_x=1;
}
else
{
if(key==ENTER)
{
EditList(sel, sel_x, Curr);
}
else
{
if(key==ESC)
{
break;
}
else
{
continue;
}
}
}
}
}
void EditList(int sel, int sel_x, ITEM *CurrNODE)
{
fflush(stdin);
switch(sel_x)
{
case 1:
AddStatBar("Фамилия больного?", -1);
window(8, (sel+4), 20, (sel+4));
textbackground(LIGHTGREEN);
textcolor(BLACK);
clrscr();
gets(CurrNODE->data.surname);
break;
case 2:
AddStatBar("Лекарственная форма?", -1);
window(22, (sel+4), 30, (sel+4));
textbackground(LIGHTGREEN);
textcolor(BLACK);
clrscr();
gets(CurrNODE->data.drug_form);
break;
case 3:
AddStatBar("№ рецепта?", -1);
window(32, (sel+4), 40, (sel+4));
textbackground(LIGHTGREEN);
textcolor(BLACK);
clrscr();
scanf("%d", &CurrNODE->data.recipe);
break;
case 4:
AddStatBar("Розничная цена, руб.?", -1);
window(42, (sel+4), 49, (sel+4));
textbackground(LIGHTGREEN);
textcolor(BLACK);
clrscr();
scanf("%d", &CurrNODE->data.cost);
CurrNODE->data.paid=(CurrNODE->data.exemption*CurrNODE->data.cost)/100;
break;
case 5:
AddStatBar("Вид льготы?", -1);
window(51, (sel+4), 58, (sel+4));
textbackground(LIGHTGREEN);
textcolor(BLACK);
clrscr();
scanf("%d", &CurrNODE->data.exemption);
CurrNODE->data.paid=(CurrNODE->data.exemption*CurrNODE->data.cost)/100;
break;
default:
break;
}
AddStatBar("", -1);
}
void print_edit_line(int sel, int sel_x, ITEM *CurrNODE)
{
window(2, (sel+4), 79, (sel+4));
textbackground(LIGHTGRAY);
textcolor(WHITE);
clrscr();
window(7, (sel+4), 59, (sel+4));
textbackground(MAGENTA);
textcolor(WHITE);
clrscr();
print_cell(2, sel, sel);
cputs(CurrNODE->data.surname);
print_cell(3, sel, sel);
cputs(CurrNODE->data.drug_form);
print_cell(4, sel, sel);
cprintf("%d", CurrNODE->data.recipe);
print_cell(5, sel, sel);
cprintf("%d", CurrNODE->data.cost);
print_cell(6, sel, sel);
cprintf("%d%", CurrNODE->data.exemption);
textbackground(YELLOW);
textcolor(BLACK);
switch(sel_x)
{
case 1:
window(8, (sel+4), 20, (sel+4));
clrscr();
cputs(CurrNODE->data.surname);
break;
case 2:
window(22, (sel+4), 30, (sel+4));
clrscr();
cputs(CurrNODE->data.drug_form);
break;
case 3:
window(32, (sel+4), 40, (sel+4));
clrscr();
cprintf("%d ", CurrNODE->data.recipe);
break;
case 4:
window(42, (sel+4), 49, (sel+4));
clrscr();
cprintf("%d", CurrNODE->data.cost);
break;
case 5:
window(51, (sel+4), 58, (sel+4));
clrscr();
cprintf("%d%", CurrNODE->data.exemption);
break;
default:
break;
}
}
void sort_control()
{
int sel_x=1, sel=1, n, f=1, l=20, key;
for(;;)
{
n=head->number;
l=(n<=19?n:l);
print_sort_list(f, l, sel_x, sel);
key=getch();
if(key!=0)
{
if(key==ENTER)
edit(((f+sel)-1), sel);
else
if(key==TAB)
break;
else
continue;
}
else
{
key=getch();
switch(key)
{
case RIGHT:
if(sel_x<8)
{
sel_x++;
sort(sel_x);
f=1;
l=(n<=19?n:l);
}
break;
case LEFT:
if(sel_x>1)
{
sel_x--;
sort(sel_x);
f=1;
l=(n<=19?n:l);
}
break;
case UP:
if(sel>1)
sel--;
else
if(f>1 && sel==1)
{
f--;
l--;
}
break;
case DOWN:
if(sel<19 && sel!=n)
sel++;
else
if(l<n && sel==19)
{
f++;
l++;
}
break;
case DELETE:
DeleteList(((f+sel)-1));
if(sel>n)
sel=n;
if(l>n)
l=n;
break;
default:
break;
}
}
}
}
void print_sort_list(int f, int l, int sel_x, int sel)
{
ITEM *CurrNODE=head->first;
int i, y;
table();
print_sel_cell(sel_x);
for(i=y=1; CurrNODE!=NULL && i<=l; CurrNODE=CurrNODE->next, i++)
{
if(i>=f && i<=l)
{
print_sel_line(y, sel);
print_cell(1, y, sel);
cprintf("%d. ", CurrNODE->data.id);
print_cell(2, y, sel);
cputs(CurrNODE->data.surname);
print_cell(3, y, sel);
cputs(CurrNODE->data.drug_form);
print_cell(4, y, sel);
cprintf("%d ", CurrNODE->data.recipe);
print_cell(5, y, sel);
cprintf("%d", CurrNODE->data.cost);
print_cell(6, y, sel);
cprintf("%d%", CurrNODE->data.exemption);
print_cell(7, y, sel);
cprintf("%d", CurrNODE->data.paid);
print_cell(8, y, sel);
cputs(CurrNODE->data.day);
//cprintf("%f ", CurrNODE->data->rec_numb);
textbackground(YELLOW);
textcolor(BLACK);
switch(sel_x)
{
case 1:
window(2, (y+4), 6, (y+4));
clrscr();
cprintf("%d. ", CurrNODE->data.id);
break;
case 2:
window(8, (y+4), 20, (y+4));
clrscr();
cputs(CurrNODE->data.surname);
break;
case 3:
window(22, (y+4), 30, (y+4));
clrscr();
cputs(CurrNODE->data.drug_form);
break;
case 4:
window(32, (y+4), 40, (y+4));
clrscr();
cprintf("%d ", CurrNODE->data.recipe);
break;
case 5:
window(42, (y+4), 49, (y+4));
clrscr();
cprintf("%d", CurrNODE->data.cost);
break;
case 6:
window(51, (y+4), 58, (y+4));
clrscr();
cprintf("%d%", CurrNODE->data.exemption);
break;
case 7:
window(60, (y+4), 67, (y+4));
clrscr();
cprintf("%d", CurrNODE->data.paid);
break;
case 8:
window(69, (y+4), 79, (y+4));
clrscr();
cputs(CurrNODE->data.day);
break;
default:
break;
}
y++;
}
}
}
void sort(int sel_x)
{
ITEM *Curr, *P, *N, *TMP;
int n=head->number, i, k;
for(i=0; i<=n; i++)
{
for(Curr=head->first; Curr->next!=NULL;)
{
TMP=Curr->next;
k=0;
switch(sel_x)
{
case 1:
if(Curr->data.id>TMP->data.id) k=1;
break;
case 2:
if(strcmp(Curr->data.surname, TMP->data.surname)>0) k=1;
break;
case 3:
if(strcmp(Curr->data.drug_form, TMP->data.drug_form)>0) k=1;
break;
case 4:
if(Curr->data.recipe>TMP->data.recipe) k=1;
break;
case 5:
if(Curr->data.cost>TMP->data.cost) k=1;
break;
case 6:
if(Curr->data.exemption>TMP->data.exemption) k=1;
break;
case 7:
if(Curr->data.paid>TMP->data.paid) k=1;
break;
case 8:
if(Curr->data.id>TMP->data.id) k=1;
break;
default:
break;
}
if(k==1)
{
if(Curr->prev==NULL)
head->first=TMP;
if(TMP->next == NULL)
head->last=Curr;
P=Curr->prev;
N=TMP->next;
if(P!=NULL)
P->next=TMP;
if(N != NULL)
N->prev=Curr;
Curr->next=N;
Curr->prev=TMP;
TMP->next=Curr;
TMP->prev=P;
}
else
{
Curr=Curr->next;
}
}
}
}
void search()
{
ITEM *CurrNODE;
char str[100]="";
int sel_x, n, k=0, n_find, f, l, i_find=1, sel=1, y, i, key;
print_menu();
sel_x=sel_cell();
window(29,11,51,15);
textbackground(WHITE);
textcolor(BLACK);
clrscr();
cputs(" ╒═══════════════════╕ ");
cputs(" │ │ ");
cputs(" ╞═══════════════════╡ ");
cputs(" │ │ ");
cputs(" ╘═══════════════════╛");
window(31,12,49,12);
textbackground(WHITE);
textcolor(WHITE);
clrscr();
cputs("Ищем:");
window(31,14,49,14);
textbackground(CYAN);
textcolor(BLACK);
clrscr();
fflush(stdin);
switch(sel_x)
{
case 1:
scanf("%d", &k);
break;
case 2:
gets(str);
break;
case 3:
gets(str);
break;
case 4:
scanf("%d", &k);
break;
case 5:
scanf("%d", &k);
break;
case 6:
scanf("%d", &k);
break;
case 7:
scanf("%d", &k);
break;
case 8:
gets(str);
break;
default:
break;
}
n_find=sfN(sel_x, str, k);
if(n_find>0)
{
for(;;)
{
table();
f=sN(sel_x, str, k, i_find);
l=((f+18)>n?n:(f+18));
//printf("%d - %d", f, l);
//getch();
for(CurrNODE=head->first, i=y=1; CurrNODE!=NULL; CurrNODE=CurrNODE->next, i++)
{
if(i>=f && i<=l)
{
print_sel_line(y, sel);
print_cell(1, y, sel);
cprintf("%d. ", CurrNODE->data.id);
print_cell(2, y, sel);
cputs(CurrNODE->data.surname);
print_cell(3, y, sel);
cputs(CurrNODE->data.drug_form);
print_cell(4, y, sel);
cprintf("%d ", CurrNODE->data.recipe);
print_cell(5, y, sel);
cprintf("%d", CurrNODE->data.cost);
print_cell(6, y, sel);
cprintf("%d%", CurrNODE->data.exemption);
print_cell(7, y, sel);
cprintf("%d", CurrNODE->data.paid);
print_cell(8, y, sel);
cputs(CurrNODE->data.day);
//cprintf("%f ", CurrNODE->data->rec_numb);
y++;
}
}
key=getch();
if(key!=0)
{
if(key==ENTER)
{
edit(f, sel);
return;
}
else
if(key==TAB)
break;
else
continue;
}
else
{
key=getch();
switch(key)
{
case PgUP:
if(i_find>1)
i_find--;
break;
case PgDOWN:
if(i_find<n_find)
i_find++;
break;
case DELETE:
DeleteList(f);
n_find--;
if(n_find!=0)
i_find=1;
else
return;
break;
default:
break;
}
}
}
}
else
{
table();
ERRORS("Search error");
}
}
void filter()
{ ITEM *CurrNODE;
int sel_x, k=0, n_find, i_find, l, n, sel=1, f=1;
char str[100]="";
sel_x=sel_cell();
window(29,11,51,15);
textbackground(WHITE);
textcolor(BLACK);
clrscr();
cputs(" ╒═══════════════════╕ ");
cputs(" │ │ ");
cputs(" ╞═══════════════════╡ ");
cputs(" │ │ ");
cputs(" ╘═══════════════════╛");
window(31,12,49,12);
textbackground(WHITE);
textcolor(WHITE);
clrscr();
cputs("Ищем:");
window(31,14,49,14);
textbackground(CYAN);
textcolor(BLACK);
clrscr();
fflush(stdin);
switch(sel_x)
{
case 1:
scanf("%d", &k);
break;
case 2:
gets(str);
break;
case 3:
gets(str);
break;
case 4:
scanf("%d", &k);
break;
case 5:
scanf("%d", &k);
break;
case 6:
scanf("%d", &k);
break;
case 7:
scanf("%d", &k);
break;
case 8:
gets(str);
break;
default:
break;
}
if(sfN(sel_x, str, k)<1)
ERRORS("Filter error");
for(;;)
{
table();
n_find=sfN(sel_x, str, k);
l=(n_find<=19?n_find:19);
for(i_find=1, CurrNODE=head->first; CurrNODE!=NULL && i_find!=n_find; CurrNODE=CurrNODE->next)
{
if(i_find>=f && i_find<=l)
{
switch(sel_x)
{
case 1:
if(CurrNODE->data.id==k){ print_line(i_find, sel, CurrNODE); i_find++;}
break;
case 2:
if(strcmp(CurrNODE->data.surname, str)==0){ print_line(i_find, sel, CurrNODE); i_find++;}
break;
case 3:
if(strcmp(CurrNODE->data.drug_form, str)==0){ print_line(i_find, sel, CurrNODE); i_find++;}
break;
case 4:
if(CurrNODE->data.recipe==k){ print_line(i_find, sel, CurrNODE); i_find++;}
break;
case 5:
if(CurrNODE->data.cost==k){ print_line(i_find, sel, CurrNODE); i_find++;}
break;
case 6:
if(CurrNODE->data.exemption==k){ print_line(i_find, sel, CurrNODE); i_find++;}
break;
case 7:
if(CurrNODE->data.paid==k){ print_line(i_find, sel, CurrNODE); i_find++;}
break;
case 8:
if(strcmp(CurrNODE->data.day, str)==0){ print_line(i_find, sel, CurrNODE); i_find++;}
break;
default:
break;
}
}
}
key=getch();
if(key!=0)
{
if(key==ENTER)
{
//edit(f, sel);
//return;
}
else
if(key==TAB)
break;
else
continue;
}
else
{
key=getch();
switch(key)
{
case UP:
if(sel>1)
sel--;
else
if(sel==1 && f>1)
{
f--;
l--;
}
break;
case DOWN:
if(sel<19 && sel!=n_find)
sel++;
else
if(l<n_find && sel==19)
{
f++;
l++;
}
break;
case DELETE:
//DeleteList(f);
// n_find--;
// if(n_find!=0)
// i_find=1;
// else
// return;
// break;
default:
break;
}
}
}
}
void print_line(int y, int sel, ITEM *CurrNODE)
{
print_sel_line(y, sel);
print_cell(1, y, sel);
cprintf("%d. ", CurrNODE->data.id);
print_cell(2, y, sel);
cputs(CurrNODE->data.surname);
print_cell(3, y, sel);
cputs(CurrNODE->data.drug_form);
print_cell(4, y, sel);
cprintf("%d ", CurrNODE->data.recipe);
print_cell(5, y, sel);
cprintf("%d", CurrNODE->data.cost);
print_cell(6, y, sel);
cprintf("%d%", CurrNODE->data.exemption);
print_cell(7, y, sel);
cprintf("%d", CurrNODE->data.paid);
print_cell(8, y, sel);
cputs(CurrNODE->data.day);
}
int sfN(int sel_x, char *str, int k)
{
ITEM *CurrNODE;
int n=0;
for(CurrNODE=head->first, n=0; CurrNODE!=NULL; CurrNODE=CurrNODE->next)
{
switch(sel_x)
{
case 1:
if(CurrNODE->data.id==k) n++;
break;
case 2:
if(strcmp(CurrNODE->data.surname, str)==0) n++;
break;
case 3:
if(strcmp(CurrNODE->data.drug_form, str)==0) n++;
break;
case 4:
if(CurrNODE->data.recipe==k) n++;
break;
case 5:
if(CurrNODE->data.cost==k) n++;
break;
case 6:
if(CurrNODE->data.exemption==k) n++;
break;
case 7:
if(CurrNODE->data.paid==k) n++;
break;
case 8:
if(strcmp(CurrNODE->data.day, str)==0) n++;
break;
default:
break;
}
}
return n;
}
int sN(int sel_x, char *str, int k, int i_find)
{
ITEM *CurrNODE;
int n, i;
for(CurrNODE=head->first, n=0, i=1; CurrNODE!=NULL && i_find!=n; CurrNODE=CurrNODE->next, i++)
{
switch(sel_x)
{
case 1:
if(CurrNODE->data.id==k) n++;
break;
case 2:
if(strcmp(CurrNODE->data.surname, str)==0) n++;
break;
case 3:
if(strcmp(CurrNODE->data.drug_form, str)==0) n++;
break;
case 4:
if(CurrNODE->data.recipe==k) n++;
break;
case 5:
if(CurrNODE->data.cost==k) n++;
break;
case 6:
if(CurrNODE->data.exemption==k) n++;
break;
case 7:
if(CurrNODE->data.paid==k) n++;
break;
case 8:
if(strcmp(CurrNODE->data.day, str)==0) n++;
break;
default:
break;
}
}
return (i-1);
}
void print_sel_cell(int sel_x)
{
textbackground(YELLOW);
textcolor(BLACK);
switch(sel_x)
{
case 1:
window(2, 3, 6, 3);
clrscr();
cputs(" № ");
break;
case 2:
window(8, 3, 20, 3);
clrscr();
cputs(" Фамилия ");
break;
case 3:
window(22, 3, 30, 3);
clrscr();
cputs("Лек.фор.");
break;
case 4:
window(32, 3, 40, 3);
clrscr();
cputs("№ рецеп.");
break;
case 5:
window(42, 3, 49, 3);
clrscr();
cputs(" Цена ");
break;
case 6:
window(51, 3, 58, 3);
clrscr();
cputs(" Льгота");
break;
case 7:
window(60, 3, 67, 3);
clrscr();
cputs("Опла-но");
break;
case 8:
window(69, 3, 79, 3);
clrscr();
cputs(" Дата ");
break;
default:
break;
}
}
int sel_cell()
{
int sel_x=1, key;
for(;;)
{
table();
print_sel_cell(sel_x);
key=getch();
if(key!=0)
{
if(key==ENTER)
break;
else
if(key==TAB)
return 0;
else
continue;
}
else
{
key=getch();
switch(key)
{
case RIGHT:
if(sel_x<8)
sel_x++;
break;
case LEFT:
if(sel_x>1)
sel_x--;
break;
default:
break;
}
}
}
return sel_x;
}
void ERRORS(char *str)
{
window(29,12,51,14);
textbackground(LIGHTRED);
textcolor(BLACK);
clrscr();
cputs(" ╔═══════════════════╗ ");
cputs(" ║ ║ ");
cputs(" ╚═══════════════════╝");
window(32,13,49,13);
textbackground(LIGHTRED);
textcolor(BLACK);
cputs(str);
getch();
}