/***************************宏定义****************************/
#defineLENsizeof(structcommdity)
#defineFORMAT”%—8d%—15s%—12。
1lf%-12。
1lf%-12.1lf%\n"
#defineDATAcomm[i]。
num,comm[i]。
name,comm[i].price,comm[i]。
count,comm[i]。
total
/***************************商品结构体*************************/
structcommdity
{
intnum;//编号
charname[20];//商品名称
doubleprice;//单价
doublecount;//数量
doubletotal;//总金额
};
structcommditycomm[50];//定义结构体数组
/**************************函数申明******************************/
voidin();//录入商品信息函数
voidshow();//显示商品信息函数
voidorder();//按总金额排队函数
voiddel();//删除商品信息函数
voidmodify();//修改商品信息函数
voidmenu();//主菜单函数
voidinsert();//插入商品信息函数
voidtotal();//统计总商品数函数
voidsearch();//查找商品信息函数
voidversion();//版本信息
/*************************主函数*********************************/
voidmain()
{
intn;
menu();
scanf("%d”,&n);
while(n)
{
switch(n)/*问题switch()中的数据类型是什么?
答案:
是常量表达式,可以是任何数据类型*/
{
case1:
in();//录入商品信息
break;
case2:
search();//寻找商品信息
break;
case3:
del();//删除商品信息
break;
case4:
modify();//修改商品信息
break;
case5:
insert();//插入商品信息
break;
case6:
order();//排序商品
break;
case7:
total();//统计商品
break;
case8:
version();//版本信息
break;
default:
break;
}
getch();
menu();//返回菜单界面
scanf(”%d”,&n);
}
return;
}
/****************************被调函数体*************************/
//菜单模块
voidmenu()
{
system(”CLS");//清屏函数
printf("\n\n\n\n\n");
printf(”\t\t|**********商品管理系统**************|\n");
printf(”\t\t|\t0退出|\n");
printf(”\t\t|\t1追加记录|\n”);
printf(”\t\t|\t2查找记录|\n”);
printf(”\t\t|\t3删除记录|\n”);
printf(”\t\t|\t4修改记录|\n”);
printf("\t\t|\t5插入记录|\n");
printf("\t\t|\t6排序记录(按总金额)|\n”);
printf(”\t\t|\t7统计记录|\n");
printf("\t\t|\t8版本信息|\n");
printf(”\t\t|************************************|\n");
printf(”\t\t\t选择(0-8):
”);
}
//录入信息模块
//基本的流程为先判断是否存在记录,
//若存在则读到商品结构体中,并显示之。
//根据用户选择在文件后面追加记录
voidin()
{
inti,m=0;
charch[2];
FILE*fp;
//以读写可追加的方式打开文件,如果不存在则新建文件
if((fp=fopen("data。
txt”,”a+”))==NULL)
{
printf(”不能打开文件!
\n");
return;
}
//读取文件到商品结构体数组中,直到全部读取完毕
while(!
feof(fp))
{
if(fread(&comm[m],LEN,1,fp)==1)
m++;
}
fclose(fp);
//判断读取的数量,如果为0则表示没有相关记录,反之显示记录
if(m==0)
{
printf(”没有找到记录!
\n”);
}
else
{
system(”CLS”);
show();
}
//以追加的方式打开
if((fp=fopen("data。
txt",”a"))==NULL)
{
printf("不能打开文件!
\n");
return;
}
printf(”是否输入?
(y/n):
”);
scanf("%s",ch);
while(strcmp(ch,”Y”)==0||strcmp(ch,”y”)==0)/*判断是否要录入新信息*/
{
printf(”编号:
”);
scanf(”%d”,&comm[m].num);/*输入学生学号*/
for(i=0;i〈m;i++)
{
if(comm[i].num==comm[m]。
num)
{
printf("该记录已经存在,按任意键继续!
”);
getch();
fclose(fp);
return;
}
}
printf(”商品名:
”);
scanf(”%s",comm[m].name);/*输入学生姓名*/
printf(”单价:
”);
scanf(”%lf",&comm[m].price);/*输入商品单价*/
printf(”数量:
”);
scanf("%lf",&comm[m]。
count);/*输入商品数量*/
comm[m]。
total=comm[m]。
price*comm[m].count;/*计算出总金额*/
if(fwrite(&comm[m],LEN,1,fp)!
=1)/*将新录入的信息写入指定的磁盘文件*/
{
printf("不能保存!
”);
getch();
}
else
{
printf(”%s已经保存!
\n”,comm[m]。
name);
m++;
}
printf("是否继续?
(y/n):
”);/*询问是否继续*/
scanf("%s”,ch);
}
fclose(fp);
printf(”OK!
\n”);
}
//显示模块
//基本流程,先把文件中的数据依次读入到商品结构体中,
//并依次显示
voidshow()
{
FILE*fp;
inti,m=0;
fp=fopen("data。
txt”,"a+”);
while(!
feof(fp))
{
if(fread(&comm[m],LEN,1,fp)==1)
m++;
}
fclose(fp);
printf("编号商品名称单价数量总金额\t\n");
for(i=0;i〈m;i++)
{
printf(FORMAT,DATA);/*将信息按指定格式打印*/
}
}
//排序模块
//基本流程,先把文件中的数据读到商品结构体数组缓冲区中,
//然后进行冒泡排序,
//最后写入文件,
//在关闭文件
voidorder()
{
FILE*fp;
structcommdityt;//用来作为交换时的中间变量
inti=0,j=0,m=0;
//以追加,读写的方式打开文件
if((fp=fopen(”data。
txt”,"a+”))==NULL)
{
printf("不能打开文件!
\n");
return;
}
//先把文件中的数据读到结构体数组中去。
并得到文件中记录的个数,再关闭文件
while(!
feof(fp))
if(fread(&comm[m],LEN,1,fp)==1)
{
m++;
}
fclose(fp);
//根据记录条数做出相应的选择,没记录则返回,有记录则排序
if(m==0)
{
printf("没有记录!
\n”);
return;
}
else
{
//冒泡排序
for(i=0;i{
for(j=i+1;j〈m;j++)
{
if(comm[i]。
total〈comm[j]。
total)
{
t=comm[i];
comm[i]=comm[j];
comm[j]=t;
}
}
}
//以写的方式打开文件
if((fp=fopen(”data。
txt”,"w”))==NULL)
{
printf(”不能打开\n");
return;
}
//将重新排好序的内容重新写入指定的磁盘文件中,并关闭文件
for(i=0;i〈m;i++)
{
if(fwrite(&comm[i],LEN,1,fp)!
=1)
{
printf(”%s不能保存!
\n”);
getch();
return;
}
}
fclose(fp);
printf("保存成功\n”);
}
}
//查找记录模块
//本模块的流程是先打开文件并读取里面的数据到商品结构体数组缓冲区中
//用户输入编号与商品结构体中缓冲区的数据进行比较,如果有则显示,没有则输出提示信息
voidsearch()
{
FILE*fp;
intnum,i,m=0;
charch[2];
//以追加和写的方式打开文件
if((fp=fopen(”data.txt","a+”))==NULL)
{
printf(”不能打开文件!
\n”);
return;
}
//把文件中的数据依次读入到结构体中,并关闭文件
while(!
feof(fp))
{
if(fread(&comm[m],LEN,1,fp)==1)
m++;
}
fclose(fp);
//如果没有记录,则返回,否则执行显示操作
if(m==0)
{
printf("没有记录!
\n");
return;
}
else
{//用户输入编号
printf(”请输入编号:
");
scanf(”%d”,&num);
//用循环语句来比较用户输入的编号是否存在
for(i=0;i{
if(num==comm[i]。
num)
{
printf(”已经找到该记录,是否显示?
(y/n)");
scanf(”%s”,ch);
if(strcmp(ch,”y")==0||strcmp(ch,"Y”)==0)
{
printf("编号商品名称单价数量总金额\t\n");
printf(FORMAT,DATA);
break;
}
else
return;
}
}
//如果上面的循环语句执行完都没有找到,则会执行本判断语句
if(i==m)
printf(”没有找到相关记录!
\n”);
}
}
//删除商品模块
//本模块的流程为先打开文件,并把数据写到商品结构体数组缓冲区中去
//用户输入相关编号与结构体数组中的数据相比较,如果存在则把结构体数组缓冲区进行修改
//把修改后的结构体数组缓冲区再次写入文件
voiddel()
{
FILE*fp;
intnum,i,j,m=0;
charch[2];
//以追加和读的方式打开文件
if((fp=fopen("data。
txt”,”a+”))==NULL)
{
printf(”不能打开文件\n”);
return;
}
//把文件中的内容依次写到商品结构体数组中,并记录信息条数,最后关闭文件
while(!
feof(fp))
{
if(fread(&comm[m],LEN,1,fp)==1)
m++;
}
fclose(fp);
//根据商品信息条数进行相应的处理
if(m==0)
{
printf(”没有记录!
\n”);
return;
}
else
{
//用户输入编号
printf(”请输入编号:
");
scanf("%d”,&num);
//用循环语句来比较是否有用户输入的记录
for(i=0;i{
if(num==comm[i]。
num)
break;
}
//没找到用户需要的记录则返回
if(i==m)
{
printf("没有找到相关记录”);
getchar();
return;
}
//找到用户需要的记录,要求用户输入选择
printf(”该记录已经找到,是否删除?
(y/n)");
scanf(”%s",ch);
if(strcmp(ch,”y”)==0||strcmp(”ch”,"Y”)==0)
{
for(j=i;jcomm[j]=comm[j+1];
m——;/*记录条数减一个*/
printf(”成功删除!
\n”);
}
//以写的方式打开文件
if((fp=fopen(”data.txt",”w”))==NULL)
{
printf("不能打开\n”);
return;
}
//把商品结构体数组中的数据依次写入文件
for(j=0;j〈m;j++)
{
if(fwrite(&comm[j],LEN,1,fp)!
=1)
{
printf("保存出错!
\n”);
return;
}
}
printf(”保存成功!
\n");
fclose(fp);
}
}
//修改商品模块
//本模块流程为先打开文件读商品结构体数组缓冲区中
//用户输入数据与缓冲区得数据进行比较
//有则先显示,并修该对应的缓冲区
//把修改后的缓冲区写入到文件
voidmodify()
{
FILE*fp;
inti,j,m=0,num;
charch[2];
//以追加和读的方式打开文件
if((fp=fopen("data。
txt",”a+”))==NULL)
{
printf(”不能打开文件!
\n");
return;
}
//把文件中的信息写入到商品结构体数组中,并统计记录条数,然后关闭文件
while(!
feof(fp))
{
if(fread(&comm[m],LEN,1,fp)==1)
m++;
}
fclose(fp);
//根据记录条数做出相应的选择
if(m==0)
{
printf("没有记录!
\n");
return;
}
else
{//用户输入编号
printf(”请输入编号:
");
scanf(”%d”,&num);
//用循环语句来比较是否有用户输入的记录
for(i=0;i〈m;i++)
{
if(num==comm[i].num)
break;
}
//没有找到用户输入的记录,返回
if(i==m)
{
printf("没有找到相关记录”);
getchar();
return;
}
//先显示本条记录
printf("编号商品名称单价数量总金额\t\n”);
printf(FORMAT,DATA);
//用户输入选择
printf("是否修改?
(y/n)");
scanf(”%s",ch);
if(strcmp(ch,"y”)==0||strcmp(ch,"Y")==0)
{
printf(”商品名:
\n");
scanf(”%s",comm[i].name);
printf(”单价:
\n");
scanf(”%lf”,&comm[i]。
price);
printf(”数量:
\n");
scanf("%lf",&comm[i].count);
comm[i].total=comm[i].price*comm[i].count;
//以写的方式打开文件
if((fp=fopen("data。
txt”,”w”))==NULL)
{
printf(”不能打开文件!
\n");
return;
}
for(j=0;j〈m;j++)
{
if(fwrite(&comm[j],LEN,1,fp)!
=1)
{
printf("不能保存!
\n”);
fclose(fp);
return;
}
}
printf(”保存成功!
\n”);
fclose(fp);
}
printf("ok”);
}
}
//软件的一些信息
voidversion()
{
printf(”version1.0\n");
printf("thewriterisxxx\n");
printf(”在艰苦的环境中编写的程序2012。
11。
4—5\n");
return;
}
//插入模块
//基本流程为先打开一个文件,把数据写入缓冲区
//在哪个编号后面插入,如果有此编号则插入,反之退出
//在插入之前先把这个空间空出来,再输入插入的编号,如果有重复则退出,否则为这个空间赋值
//把新的缓冲区写到文件中
voidinsert()
{
FILE*fp;
inti,j,k,m=0,num;
//以追加和读的方式打开一个文件
if((fp=fopen("data。
txt”,"a+”))==NULL)
{
printf("不能打开文件\n”);
return;
}
//把文件中的内容依次写入缓冲区,统计记录条数,并关闭文件
while(!
feof(fp))
{
if(fread(&comm[m],LEN,1,fp)==1)
m++;
}
fclose(fp);
//根据记录条数做出相应选择
if(m==0)
{
printf(”没有记录\n”);
return;
}
else
{
printf(”请在某条记录后插入:
\n”);
scanf(”%d",&num);
for(i=0;i{
if(num==comm[i].num)
break;
}
if(i==m)
{
printf(”没有此条记录”);
return;
}
for(j=m—1;j>i;j—-)
comm[j+1]=comm[j];/*从最后一个位置依次往后挪动,为要插入的地方腾出一块空间*/
//对这个空间赋值
printf(”现在输入插入的信息!
\n");
printf("请输入编号:
\n");/*编号*/
scanf("%d",&comm[i+1]。
num);/*往此空间输入信息*/
for(k=0;k<=m;k++)/*判断是否输入重复的记录*/