简介
此系统包含简单的增删改查和显示全部信息,学生信息有姓名、班级、学号、成绩
所需头文件
需要创建的文件
这个头文件是自己创建的,这里面是需要用到的函数声明、结构体
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<windows.h>
#include<stdlib.h>
#define MAX 100
#define NAME_MAX 20
#define NUM_MAX 20
#define ClA_MAX 20
enum OPTION
{
Exit, //0
Add,
Delete,
Modify,
Search,
Show,
Sort
};
//类型声明
typedef struct student
{
char name[NAME_MAX];
char cla[ClA_MAX];
char num[NUM_MAX];
int C_num;
int math_num;
int data_num;
}Stu;
//成绩单
typedef struct Grade
{
Stu data[100];//存放的数据
int sz;//已经存放多少信息
}grade;
//函数声明
//初始化成绩单
void InItgrade(grade* pc);
//增加信息
void AddGrade(grade* pc);
//显示信息
void ShowGrade(const grade*pc);
//删除信息
void DelGrade(grade* pc);
//查找信息
void SearchGrade(const grade* pc);
//修改信息
void ModifyGrade(grade* pc);
1、头文件中的#include<assert.h>是断言,可以及时暴露代码可能出现的问题
2、#define定义数据,在需要修改时只需要在一个地方修改所需数字就可以,不需要在代码中一个一个去找
3、enum是枚举,在默认情况下是从0开始,在使用case语句时,利用enum也可以达到数字0、1、2...的效果,并且还可以使编写代码的人可以直观看出选项内容
4、typedef struct student
{...
}Stu;使用typedef可以将结构体重命名为Stu,可以直接使用,不需要将整个结构体的名字写出来
测试代码
#include"student.h"
void menu()
{
printf("------------------------\n");
printf("|----- 1.Add ------|\n");
printf("|----- 2.Del ------|\n");
printf("|----- 3.Modify ------|\n");
printf("|----- 4.Search ------|\n");
printf("|----- 5.Show ------|\n");
printf("|----- 0.Exit ------|\n");
printf("------------------------\n");
}
void test()
{
int input=0;
//学生表
grade gra;
//初始化信息
InItgrade(&gra);
do
{
Sleep(1000);
menu();
printf("请选择操作:");
scanf("%d", &input);
switch (input)
{
case Add:
AddGrade(&gra);
break;
case Delete:
DelGrade(&gra);
break;
case Modify:
ModifyGrade(&gra);
break;
case Search:
SearchGrade(&gra);
break;
case Show:
ShowGrade(&gra);
break;
case Exit:
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
实现函数
初始化信息
void InItgrade(grade* pc)
{
memset(pc->data, 0, sizeof(pc->data));
pc->sz = 0;
}
memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值。
void * memst(void * ptr,int value,size_t num);
(指向要填充内存块的指针,需要设置的值,字节数)
遇到不清楚的函数时可以借助这个网址查询:https://cplusplus.com/
在新版本右上角可以切换到旧版本(个人感觉旧版本好用些)
这个是旧版本,可以直接查询函数
增加信息
void AddGrade(grade* pc)
{
assert(pc); //可以判断指针是否为空,及时发现问题
if (pc->sz == MAX) //先进行判断,学生信息表是否已满
{
printf("学生人数已达上限,无法添加\n");
return;
}
printf("输入名字:");
scanf("%s", pc->data[pc->sz].name);//找到元素,元素的下标sz
printf("输入班级:");
scanf("%s", pc->data[pc->sz].cla);
printf("输入学号:");
scanf("%s", pc->data[pc->sz].num);
printf("输入C语言成绩:");
scanf("%d", &(pc->data[pc->sz].C_num));
printf("输入高数成绩:");
scanf("%d", &(pc->data[pc->sz].math_num));
printf("输入数据结构成绩:");
scanf("%d", &(pc->data[pc->sz].data_num));
pc->sz++; //信息添加成功sz增加
printf("信息添加成功\n");
printf("以添加%d人信息\n", pc->sz);
printf("\n");
}
显示所有信息
void ShowGrade(const grade* pc) //由于不改变数据所以用const修饰
{
assert(pc);
int i = 0;
printf("%-10s %-10s %-10s %-15s %-15s %-15s %10s\n", "姓名", "班级", "学号", "C语言成绩", "高数成绩", "数据结构成绩","总分");
int sum = Gra_Sum(pc->data->C_num, pc->data->math_num, pc->data->data_num); //总成绩
for (i = 0; i < pc->sz;i++)
{
printf("%-10s %-10s %-10s %-17d %-17d %-15d %5d\n",
pc->data[i].name,
pc->data[i].cla,
pc->data[i].num,
pc->data[i].C_num,
pc->data[i].math_num,
pc->data[i].data_num,
sum);
}
}
由于显示的信息中有总成绩,所以可以编写一个函数,在之后的编写中不需要每次使用都写,只需要调用函数就可以
int Gra_Sum(int a, int b, int c)
{
return a + b + c;
}
删除信息
在删除,修改,查询信息时,都需要先找到学生的信息,所以可以单独创建一个函数查找学生的信息,在使用时直接调用
查找学生信息函数
int Find_name(const grade* pc, char name[])
{
assert(pc);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)//比较两个名字是否相等
{
return i; //找到了
}
}
return -1;
}
删除信息函数
void DelGrade(grade* pc)
{
assert(pc);
if (pc->sz == 0)
{
printf("信息为空,无法删除\n");
return;
}
char name[NAME_MAX] = { 0 };
printf("输入学生名字:");
scanf("%s", name);
//找到需要删除的人
int del=Find_name(pc, name);
if (del == -1)
{
printf("学生不存在\n");
return;
}
int i = 0;
for (i = del; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("成功删除学生信息");
printf("剩余%d人信息\n", pc->sz);
printf("\n");
}
查找信息
void SearchGrade(const grade* pc)
{
assert(pc);
char name[NAME_MAX] = { 0 };
printf("输入查找名字:");
scanf("%s", name);
int pos = Find_name(pc, name);//查找位置
if (pos == -1)
{
printf("不存在学生\n");
}
else
{
printf("%-10s %-10s %-10s %-15s %-15s %-15s %10s\n", "姓名", "班级", "学号", "C语言成绩", "高数成绩", "数据结构成绩", "总分");
int sum = Gra_Sum(pc->data->C_num, pc->data->math_num, pc->data->data_num); //总成绩
printf("%-10s %-10s %-10s %-17d %-17d %-15d %5d\n",
pc->data[pos].name,
pc->data[pos].cla,
pc->data[pos].num,
pc->data[pos].C_num,
pc->data[pos].math_num,
pc->data[pos].data_num,
sum);
}
printf("\n");
}
修改信息
void ModifyGrade(grade* pc)
{
assert(pc);
char name[NAME_MAX] = { 0 };
printf("输入需修改学生的名字:");
scanf("%s", name);
int pos = Find_name(pc, name);//查找位置
if (pos == -1)
{
printf("不存在该学生\n");
}
else
{
printf("输入名字:");
scanf("%s", pc->data[pos].name);
printf("输入班级:");
scanf("%s", pc->data[pos].cla);
printf("输入学号:");
scanf("%s", pc->data[pos].num);
printf("输入C语言成绩:");
scanf("%d", &(pc->data[pos].C_num));
printf("输入高数成绩:");
scanf("%d", &(pc->data[pos].math_num));
printf("输入数据结构成绩:");
scanf("%d", &(pc->data[pos].data_num));
printf("修改成功\n");
}
printf("\n");
}
显示界面
以上只具有一些普通的功能有些逻辑没有完善,若需要更多功能可以自主添加