知识要点
C语言(基本语法,程序结构,数据类型等)
模块化编程
设计思路
增、删、改、查以及文件操作
功能模块
菜单:列出功能选项;
添加内容:添加学生信息
删除内容:删除学生信息
修改内容:修改学生信息
查看内容:查看学生信息
所有内容:列出所有学生信息
排序功能:按成绩排序
退出程序。
实际代码
头文件和源文件代码内容我整合在一个源文件了,可以直接跑。
如果有兴趣也可以拆开并在这个基础上添加一些有趣的内容。
//#define _CRT_SECURE_NO_WARNINGS
//如果你使用的是vscode或者vs(Visual Studio)报错“error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.”的话,在代码最前面加一句“#define _CRT_SECURE_NO_WARNINGS”。
#include <stdio.h>
#include <io.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 200
/*//如果mian函数写在被调用函数前则需要提前声明被调用函数
void Menu();
void reMenu();
void showall();
void saveBinary();
void saveCorrespondingFormat();
void add();
void readFile();
void delate();
void edit();
void search();
void sort(struct data Buff);
*/
typedef struct Student
{
char id[20];
char name[50];
char sex[10];
int age;
float score;
}Stu; //Stu 等同于 struct Student.
struct data
{
int count; //当前学生数组中的学生数
struct Student stu[MAX]; //学生数组
}d;
//Menu目录
void Menu()
{
system("cls");//clear screen
printf("\n\n\n");
printf("%*s\n", 30, "选项菜单");
printf("%*s\n", 30, "1、添加内容");
printf("%*s\n", 30, "2、删除内容");
printf("%*s\n", 30, "3、修改内容");
printf("%*s\n", 30, "4、查找内容");
printf("%*s\n", 30, "5、所有内容");
printf("%*s\n", 30, "6、排序内容");
printf("%*s\n", 30, "7、退出程序");
printf("请输入您的选择!\n");
}
//等待用户按Enter键返回主菜单
void reMenu()
{
char c1, c2;
printf("\n按Enter键返回主菜单...");
scanf("%c%c", &c1, &c2);//第一个字符吸收上次的确认回车键
//while (getchar() != '\n')
// continue;//不可用
Menu();
}
//显示所有学生信息
void showall()
{
int i;
printf("\n学号\t姓名\t性别\t年龄\t成绩\n");
for (i = 0; i < d.count; i++)
printf("%s\t%s\t%s\t%d\t%f\n", d.stu[i].id, d.stu[i].name,
d.stu[i].sex,d.stu[i].age, d.stu[i].score);
printf("Above is all\n");
}
//将数据从结构数组保存到文件
void saveBinary()
{
FILE *fp; //file point
int i, j;
j = d.count;
fp = fopen("dataBinary.txt", "w"); //File storage location: current folder
fwrite(&j, sizeof(int), 1, fp);
//fprintf(fp, "%d", j);
for (i = 0; i < d.count; i++)
{
fwrite(&d.stu[i], sizeof(Stu), 1, fp);
//fprintf(fp,"%s\t%s\t%s\t%d\t%f\n", d.stu[i].id, d.stu[i].name, d.stu[i].sex, d.stu[i].age, d.stu[i].score);
}
fclose(fp);
}
//按照对应格式保存数据(非二进制流)
void saveCorrespondingFormat()
{
FILE *fp; //file point
int i, j;
j = d.count;
fp = fopen("dataCorrespondingFormat.txt", "w"); //File storage location: current folder
for (i = 0; i < d.count; i++)
{
fprintf(fp,"%s\t%s\t%s\t%d\t%f\n", d.stu[i].id, d.stu[i].name, d.stu[i].sex, d.stu[i].age, d.stu[i].score);
}//fprintf()函数根据指定的格式(format),向输出流(stream)写入数据(argument)。
fclose(fp);
}
//输出一个排序文件
void saveSort()
{
FILE *fp; //file point
int i, j;
j = d.count;
fp = fopen("dataSort.txt", "w"); //File storage location: current folder
for (i = 0; i < d.count; i++)
{
fprintf(fp, "%s\t%s\t%s\t%d\t%f\n", d.stu[i].id, d.stu[i].name,
d.stu[i].sex, d.stu[i].age, d.stu[i].score);
}
fclose(fp);
}
//添加信息
void add()
{
int b;
int j = d.count;
while (j < MAX)
{
printf("请输入学生学号:");
scanf("%s", d.stu[j].id);
printf("请输入学生姓名:");
scanf("%s", d.stu[j].name);
printf("请输入学生性别:");
scanf("%s", d.stu[j].sex);
printf("请输入学生年龄:");
scanf("%d", &d.stu[j].age);
printf("请输入学生成绩:");
scanf("%f", &d.stu[j].score);
d.count++; //Need to set 0 in the main function in advance
j = d.count;
printf("\n是否继续添加学生信息(0-否,1-是):");
scanf("%d", &b);
if (b == 0)break;
}
saveBinary();//二进制存储,用于系统读取
saveCorrespondingFormat();//文字对应格式存储,用于打卡文件查看
}
//从文件读取数据到结构数组
void readFile()
{
FILE *fp;
int i, j;
j = 0;
if ((fp = fopen("dataBinary.txt", "r")) == NULL) //If the file does not exist
{
d.count = 0;
}
else
{
fread(&j, sizeof(int), 1, fp);
d.count=j;
for (i = 0; i < j; i++)
{
fread(&d.stu[i], sizeof(Stu), 1, fp);
//fscanf(fp,"%s", d.stu[j].id);
//fscanf(fp,"%s", d.stu[j].name);
//fscanf(fp,"%s", d.stu[j].sex);
//fscanf(fp,"%d", &d.stu[j].age);
//fscanf(fp,"%f", &d.stu[j].score);
}
fclose(fp);
}
}
//删除功能
void delate()
{
int i, j;
char id[20];
printf("\n请输入需要删除的学生的学号:");
scanf("%s", id);
j = -1;
for (i = 0; i < d.count; i++)
{
if (strcmp(d.stu[i].id, id) == 0)
{
j = i;
break;
}
}
if (j == -1)
{
printf("\n没有找到该学生(学号:%s)。", id);
}
else
{
for (i = j; i < d.count - 1; i++) //将以下数据向前移动一位
d.stu[i] = d.stu[i + 1];
memset(&d.stu[d.count - 1], 0, sizeof(struct Student)); //将 d.stu[d.count - 1] 数据置零
d.count--;
saveBinary();
saveCorrespondingFormat();
printf("\n成功删除学生(学号:%s)信息!", id);
}
}
//修改功能
void edit()
{
int i, j;
char id[20];
printf("\n请输入需要修改的学生的学号:");
scanf("%s", id);
j = -1;
for (i = 0; i < d.count; i++)
{
if (strcmp(d.stu[i].id, id) == 0)
{
j = i;
//break;
}
}
if (j == -1)
{
printf("\n没有找到该学生(学号:%s)!", id);
}
else
{
printf("请输入学生学号:");
scanf("%s", d.stu[j].id);
printf("请输入学生姓名:");
scanf("%s", d.stu[j].name);
printf("请输入学生性别:");
scanf("%s", d.stu[j].sex);
printf("请输入学生年龄:");
scanf("%d", &d.stu[j].age);
printf("请输入学生成绩:");
scanf("%f", &d.stu[j].score);
saveBinary();
saveCorrespondingFormat();
printf("\n修改学生(学号:%s)信息成功", id);
}
}
//查询功能
void search()
{
int i, j;
char id[20];
printf("请输入需要查询的学生学号:");
scanf("%s", id);
j = -1;
for (i = 0; i < d.count; i++)
{
if (strcmp(d.stu[i].id, id) == 0)
{
printf("\n学号\t姓名\t性别\t年龄\t分数\n");
j = i;
printf("%s\t%s\t%s\t%d\t%f\n", d.stu[i].id, d.stu[i].name,
d.stu[i].sex,d.stu[i].age, d.stu[i].score);
break;
}
}
if (j == -1)
{
printf("\n没有找到该学生(学号:%s)", id);
}
}
//排序功能
void sort(struct data Buff)
{
int i, j;
Stu temp;
FILE *fp;
if ((fp = fopen("dataBinary.txt", "r")) == NULL)
{
printf("cannot open file!\n");
exit(0);
}
for (i = 0; i < Buff.count - 1; i++)//选择排序
{
for (j = i + 1; j < Buff.count; j++)
{
if (Buff.stu[j].score > Buff.stu[i].score)
{
temp = Buff.stu[j];
Buff.stu[j] = Buff.stu[i];
Buff.stu[i] = temp;
}
}
}
saveSort();
printf("\n名次\t学号\t姓名\t分数\n");
for (i = 0; i < Buff.count; i++)
{
printf("%d\t%s\t%s\t%f\n",i+1, Buff.stu[i].id, Buff.stu[i].name, Buff.stu[i].score);
}
fclose(fp);
}
int main()
{
int f;
d.count = 0;
readFile(); //读取二进制文件中的内容
Menu(); //菜单目录
while (1)
{
scanf("%d", &f);
switch (f)
{
case 1:add(); //添加
break;
case 2:delate(); //删除
break;
case 3:edit(); //修改
break;
case 4:search(); //查找
break;
case 5:showall(); //所有
break;
case 6:sort(d); //排序
break;
case 7: //退出
break;
}
if (f == 7) break;
reMenu(); //重新加载目录
}
return 0;
}
运行效果
添加内容
所有内容(上一步添加的)
修改内容(修改了学号为6的学生信息)
查找内容
再看一下此时的所有内容,修改成功
删除内容(删除结果图拼接在一起)
排序内容
看一下生成的文件,这里用记事本展示。
总的来讲,这个系统涉及C语言的知识还是挺多的,比较适合总体学习后用于归纳总结的练习来做。