实现功能
- 添加学生
- 删除学生
- 修改学生
- 查询学生
- 显示所有学生信息
- 读取学生信息
- 写入学生信息
- 菜单
简述
该系统主要使用了结构体、数组、循环、条件语句,包含头文件string.h、windows.h,使用结构体做学生数据的存储结构,该结构体存放了学生的基本信息,包括学号、姓名、性别、年龄、院系、专业等相关信息,系统还实现了对于学生的CRUD操作。
运行截图
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define N 100 //最大学生数量为50
typedef struct Student{
int id; //编号
char name[20]; //姓名
char sex[20]; //性别
int age; //年龄
char depart[40]; //院系
char major[40]; //专业
}Student;
Student student[N];
int count = 0; //当前学生数量
/* 以下是函数声明 */
void addStu(); //添加学生信息
void delStu(); //删除学生信息
void modStu(); //修改学生信息
int seaStuById(); //查询学生信息 - 根据ID
void showStu(); //显示学生信息
void print(int id); //显示一条学生信息
void menu(); //菜单
void readStu(); //读取学生信息
void saveStu(); //保存学生信息
/*
* 学生函数的实现
* 以下是函数实现
*/
//添加学生信息
void addStu(){
printf("请输入学生编号(1 - N):");
scanf("%d",&student[count].id);
printf("请输入学生姓名:");
scanf("%s",student[count].name);
printf("请输入学生性别(男/女):");
scanf("%s",student[count].sex);
printf("请输入学生年龄:");
scanf("%d",&student[count].age);
printf("请输入学生院系:");
scanf("%s",student[count].depart);
printf("请输入学生专业:");
scanf("%s",student[count].major);
count++;
}
//删除学生信息
void delStu(){
int id,i;
printf("请输入学生编号:");
scanf("%d",&id);
int index;
index = seaStuById(id);
if(index == -1){
printf("未查找到!\n");
return;
}
//进行覆盖 - 删除指定条目
for(i = index;i < N;i++){
student[i].id = student[i+1].id;
strcpy(student[i].name,student[i+1].name);
strcpy(student[i].sex,student[i+1].sex);
student[i].age = student[i+1].age;
strcpy(student[i].depart,student[i+1].depart);
strcpy(student[i].major,student[i+1].major);
}
count--;
printf("删除成功!\n");
}
//修改学生信息
void modStu(){
int id;
printf("请输入学生编号:");
scanf("%d",&id);
int index;
index = seaStuById(id);
if(index == -1){
printf("未查找到!\n");
return;
}
printf("请输入学生编号(1 - N):");
scanf("%d",&student[index].id);
printf("请输入学生姓名:");
scanf("%s",student[index].name);
printf("请输入学生性别(男/女):");
scanf("%s",student[index].sex);
printf("请输入学生年龄:");
scanf("%d",&student[index].age);
printf("请输入学生院系:");
scanf("%s",student[index].depart);
printf("请输入学生专业:");
scanf("%s",student[index].major);
printf("修改成功!\n");
}
//查询学生信息 - 根据ID
int seaStuById(int id){
int i;
for(i = 0;i < count;i++){
if(student[i].id == id){
return i;
}
}
return -1; //查询失败 - 返回-1的意义在于可以根据返回值的不同做成功与否的验证
}
//显示学生信息
void showStu(){
int i;
printf("---------------------------------------------\n");
printf("学生编号 姓名 性别 年龄 院系 专业\n");
for(i = 0;i < count;i++){
printf("%d %s %s %d %s %s\n",student[i].id,student[i].name,student[i].sex,student[i].age,student[i].depart,student[i].major);
}
printf("---------------------------------------------\n");
}
//显示一条学生信息
void print(int id){
int index;
index = seaStuById(id);
if(index == -1){
printf("未查找到!\n");
return;
}
printf("---------------------------------------------\n");
printf("学生编号 姓名 性别 年龄 院系 专业\n");
printf("%d %s %s %d %s %s\n",student[index].id,student[index].name,student[index].sex,student[index].age,student[index].depart,student[index].major);
printf("---------------------------------------------\n");
}
//菜单
void menu(){
int choice,id;
while(1){
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("---------------------------------------------\n");
printf("请输入您的选择:");
scanf("%d",&choice);
switch(choice){
case 0:
exit(0);
break;
case 1:
addStu();
break;
case 2:
delStu();
break;
case 3:
modStu();
break;
case 4:
printf("请输入查找的学生编号:");
scanf("%d",&id);
print(id);
break;
case 5:
showStu();
break;
case 6:
readStu();
break;
case 7:
saveStu();
break;
default:
printf("输入有误!\n");
break;
}
system("pause");
system("cls");
}
}
//读取学生信息
void readStu(){
int i = 0;
FILE * fp;
fp = fopen("students.txt","a+");
if(fp == NULL){
printf("文件打开失败!\n");
exit(0);
}
fscanf(fp,"%d",&count);
for(i = 0;i < count;i++){
fscanf(fp,"%d %s %s %d %s %s",&student[i].id,student[i].name,student[i].sex,&student[i].age,student[i].depart,student[i].major);
}
fclose(fp);
printf("读取成功!\n");
}
//保存学生信息
void saveStu(){
int i = 0;
FILE * fp;
fp = fopen("students.txt","w");
if(fp == NULL){
printf("文件打开失败!\n");
exit(0);
}
fprintf(fp,"%d\n",count);
for(i = 0;i < count;i++){
fprintf(fp,"%d %s %s %d %s %s\n",student[i].id,student[i].name,student[i].sex,student[i].age,student[i].depart,student[i].major);
}
fclose(fp);
printf("写入成功!\n");
}
int main()
{
menu();
return 0;
}
说明
该版本的代码主体是直接复用了V2.0版本,主要包括CRUD操作、显示数据等。
主要添加了如下代码,也即文件读写部分的代码:
//读取学生信息
void readStu(){
int i = 0;
FILE * fp; //定义FILE指针
fp = fopen("students.txt","a+"); //以读写方式打开文件,如果没有则创建同名文件
if(fp == NULL){
printf("文件打开失败!\n");
exit(0);
}
fscanf(fp,"%d",&count); //从文件中读取数据保存到 count变量
for(i = 0;i < count;i++){
//从文件中读取数据保存到 结构体中
fscanf(fp,"%d %s %s %d %s %s",&student[i].id,student[i].name,student[i].sex,&student[i].age,student[i].depart,student[i].major);
}
fclose(fp); //关闭文件指针
printf("读取成功!\n");
}
//保存学生信息
void saveStu(){
int i = 0;
FILE * fp;
fp = fopen("students.txt","w"); //以只写方式打开文件
if(fp == NULL){
printf("文件打开失败!\n");
exit(0);
}
fprintf(fp,"%d\n",count); //读取count变量的值存储到文件的首行
for(i = 0;i < count;i++){
//保存已有的结构体对象保存到文件中
fprintf(fp,"%d %s %s %d %s %s\n",student[i].id,student[i].name,student[i].sex,student[i].age,student[i].depart,student[i].major);
}
fclose(fp);
printf("写入成功!\n");
}
总结
该版本在V2.0基础上开发添加了文件读写的功能,也即现在系统支持保存和读取系统操作的文件,大致上满足了系统的功能需求。但是控制台的操作方式明显不符合当下软件使用的要求,因此更加美化的UI成为了必需,后续我们可以使用一些支持C语言的图形库对系统界面进行一定的优化。