回 帖 发 新 帖 刷新版面

主题:求高手教教菜鸟啊···········

学校搞C语言实训,要用链表编个超市商品管理系统,小弟尝试着边看书边编····虽然有些功能能用,但是问题还是很多····列举如下:

1.为什么NEW函数中执行到printf("是否继续添加")这步后,后面的就不执行了?
2.怎么样才能让用户选择‘n'不添加了,然后返回到主界面,进行其他操作?

小弟刚学完C语言,真的是第一次编程,有很多编得不好的地方,大家见笑了,但是还是请高手帮小弟耐心看看,修改,解答一下,也让我这个新人多学点东西··· 

直接从vc里面复制出来的,请各位高手复制一下放到电脑里面看看,因为结构有点乱了····麻烦大家了··








#include <stdio.h>#include <stdlib.h>#include <string.h>#define LEN sizeof(struct goods)

struct riqi { int year; int month; int day;



};struct goods{ char name[30];/*商品名称*/ long num;/*商品编号*/ struct riqi date;/*进货日期*/ int total;/*进货数量*/ int jinjia;/*进价*/ int maijia;/*售价*/ struct goods *next;





};



struct goods *NEW(void){    char ch; struct goods *p1,*p2,*head;   head=NULL; p1=p2=(struct goods *)malloc(LEN); /*分配一个内存空间,并使P1,P2指向该内存空间*/ printf("请输入商品名称:\n"); scanf("%s",(*p1).name); printf("请输入商品编号:\n"); scanf("%ld",&(*p1).num); printf("请输入进货日期:(请按年,月,日的形式输入)\n"); scanf("%d,%d,%d",&(*p1).date.year,&(*p1).date.month,&(*p1).date.day); printf("请输入进货数量:\n"); scanf("%d",&(*p1).total); printf("请输入进货价格:\n"); scanf("%d",&(*p1).jinjia); printf("请输入您想要卖出的价格:\n"); scanf("%d",&(*p1).maijia); head=p1; printf("是否继续添加?请选择Y或N:\n"); scanf("%c",&ch); if(ch=='Y'||ch=='y') {char ch='y'; while(ch!='n'||ch!='N') { p1=(struct goods *)malloc(LEN);    printf("请输入商品名称:\n"); scanf("%s",(*p1).name); printf("请输入进货日期:(请按年 月 日的形式输入)\n"); scanf("%d,%d,%d",&(*p1).date.year,&(*p1).date.month,&(*p1).date.day); printf("请输入进货数量:\n"); scanf("%d",&(*p1).total); printf("请输入进货价格:\n"); scanf("%d",&(*p1).jinjia); printf("请输入您想要卖出的价格:\n"); scanf("%d",&(*p1).maijia); p2->next=p1; printf("是否继续添加?请选择Y或N:\n"); scanf("%c",&ch); } p2->next=NULL; } if(ch=='N'||ch=='n')



}void sousuo_num(struct goods *p1){ long num; printf("请输入需要查找的商品的编号:\n"); scanf("%ld",&num); do{ if(num==(*p1).num) {printf("您需要查找的商品信息如下:"); printf("商品名称:%s\n",(*p1).name); printf("商品编号:%ld\n",(*p1).num); printf("商品进货日期:%d年,%d月,%d日\n",(*p1).date.year,(*p1).date.month,(*p1).date.day); printf("商品进货数量:%d\n",(*p1).total); printf("商品进货价格:%d\n",(*p1).jinjia); printf("商品出售价:%d\n",(*p1).maijia);   p1=p1->next; } }while(p1!=NULL);







}void sousuo_name(struct goods *p1){
char name[50]; printf("请输入需要查找的商品的名称:\n"); scanf("%s",name); do{ if(strcmp(name,(*p1).name)==0) {printf("您需要查找的商品信息如下:"); printf("商品名称:%s\n",(*p1).name); printf("商品编号:%ld\n",(*p1).num);   printf("商品进货日期:%d年,%d月,%d日\n",(*p1).date.year,(*p1).date.month,(*p1).date.day); printf("商品进货数量:%d\n",(*p1).total); printf("商品进货价格:%d\n",(*p1).jinjia); printf("商品出售价:%d\n",(*p1).maijia);   p1=p1->next; } } while(p1!=NULL);}











