系统功能说明:
(1)录入:操作添加一条新的学生记录项,包括新建数据、在指定记录前插入数据、追加数据操作。
(2)显示:显示所有的学生记录项。
(3)删除:删除一条已经存在的学生记录项。
(4)修改:改变学生记录项的一个或多个属性,并用新的记录项覆盖已经存在的记录项。
(5)查找:根据用户输入的学号进行查找,如果该学号存在则输出匹配到的数据,没有则给出提示。
(6)排序:根据学号进行排序的同时浏览数据,不会改变数据的原始排序。
(7)模糊查询:根据学号或者名字的其中某个关键字查询所有匹配到的记录
代码如下:
#include //studio 指 “stuandard input & output"(标准输入输出)(常用的函数如fopen()、fflush()、fwrite()、scanf()、fscanf()、fprintf()、sprintf()、perror())
#include //定义了一个变量类型、一个宏和各种操作字符数组的函数(常用的函数如sturcpy()、sturcat()、sturchr()、sturcmp()、sturlen()、sturcspn()、sturdup()、sturerror()、sturncmp())
#include //定义了五种类型、一些宏和通用工具函数(常用的函数如malloc()、calloc()、realloc()、free()、systuem()、atoi()、atol()、rand()、srand()、exit())
#pragma warning (disable:4996) //消除警告(关闭VS2010的安全警告, 因为VS2020是C++软件)
#define N 200//定义标识符 N为200
typedef struct student//创建一个结构体, 结构体包含以下成员
{
long long int ID; //学号
char Name[10]; //姓名
int Age; //年龄
char Sex[4]; //性别
char Birthday[20]; //出生年月
char Site[20]; //地址
char Phone[20]; //电话
char Notes[20]; //备注
}student;//struct student定义为student
student stu[N];//定义结构体数组, 存储上限为N
int Num = 0;//建立全局变量,Num为当前系统的录入学生信息的总数
// 函数声明
//学生信息 == 系统关键词
void Save();//学生信息保存函数
void Read();//学生信息读取函数
void Show();//学生信息菜单函数
void Input();//学生信息输入函数
void All();//学生信息浏览函数
void Que();//学生信息查找函数
void Mod();//学生信息修改函数
void Del();//学生信息删除函数
void sort();//学生信息排序函数
void FuzzyQuery();//模糊查询
//主函数
int main() {
// ...
Read();//调用学生信息读取函数
int n = 1;
while (n != 0) {
Show(); //调用显示学生信息管理系统菜单函数
scanf("%d", &n);
switch (n) {
case 0:
return 0;//直接退出系统
case 1:
Input();//输入学生信息
break;
case 2:
All();//输出所有学生信息
break;
case 3:
Que(); //输入学号查询学生信息
break;
case 4:
Mod();// 修改学生信息(修改前根据学号查询到某个学生,再确认是否修改)
break;
case 5:
Del();// 删除某个学生的信息(删除前先根据学号查询到某个学生,再确认是否删除)
break;
case 6:
sort();// 冒泡排序(根据学号进行降序排序)
break;
case 7:
FuzzyQuery(); //根据学号或者姓名的关键字查询所有匹配到的信息
break;
default:
printf("输入错误,按任意键返回主菜单");
break;
}
Save();//保存学生信息
system("pause");
system("cls");
}
// ...
}
//将int型转换为string
char* to_string(int num) {
// 分配足够大的动态内存来存储结果字符串
int str_size = snprintf(NULL, 0, "%d", num);
char* str = (char*)malloc((str_size + 1) * sizeof(char));
// 将整数转换为字符串
sprintf(str, "%d", num);
return str;
}
//模糊查询
void FuzzyQuery() {
char keyword[20];
printf("请输入学号或姓名的关键字:");
scanf("%s", keyword);
int found = 0; // 标记是否找到匹配的学生信息
printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n", "学号", "姓名", "性别", "年龄", "出生年月", "地址", "电话", "备注");
//strstr()函数用于:查找子字符串 返回指向 str1 中第一次出现的 str2 的指针,如果 str2 不是 str1 的一部分,则返回空指针
//这个函数的功能是有一个模式串,在主串中找模式串。如果主串中有模式串,返回的则是主串中模式串的的第一次出现的位置
for (int i = 0; i < Num; i++) {
if (strstr(stu[i].Name, keyword) != NULL || strstr(to_string(stu[i].ID),keyword ) != NULL) {//这里先要调用to_string()函数把学号转换为string类型
//to_string(ID);
printf("%-10lld%-10s%-10s%-10d%-10s%-10s%-10s%-10s\t\n", stu[i].ID, stu[i].Name, stu[i].Sex, stu[i].Age, stu[i].Birthday, stu[i].Site, stu[i].Phone, stu[i].Notes);
found = 1;
}
}
if (!found) {
printf("未找到匹配的学生信息!\n");
}
}
//学生信息保存函数
void Save() {
int i = 0, j = 0, k = 0;
FILE* fp = fopen("学生信息数据.txt", "w+");//打开文件+清除文件内信息
for (i = 0; i < Num; i++) {//从1循环到Num, 将学生数据逐个录入 "学生信息数据.txt" 文本内
fprintf(fp, "%lld %s %s %d %s %s %s %s\n", stu[i].ID, stu[i].Name, stu[i].Sex, stu[i].Age, stu[i].Birthday, stu[i].Site, stu[i].Phone, stu[i].Notes);
}
fclose(fp);//关闭文件
}
//学生信息读取函数
void Read() {
FILE* file = fopen("学生信息数据.txt", "r");//以只读方式打开文件
if (file == NULL) {//当文件不存在,则为真
return;//返回上一个函数
}
Num = 0;//Num为当前系统的录入学生信息的总数, 读入文件前将总数置为0,以防有残留数据
while (fgetc(file) != EOF) {//当下一个字符不为空时
fseek(file, -1, 1);//每一次循环, 定位在当前行的-1位置,也就是最左边的位置
fscanf(file, "%d %s %s %d %s %s %s %s\n", &stu[Num].ID, stu[Num].Name, stu[Num].Sex, &stu[Num].Age, stu[Num].Birthday, stu[Num].Site, stu[Num].Phone, stu[Num].Notes);
Num++;//每一次循环,学生信息的总数 + 1
}
fclose(file);//关闭
}
//学生信息管理系统菜单函数
void Show() {
printf("学生信息管理系统:\n");
printf("********************************\n");
printf("* 请择操作序号: *\n");
printf("* 1 输入学生信息 *\n");
printf("* 2 输出学生信息 *\n");
printf("* 3 查询学生信息 *\n");
printf("* 4 修改学生信息 *\n");
printf("* 5 删除学生信息 *\n");
printf("* 6 排序学生信息 *\n");
printf("* 7 模糊查询 *\n");
printf("* 0 退出系统 *\n");
printf("********************************\n");
printf("请输入数字进入对应功能:");
}
//学生信息输入函数
void Input() {
int i = 0, j = 0, k = 0, flag = 0;//flag用来输入学号, j用来遍历输出查找学号是否重复
printf("请输入学号:");
scanf("%d", &flag);
for (j = 0; j < Num; j++) {//判断学号是否查重
if (stu[j].ID == flag) {
printf("系统已有该学号!");
return;
}
}
stu[Num].ID = flag;//学号不重复则赋值该结构体
printf("姓名:");
scanf("%s", stu[Num].Name);
printf("性别:");
scanf("%s", stu[Num].Sex);
printf("年龄:");
scanf("%d", &stu[Num].Age);
printf("出生年月:");
scanf("%s", stu[Num].Birthday);
printf("地址:");
scanf("%s", stu[Num].Site);
printf("电话:");
scanf("%s", stu[Num].Phone);
printf("备注:");
scanf("%s", stu[Num].Notes);
Num++;
printf("学生信息录入成功,当前共有学生信息:%d。\n", Num);
}
//学生信息浏览函数
void All() {
int i = 0, j = 0, k = 0;
printf("----------------------------------------------------\n");
printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n", "名次", "学号", "姓名", "性别", "年龄", "出生年月", "地址", "电话", "备注");
for (i = 0; i < Num; i++) {//输出结构体数组里的所有信息
printf("%-10d%-10d%-10s%-10s%-10d%-10s%-10s%-10s%-10s\t\n", i + 1, stu[i].ID, stu[i].Name, stu[i].Sex, stu[i].Age, stu[i].Birthday, stu[i].Site, stu[i].Phone, stu[i].Notes);//浏览数据
}
printf("----------------------------------------------------\n");
}
//学生信息查找函数
void Que()
{
int i = 0, j = 0, k = 0;
printf("请输入学号:");
scanf("%d", &j);
for (i = 0; i < Num; i++)
{
if (j == stu[i].ID)
{
printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n", "学号", "姓名", "性别", "年龄", "出生年月", "地址", "电话", "备注");
printf("%-10d%-10s%-10s%-10d%-10s%-10s%-10s%-10s\t\n", stu[i].ID, stu[i].Name, stu[i].Sex, stu[i].Age, stu[i].Birthday, stu[i].Site, stu[i].Phone, stu[i].Notes);//浏览数据
k = 1;
}
}
if (k == 0) {//没有找到数据则给出提示
printf("未找到学生信息!\n");
return;
}
}
//学生信息修改函数
void Mod() {
int i = 0, j = 0, k = 0;
long long int flag = 0;
static char choice;
printf("请输入学号:");
scanf("%lld", &flag);
for (i = 0; i < Num; i++) {
if (flag == stu[i].ID) {
printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n", "学号", "姓名", "性别", "年龄", "出生年月", "地址", "电话", "备注");
printf("%-10d%-10s%-10s%-10d%-10s%-10s%-10s%-10s\n", stu[i].ID, stu[i].Name, stu[i].Sex, stu[i].Age, stu[i].Birthday, stu[i].Site, stu[i].Phone, stu[i].Notes);//浏览数据
printf("是否修改此数据(y/n):");
scanf("%s", &choice);
if (choice == 'y' || choice == 'Y')
{
printf("学生信息修改:\n");
printf("********************************\n");
printf("* 请择操作序号: *\n");
printf("* 1 修改学生姓名 *\n");
printf("* 2 修改学生性别 *\n");
printf("* 3 修改学生年龄 *\n");
printf("* 4 修改学生出生年月 *\n");
printf("* 5 修改学生地址 *\n");
printf("* 6 修改学生电话 *\n");
printf("* 7 修改学生地址 *\n");
printf("* 0 返回上一页 *\n");
printf("********************************\n");
printf("请输入数字进入对应修改功能:");
scanf("%d", &k);
switch (k)//选择
{
case 0:
return;//返回上一页
case 1:
printf("请输入姓名:");
scanf("%s", stu[i].Name);
break;
case 2:
printf("请输入性别:");
scanf("%s", stu[i].Sex);
break;
case 3:
printf("请输入年龄:");
scanf("%d", &stu[i].Age);
break;
case 4:
printf("请输入出生年月:");
scanf("%s", stu[i].Birthday);
break;
case 5:
printf("请输入地址:");
scanf("%s", stu[i].Site);
break;
case 6:
printf("请输入电话:");
scanf("%s", stu[i].Phone);
break;
case 7:
printf("请输入备注:");
scanf("%s", stu[i].Notes);
break;
default:
printf("输入错误, 按任意键返回上一页\n");
return;
}
printf("修改成功!\n");
return;
}
else {
printf("修改取消!\n");
return;
}
}
}
printf("没有找到学生信息\n");
}
//学生信息删除函数
void Del() {
int i = 0, j = 0, k = 0;
printf("\n请输入学号:");
scanf("%d", &j);
for (i = 0; i < Num; i++) {
if (j == stu[i].ID)
{
printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n", "学号", "姓名", "性别", "年龄", "出生年月", "地址", "电话", "备注");
printf("%-10d%-10s%-10s%-10d%-10s%-10s%-10s%-10s\t\n", stu[i].ID, stu[i].Name, stu[i].Sex, stu[i].Age, stu[i].Birthday, stu[i].Site, stu[i].Phone, stu[i].Notes);//浏览数据
printf("是否删除此数据(y/n):");
static char choice;
scanf("%s", &choice);
if (choice == 'y' || choice == 'Y') {
for (; i < Num - 1; i++)//将i+1覆盖i中, 循环
stu[i] = stu[i + 1];
Num--;//删除后数量-1
printf("删除成功!\n");
}
else {
printf("删除取消!\n");
}
}
}
}
//学生信息排序函数
void sort()
{
int i = 0, j = 0, k = 0;
student stu2[N];//定义临时结构体数组, 存储上限为N
for (i = 0; i < Num; i++) {//将数据传到stu2里
stu2[i] = stu[i];
}
for (i = 0; i < Num; i++) {//冒泡排序
for (j = i; j < Num; j++)
if (stu2[i].ID < stu2[j].ID) {
student t = stu2[i];
stu2[i] = stu2[j];
stu2[j] = t;
}
}
printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n", "名次", "学号", "姓名", "性别", "年龄", "出生年月", "地址", "电话", "备注");
for (i = 0; i < Num; i++)
{
printf("%-10d%-10d%-10s%-10s%-10d%-10s%-10s%-10s%-10s\t\n", i + 1, stu2[i].ID, stu2[i].Name, stu2[i].Sex, stu2[i].Age, stu2[i].Birthday, stu2[i].Site, stu2[i].Phone, stu2[i].Notes);//浏览数据
}
printf("排序成功!\n");
}