用C语言简单语句写的学生管理系统
涉及知识:输入输出语句,循环语句,字符串,结构体,goto语句,分模块编程
结果图片:实现功能:
1.添加、删除、查看、修改学生信息(5个模块)
2.将学生信息按照成绩排序(1个模块)
我使用的编程软件:Dev
主函数代码如下:
(有大量注释帮助理解,觉得碍眼请手动删除)
/************************************
函数功能:菜单显示
函数原型:int main (void)
函数传参:无
函数返回值: 无
完成时间:22/03/21 18:07
作者:*****
***********************************/
#include "main.h"
int k; //全局变量的定义——使用
struct add_student_news stu1[100]= {
{15,"陈赫","男",560},
{16,"郝建","男",246},
{17,"跑男","男",530},
// {18,"baby","女",450},
}; //结构体的固定定义格式
int main(int argc, char *argv[])
{
while(1)
{
// int i;
int num;
printf("/********************菜单******************/\n");
printf("1.添加学生信息\n");
printf("2.删除学生信息\n");
printf("3.查看学生信息\n");
printf("4.查看单人信息\n");
printf("5.修改学生信息\n");
printf("6.将学生信息按照成绩排序\n");
printf("0 输入0退出\n");
printf("输入数字选择要执行的功能:");
scanf("%d",&num);
getchar();
switch (num) //调用子函数
{
case 0:return 0;
case 1:add_stu_news();break;
case 2:del_stu_news();break;
case 3:look_stu_news();break;
case 4:look_alone_stu();break;
case 5:ame_stu_news();break; //删除学生信息
case 6:order_stu_score();break;
}
}
return 0;
}
/**********************
六大部分:
1.ifndef 部分
2.头文件
3.宏定义
4.结构体
5.extern 全局变量
6.extern 函数名
//尽量不要顺序错乱
************************/
#ifndef MAIN_H
#define MAIN_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct add_student_news //输入学生信息的结构体 // 结构体声明
{
int ID;//添加学号
char name[100];//添加姓名//此处已经是全局变量了。
char sex[100];//添加性别 //
int score;//添加成绩
};
/***********************************************
枚举: 菜单选择用枚举显示
enum NUM
{
}
***********************************************/
struct add_student_news stu1[100]; //结构体数组声明
extern int k;//输入学生信息的次数
//k=0; ///.h不能赋值,只能声明
extern void add_stu_news(void);
extern void del_stu_news(void);
extern void look_stu_news(void);
extern void ame_stu_news(void);
extern void look_alone_stu (void);
extern void order_stu_score(void);
//void aaaa();
#endif
/*******************************
函数功能:添加学生信息
无参无返类型;
函数原型: void add_stu_news(void)
时间:22/03/21 18:17
*********************************/
#include "main.h"
//static int k;
//extern int k; //再main.c函数中正确定义一次进行了,其他地方不用再定义了
// k=0;
void add_stu_news(void) //添加学生信息
{
/* struct add_student_news stu1[3]=
{
{15,"陈赫","男",560},
{16,"郝建","男",246},
{17,"跑男","男",530},
// {18,"baby","女",450}, //结构体 是全局变量。 不要在这里定义
}; */
int i;
int num;
char choose;
char Y,N;
while(1)
{
printf("输入要添加的人数:");
scanf("%d",&num);
printf("请输入学生数据,学号+姓名+性别+成绩\n");
for(i=3;i<3+num;i++)
{
printf("输入学号:");scanf("%d",&stu1[k+3].ID); getchar();
printf("输入姓名:");scanf("%s",&stu1[k+3].name); getchar();
printf("输入性别:");scanf("%s",&stu1[k+3].sex); getchar();
printf("输入成绩:");scanf("%d",&stu1[k+3].score); getchar();
k++; //k是增加的学生的个数,注意:原来已经有三个初始化学生信息,所以以后是k+3表示储存学生人数的数组的长度。
}
printf("%d人以输入完毕\t",num);
pe: printf("是否继续输入?y or n\n");
scanf("%c",&choose);
getchar();
// printf("choose=%c",choose);
if(choose=='n')
{
break;
}
else if(choose=='y')
{
continue;
}
else
{
printf("输入错误,请重新输入。");
goto pe;
}
}
}
/****************************
函数功能:删除学生信息
无参无返类型
函数原型: void del_stu_news(void)
*****************************/
#include "main.h"
void del_stu_news(void)
{
int i;
int j;
int put_ID;
int k_low;
printf("输入删除学生学号:");
scanf("%d",&put_ID);
getchar();
int a[10]={0};
int b[10]={1,2};
a[10]= b[10];
for(i=0;i<k+3;i++)
{
printf("测试i");
if(put_ID==stu1[i].ID)
{
k_low=1;
for(j=i;j<k+3;j++) //让他少输出一行
{
stu1[j]=stu1[j+1]; //结构体可以直接对结构体赋值。数组没法直接对数组赋值 (可以直接赋值),只要内部结构相同就可以赋值
// stu1[j].ID=stu1[j+1].ID;
// stu1[j].name=stu1[j+1].name; //强转? *************************************** 正解:strcpy(字符串1,字符串2) .可以实现把串2覆盖到串1
// stu1[j].sex=stu1[j+1].sex; //字符也不能直接复制,数组赋值给数组的赋值方法是 同上↑
// stu1[j].score=stu1[j+1].score;
}
if(k_low==1)
{
k--; //让存放学生信息的数组长度减1,所以最后一行不输出了。最后一行和倒数第二行相同 ,所以只输出一行
}
printf("学号为【%d】信息删除完毕!\n",put_ID);
}
}
}
/*************************
函数功能:查看学生信息
用法:输入密码和初始密码一致,则查看所有学生信息
函数原型: void look_stu_news(void)
时间:22/03/21 19:07
*************************/
#include "main.h"
void look_stu_news(void) //输入密码查找所有学生信息
{
char real_passwd[100]={'1','2','3'};
char put_passwd[100];
int i;
int flag=3; //密码输入错误循环的次数,超过3次结束输入
// extern int k;
// printf("*********************%d",k);
te: printf("输入密码查看所有学生信息:");
gets(put_passwd);
if(flag==1)
{
printf("密码已错误三次,请不要再尝试!\n\n\n");
return ;
}
if(strcmp(real_passwd,put_passwd)==0)
{
printf("ID\t名字\t性别\t成绩\t\n"); //测试输入的输出
for(i=0;i<k+3;i++)
{
printf("%d\t%s\t%s\t%d\t\n",stu1[i].ID,stu1[i].name,stu1[i].sex,stu1[i].score);
}
}
else
{
printf("密码输入错误还有%d次机会\n",flag-1);
flag--;
//printf("@@@@@@%d",flag);
goto te; //跳传开始,并消耗一次机会
}
}
/*******************************
函数功能:按照学生成绩排序
函数类型:无参无返类型
函数原型: void order_stu_score(void)
时间:22/03/21 19:16
******************************/
#include "main.h"
void order_stu_score(void)
{
int i;
int j;
struct add_student_news temp; //定义一个struct add_student_news类型的空文件夹。
//int temp;
printf("将学生信息按照成绩排序:\n");//由成绩决定信息。
for(i=0;i<k-1+3;i++) //用冒泡法将成绩排序 //已知有k+3个学生 ,k为输入添加的学生次数,3为初始化的3个学生信息
{
for(j=0;j<k-1-i+3;j++)
{
if(stu1[j].score<stu1[j+1].score)
{
temp=stu1[j+1];
stu1[j+1]=stu1[j];
stu1[j]=temp;
}
}
}
for(i=0;i<k+3;i++)
{
printf("ID\t名字\t性别\t成绩\t\n"); //测试输入的输出
for(i=0;i<k+3;i++)
{
printf("%d\t%s\t%s\t%d\t\n",stu1[i].ID,stu1[i].name,stu1[i].sex,stu1[i].score);
}
printf("成绩排序为:\n");
printf("ID\t姓名\t性别\t成绩\t\n");
printf("%d\t%s\t%s\t%d\n",stu1[i].score);
}
}
/*************************
函数功能:查看单个学生成绩
函数类型:无参无返类型
函数原型: void look_alone_stu (void)
时间:22/03/21 19:19
*************************/
#include "main.h"
void look_alone_stu (void)
{
int i,j;
int put_ID=0;
char choose;
int num;
char put_name[100];
int flag=0;
int a,b;
printf("通过ID查看信息回复“1 ”,通过姓名查看信息回复“2 ”\n");
scanf("%d",&num);
getchar();
// while(1)
// {
if(num==1)
{
te : printf("输入需要查看学生的【ID】:");
scanf("%d",&put_ID);
getchar();
//【判断ID是否相同 //检索k次
for(i=0;i<k+3;i++)
{
if(put_ID==stu1[i].ID) //输入的值和学生信息数组中的ID值相比较,一致则进入if
{
printf("@@@@\t");
printf("已检索到目标学生,该学生信息如下:\n");
printf("ID\t名字\t性别\t成绩\t\n"); //测试输入的输出
printf("%d\t%s\t%s\t%d\n",stu1[i].ID,\
stu1[i].name,stu1[i].sex,stu1[i].score);
flag++;
if(flag=1)
{
return;
}
}
}
printf("ID查无此人,是否重新输入?y/n :\t");
scanf("%c",&choose);
getchar();
if(choose=='y')
{
goto te;
}
else
return;
}
else if(num==2) //按照姓名查看学生信息;
{
printf("输入需要查看学生的【姓名】:");
gets(put_name);
// getchar();
for(i=0;i<k+3;i++)//【判断ID是否相同 //检索k次
{
if(!strcmp(put_name,stu1[i].name))
{
printf("已检索到目标学生,该学生信息如下:\n");
printf("ID\t名字\t性别\t成绩\t\n"); //测试输入的输出
printf("%d\t%s\t%s\t%d\n",stu1[i].ID,\
stu1[i].name,stu1[i].sex,stu1[i].score);
}
}
}
else
{
printf("输入错误\n");
}
// }
}
/**********************
函数功能:修改学生信息
函数类型:无参无返类型
函数原型: void ame_stu_news (void)
时间:22/03/21 19:20
***********************/
#include "main.h"
void ame_stu_news (void) //修改学生信息
{
int i,flag=0;
int put_ID;
char choose;
char amend_content[100]; //字符型修改信息[100]
// extern int k;
char id[100]="ID"; //strcmp比较需要两方都是字符串数组
char xm[100]="姓名";
char xb[100]="性别";
char cj[100]="成绩";
int change_ID;
char change_xm[100];
// char arr_amend [100]={'ID','姓名','性别','成绩'};
ne: printf("输入需要修改学生的ID:");
scanf("%d",&put_ID);
getchar();
for(i=0;i<k+3;i++)//【判断ID是否相同 //检索k次
{
printf("i=%d\n",i);
printf("000");
if(put_ID==stu1[i].ID)
{
printf("已检索到目标学生,该学生信息如下:\n");
printf("ID\t姓名\t性别\t成绩\t\n"); //测试输入的输出
printf("%d\t%s\t%s\t%d\n",stu1[i].ID,\
stu1[i].name,stu1[i].sex,stu1[i].score);
printf("请选择你要修改的内容:ID/姓名/性别/成绩\n");
// scanf("%s",&amend_content);
gets(amend_content);
// getchar();
// printf("@@@%s",amend_content);
if(!strcmp(amend_content,id)==1) //变更id
{
printf("输入需要【变更%s】 的内容为:\t",amend_content);
// printf("ID前@@@@@%d",stu1[i].ID);
scanf("%d",&stu1[i].ID);
//printf("ID后@@@@@@%d",stu1[i].ID);
// scanf("%d",&change_ID);
getchar();
// stu1[i].ID=change_ID;
flag++;
goto me;
}
else if (!strcmp(amend_content,xm)==1) //变更姓名
{
printf("输入需要【变更%s】 的内容为:\t",amend_content);
// printf("姓名前@@@@@%s",stu1[i].name);
scanf("%s",&stu1[i].name); //因为这里直接更改的首地址,所以原来的内容覆盖了
// printf("姓名后#@@@@@%s",stu1[i].name);
getchar();
flag++;
// scanf("%c",&change_xm);
// gets(change_xm);
// printf("+++++++%s",change_xm);
// stu1[i].name=&change_xm;
goto me;
}
else if(!strcmp(amend_content,xb))//变更性别
{
printf("输入需要【变更%s】 的内容为:\t",amend_content);
scanf("%s",&stu1[i].sex);
getchar();
flag++;
goto me;
}
else if(!strcmp(amend_content,cj))//变更成绩
{
printf("输入需要【变更%s】 的内容为:\t",amend_content);
scanf("%d",&stu1[i].score);
getchar();
flag++;
goto me;
}
else
{
printf("输入错误,请重新输入:或者直接返回\n");
}
}
}
printf("学生ID输入错误\n"); //用于第一次输入错误 选择
printf("是否继续输入?y or n\n");
scanf("%c",&choose);
getchar();
if(choose=='n')
{
return ;
}
me: if(flag>=1) //用于修改一次后继续修改
{
printf("修改完毕,是否退出?y or n ");
scanf("%c",&choose);
getchar();
if(choose=='n')
{
goto ne;
}
else
return;
}
}