void found(struct goods *head){ int a; printf("请选择查找方式:\n"); printf("1.按商品编号查找\n"); printf("2.按商品名称查找\n"); scanf("%d",&a); if(a==1) sousuo_num(head); if(a==2) sousuo_name(head);}

struct goods *Delete(struct goods *head){ struct goods *p1,*p2; long num; p1=head; printf("请输入要删除的商品的编号:\n"); scanf("&ld",&num); while(num!=(*p1).num&&(*p1).num!=NULL) {p2=p1;p1=p1->next;} if(num==(*p1).num) {if(p1==head) head=p1->next; else p2->next=p1->next; printf("删除成功\n"); return(head);
}





}









int welcome(void){ int a; putchar('\n'); putchar('\n'); putchar('\n'); putchar('\n'); putchar('\n'); putchar('\n'); printf("****************************欢迎使用超市商品管理系统****************************\n"); printf("\t\t\t\t1.添加商品信息\n");   printf("\t\t\t\t2.查找商品信息\n"); printf("\t\t\t\t3.删除商品信息\n");   printf("\t\t\t\t4.退出\n"); printf("请输入你想选择的操作的编号:\n"); scanf("%d",&a); if(a<1||a>4) printf("无此操作,请重新打开.\n");   return a;



}
void main(){ int a; struct goods *head; a=welcome(); switch(a) { case 1:head=NEW();break;/*调用函数添加商品信息*/   case 2:found(head);break;/*调用函数查找商品信息*/   case 3:Delete(head);break;/*调用函数删除商品信息*/   case 4:exit(0); }    }



回复列表 (共9个回复)

沙发

这格式~~~~
看着看着就睡着了~~~~~

您先学会写代码的格式吧:)

板凳

[quote]这格式~~~~
看着看着就睡着了~~~~~

您先学会写代码的格式吧:)[/quote]
有同感,虽然楼主话说的挺客气,但是你的代码实在不怎么招人看,你能把程序写得像小说一样这点在下十分佩服。

3 楼

楼上的高手,我已经说了我是直接从VC里面复制下来的,你们复制过去,放到编译器里面就不是这样了·····我现在很急,我看到你们的回帖还以为有人教了,结果···哎呀

4 楼

那您也要先把格式弄好再贴上来,这样的代码确实难看。以后贴代码的时候也要考虑读代码的人吧,我花了好几分钟才把格式。。。。哎。
我今天闲着没事,简单的修改了以下,里面的错误还真不少。您对着代码自己看吧。
我把我修改后的代码贴上来,可能还有一些问题还没发现。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN sizeof(struct goods)

struct riqi { 
       int year; 
       int month; 
       int day;
};

struct goods{ 
       char name[30];/*商品名称*/
       long num;/*商品编号*/ 
       struct riqi date;/*进货日期*/ 
       int total,/*进货数量*/ 
           jinjia,/*进价*/ 
           maijia;/*售价*/ 
       struct goods *next;
};



struct goods *NEW(struct goods *head)
{    
     char ch=0,ch0; 
     struct goods *p1,*p2 ; 
     system("cls");  
     do {
        p1=p2=(struct goods *)malloc(LEN); /*分配一个内存空间,并使P1,P2指向该内存空间*/ 
        puts("\n\n\n请输入商品名称:  ");   scanf("%s",   (*p1).name);
        puts("请输入商品编号:        ");   scanf("%ld", &(*p1).num ); 
        puts("请输入进货日期:(请按年,"
             "月,日的形式输入)       ");   scanf("%d %d %d", &(*p1).date.year,
                                                             &(*p1).date.month,  &(*p1).date.day); 
        puts("请输入进货数量:        ");   scanf("%d",  &(*p1).total );
        puts("请输入进货价格:        ");   scanf("%d",  &(*p1).jinjia); 
        puts("请输入您想要卖出的价格:");   scanf("%d",  &(*p1).maijia);
        while( (ch0=getchar()) != '\n' );   //吸收多余字符 和'\n' 
     
        p1->next = head;  head = p1; 
     
        puts("是否继续添加?请选择Y/N:");   scanf("%c",&ch); 
        while( (ch0=getchar()) != '\n' );   //吸收多余字符 和'\n'
        } while (  (ch == 'y') || (ch == 'Y')   );
 
