求解答一些大一c语言中遇到的一些问题,关于学生信息管理系统的。例如下列代码的解析
struct Student *modify()
{
struct Student *p;
p = Stu;
int number;
int i = 0;
int isbd = 1;
int j;
printf("请选择你要修改学生的学号\n");
scanf("%d", &number);
while (p[i].id != number && i < count)
{
i++;
p++;
}
if (number == p[i].id)
{
while (isbd)
{
printf("\n1.修改学号 2.修改姓名 3.修改性别 4.修改年龄 5.修改成绩 0.退出修改");
scanf("%d", &j);
switch (j)
{
case 1:
printf("请输入修改后的学号\n");
scanf("%d", &p->id);
break;
case 2:
printf("请输入修改后的姓名\n");
scanf("%s", p->name);
break;
case 3:
printf("请输入修改后的性别\n");
scanf("%s", p->gender);
break;
case 4:
printf("请输入修改后的年龄\n");
scanf("%d", &p->age);
break;
case 5:
printf("请输入修改后的成绩\n");
scanf("%f", &p->score);
break;
case 0:
printf("退出成功\n");
isbd=0;
break;
}
}
}
return Stu;
};
什么问题?总的思想就是定义一个指针p并让其指向Stu结构体,表示将要修改Stu中的元素。用户自己输入学号,会通过循环找到对应的学生信息。找到以后就让用户选择要修改哪个方面的信息。循环会一直进行,直到用户选择退出修改。在循环中,每当用户选择修改某个方面的信息时,函数会提示用户输入新的信息,并将其赋值给对应的学生信息。最后,函数返回指向Stu的指针。
本人最近刚好有点时间,就去看了看c语言的链表,看到网上各种c语言的学生信息管理代码,确实都是现成的东西,我也没必要去自己再写,但是本萌新是带着学习的态度好吧(内心真实想法:我就是闲的蛋疼好吧 ),决定自己尝试去写一段这个代码,毕竟只有自己会写才是真理,你看的代码再多,你看的时候觉得你会了,其实不然,说到这里很多人就不信了,这么个简单的代码wo还不会了,那好,你把代码关掉,当场给我写。(暴躁老哥,在线GAY人)。好啦,其实我想说的是,别人的代码写的再好,那也是别人的,始终不是你的,所以,everbody,跟着我一起快乐的撸代码吧。最后由于本人能力有限,代码之处可能存在不少BUG,如有发现,请当场给我两个耳刮子,让我长长记性,学习学习(说着玩的,不要真的抽我好吧)。
备注:因为只是想深入了解下链表,此处所做的信息管理系统,没有很好的完善界面和选择功能,只是将各个功能都体现出来,后续如有时间可以尝试弄下。(我就是没时间,就是不弄,来打我啊! )
// 该代码实现学生数据库管理系统
// 所实现的功能为:1.创建学生信息库 2.增加和删除学生信息 3.显示所有学生信息 4.保存所有学生信息
// 代码完成时间:2019/8/16
// 代码版本:V1.0
// 完成人:wangming
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>
#include <malloc.h>
struct stu
{
char name[20];
int score;
char qq[10];
char from[15];
struct stu *next;
};
struct stu *head;
// 函数声明
void creat(); // 创建学生信息库函数
void sprint(struct stu *u); // 打印显示所有学生信息函数
void add(struct stu *head); // 增加学生信息函数
void save(struct stu *head); // 保存学生信息函数
void read(); // 从文件中读取学生信息函数
void delete(struct stu *head); // 删除学生信息函数
// 主函数,里面的功能全部用各个函数封装起来
int main()
{
struct stu *p;
creat();
sprint(head);
add(head);
sprint(head);
save(head);
read();
delete(head);
sprint(head);
}
void add(struct stu *head)
{
struct stu *p,*p1,*p2,*p3;
p = head;
char name[20];
printf("please input the name of you want to add:");
scanf("%s",&name);
p1 = (struct stu *)malloc(sizeof(struct stu));
while(p!=NULL)
{
if(strcmp(p->name,name)==0)
{
p2 = p;
break;
}
p = p->next;
}
if(p==NULL)
{
printf("not find this student's name\n");
}
else
{
printf("find this student's name\n");
printf("-----------------------------------");
printf("please input student's info\n");
printf("please input name:");
scanf("%s",&p1->name);
printf("please input score:");
scanf("%d",&p1->score);
printf("please input qq:");
scanf("%s",&p1->qq);
printf("please input from:");
scanf("%s",&p1->from);
printf("--------------------------------------\n");
p3 = p2->next;
p2->next = p1;
p1->next = p3;
}
}
void creat()
{
struct stu *p1,*p2;
head = NULL;
p2 = p1 = (struct stu *)malloc(sizeof(struct stu));
// printf("please input info:");
head = p1;
// scanf("%s",&p1->name);
int flag;
flag = 1;
while(flag)
{
printf("please input name info:");
//head = p1;
scanf("%s",&p1->name);
if(strcmp("ok",p1->name)==0)
{
flag = 0;
p2->next = NULL;
printf("input success\n");
}
else
{
printf("please input score:");
scanf("%d",&p1->score);
printf("please input qq:");
scanf("%s",&p1->qq);
printf("please input from:");
scanf("%s",&p1->from);
printf("--------------------------------------\n");
p2 = p1;
p1 = (struct stu *)malloc(sizeof(struct stu));
if(p1 == NULL)
{
printf("failed get memery\n");
}
p2->next = p1;
}
}
}
void sprint(struct stu *u)
{
struct stu *p;
p = head;
while(p!=NULL)
{
printf("--------------------------------------\n");
printf("name:%s\n",p->name);
printf("name:%d\n",p->score);
printf("name:%s\n",p->qq);
printf("name:%s\n",p->from);
printf("--------------------------------------\n");
p = p->next;
}
}
void save(struct stu *p)
{
FILE *fp;
fp = fopen("D:\\student.txt","w");
while(p!=NULL)
{
fprintf(fp,"--------------------------------------\n");
fprintf(fp,"%s\n",p->name);
fprintf(fp,"name:%d\n",p->score);
fprintf(fp,"name:%s\n",p->qq);
fprintf(fp,"name:%s\n",p->from);
fprintf(fp,"--------------------------------------\n");
p = p->next;
}
return ;
}
void read()
{
FILE *fp;
char ch;
fp = fopen("D:\\student.txt","r");
while(ch = fgetc(fp)!=EOF)
{
putchar(ch);
}
return ;
}
void delete(struct stu *u)
{
struct stu *p,*p1;
char name[20];
p = u;
printf("(delete)please input name:");
scanf("%s",&name);
if(strcmp(u->name,name)==0) // 如果链表的头部就是需要删除的信息,那就将头部信息的地址更换为head->next
{
head = u->next;
return ;
}
while(p!=NULL) // 如果不是链表的头部信息,那就通过遍历链表查询,删除掉需要删除的信息
{
if(strcmp(p->name,name)==0)
{
printf("find this name\n");
p = p->next;
break;
}
p1 = p;
p = p->next;
}
if(p==NULL)
{
printf("not find\n");
}
p1->next = p;
return ;
}
如有错误,请各位大哥大姐不吝自己的意见,批判提出,大家共同进步。哈哈哈哈哈哈。
下面是代码的逐行解释:
1、struct Student *modify():定义了一个返回指向Student结构体的指针的函数modify,该函数接受两个参数,即Stu和count。
2、{:大括号表示函数modify的开始。
3、struct Student *p:声明了一个指向Student结构体的指针变量p。
4、p = Stu;:将Stu赋值给p,使其指向整个学生数组。
5、int number:声明了一个整型变量number,用于存储要修改的学生学号。
6、int i = 0;:声明并初始化一个整型变量i,用于跟踪要修改的学生在数组中的位置。
7、int isbd = 1;:声明并初始化一个整型变量isbd,表示是否继续修改。
8、int j;:声明了一个整型变量j,用于存储用户选择的选项。
9、printf("请选择你要修改学生的学号\n");:输出提示信息,要求用户输入要修改的学生学号。
10、scanf("%d", &number);:从标准输入中读取一个整数值,将其存储在number变量中。
11、while (p[i].id != number && i < count) {:当要修改的学生学号与用户输入的不匹配或未找到该学生时,执行循环体。
12、i++;:将i的值增加1。
13、p++;:将p指向下一个学生。
14、if (number == p[i].id):判断要修改的学生是否找到了。
15、{:如果找到了要修改的学生,则执行括号中的代码。
16、while (isbd):当用户选择继续修改时,执行循环体。
17、{:开始内部循环,用于显示修改选项并读取用户输入。
18、printf("\n1.修改学号 2.修改姓名 3.修改性别 4.修改年龄 5.修改成绩 0.退出修改");:输出提示信息,显示可用的选项。
19、scanf("%d", &j);:从标准输入中读取一个整数值,将其存储在j变量中。
20、switch (j):根据用户选择的选项执行相应的代码。
21、case 1::如果用户选择了修改学号。
22、printf("请输入修改后的学号\n");:输出提示信息,要求用户输入修改后的学号。
23、scanf("%d", &p->id);:从标准输入中读取一个整数值,将其存储在p->id(即选中学生的学号)中。
24、break;:跳出switch结构。
25、case 2::如果用户选择了修改姓名。
26、printf("请输入修改后的姓名\n");:输出提示信息,要求用户输入修改后的姓名。
27、scanf("%s", p->name);:从标准输入中读取一个字符串,将其存储在p->name(即选中学生的姓名)中。
28、break;:跳出switch结构。
29、以此类推,一直到所有选项对应的代码都写好。
30、default::如果用户选择的选项不在以上所有情况中,则执行这里的代码。
31、默认为啥也不做,直接跳出switch结构。
32、}:内部循环结束,即用户选择完选项后执行的相关代码结束。
33、isbd = 0;:将isbd的值设为0,表示用户已选择退出修改。
34、break;:跳出外部循环,即查找学生结束后的操作。
35、}:内部循环结束,即修改学生信息的相关代码结束。
36、return Stu;:返回指向修改后学生的指针。
37、}:函数modify的结束。