C语⾔编写学⽣成绩信息管理系统
aspiration是可数名词吗⽤C语⾔设计简单的学⽣成绩信息管理系统
介绍
软件⽅⾯采⽤的是 Visual Studio 2019 IDE ⼯具。
程序⽅⾯采⽤结构体数组,成员包括学号、姓名以及⼀科成绩。程序整体采⽤分模块编程形式,包括主函数在内共10个函数,实现功能有信息的录⼊、浏览、查询、修改、删除、数据保存到⽂件以及成绩的排序。程序⽐较简单,结构体成员只有三个,没有什么技术含量,后期看看有没有能⼒⽤链表来编写这个程序。
代码
结构体数组的定义
函数开始前,是结构体数组的定义。这⾥直接使⽤typedef定义结构体数组,⼀步到位。后续可⽤STUDENT来进⾏变量声明了home_page() 函数
这个是主界⾯的显⽰函数,完整的声明为:void home_page(),⽆形参,⽆返回值,单纯⽤printf()函数打印的界⾯。
完整代码
void home_page()
{
printf("\n\t\t******************************** \n");
printf("\t\t    学⽣成绩信息管理系统      \n\n");
printf("\t\t        1、录⼊信息            \n\n");
printf("\t\t        2、浏览信息            \n\n");
printf("\t\t        3、查询信息            \n\n");
printf("\t\t        4、修改信息            \n\n");
printf("\t\t        5、成绩排序            \n\n");
printf("\t\t        6、删除信息            \n\n");
printf("\t\t        7、向⽂件写⼊数据      \n\n");
excel表格图文教程printf("\t\t        8、从⽂件读出数据      \n\n");
printf("\t\t        9、退出系统            \n\n");
printf("\t\t******************************** \n\n");
}
运⾏效果
其中,“输⼊标号选择功能:”字样是在 main() 函数中调⽤ home_page() 函数后,打印的提⽰语。
add_infor() 函数
这是实现信息录⼊功能的函数,完整的函数声明是:int add_infor(STUDENT stu[], int n),形参为结构
体数组stu[]和结构体数组个数n,返回值n+i是添加完信息后的结构体数组的总个数。函数内部,i变量是每次添加的信息的个数,sign变量作为连续输⼊的标志。这⾥判断是否连续输⼊,我原来⽤的⽅法是判断stu[n+i].num的值是否为-1,编译成功没有报错,但是实际运⾏过程中会出现⼀些问题,应该是逻辑上的问题。我暂且换成每输⼊⼀条信息后,判断是否继续输⼊第⼆条信息,实际使⽤时会有⼀些繁琐,但总体效果相差⽆⼏。
完整代码
int add_infor(STUDENT stu[],int n)
{
int i =0;
char sign ='Y';
while((sign =='Y')||(sign =='y'))
{
printf("\n\t\t\t学号:");
scanf("\t\t%s", stu[n + i].num);
printf("\t\t\t姓名:");
scanf("\t\t%s", stu[n + i].name);
printf("\t\t\t成绩:");
scanf("\t\t%f",&stu[n + i].score);
printf("\n\t\t\t是否继续录⼊?(Y/N):");
sign =getchar();
i++;
}
return(n + i);
}
上述代码在 Visual Studio 2019 IDE 中编译时,scanf()函数会报出警告,警告代码为:C6031,说明为:返回值被忽略。解决⽅法有两个,第⼀种是将scanf替换为scanf_s,我没有采⽤这种⽅法,因为scanf_s并不是 C 语⾔中的,⽽是 Visual Studio 开发⼯具提供的⼀个功能相同的安全标准输⼊函数,如果换为scanf_s,在另⼀个编译器下就可能会出问题;第⼆种是使⽤#define _CRT_SECURE_NO_WARNINGS 1,具体做法可百度查,经实测,这种⽅法是可⾏的。但是,如果两种⽅法都不采取,即不消除这个警告,实际上对程序的正确运⾏也没有影响。
运⾏效果
“录⼊学⽣成绩信息”字样由 main() 函数在调⽤ add_infor() 函数前打印
browse_infor() 函数
这是实现浏览录⼊信息功能的函数,完整声明为:void browse_infor(STUDENT stu[], int n),形参为结构体数组stu[]和结构体数组个数n,⽆返回值。函数内部,i是作为循环控制变量,传⼊数组个数n,然后通过 for 循环,依次打印出结构体成员的值。
完整代码
void browse_infor(STUDENT stu[],int n)
{
int i;
printf("\n\n");
printf("\t\t学号\t姓名\t成绩\n\n");
for(i =0; i < n; i++)
{
printf("\t\t%s\t%s\t %3.1f\n",stu[i].num,stu[i].name,stu[i].score);
}
}
运⾏效果
“浏览学⽣成绩信息”字样由 main() 函数在调⽤ browse_infor() 函数前打印
find_infor() 函数
这是实现信息查功能的函数,完整的声明为:void find_infor(STUDENT stu[], int n),形参为结构体数组stu[]和结构体数组个数n,⽆返回值。函数内部,⼜分为通过学号查和通过姓名查两种⽅式,变量option存放键⼊的选项,两个字符串数组分别存放查的学号和姓名。先选择查⽅式,输⼊对应⽅式的值,然后遍历数组,通过strcmp()函数判断数组中是否有与输⼊相同的值,若⽆相同的值则显⽰“未到!”的信息,若有相同值则将该结构体成员的信息打印到屏幕上。
完整代码
void find_infor(STUDENT stu[],int n)
{
int option;
int i =0;
char search_num[10]={0};
char search_name[20]={0};
printf("\n\t\t\t1、按学号查\n");
printf("\t\t\t2、按姓名查\n");
javascript高级课程printf("\n\t\t\t请选择相应的选项:");
scanf("%d",&option);
system("cls");
if(1== option)
{
printf("\n\t\t请输⼊要查的学号:");
scanf("%s", search_num);
while((strcmp(stu[i].num, search_num)!=0)&& i < n)
{
i++;
}
}
if(2== option)
{
printf("\n\t\t请输⼊要查的姓名:");
scanf("%s", search_name);
while((strcmp(stu[i].name, search_name)!=0)&& i < n)
{
i++;
sql删除数据的语句}
}
if(i == n)
{
printf("\n\t\t未到!");
return;
}
printf("\n\t\t学号:%s\n", stu[i].num);
printf("\t\t姓名:%s\n", stu[i].name);
printf("\t\t成绩:%3.1f\n", stu[i].score);
}
从上述代码中可以看到,在定义两个字符串数组时,均赋了初值0,若此处没有赋初值0时,上段代码在 Visual Studio 2019 IDE 中编译时,strcmp()函数会报警告,警告代码为:C6054,说明为:可能没有为字符串“xxx”添加字符串零终⽌符。深⼊了解strcmp()函数可以知道,其功能是两个字符串⾃左向右逐个字符相⽐(按 ASCII 值⼤⼩相⽐较),直到出现不同的字符或遇 ‘\0’ 为⽌。所以此处在定义字符串数组时,将其初始化为 ‘\0’ ,即char search_num[10] = { 0 };,就可以消除此类警告。
运⾏效果
modify_infor() 函数
这是实现信息修改功能的函数,函数声明为:int modify_infor(STUDENT stu[], int n),形参为结构体数组stu[]和结构体数组个数n。函数内部,可选择通过学号查修改和通过姓名查修改两种⽅式。查部分与void find_infor(STUDENT stu[], int n)函数⼀致;修改部分有修改学号、姓名、成绩三个选项,修改的实现形式是:通过查部分得出待修改的数组下标,然后通过strcpy()函数,将输⼊的修改后的学号和姓名赋值给下标对应的成员,分数的修改则直接赋值。
完整代码
格式工厂format
int modify_infor(STUDENT stu[],int n)
{
int option, choice;
int i =0;
char old_temp[20]={0};
char new_temp[20]={0};
float new_score;
printf("\n\t\t\t1、按学号查修改\n");
printf("\t\t\t2、按姓名查修改\n");
printf("\n\t\t请输⼊选项选择功能:");
scanf("%d",&option);
system("cls");
if(1== option)
{
printf("\n\t\t请输⼊学号:");
scanf("%s",&old_temp);
while((strcmp(stu[i].num, old_temp)!=0)&& i < n)
{
i++;
}
if(i == n)
{
printf("\n\t\t未到!");
}
}
if(2== option)
{
printf("\n\t\t请输⼊姓名:");
scanf("%s",&old_temp);
while((strcmp(stu[i].name, old_temp)!=0)&& i < n)
{
i++;
}
if(i == n)
{
printf("\n\t\t未到!");
}
}
printf("\n\t\t待修改学⽣的信息:\n");
printf("\n\t\t学号:%s\n\t\t姓名:%s\n\t\t成绩:%3.1f\n", stu[i].num, stu[i].name, stu[i].score);
printf("\n\t\t请选择要修改的信息(1.学号 2.姓名 3.成绩):");
scanf("%d",&choice);
if(1== choice)
if(1== choice)
{
printf("\n\t\t输⼊修改后的学号:");
scanf("%s",&new_temp);
strcpy(stu[i].num, new_temp);
printf("\t\t修改成功!\n");
}
if(2== choice)
{
printf("\n\t\t输⼊修改后的姓名:");
scanf("%s",&new_temp);
strcpy(stu[i].name, new_temp);
printf("\t\t修改成功!\n");
}
if(3== choice)
冒泡排序代码c语言{
printf("\n\t\t输⼊修改后的成绩:");
scanf("%f",&new_score);
stu[i].score = new_score;
printf("\t\t修改成功!\n");
}
}
此函数中的两个字符串数组在定义时,也需要赋初值,以消除函数strcmp()和strcpy()使⽤时的警告。
运⾏效果
sort_score() 函数
此函数完整声明为:void sort_score(STUDENT stu[], int n),形参为结构体数组stu[]和结构体数组个数n,实现的功能是排序,⽤的是冒泡排序法,按从⼩到⼤的顺序给成绩排序。具体实现形式就是,通过两层循环,外层循环是排序趟数,内层循环是每趟⽐较的次数,相邻两元素⽐较,若前者⼤于后者,则两者进⾏交换,此时为顺序,即从⼩到⼤;若前者⼩于后者且两者交换,则为逆序,即从⼤到⼩。此函数为顺序,且在交换两者值时,学号和姓名使⽤strcpy()函数,成绩的交换使⽤指针。
完整代码

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。