AC_wy 2023-04-06 23:47 采纳率: 83.3%
浏览 34
已结题

c语言小超市管理系统

小超市管理系统
创建完商品档案进行其他功能时,文件里的数据变成乱码...

```c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define MAXSIZE 50
#define SIZESG sizeof(struct Goods)
#define SIZEJD sizeof(struct Jd)

struct Goods
{
    char id[20];/*编号*/
    char name[20];/*品名*/
    double purchase_price;/*进价*/
    double selling_price;/*售价*/
    int purchase_quantity;/*进货量*/
    int sales_volume;/*销售量*/
    double amount;/*销售额*/
    int remaining_quantity;/*剩余数*/
    double gross_profit;/*毛利*/
};
struct Jd
{
    struct Goods goods;
    struct Jd *next;
};


void menu();/*菜单*/
void createFile(char *FName);/*创建文件,存放结构体数据*/
struct Jd *createchain(char *FName);/*利用文件创建链表*/
void edit(struct Jd *head);/*修改商品信息*/
void del(struct Jd *head);/*删除原有商品*/
void purchase(struct Jd *head);/*处理原有商品的新进货量*/
void sales(struct Jd *head);/*处理原有商品的新销售量*/
void baofei(struct Jd *head);/*处理原有商品的报废量*/
void sale(struct Jd *head);/*统计销售情况*/
void namechaxun(struct Jd *head);/*根据商品品名查询*/
void shuchaxun(struct Jd *head);/*根据剩余数查询*/
void xianshi(struct Jd *head);/*按原有顺序显示*/
void amountxianshi(struct Jd *head);/*销售额*/
void profitxianshi(struct Jd *head);/*毛利*/
void WriteToFile(struct Jd *head,char *FName);/*数据写入文件*/


int main()
{
    struct Jd *head=NULL;
    char FileName[128]={'\0'};
    strcpy(FileName,"data.txt");
    int i;
    while(1)
    {
        menu();
        scanf("%d",&i);
        switch(i)
        {
        case 0:
            system("cls");
            printf("已退出系统!");
            exit(0);
        case 1:
            system("cls");
            createFile(FileName);
            break;
        case 2:
            system("cls");
            head=createchain(FileName);
            edit(head);
            WriteToFile(head,FileName);
            break;
        case 3:
            system("cls");
            head=createchain(FileName);
            del(head);
            WriteToFile(head,FileName);
            break;
        case 4:
            system("cls");
            head=createchain(FileName);
            purchase(head);
            WriteToFile(head,FileName);
            break;
        case 5:
            system("cls");
            head=createchain(FileName);
            sales(head);
            WriteToFile(head,FileName);
            break;
        case 6:
            system("cls");
            head=createchain(FileName);
            baofei(head);
            WriteToFile(head,FileName);
            break;
        case 7:
            system("cls");
            head=createchain(FileName);
            sale(head);
            WriteToFile(head,FileName);
            break;
        case 8:
            system("cls");
            head=createchain(FileName);
            namechaxun(head);
            break;
        case 9:
            system("cls");
            head=createchain(FileName);
            shuchaxun(head);
            break;
        case 10:
            system("cls");
            head=createchain(FileName);
            xianshi(head);
            break;
        case 11:
            system("cls");
            head=createchain(FileName);
            amountxianshi(head);
            break;
        case 12:
            system("cls");
            head=createchain(FileName);
            profitxianshi(head);
            break;
        }
    }
}


/*菜单*/
void menu()
{
    printf("-------------------菜单-------------------\n");
    printf("|      0. 退出系统                       |\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("|      11.按销售额由高到低的顺序显示     |\n");
    printf("|      12.按毛利由高到低的顺序显示       |\n");
    printf("|      13.添加新商品                     |\n");
    printf("------------------------------------------");
    printf("\n");
    printf("\n");
    printf("请选择您要进行的操作选项:   ");
}



/*创建文件,存放结构体数据*/
void createFile(char *FName)
{
    int i=1;
    struct Goods go;
    FILE *fp;
    if((fp=fopen(FName,"w"))==NULL)
    {
        printf("文件打开失败!\n");
        exit(0);
    }
    while(i!=0)/*给结构体各成员变量赋值*/
    {
        printf("创建商品档案:\n");
        printf("请输入商品编号: ");
        scanf("%s",go.id);
        printf("请输入商品品名: ");
        scanf("%s",go.name);
        printf("请输入商品进价: ");
        scanf("%lf",&go.purchase_price);
        printf("请输入商品售价: ");
        scanf("%lf",&go.selling_price);
        printf("请输入商品进货量: ");
        scanf("%d",&go.purchase_quantity);
        printf("请输入商品销售量: ");
        scanf("%d",&go.sales_volume);
        go.amount=(go.selling_price)*(go.sales_volume);
        printf("该商品销售额为: %lf\n",go.amount);
        go.remaining_quantity=(go.purchase_quantity)-(go.sales_volume);
        printf("该商品剩余数为: %d\n",go.remaining_quantity);
        go.gross_profit=(go.amount)-(go.purchase_price)*(go.sales_volume);
        printf("该商品毛利为: %lf\n",go.gross_profit);
        fprintf(fp,"%s %s %lf %lf %d %d %lf %d %lf\n",go.id,go.name,go.purchase_price,go.selling_price,go.purchase_quantity,go.sales_volume,go.amount,go.remaining_quantity,go.gross_profit);
        printf("是否需要输入新的数据(1=继续,0=退出)?");
        scanf("%d",&i);
    }
    fclose(fp);
}


/*利用文件创建链表*/
struct Jd *createchain(char *FName)
{
    FILE *fp;
    struct Jd *pt,*pEnd,*head=NULL;
    struct Goods go;
    if((fp=fopen(FName,"r"))==NULL)
    {
        printf("文件打开失败!\n");
        exit(0);
    }
    while(fscanf(fp,"%s %s %lf %lf %d %d %lf %d %lf\n",go.id,go.name,&go.purchase_price,&go.selling_price,&go.purchase_quantity,&go.sales_volume,&go.amount,&go.remaining_quantity,&go.gross_profit)!=EOF) /*从文件里读出一个结构体数据*/
    {
        pt=(struct Jd *)malloc(SIZEJD);  /*创建链表结点空间*/
        pt->goods=go;/*把前面读出的结构体数据赋值给结点的goods变量*/
        if(head==NULL)/*如果链表以前是空,则生成头结点*/
        {
            head=pt;
            pEnd=pt;
            pt->next=NULL;
        }
        else  /*在尾部插入结点*/
        {
            pEnd->next=pt;/*将新结点链入链表*/
            pt->next=NULL;/*将新结点的next指针置空,标识成尾结点*/
            pEnd=pt;/*让pEnd指向尾结点,为下一次插入做准备*/
        }
    }
    fclose(fp);
    return head;
};


/*修改商品信息*/
void edit(struct Jd *head)
{
    struct Jd *p=head,*p1=head;
    int flag=0;
    char num[MAXSIZE];
    printf("请输入需修改的商品的编号: \n");
    scanf("%s",num);
    while(p1)
    {
        if(strcmp(num,p1->goods.id)==0)
        {
            flag=1;
            break;
        }
        p1=p1->next;
    }
    if(flag==1)
    {
        while(p)
        {
            if(strcmp(num,p->goods.id)==0)
            {
                printf("请输入商品编号: \n");
                scanf("%s",p->goods.id);
                printf("请输入商品品名: \n");
                scanf("%s",p->goods.name);
                printf("请输入商品进价: \n");
                scanf("%lf",&p->goods.purchase_price);
                printf("请输入商品售价: \n");
                scanf("%lf",&p->goods.selling_price);
                printf("请输入商品进货量: \n");
                scanf("%d",&p->goods.purchase_quantity);
                printf("请输入商品销售量: \n");
                scanf("%d",&p->goods.sales_volume);
                p->goods.amount=(p->goods.sales_volume)*(p->goods.selling_price);
                printf("该商品销售额为: %lf\n",p->goods.amount);
                p->goods.remaining_quantity=(p->goods.purchase_quantity)-(p->goods.sales_volume);
                printf("该商品剩余数为: %d\n",p->goods.remaining_quantity);
                p->goods.gross_profit=(p->goods.amount)-(p->goods.purchase_price)*(p->goods.sales_volume);
                printf("该商品毛利为: %lf\n",p->goods.gross_profit);
                printf("\n");
                printf("修改成功!\n");
            }
            p=p->next;
        }
    }
    else
        printf("该商品不存在!\n");
}


/*删除原有商品*/
void del(struct Jd *head)
{
    int flag=0;
    struct Jd *p=head,*p1=head;
    char num[MAXSIZE];
    printf("请输入要删除的商品编号: ");
    scanf("%s",num);
    while(p1)
    {
        if(strcmp(num,p1->goods.id)==0)
        {
            flag=1;
            break;
        }
        p1=p1->next;
    }
    if(flag==1)
    {
        if(strcmp(num,p->goods.id)==0)
        {
            head=p->next;
            printf("删除成功!\n");
        }
        else
        {
            while(p)
            {
                if(p->next&&strcmp(num,p->next->goods.id)==0)
                {
                    p->next=p->next->next;
                    printf("删除成功!\n");
                }
                p=p->next;
            }
        }
    }
    else
        printf("该商品不存在!\n");
}


/*处理原有商品的新进货量*/
void purchase(struct Jd *head)
{
    int flag=0,num;
    struct Jd *p=head,*p1=head,*p2;
    p2=(struct Jd *)malloc(SIZEJD);
    p2->next=NULL;
    printf("请输入商品编号: \n");
    scanf("%s",p2->goods.id);
    while(p)
    {
        if(strcmp(p2->goods.id,p->goods.id)==0)
        {
            flag=1;
            break;
        }
        p=p->next;
    }
    if(flag==1)
    {
        printf("请输入商品新进货量: \n");
        scanf("%d",&num);
        while(p1)
        {
            if(strcmp(p1->goods.id,p2->goods.id)==0)
            {
                p1->goods.purchase_quantity+=num;
                p1->goods.remaining_quantity+=num;
            }
            p1=p1->next;
        }
    }
    else
        printf("该商品不存在!");
}


/*处理原有商品的新销售量*/
void sales(struct Jd *head)
{
    int flag=0,num;
    struct Jd *p=head,*p1=head,*p2;
    p2=(struct Jd *)malloc(SIZEJD);
    p2->next=NULL;
    printf("请输入商品编号: \n");
    scanf("%s",p2->goods.id);
    while(p)
    {
        if(strcmp(p2->goods.id,p->goods.id)==0)
        {
            flag=1;
            break;
        }
        p=p->next;
    }
    if(flag==1)
    {
        printf("请输入商品新销售量: \n");
        scanf("%d",&num);
        while(p1)
        {
            if(strcmp(p1->goods.id,p2->goods.id)==0)
            {
                p1->goods.sales_volume+=num;
                p1->goods.remaining_quantity-=num;
            }
            p1=p1->next;
        }
    }
    else
        printf("该商品不存在!\n");
}


/*处理原有商品的报废量*/
void baofei(struct Jd *head)
{
    int flag=0,num;
    struct Jd *p=head,*p1=head,*p2;
    p2=(struct Jd *)malloc(SIZEJD);
    p2->next=NULL;
    printf("请输入商品编号: \n");
    scanf("%s",p2->goods.id);
    while(p)
    {
        if(strcmp(p2->goods.id,p->goods.id)==0)
        {
            flag=1;
            break;
        }
        p=p->next;
    }
    if(flag==1)
    {
        printf("请输入商品报废量: \n");
        scanf("%d",&num);
        while(p1)
        {
            if(strcmp(p1->goods.id,p2->goods.id)==0)
            {
                if(p1->goods.remaining_quantity>=num)
                    p1->goods.remaining_quantity-=num;
                else
                {
                    printf("数据不合理!\n");
                    break;
                }
            }
            p1=p1->next;
        }
    }
    else
        printf("该商品不存在!\n");
}


/*统计销售情况*/
void sale(struct Jd *head)
{
    int flag=0;
    struct Jd *p=head,*p1=head,*p2;
    p2=(struct Jd *)malloc(SIZEJD);
    p2->next=NULL;
    printf("请输入商品编号: \n");
    scanf("%s",p2->goods.id);
    while(p)
    {
        if(strcmp(p2->goods.id,p->goods.id)==0)
        {
            flag=1;
            break;
        }
        p=p->next;
    }
    if(flag==1)
    {
        while(p1)
        {
            if(strcmp(p1->goods.id,p2->goods.id)==0)
            {
                printf("该商品的销售额为: %lf\n",p1->goods.amount);
                printf("该商品的剩余数为: %d\n",p1->goods.remaining_quantity);
                p->goods.gross_profit=(p->goods.amount)-(p->goods.purchase_price)*(p->goods.sales_volume);
                printf("该商品的毛利为: %lf\n",p1->goods.gross_profit);
            }
            p1=p1->next;
        }
    }
    else
        printf("该商品不存在!\n");
}


/*根据商品名查询*/
void namechaxun(struct Jd *head)
{
    struct Jd *p=head,*p1=head;
    int flag=0;
    char name[MAXSIZE];
    printf("请输入要查询的商品品名: ");
    scanf("%s",name);
    while(p)
    {
        if(strcmp(p->goods.name,name)==0)
        {
            flag=1;
            break;
        }
        p=p->next;
    }
    if(flag==1)
    {
        while(p1)
        {
            if(strcmp(p1->goods.name,name)==0)
            {
                printf("商品编号: %s\n",p1->goods.id);
                printf("商品品名: %s\n",p1->goods.name);
                printf("商品进价: %lf\n",p1->goods.purchase_price);
                printf("商品售价: %lf\n",p1->goods.selling_price);
                printf("商品进货量: %d\n",p1->goods.purchase_quantity);
                printf("商品销售量: %d\n",p1->goods.sales_volume);
                printf("商品销售额: %lf\n",p1->goods.amount);
                printf("商品剩余数: %d\n",p1->goods.remaining_quantity);
                printf("商品毛利: %lf\n",p1->goods.gross_profit);
            }
            p1=p1->next;
        }
    }
    else
        printf("该商品不存在!\n");
}


/*根据剩余数查询*/
void shuchaxun(struct Jd *head)
{
    struct Jd *p=head;
    int s,b;
    int flag=0;
    printf("请输入查询区间: \n");
    scanf("%d%d",&s,&b);
    if(s>b)
        printf("输入错误,请重新输入!\n");
    else
    {
        while(p)
        {
            if(p->goods.remaining_quantity>=s&&p->goods.remaining_quantity<=b)
            {
                flag=1;
                printf("商品编号: %s\n",p->goods.id);
                printf("商品品名: %s\n",p->goods.name);
                printf("商品进价: %lf\n",p->goods.purchase_price);
                printf("商品售价: %lf\n",p->goods.selling_price);
                printf("商品进货量: %d\n",p->goods.purchase_quantity);
                printf("商品销售量: %d\n",p->goods.sales_volume);
                printf("商品销售额: %lf\n",p->goods.amount);
                printf("商品剩余数: %d\n",p->goods.remaining_quantity);
                printf("商品毛利: %lf\n",p->goods.gross_profit);
            }
            p=p->next;
        }
        if(flag==0)
            printf("未找到任何记录!\n");
    }
}


/*按原来商品顺序显示*/
void xianshi(struct Jd *head)
{
    struct Jd *p=head;
    if(p!=NULL)
    {
        while(p!=NULL)
        {
            printf("商品编号: %s\n",p->goods.id);
            printf("商品品名: %s\n",p->goods.name);
            printf("商品进价: %lf\n",p->goods.purchase_price);
            printf("商品售价: %lf\n",p->goods.selling_price);
            printf("商品进货量: %d\n",p->goods.purchase_quantity);
            printf("商品销售量: %d\n",p->goods.sales_volume);
            printf("商品销售额: %lf\n",p->goods.amount);
            printf("商品剩余数: %d\n",p->goods.remaining_quantity);
            printf("商品毛利: %lf\n",p->goods.gross_profit);
            p=p->next;
        }
    }
    else
        printf("暂无商品信息!\n");
}


/*按销售额排序显示*/
void amountxianshi(struct Jd *head)
{
    struct Jd *pt1,*pt2,*pt;
    struct Goods temp;
    for(pt1=head;pt1->next!=NULL;pt1=pt1->next)
    {
        pt=pt1;
        for(pt2=pt1->next;pt2!=NULL;pt2=pt2->next)
        {
            if(pt->goods.amount>pt2->goods.amount)
                pt=pt2;
        }
        if(pt!=pt1)
        {
            temp=pt1->goods;
            pt1->goods=pt->goods;
            pt->goods=temp;
        }
    }
    xianshi(head);
}


/*按毛利显示*/
void profitxianshi(struct Jd *head)
{
    struct Jd *pt1,*pt2,*pt;
    struct Goods temp;
    for(pt1=head;pt1->next!=NULL;pt1=pt1->next)
    {
        pt=pt1;
        for(pt2=pt1->next;pt2!=NULL;pt2=pt2->next)
        {
            if(pt->goods.gross_profit>pt2->goods.gross_profit)
                pt=pt2;
        }
        if(pt!=pt1)
        {
            temp=pt1->goods;
            pt1->goods=pt->goods;
            pt->goods=temp;
        }
    }
    xianshi(head);
}


/*把链表结点数据写往文件*/
void WriteToFile(struct Jd *head,char *FName)
{
    struct Goods go;
    FILE *fp;
    struct Jd *pt;
    if((fp=fopen(FName,"w"))==NULL)
    {
        printf("文件打开失败!");
        exit(0);
    }
    pt=head;
    while(pt!=NULL)
    {
        fprintf(fp,"%s %s %lf %lf %d %d %lf %d %lf\n",go.id,go.name,go.purchase_price,go.selling_price,go.purchase_quantity,go.sales_volume,go.amount,go.remaining_quantity,go.gross_profit);
        pt=pt->next;
    }
    fclose(fp);
}




```

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2023-04-07 10:18
    关注

    对主函数,void createFile(char* FName);创建文件存放结构体数据函数,void edit(struct Jd* head) 修改商品信息函数,void del(struct Jd** head) 删除原有商品函数,void WriteToFile(struct Jd* head, char* FName)把链表结点数据写往文件函数,做了修改,改动处见注释。其余的几个函数虽然可以正常运行,但代码写的冗余,留给题主优化。

    //小超市管理系统
    //创建完商品档案进行其他功能时,文件里的数据变成乱码...
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    #define MAXSIZE 50
    #define SIZESG sizeof(struct Goods)
    #define SIZEJD sizeof(struct Jd)
    
    struct Goods
    {
        char   id[20];/*编号*/
        char   name[20];/*品名*/
        double purchase_price;/*进价*/
        double selling_price;/*售价*/
        int    purchase_quantity;/*进货量*/
        int    sales_volume;/*销售量*/
        double amount;/*销售额*/
        int    remaining_quantity;/*剩余数*/
        double gross_profit;/*毛利*/
    };
    struct Jd
    {
        struct Goods goods;
        struct Jd* next;
    };
    
    
    void menu();/*菜单*/
    void createFile(char* FName);/*创建文件,存放结构体数据*/
    struct Jd* createchain(char* FName);/*利用文件创建链表*/
    void edit(struct Jd* head);/*修改商品信息*/
    void del(struct Jd** head);/*删除原有商品*/                //修改
    void purchase(struct Jd* head);/*处理原有商品的新进货量*/
    void sales(struct Jd* head);/*处理原有商品的新销售量*/
    void baofei(struct Jd* head);/*处理原有商品的报废量*/
    void sale(struct Jd* head);/*统计销售情况*/
    void namechaxun(struct Jd* head);/*根据商品品名查询*/
    void shuchaxun(struct Jd* head);/*根据剩余数查询*/
    void xianshi(struct Jd* head);/*按原有顺序显示*/
    void amountxianshi(struct Jd* head);/*销售额*/
    void profitxianshi(struct Jd* head);/*毛利*/
    void WriteToFile(struct Jd* head, char* FName);/*数据写入文件*/
    
    
    int main()
    {
        struct Jd* head = NULL;
        char FileName[128] = { "data.txt" };//修改 
        //strcpy(FileName, "data.txt");     //修改
        int i;
        while (1)
        {
            menu();
            scanf("%d", &i);
            switch (i)
            {
            case 0:
                system("cls");
                printf("已退出系统!");
                exit(0);
            case 1:
                system("cls");
                createFile(FileName);
                break;
            case 2:
                system("cls");
                head = createchain(FileName);
                edit(head);
                WriteToFile(head, FileName);
                break;
            case 3:
                system("cls");
                head = createchain(FileName);
                del(&head);                    //修改
                WriteToFile(head, FileName);
                break;
            case 4:
                system("cls");
                head = createchain(FileName);
                purchase(head);
                WriteToFile(head, FileName);
                break;
            case 5:
                system("cls");
                head = createchain(FileName);
                sales(head);
                WriteToFile(head, FileName);
                break;
            case 6:
                system("cls");
                head = createchain(FileName);
                baofei(head);
                WriteToFile(head, FileName);
                break;
            case 7:
                system("cls");
                head = createchain(FileName);
                sale(head);
                WriteToFile(head, FileName);
                break;
            case 8:
                system("cls");
                head = createchain(FileName);
                namechaxun(head);
                break;
            case 9:
                system("cls");
                head = createchain(FileName);
                shuchaxun(head);
                break;
            case 10:
                system("cls");
                head = createchain(FileName);
                xianshi(head);
                break;
            case 11:
                system("cls");
                head = createchain(FileName);
                amountxianshi(head);
                break;
            case 12:
                system("cls");
                head = createchain(FileName);
                profitxianshi(head);
                break;
            default:break;                   //修改
            }
        }
    }
    
    
    /*菜单*/
    void menu()
    {
        printf("-------------------菜单-------------------\n");
        printf("|      0. 退出系统                       |\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("|      11.按销售额由高到低的顺序显示     |\n");
        printf("|      12.按毛利由高到低的顺序显示       |\n");
        printf("|      13.添加新商品                     |\n");
        printf("------------------------------------------");
        printf("\n");
        printf("\n");
        printf("请选择您要进行的操作选项:   ");
    }
    
    
    
    /*创建文件,存放结构体数据*/
    void createFile(char* FName)
    {
        int i = 1;
        struct Goods go;
        FILE* fp;
        if ((fp = fopen(FName, "a+")) == NULL) //修改
            //if ((fp = fopen(FName, "w")) == NULL)  
        {
            printf("文件打开失败!\n");
            exit(0);
        }
        while (i != 0)/*给结构体各成员变量赋值*/
        {
            printf("创建商品档案:\n");
            printf("请输入商品编号: ");
            scanf("%s", go.id);
            printf("请输入商品品名: ");
            scanf("%s", go.name);
            printf("请输入商品进价: ");
            scanf("%lf", &go.purchase_price);
            printf("请输入商品售价: ");
            scanf("%lf", &go.selling_price);
            printf("请输入商品进货量: ");
            scanf("%d", &go.purchase_quantity);
            printf("请输入商品销售量: ");
            scanf("%d", &go.sales_volume);
            go.amount = (go.selling_price) * (go.sales_volume);
            printf("该商品销售额为: %lf\n", go.amount);
            go.remaining_quantity = (go.purchase_quantity) - (go.sales_volume);
            printf("该商品剩余数为: %d\n", go.remaining_quantity);
            go.gross_profit = (go.amount) - (go.purchase_price) * (go.sales_volume);
            printf("该商品毛利为: %lf\n", go.gross_profit);
            fprintf(fp, "%s %s %lf %lf %d %d %lf %d %lf\n", go.id, go.name, go.purchase_price, go.selling_price, 
                      go.purchase_quantity, go.sales_volume, go.amount, go.remaining_quantity, go.gross_profit);
            printf("是否需要输入新的数据(1=继续,0=退出)?");
            scanf("%d", &i);
        }
        fclose(fp);
    }
    
    
    /*利用文件创建链表*/
    struct Jd* createchain(char* FName)
    {
        FILE* fp;
        struct Jd* pt, * pEnd, * head = NULL;
        struct Goods go;
        if ((fp = fopen(FName, "r")) == NULL)
        {
            printf("文件打开失败!\n");
            return head;  //exit(0);
        }
        while (fscanf(fp, "%s %s %lf %lf %d %d %lf %d %lf\n", go.id, go.name, &go.purchase_price, &go.selling_price,      //修改 
                     &go.purchase_quantity, &go.sales_volume, &go.amount, &go.remaining_quantity, &go.gross_profit) == 9) //修改
            //&go.purchase_quantity, &go.sales_volume, &go.amount, &go.remaining_quantity, &go.gross_profit) != EOF) /*从文件里读出一个结构体数据*/
        {
            pt = (struct Jd*)malloc(SIZEJD);  /*创建链表结点空间*/
            pt->goods = go;/*把前面读出的结构体数据赋值给结点的goods变量*/
            pt->next = NULL;                                               //修改
            if (head == NULL)/*如果链表以前是空,则生成头结点*/
            {
                head = pt;
                pEnd = pt;
            }
            else  /*在尾部插入结点*/
            {
                pEnd->next = pt;/*将新结点链入链表*/
                pEnd = pt;/*让pEnd指向尾结点,为下一次插入做准备*/
            }
        }
        fclose(fp);
        return head;
    };
    
    
    /*修改商品信息*/
    void edit(struct Jd* head)            //修改
    {
        struct Jd* p = head, * p1 = head;
        int flag = 0;
        char num[MAXSIZE];
        printf("请输入需修改的商品的编号: \n");
        scanf("%s", num);
        while (p)
        {
            if (strcmp(num, p->goods.id) == 0)  
            {
                flag = 1;
                printf("请输入商品编号: \n");
                scanf("%s", p->goods.id);
                printf("请输入商品品名: \n");
                scanf("%s", p->goods.name);
                printf("请输入商品进价: \n");
                scanf("%lf", &p->goods.purchase_price);
                printf("请输入商品售价: \n");
                scanf("%lf", &p->goods.selling_price);
                printf("请输入商品进货量: \n");
                scanf("%d", &p->goods.purchase_quantity);
                printf("请输入商品销售量: \n");
                scanf("%d", &p->goods.sales_volume);
                p->goods.amount = (p->goods.sales_volume) * (p->goods.selling_price);
                printf("该商品销售额为: %lf\n", p->goods.amount);
                p->goods.remaining_quantity = (p->goods.purchase_quantity) - (p->goods.sales_volume);
                printf("该商品剩余数为: %d\n", p->goods.remaining_quantity);
                p->goods.gross_profit = (p->goods.amount) - (p->goods.purchase_price) * (p->goods.sales_volume);
                printf("该商品毛利为: %lf\n", p->goods.gross_profit);
                printf("\n");
                printf("修改成功!\n");
                break;
            }
            p = p->next;
        }
        if(!flag)
            printf("该商品不存在!\n");
    }
    
    
    /*删除原有商品*/
    void del(struct Jd** head)  //修改
    {
        int flag = 0;
        struct Jd* p = (*head), * p1 = NULL;
        char num[MAXSIZE];
        printf("请输入要删除的商品编号: ");
        scanf("%s", num);
        if (strcmp(num, p->goods.id) == 0)     //修改
        {
            flag = 1;
            (*head) = p->next;
            free(p);                         //修改  
            printf("删除成功!\n");
        }
        else
        {
            while (p)
            {
                if (p->next && strcmp(num, p->next->goods.id) == 0) //修改
                {
                    flag = 1;
                    p1 = p->next;
                    p->next = p1->next;
                    free(p1);               //修改
                    printf("删除成功!\n");
                }
                p = p->next;
            }
        }
        if(!flag)
            printf("该商品不存在!\n");
    }
    
    
    /*处理原有商品的新进货量*/
    void purchase(struct Jd* head)
    {
        int flag = 0, num;
        struct Jd* p = head, * p1 = head, * p2;
        p2 = (struct Jd*)malloc(SIZEJD);
        p2->next = NULL;
        printf("请输入商品编号: \n");
        scanf("%s", p2->goods.id);
        while (p)
        {
            if (strcmp(p2->goods.id, p->goods.id) == 0)
            {
                flag = 1;
                break;
            }
            p = p->next;
        }
        if (flag == 1)
        {
            printf("请输入商品新进货量: \n");
            scanf("%d", &num);
            while (p1)
            {
                if (strcmp(p1->goods.id, p2->goods.id) == 0)
                {
                    p1->goods.purchase_quantity += num;
                    p1->goods.remaining_quantity += num;
                }
                p1 = p1->next;
            }
        }
        else
            printf("该商品不存在!");
    }
    
    
    /*处理原有商品的新销售量*/
    void sales(struct Jd* head)
    {
        int flag = 0, num;
        struct Jd* p = head, * p1 = head, * p2;
        p2 = (struct Jd*)malloc(SIZEJD);
        p2->next = NULL;
        printf("请输入商品编号: \n");
        scanf("%s", p2->goods.id);
        while (p)
        {
            if (strcmp(p2->goods.id, p->goods.id) == 0)
            {
                flag = 1;
                break;
            }
            p = p->next;
        }
        if (flag == 1)
        {
            printf("请输入商品新销售量: \n");
            scanf("%d", &num);
            while (p1)
            {
                if (strcmp(p1->goods.id, p2->goods.id) == 0)
                {
                    p1->goods.sales_volume += num;
                    p1->goods.remaining_quantity -= num;
                }
                p1 = p1->next;
            }
        }
        else
            printf("该商品不存在!\n");
    }
    
    
    /*处理原有商品的报废量*/
    void baofei(struct Jd* head)
    {
        int flag = 0, num;
        struct Jd* p = head, * p1 = head, * p2;
        p2 = (struct Jd*)malloc(SIZEJD);
        p2->next = NULL;
        printf("请输入商品编号: \n");
        scanf("%s", p2->goods.id);
        while (p)
        {
            if (strcmp(p2->goods.id, p->goods.id) == 0)
            {
                flag = 1;
                break;
            }
            p = p->next;
        }
        if (flag == 1)
        {
            printf("请输入商品报废量: \n");
            scanf("%d", &num);
            while (p1)
            {
                if (strcmp(p1->goods.id, p2->goods.id) == 0)
                {
                    if (p1->goods.remaining_quantity >= num)
                        p1->goods.remaining_quantity -= num;
                    else
                    {
                        printf("数据不合理!\n");
                        break;
                    }
                }
                p1 = p1->next;
            }
        }
        else
            printf("该商品不存在!\n");
    }
    
    
    /*统计销售情况*/
    void sale(struct Jd* head)
    {
        int flag = 0;
        struct Jd* p = head, * p1 = head, * p2;
        p2 = (struct Jd*)malloc(SIZEJD);
        p2->next = NULL;
        printf("请输入商品编号: \n");
        scanf("%s", p2->goods.id);
        while (p)
        {
            if (strcmp(p2->goods.id, p->goods.id) == 0)
            {
                flag = 1;
                break;
            }
            p = p->next;
        }
        if (flag == 1)
        {
            while (p1)
            {
                if (strcmp(p1->goods.id, p2->goods.id) == 0)
                {
                    printf("该商品的销售额为: %lf\n", p1->goods.amount);
                    printf("该商品的剩余数为: %d\n", p1->goods.remaining_quantity);
                    p->goods.gross_profit = (p->goods.amount) - (p->goods.purchase_price) * (p->goods.sales_volume);
                    printf("该商品的毛利为: %lf\n", p1->goods.gross_profit);
                }
                p1 = p1->next;
            }
        }
        else
            printf("该商品不存在!\n");
    }
    
    
    /*根据商品名查询*/
    void namechaxun(struct Jd* head)
    {
        struct Jd* p = head, * p1 = head;
        int flag = 0;
        char name[MAXSIZE];
        printf("请输入要查询的商品品名: ");
        scanf("%s", name);
        while (p)
        {
            if (strcmp(p->goods.name, name) == 0)
            {
                flag = 1;
                break;
            }
            p = p->next;
        }
        if (flag == 1)
        {
            while (p1)
            {
                if (strcmp(p1->goods.name, name) == 0)
                {
                    printf("商品编号: %s\n", p1->goods.id);
                    printf("商品品名: %s\n", p1->goods.name);
                    printf("商品进价: %lf\n", p1->goods.purchase_price);
                    printf("商品售价: %lf\n", p1->goods.selling_price);
                    printf("商品进货量: %d\n", p1->goods.purchase_quantity);
                    printf("商品销售量: %d\n", p1->goods.sales_volume);
                    printf("商品销售额: %lf\n", p1->goods.amount);
                    printf("商品剩余数: %d\n", p1->goods.remaining_quantity);
                    printf("商品毛利: %lf\n", p1->goods.gross_profit);
                }
                p1 = p1->next;
            }
        }
        else
            printf("该商品不存在!\n");
    }
    
    
    /*根据剩余数查询*/
    void shuchaxun(struct Jd* head)
    {
        struct Jd* p = head;
        int s, b;
        int flag = 0;
        printf("请输入查询区间: \n");
        scanf("%d%d", &s, &b);
        if (s > b)
            printf("输入错误,请重新输入!\n");
        else
        {
            while (p)
            {
                if (p->goods.remaining_quantity >= s && p->goods.remaining_quantity <= b)
                {
                    flag = 1;
                    printf("商品编号: %s\n", p->goods.id);
                    printf("商品品名: %s\n", p->goods.name);
                    printf("商品进价: %lf\n", p->goods.purchase_price);
                    printf("商品售价: %lf\n", p->goods.selling_price);
                    printf("商品进货量: %d\n", p->goods.purchase_quantity);
                    printf("商品销售量: %d\n", p->goods.sales_volume);
                    printf("商品销售额: %lf\n", p->goods.amount);
                    printf("商品剩余数: %d\n", p->goods.remaining_quantity);
                    printf("商品毛利: %lf\n", p->goods.gross_profit);
                }
                p = p->next;
            }
            if (flag == 0)
                printf("未找到任何记录!\n");
        }
    }
    
    
    /*按原来商品顺序显示*/
    void xianshi(struct Jd* head)
    {
        struct Jd* p = head;
        if (p != NULL)
        {
            while (p != NULL)
            {
                printf("商品编号: %s\n", p->goods.id);
                printf("商品品名: %s\n", p->goods.name);
                printf("商品进价: %lf\n", p->goods.purchase_price);
                printf("商品售价: %lf\n", p->goods.selling_price);
                printf("商品进货量: %d\n", p->goods.purchase_quantity);
                printf("商品销售量: %d\n", p->goods.sales_volume);
                printf("商品销售额: %lf\n", p->goods.amount);
                printf("商品剩余数: %d\n", p->goods.remaining_quantity);
                printf("商品毛利: %lf\n", p->goods.gross_profit);
                p = p->next;
            }
        }
        else
            printf("暂无商品信息!\n");
    }
    
    
    /*按销售额排序显示*/
    void amountxianshi(struct Jd* head)
    {
        struct Jd* pt1, * pt2, * pt;
        struct Goods temp;
        for (pt1 = head; pt1->next != NULL; pt1 = pt1->next)
        {
            pt = pt1;
            for (pt2 = pt1->next; pt2 != NULL; pt2 = pt2->next)
            {
                if (pt->goods.amount > pt2->goods.amount)
                    pt = pt2;
            }
            if (pt != pt1)
            {
                temp = pt1->goods;
                pt1->goods = pt->goods;
                pt->goods = temp;
            }
        }
        xianshi(head);
    }
    
    
    /*按毛利显示*/
    void profitxianshi(struct Jd* head)
    {
        struct Jd* pt1, * pt2, * pt;
        struct Goods temp;
        for (pt1 = head; pt1->next != NULL; pt1 = pt1->next)
        {
            pt = pt1;
            for (pt2 = pt1->next; pt2 != NULL; pt2 = pt2->next)
            {
                if (pt->goods.gross_profit > pt2->goods.gross_profit)
                    pt = pt2;
            }
            if (pt != pt1)
            {
                temp = pt1->goods;
                pt1->goods = pt->goods;
                pt->goods = temp;
            }
        }
        xianshi(head);
    }
    
    
    /*把链表结点数据写往文件*/
    void WriteToFile(struct Jd* head, char* FName)
    {
        FILE* fp;
        struct Jd* pt;
        if ((fp = fopen(FName, "w")) == NULL)
        {
            printf("文件打开失败!");
            exit(0);
        }
        pt = head;
        while (pt != NULL)
        {
            fprintf(fp, "%s %s %lf %lf %d %d %lf %d %lf\n", pt->goods.id, pt->goods.name, pt->goods.purchase_price, pt->goods.selling_price,//修改
                pt->goods.purchase_quantity, pt->goods.sales_volume, pt->goods.amount, pt->goods.remaining_quantity, pt->goods.gross_profit);//修改
            //fprintf(fp, "%s %s %lf %lf %d %d %lf %d %lf\n", go.id, go.name, go.purchase_price, go.selling_price, 
            //go.purchase_quantity, go.sales_volume, go.amount, go.remaining_quantity, go.gross_profit);
            pt = pt->next;
        }
        fclose(fp);
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月8日
  • 已采纳回答 4月7日
  • 创建了问题 4月6日

悬赏问题

  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)