结构体:C 版本
#include <stdio.h>
#include <windows.h>
//定义 图书 结构体
struct Book {
char name[15] ; // 名称
char numb[18] ; // 序列号
char publish[18] ; // 出版社
char author[12] ; // 作者
double price ; // 价格
int amount ; // 库存
};
//定义全局 图书 数组
struct Book bookList [100];
//定义全局 图书 数组栈指针
int bookCount = 0;
//定义 销售记录 结构体
struct Record {
char book[15] ; // 图书
int amount ; // 数量
double price ; // 价格
};
//定义全局 销售记录 数组
struct Record recordList [100];
//定义全局 销售记录 数组栈指针
int recordCount = 0;
//图书 读入文件
void readBook ();
//图书 写入文件
void writeBook ();
//图书 添加记录
void addBook ();
//图书 删除记录
void delBook ();
//图书 根据下标删除
int delBookByIndex (int index);
//图书 修改记录
void modBook ();
//图书 查找记录
void findBook (int all);
//图书 排序
void sortBook ();
//交换
void exchangeBook (int i ,int j);
//存在判断函数
int getOneBook (const char *name,char *s);
//销售记录 读入文件
void readRecord ();
//销售记录 写入文件
void writeRecord ();
//销售记录 添加记录
void addRecord ();
//销售记录 删除记录
void delRecord ();
//销售记录 根据下标删除
int delRecordByIndex (int index);
//销售记录 修改记录
void modRecord ();
//销售记录 查找记录
void findRecord (int all);
//销售记录 排序
void sortRecord ();
//交换
void exchangeRecord (int i ,int j);
//存在判断函数
//菜单
void menu();
// 主函数
int main(){
//读取数据
readBook ();//读取图书
readRecord ();//读取销售记录
while(1){
int choice;
menu ();
scanf("%d",&choice);
switch(choice){
case 1 :
addBook ();//添加图书
break;
case 2 :
findBook (1);//查找图书
delBook ();//删除图书
break;
case 3 :
findBook (1);//查找图书
modBook ();//修改图书
break;
case 4 :
findBook (0);//查找图书
break;
case 5 :
sortBook ();//排序图书
break;
case 6 :
addRecord ();//添加销售记录
break;
case 7 :
findRecord (1);//查找销售记录
delRecord ();//删除销售记录
break;
case 8 :
findRecord (1);//查找销售记录
modRecord ();//修改销售记录
break;
case 9 :
findRecord (0);//查找销售记录
break;
case 10 :
sortRecord ();//排序销售记录
break;
case 0:
printf("\n\n\n\t\t\t感谢使用\n\n\n"); exit(0);
default :
getchar();
printf("\n\n\n\t提示:没有这个选项!请重新输入!\n\n\n\n"); system("pause");
break;
}
}
return 0;
}
//图书 是否存在判断
int getOneBook (const char *name,char *s){
int res = -1,i;
for( i = 0;i < bookCount ;i++){
if( strcmp(name,"name")==0 && strcmp(s, bookList [i]. name )==0){
res = i;
break;
}
if( strcmp(name,"numb")==0 && strcmp(s, bookList [i]. numb )==0){
res = i;
break;
}
}
return res;
}
//图书 读入文件
void readBook (){
FILE *fp = NULL;
if (NULL == (fp = fopen("Book.txt", "r")))//读打开
{
return;
}
int i=0;
//从文件读取数据
while (fscanf(fp, "%s%s%s%s%lf%d"
,bookList[i].name ,bookList[i].numb ,bookList[i].publish ,bookList[i].author ,&bookList[i].price ,&bookList[i].amount
) != EOF)//读取
{
i++;
}
//记录总数
bookCount = i;
fclose(fp);
}
//图书 写入文件
void writeBook (){
FILE *fp = NULL;
int i;
fp = fopen("Book.txt", "w+");
for( i = 0;i< bookCount ;i++){
fprintf(fp,"%s %s %s %s %lf %d\n"
,bookList[i].name ,bookList[i].numb ,bookList[i].publish ,bookList[i].author ,bookList[i].price ,bookList[i].amount );
}
fclose(fp);
}
//图书 添加记录
void addBook (){
char selectYNFlag = 'y';
while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
printf("\n"); printf("请输入名称 :"); char name[15]; scanf("%s",name);
strcpy(bookList [ bookCount ] . name,name);
//检索Book 不重复
int getOneBookname = getOneBook ("name",bookList [ bookCount ] . name);
if( getOneBookname >=0){//检索不为空
printf("名称已存在!\n"); break;
}
printf("请输入序列号 :"); char numb[18]; scanf("%s",numb);
strcpy(bookList [ bookCount ] . numb,numb);
//检索Book 不重复
int getOneBooknumb = getOneBook ("numb",bookList [ bookCount ] . numb);
if( getOneBooknumb >=0){//检索不为空
printf("序列号已存在!\n"); break;
}
printf("请输入出版社 :"); char publish[18]; scanf("%s",publish);
strcpy(bookList [ bookCount ] . publish,publish);
printf("请输入作者 :"); char author[12]; scanf("%s",author);
strcpy(bookList [ bookCount ] . author,author);
printf("请输入价格 :"); double price; scanf("%lf",&price);
bookList [ bookCount ] . price = price ;
printf("请输入库存 :"); int amount; scanf("%d",&amount);
bookList [ bookCount ] . amount = amount ;
//bookCount 是全局变量
bookCount ++;
printf("\n是否继续录入?(y/n)"); getchar();
scanf("%c",&selectYNFlag);
}
writeBook ( );
printf("\n*****************************\n"); printf("录入完成\n"); printf("*****************************\n"); }
//图书 删除
void delBook (){
printf("请输入您要删除的 图书 序号(输入-1退出):"); int index;
scanf("%d",&index);
if(index >= 0){
int res = delBookByIndex (index);
if(res){
printf("删除成功!\n\n"); writeBook ();
}else{
printf("删除失败!\n\n"); }
}
}
//图书 根据下标删除
int delBookByIndex (int index){
if(index >= bookCount || index < 0){
return 0;
}
//开始删除!
int i;
for(i = index; i < bookCount - 1 ; i++){
//元素全部往前移一位。
bookList [i] = bookList [i+1];
}
//最后令栈的长度减一
bookCount = bookCount - 1;
return 1;
}
//图书 修改
void modBook (){
printf("请输入您要修改的图书 序号(输入-1退出):"); int indexOfMod = -1;
scanf("%d",&indexOfMod);
if(indexOfMod >= 0 && indexOfMod < bookCount ){
//开始修改
printf("请输入名称 :"); char name[15];
scanf("%s",name);
if(strcmp(bookList [indexOfMod] . name,name) != 0 && getOneBook ("name",name)>=0){//检索不为空
printf("名称 已存在!\n"); return;
}
printf("请输入出版社 :"); char publish[18];
scanf("%s",publish);
printf("请输入作者 :"); char author[12];
scanf("%s",author);
printf("请输入价格 :"); double price;
scanf("%lf",&price);
printf("请输入库存 :"); int amount;
scanf("%d",&amount);
//输入完毕,赋值
strcpy(bookList [ indexOfMod ] . name,name);
strcpy(bookList [ indexOfMod ] . publish,publish);
strcpy(bookList [ indexOfMod ] . author,author);
bookList [ indexOfMod ] . price = price ;
bookList [ indexOfMod ] . amount = amount ;
printf("修改成功!\n"); writeBook ();
}else{
printf("输入错误!\n"); }
}
//图书 查找 如果all=1:查询全部 否则按条件查询
void findBook (int all){
int select = 0;
char conCharArr[40];
double conNum1,conNum2;
while(1){
printf("\n%-5s%-15s%-18s%-18s%-12s%-12s%-10s\n\n","序号" ,"名称","序列号","出版社","作者","价格","库存" );
if( bookList ){
//用于统计信息所用
int count = 0,i;
double priceSum=0;
int amountSum=0;
for (i = 0;i < bookCount ; i++)
{
if(select == 0
|| select == 1 && strstr(bookList [i]. name,conCharArr) //根据名称,模糊查询
|| select == 2 && strstr(bookList [i]. numb,conCharArr) //根据序列号,模糊查询
|| select == 3 && strstr(bookList [i]. author,conCharArr) //根据作者,模糊查询
){
printf("%-5d%-15s%-18s%-18s%-12s%-12lf%-10d \n\n",i
,bookList [i] . name
,bookList [i] . numb
,bookList [i] . publish
,bookList [i] . author
,bookList [i] . price
,bookList [i] . amount
);
//用于统计信息所用
priceSum += bookList [i].price;
amountSum += bookList [i].amount;
count++;
}else{
delBookByIndex(i--);//删掉
}
}
printf("共%d条结果\n",count); printf("-----------------------------------------------------------------------------------------------------\n"); printf("【价格】平均:%.2lf\n" ,count!=0?priceSum * 1.0 / count :0);
printf("【库存】总计:%d 平均:%.2lf\n",amountSum ,count!=0?amountSum * 1.0 / count :0);
printf("\n"); }else{
printf("\n【无记录!】\n\n"); }
//如果参数all为1,则表示列出所有就退出
if(all == 1)break;
//进入过滤。
printf("【筛选器:你可以在以上结果的基础上,进行以下条件筛选】\n"); printf("0:退出\n"); printf("1:按 名称 筛选\n"); printf("2:按 序列号 筛选\n"); printf("3:按 作者 筛选\n"); printf("请输入选择:"); scanf("%d",&select);
if(select>0){
if(0 ||select==1 ||select==2 ||select==3 ){
printf("请输入筛选条件:"); scanf("%s",conCharArr);
}else if(0 ){
printf("请输入筛选范围m,n,用空格隔开(m ≤X ≤n):"); scanf("%lf",&conNum1);
scanf("%lf",&conNum2);
}
}else{
break;
}
}
readBook();//从新读取数据。
}
//图书 排序
void sortBook (){
int select,i,j;
printf("1:按 名称 排序\n"); printf("2:按 序列号 排序\n"); printf("3:按 出版社 排序\n"); printf("4:按 作者 排序\n"); printf("5:按 价格 排序\n"); printf("6:按 库存 排序\n"); printf("请输入选择:"); scanf("%d",&select);
for( i = bookCount -1;i>0;i--){
for( j = 0;j < i;j++){
if( 0
|| select == 1 && strcmp(bookList [j]. name , bookList [j+1]. name)>0
|| select == 2 && strcmp(bookList [j]. numb , bookList [j+1]. numb)>0
|| select == 3 && strcmp(bookList [j]. publish , bookList [j+1]. publish)>0
|| select == 4 && strcmp(bookList [j]. author , bookList [j+1]. author)>0
|| select == 5 && bookList [j]. price - bookList [j+1]. price > 0
|| select == 6 && bookList [j]. amount - bookList [j+1]. amount > 0
){
exchangeBook (j,j+1);
}
}
}
findBook (1);
writeBook ();
}
//图书 交换
void exchangeBook (int i,int j){
struct Book book = bookList [i];
bookList [i] = bookList [j];
bookList [j] = book ;
}
//销售记录 读入文件
void readRecord (){
FILE *fp = NULL;
if (NULL == (fp = fopen("Record.txt", "r")))//读打开
{
return;
}
int i=0;
//从文件读取数据
while (fscanf(fp, "%s%d%lf"
,recordList[i].book ,&recordList[i].amount ,&recordList[i].price
) != EOF)//读取
{
i++;
}
//记录总数
recordCount = i;
fclose(fp);
}
//销售记录 写入文件
void writeRecord (){
FILE *fp = NULL;
int i;
fp = fopen("Record.txt", "w+");
for( i = 0;i< recordCount ;i++){
fprintf(fp,"%s %d %lf\n"
,recordList[i].book ,recordList[i].amount ,recordList[i].price );
}
fclose(fp);
}
//销售记录 添加记录
void addRecord (){
char selectYNFlag = 'y';
while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
printf("\n"); printf("请输入图书 :"); char book[15]; scanf("%s",book);
strcpy(recordList [ recordCount ] . book,book);
//检索Record 是否存在
int getOneBookFrn =getOneBook ("name",recordList [ recordCount ] . book);
if(getOneBookFrn ==-1){//检索不为空
printf("图书不存在!\n"); break;
}
printf("请输入数量 :"); int amount; scanf("%d",&amount);
recordList [ recordCount ] . amount = amount ;
printf("请输入价格 :"); double price; scanf("%lf",&price);
recordList [ recordCount ] . price = price ;
//recordCount 是全局变量
recordCount ++;
printf("\n是否继续录入?(y/n)"); getchar();
scanf("%c",&selectYNFlag);
}
writeRecord ( );
printf("\n*****************************\n"); printf("录入完成\n"); printf("*****************************\n"); }
//销售记录 删除
void delRecord (){
printf("请输入您要删除的 销售记录 序号(输入-1退出):"); int index;
scanf("%d",&index);
if(index >= 0){
int res = delRecordByIndex (index);
if(res){
printf("删除成功!\n\n"); writeRecord ();
}else{
printf("删除失败!\n\n"); }
}
}
//销售记录 根据下标删除
int delRecordByIndex (int index){
if(index >= recordCount || index < 0){
return 0;
}
//开始删除!
int i;
for(i = index; i < recordCount - 1 ; i++){
//元素全部往前移一位。
recordList [i] = recordList [i+1];
}
//最后令栈的长度减一
recordCount = recordCount - 1;
return 1;
}
//销售记录 修改
void modRecord (){
printf("请输入您要修改的销售记录 序号(输入-1退出):"); int indexOfMod = -1;
scanf("%d",&indexOfMod);
if(indexOfMod >= 0 && indexOfMod < recordCount ){
//开始修改
printf("请输入图书 :"); char book[15];
scanf("%s",book);
if(getOneBook ("name",book)==-1){//检索不为空
printf("图书 不存在!\n"); return;
}
printf("请输入数量 :"); int amount;
scanf("%d",&amount);
printf("请输入价格 :"); double price;
scanf("%lf",&price);
//输入完毕,赋值
strcpy(recordList [ indexOfMod ] . book,book);
recordList [ indexOfMod ] . amount = amount ;
recordList [ indexOfMod ] . price = price ;
printf("修改成功!\n"); writeRecord ();
}else{
printf("输入错误!\n"); }
}
//销售记录 查找 如果all=1:查询全部 否则按条件查询
void findRecord (int all){
int select = 0;
char conCharArr[40];
double conNum1,conNum2;
while(1){
printf("\n%-5s%-15s%-10s%-12s\n\n","序号" ,"图书","数量","价格" );
if( recordList ){
//用于统计信息所用
int count = 0,i;
int amountSum=0;
double priceSum=0;
for (i = 0;i < recordCount ; i++)
{
if(select == 0
|| select == 1 && strstr(recordList [i]. book,conCharArr) //根据图书,模糊查询
){
printf("%-5d%-15s%-10d%-12lf \n\n",i
,recordList [i] . book
,recordList [i] . amount
,recordList [i] . price
);
//用于统计信息所用
amountSum += recordList [i].amount;
priceSum += recordList [i].price;
count++;
}else{
delRecordByIndex(i--);//删掉
}
}
printf("共%d条结果\n",count); printf("-----------------------------------------------------------------------------------------------------\n"); printf("【数量】总计:%d \n",amountSum );
printf("【价格】总计:%lf 平均:%.2lf\n",priceSum ,count!=0?priceSum * 1.0 / count :0);
printf("\n"); }else{
printf("\n【无记录!】\n\n"); }
//如果参数all为1,则表示列出所有就退出
if(all == 1)break;
//进入过滤。
printf("【筛选器:你可以在以上结果的基础上,进行以下条件筛选】\n"); printf("0:退出\n"); printf("1:按 图书 筛选\n"); printf("请输入选择:"); scanf("%d",&select);
if(select>0){
if(0 ||select==1 ){
printf("请输入筛选条件:"); scanf("%s",conCharArr);
}else if(0 ){
printf("请输入筛选范围m,n,用空格隔开(m ≤X ≤n):"); scanf("%lf",&conNum1);
scanf("%lf",&conNum2);
}
}else{
break;
}
}
readRecord();//从新读取数据。
}
//销售记录 排序
void sortRecord (){
int select,i,j;
printf("1:按 图书 排序\n"); printf("2:按 数量 排序\n"); printf("3:按 价格 排序\n"); printf("请输入选择:"); scanf("%d",&select);
for( i = recordCount -1;i>0;i--){
for( j = 0;j < i;j++){
if( 0
|| select == 1 && strcmp(recordList [j]. book , recordList [j+1]. book)>0
|| select == 2 && recordList [j]. amount - recordList [j+1]. amount > 0
|| select == 3 && recordList [j]. price - recordList [j+1]. price > 0
){
exchangeRecord (j,j+1);
}
}
}
findRecord (1);
writeRecord ();
}
//销售记录 交换
void exchangeRecord (int i,int j){
struct Record record = recordList [i];
recordList [i] = recordList [j];
recordList [j] = record ;
}
void menu (){
//菜单
printf("*------------------主菜单---------------------*\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("*-------------10 :排序销售记录\n"); printf("*-------------0:退出\n"); printf("*---------------------------------------------*\n"); printf("请输入选择:"); }
结构体:C++版本
#include <io.h>
#include <iostream>
#include <windows.h>
using namespace std;
//定义 图书 结构体
struct Book {
char name[15] ; // 名称
char numb[18] ; // 序列号
char publish[18] ; // 出版社
char author[12] ; // 作者
double price ; // 价格
int amount ; // 库存
};
//定义全局 图书 数组
struct Book bookList [100];
//定义全局 图书 数组栈指针
int bookCount = 0;
//定义 销售记录 结构体
struct Record {
char book[15] ; // 图书
int amount ; // 数量
double price ; // 价格
};
//定义全局 销售记录 数组
struct Record recordList [100];
//定义全局 销售记录 数组栈指针
int recordCount = 0;
//图书 读入文件
void readBook ();
//图书 写入文件
void writeBook ();
//图书 添加记录
void addBook ();
//图书 删除记录
void delBook ();
//图书 根据下标删除
int delBookByIndex (int index);
//图书 修改记录
void modBook ();
//图书 查找记录
void findBook (int all);
//图书 排序
void sortBook ();
//交换
void exchangeBook (int i ,int j);
//存在判断函数
int getOneBook (const char *name,char *s);
//销售记录 读入文件
void readRecord ();
//销售记录 写入文件
void writeRecord ();
//销售记录 添加记录
void addRecord ();
//销售记录 删除记录
void delRecord ();
//销售记录 根据下标删除
int delRecordByIndex (int index);
//销售记录 修改记录
void modRecord ();
//销售记录 查找记录
void findRecord (int all);
//销售记录 排序
void sortRecord ();
//交换
void exchangeRecord (int i ,int j);
//存在判断函数
//菜单
void menu();
// 主函数
int main(){
//读取数据
readBook ();//读取图书
readRecord ();//读取销售记录
while(1){
int choice;
menu ();
cin>>choice;
switch(choice){
case 1 :
addBook ();//添加图书
break;
case 2 :
findBook (1);//查找图书
delBook ();//删除图书
break;
case 3 :
findBook (1);//查找图书
modBook ();//修改图书
break;
case 4 :
findBook (0);//查找图书
break;
case 5 :
sortBook ();//排序图书
break;
case 6 :
addRecord ();//添加销售记录
break;
case 7 :
findRecord (1);//查找销售记录
delRecord ();//删除销售记录
break;
case 8 :
findRecord (1);//查找销售记录
modRecord ();//修改销售记录
break;
case 9 :
findRecord (0);//查找销售记录
break;
case 10 :
sortRecord ();//排序销售记录
break;
case 0:
cout<<"\n\n\n\t\t\t感谢使用\n\n\n";
exit(0);
default :
getchar();
cout<<"\n\n\n\t提示:没有这个选项!请重新输入!\n\n\n\n";
system("pause");
break;
}
}
return 0;
}
//图书 是否存在判断
int getOneBook (const char *name,char *s){
int res = -1,i;
for( i = 0;i < bookCount ;i++){
if( strcmp(name,"name")==0 && strcmp(s, bookList [i]. name )==0){
res = i;
break;
}
if( strcmp(name,"numb")==0 && strcmp(s, bookList [i]. numb )==0){
res = i;
break;
}
}
return res;
}
//图书 读入文件
void readBook (){
FILE *fp = NULL;
if (NULL == (fp = fopen("Book.txt", "r")))//读打开
{
return;
}
int i=0;
//从文件读取数据
while (fscanf(fp, "%s%s%s%s%lf%d"
,bookList[i].name ,bookList[i].numb ,bookList[i].publish ,bookList[i].author ,&bookList[i].price ,&bookList[i].amount
) != EOF)//读取
{
i++;
}
//记录总数
bookCount = i;
fclose(fp);
}
//图书 写入文件
void writeBook (){
FILE *fp = NULL;
int i;
fp = fopen("Book.txt", "w+");
for( i = 0;i< bookCount ;i++){
fprintf(fp,"%s %s %s %s %lf %d\n"
,bookList[i].name ,bookList[i].numb ,bookList[i].publish ,bookList[i].author ,bookList[i].price ,bookList[i].amount );
}
fclose(fp);
}
//图书 添加记录
void addBook (){
char selectYNFlag = 'y';
while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
cout<<"\n";
cout<<"请输入名称 :";
char name[15]; cin>>name;
strcpy(bookList [ bookCount ] . name,name);
//检索Book 不重复
int getOneBookname = getOneBook ("name",bookList [ bookCount ] . name);
if( getOneBookname >=0){//检索不为空
cout<<"名称已存在!\n";
break;
}
cout<<"请输入序列号 :";
char numb[18]; cin>>numb;
strcpy(bookList [ bookCount ] . numb,numb);
//检索Book 不重复
int getOneBooknumb = getOneBook ("numb",bookList [ bookCount ] . numb);
if( getOneBooknumb >=0){//检索不为空
cout<<"序列号已存在!\n";
break;
}
cout<<"请输入出版社 :";
char publish[18]; cin>>publish;
strcpy(bookList [ bookCount ] . publish,publish);
cout<<"请输入作者 :";
char author[12]; cin>>author;
strcpy(bookList [ bookCount ] . author,author);
cout<<"请输入价格 :";
double price; cin>>price;
bookList [ bookCount ] . price = price ;
cout<<"请输入库存 :";
int amount; cin>>amount;
bookList [ bookCount ] . amount = amount ;
//bookCount 是全局变量
bookCount ++;
cout<<"\n是否继续录入?(y/n)";
getchar();
cin>>selectYNFlag;
}
writeBook ( );
cout<<"\n*****************************\n";
cout<<"录入完成\n";
cout<<"*****************************\n";
}
//图书 删除
void delBook (){
cout<<"请输入您要删除的 图书 序号(输入-1退出):";
int index;
cin>>index;
if(index >= 0){
int res = delBookByIndex (index);
if(res){
cout<<"删除成功!\n\n";
writeBook ();
}else{
cout<<"删除失败!\n\n";
}
}
}
//图书 根据下标删除
int delBookByIndex (int index){
if(index >= bookCount || index < 0){
return 0;
}
//开始删除!
int i;
for(i = index; i < bookCount - 1 ; i++){
//元素全部往前移一位。
bookList [i] = bookList [i+1];
}
//最后令栈的长度减一
bookCount = bookCount - 1;
return 1;
}
//图书 修改
void modBook (){
cout<<"请输入您要修改的图书 序号(输入-1退出):";
int indexOfMod = -1;
cin>>indexOfMod;
if(indexOfMod >= 0 && indexOfMod < bookCount ){
//开始修改
cout<<"请输入名称 :";
char name[15];
cin>>name;
if(strcmp(bookList [indexOfMod] . name,name) != 0 && getOneBook ("name",name)>=0){//检索不为空
cout<<"名称 已存在!\n";
return;
}
cout<<"请输入出版社 :";
char publish[18];
cin>>publish;
cout<<"请输入作者 :";
char author[12];
cin>>author;
cout<<"请输入价格 :";
double price;
cin>>price;
cout<<"请输入库存 :";
int amount;
cin>>amount;
//输入完毕,赋值
strcpy(bookList [ indexOfMod ] . name,name);
strcpy(bookList [ indexOfMod ] . publish,publish);
strcpy(bookList [ indexOfMod ] . author,author);
bookList [ indexOfMod ] . price = price ;
bookList [ indexOfMod ] . amount = amount ;
cout<<"修改成功!\n";
writeBook ();
}else{
cout<<"输入错误!\n";
}
}
//图书 查找 如果all=1:查询全部 否则按条件查询
void findBook (int all){
int select = 0;
char conCharArr[40];
double conNum1,conNum2;
while(1){
printf("\n%-5s%-15s%-18s%-18s%-12s%-12s%-10s\n\n","序号" ,"名称","序列号","出版社","作者","价格","库存" );
if( bookList ){
//用于统计信息所用
int count = 0,i;
double priceSum=0;
int amountSum=0;
for (i = 0;i < bookCount ; i++)
{
if(select == 0
|| select == 1 && strstr(bookList [i]. name,conCharArr) //根据名称,模糊查询
|| select == 2 && strstr(bookList [i]. numb,conCharArr) //根据序列号,模糊查询
|| select == 3 && strstr(bookList [i]. author,conCharArr) //根据作者,模糊查询
){
printf("%-5d%-15s%-18s%-18s%-12s%-12lf%-10d \n\n",i
,bookList [i] . name
,bookList [i] . numb
,bookList [i] . publish
,bookList [i] . author
,bookList [i] . price
,bookList [i] . amount
);
//用于统计信息所用
priceSum += bookList [i].price;
amountSum += bookList [i].amount;
count++;
}else{
delBookByIndex(i--);//删掉
}
}
cout<<"共" << count <<"条结果\n";
cout<<"-----------------------------------------------------------------------------------------------------\n";
cout<<"【价格】" <<"平均:"<< (count!=0?priceSum*1.0/count:0)<<"\n";
cout<<"【库存】" << "总计:"<<amountSum<<" " <<"平均:"<< (count!=0?amountSum*1.0/count:0)<<"\n";
cout<<"\n";
}else{
cout<<"\n【无记录!】\n\n";
}
//如果参数all为1,则表示列出所有就退出
if(all == 1)break;
//进入过滤。
cout<<"【筛选器:你可以在以上结果的基础上,进行以下条件筛选】\n";
cout<<"0:退出\n";
cout<<"1:按 名称 筛选\n";
cout<<"2:按 序列号 筛选\n";
cout<<"3:按 作者 筛选\n";
cout<<"请输入选择:";
cin>>select;
if(select>0){
if(0 ||select==1 ||select==2 ||select==3 ){
cout<<"请输入筛选条件:";
cin>>conCharArr;
}else if(0 ){
cout<<"请输入筛选范围m,n,用空格隔开(m ≤X ≤n):";
cin>>conNum1;
cin>>conNum2;
}
}else{
break;
}
}
readBook();//从新读取数据。
}
//图书 排序
void sortBook (){
int select,i,j;
cout<<"1:按 名称 排序\n";
cout<<"2:按 序列号 排序\n";
cout<<"3:按 出版社 排序\n";
cout<<"4:按 作者 排序\n";
cout<<"5:按 价格 排序\n";
cout<<"6:按 库存 排序\n";
cout<<"请输入选择:";
cin>>select;
for( i = bookCount -1;i>0;i--){
for( j = 0;j < i;j++){
if( 0
|| select == 1 && strcmp(bookList [j]. name , bookList [j+1]. name)>0
|| select == 2 && strcmp(bookList [j]. numb , bookList [j+1]. numb)>0
|| select == 3 && strcmp(bookList [j]. publish , bookList [j+1]. publish)>0
|| select == 4 && strcmp(bookList [j]. author , bookList [j+1]. author)>0
|| select == 5 && bookList [j]. price - bookList [j+1]. price > 0
|| select == 6 && bookList [j]. amount - bookList [j+1]. amount > 0
){
exchangeBook (j,j+1);
}
}
}
findBook (1);
writeBook ();
}
//图书 交换
void exchangeBook (int i,int j){
struct Book book = bookList [i];
bookList [i] = bookList [j];
bookList [j] = book ;
}
//销售记录 读入文件
void readRecord (){
FILE *fp = NULL;
if (NULL == (fp = fopen("Record.txt", "r")))//读打开
{
return;
}
int i=0;
//从文件读取数据
while (fscanf(fp, "%s%d%lf"
,recordList[i].book ,&recordList[i].amount ,&recordList[i].price
) != EOF)//读取
{
i++;
}
//记录总数
recordCount = i;
fclose(fp);
}
//销售记录 写入文件
void writeRecord (){
FILE *fp = NULL;
int i;
fp = fopen("Record.txt", "w+");
for( i = 0;i< recordCount ;i++){
fprintf(fp,"%s %d %lf\n"
,recordList[i].book ,recordList[i].amount ,recordList[i].price );
}
fclose(fp);
}
//销售记录 添加记录
void addRecord (){
char selectYNFlag = 'y';
while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
cout<<"\n";
cout<<"请输入图书 :";
char book[15]; cin>>book;
strcpy(recordList [ recordCount ] . book,book);
//检索Record 是否存在
int getOneBookFrn =getOneBook ("name",recordList [ recordCount ] . book);
if(getOneBookFrn ==-1){//检索不为空
cout<<"图书不存在!\n";
break;
}
cout<<"请输入数量 :";
int amount; cin>>amount;
recordList [ recordCount ] . amount = amount ;
cout<<"请输入价格 :";
double price; cin>>price;
recordList [ recordCount ] . price = price ;
//recordCount 是全局变量
recordCount ++;
cout<<"\n是否继续录入?(y/n)";
getchar();
cin>>selectYNFlag;
}
writeRecord ( );
cout<<"\n*****************************\n";
cout<<"录入完成\n";
cout<<"*****************************\n";
}
//销售记录 删除
void delRecord (){
cout<<"请输入您要删除的 销售记录 序号(输入-1退出):";
int index;
cin>>index;
if(index >= 0){
int res = delRecordByIndex (index);
if(res){
cout<<"删除成功!\n\n";
writeRecord ();
}else{
cout<<"删除失败!\n\n";
}
}
}
//销售记录 根据下标删除
int delRecordByIndex (int index){
if(index >= recordCount || index < 0){
return 0;
}
//开始删除!
int i;
for(i = index; i < recordCount - 1 ; i++){
//元素全部往前移一位。
recordList [i] = recordList [i+1];
}
//最后令栈的长度减一
recordCount = recordCount - 1;
return 1;
}
//销售记录 修改
void modRecord (){
cout<<"请输入您要修改的销售记录 序号(输入-1退出):";
int indexOfMod = -1;
cin>>indexOfMod;
if(indexOfMod >= 0 && indexOfMod < recordCount ){
//开始修改
cout<<"请输入图书 :";
char book[15];
cin>>book;
if(getOneBook ("name",book)==-1){//检索不为空
cout<<"图书 不存在!\n";
return;
}
cout<<"请输入数量 :";
int amount;
cin>>amount;
cout<<"请输入价格 :";
double price;
cin>>price;
//输入完毕,赋值
strcpy(recordList [ indexOfMod ] . book,book);
recordList [ indexOfMod ] . amount = amount ;
recordList [ indexOfMod ] . price = price ;
cout<<"修改成功!\n";
writeRecord ();
}else{
cout<<"输入错误!\n";
}
}
//销售记录 查找 如果all=1:查询全部 否则按条件查询
void findRecord (int all){
int select = 0;
char conCharArr[40];
double conNum1,conNum2;
while(1){
printf("\n%-5s%-15s%-10s%-12s\n\n","序号" ,"图书","数量","价格" );
if( recordList ){
//用于统计信息所用
int count = 0,i;
int amountSum=0;
double priceSum=0;
for (i = 0;i < recordCount ; i++)
{
if(select == 0
|| select == 1 && strstr(recordList [i]. book,conCharArr) //根据图书,模糊查询
){
printf("%-5d%-15s%-10d%-12lf \n\n",i
,recordList [i] . book
,recordList [i] . amount
,recordList [i] . price
);
//用于统计信息所用
amountSum += recordList [i].amount;
priceSum += recordList [i].price;
count++;
}else{
delRecordByIndex(i--);//删掉
}
}
cout<<"共" << count <<"条结果\n";
cout<<"-----------------------------------------------------------------------------------------------------\n";
cout<<"【数量】" << "总计:"<<amountSum<<" " <<"\n";
cout<<"【价格】" << "总计:"<<priceSum<<" " <<"平均:"<< (count!=0?priceSum*1.0/count:0)<<"\n";
cout<<"\n";
}else{
cout<<"\n【无记录!】\n\n";
}
//如果参数all为1,则表示列出所有就退出
if(all == 1)break;
//进入过滤。
cout<<"【筛选器:你可以在以上结果的基础上,进行以下条件筛选】\n";
cout<<"0:退出\n";
cout<<"1:按 图书 筛选\n";
cout<<"请输入选择:";
cin>>select;
if(select>0){
if(0 ||select==1 ){
cout<<"请输入筛选条件:";
cin>>conCharArr;
}else if(0 ){
cout<<"请输入筛选范围m,n,用空格隔开(m ≤X ≤n):";
cin>>conNum1;
cin>>conNum2;
}
}else{
break;
}
}
readRecord();//从新读取数据。
}
//销售记录 排序
void sortRecord (){
int select,i,j;
cout<<"1:按 图书 排序\n";
cout<<"2:按 数量 排序\n";
cout<<"3:按 价格 排序\n";
cout<<"请输入选择:";
cin>>select;
for( i = recordCount -1;i>0;i--){
for( j = 0;j < i;j++){
if( 0
|| select == 1 && strcmp(recordList [j]. book , recordList [j+1]. book)>0
|| select == 2 && recordList [j]. amount - recordList [j+1]. amount > 0
|| select == 3 && recordList [j]. price - recordList [j+1]. price > 0
){
exchangeRecord (j,j+1);
}
}
}
findRecord (1);
writeRecord ();
}
//销售记录 交换
void exchangeRecord (int i,int j){
struct Record record = recordList [i];
recordList [i] = recordList [j];
recordList [j] = record ;
}
void menu (){
//菜单
cout<<"*------------------主菜单---------------------*\n";
cout<<"*-------------1 :添加图书\n";
cout<<"*-------------2 :删除图书\n";
cout<<"*-------------3 :修改图书\n";
cout<<"*-------------4 :查找图书\n";
cout<<"*-------------5 :排序图书\n";
cout<<"*-------------6 :添加销售记录\n";
cout<<"*-------------7 :删除销售记录\n";
cout<<"*-------------8 :修改销售记录\n";
cout<<"*-------------9 :查找销售记录\n";
cout<<"*-------------10 :排序销售记录\n";
cout<<"*-------------0:退出\n";
cout<<"*---------------------------------------------*\n";
cout<<"请输入选择:";
}
链表:C版本
#include <stdio.h>
#include <windows.h>
//定义 图书 链表
struct Book {
char name[15] ; // 名称
char numb[18] ; // 序列号
char publish[18] ; // 出版社
char author[12] ; // 作者
double price ; // 价格
int amount ; // 库存
struct Book* next;//链式存储
};
struct Book *bookList;//定义全局 图书 指针
int bookCount = 0;//图书 个数记录
//定义 销售记录 链表
struct Record {
char book[15] ; // 图书
int amount ; // 数量
double price ; // 价格
struct Record* next;//链式存储
};
struct Record *recordList;//定义全局 销售记录 指针
int recordCount = 0;//销售记录 个数记录
//图书 读入文件
void readBook ();
//图书 写入文件
void writeBook ();
//图书 添加记录
void addBook ();
void addOneBook (struct Book *book);
//图书 删除记录
void delBook ();
//图书 根据下标删除
int delBookByIndex (int index);
//图书 修改记录
void modBook ();
//图书 查找记录
void findBook (int all);
//图书 排序
void sortBook ();
//交换
void exchangeBook (int i ,int j);
//存在判断函数
struct Book* getOneBook (const char *name,char *s);
//销售记录 读入文件
void readRecord ();
//销售记录 写入文件
void writeRecord ();
//销售记录 添加记录
void addRecord ();
void addOneRecord (struct Record *record);
//销售记录 删除记录
void delRecord ();
//销售记录 根据下标删除
int delRecordByIndex (int index);
//销售记录 修改记录
void modRecord ();
//销售记录 查找记录
void findRecord (int all);
//销售记录 排序
void sortRecord ();
//交换
void exchangeRecord (int i ,int j);
//存在判断函数
//菜单
void menu();
// 主函数
int main(){
//读取数据
readBook ();//读取图书
readRecord ();//读取销售记录
while(1){
int choice;
menu ();
scanf("%d",&choice);
switch(choice){
case 1 :
addBook ();//添加图书
break;
case 2 :
findBook (1);//查找图书
delBook ();//删除图书
break;
case 3 :
findBook (1);//查找图书
modBook ();//修改图书
break;
case 4 :
findBook (0);//查找图书
break;
case 5 :
sortBook ();//排序图书
break;
case 6 :
addRecord ();//添加销售记录
break;
case 7 :
findRecord (1);//查找销售记录
delRecord ();//删除销售记录
break;
case 8 :
findRecord (1);//查找销售记录
modRecord ();//修改销售记录
break;
case 9 :
findRecord (0);//查找销售记录
break;
case 10 :
sortRecord ();//排序销售记录
break;
case 0:
printf("\n\n\n\t\t\t感谢使用\n\n\n"); exit(0);
default :
getchar();
printf("\n\n\n\t提示:没有这个选项!请重新输入!\n\n\n\n"); system("pause");
break;
}
}
return 0;
}
//是否存在判断
struct Book *getOneBook (const char *name,char *s){
struct Book *head = bookList;
while(head){
if( strcmp(name,"name")==0 && strcmp(s, head->name )==0){
return head;
}
if( strcmp(name,"numb")==0 && strcmp(s, head->numb )==0){
return head;
}
head = head->next;
}
return NULL;
}
//图书 读入文件
void readBook (){
FILE *fp = NULL;
if (NULL == (fp = fopen("Book.txt", "r")))//读打开
{
//文件不存在,不读取
return;
}
int i=0;
//从文件读取数据
bookList = NULL;
struct Book *tail = bookList;
while (1)//读取
{
//给节点分配空间
struct Book *p=(struct Book*)malloc(sizeof(struct Book));
//读取数据到p
if(fscanf(fp, "%s%s%s%s%lf%d"
,p->name ,p->numb ,p->publish ,p->author ,&p->price ,&p->amount
) == EOF) {
break;
}
p->next=NULL;
//指针为空则赋值。
if (bookList == NULL)
{
bookList=p;
tail=p;
}
else {
tail->next=p;
tail=p;
}
i++;
}
//记录总数
bookCount = i;
fclose(fp);
}
//图书 写入文件
void writeBook (){
//打开文件
FILE *fp = NULL;
fp = fopen("Book.txt", "w+");
//定义指针
struct Book *p = bookList;
//写入
while(p){
fprintf(fp,"%s %s %s %s %lf %d\n"
,p->name ,p->numb ,p->publish ,p->author ,p->price ,p->amount );
p=p->next;
}
fclose(fp);
}
//图书 添加记录
void addBook (){
char selectYNFlag = 'y';
while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
printf("\n"); struct Book *tempValue = (struct Book*)malloc(sizeof(struct Book)); //必须重新分配地址空间。
printf("请输入名称 :"); char name[15]; scanf("%s",name);
strcpy(tempValue->name,name);
struct Book* onename = getOneBook ("name",tempValue->name);
if(onename !=NULL){//检索不为空
printf("名称已存在!\n"); break;
}
printf("请输入序列号 :"); char numb[18]; scanf("%s",numb);
strcpy(tempValue->numb,numb);
struct Book* onenumb = getOneBook ("numb",tempValue->numb);
if(onenumb !=NULL){//检索不为空
printf("序列号已存在!\n"); break;
}
printf("请输入出版社 :"); char publish[18]; scanf("%s",publish);
strcpy(tempValue->publish,publish);
printf("请输入作者 :"); char author[12]; scanf("%s",author);
strcpy(tempValue->author,author);
printf("请输入价格 :"); double price; scanf("%lf",&price);
tempValue->price = price ;
printf("请输入库存 :"); int amount; scanf("%d",&amount);
tempValue->amount = amount ;
//TODO
//加入链表
tempValue->next = NULL;
addOneBook (tempValue);
printf("\n是否继续录入?(y/n)"); getchar();
scanf("%c",&selectYNFlag);
}
writeBook ( );
printf("\n*****************************\n"); printf("录入完成\n"); printf("*****************************\n"); }
void addOneBook (struct Book *temp){
//采用头插法
if(bookList == NULL){
bookList = temp;
}else{
temp->next = bookList;
bookList = temp;
}
bookCount ++;
}
//图书 删除
void delBook (){
printf("请输入您要删除的 图书 序号(输入-1退出):"); int index;
scanf("%d",&index);
if(index >= 0){
int res = delBookByIndex (index);
if(res){
printf("删除成功!\n\n"); writeBook ();
}else{
printf("删除失败!\n\n"); }
}
}
//图书 根据下标删除
int delBookByIndex (int index){
if(index > bookCount || index < 1){
return 0;//删除失败 ,数量没那么多
}
//开始删除!
struct Book *p = (struct Book*)malloc(sizeof(struct Book));
struct Book *q = bookList;
p->next = bookList;
if(index == 1){
bookList = bookList ->next;
}else{
int i;
for(i = 0;i < index-1 ; i++){
p = p->next;
q = q->next;
}
p->next = q->next;
}
bookCount = bookCount - 1;
return 1;
}
//图书 修改
void modBook (){
printf("请输入您要修改的图书 序号(输入-1退出):"); int indexOfMod = -1,i;
scanf("%d",&indexOfMod);
if(indexOfMod > 0 && indexOfMod <= bookCount ){
//开始修改
struct Book *temp = bookList ;
for( i = 0;i < indexOfMod-1;i++){
temp=temp->next;
}
printf("请输入名称 :"); char name[15];
scanf("%s",name);
if(strcmp(temp->name,name) != 0 && getOneBook ("name",name)!=NULL){//检索不为空
printf("名称 已存在!\n"); return;
}
printf("请输入出版社 :"); char publish[18];
scanf("%s",publish);
printf("请输入作者 :"); char author[12];
scanf("%s",author);
printf("请输入价格 :"); double price;
scanf("%lf",&price);
printf("请输入库存 :"); int amount;
scanf("%d",&amount);
//输入完毕,赋值
strcpy(temp-> name,name);
strcpy(temp-> publish,publish);
strcpy(temp-> author,author);
temp-> price = price ;
temp-> amount = amount ;
printf("修改成功!\n"); writeBook ();
}else{
printf("输入错误!\n"); }
}
//图书 查找 如果all=1:查询全部 否则按条件查询
void findBook (int all){
int select = 0;
char conCharArr[40];
double conNum1,conNum2;
while(1){
printf("\n%-5s%-15s%-18s%-18s%-12s%-12s%-10s\n\n","序号" ,"名称","序列号","出版社","作者","价格","库存" );
int i=1,count = 0;
if( bookList ){
//用于统计信息所用
double priceSum=0;
int amountSum=0;
struct Book *t = bookList;
while(t){
int delFlag = 0;
if(select == 0
|| select == 1 && strstr(t->name,conCharArr) //根据名称,模糊查询
|| select == 2 && strstr(t->numb,conCharArr) //根据序列号,模糊查询
|| select == 3 && strstr(t->author,conCharArr) //根据作者,模糊查询
){
printf("%-5d%-15s%-18s%-18s%-12s%-12lf%-10d \n\n",i
,t->name
,t->numb
,t->publish
,t->author
,t->price
,t->amount
);
//用于统计信息所用
priceSum += t->price;
amountSum += t->amount;
count++;
}else{
delFlag = 1;//删掉
}
t=t->next;
if(delFlag){
delBookByIndex (i--);
}
i++;
}
printf("共%d条结果\n",count); printf("-----------------------------------------------------------------------------------------------------\n"); printf("【价格】平均:%.2lf\n" ,count!=0?priceSum * 1.0 / count :0);
printf("【库存】总计:%d 平均:%.2lf\n",amountSum ,count!=0?amountSum * 1.0 / count :0);
printf("\n"); }else{
printf("\n【无记录!】\n\n"); }
//如果参数all为1,则表示列出所有就退出
if(all == 1)break;
//进入过滤。
printf("【筛选器:你可以在以上结果的基础上,进行以下条件筛选:】\n"); printf("0:退出\n"); printf("1:按 名称 筛选\n"); printf("2:按 序列号 筛选\n"); printf("3:按 作者 筛选\n"); printf("请输入选择:"); scanf("%d",&select);
if(select>0){
if(0 ||select==1 ||select==2 ||select==3 ){
printf("请输入筛选条件:"); scanf("%s",conCharArr);
}else if(0 ){
printf("请输入筛选范围m,n,用空格隔开(m ≤X ≤n):"); scanf("%lf",&conNum1);
scanf("%lf",&conNum2);
}
}else{
break;
}
}
readBook();//从新读取数据。
}
//图书 排序
void sortBook (){
int select,i,j;
printf("1:按 名称 排序\n"); printf("2:按 序列号 排序\n"); printf("3:按 出版社 排序\n"); printf("4:按 作者 排序\n"); printf("5:按 价格 排序\n"); printf("6:按 库存 排序\n"); printf("请输入选择:"); scanf("%d",&select);
struct Book *list[100];
for(i = 0;i< bookCount;i++){
list[i] = bookList;
bookList = bookList ->next;
}
for( i = bookCount -1;i>0;i--){
for( j = 0;j < i;j++){
if( 0
|| select == 1 && strcmp(list[j]->name , list[j+1]->name)>0
|| select == 2 && strcmp(list[j]->numb , list[j+1]->numb)>0
|| select == 3 && strcmp(list[j]->publish , list[j+1]->publish)>0
|| select == 4 && strcmp(list[j]->author , list[j+1]->author)>0
|| select == 5 && list[j]->price - list[j+1]->price > 0
|| select == 6 && list[j]->amount - list[j+1]->amount > 0
){
struct Book *temp = (struct Book*)malloc(sizeof(struct Book));
temp = list[j]; //交换位置
list[j] = list[j+1];
list[j+1] = temp;
}
}
}
for(i = 0;i< bookCount -1;i++){
list[i]->next = list[i+1];
}
list[ bookCount -1 ]->next = NULL;
bookList = list[0];
findBook (1);
writeBook ();
}
//销售记录 读入文件
void readRecord (){
FILE *fp = NULL;
if (NULL == (fp = fopen("Record.txt", "r")))//读打开
{
//文件不存在,不读取
return;
}
int i=0;
//从文件读取数据
recordList = NULL;
struct Record *tail = recordList;
while (1)//读取
{
//给节点分配空间
struct Record *p=(struct Record*)malloc(sizeof(struct Record));
//读取数据到p
if(fscanf(fp, "%s%d%lf"
,p->book ,&p->amount ,&p->price
) == EOF) {
break;
}
p->next=NULL;
//指针为空则赋值。
if (recordList == NULL)
{
recordList=p;
tail=p;
}
else {
tail->next=p;
tail=p;
}
i++;
}
//记录总数
recordCount = i;
fclose(fp);
}
//销售记录 写入文件
void writeRecord (){
//打开文件
FILE *fp = NULL;
fp = fopen("Record.txt", "w+");
//定义指针
struct Record *p = recordList;
//写入
while(p){
fprintf(fp,"%s %d %lf\n"
,p->book ,p->amount ,p->price );
p=p->next;
}
fclose(fp);
}
//销售记录 添加记录
void addRecord (){
char selectYNFlag = 'y';
while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
printf("\n"); struct Record *tempValue = (struct Record*)malloc(sizeof(struct Record)); //必须重新分配地址空间。
printf("请输入图书 :"); char book[15]; scanf("%s",book);
strcpy(tempValue->book,book);
struct Book* bookTemp = getOneBook ("name",tempValue->book);
if(bookTemp==NULL){//检索不为空
printf("图书不存在!\n"); break;
}
printf("请输入数量 :"); int amount; scanf("%d",&amount);
tempValue->amount = amount ;
printf("请输入价格 :"); double price; scanf("%lf",&price);
tempValue->price = price ;
//TODO
//加入链表
tempValue->next = NULL;
addOneRecord (tempValue);
printf("\n是否继续录入?(y/n)"); getchar();
scanf("%c",&selectYNFlag);
}
writeRecord ( );
printf("\n*****************************\n"); printf("录入完成\n"); printf("*****************************\n"); }
void addOneRecord (struct Record *temp){
//采用头插法
if(recordList == NULL){
recordList = temp;
}else{
temp->next = recordList;
recordList = temp;
}
recordCount ++;
}
//销售记录 删除
void delRecord (){
printf("请输入您要删除的 销售记录 序号(输入-1退出):"); int index;
scanf("%d",&index);
if(index >= 0){
int res = delRecordByIndex (index);
if(res){
printf("删除成功!\n\n"); writeRecord ();
}else{
printf("删除失败!\n\n"); }
}
}
//销售记录 根据下标删除
int delRecordByIndex (int index){
if(index > recordCount || index < 1){
return 0;//删除失败 ,数量没那么多
}
//开始删除!
struct Record *p = (struct Record*)malloc(sizeof(struct Record));
struct Record *q = recordList;
p->next = recordList;
if(index == 1){
recordList = recordList ->next;
}else{
int i;
for(i = 0;i < index-1 ; i++){
p = p->next;
q = q->next;
}
p->next = q->next;
}
recordCount = recordCount - 1;
return 1;
}
//销售记录 修改
void modRecord (){
printf("请输入您要修改的销售记录 序号(输入-1退出):"); int indexOfMod = -1,i;
scanf("%d",&indexOfMod);
if(indexOfMod > 0 && indexOfMod <= recordCount ){
//开始修改
struct Record *temp = recordList ;
for( i = 0;i < indexOfMod-1;i++){
temp=temp->next;
}
printf("请输入图书 :"); char book[15];
scanf("%s",book);
if(getOneBook ("name",book)==NULL){//检索不为空
printf("图书 不存在!\n"); return;
}
printf("请输入数量 :"); int amount;
scanf("%d",&amount);
printf("请输入价格 :"); double price;
scanf("%lf",&price);
//输入完毕,赋值
strcpy(temp-> book,book);
temp-> amount = amount ;
temp-> price = price ;
printf("修改成功!\n"); writeRecord ();
}else{
printf("输入错误!\n"); }
}
//销售记录 查找 如果all=1:查询全部 否则按条件查询
void findRecord (int all){
int select = 0;
char conCharArr[40];
double conNum1,conNum2;
while(1){
printf("\n%-5s%-15s%-10s%-12s\n\n","序号" ,"图书","数量","价格" );
int i=1,count = 0;
if( recordList ){
//用于统计信息所用
int amountSum=0;
double priceSum=0;
struct Record *t = recordList;
while(t){
int delFlag = 0;
if(select == 0
|| select == 1 && strstr(t->book,conCharArr) //根据图书,模糊查询
){
printf("%-5d%-15s%-10d%-12lf \n\n",i
,t->book
,t->amount
,t->price
);
//用于统计信息所用
amountSum += t->amount;
priceSum += t->price;
count++;
}else{
delFlag = 1;//删掉
}
t=t->next;
if(delFlag){
delRecordByIndex (i--);
}
i++;
}
printf("共%d条结果\n",count); printf("-----------------------------------------------------------------------------------------------------\n"); printf("【数量】总计:%d \n",amountSum );
printf("【价格】总计:%lf 平均:%.2lf\n",priceSum ,count!=0?priceSum * 1.0 / count :0);
printf("\n"); }else{
printf("\n【无记录!】\n\n"); }
//如果参数all为1,则表示列出所有就退出
if(all == 1)break;
//进入过滤。
printf("【筛选器:你可以在以上结果的基础上,进行以下条件筛选:】\n"); printf("0:退出\n"); printf("1:按 图书 筛选\n"); printf("请输入选择:"); scanf("%d",&select);
if(select>0){
if(0 ||select==1 ){
printf("请输入筛选条件:"); scanf("%s",conCharArr);
}else if(0 ){
printf("请输入筛选范围m,n,用空格隔开(m ≤X ≤n):"); scanf("%lf",&conNum1);
scanf("%lf",&conNum2);
}
}else{
break;
}
}
readRecord();//从新读取数据。
}
//销售记录 排序
void sortRecord (){
int select,i,j;
printf("1:按 图书 排序\n"); printf("2:按 数量 排序\n"); printf("3:按 价格 排序\n"); printf("请输入选择:"); scanf("%d",&select);
struct Record *list[100];
for(i = 0;i< recordCount;i++){
list[i] = recordList;
recordList = recordList ->next;
}
for( i = recordCount -1;i>0;i--){
for( j = 0;j < i;j++){
if( 0
|| select == 1 && strcmp(list[j]->book , list[j+1]->book)>0
|| select == 2 && list[j]->amount - list[j+1]->amount > 0
|| select == 3 && list[j]->price - list[j+1]->price > 0
){
struct Record *temp = (struct Record*)malloc(sizeof(struct Record));
temp = list[j]; //交换位置
list[j] = list[j+1];
list[j+1] = temp;
}
}
}
for(i = 0;i< recordCount -1;i++){
list[i]->next = list[i+1];
}
list[ recordCount -1 ]->next = NULL;
recordList = list[0];
findRecord (1);
writeRecord ();
}
void menu (){
//菜单
printf("*------------------主菜单---------------------*\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("*-------------10 :排序销售记录\n"); printf("*-------------0:退出\n"); printf("*---------------------------------------------*\n"); printf("请输入选择:"); }
链表:C++版本
#include <io.h>
#include <iostream>
#include <windows.h>
using namespace std;
//定义 图书 链表
struct Book {
char name[15] ; // 名称
char numb[18] ; // 序列号
char publish[18] ; // 出版社
char author[12] ; // 作者
double price ; // 价格
int amount ; // 库存
struct Book* next;//链式存储
};
struct Book *bookList;//定义全局 图书 指针
int bookCount = 0;//图书 个数记录
//定义 销售记录 链表
struct Record {
char book[15] ; // 图书
int amount ; // 数量
double price ; // 价格
struct Record* next;//链式存储
};
struct Record *recordList;//定义全局 销售记录 指针
int recordCount = 0;//销售记录 个数记录
//图书 读入文件
void readBook ();
//图书 写入文件
void writeBook ();
//图书 添加记录
void addBook ();
void addOneBook (struct Book *book);
//图书 删除记录
void delBook ();
//图书 根据下标删除
int delBookByIndex (int index);
//图书 修改记录
void modBook ();
//图书 查找记录
void findBook (int all);
//图书 排序
void sortBook ();
//交换
void exchangeBook (int i ,int j);
//存在判断函数
struct Book* getOneBook (const char *name,char *s);
//销售记录 读入文件
void readRecord ();
//销售记录 写入文件
void writeRecord ();
//销售记录 添加记录
void addRecord ();
void addOneRecord (struct Record *record);
//销售记录 删除记录
void delRecord ();
//销售记录 根据下标删除
int delRecordByIndex (int index);
//销售记录 修改记录
void modRecord ();
//销售记录 查找记录
void findRecord (int all);
//销售记录 排序
void sortRecord ();
//交换
void exchangeRecord (int i ,int j);
//存在判断函数
//菜单
void menu();
// 主函数
int main(){
//读取数据
readBook ();//读取图书
readRecord ();//读取销售记录
while(1){
int choice;
menu ();
cin>>choice;
switch(choice){
case 1 :
addBook ();//添加图书
break;
case 2 :
findBook (1);//查找图书
delBook ();//删除图书
break;
case 3 :
findBook (1);//查找图书
modBook ();//修改图书
break;
case 4 :
findBook (0);//查找图书
break;
case 5 :
sortBook ();//排序图书
break;
case 6 :
addRecord ();//添加销售记录
break;
case 7 :
findRecord (1);//查找销售记录
delRecord ();//删除销售记录
break;
case 8 :
findRecord (1);//查找销售记录
modRecord ();//修改销售记录
break;
case 9 :
findRecord (0);//查找销售记录
break;
case 10 :
sortRecord ();//排序销售记录
break;
case 0:
cout<<"\n\n\n\t\t\t感谢使用\n\n\n";
exit(0);
default :
getchar();
cout<<"\n\n\n\t提示:没有这个选项!请重新输入!\n\n\n\n";
system("pause");
break;
}
}
return 0;
}
//是否存在判断
struct Book *getOneBook (const char *name,char *s){
struct Book *head = bookList;
while(head){
if( strcmp(name,"name")==0 && strcmp(s, head->name )==0){
return head;
}
if( strcmp(name,"numb")==0 && strcmp(s, head->numb )==0){
return head;
}
head = head->next;
}
return NULL;
}
//图书 读入文件
void readBook (){
FILE *fp = NULL;
if (NULL == (fp = fopen("Book.txt", "r")))//读打开
{
//文件不存在,不读取
return;
}
int i=0;
//从文件读取数据
bookList = NULL;
struct Book *tail = bookList;
while (1)//读取
{
//给节点分配空间
struct Book *p=(struct Book*)malloc(sizeof(struct Book));
//读取数据到p
if(fscanf(fp, "%s%s%s%s%lf%d"
,p->name ,p->numb ,p->publish ,p->author ,&p->price ,&p->amount
) == EOF) {
break;
}
p->next=NULL;
//指针为空则赋值。
if (bookList == NULL)
{
bookList=p;
tail=p;
}
else {
tail->next=p;
tail=p;
}
i++;
}
//记录总数
bookCount = i;
fclose(fp);
}
//图书 写入文件
void writeBook (){
//打开文件
FILE *fp = NULL;
fp = fopen("Book.txt", "w+");
//定义指针
struct Book *p = bookList;
//写入
while(p){
fprintf(fp,"%s %s %s %s %lf %d\n"
,p->name ,p->numb ,p->publish ,p->author ,p->price ,p->amount );
p=p->next;
}
fclose(fp);
}
//图书 添加记录
void addBook (){
char selectYNFlag = 'y';
while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
cout<<"\n";
struct Book *tempValue = (struct Book*)malloc(sizeof(struct Book)); //必须重新分配地址空间。
cout<<"请输入名称 :";
char name[15]; cin>>name;
strcpy(tempValue->name,name);
struct Book* onename = getOneBook ("name",tempValue->name);
if(onename !=NULL){//检索不为空
cout<<"名称已存在!\n";
break;
}
cout<<"请输入序列号 :";
char numb[18]; cin>>numb;
strcpy(tempValue->numb,numb);
struct Book* onenumb = getOneBook ("numb",tempValue->numb);
if(onenumb !=NULL){//检索不为空
cout<<"序列号已存在!\n";
break;
}
cout<<"请输入出版社 :";
char publish[18]; cin>>publish;
strcpy(tempValue->publish,publish);
cout<<"请输入作者 :";
char author[12]; cin>>author;
strcpy(tempValue->author,author);
cout<<"请输入价格 :";
double price; cin>>price;
tempValue->price = price ;
cout<<"请输入库存 :";
int amount; cin>>amount;
tempValue->amount = amount ;
//TODO
//加入链表
tempValue->next = NULL;
addOneBook (tempValue);
cout<<"\n是否继续录入?(y/n)";
getchar();
cin>>selectYNFlag;
}
writeBook ( );
cout<<"\n*****************************\n";
cout<<"录入完成\n";
cout<<"*****************************\n";
}
void addOneBook (struct Book *temp){
//采用头插法
if(bookList == NULL){
bookList = temp;
}else{
temp->next = bookList;
bookList = temp;
}
bookCount ++;
}
//图书 删除
void delBook (){
cout<<"请输入您要删除的 图书 序号(输入-1退出):";
int index;
cin>>index;
if(index >= 0){
int res = delBookByIndex (index);
if(res){
cout<<"删除成功!\n\n";
writeBook ();
}else{
cout<<"删除失败!\n\n";
}
}
}
//图书 根据下标删除
int delBookByIndex (int index){
if(index > bookCount || index < 1){
return 0;//删除失败 ,数量没那么多
}
//开始删除!
struct Book *p = (struct Book*)malloc(sizeof(struct Book));
struct Book *q = bookList;
p->next = bookList;
if(index == 1){
bookList = bookList ->next;
}else{
int i;
for(i = 0;i < index-1 ; i++){
p = p->next;
q = q->next;
}
p->next = q->next;
}
bookCount = bookCount - 1;
return 1;
}
//图书 修改
void modBook (){
cout<<"请输入您要修改的图书 序号(输入-1退出):";
int indexOfMod = -1,i;
cin>>indexOfMod;
if(indexOfMod > 0 && indexOfMod <= bookCount ){
//开始修改
struct Book *temp = bookList ;
for( i = 0;i < indexOfMod-1;i++){
temp=temp->next;
}
cout<<"请输入名称 :";
char name[15];
cin>>name;
if(strcmp(temp->name,name) != 0 && getOneBook ("name",name)!=NULL){//检索不为空
cout<<"名称 已存在!\n";
return;
}
cout<<"请输入出版社 :";
char publish[18];
cin>>publish;
cout<<"请输入作者 :";
char author[12];
cin>>author;
cout<<"请输入价格 :";
double price;
cin>>price;
cout<<"请输入库存 :";
int amount;
cin>>amount;
//输入完毕,赋值
strcpy(temp-> name,name);
strcpy(temp-> publish,publish);
strcpy(temp-> author,author);
temp-> price = price ;
temp-> amount = amount ;
cout<<"修改成功!\n";
writeBook ();
}else{
cout<<"输入错误!\n";
}
}
//图书 查找 如果all=1:查询全部 否则按条件查询
void findBook (int all){
int select = 0;
char conCharArr[40];
double conNum1,conNum2;
while(1){
printf("\n%-5s%-15s%-18s%-18s%-12s%-12s%-10s\n\n","序号" ,"名称","序列号","出版社","作者","价格","库存" );
int i=1,count = 0;
if( bookList ){
//用于统计信息所用
double priceSum=0;
int amountSum=0;
struct Book *t = bookList;
while(t){
int delFlag = 0;
if(select == 0
|| select == 1 && strstr(t->name,conCharArr) //根据名称,模糊查询
|| select == 2 && strstr(t->numb,conCharArr) //根据序列号,模糊查询
|| select == 3 && strstr(t->author,conCharArr) //根据作者,模糊查询
){
printf("%-5d%-15s%-18s%-18s%-12s%-12lf%-10d \n\n",i
,t->name
,t->numb
,t->publish
,t->author
,t->price
,t->amount
);
//用于统计信息所用
priceSum += t->price;
amountSum += t->amount;
count++;
}else{
delFlag = 1;//删掉
}
t=t->next;
if(delFlag){
delBookByIndex (i--);
}
i++;
}
cout<<"共" << count <<"条结果\n";
cout<<"-----------------------------------------------------------------------------------------------------\n";
cout<<"【价格】" <<"平均:"<< (count!=0?priceSum*1.0/count:0)<<"\n";
cout<<"【库存】" << "总计:"<<amountSum<<" " <<"平均:"<< (count!=0?amountSum*1.0/count:0)<<"\n";
cout<<"\n";
}else{
cout<<"\n【无记录!】\n\n";
}
//如果参数all为1,则表示列出所有就退出
if(all == 1)break;
//进入过滤。
cout<<"【筛选器:你可以在以上结果的基础上,进行以下条件筛选:】\n";
cout<<"0:退出\n";
cout<<"1:按 名称 筛选\n";
cout<<"2:按 序列号 筛选\n";
cout<<"3:按 作者 筛选\n";
cout<<"请输入选择:";
cin>>select;
if(select>0){
if(0 ||select==1 ||select==2 ||select==3 ){
cout<<"请输入筛选条件:";
cin>>conCharArr;
}else if(0 ){
cout<<"请输入筛选范围m,n,用空格隔开(m ≤X ≤n):";
cin>>conNum1;
cin>>conNum2;
}
}else{
break;
}
}
readBook();//从新读取数据。
}
//图书 排序
void sortBook (){
int select,i,j;
cout<<"1:按 名称 排序\n";
cout<<"2:按 序列号 排序\n";
cout<<"3:按 出版社 排序\n";
cout<<"4:按 作者 排序\n";
cout<<"5:按 价格 排序\n";
cout<<"6:按 库存 排序\n";
cout<<"请输入选择:";
cin>>select;
struct Book *list[100];
for(i = 0;i< bookCount;i++){
list[i] = bookList;
bookList = bookList ->next;
}
for( i = bookCount -1;i>0;i--){
for( j = 0;j < i;j++){
if( 0
|| select == 1 && strcmp(list[j]->name , list[j+1]->name)>0
|| select == 2 && strcmp(list[j]->numb , list[j+1]->numb)>0
|| select == 3 && strcmp(list[j]->publish , list[j+1]->publish)>0
|| select == 4 && strcmp(list[j]->author , list[j+1]->author)>0
|| select == 5 && list[j]->price - list[j+1]->price > 0
|| select == 6 && list[j]->amount - list[j+1]->amount > 0
){
struct Book *temp = (struct Book*)malloc(sizeof(struct Book));
temp = list[j]; //交换位置
list[j] = list[j+1];
list[j+1] = temp;
}
}
}
for(i = 0;i< bookCount -1;i++){
list[i]->next = list[i+1];
}
list[ bookCount -1 ]->next = NULL;
bookList = list[0];
findBook (1);
writeBook ();
}
//销售记录 读入文件
void readRecord (){
FILE *fp = NULL;
if (NULL == (fp = fopen("Record.txt", "r")))//读打开
{
//文件不存在,不读取
return;
}
int i=0;
//从文件读取数据
recordList = NULL;
struct Record *tail = recordList;
while (1)//读取
{
//给节点分配空间
struct Record *p=(struct Record*)malloc(sizeof(struct Record));
//读取数据到p
if(fscanf(fp, "%s%d%lf"
,p->book ,&p->amount ,&p->price
) == EOF) {
break;
}
p->next=NULL;
//指针为空则赋值。
if (recordList == NULL)
{
recordList=p;
tail=p;
}
else {
tail->next=p;
tail=p;
}
i++;
}
//记录总数
recordCount = i;
fclose(fp);
}
//销售记录 写入文件
void writeRecord (){
//打开文件
FILE *fp = NULL;
fp = fopen("Record.txt", "w+");
//定义指针
struct Record *p = recordList;
//写入
while(p){
fprintf(fp,"%s %d %lf\n"
,p->book ,p->amount ,p->price );
p=p->next;
}
fclose(fp);
}
//销售记录 添加记录
void addRecord (){
char selectYNFlag = 'y';
while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
cout<<"\n";
struct Record *tempValue = (struct Record*)malloc(sizeof(struct Record)); //必须重新分配地址空间。
cout<<"请输入图书 :";
char book[15]; cin>>book;
strcpy(tempValue->book,book);
struct Book* bookTemp = getOneBook ("name",tempValue->book);
if(bookTemp==NULL){//检索不为空
cout<<"图书不存在!\n";
break;
}
cout<<"请输入数量 :";
int amount; cin>>amount;
tempValue->amount = amount ;
cout<<"请输入价格 :";
double price; cin>>price;
tempValue->price = price ;
//TODO
//加入链表
tempValue->next = NULL;
addOneRecord (tempValue);
cout<<"\n是否继续录入?(y/n)";
getchar();
cin>>selectYNFlag;
}
writeRecord ( );
cout<<"\n*****************************\n";
cout<<"录入完成\n";
cout<<"*****************************\n";
}
void addOneRecord (struct Record *temp){
//采用头插法
if(recordList == NULL){
recordList = temp;
}else{
temp->next = recordList;
recordList = temp;
}
recordCount ++;
}
//销售记录 删除
void delRecord (){
cout<<"请输入您要删除的 销售记录 序号(输入-1退出):";
int index;
cin>>index;
if(index >= 0){
int res = delRecordByIndex (index);
if(res){
cout<<"删除成功!\n\n";
writeRecord ();
}else{
cout<<"删除失败!\n\n";
}
}
}
//销售记录 根据下标删除
int delRecordByIndex (int index){
if(index > recordCount || index < 1){
return 0;//删除失败 ,数量没那么多
}
//开始删除!
struct Record *p = (struct Record*)malloc(sizeof(struct Record));
struct Record *q = recordList;
p->next = recordList;
if(index == 1){
recordList = recordList ->next;
}else{
int i;
for(i = 0;i < index-1 ; i++){
p = p->next;
q = q->next;
}
p->next = q->next;
}
recordCount = recordCount - 1;
return 1;
}
//销售记录 修改
void modRecord (){
cout<<"请输入您要修改的销售记录 序号(输入-1退出):";
int indexOfMod = -1,i;
cin>>indexOfMod;
if(indexOfMod > 0 && indexOfMod <= recordCount ){
//开始修改
struct Record *temp = recordList ;
for( i = 0;i < indexOfMod-1;i++){
temp=temp->next;
}
cout<<"请输入图书 :";
char book[15];
cin>>book;
if(getOneBook ("name",book)==NULL){//检索不为空
cout<<"图书 不存在!\n";
return;
}
cout<<"请输入数量 :";
int amount;
cin>>amount;
cout<<"请输入价格 :";
double price;
cin>>price;
//输入完毕,赋值
strcpy(temp-> book,book);
temp-> amount = amount ;
temp-> price = price ;
cout<<"修改成功!\n";
writeRecord ();
}else{
cout<<"输入错误!\n";
}
}
//销售记录 查找 如果all=1:查询全部 否则按条件查询
void findRecord (int all){
int select = 0;
char conCharArr[40];
double conNum1,conNum2;
while(1){
printf("\n%-5s%-15s%-10s%-12s\n\n","序号" ,"图书","数量","价格" );
int i=1,count = 0;
if( recordList ){
//用于统计信息所用
int amountSum=0;
double priceSum=0;
struct Record *t = recordList;
while(t){
int delFlag = 0;
if(select == 0
|| select == 1 && strstr(t->book,conCharArr) //根据图书,模糊查询
){
printf("%-5d%-15s%-10d%-12lf \n\n",i
,t->book
,t->amount
,t->price
);
//用于统计信息所用
amountSum += t->amount;
priceSum += t->price;
count++;
}else{
delFlag = 1;//删掉
}
t=t->next;
if(delFlag){
delRecordByIndex (i--);
}
i++;
}
cout<<"共" << count <<"条结果\n";
cout<<"-----------------------------------------------------------------------------------------------------\n";
cout<<"【数量】" << "总计:"<<amountSum<<" " <<"\n";
cout<<"【价格】" << "总计:"<<priceSum<<" " <<"平均:"<< (count!=0?priceSum*1.0/count:0)<<"\n";
cout<<"\n";
}else{
cout<<"\n【无记录!】\n\n";
}
//如果参数all为1,则表示列出所有就退出
if(all == 1)break;
//进入过滤。
cout<<"【筛选器:你可以在以上结果的基础上,进行以下条件筛选:】\n";
cout<<"0:退出\n";
cout<<"1:按 图书 筛选\n";
cout<<"请输入选择:";
cin>>select;
if(select>0){
if(0 ||select==1 ){
cout<<"请输入筛选条件:";
cin>>conCharArr;
}else if(0 ){
cout<<"请输入筛选范围m,n,用空格隔开(m ≤X ≤n):";
cin>>conNum1;
cin>>conNum2;
}
}else{
break;
}
}
readRecord();//从新读取数据。
}
//销售记录 排序
void sortRecord (){
int select,i,j;
cout<<"1:按 图书 排序\n";
cout<<"2:按 数量 排序\n";
cout<<"3:按 价格 排序\n";
cout<<"请输入选择:";
cin>>select;
struct Record *list[100];
for(i = 0;i< recordCount;i++){
list[i] = recordList;
recordList = recordList ->next;
}
for( i = recordCount -1;i>0;i--){
for( j = 0;j < i;j++){
if( 0
|| select == 1 && strcmp(list[j]->book , list[j+1]->book)>0
|| select == 2 && list[j]->amount - list[j+1]->amount > 0
|| select == 3 && list[j]->price - list[j+1]->price > 0
){
struct Record *temp = (struct Record*)malloc(sizeof(struct Record));
temp = list[j]; //交换位置
list[j] = list[j+1];
list[j+1] = temp;
}
}
}
for(i = 0;i< recordCount -1;i++){
list[i]->next = list[i+1];
}
list[ recordCount -1 ]->next = NULL;
recordList = list[0];
findRecord (1);
writeRecord ();
}
void menu (){
//菜单
cout<<"*------------------主菜单---------------------*\n";
cout<<"*-------------1 :添加图书\n";
cout<<"*-------------2 :删除图书\n";
cout<<"*-------------3 :修改图书\n";
cout<<"*-------------4 :查找图书\n";
cout<<"*-------------5 :排序图书\n";
cout<<"*-------------6 :添加销售记录\n";
cout<<"*-------------7 :删除销售记录\n";
cout<<"*-------------8 :修改销售记录\n";
cout<<"*-------------9 :查找销售记录\n";
cout<<"*-------------10 :排序销售记录\n";
cout<<"*-------------0:退出\n";
cout<<"*---------------------------------------------*\n";
cout<<"请输入选择:";
}
C++面向对象
#include <iostream>
#include <vector>
#include <fstream>
#include <string.h>
using namespace std;
int compare(int a,int b);
int compare(const char *a,const char *b);
class Book //定义 图书 类
{
public:
static vector< Book*> dataList;
char name[15] ; // 名称
char numb[18] ; // 序列号
char publish[18] ; // 出版社
char author[12] ; // 作者
double price ; // 价格
int amount ; // 库存
static void read();//读文件
static void write();//写文件
static void add();//添加
static void del();//删除
static void mod();//修改
static void find(int all);//查找
static void sort();//排序
static Book* getOne(string name, string s);//存在判断函数
};
vector< Book*> Book::dataList;//必须类外初始化,用于存储图书
class Record //定义 销售记录 类
{
public:
static vector< Record*> dataList;
char book[15] ; // 图书
int amount ; // 数量
double price ; // 价格
static void read();//读文件
static void write();//写文件
static void add();//添加
static void del();//删除
static void mod();//修改
static void find(int all);//查找
static void sort();//排序
};
vector< Record*> Record::dataList;//必须类外初始化,用于存储销售记录
//定义菜单
void menu();
// 主函数
int main(){
//读取数据
Book::read ();//读取图书
Record::read ();//读取销售记录
while(1){
int choice;
menu ();
cin>>choice;
switch(choice){
case 1 :
Book::add ();//添加图书
break;
case 2 :
Book::find (1);//查找图书
Book::del ();//删除图书
break;
case 3 :
Book::find (1);//查找图书
Book::mod ();//修改图书
break;
case 4 :
Book::find (0);//查找图书
break;
case 5 :
Book::sort ();//排序图书
break;
case 6 :
Record::add ();//添加销售记录
break;
case 7 :
Record::find (1);//查找销售记录
Record::del ();//删除销售记录
break;
case 8 :
Record::find (1);//查找销售记录
Record::mod ();//修改销售记录
break;
case 9 :
Record::find (0);//查找销售记录
break;
case 10 :
Record::sort ();//排序销售记录
break;
case 0:
cout<<"\n\n\n\t\t\t感谢使用\n\n\n";
exit(0);
default :
getchar();
cout<<"\n\n\n\t提示:没有这个选项!请重新输入!\n\n\n\n";
system("pause");
break;
}
}
return 0;
}
//是否存在判断
Book* Book::getOne(string name, string s) {
for (int i = 0; i < dataList.size();i++) {
if( strcmp(name.c_str(),"name")==0 && strcmp(s.c_str(), dataList[i]->name )==0){
return dataList[i];
}
if( strcmp(name.c_str(),"numb")==0 && strcmp(s.c_str(), dataList[i]->numb )==0){
return dataList[i];
}
}
return NULL;
}
//读取文件内的图书
void Book::read() {
FILE *fp = NULL;
if (NULL == (fp = fopen("Book.txt", "r")))//读打开
{
//文件不存在,不读取
return;
}
//从文件读取数据
dataList.clear();
while (1)//读取
{
//新建图书对象
Book *t = new Book;
//读取数据到p
if(fscanf(fp, "%s%s%s%s%lf%d"
,t->name ,t->numb ,t->publish ,t->author ,&t->price ,&t->amount
) == EOF) {
break;
}
dataList.push_back(t);//将内容加入vector
}
fclose(fp);
}
//图书 写入文件
void Book::write() {
//打开文件
FILE *fp = NULL;
fp = fopen("Book.txt", "w+");
//写入
for (int i = 0; i < dataList.size(); i++) {
Book *t = dataList.at(i);
fprintf(fp,"%s %s %s %s %lf %d\n"
,t->name ,t->numb ,t->publish ,t->author ,t->price ,t->amount );
}
fclose(fp);
}
//图书 添加记录
void Book::add() {
char selectYNFlag = 'y';
while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
cout<<"\n";
Book *tempValue = new Book (); //必须重新分配地址空间。
cout<<"请输入名称 :";
char name[15]; cin>>name ;
strcpy(tempValue->name,name);
Book* onename = getOne("name",tempValue->name);
if(onename!=NULL){//检索不为空
cout<<("名称已存在!\n");
break;
}
cout<<"请输入序列号 :";
char numb[18]; cin>>numb ;
strcpy(tempValue->numb,numb);
Book* onenumb = getOne("numb",tempValue->numb);
if(onenumb!=NULL){//检索不为空
cout<<("序列号已存在!\n");
break;
}
cout<<"请输入出版社 :";
char publish[18]; cin>>publish ;
strcpy(tempValue->publish,publish);
cout<<"请输入作者 :";
char author[12]; cin>>author ;
strcpy(tempValue->author,author);
cout<<"请输入价格 :";
double price; cin>>price ;
tempValue->price = price ;
cout<<"请输入库存 :";
int amount; cin>>amount ;
tempValue->amount = amount ;
//TODO,
//加入记录
dataList.push_back(tempValue);
cout<<"\n是否继续录入?(y/n)";
getchar();
cin>>selectYNFlag;
}
//写入文件
write();
cout<<"\n*****************************\n";
cout<<"录入结束\n";
cout<<"*****************************\n";
}
//图书 删除
void Book::del() {
cout<<"请输入您要删除的 图书 序号(输入-1退出):";
char c;
cin >> c;
int index = c - '0';
if (index >= 0 && index < dataList.size()) {
dataList.erase(dataList.begin()+index);
write();
cout << "删除成功!\n\n";
}
else if(index>0){
cout << "请输入正确序号!\n\n";
}
}
//图书 修改
void Book::mod() {
cout<<"请输入您要修改的图书 序号(输入-1退出):";
char c;
cin >> c;
int indexOfMod = c - '0';
if(indexOfMod >= 0 && indexOfMod < dataList.size() ){
//开始修改
Book *temp = dataList.at(indexOfMod);
cout<<"请输入名称 :";
char name[15];
cin>> name ;
if(compare(temp->name,name) != 0 && getOne("name",name)!=NULL){//检索不为空
cout<<("名称 已存在!\n");
return;
}
cout<<"请输入出版社 :";
char publish[18];
cin>> publish ;
cout<<"请输入作者 :";
char author[12];
cin>> author ;
cout<<"请输入价格 :";
double price;
cin>> price ;
cout<<"请输入库存 :";
int amount;
cin>> amount ;
//输入完毕,赋值
strcpy(temp-> name,name);
strcpy(temp-> publish,publish);
strcpy(temp-> author,author);
temp-> price = price ;
temp-> amount = amount ;
cout<<"修改成功!\n";
write();
}else{
cout<<"输入错误!\n";
}
}
//图书 查找 如果all=1:查询全部 否则按条件查询
void Book :: find(int all){
int select = 0;
char conCharArr[40];
double conNum1,conNum2;
//复制一个容器dataList2,查询的操作再dataList2里面进行
vector<Book*> dataList2 = dataList;
while(1){
printf("\n%-5s%-15s%-18s%-18s%-12s%-12s%-10s\n\n","序号" ,"名称","序列号","出版社","作者","价格","库存" );
int count = 0;
//用于统计信息所用
double priceSum=0;
int amountSum=0;
for(int i = 0;i < dataList2.size();i++){
Book* t = dataList2.at(i);
if(select == 0
|| select == 1 && strstr(t->name,conCharArr) //根据名称,模糊查询
|| select == 2 && strstr(t->numb,conCharArr) //根据序列号,模糊查询
|| select == 3 && strstr(t->author,conCharArr) //根据作者,模糊查询
){
printf("%-5d%-15s%-18s%-18s%-12s%-12lf%-10d \n\n",i
,t->name
,t->numb
,t->publish
,t->author
,t->price
,t->amount
);
//用于统计信息所用
priceSum += t->price;
amountSum += t->amount;
count++;
}else {
dataList2.erase(dataList2.begin()+i);
i--;
}
}
cout<<"共"<< count <<"条结果\n";
cout<<("-----------------------------------------------------------------------------------------------------\n");
cout<<"【价格】" <<"平均:"<< (count!=0?priceSum*1.0/count:0)<<"\n";
cout<<"【库存】" << "总计:"<<amountSum<<" " <<"平均:"<< (count!=0?amountSum*1.0/count:0)<<"\n";
cout<<"\n";
//如果参数all为1,则表示列出所有就退出
if(all == 1)break;
//进入过滤。
cout<<"【筛选器:你可以在以上结果的基础上,进行以下条件筛选】\n";
cout<<"0:退出\n";
cout<<"1:按 名称 筛选\n";
cout<<"2:按 序列号 筛选\n";
cout<<"3:按 作者 筛选\n";
cout<<"请输入选择:";
cin>>select;
if(select>0){
if(0 ||select==1 ||select==2 ||select==3 ){
cout<<"请输入筛选条件:";
cin>>conCharArr;
}else if(0 ){
cout<<"请输入筛选范围m,n,用空格隔开(m ≤X ≤n):";
cin>>conNum1;
cin>>conNum2;
}
}else{
break;
}
}
}
//图书 排序
void Book::sort(){
int select,i,j;
cout<<"1:按 名称 排序\n";
cout<<"2:按 序列号 排序\n";
cout<<"3:按 出版社 排序\n";
cout<<"4:按 作者 排序\n";
cout<<"5:按 价格 排序\n";
cout<<"6:按 库存 排序\n";
cout<<"请输入选择:";
cin>>select;
for (i = dataList.size() - 1; i > 0; i--) {
for( j = 0;j < i;j++){
if( 0
|| select == 1 && compare(dataList[j]->name , dataList[j+1]->name )>0
|| select == 2 && compare(dataList[j]->numb , dataList[j+1]->numb )>0
|| select == 3 && compare(dataList[j]->publish , dataList[j+1]->publish )>0
|| select == 4 && compare(dataList[j]->author , dataList[j+1]->author )>0
|| select == 5 && compare(dataList[j]->price , dataList[j+1]->price )>0
|| select == 6 && compare(dataList[j]->amount , dataList[j+1]->amount )>0
){
swap(dataList[j], dataList[j + 1]);
}
}
}
find(1);//排序后打印
write();
}
//读取文件内的销售记录
void Record::read() {
FILE *fp = NULL;
if (NULL == (fp = fopen("Record.txt", "r")))//读打开
{
//文件不存在,不读取
return;
}
//从文件读取数据
dataList.clear();
while (1)//读取
{
//新建销售记录对象
Record *t = new Record;
//读取数据到p
if(fscanf(fp, "%s%d%lf"
,t->book ,&t->amount ,&t->price
) == EOF) {
break;
}
dataList.push_back(t);//将内容加入vector
}
fclose(fp);
}
//销售记录 写入文件
void Record::write() {
//打开文件
FILE *fp = NULL;
fp = fopen("Record.txt", "w+");
//写入
for (int i = 0; i < dataList.size(); i++) {
Record *t = dataList.at(i);
fprintf(fp,"%s %d %lf\n"
,t->book ,t->amount ,t->price );
}
fclose(fp);
}
//销售记录 添加记录
void Record::add() {
char selectYNFlag = 'y';
while(selectYNFlag == 'y' || selectYNFlag == 'Y' ){
cout<<"\n";
Record *tempValue = new Record (); //必须重新分配地址空间。
cout<<"请输入图书 :";
char book[15]; cin>>book ;
strcpy(tempValue->book,book);
Book* bookTemp = Book :: getOne("name",tempValue->book);
if(bookTemp==NULL){//检索不为空
cout<<("图书不存在!\n");
break;
}
cout<<"请输入数量 :";
int amount; cin>>amount ;
tempValue->amount = amount ;
cout<<"请输入价格 :";
double price; cin>>price ;
tempValue->price = price ;
//TODO,
//加入记录
dataList.push_back(tempValue);
cout<<"\n是否继续录入?(y/n)";
getchar();
cin>>selectYNFlag;
}
//写入文件
write();
cout<<"\n*****************************\n";
cout<<"录入结束\n";
cout<<"*****************************\n";
}
//销售记录 删除
void Record::del() {
cout<<"请输入您要删除的 销售记录 序号(输入-1退出):";
char c;
cin >> c;
int index = c - '0';
if (index >= 0 && index < dataList.size()) {
dataList.erase(dataList.begin()+index);
write();
cout << "删除成功!\n\n";
}
else if(index>0){
cout << "请输入正确序号!\n\n";
}
}
//销售记录 修改
void Record::mod() {
cout<<"请输入您要修改的销售记录 序号(输入-1退出):";
char c;
cin >> c;
int indexOfMod = c - '0';
if(indexOfMod >= 0 && indexOfMod < dataList.size() ){
//开始修改
Record *temp = dataList.at(indexOfMod);
cout<<"请输入图书 :";
char book[15];
cin>> book ;
if(Book :: getOne("name",book)==NULL){//检索不为空
cout<<("图书 不存在!\n");
return;
}
cout<<"请输入数量 :";
int amount;
cin>> amount ;
cout<<"请输入价格 :";
double price;
cin>> price ;
//输入完毕,赋值
strcpy(temp-> book,book);
temp-> amount = amount ;
temp-> price = price ;
cout<<"修改成功!\n";
write();
}else{
cout<<"输入错误!\n";
}
}
//销售记录 查找 如果all=1:查询全部 否则按条件查询
void Record :: find(int all){
int select = 0;
char conCharArr[40];
double conNum1,conNum2;
//复制一个容器dataList2,查询的操作再dataList2里面进行
vector<Record*> dataList2 = dataList;
while(1){
printf("\n%-5s%-15s%-10s%-12s\n\n","序号" ,"图书","数量","价格" );
int count = 0;
//用于统计信息所用
int amountSum=0;
double priceSum=0;
for(int i = 0;i < dataList2.size();i++){
Record* t = dataList2.at(i);
if(select == 0
|| select == 1 && strstr(t->book,conCharArr) //根据图书,模糊查询
){
printf("%-5d%-15s%-10d%-12lf \n\n",i
,t->book
,t->amount
,t->price
);
//用于统计信息所用
amountSum += t->amount;
priceSum += t->price;
count++;
}else {
dataList2.erase(dataList2.begin()+i);
i--;
}
}
cout<<"共"<< count <<"条结果\n";
cout<<("-----------------------------------------------------------------------------------------------------\n");
cout<<"【数量】" << "总计:"<<amountSum<<" " <<"\n";
cout<<"【价格】" << "总计:"<<priceSum<<" " <<"平均:"<< (count!=0?priceSum*1.0/count:0)<<"\n";
cout<<"\n";
//如果参数all为1,则表示列出所有就退出
if(all == 1)break;
//进入过滤。
cout<<"【筛选器:你可以在以上结果的基础上,进行以下条件筛选】\n";
cout<<"0:退出\n";
cout<<"1:按 图书 筛选\n";
cout<<"请输入选择:";
cin>>select;
if(select>0){
if(0 ||select==1 ){
cout<<"请输入筛选条件:";
cin>>conCharArr;
}else if(0 ){
cout<<"请输入筛选范围m,n,用空格隔开(m ≤X ≤n):";
cin>>conNum1;
cin>>conNum2;
}
}else{
break;
}
}
}
//销售记录 排序
void Record::sort(){
int select,i,j;
cout<<"1:按 图书 排序\n";
cout<<"2:按 数量 排序\n";
cout<<"3:按 价格 排序\n";
cout<<"请输入选择:";
cin>>select;
for (i = dataList.size() - 1; i > 0; i--) {
for( j = 0;j < i;j++){
if( 0
|| select == 1 && compare(dataList[j]->book , dataList[j+1]->book )>0
|| select == 2 && compare(dataList[j]->amount , dataList[j+1]->amount )>0
|| select == 3 && compare(dataList[j]->price , dataList[j+1]->price )>0
){
swap(dataList[j], dataList[j + 1]);
}
}
}
find(1);//排序后打印
write();
}
void menu (){
//菜单
cout<<"*------------------主菜单---------------------*\n";
cout<<"*-------------1 :添加图书\n";
cout<<"*-------------2 :删除图书\n";
cout<<"*-------------3 :修改图书\n";
cout<<"*-------------4 :查找图书\n";
cout<<"*-------------5 :排序图书\n";
cout<<"*-------------6 :添加销售记录\n";
cout<<"*-------------7 :删除销售记录\n";
cout<<"*-------------8 :修改销售记录\n";
cout<<"*-------------9 :查找销售记录\n";
cout<<"*-------------10 :排序销售记录\n";
cout<<"*-------------0:退出\n";
cout<<"*---------------------------------------------*\n";
cout<<"请输入选择:";
}
//对比函数
int compare(int a,int b){
return a-b;
}
int compare(const char *a,const char *b){
return strcmp(a,b);
}