回 帖 发 新 帖 刷新版面

主题:[讨论]跪谢!!求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");
    }
}
    
    
    
    

回复列表 (共7个回复)

沙发

接楼上!
void search_time()              //计算时间段内各个商品的销售总额
{      
    int i,n=0;
    struct sell *p,*q,*pt;
    system("cls");
    printf("请输入开始日期(格式为YYYY-MM-DD):");
    scanf("%s",p->s_date);
    system("cls");
    for(;;)
    { 
        if(judge_date(p->s_date)!=0)
        {      
            printf("输入日期不合法,请按格式重新输入(如1991-02-27):");
            scanf("%s",p->s_date);
            system("cls");
            continue;
        }
        else
            break;
    }
    
    printf("请输入结束日期(格式为YYYY-MM-DD):");
    scanf("%s",q->s_date);
    system("cls");
    
    for(;;)
    { 
        if(judge_date(q->s_date)!=0)
        {      
            printf("输入日期不合法,请按格式重新输入(如1991-02-27):");
            scanf("%s",q->s_date);
            system("cls");
            continue;
        }
        else
            break;
    }
    printf("***********************商品查询系统************************\n\n");
    printf("    **********查询%s至%s时段的商品销售总额********\n\n",p->s_date,q->s_date);
    printf("\n\n\t\t商品编号    商品名称       销售总额\n");
    printf("\t\t-------------------------------------\n\n");
    
    for(pt=s_head;pt;pt=pt->next)
    {
        if(date_y_bj(char *(p->s_date))<=date_y_bj(char *(pt->s_date))&&date_y_bj(char *(q->s_date))>=date_y_bj(char *(pt->s_date)))
        {
            if(date_m_bj(char *(p->s_date))<=date_m_bj(char *(pt->s_date))&&date_m_bj(char *(q->s_date))>=date_m_bj(char *(pt->s_date)))
            {
                if(date_d_bj(char *(p->s_date))<=date_d_bj(char *(pt->s_date))&&date_d_bj(char *(q->s_date))>=date_d_bj(char *(pt->s_date)))
                {
                    for(i=0;i<10;i++)
                    {
                        if(pro1[i].p_id==pt->p_id) 
                        break;
                    }
                    pro1[i].stonum-=(int)pt->num;
                }
            }
        }
    }
    for(i=0;i<10;i++)
        printf("\t\t%2d\t\t%8s%.2f\n",pro1[i].p_id,pro1[i].p_name,pro1[i].price*(1000-pro1[i].stonum));
    printf("\n\n查询完毕!请按任意键返回菜单......");
    getch(); 
    system("cls");
}

int date_y_bj(char *s_date)            //判断日期
{
    int n;
    int year=(s_date[0]-48)*1000+(s_date[1]-48)*100+(s_date[2]-48)*10+(s_date[3]-48);
    n=year;
    return n;
}
int date_m_bj(char *s_date)            //判断日期
{
    int n;
    int month=(s_date[5]-48)*10+(s_date[6]-48);
    n=month;
    return n;
}
int date_d_bj(char *s_date)            //判断日期
{
    int n;
    int day=(s_date[8]-48)*10+(s_date[9]-48);
    n=day;
    return n;
}

板凳

接楼上!!
void list_name()                //显示所有顾客的姓名
{   
    struct customer *q;
    system("cls");
    if(c_head!=NULL)//判断链表是否为空
    {
        printf("******************顾客姓名表***************\n");//用来显示所有顾客的姓名
        for(q=c_head;q;q=q->next)
        { 
            printf("\t\t  %s\n",q->c_name);
        }
        printf("\n\n查询完毕,请按任意键返回菜单......");       
        getch();
        system("cls");
    }
    else
    {
        printf("无顾客记录!!!请按任意键返回菜单......");
        getch();
        system("cls");
    }

}

void download_s()//保存销售信息(顾客代码,销售数量、销售日期)文件
{
    int i=0;
    struct customer *q;
    struct sell *p;
    system("cls");
    
    FILE * fp;
    if((fp=fopen("商品销售信息.txt","a"))==NULL)
    {       
        printf("销售信息文件无法打开!\n");
        exit(-1);
    }
    if(c_head!=NULL)
    {
        fprintf(fp,"****************销售信息************\n");
        fprintf(fp,"  顾客代码    销售数量      购买日期\n");
        for(q=c_head;q;q=q->next)
        {       
            for(p=s_head;p;p=p->next)
                if(q->c_id==p->c_id)
                {       
                    for(i=0;i<10;i++)
                        if(p->p_id==pro[i].p_id) 
                            break;
                    break;
                }
            fprintf(fp,"%8d%10d%10s\n",q->c_id,(int)p->num,p->s_date);
        }
        fprintf(fp,"****************************************");
        fclose(fp);
        printf("销售信息文件保存完毕!请按任意键返回菜单......\n");
        getch();
        system("cls");
    }
    else
    {
        printf("顾客记录为空!!!请在您的d盘中找到“商品销售信息.txt”文件进行查看。\n按任意键返回菜单......");
        getch();
        system("cls");
    }
}

