------- android培训、java培训、期待与您交流! ----------
tip:链表,结构体,知识点不熟,在接收键盘输入的时候,没有用getchar(),导致很多问题。学生管理系统是很常见很实用的程序,我以为我可以很快的编出来,但是上手的时候,却出现一大堆问题,
Q:编写一个学生管理系统程序,用来记录学生的信息(包括姓名、年龄、性别、学号、分数),提供增加、删除、查询学生信息的入口。(C语言
1,结构体:
struct student
{
char name[50];
int sex;
int age;
long no;
float score;
struct student *next;
};
2,打印选择界面
void printfTipInfo(){
//printf("head 值 %p",head);
printf("*****************\n");
printf("*****1,增加学生信息*****\n");
printf("*****2,删除学生信息*****\n");
printf("*****3,查询学生信息*****\n");
printf("*****q,退出信息系统*****\n");
printf("*****************\n");
}
3,相应客户选择
void doChoose(struct student *head,struct student *tail,int *flag){
// char a = getchar();
printfTipInfo();
char choice = '0';
scanf("%c",&choice);
char c = getchar();
// printf("c=%c",a);
printf("choice = %c",choice);
switch(choice){
case '1':
addStudentInfo(head,tail,flag);
break;
case '2':
deleteStudentInfo(head,tail,flag);
break;
case '3':
searchStudentInfo(head,tail,flag);
break;
case 'q':
*flag = 0;
break;
default:
break;
}
}
相应模块,废了好大劲儿,因为之前没有加getchar()获取enter键,导致各种问题,因为时间关系,我就没有细看,留着下星期一一查出,先记下。
1)没有getchar()时,增加的模块,head总是变成NULL,即之前增加的学生信息没有了。
2)选择的时候,需要输入2位的,才能choice才有值。如输入1,无值,输入11,choice为1.
3)这个问题我不知道是不是由getchar()引起的,就是我在输入一大串字符串的时候,按enter键,结果出现这个target的上一个target的printf内容,我clean了也没有用。感觉完全不明白了。我加上getchar,然后将字符串置零,这个问题又消失了
4,增加
void addStudentInfo(struct student *head,struct student *tail,int * flag){
// printf("head 值 %p",head);
printf("这是添加信息模块\n");
struct student *s=(struct student *) malloc (LEN);
printf("请输入姓名\n");
scanf("%s",(s->name));
printf("请输入年龄\n");
scanf("%d",&(s->age));
printf("请输入姓名性别,1男,0女\n");
scanf("%d",&(s->sex));
printf("请输入学号\n");
scanf("%ld",&(s->no));
printf("请输入分数\n");
scanf("%f",&(s->score));
char c = getchar();
if (head == NULL) {
head = s;
tail = s;
}else{
tail->next = s;
s->next = NULL;
tail=s;
}
printfInfo(head,tail,flag);
}
5,删除
void deleteStudentInfo(struct student *head,struct student *tail,int * flag){
printf("这是删除信息模块\n");
printf("请输入删除者学号\n");
long no;
//scanf("%l",&no);
if(head==NULL){
printf("暂无可删除的数据\n");
}else{
scanf("%ld",&no);
char c = getchar();
struct student * s;
struct student * ps;
s=head->next;
ps = head;
while(s!=NULL){
if(s->no == no){
printf("要删除的信息为 :\n姓名:%s,年龄 : %d,性别 :%d ,学号:%ld,分数 :%f",s->name,s->age,s->sex,s->no,s->score);
printf("是否确定删除?1,确定,0 ,取消\n");
int flag;
scanf("%d",&flag);
c = getchar();
if(flag == 1){
ps->next = s->next;
s->next = NULL;
free(s);
break;
}
}else{
ps = s;
s = s->next;
}
}
printfInfo(head,tail,flag);
}
}
6,查询
void searchStudentInfo(struct student *head,struct student *tail,int * flag){
printf("这是查询信息模块\n");
printf("请输入要查询的姓名\n");
char name[50];
scanf("%s",name);
char c = getchar();
struct student * s;
s=head;
while(s!=NULL){
if(strcmp(s->name,name)==0){
printf("要查询的信息为 :\n姓名:%s,年龄 : %d,性别 :%d ,学号:%ld,分数 :%f",s->name,s->age,s->sex,s->no,s->score);
break;
}else{
s = s->next;
}
}
doChoose(head, tail, flag);
}
7,main
int main(int argc, const char * argv[]) {
struct student *head;
struct student *p1;
p1=(struct student *)malloc(LEN);
head = NULL;
//scanf("%ld,%f",&p1->no,&p1->score);
int flag =1;
while(flag == 1){
doChoose(head,p1,&flag);
}
printf("\n程序退出\n");
return 0;
}
这边本来想将head等结构体指针定义在main函数外面,成为全局变量的,但是在xcode里一直报错,暂时还不知道为什么。看官如果知道的话,可不可以回我一下下,非常非常3Q。
------- android培训、java培训、期待与您交流! ----------