|
发表于 2017-7-13 11:36:46
|
显示全部楼层
本帖最后由 ba21 于 2017-7-13 11:58 编辑
- /*
- 西南石油大学计算机科学学院
- 课程:程序设计综合实践
- 教师:周永 梁宗文
- 编程者:张悦颖 张若曦
- 编程日期: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");
- }
复制代码 |
|