/*
西南石油大学计算机科学学院
课程:程序设计综合实践
教师:周永 梁宗文
编程者:张悦颖 张若曦
编程日期:2017.7.8
程序功能:商品信息管理系统*/
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<windows.h>
#define LEN sizeof(struct commdity)
#define FORMAT "%-8d%-15s%-12.1lf%-12.1lf%-12.1lf\n"
#define DATA comm[i].num,comm[i].name,comm[i].price,comm[i].count,comm[i].total
//定义商品信息结构体
struct commdity
{
int num;/*编号*/
char name[15];/*商品名称*/
double price;/*单价*/
double count;/*数量*/
double total;/*总金额*/
};
struct commdity comm[50];/*定义结构体数组*/
void in();/*录入商品信息*/
void show();/*显示商品信息*/
void order();/*按总金额排序*/
void del();/*删除商品信息*/
void modify();/*修改商品息*/
void menu();/*主菜单*/
void insert();/*插入商品信息*/
void total();/*计算总商品数*/
void search();/*查找商品信息*/
void printLogo();
void exportToHtmlFile();
//主函数
void main()
{
int n;
printLogo();
menu();
scanf("%d",&n);
//输入选择功能的编号
while(n)
{
switch(n)
{
case 1:
in(); /*调用录入商品信息过程*/
break;
case 2:
search(); /*查找商品信息过程*/
break;
case 3:
del(); /*调用删除商品信息的过程*/
break;
case 4:
modify(); /*调用修改商品信息的过程*/
break;
case 5:
insert(); /*调用插入数据的过程*/
break;
case 6:
order(); /*调用排序过程*/
break;
case 7:
total(); /*计算总数*/
break;
case 8:
exportToHtmlFile();
break;
default:break;
}
getch();
menu();
//执行完功能再次显示菜单界面
scanf("%d",&n);
}
}
//录入商品信息
void in()
{
int i,m=0;/*m是记录的条数*/
char ch[2];
FILE *fp;
//定义文件指针
if((fp=fopen("data","ab+"))==NULL)
//打开指定文件
{
printf("不能打开文件!\n");
return;
}
while(!feof(fp))
{
if(fread(&comm[m] ,LEN,1,fp)==1)
m++;
//统计当前记录条数
}
fclose(fp);
if(m==0)
printf("没有找到!\n");
else
{
system("cls");
show();/*调用show函数,显示原有信息*/
}
if((fp=fopen("data","wb"))==NULL)
{
printf("不能打开文件!\n");
return;
}
for(i=0;i<m;i++)
fwrite(&comm[i] ,LEN,1,fp);
//向指定的磁盘文件写入信息
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");
}
//显示商品信息
void show()
{
FILE *fp;
int i,m=0;
fp=fopen("data","ab+");
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);
//将信息按指定格式打印
}
}
//自定义函数实现菜单功能
void menu()
{
system("cls");
printf("\n\n\n\n\n");
printf("\t\t|-------------------商品管理系统-----------------|\n");
printf("\t\t|\t 0. 退出 |\n");
printf("\t\t|\t 1. 录入记录 |\n");
printf("\t\t|\t 2. 查找记录 |\n");
printf("\t\t|\t 3. 删除记录 |\n");
printf("\t\t|\t 4. 修改记录 |\n");
printf("\t\t|\t 5. 插入记录 |\n");
printf("\t\t|\t 6. 排序记录 |\n");
printf("\t\t|\t 7. 统计记录 |\n");
printf("\t\t|\t 8. 网页保存数据 |\n");
printf("\t\t|------------------------------------------------|\n\n");
printf("\t\t\t选择(0-8):");
}
//自定义排序函数
void order()
{
FILE *fp;
struct commdity t;
int i=0,j=0,m=0;
if((fp=fopen("data","ab+"))==NULL)
{
printf("不能打开文件!\n");
return;
}
while(!feof(fp))
if(fread(&comm[m] ,LEN,1,fp)==1)
m++;
fclose(fp);
if(m==0)
{
printf("没有记录!\n");
return;
}
for(i=0;i<m-1;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","wb"))==NULL)
{
printf("不能打开\n");
return;
}
for(i=0;i<m;i++)/*将重新排好序的内容重新写入指定的磁盘文件中*/
if(fwrite(&comm[i] ,LEN,1,fp)!=1)
{
printf("%s 不能保存!\n");
getch();
}
fclose(fp);
printf("保存成功\n");
}
//自定义删除函数
void del()
{
FILE *fp;
int snum,i,j,m=0;
char ch[2];
if((fp=fopen("data","ab+"))==NULL)
{
printf("不能打开文件\n");
return;
}
while(!feof(fp))
if(fread(&comm[m],LEN,1,fp)==1)
m++;
fclose(fp);
if(m==0)
{
printf("没有记录!\n");
return;
}
printf("请输入编号:");
scanf("%d",&snum);
for(i=0;i<m;i++)
if(snum==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;j<m;j++)
comm[j] = comm[j+1];/*将后一个记录移到前一个记录的位置*/
m--;/*记录的总个数减1*/
printf("成功删除!\n");
}
if((fp=fopen("data","wb"))==NULL)
{
printf("不能打开!\n");
return;
}
for(j=0;j<m;j++)/*将更改后的记录重新写入指定的磁盘文件中*/
if(fwrite(&comm[j] ,LEN,1,fp)!=1)
{
printf("不能保存!\n");
getch();
}
fclose(fp);
}
//自定义查找函数
void search()
{
FILE *fp;
int snum,i,m=0;
char ch[2];
if((fp=fopen("data","ab+"))==NULL)
{
printf("不能打开文件\n");
return;
}
while(!feof(fp))
if(fread(&comm[m],LEN,1,fp)==1)
m++;
fclose(fp);
if(m==0)
{
printf("没有记录!\n");
return;
}
printf("请输入编号:");
scanf("%d",&snum);
for(i=0;i<m;i++)
if(snum == 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");/*未找到要查找的信息*/
}
//自定义修改函数
void modify()
{
FILE *fp;
int i,j,m=0,snum;
char ch[2];
if((fp=fopen("data","ab+"))==NULL)
{
printf("不能打开文件!\n");
return;
}
while(!feof(fp))
if(fread(&comm[m],LEN,1,fp)==1)
m++;
if(m==0)
{
printf("没有记录!\n");
fclose(fp);
return;
}
printf("请输入要修改的记录信息的编号!\n");
scanf("%d",&snum);
for(i=0;i<m;i++)
if(snum==comm[i].num)
//检索记录中是否有要修改的信息
break;
if(i<m)
{
printf("已经找到该记录,是否修改?(y/n)\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;
printf("保存成功!");
}
else
return;
}
else
{
printf("没有找到!");
getchar();
return;
}
if((fp=fopen("data","wb"))==NULL)
{
printf("不能打开文件!\n");
return;
}
for(j=0;j<m;j++)
if(fwrite(&comm[j] ,LEN,1,fp)!=1)
{
printf("不能保存!");
getch();
}
//将新修改的信息写入指定的磁盘文件中
fclose(fp);
}
//自定义插入函数
void insert()
{
FILE *fp;
int i,j,k,m=0,snum;
if((fp=fopen("data","ab+"))==NULL)
{
printf("不能打开文件!\n");
return;
}
while(!feof(fp))
if(fread(&comm[m],LEN,1,fp)==1)
m++;
if(m==0)
{
printf("没有记录!\n");
fclose(fp);
return;
}
printf("请输入要插入的位置\n");
scanf("%d",&snum);/*输入要插入的位置*/
for(i=0;i<m;i++)
if(snum == comm[i].num)
break;
for(j=m-1;j>i;j--)
comm[j+1] = comm[j];
//从最后一条记录开始均向后移一位
printf("现在输入新的信息.\n");
printf("编号:");
scanf("%d",&comm[i+1].num);
for(k=0;k<m;k++)
if(comm[k].num==comm[i+1].num && k!=i+1)
{
printf("已经存在该编号,按任意键继续!");
getch();
fclose(fp);
return;
}
printf("商品名:");
scanf("%s",comm[i+1].name);
printf("单价:");
scanf("%lf",&comm[i+1].price);
printf("数量:");
scanf("%lf",&comm[i+1].count);
comm[i+1].total = comm[i+1].price * comm[i+1].count;
if((fp=fopen("data","wb"))==NULL)
{
printf("不能打开文件\n");
return;
}
for(k=0;k<=m;k++)
if(fwrite(&comm[k] ,LEN,1,fp)!=1)/*将修改后的记录写入磁盘文件中*/
{
printf("不能保存!");
getch();
}
fclose(fp);
}
//统计
void total()
{
FILE *fp;
int m=0;
if((fp=fopen("data","ab+"))==NULL)
{
printf("不能打开记录!\n");
return;
}
while(!feof(fp))
if(fread(&comm[m],LEN,1,fp)==1)
m++;/*统计记录个数即记录个数*/
if(m==0)
{
printf("没有记录!\n");
fclose(fp);
return;
}
printf("一共有 %d 条记录!\n",m);/*将统计的个数输出*/
fclose(fp);
}
//打印网页
void exportToHtmlFile()
{
FILE *fh;
FILE *fp;
int iCounter=0,i; //建议最好内存中,有一个变量,一直维护二进制文件中的记录数。免得每次统计。
//读取数据
fp=fopen("data","ab+"); //打开数据文件
while(!feof(fp))
{
if(fread(&comm[iCounter] ,LEN,1,fp)==1)
iCounter++;
}
fclose(fp);//关闭数据文件
if(iCounter == 0)
{
printf("还没有可以导出的数据!");
return;
}
fh=fopen("export.html", "w"); //以写的方式打开html文件
if (fh==NULL)
{
printf("导出文件失败。请将当前可执行程序拷贝到具有写权限的磁盘位置。\n");
return;
}
//第一步,写入网页的开头部分
fprintf(fh,"<!--版权所有 201631064204张若曦 201631064206张悦颖 -->\n");
fprintf(fh,"<html>\n");
fprintf(fh,"<head><title>商品信息管理</title></head>\n"); //浏览器标题栏显示的文字
fprintf(fh,"<body>\n");
fprintf(fh,"<center><h2>商品信息管理</h2><hr></center>\n"); //网页正文中的标题文字
fprintf(fh,"<div align=center>\n");
fprintf(fh,"<table border=1 width=80%%>\n"); //特备注意:网页代码中的%,在fprintf的双引号之内,要变成%%
//第二步,写入表格的表头部分。要写入的信息,在双引号中。
fprintf(fh,"<tr>\n");
fprintf(fh,"\t<td width=25%%><b>编号</b></td>\n");
fprintf(fh,"\t<td width=30%%><b>名称</b></td>\n");
fprintf(fh,"\t<td width=15%%><b>单价</b></td>\n");
fprintf(fh,"\t<td width=15%%><b>数量</b></td>\n");
fprintf(fh,"\t<td width=15%%><b>总金额</b></td>\n");
fprintf(fh,"</tr>\n");
//第三步,通过循环,写入表格的数据部分。
for(i=0;i<iCounter;i++)
{
fprintf(fh,"<tr>\n");
fprintf(fh,"\t<td width=25%%>%-8d</td>\n", comm[i].num);
fprintf(fh,"\t<td width=30%%>%-15s</td>\n", comm[i].name);
fprintf(fh,"\t<td width=15%%>%-12.1lf</td>\n", comm[i].price);
fprintf(fh,"\t<td width=15%%>%-12.1lf</td>\n", comm[i].count);
fprintf(fh,"\t<td width=15%%>%-12.1lf</td>\n", comm[i].total);
fprintf(fh,"</tr>\n");
}
//第四步,写入网页的结束部分。
fprintf(fh,"</table>\n");
fprintf(fh,"</div>\n");
fprintf(fh," <center><h5>201631064204张若曦 201631064206张悦颖 于201707《程序设计综合实践》实现的网页导出功能</h5><center>\n");
fprintf(fh,"</body></html>\n");
//关闭文件
fclose(fh);
//打印成功消息
printf("成功导出%d数据到当前目录下的export.html文件中\n", iCounter);
printf("\a"); //用蜂鸣声提醒
}
//编程者
void printLogo()
{
system("color FB");
printf(" . ☆∵ ∴∵ ∴∵∴ ∵╭ ∵╭ ∴╭ ☆╭ ∴ ★∵∴\n");
printf(" . . ∵ ∴★. ∴∵∴ ╭ ╯ ╭ ╯ ╭ ╯ ╭ ╯ ∴∵∴∵∴\n");
printf(" . ☆. ☆∴∵. ∴∵∴▍▍ ▍▍ ▍▍ ▍▍ ☆ ★∵∴\n");
printf(" ▍. ∴∵∴∵. ∴▄███████████☆ ★ ∵\n");
printf(" ◥█▆▆▆▆███▆█▆█▆█▆█▆█▆███◤\n");
printf(" ◥████████☆ C P P ☆█████◤\n");
printf(" .. .. ◥█████████████████◤\n");
printf("\n");
printf(" ╭───────────────────────────────╮\n");
printf(" │ ╔═╦═╗╔═╦═╗╔═╦═╗╔═╦═╗╔═╦═╗╔═╦═╗ │\n");
printf(" │ ║ ║║ ║║ ║║ ║║ ║ ║║ ║ │\n");
printf(" │ ╠ 商 ╣╠ 品 ╣╠ 管 ╣╠ 理 ╣╠ 系 ╣╠ 统 ╣ │\n");
printf(" │ ║ ║║ ║║ ║║ ║║ ║║ ║ │\n");
printf(" │ ╚═╩═╝╚═╩═╝╚═╩═╝╚═╩═╝╚═╩═╝╚═╩═╝ │\n");
printf(" └───-◎◎─────────────◎◎───────────┘\n");
printf("\n");
printf(" ████████████████████████ \n");
printf(" * * \n");
printf(" * ┏╮╱╱ 作者: * \n");
printf(" * ╰★╮ * \n");
printf(" * ╱╱╰┛ 张若曦 * \n");
printf(" * * \n");
printf(" * 张悦颖 * \n");
printf(" * * \n");
printf(" * 西南石油大学 * \n");
printf(" * * \n");
printf(" * 计算机科学学院 * \n");
printf(" * * \n");
printf(" * 物联网工程 * \n");
printf(" * * \n");
printf(" * ☆╭~~~╮(o^.^o)☆ * \n");
printf(" * * \n");
printf(" ████████████████████████ \n");
Sleep(3000);
system("cls");
}