主题:求高手教教菜鸟啊···········
luowei95519 [专家分:0] 发布于 2010-09-25 11:48:00
学校搞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个回复)
沙发
cgl_lgs [专家分:21040] 发布于 2010-09-25 13:40:00
这格式~~~~
看着看着就睡着了~~~~~
您先学会写代码的格式吧:)
板凳
强强 [专家分:4740] 发布于 2010-09-25 14:04:00
[quote]这格式~~~~
看着看着就睡着了~~~~~
您先学会写代码的格式吧:)[/quote]
有同感,虽然楼主话说的挺客气,但是你的代码实在不怎么招人看,你能把程序写得像小说一样这点在下十分佩服。
3 楼
luowei95519 [专家分:0] 发布于 2010-09-25 15:02:00
楼上的高手,我已经说了我是直接从VC里面复制下来的,你们复制过去,放到编译器里面就不是这样了·····我现在很急,我看到你们的回帖还以为有人教了,结果···哎呀
4 楼
windy0will [专家分:2300] 发布于 2010-09-25 16:46:00
那您也要先把格式弄好再贴上来,这样的代码确实难看。以后贴代码的时候也要考虑读代码的人吧,我花了好几分钟才把格式。。。。哎。
我今天闲着没事,简单的修改了以下,里面的错误还真不少。您对着代码自己看吧。
我把我修改后的代码贴上来,可能还有一些问题还没发现。
#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 楼
windy0will [专家分:2300] 发布于 2010-09-25 16:47:00
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 楼
强强 [专家分:4740] 发布于 2010-09-25 16:55:00
#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 楼
强强 [专家分:4740] 发布于 2010-09-25 16:56:00
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 楼
luowei95519 [专家分:0] 发布于 2010-09-25 18:55:00
非常感谢楼上两位的耐心指导和修改,小弟确实是新手,而且因为花了好久的时间来弄了,但是就是弄不好,有点急躁····以后一定会注意这次编程里的问题,争取当个老鸟···谢谢啦·
9 楼
强强 [专家分:4740] 发布于 2010-09-26 11:46:00
[quote]非常感谢楼上两位的耐心指导和修改,小弟确实是新手,而且因为花了好久的时间来弄了,但是就是弄不好,有点急躁····以后一定会注意这次编程里的问题,争取当个老鸟···谢谢啦·[/quote]
其实您根本没认真看我的代码,我什么也没有改,只是把格式调整了一下
我来回复