2 qq 31055913 qq_31055913 于 2016.02.21 01:52 提问

本人初学C语言仿照网上的程序自行写了点,可是存在一些错误,还望大神指点!

#include
#include
#include

typedef struct store//定义商品
{

int number; //商品序号
char name[10]; //商品名称及型号
int shuliang; //商品数量
int jiage; //商品价格
int kucun; //商品库存
int zonge; //销售总额
char riqi; //销售日期
}store;

typedef struct unit
{
store date;
struct unit*next;
}unit;

unit* build()
{

unit p;

if((p=(unit
)malloc(sizeof(unit)))==NULL)

{
printf("=>初始化失败!");

return 0;

}

else

{
p->next=NULL;

p->date.number=0;//头结点存放商品数量

printf("初始化成功!\n");

return p;

}
}

void sole(unit head)//卖出商品
{

unit *p,*q;

int m,n=0;
q=head->next;

p=(unit
)malloc(sizeof(unit));

printf("=>商品编号:\n");
scanf("%d",&m);
fflush(stdin);
p->date.number;
printf("=>卖出商品及型号:\n");

scanf("%s",&m);
fflush(stdin);
p->date.number=m;
printf("=>请输入数量!\n");
scanf("%d",&m);
fflush(stdin);
p->date.shuliang=m;

printf("=>请输入价格!\n");

scanf("%d",&m);
fflush(stdin);

p->date.jiage=m;

printf("=>请输入库存!\n");

scanf("%d",&m);
fflush(stdin);

p->date.kucun=m;
printf("=>请输入日期!\n");

scanf("%s",&m);
fflush(stdin);

p->date.riqi=m;

p->date.zonge=((p->date.shuliang)*(p->date.jiage));

q=head->next;

head->next=p;
p->next=q;

head->date.number++;
}
void deletion(unit *head)//删除订单
{

unit *p=head->next,*q=head;

char N[10];

printf("=>请输入你想删除订单!\n");

gets(N);
fflush(stdin);

if(p==NULL)

printf("=>系统无订单可删除!\n");

while(p)

{

if(strcmp(p->date.name,N)==0)

{

q->next=p->next;

head->date.number--;

printf("=>删除%s成功!\n",p->date.name);

free(p);

break;

}
else

{

p=p->next;

q=q->next;

if(p==NULL)

printf("=>你要删除的订单不存在,删除失败!\n");

}

}

}
int display(unit *head)//显示商品订单信息
{

unit *p=head->next;

int m,n=0;

if(p==NULL)

{

printf("=>系统无订单!\n");

return 0;
}

while(n==0)

{
printf("=>请选择你的操作!\n");

printf("=>\t\t\t1.显示所有\t2.按编号查找\t3.返回主菜单\n");
scanf("%d",&m);

fflush(stdin);
switch(m)

{

case 1:printf("\n=>该系统拥有%d份订单!\n\n",head->date.number);

p=head->next;

printf("\t商品名称及型号\t数量\t价格\t总额\t日期\n\n");

while(p)

{
printf("\t%s\t%d\t%d\t%d\t%s\n",p->date.name,p->date.shuliang,p->date.jiage,p->date.zonge,p->date.riqi);

p=p->next;

}

break;
case 2:printf("=>请输入查找编号!\n");

scanf("%d",&m);

fflush(stdin);

p=head->next;

while(p)

{

if(p->date.number==m)

{

printf("\t商品名称及型号\t数量\t价格\t总额\t日期\n\n");

printf("\t%s\t%d\t%d\t%d\t%s\n",p->date.name,p->date.shuliang,p->date.jiage,p->date.zonge,p->date.riqi);
break;

}
else

{

p=p->next;

if(p==NULL)

printf("=>你要查的订单不存在!\n");

}

}

break;

case 3:n=1;break;

}

}

return 1;
}
void menu()
{
printf("\t\t\t1.新建系统\t2.添加订单\n\t\t\t3.删除订单\t4.查看信息\n\t\t\t5.退出系统\n");

printf("=>请选择你的操作!\n");
}

