黑马程序员-c语言链表-学生管理系统(Q)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CQYCCCCC/article/details/47834881

------- 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培训、期待与您交流! ----------


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页