    return  head;                  
}

void sousuo_num(struct goods *p1)

    char ch ;
    long num;
     
    system("cls");
    printf("请输入需要查找的商品的编号:\n"); 
    scanf("%ld",&num); 
    do  
    { 
        if  (   num == (*p1).num   ) 
        {
            printf("\n\n\n\n您需要查找的商品信息如下:\n"  ); 
            printf("商品名称    : %s\n"    ,   (*p1).name  ); 
            printf("商品编号    : %ld\n"   ,   (*p1).num   );   
            printf("商品进货日期: %04d年%02d月%02d日\n",
                     (*p1).date.year,   (*p1).date.month,   (*p1).date.day); 
            printf("商品进货数量: %d\n"    ,   (*p1).total ); 
            printf("商品进货价格: %d\n"    ,   (*p1).jinjia); 
            printf("商品出售价  : %d\n\n\n",   (*p1).maijia);   
            system("pause");
        } 
        p1=p1->next;//这一句不能放到if语句里面去,否则不满足if的条件,那么p1永远不会变 
    } while(   p1!=NULL    );

}


5 楼

void sousuo_name(struct goods *p1)
{
    char name[50]; 
    system("cls");
    puts("\n请输入需要查找的商品的名称:");              scanf("%s",name); 
    do
    {
        if(    strcmp(name,(*p1).name) ==0     ) 
        {
            printf("\n\n\n\n您需要查找的商品信息如下:\n"  ); 
            printf("商品名称    : %s\n"    ,   (*p1).name  ); 
            printf("商品编号    : %ld\n"   ,   (*p1).num   );   
            printf("商品进货日期: %04d年%02d月%02d日\n",
                     (*p1).date.year,   (*p1).date.month,   (*p1).date.day); 
            printf("商品进货数量: %d\n"    ,   (*p1).total ); 
            printf("商品进货价格: %d\n"    ,   (*p1).jinjia); 
            printf("商品出售价  : %d\n\n\n",   (*p1).maijia);   
            system("pause");
        }
        p1=p1->next;//这一句不能放到if语句里面, 否则很有可能是死循环 
    } while(    p1!=NULL    );

}



void found(struct goods *head)

    int a ,ch;
    system("cls");
    
    if  (    !head    ) return;
    
    puts("请选择查找方式: "); 
    puts("1.按商品编号查找"); 
    puts("2.按商品名称查找"); 
    scanf("%d",&a);
    while( (ch=getchar()) != '\n' );   //吸收多余字符 和'\n' 
    if     (a==1) sousuo_num (head); 
    else if(a==2) sousuo_name(head);

}

struct goods *Delete(struct goods **phead)

    char ch;
    long num;
    struct goods *p1 = *phead ,    *p2,
                 *head = *phead;
    
    system("cls");
    puts("请输入要删除的商品的编号: ");        scanf("%ld",&num); 
    while( (ch=getchar()) != '\n' );   //吸收多余字符 和'\n'
    while(    (num != (*p1).num)  &&  (p1->next)    ) 
    {
        p2=p1; p1=p1->next;
    } 
    if(num==(*p1).num) 
    {
        if(p1==head) *phead=p1->next; 
        else p2->next=p1->next; 
        
        free(p1);
        printf("删除成功\n\n");  
    }
    else printf("编号为%d的商品还不存在\n\n",num);
    
    system("pause");
    return(*phead); 
}