3 楼

接楼上!!
void download_c()//导出顾客购买记录
{       
    int i=0;
    struct customer *q;
    struct sell *p;
    system("cls");    
    
    FILE *fp;
    if((fp=fopen("d:\\顾客购买信息.txt","w"))==NULL)
    {       
        printf("顾客信息文件无法生成!\n");
        exit(-1);
    }
    if(c_head!=NULL)
    {
        fprintf(fp,"********顾客购买记录****** \n");
        fprintf(fp,"  顾客姓名      顾客代码  \n");
        for(q=c_head;q;q=q->next)
        {       
            for(p=s_head;p;p=p->next)
            if(q->c_id==p->c_id) 
            {       
                for(i=0;i<10;i++)
                if(p->p_id==pro1[i].p_id) 
                    break;
            break;
            }
            fprintf(fp,"%5s%10d\n",q->c_name,q->c_id);
        }
        fprintf(fp,"*****************************\n");
        fclose(fp);
        printf("顾客购买信息文件保存完毕!!!请在您的d盘中找到“顾客购买信息.txt”文件进行查看。\n按任意键返回菜单......");
        getch();
        system("cls");
    }
    else
    {
        printf("顾客记录为空!!!按任意键继续......");
        getch();
        system("cls");
    }
}

void main()            //主函数
{
    hello();
    menu();
}
    

4 楼

接楼上!!

int    menu()  //菜单
{
    int choice;
    for(;;)
    { 
        printf("**************************欢迎使用商品销售管理系统!**********************\n*                                                                       *\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("*                    0. 退出                                            *\n");
        printf("*************************************************************************\n");
        printf("请选择不同功能 输入0----9的数字\n");
        scanf("%d",&choice);
    
        system("cls");  
    
        switch(choice)
        {
            case 1:
                choice_read();
                system("cls");
                break;
            case 2:
                show();
                break;
            case 3:
                sale();
                break;
            case 4:
                search_p_id();
                break;
            case 5:
                search_time();
                break;
            case 6:
                search_name();
                break;
            case 7:
                list_name();
                 break;
            case 8:
                download_s();
                break;
            case 9:
                download_c();
                break;
            case 0:
                printf("\n\n\n\n");
                bye();
                break;
            default :
            {    
                getch();
                printf("\n 选择错误,请正确输入你的选择(0~9),:\n");
                printf("\n 按任意键返回......\n");
                menu();
                system("cls");        /*清屏*/
            }
        }
    }
}

5 楼

接楼上!!

int hello()
{
    printf("****************************************************************\n");
    printf("*                                                              *\n");
    printf("*             欢迎使用商品销售管理系统v1.0!!!                  *\n");
    printf("*                                                              *\n");
    printf("*    本销售管理系统是针对销售部门开发的一款简单的管理系统,这是 *\n");
    printf("*作者本人第一份作品,限于作者本人的水平,该系统功能较为简单,     *\n");
    printf("*不太稳定,不足之处望大家指点纠正。                             *\n");
    printf("*                                                               *\n");
    printf("*                                                              *\n");
    printf("*作者:余勇   单位:湖北汽车工业学院电气与信息工程学院T1023-11班 *\n");
    printf("*                                                              *\n");
    printf("*特别鸣谢:      T1023-11班导生 何德健                          *\n");
    printf("*               热心网友                                       *\n");
    printf("*                                                              *\n");
    printf("***************您的使用是对我的莫大的支持***********************\n\n\n");
    printf("按任意键进入系统菜单......");
    getch();
    system("cls");
}

int bye()
{
    printf("****************************************************************\n");
    printf("*                                                              *\n");
    printf("*             感谢使用商品销售管理系统!!!                      *\n");
    printf("*                                                              *\n");
    printf("*   系统不太完善,不足之处望大家指点纠正。                      *\n");
    printf("*   若有好的建议,请与我联系,共同学习和探讨,本人将不胜感激!!!   *\n");
    printf("*                                                               *\n");
    printf("*                                                              *\n");
    printf("*作者:余勇   单位:湖北汽车工业学院电气与信息工程学院T1023-11班 *\n");
    printf("*                                                              *\n");
    printf("****************************************************************\n");
}


本人QQ 334628778  

6 楼

楼主应该把代码放到附件里.
一编译,语法错误太多了。代码又太乱了,看了头痛。

还有,给个小建议:自定义的类型 可以首字母大写;函数名,变量名首字母小写;某些静态变量名,私有变量 '_'开头。

7 楼

[quote]楼主应该把代码放到附件里.
一编译,语法错误太多了。代码又太乱了,看了头痛。

还有,给个小建议:自定义的类型 可以首字母大写;函数名,变量名首字母小写;某些静态变量名,私有变量 '_'开头。[/quote]
[em9][em9]同windyowill兄。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册