2021-06-01

C语言课程设计-----学生信息管理系统
【例】设计一个学生信息管理系统。
主要功能设计与开发一个学生信息管理系统,对学生的学号、姓名、性别、年龄等基本信息进行管理,实现基本的增、删、改、查等功能。
//stufun.h
#include <stdio.h> //I/O函数
#include <stdlib.h> //标准库函数
#include <string.h> //字符串函数
#include <ctype.h> //字符操作函数
#define M 50 //定义常数表示记录数
typedef struct //定义数据结构
{
char no[20]; //学号
char name[20]; //姓名
char sex[5]; //性别
int age; //年龄
}STUDENTS;
//以下是函数原型
int menu_select(); //主菜单函数
int enter(STUDENTS t[]); //输入记录
void list(STUDENTS t[],int n); //显示记录
void search(STUDENTS t[],int n); //按姓名查找显示记录
int del(STUDENTS t[],int n); //删除记录
int add(STUDENTS t[],int n); //插入记录
void save(STUDENTS t[],int n); //记录保存为文件
int load(STUDENTS t[]); //从文件中读记录
void display(STUDENTS t[],int n); //按序号查找显示记录
void sort(STUDENTS t[],int n); //按姓名排序
void copy(); //文件复制
void print(STUDENTS temp); //显示单条记录
int find_name(STUDENTS t[],int n,char *s); //按姓名查找函数
int find_no(STUDENTS t[],int n,char *no); //按学号查找
void modify(STUDENTS t[],int n); //修改记录