int welcome(void)
{
     int a = 0,ch;
     system("cls");
     puts("\n\n\n\n\n\n"); 
     puts("****************************欢迎使用超市商品管理系统****************************"); 
     puts("\t\t\t\t1.添加商品信息");   
     puts("\t\t\t\t2.查找商品信息"); 
     puts("\t\t\t\t3.删除商品信息");   
     puts("\t\t\t\t4.退出"); 
     puts("请输入你想选择的操作的编号:");
     for (   ; ;   ) 
         {
         scanf("%d",&a);
         while( (ch=getchar()) != '\n' );   //吸收多余字符 和'\n' 
         if(   (a>0) && (a<5)   )   return a;
         printf("无此操作,请重新输入.\n"); 
         }  
}


int main()
{
    int a;
    struct goods *head = NULL;
    for (   ; ;   ) 
    {   
        system("cls");
        a=welcome(); 
        switch(a) 
        { 
          case 1:
              head=NEW(head);
              break;/*调用函数添加商品信息*/   
          case 2:
              found(head);
              break;/*调用函数查找商品信息*/   
          case 3:
              Delete(&head);
              break;/*调用函数删除商品信息*/   
          case 4:
              exit(0);
        }
    }    
    
    return 0;
}



一次贴不完。您代码中的printf和scanf实在是太多了。

6 楼

#include "StdAfx.h"
#define LEN sizeof(struct goods)
struct riqi 

    int year; 
    int month; 
    int day;
};
struct goods

    char name[30];/*商品名称*/ 
    long num;/*商品编号*/ 
    struct riqi date;/*进货日期*/ 
    int total;/*进货数量*/ 
    int jinjia;/*进价*/ 
    int maijia;/*售价*/ 
    struct goods *next;
};
struct goods *NEW(void)
{    
    char ch; 
    struct goods *p1,*p2,*head;   
    head=NULL; 
    p1=p2=(struct goods *)malloc(LEN); /*分配一个内存空间,并使P1,P2指向该内存空间*/ 
    printf("请输入商品名称:\n"); 
    scanf("%s",(*p1).name); 
    printf("请输入商品编号:\n"); 
    scanf("%ld",&(*p1).num); 
    printf("请输入进货日期:(请按年,月,日的形式输入)\n"); 
    scanf("%d,%d,%d",&(*p1).date.year,&(*p1).date.month,&(*p1).date.day); 
    printf("请输入进货数量:\n"); 
    scanf("%d",&(*p1).total); 
    printf("请输入进货价格:\n"); 
    scanf("%d",&(*p1).jinjia); 
    printf("请输入您想要卖出的价格:\n"); 
    scanf("%d",&(*p1).maijia); 
    head=p1; 
    printf("是否继续添加?请选择Y或N:\n"); 
    scanf("%c",&ch); 
    if(ch=='Y'||ch=='y') 
    {
        char ch='y'; 
        while(ch!='n'||ch!='N') 
        { 
            p1=(struct goods *)malloc(LEN);    
            printf("请输入商品名称:\n"); 
            scanf("%s",(*p1).name); 
            printf("请输入进货日期:(请按年 月 日的形式输入)\n"); 
            scanf("%d,%d,%d",&(*p1).date.year,&(*p1).date.month,&(*p1).date.day); 
            printf("请输入进货数量:\n"); 
            scanf("%d",&(*p1).total); 
            printf("请输入进货价格:\n"); 
            scanf("%d",&(*p1).jinjia); 
            printf("请输入您想要卖出的价格:\n"); 
            scanf("%d",&(*p1).maijia); 
            p2->next=p1; 
            printf("是否继续添加?请选择Y或N:\n"); 
            scanf("%c",&ch); 
        } 
        p2->next=NULL; 
    } 
    if(ch=='N'||ch=='n');
    return head;
}
void sousuo_num(struct goods *p1)

    long num; printf("请输入需要查找的商品的编号:\n"); 
    scanf("%ld",&num); 
    do{ 
        if(num==(*p1).num) 
        {
            printf("您需要查找的商品信息如下:"); 
            printf("商品名称:%s\n",(*p1).name); 
            printf("商品编号:%ld\n",(*p1).num); 
            printf("商品进货日期:%d年,%d月,%d日\n",(*p1).date.year,(*p1).date.month,(*p1).date.day); 
            printf("商品进货数量:%d\n",(*p1).total); 
            printf("商品进货价格:%d\n",(*p1).jinjia); 
            printf("商品出售价:%d\n",(*p1).maijia);   
            p1=p1->next; 
        } 
    }while(p1!=NULL);
}

