主题:[讨论]跪谢!!求C语言高手给C语言大程序改错....!!!
这是小弟花了一星期编出的一个有关商品销售的程序,由于运行时出现的错误比较多,而且大多自己找不出错在哪,所以向 C语言高手寻求帮助,程序功能的要求我放在上传的文件中... 恳请大家能为我出主意... 本人感激不尽!!!
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<malloc.h>
#include<stdlib.h>
#include<conio.h>
#include<cstdlib>
/*结构体定义*/
struct product //定义商品结构体
{
int p_id;
char p_name[30];
float price;
char place[50];
int stonum;
struct product *next;
}pro[10],pro1[10];
struct product *p_head=NULL,*p_tail,*p_new;
struct customer //定义顾客结构体
{
int c_id;
char c_name[30];
struct customer *next;
};
struct customer *c_head=NULL,*c_tail,*c_new;
struct sell //定义商品销售结构体
{
int c_id;
char c_name[30];
int p_id;
int num;
char s_date[11];
struct sell *next;
};
struct sell * keyboard();
struct sell *s_head=NULL,*s_tail,*s_new;
struct date //定义时间结构体
{
int year,month,day;
};
void choice_read(); //选择导入商品信息的方式
void file_read(); //文件导入
int keyboard(); //键盘输入
void show(); //展示商品信息
void sale(); //销售
int judge_date(char *s_date);
int judge(); //判断商品编号 数量 日期是否正确
void search_p_id(); //根据商品编号查询商品的销售历史
void search_time(); //计算时间段内各个商品的销售总额
int date_y_bj(char *s_date); //判断日期
int date_mbj(char *s_date); //判断日期
int date_d_bj(char *s_date); //判断日期
int search_name(); //按顾客姓名查找销售记录
int list_name(); //显示顾客信息
void download_s(); //保存销售信息
void download_c(); //保存顾客信息
int menu(); //菜单
int hello(); //欢迎界面
int bye(); //结束界面
void choice_read()
{
int a;
printf("****************选择导入商品信息的方式*****************\n\n");
printf("*\t\t\n1:通过键盘输入\n\n\t\t2:通过文件导入(推荐)*\n\n");
printf("*******************************************************\n\n");
printf("\n您的选择:");
scanf("%d",&a);
if(a==1)
keyboard();
if(a==2)
file_read();
}
void file_read(){//读取文件函数
int i;
FILE *fp; //指向文件的指针
if((fp=fopen("商品信息.txt","r"))==NULL)//打开文件
{
printf("文件读入失败,请检查文件路径\n"); //不能打开
exit(-1); //退出
}
printf("*******************商品目录*********************\n");
printf("商品编号 商品名称 商品价格 商品产地 库存数量\n");
while(!feof(fp))
{ //读入文件
fscanf(fp,"%d%s%f%s%d",&pro[i].p_id,pro[i].p_name,&pro[i].price,pro[i].place,&pro[i].stonum);
printf("%-10d%-10s %-10.2f%-12s%-12d\n",pro[i].p_id,pro[i].p_name,pro[i].price,pro[i].place,pro[i].stonum);
i++;
}
for(i=0;i<10;i++)
pro1[i]=pro[i]; //对备用结构体数组赋值
if((fclose(fp))) //关闭文件
{
printf("文件关闭失败\n"); //不能打开
exit(-1); //退出
}
printf("\t\t数据读入成功!按任意键继续......\n");
}
int keyboard() //键盘输入
{
int i;
FILE *fp; //指向文件的指针
if((fp=fopen("商品信息1.txt","w"))==NULL)//打开文件
{
printf("文件打开失败,请检查文件路径\n"); //不能打开
exit(-1); //退出
}
printf("************键盘输入商品信息*************\n");
for(i=0;i<10;i++)//循环创建链表元素
{
printf("输入第%d种商品的编号:",i+1);
scanf("%s",p_new->p_id);
printf("输入第%d种商品的名称:",i+1);
scanf("%s",p_new->p_name);
printf("输入第%d种商品的价格:",i+1);
scanf("%f",&(p_new->price));
printf("输入第%d种商品的产地:",i+1);
scanf("%s",p_new->place);
printf("输入第%d种商品的库存容量:",i+1);
scanf("%d",&p_new->stonum);
pro[i]=*p_new;
fprintf(fp,"%6d%6s%6.2f%6s%6d\n",pro[i].p_id,pro[i].p_name,&(pro[i].price),pro[i].place,&pro[i].stonum);
fclose(fp);
printf("数据输入成功! 请按任意键继续......");
}
}
void show() //显示现有的商品信息
{
int i=0;
system("cls"); /*清屏*/
printf("**************************商品信息**************************\n\n\n");
printf(" 商品编号 商品名称 商品价格 商品产地 库存数量\n");
for(;i<10;i++) //输出商品记录
{
printf("%8d%12s%12.2f%10s%14d\n",pro[i].p_id,pro[i].p_name,pro[i].price,pro[i].place,pro[i].stonum);
}
printf("\n\n查询完毕! 请按任意键返回.......\n");
}
void sale() //商品销售
{
int n,i=0,a;
s_new=(struct sell *)malloc(sizeof(struct sell));
if(NULL==s_new)//创建失败
{
printf("分配失败,程序终止!\n");
exit(-1);
}
c_new=(struct customer *)malloc(sizeof(struct customer));
if(NULL==c_new)//创建失败
{
printf("分配失败,程序终止!\n");
exit(-1);
}
s_new->next=NULL;
c_new->next=NULL;
printf("************请输入顾客的购买信息**********\n");
printf("顾客姓名");
scanf("%s",c_new->c_name); //输入时注意只准汉字,英文
printf("销售商品的编号"); //商品的编号
scanf("%s",s_new->p_id);
for(;;)
{
if(judge()==0)
{
printf("编号输入错误!不存在该编号的商品,请重新输入!\n");
printf("输入销售商品的编号");
scanf("%s",s_new->p_id);
continue;
}
printf("销售商品数量"); //输入商品数量
scanf("%d",s_new->num);
if(judge()==2)
{
printf("数量输入错误!请重新输入!\n");
printf("销售商品的数量");
scanf("%s",s_new->num);
continue;
}
if(judge()==3)
{
printf("数量超过库存!请重新输入!\n");
printf("现库存数量为:%d!\n",p_new->stonum);
printf("输入销售商品的数量");
scanf("%d",s_new->num);
continue;
}
printf("销售日期(格式为YYYY-MM-DD)");//输入日期
gets(s_new->s_date);
if(judge()==5)
{
printf("日期长度错误!请检查后重新输入!\n");
printf("输入销售日期(格式为YYYY-MM-DD)");
scanf("%s",s_new->s_date);
continue;
}
if(judge()==6)
{
printf("日期格式错误!请检查后重新输入!\n");
printf("输入销售日期(格式为YYYY-MM-DD)");
scanf("%s",s_new->s_date);
continue;
}
if(judge()==5)
{
printf("日期年、月、日错误!请检查后重新输入!\n");
printf("输入销售日期(格式为YYYY-MM-DD)");
scanf("%s",s_new->s_date);
continue;
}
srand(time(0));
a=rand();
if(judge()==1) //输入成功
{
s_new->c_id=a;
c_new->c_id=s_new->c_id; //分配随机的顾客编号
if(s_head==NULL) //将数据信息保存至链表
s_head=s_new;
else
s_tail->next=s_new;
s_tail=s_new;
if(c_head==NULL)
c_head=c_new;
else
c_tail->next=c_new;
c_tail=c_new;
printf("\t\t销售信息输入成功!按任意键继续......\n");
getch();
system("cls");
break;
}
}
}
int judge_date(char *s_date) //判断日期是否合法
{
int flag=0,n;
int year=(s_date[0]-48)*1000+(s_date[1]-48)*100+(s_date[2]-48)*10+(s_date[3]-48);
int month=(s_date[5]-48)*10+(s_date[6]-48);
int day=(s_date[8]-48)*10+(s_date[9]-48);
n=strlen(s_date);
if(n!=10) //判断日期长度为10
flag=1;
if(s_date[4]!='-'||s_date[7]!='-') //判断日期第5,8位是否为"-"
flag=2;
if(year>10000||year<1000||month>12||month<1||day>31||day<1) //判断年、月、日的范围
flag=3;
if(((year%4==0&&year%100!=0)||(year%400==0))&&month==2)//判断闰年
{
if(day>=30)
flag=3;
}
if(month==2&&day>=29)
flag=3;
if(month==2||month==4||month==6||month==9||month==11) //无论是否闰年,2,4,6,9,11月的天数是30天
if(day>30)
flag=3;
return flag;
}
int judge()//判断商品编号 数量 日期是否正确
{
int i,j=0,k,index;
for(i=0;i<10;i++) //判断是否存在
{
if(s_new->p_id==pro[i].p_id)
{
k=i;
index=pro[k].stonum;
j++;
if((pro[k].stonum-s_new->num)>=0)
break;
}
if(j==0)
return 0; //判断是否存在输入编号的商品
else if(s_new->num<=0)
return 2; //判断销售数量是否合法
else if(index-(int)s_new->num<0)
return 3; //判断输入量是否大于剩余库存量
else if(s_new->num-(int)s_new->num>=1e-6)
return 2; //商品销售量
else if(judge_date(s_new->s_date)==1)//判断日期长度
return 5;
else if(judge_date(s_new->s_date)==2)//判断日期的“-”
return 6;
else if(judge_date(s_new->s_date)==3)//判断日期天数合法
return 7;
else
return 1; //输入正确
}
void search_p_id() //根据商品编号查询商品的销售历史
{
int i,j=0,k=0,n=0;
int m;
struct sell *p;
p=(struct sell *)malloc(sizeof(struct sell));
system("cls");
printf("***********************商品查询系统************************\n\n");
printf("请输入商品编号:\n");
scanf("%d",&m);
for(i=0;i<=10;i++) //在商品信息结构体中遍历查找
if(m==pro[i].p_id)
{
j++;
break;
}
if(j==0)
{
system("cls");
printf("此商品不存在,请检查后按任意键重新输入....!\n");
getch();
system("cls");
return 0;
}
printf("***********************商品查询系统************************\n\n");
printf("商品编号 销售数量 销售总额 销售日期\n");
printf("-----------------------------------------------------------\n");
for(p=s_head;p;p=p->next)
if(m==p->p_id)
{
k++;
printf("%5d%20d%20.2f%15s\n",p->p_id,(int)p->num,(int)p->num*pro[i].price,p->s_date);
}
if(k==0)
{
printf("无该商品销售记录!按任意键返回......\n");
system("cls");
}
else
{
printf("\n\n查询完毕! 请按任意键继续......\n");
getch();
system("cls");
}
}
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<malloc.h>
#include<stdlib.h>
#include<conio.h>
#include<cstdlib>
/*结构体定义*/
struct product //定义商品结构体
{
int p_id;
char p_name[30];
float price;
char place[50];
int stonum;
struct product *next;
}pro[10],pro1[10];
struct product *p_head=NULL,*p_tail,*p_new;
struct customer //定义顾客结构体
{
int c_id;
char c_name[30];
struct customer *next;
};
struct customer *c_head=NULL,*c_tail,*c_new;
struct sell //定义商品销售结构体
{
int c_id;
char c_name[30];
int p_id;
int num;
char s_date[11];
struct sell *next;
};
struct sell * keyboard();
struct sell *s_head=NULL,*s_tail,*s_new;
struct date //定义时间结构体
{
int year,month,day;
};
void choice_read(); //选择导入商品信息的方式
void file_read(); //文件导入
int keyboard(); //键盘输入
void show(); //展示商品信息
void sale(); //销售
int judge_date(char *s_date);
int judge(); //判断商品编号 数量 日期是否正确
void search_p_id(); //根据商品编号查询商品的销售历史
void search_time(); //计算时间段内各个商品的销售总额
int date_y_bj(char *s_date); //判断日期
int date_mbj(char *s_date); //判断日期
int date_d_bj(char *s_date); //判断日期
int search_name(); //按顾客姓名查找销售记录
int list_name(); //显示顾客信息
void download_s(); //保存销售信息
void download_c(); //保存顾客信息
int menu(); //菜单
int hello(); //欢迎界面
int bye(); //结束界面
void choice_read()
{
int a;
printf("****************选择导入商品信息的方式*****************\n\n");
printf("*\t\t\n1:通过键盘输入\n\n\t\t2:通过文件导入(推荐)*\n\n");
printf("*******************************************************\n\n");
printf("\n您的选择:");
scanf("%d",&a);
if(a==1)
keyboard();
if(a==2)
file_read();
}
void file_read(){//读取文件函数
int i;
FILE *fp; //指向文件的指针
if((fp=fopen("商品信息.txt","r"))==NULL)//打开文件
{
printf("文件读入失败,请检查文件路径\n"); //不能打开
exit(-1); //退出
}
printf("*******************商品目录*********************\n");
printf("商品编号 商品名称 商品价格 商品产地 库存数量\n");
while(!feof(fp))
{ //读入文件
fscanf(fp,"%d%s%f%s%d",&pro[i].p_id,pro[i].p_name,&pro[i].price,pro[i].place,&pro[i].stonum);
printf("%-10d%-10s %-10.2f%-12s%-12d\n",pro[i].p_id,pro[i].p_name,pro[i].price,pro[i].place,pro[i].stonum);
i++;
}
for(i=0;i<10;i++)
pro1[i]=pro[i]; //对备用结构体数组赋值
if((fclose(fp))) //关闭文件
{
printf("文件关闭失败\n"); //不能打开
exit(-1); //退出
}
printf("\t\t数据读入成功!按任意键继续......\n");
}
int keyboard() //键盘输入
{
int i;
FILE *fp; //指向文件的指针
if((fp=fopen("商品信息1.txt","w"))==NULL)//打开文件
{
printf("文件打开失败,请检查文件路径\n"); //不能打开
exit(-1); //退出
}
printf("************键盘输入商品信息*************\n");
for(i=0;i<10;i++)//循环创建链表元素
{
printf("输入第%d种商品的编号:",i+1);
scanf("%s",p_new->p_id);
printf("输入第%d种商品的名称:",i+1);
scanf("%s",p_new->p_name);
printf("输入第%d种商品的价格:",i+1);
scanf("%f",&(p_new->price));
printf("输入第%d种商品的产地:",i+1);
scanf("%s",p_new->place);
printf("输入第%d种商品的库存容量:",i+1);
scanf("%d",&p_new->stonum);
pro[i]=*p_new;
fprintf(fp,"%6d%6s%6.2f%6s%6d\n",pro[i].p_id,pro[i].p_name,&(pro[i].price),pro[i].place,&pro[i].stonum);
fclose(fp);
printf("数据输入成功! 请按任意键继续......");
}
}
void show() //显示现有的商品信息
{
int i=0;
system("cls"); /*清屏*/
printf("**************************商品信息**************************\n\n\n");
printf(" 商品编号 商品名称 商品价格 商品产地 库存数量\n");
for(;i<10;i++) //输出商品记录
{
printf("%8d%12s%12.2f%10s%14d\n",pro[i].p_id,pro[i].p_name,pro[i].price,pro[i].place,pro[i].stonum);
}
printf("\n\n查询完毕! 请按任意键返回.......\n");
}
void sale() //商品销售
{
int n,i=0,a;
s_new=(struct sell *)malloc(sizeof(struct sell));
if(NULL==s_new)//创建失败
{
printf("分配失败,程序终止!\n");
exit(-1);
}
c_new=(struct customer *)malloc(sizeof(struct customer));
if(NULL==c_new)//创建失败
{
printf("分配失败,程序终止!\n");
exit(-1);
}
s_new->next=NULL;
c_new->next=NULL;
printf("************请输入顾客的购买信息**********\n");
printf("顾客姓名");
scanf("%s",c_new->c_name); //输入时注意只准汉字,英文
printf("销售商品的编号"); //商品的编号
scanf("%s",s_new->p_id);
for(;;)
{
if(judge()==0)
{
printf("编号输入错误!不存在该编号的商品,请重新输入!\n");
printf("输入销售商品的编号");
scanf("%s",s_new->p_id);
continue;
}
printf("销售商品数量"); //输入商品数量
scanf("%d",s_new->num);
if(judge()==2)
{
printf("数量输入错误!请重新输入!\n");
printf("销售商品的数量");
scanf("%s",s_new->num);
continue;
}
if(judge()==3)
{
printf("数量超过库存!请重新输入!\n");
printf("现库存数量为:%d!\n",p_new->stonum);
printf("输入销售商品的数量");
scanf("%d",s_new->num);
continue;
}
printf("销售日期(格式为YYYY-MM-DD)");//输入日期
gets(s_new->s_date);
if(judge()==5)
{
printf("日期长度错误!请检查后重新输入!\n");
printf("输入销售日期(格式为YYYY-MM-DD)");
scanf("%s",s_new->s_date);
continue;
}
if(judge()==6)
{
printf("日期格式错误!请检查后重新输入!\n");
printf("输入销售日期(格式为YYYY-MM-DD)");
scanf("%s",s_new->s_date);
continue;
}
if(judge()==5)
{
printf("日期年、月、日错误!请检查后重新输入!\n");
printf("输入销售日期(格式为YYYY-MM-DD)");
scanf("%s",s_new->s_date);
continue;
}
srand(time(0));
a=rand();
if(judge()==1) //输入成功
{
s_new->c_id=a;
c_new->c_id=s_new->c_id; //分配随机的顾客编号
if(s_head==NULL) //将数据信息保存至链表
s_head=s_new;
else
s_tail->next=s_new;
s_tail=s_new;
if(c_head==NULL)
c_head=c_new;
else
c_tail->next=c_new;
c_tail=c_new;
printf("\t\t销售信息输入成功!按任意键继续......\n");
getch();
system("cls");
break;
}
}
}
int judge_date(char *s_date) //判断日期是否合法
{
int flag=0,n;
int year=(s_date[0]-48)*1000+(s_date[1]-48)*100+(s_date[2]-48)*10+(s_date[3]-48);
int month=(s_date[5]-48)*10+(s_date[6]-48);
int day=(s_date[8]-48)*10+(s_date[9]-48);
n=strlen(s_date);
if(n!=10) //判断日期长度为10
flag=1;
if(s_date[4]!='-'||s_date[7]!='-') //判断日期第5,8位是否为"-"
flag=2;
if(year>10000||year<1000||month>12||month<1||day>31||day<1) //判断年、月、日的范围
flag=3;
if(((year%4==0&&year%100!=0)||(year%400==0))&&month==2)//判断闰年
{
if(day>=30)
flag=3;
}
if(month==2&&day>=29)
flag=3;
if(month==2||month==4||month==6||month==9||month==11) //无论是否闰年,2,4,6,9,11月的天数是30天
if(day>30)
flag=3;
return flag;
}
int judge()//判断商品编号 数量 日期是否正确
{
int i,j=0,k,index;
for(i=0;i<10;i++) //判断是否存在
{
if(s_new->p_id==pro[i].p_id)
{
k=i;
index=pro[k].stonum;
j++;
if((pro[k].stonum-s_new->num)>=0)
break;
}
if(j==0)
return 0; //判断是否存在输入编号的商品
else if(s_new->num<=0)
return 2; //判断销售数量是否合法
else if(index-(int)s_new->num<0)
return 3; //判断输入量是否大于剩余库存量
else if(s_new->num-(int)s_new->num>=1e-6)
return 2; //商品销售量
else if(judge_date(s_new->s_date)==1)//判断日期长度
return 5;
else if(judge_date(s_new->s_date)==2)//判断日期的“-”
return 6;
else if(judge_date(s_new->s_date)==3)//判断日期天数合法
return 7;
else
return 1; //输入正确
}
void search_p_id() //根据商品编号查询商品的销售历史
{
int i,j=0,k=0,n=0;
int m;
struct sell *p;
p=(struct sell *)malloc(sizeof(struct sell));
system("cls");
printf("***********************商品查询系统************************\n\n");
printf("请输入商品编号:\n");
scanf("%d",&m);
for(i=0;i<=10;i++) //在商品信息结构体中遍历查找
if(m==pro[i].p_id)
{
j++;
break;
}
if(j==0)
{
system("cls");
printf("此商品不存在,请检查后按任意键重新输入....!\n");
getch();
system("cls");
return 0;
}
printf("***********************商品查询系统************************\n\n");
printf("商品编号 销售数量 销售总额 销售日期\n");
printf("-----------------------------------------------------------\n");
for(p=s_head;p;p=p->next)
if(m==p->p_id)
{
k++;
printf("%5d%20d%20.2f%15s\n",p->p_id,(int)p->num,(int)p->num*pro[i].price,p->s_date);
}
if(k==0)
{
printf("无该商品销售记录!按任意键返回......\n");
system("cls");
}
else
{
printf("\n\n查询完毕! 请按任意键继续......\n");
getch();
system("cls");
}
}