//stufun.cpp
#include"stufun.h"
//菜单函数,函数返回值为整数,代表所选的菜单项
int menu_select()
{
char s[80];
int c;
printf(“主菜单***\n”);
printf(" 0. 输入学生记录\n");
printf(" 1. 浏览学生记录\n");
printf(" 2. 按姓名查找\n");
printf(" 3. 按姓名删除\n");
printf(" 4. 按学号修改\n");
printf(" 5. 插入学生记录\n");
printf(" 6. 保存记录到文件\n");
printf(" 7. 加载文件到内存\n");
printf(" 8. 按序号浏览\n");
printf(" 9. 按姓名排序\n");
printf(" 10.拷贝到新文件\n");
printf(" 11.程序退出\n");
printf(“\n");
do
{
printf("\n 输入您的菜单选项编号(0-11)😊; //提示输入选项
scanf("%s",s); //输入选择项
c=atoi(s); //将输入的字符串转化为整型数
getchar();
}while(c<0||c>11); //选择项不在0~11之间重输
return c; //返回选择项,主程序根据该数调用相应的函数
}
//输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度
int enter(STUDENTS t[])
{
int i,n;
system(“cls”);
printf("\n请输入学生记录条数:\n");
scanf("%d",&n); //输入记录数
printf(“请输入学生记录:\n”);
printf(“学号 姓名 性别 年龄\n”);
printf("----------------------------------------------------\n");
for (i=0;i<n;i++)
{
scanf("%s",t[i].no); //输入学号
scanf("%s",t[i].name); //输入姓名
scanf("%s",t[i].sex); //输入性别
scanf("%d",&t[i].age); //输入年龄
}
getchar();
return n; //返回记录条数
}
//显示记录,参数为记录数组和记录条数
void list(STUDENTS t[],int n)
{
int i;
system(“cls”);
printf("\n
学生清单
\n");
printf(“学号 姓名 性别 年龄\n”);
printf("----------------------------------------------------\n");
for(i=0;i<n;i++)
{
printf("%-20s%-20s%-10s%-10d\n",t[i].no,t[i].name,t[i].sex,t[i].age);
if((i+1)%10==0&&n%10>0) //判断输出是否达到10条记录
{
printf("----------------------------------------------------\n");
printf(“每页显示10条学生记录,按回车键向后翻页…\n”);
getchar();
system(“cls”);
printf("\n
学生清单*******\n”);
printf(“学号 姓名 性别 年龄\n”);
printf("----------------------------------------------------\n");
}
}
printf("----------------------------------------------------\n");
}
//查找记录
void search(STUDENTS t[],int n)
{
char s[20]; //保存待查找姓名字符串
int i; //保存查找到结点的序号
system(“cls”);
printf(“请输入查找的姓名:\n”);
scanf("%s",s); //输入待查找姓名
getchar();
i=find_name(t,n,s); //调用find_name函数,得到一个整数
if(i>n-1) //如果整数i值大于n-1,说明没找到
printf(“没有姓名为%s的学生!\n”,s);
else
print(t[i]); //找到,调用显示函数显示记录
}
//删除函数,参数为记录数组和记录条数
int del(STUDENTS t[],int n)
{
char s[20]; //要删除记录的姓名
int ch=0;
int i;
printf(“请输入要删除的学生姓名:\n”);
scanf("%s",s); //输入姓名
getchar();
i=find_name(t,n,s); //调用find_name函数
if(i==n)
printf(“没有找到名字为%s的学生!\n”,s);
else
{
printf(“正在删除中!\n”);
for(;i<n;i++) //从删除位置开始依次前移学生记录
{
strcpy(t[i].name,t[i+1].name);
strcpy(t[i].no,t[i+1].no);
strcpy(t[i].sex,t[i+1].sex);
t[i].age=t[i+1].age;
}
n–; //删除后记录数减1
printf(“删除成功!\n”);
}
return n; //返回记录数
}
//插入记录函数,参数为结构体数组和记录数
int add(STUDENTS t[],int n)
{
STUDENTS temp; //新插入记录信息
int i,j;
char s[20]; //确定插入在哪个记录之前
printf(“请输入要插入的学生记录:\n”);
printf("*\n");
printf(“学号 姓名 性别 年龄\n”);
printf("----------------------------------------------------\n");
scanf("%s%s%s%d",temp.no,temp.name,temp.sex,&temp.age);
//输入插入信息
getchar();
printf("----------------------------------------------------\n");
if(n>0)
{
printf(“请输入插入位置的姓名,将新记录插入在该名字前:\n”);
scanf("%s",s); //输入插入位置的姓名
getchar();
i=find_name(t,n,s); //调用find_name,确定插入位置
}
else
i=0;
for(j=n-1;j>=i;j–) //从最后一个结点开始向后移动一条
{
strcpy(t[j+1].no,t[j].no); //当前记录的学号拷贝到后一条
strcpy(t[j+1].name,t[j].name); //当前记录的姓名拷贝到后一条
strcpy(t[j+1].sex,t[j].sex); //当前记录的性别拷贝到后一条
t[j+1].age=t[j].age; //当前记录的年龄拷贝到后一条
}
strcpy(t[i].no,temp.no); //将新插入记录的学号拷贝到第i个位置
strcpy(t[i].name,temp.name); //将新插入记录的姓名拷贝到第i个位置
strcpy(t[i].sex,temp.sex); //将新插入记录的性别拷贝到第i个位置
t[i].age = temp.age; //将新插入记录的年龄拷贝到第i个位置
n++; //记录数加1
return n; //返回记录数
}
//保存函数,参数为结构体数组和记录数
void save(STUDENTS t[],int n)
{
int i;
FILE fp; //指向文件的指针
if((fp=fopen(“record.txt”,“wb”))==NULL) //打开文件,并判断打开是否正常
{
printf(“无法打开学生记录文件!\n”); //打开失败
exit(1); //退出
}
printf("\n正在保存中\n");
fprintf(fp,"%d",n); //将记录数写入文件
fprintf(fp,"\r\n"); //将换行符号写入文件
for(i=0;i<n;i++)
{
fprintf(fp,"%-20s%-30s%-10s%-10d",t[i].no,t[i].name,t[i].sex,t[i].age);
//格式写入记录
fprintf(fp,"\r\n"); //将换行符号写入文件
}
fclose(fp); //关闭文件
printf("保存成功\n"); //显示保存成功
}
//读入函数,参数为结构体数组
int load(STUDENTS t[])
{
int i,n;
FILE fp; //指向文件的指针
if((fp=fopen(“record.txt”,“rb”))NULL) //打开文件
{
printf(“无法打开学生记录文件!\n”); //打开失败
exit(1); //退出
}
fscanf(fp,"%d",&n); //读入记录数
for(i=0;i<n;i++)
fscanf(fp,"%20s%30s%10s%10d",t[i].no,t[i].name,t[i].sex,&t[i].age);
//按格式读入记录
fclose(fp); //关闭文件
printf(“已经成功加载学生记录文件到内存!\n”); //显示保存成功
return n; //返回记录数
}
//按序号显示记录函数
void display(STUDENTS t[],int n)
{
int id;
printf(“请输入序号:\n”);
scanf("%d",&id); //输入序号
getchar();
if(id>=0&&id<n) //判断序号是否在记录范围内
{
print(t[id]); //调用输出函数显示该记录
printf("\r\n");
}
else
printf("序号为 %d 的学生不存在!\n ",id); //如果序号超出范围提示信息
}
//按姓名排序函数,参数为结构体数组和记录数
void sort(STUDENTS t[],int n)
{
int i,j,flag;
STUDENTS temp; //临时变量做交换数据用
for(i=0;i<n-1;i++)
{
flag=0; //设标志判断是否发生过交换
for(j=0;j<n-1-i;j++)
if((strcmp(t[j].name,t[j+1].name))>0) //比较大小
{
temp=t[j]; t[j]=t[j+1];t[j+1]=temp;
flag++;
}
if(flag
0)break; //如果标志为0,说明没有发生过交换循环结束
}
printf(“排序成功!\n”); //显示排序成功
}
//复制文件
void copy()
{
char outfile[20]; //目标文件名
int i,n;
STUDENTS temp[M]; //定义临时变量
FILE sfp,tfp; //定义指向文件的指针
system(“cls”);
if((sfp=fopen(“record.txt”,“rb”))==NULL) //打开学生记录文件
{
printf(“无法打开学生记录文件!\n”); //打开失败
exit(1); //退出
}
printf(“请输入目标文件名,形如 c:\f1\te.txt:\n”);
scanf("%s",outfile); //输入目标文件名
getchar();
if((tfp=fopen(outfile,“wb”))==NULL) //打开目标文件
{
printf(“无法打开目标文件!\n”); //打开失败
exit(1); //退出
}
fscanf(sfp,"%d",&n); //读出文件记录数
fprintf(tfp,"%d",n); //写入目标文件数
fprintf(tfp,"\r\n"); //写入换行符
for(i=0;i<n;i++)
{
fscanf(sfp,"%20s%30s%10s%10d\n",temp[i].no,temp[i].name,temp[i].sex,&temp[i].age);
//读入记录
fprintf(tfp,"%-20s%-30s%-10s%-10d\n",temp[i].no,temp[i].name,temp[i].sex,temp[i].age);
//写入记录
fprintf(tfp,"\r\n"); //写入换行符
}
fclose(sfp); //关闭源文件
fclose(tfp); //关闭目标文件
printf(“已经成功复制学生记录到目标文件!\n”); //显示复制成功
}
//显示指定的一条记录
void print(STUDENTS temp)
{
printf("\n
\n");
printf(“学号 姓名 性别 年龄\n”);
printf("----------------------------------------------------\n");
printf("%-20s%-20s%-10s%-10d\n",temp.no,temp.name,temp.sex,temp.age);
printf("----------------------------------------------------\n");
}
//按姓名查找函数,参数为记录数组和记录条数以及姓名s
int find_name(STUDENTS t[],int n,char *s)
{
int i;
for(i=0;i<n;i++) //从第一条记录开始,直到最后一条
{
if(strcmp(s,t[i].name)==0) //记录中的姓名和待比较的姓名是否相等
return i; //相等,则返回该记录的下标号,程序提前结束
}
return i; //返回i值
}
//按学号查找函数,参数为记录数组和记录条数以及学号no
int find_no(STUDENTS t[],int n,char *no)
{
int i;
for(i=0;i<n;i++) //从第一条记录开始,直到最后一条
{
if(strcmp(no,t[i].no)0) //记录中的学号和待比较的学号是否相等
return i; //相等,则返回该记录的下标号,程序提前结束
}
return i; //返回i值
}
//修改函数,按照输入学号修改
void modify(STUDENTS t[],int n)
{
char no[20]; //要修改记录的学号
int ch=0;
int i;
printf(“请输入要修改的学生学号:\n”);
scanf("%s",no); //输入学号
getchar();
i=find_no(t,n,no); //调用find_no函数
if(i
n)
printf(“没有找到学号为%s的学生!\n”,no);
else
{
printf(“学号为%s的学生修改前:\n”,no);
print(t[i]);
printf(“请输入修改后学生记录:\n”);
printf(“学号 姓名 性别 年龄\n”);
printf("----------------------------------------------------\n");
scanf("%s",t[i].no);
scanf("%s",t[i].name);
scanf("%s",t[i].sex);
scanf("%d",&t[i].age);
getchar();
printf(“学号为%s的学生修改后:\n”,no);
print(t[i]);
}
}
//stuims.cpp
#include"stufun.h"
//主函数开始
void main()
{
STUDENTS stu[M]; //定义结构体数组
int length; //保存记录长度
for(;😉 //无限循环
{
system(“cls”); //清屏
switch(menu_select()) //调用主菜单函数,返回值作为开关语句的条件
{
case 0:length=enter(stu);break; //输入记录
case 1:list(stu,length);break; //显示全部记录
case 2:search(stu,length);break; //按姓名查找记录
case 3:length=del(stu,length);break; //按姓名删除记录
case 4:modify(stu,length);break; //按学号修改记录
case 5:length=add(stu,length);break; //插入记录
case 6:save(stu,length);break; //保存文件
case 7:length=load(stu);break; //加载文件到内存
case 8:display(stu,length);break; //按序号显示记录
case 9:sort(stu,length);break; //按姓名排序
case 10:copy();break; //复制文件到目标文件
case 11:exit(0); //程序结束
}
printf(“按回车键返回主菜单…\n”); //提示信息
getchar();
}
return;
}
上面实现的学生信息管理系统,主要管理学生的学号、姓名、性别、年龄四种信息。我们知道学生的基本信息还有其他如:籍贯、民族、所在院系、所学专业等,请同学们思考如何扩展现有系统,使得能够管理的学生信息更全面?
另外,上面系统的功能并不能满足日常管理需要。比如,我们经常会按照学生的学号进行查找和排序等,如何改进系统,使它更实用?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值