7 楼

void sousuo_name(struct goods *p1)
{
    char name[50]; 
    printf("请输入需要查找的商品的名称:\n"); 
    scanf("%s",name); 
    do{ 
        if(strcmp(name,(*p1).name)==0) 
        {
            printf("您需要查找的商品信息如下:"); 
            printf("商品名称:%s\n",(*p1).name); 
            printf("商品编号:%ld\n",(*p1).num);   
            printf("商品进货日期:%d年,%d月,%d日\n",(*p1).date.year,(*p1).date.month,(*p1).date.day); 
            printf("商品进货数量:%d\n",(*p1).total); 
            printf("商品进货价格:%d\n",(*p1).jinjia); 
            printf("商品出售价:%d\n",(*p1).maijia);   
            p1=p1->next; 
        } 
    } while(p1!=NULL);}
void found(struct goods *head)

    int a; 
    printf("请选择查找方式:\n"); 
    printf("1.按商品编号查找\n"); 
    printf("2.按商品名称查找\n"); 
    scanf("%d",&a); 
    if(a==1) sousuo_num(head); 
    if(a==2) sousuo_name(head);
}
struct goods *Delete(struct goods *head)

    struct goods *p1,*p2; 
    long num; p1=head; 
    printf("请输入要删除的商品的编号:\n"); 
    scanf("&ld",&num); 
    while(num!=(*p1).num&&(*p1).num!=NULL) 
    {
        p2=p1;
        p1=p1->next;
    } 
    if(num==(*p1).num) 
    {
        if(p1==head) head=p1->next; 
        else p2->next=p1->next; printf("删除成功\n"); 
        return(head);
    }
}
int welcome(void)

    int a; 
    putchar('\n'); 
    putchar('\n'); 
    putchar('\n'); 
    putchar('\n'); 
    putchar('\n'); 
    putchar('\n'); 
    printf("****************************欢迎使用超市商品管理系统****************************\n"); 
    printf("\t\t\t\t1.添加商品信息\n");   
    printf("\t\t\t\t2.查找商品信息\n"); 
    printf("\t\t\t\t3.删除商品信息\n");   
    printf("\t\t\t\t4.退出\n"); 
    printf("请输入你想选择的操作的编号:\n"); 
    scanf("%d",&a); 
    if(a<1||a>4) printf("无此操作,请重新打开.\n");   
    return a;
}
void main()

    int a; 
    struct goods *head; 
    a=welcome(); 
    switch(a) 
    { 
        case 1:
            head=NEW();
            break;/*调用函数添加商品信息*/   
        case 2:
            found(head);
            break;/*调用函数查找商品信息*/   
        case 3:Delete(head);
            break;/*调用函数删除商品信息*/   
        case 4:exit(0); 
    }    
}

8 楼

非常感谢楼上两位的耐心指导和修改,小弟确实是新手,而且因为花了好久的时间来弄了,但是就是弄不好,有点急躁····以后一定会注意这次编程里的问题,争取当个老鸟···谢谢啦·

9 楼

[quote]非常感谢楼上两位的耐心指导和修改,小弟确实是新手,而且因为花了好久的时间来弄了,但是就是弄不好,有点急躁····以后一定会注意这次编程里的问题,争取当个老鸟···谢谢啦·[/quote]
其实您根本没认真看我的代码,我什么也没有改,只是把格式调整了一下

我来回复

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