void main()
{

int m=0,n, i;

unit head;
printf("\t\t\t
欢迎使用商品订单管理系统 * \n");
//if((head=read())==0)

//{

printf("=>是否新建?\n");

printf("\t\t\t是(1)\t\t否(2)\n");

scanf("%d",&i);

fflush(stdin);

if(i==1)

head=build();

else if(i==2)

exit(1);

//}

else

printf("=>信息导入成功!");
while(m==0)

{

menu();

scanf("%d",&n);

fflush(stdin);

switch(n)

{

case 1:head=build();
break;

case 2:sole(head);
break;

case 3:deletion(head);
break;

case 4:display(head);
break;

case 5:m=1;
break;

}

}
}

5个回答

hyb1996
hyb1996   2016.02.21 21:48
已采纳

我把错误都修改并在注释中说明了,可以运行。不懂的地方追问,加油!
图片说明

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
 typedef struct store //定义商品 
{

    int number; //商品序号
    char name[10]; //商品名称及型号
    int shuliang; //商品数量
    int jiage; //商品价格
    int kucun; //商品库存
    int zonge; //销售总额
    //日期应该是一个字符串,即char数组 
    char riqi[10]; //销售日期
}
store;
typedef struct unit {
    store date;
    struct unit * next;
}
unit;
unit * build() {
    //这里要返回的是指针,所以要加*,即unit *p 
    unit *p;
    //注意,malloc返回的是void指针
    //这里把(unit)改为(unit*) 
    if ((p = (unit*) malloc(sizeof(unit))) == NULL)

    {
        printf("=>初始化失败!");
        //初始化失败应该返回空指针NULL而不是0 
        return NULL;

    }

    else

    {
        p ->next = NULL;

        p ->date.number = 0; //头结点存放商品数量
        printf("初始化成功!\n");

        return p;

    }
}
//传入的head改为指针,即*head,原因在后面 
void sole(unit *head) //卖出商品
{

    unit * p,
    *q;

    int m,
    n = 0;
    //注意,->运算符是对指针进行的 ,因此head必须是指针,否则要改为head.next 
    q = head->next;

    p = (unit*) malloc(sizeof(unit));

    printf("=>商品编号:\n");
    scanf("%d", &m);
    fflush(stdin);
    p->date.number;
    printf("=>卖出商品及型号:\n");

    //m是一个int整数,而%s是对字符串的输入,要输入名称型号,可以用以下语句 
    scanf("%s", p->date.name);
    fflush(stdin);
    p->date.number = m;
    printf("=>请输入数量!\n");
    scanf("%d", &m);
    fflush(stdin);
    p->date.shuliang = m;

    printf("=>请输入价格!\n");

    scanf("%d", &m);
    fflush(stdin);

    p->date.jiage = m;

    printf("=>请输入库存!\n");

    scanf("%d", &m);
    fflush(stdin);

    p->date.kucun = m;
    printf("=>请输入日期!\n");

    //m是一个int整数,而%s是对字符串的输入,不能再这里用&m,可以直接用下面的语句输入日期 
    scanf("%s", p->date.riqi);
    fflush(stdin);


    p->date.zonge = ((p->date.shuliang) * (p->date.jiage));

    q = head->next;

    head->next = p;
    p->next = q;

    head->date.number++;
}
void deletion(unit * head) //删除订单
{

    unit * p = head->next,
    *q = head;

    char N[10];

    printf("=>请输入你想删除订单!\n");

    gets(N);
    fflush(stdin);

    if (p == NULL)

    printf("=>系统无订单可删除!\n");

    while (p)

    {

        if (strcmp(p->date.name, N) == 0)

        {

            q->next = p->next;

            head->date.number--;

            printf("=>删除%s成功!\n", p->date.name);

            free(p);

            break;

        } else

        {

            p = p->next;

            q = q->next;

            if (p == NULL)

            printf("=>你要删除的订单不存在,删除失败!\n");

        }

    }

}
int display(unit * head) //显示商品订单信息
{

    unit * p = head->next;

    int m,
    n = 0;

    if (p == NULL)

    {

        printf("=>系统无订单!\n");

        return 0;
    }

    while (n == 0)

    {
        printf("=>请选择你的操作!\n");

        printf("=>\t\t\t1.显示所有\t2.按编号查找\t3.返回主菜单\n");
        scanf("%d", &m);

        fflush(stdin);
        switch (m)

        {

        case 1:
            printf("\n=>该系统拥有%d份订单!\n\n", head->date.number);

            p = head->next;

            printf("\t商品名称及型号\t数量\t价格\t总额\t日期\n\n");

            while (p)

            {
                printf("\t%s\t%d\t%d\t%d\t%s\n", p->date.name, p->date.shuliang, p->date.jiage, p->date.zonge, p->date.riqi);

                p = p->next;

            }

            break;
        case 2:
            printf("=>请输入查找编号!\n");

            scanf("%d", &m);

            fflush(stdin);

            p = head->next;

            while (p)

            {

                if (p->date.number == m)

                {

                    printf("\t商品名称及型号\t数量\t价格\t总额\t日期\n\n");

                    printf("\t%s\t%d\t%d\t%d\t%s\n", p->date.name, p->date.shuliang, p->date.jiage, p->date.zonge, p->date.riqi);
                    break;

                } else

                {

                    p = p->next;

                    if (p == NULL)

                    printf("=>你要查的订单不存在!\n");

                }

            }

            break;

        case 3:
            n = 1;
            break;

        }

    }

    return 1;
}
void menu() {
    printf("\t\t\t1.新建系统\t2.添加订单\n\t\t\t3.删除订单\t4.查看信息\n\t\t\t5.退出系统\n");

    printf("=>请选择你的操作!\n");
}
int main() {

    int m = 0,
    n,
    i;

    unit *head;
    printf("\t\t\t 欢迎使用商品订单管理系统 * \n");
    //if((head=read())==0)
    //{
    printf("=>是否新建?\n");

    printf("\t\t\t是(1)\t\t否(2)\n");

    scanf("%d", &i);

    fflush(stdin);

    if (i == 1)

    head = build();

    else if (i == 2)

    exit(1);

    //}
    else

    printf("=>信息导入成功!");
    while (m == 0)

    {

        menu();

        scanf("%d", &n);

        fflush(stdin);

        switch (n)

        {

        case 1:
            head = build();
            break;

        case 2:
            sole(head);
            break;

        case 3:
            deletion(head);
            break;

        case 4:
            display(head);
            break;

        case 5:
            m = 1;
            break;

        }

    }
}
qq_31055913
qq_31055913 回复hyb1996: 非常感谢你的回答!我只是刚开始学习c语言所以能这样帮忙非常感谢!我会继续努力研究这段语言的!发现问题的话希望能再向你请教!非常感谢!
接近 2 年之前 回复
caozhy
caozhy   Ds   Rxr 2016.02.21 06:39

错误很多
...
scanf("%d",&m);
fflush(stdin);
p->date.number;
...

这里缺少赋值

printf("=>卖出商品及型号:\n");

scanf("%s",&m);
字符串怎么赋值给int型的m

char riqi;
日期用一个char能表示?

你连基本的C语言的类型都不懂,先找本书看看吧。

qq_31055913
qq_31055913 回复caozhy: 谢谢指教!
接近 2 年之前 回复
qq_31055913
qq_31055913 回复caozhy: 谢谢指教!
接近 2 年之前 回复
xingyuan1hao
xingyuan1hao   2016.02.21 10:16

网上程序太零散,知识没结构体系。既然是初学,看样子,也不是赶项目。拿本C语言书,边看边敲代码,一周通关。这时,再进行针对性学习,就快了。加油!

qq_31055913
qq_31055913 回复xingyuan1hao: 谢谢指导!
接近 2 年之前 回复
caozhy
caozhy   Ds   Rxr 2016.02.21 06:40

如果你完全不懂,不要指望光模仿一个人家的程序能改写成功。反之,如果你学会了,也没必要去参考别人的程序。网上的程序大多写得不规范。根本不值得你模仿。

qq_31055913
qq_31055913 回复caozhy: 好的!多谢指导!
接近 2 年之前 回复
u014191220
u014191220   2016.02.21 08:05

模仿是一个很好的学习方法,但是前提是你有一定的语法基础。建议你还是先看看C语言的书,把基本的语法知识掌握了,再去解决实际问题。

qq_31055913
qq_31055913 回复云海孤月_: 谢谢指导!
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!