#define N 100
#include<stdio.h>
#include<string.h>
#include<conio.h>
/*聲明*/
void myprint();
int mycreat(struct shebei_type*p,int n);
void mydisplay(struct shebei_type*p,int n);
void mysearch(struct shebei_type*p,int n);
void mymodify(struct shebei_type*p,int n);
int myadd(struct shebei_type*p,int n);
int mydelete(struct shebei_type*p,int n);
void mysort(struct shebei_type*p,int n);
void sch_num(struct shebei_type*p,int n);
void sch_name(struct shebei_type*p,int n);
void mystatic(struct shebei_type*p,int n);
int loadinfo(struct shebei_type*p,int n);
int saveinfo(struct shebei_type*p,int n);
struct date
{ int year;
int month;
int date;
};
struct shebei_type
{int num;
char name[10];
char kind[10];
int price;
struct date time;
char lab[10];
int amount;
}
/*主程序*/
main()
{char choose,yes_no;
struct shebei_type record[N];
int total=0,flag;
total=loadinfo(record,N);
do
{
myprint();
printf(" 請選擇: ");
choose=getche();
switch(choose)
{
case 1: mycreat(record,total);break;
case 2: mydisplay(record,total);break;
case 3: mysearch(record,total);break;
case 4: mymodify(record,total);break;
case 5: myadd(record,total);break;
case 6: mydelete(record,total);break;
case 7: mysort(record,total);break;
case 8: flag=saveinfo(record,total);
if( flag == 1 )
{
printf( "\n保存成功!\n" );
}
else
{
printf( "\n保存失敗\n" );
}
break;
case 9:mystatic(record,total);break;
case 0:break;
default:
printf("\n %c為非法選項!\n",choose);
}
if(choose=='0')break;
printf("\n 要繼續選擇嗎(Y/N)?");
do
{
yes_no=getche();
}
while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');
}
while(yes_no!='Y'||yes_no!='y');
}
/*界面*/
void myprint();
{
printf("\n");
printf("************************");
printf(" 實驗室設備管理系統 ");
printf("***********************");
printf(" 請輸入選項編號(0--7) \n");
printf(" 1--創建設備信息 \n");
printf(" 2--顯示設備信息 \n");
printf(" 3--查詢設備信息 \n");
printf(" 4--修改設備信息 \n");
printf(" 5--添加設備信息 \n");
printf(" 6--刪除設備信息 \n");
printf(" 7--排序設備信息 \n");
printf(" 8--保存設備信息 \n");
printf(" 9--統計設備信息 \n");
printf(" 0--退出 \n");
}
/*載入信息*/
int loadinfo(struct shebei_type*p,int n)
{
FILE *fp;
int i,all=0;
char filename[30]="tx1.dat";
fp=fopen(filename, "r");
if ( fp == NULL )
{
return 0;
}
fscanf(fp,"%d\n",&all);
for( i = 0; i < all; i++ )
{
fscanf( fp,"%s%s%f%f%f%f\n",p[i].num ,p[i].name ,p[i].price ,p[i].time ,p[i].lab ,p[i]kind );
}
fclose(fp);
return all;
}
/*保存信息*/
int saveinfo(struct shebei_type*p,int n)
{
FILE *fp;
int i; int all=0;
char filename[30]="tx1.dat";
fp = fopen ( filename,"w");
if ( fp == NULL)
{
printf( "\n***不能建立或打開文件%s!", filename );
return 0;
}
fprintf( fp, "%d\n", n );
for ( i = 0; i < n; i++ )
{
fprintf( fp, "%8s%8s%8.2f%8.2f%8.2f%8.2f\n",p[i].num ,
p[i].name ,p[i].kind ,p[i].price ,p[i].time ,p[i].lab );
}
fclose(fp);
return 1;
}
/*顯示信息*/
void mydisplay(struct shebei_type*p,int n)
{
int i = 0;
printf("\n");
printf("-----------------------------------------------\n");
printf(" 編號 分類 名稱 價格 購買時間 所屬實驗室\n");
while( i < n )
{
printf("%8s%8s%8.2f%8.2f%8.2f\n", p->num , p->kind , p->name , p->price , p->time , p->lab);
p++;
i++;
}
}
/*輸入信息*/
int mycreat(struct shebei_type*p,int n)
{
int i;
int m;
printf("\n請輸入要輸入設備的個數(<%d): ",N);
scanf("%d",&m);
i=0;
while(i<m)
{
printf("\n");
printf("請輸入第%d個記錄:\n",i+1);
printf("編號:");
do
{
scanf( "%s",p->num);
}
while(strcmp(p->num,"")==0);
printf("名稱:");
scanf( "%s",p->name );
printf("類別:");
scanf( "%f", &p->kind );
printf( "購買時間:" );
scanf( "%f", &p->time );
printf("所屬實驗室:");
scanf( "%f", &p->lab );
rintf("購買價格:");
scanf( "%f", &p->price );
i++;
p++;
}
return m+n;
}
/*查找*/
void mysearch(struct shebei_type*p,int n)
{
char c;
mydisplay(p,n);
printf("\n按不編號查詢(h),還是按名稱查詢(m)?");
c=getche();
if(c=='h'||c=='H')
sch_num(p,n);
else if(c=='m'||c=='M')
sch_name(p,n);
else
printf("\n非法字符!\n");
}
/*按編號查找*/
void sch_num(struct shebei_type*p,int n)
{
int i,flag=0;
char nm[10];
printf("\n請輸入要查設備的編號:");
gets(nm);
for(i=0;i<n;i++)
if(strcmp(nm,p[i].num)==0)
{
printf("編號 名稱 價格 夠買時間 所屬實驗室 類別\n");
printf("%8s%8s%8.2f%8.2f%8.2f\n",p[i].num ,
p[i].name ,p[i].price ,p[i].time ,p[i].lab , p[i].kind);
flag=1;
}
if(flag==0)
printf("無此設備!\n");
}
/*按名稱查詢*/
void sch_name(struct shebei_type*p,int n)
{
int i,flag=0;
char nam[10];
printf("\n請輸入要查設備的名稱:");
gets(nam);
for(i=0;i<n;i++)
if(strcmp(nam,p[i].name)==0)
{
printf("編號 名稱 價格 夠買時間 所屬實驗室 類別\n");
printf("%8s%8s%8.2f%8.2f%8.2f\n",p[i].num ,
p[i].name ,p[i].price ,p[i].time ,p[i].lab ,p[i].kind);
flag=1;
}
if(flag==0)
printf("無此設備!\n");
}
/*修改信息*/
void mymodify(struct shebei_type*p,int n)
{
int i;
char nam[10];
mydisplay(p,n);
printf("\n 請輸入要修改的名稱:");
gets(nam);
for(i=0;i<n;i++,p++)
{
if(strcmp(nam,p->name)==0)break;
}
if(i==n)
printf("無此設備!\n");
else
{
printf("請輸入正確的編號:");
do
{
scanf( "%s",p->num);
}
while(strcmp(p->num,"")==0);
printf("請輸入正確的名稱:");
scanf( "%s",p->name );
printf("請輸入正確的價格:");
scanf( "%f", &p->price );
printf( "請輸入正確的購買時間:" );
scanf( "%f", &p->time );
printf("請輸入正確的所屬實驗室:");
scanf( "%f", &p->lab );
printf("請輸入正確的類別:");
scanf( "%f", &p->kind );
}
}
/*增加信息*/
int myadd(struct shebei_type*p,int n)
{
int i=0;
char c;
struct shebei_type t,*q;
/*clscr();*/
printf("添加前的記錄: \n");
printf("編號 名稱 價格 夠買時間 所屬實驗室 類別\n");
i=0;
q=p;
/*顯示原有記錄信息*/
while(i<n)
{
printf("%8s%8s%8.2f%8.2f%8.2f%8.2f\n", q->num , q->name , q->price , q->time , q->lab , q->kind );
i++;
q++;
}
do
{
printf("請輸入新記錄的編號: \n");
do
{
scanf( "%s",t.num );
}
while(strcmp(p->num,"")==0);
/*不能為空*/
printf("請輸入新記錄的名稱: ");
scanf( "%s",t.name );
printf("請輸入新記錄的價格:");
scanf( "%f", &t.price );
printf( "請輸入新記錄的購買時間:" );
scanf( "%f", &t.time );
printf("請輸入新記錄的所屬實驗室:");
scanf( "%f", &t.lab );
printf("請輸入新記錄的類別:");
scanf( "%f", &t.kind );
for(i=0;i<n;i++)
if(strcmp(t.num,(p+i)->num)==0)
{
printf("編號重復,要重新輸入嗎(Y/N)?");
c=getche();
putchar('\n');
break;
}
/*找到最後沒有重復*/
if(i==n)
{
*(p+i)=t;
printf("添加後的紀錄:\n");
printf("編號 名稱 價格 夠買時間 所屬實驗室 類別\n");
for(i=0;i<n+1;i++)
printf("%8s%8s%8.2f%8.2f%8.2f%8.2f\n",p[i].num ,
p[i].name ,p[i].price ,p[i].time ,p[i].lab ,p[i].kind );
break;
}
}
while(c=='y'||c=='Y');
return n+1;
}
/*刪除信息*/
int mydelete(struct shebei_type*p,int n)
{
int i,x;
char c,nm[10],nam[10];
printf("\n刪除前的記錄: \n");
printf("編號 名稱 價格 夠買時間 所屬實驗室 類別\n");
for(i=0;i<n;i++)
printf("%8s%8s%8.2f%8.2f%8.2f%8.2f\n",p[i].num ,
p[i].name ,p[i].price ,p[i].time ,p[i].lab ,p[i].kind );
printf("按編號刪除(h),還是按名稱刪除(m)?");
c=getche();
if(c=='h'||c=='H')
{
printf("\n請輸入要刪除記錄的編號: ");
gets(nm);
for(x=0;x<n;x++)
if(strcmp(nm,p[x].num)==0)
{
return n-1;
break;
}
if(x<n)
{
for
(i=x;i<n;i++)
{
p[i]=p[i+1];
}
printf("刪除後的記錄: \n");
printf("編號 名稱 價格 夠買時間 所屬實驗室 類別\n");
for(i=0;i<n-1;i++)
printf("%8s%8s%8.2f%8.2f%8.2f%8.2f\n",p[i].num ,
p[i].name ,p[i].price ,p[i].time ,p[i].lab ,p[i].kind );
}
else
printf("無此設備\n");
}
else
if(c=='m'||c=='M')
{
printf("\n請輸入要刪除記錄的名稱: ");
gets(nam);
for(x=0;x<n;x++)
if(strcmp(nam,p[x].name)==0)
{
return n-1;
break;
}
if(x<n)
{
for(i=x;i<n-1;i++)
{
p[i]=p[i+1];
}
printf("刪除後的記錄: \n");
printf("編號 名稱 價格 夠買時間 所屬實驗室 類別\n");
for(i=0;i<n-1;i++)
printf("%8s%8s%8.2f%8.2f%8.2f%8.2f\n",p[i].num ,
p[i].name ,p[i].price ,p[i].time ,p[i].lab ,p[i].kind );
}
else
printf("無此設備\n");
}
else
{
printf("\n非法字符\n");
return n;
}
}
/*排序*/
void mysort(struct shebei_type*p,int n)
{
int j,i,k;
char c1,c2;
struct lab temp;
/*clrscr()*/
printf("排序前的記錄:\n");
printf("編號 名稱 價格 夠買時間 所屬實驗室 類別\n");
for(i=0;i<n;i++);
printf("%8s%8s%8.2f%8.2f%8.2f%8.2f\n",p[i].num ,
p[i].name ,p[i].price ,p[i].time ,p[i].lab ,p[i].kind );
printf("按價格排序(c),按時間排序(m),按類別排序(e),按編號排序(k),按實驗室排序(a)?");
c1=getche();
/*按價格排序*/
if(c1=='c'||c1=='C')
{
for(i=0;i<n-1;i++)
{
k=i;
for(j=i;j<n;j++)
if( p[k].price >p[j].price )
k=j;
temp=p[k];
p[k]=p[i];
p[i]=temp;
}
printf("\n排序後的記錄:\n");
printf("編號 名稱 價格 夠買時間 所屬實驗室 類別\n");
for(i=0;i<n;i++)
printf("%8s%8s%8.2f%8.2f%8.2f%8.2f\n",p[i].num ,
p[i].name ,p[i].price ,p[i].time ,p[i].lab ,p[i].kind );
}
/*按時間排序*/
else if(c1=='m'||c1=='M')
{
for(i=0;i<n-1;i++)
{
k=i;
for(j=i;j<n;j++)
if( p[k].time > p[j].time )
k=j;
temp=p[k];
p[k]=p[i];
p[i]=temp;
}
printf("\n排序後的記錄:\n");
printf("編號 名稱 價格 夠買時間 所屬實驗室 類別\n");
for(i=0;i<n;i++)
printf("%8s%8s%8.2f%8.2f%8.2f%8.2f\n",p[i].num ,
p[i].name ,p[i].price ,p[i].time ,p[i].lab ,p[i].kind );
}
/*按類別排序*/
else if(c1=='e'||c1=='E')
{
for(i=0;i<n-1;i++)
{
k=i;
for(j=i;j<n;j++)
if( p[k].kind > p[j].kind )
k=j;
temp=p[k];
p[k]=p[i];
p[i]=temp;
}
printf("\n排序後的記錄:\n");
printf("編號 名稱 價格 夠買時間 所屬實驗室 類別\n");
for(i=0;i<n;i++)
printf("%8s%8s%8.2f%8.2f%8.2f%8.2f\n",p[i].num ,
p[i].name ,p[i].price ,p[i].time ,p[i].lab ,p[i].kind );
}
/*統計信息*/
sort_amount()
{ struct shebei_type *p,*q[MAX];
int i,j,k;
clrscr();
printf("\n 庫存排行\n");
printf("---------------------------------------------------------------------\n");
printf("\n 排名 設備號 設備名稱 設備類別 設備價格 設備購買時間 設備所屬實驗室\n");
p=shebei;
for(i=0;i<sum;i++)
q[i]=p++;
for(i=0;i<sum;i++)
{ k=i;
for(j=i+1;j<sum;j++)
if(q[k]->amount<q[j]->amount) k=j;
if (k!=i)
{ p=q[i];q[i]=q[k];q[k]=p;}
}
for(i=0;i<sum;i++)
printf("\n%4d %6d %8s %11s %4d %d-%d-%d %4s\n",
i+1,q[i]->num,q[i]->name,q[i]->kind,q[i]->price,q[i]->time,q[i]->lab);
bioskey(0);
}
/*排序函數*/
void mystatic(struct shebei_type*p,int n)()
{int choice;
do
{ clrscr();
printf("\n\n\n **********設備排行信息**********\n\n");
printf(" 1.庫存排行\n\n");
printf(" 0.返回主菜單\n\n");
printf(" 請選擇(0-1):");
scanf("%d",&choice);
switch(choice)
{ case 1:sort_amount();break;
case 0:break;
}
}while(choice!=0);
}
}