- 熟练掌握C语言开发
学习内容:
- 掌握C语言数组的运用
- 掌握对数据的增删改查
- 掌握C语言读取文件
- 掌握C语言写入文件
- 掌握C语言函数的灵活运用
程序还存在很多小bug,程序有问题可以评论告诉我,若有需要可自行网盘下载
链接:https://pan.baidu.com/s/14QKKuQkkYbzv6wqRQu6yVQ?pwd=04u7
提取码:04u7
1、主菜单
7.统计学生总数
6.学生成绩排名
程序关键代码:
>>菜单函数
void menu() {
system("cls");
printTableHead(MENU_WIDTH);//打印表头
printTableMidInfo(MENU_WIDTH, "学生信息管理系统");
printTableMidInfo(MENU_WIDTH,"");
const char* subMenus[] = {
"1.输入学生信息",
"2.查找学生信息",
"3.删除学生信息",
"4.修改学生信息",
"5.插入学生信息",
"6.学生成绩排名",
"7.统计学生总数",
"8.显示所有信息",
"9.退出系统 "
};
int count = sizeof(subMenus) / sizeof(subMenus[0]);
for (int i = 0; i < count; i++) {//打印菜单
printTableMidInfo(MENU_WIDTH, subMenus[i]);
}
printTableMidInfo(MENU_WIDTH, "");
printTableTail(MENU_WIDTH);//打印表尾
printMidInfo("请输入(1-9):>");
}
>>初始化函数
void init() {//初始化
char cmd[128];
sprintf(cmd, "mode con lines=%d cols=%d", WIN_HEIGHT, WIN_WIDTH);
system(cmd);
system("color 7d");//设置背景颜色
menu();
//数值初始化
memset(stu, 0, sizeof(stu));
//运行后自动从文件中读取数据,然后保存到数值中
//读取文件,fopen打开文件第一个参数打印的文件名如果没有自动生成,第二个参数打开方式
//FILE文件指针
FILE *fp = fopen("studentdata.txt", "rb");//二进制读取 "rb"只读+二进制
if (fp == NULL) { //判断读取的文件是否为空
studentCount = 0;
return;
}
int i = 0;//记录文件中学生人数
while (!feof(fp))//feof表示读文件是否结束
{
//将文件内容读入stu数组中每次读取一个学生的所有信息,读一次,读的内容为fp
int ret = fread(&stu[i], sizeof(struct student), 1, fp);//读取成功则返回1
if (ret == 1) i++;
}
studentCount = i;
}
>>打印学生信息列表函数
void showPage(int starIndex, int endIndex) {
if (endIndex >= studentCount)
endIndex = studentCount - 1;
if ((endIndex - starIndex + 1) > RECORDER_PER_PAGE)
endIndex = starIndex + RECORDER_PER_PAGE - 1;
char row[6][COL_LEN_MAX];
system("cls");
printTableHead(TABLE_WIDTH, 6);//打印表头
printTableRow(TABLE_WIDTH,head,sizeof(head)/sizeof(head[0]));//打印首行
printTableMidLine(TABLE_WIDTH, 6);//打印内部数据
for (int i = starIndex; i <= endIndex; i++) {
if (flag == 0) {//按输入先后排序
sprintf(row[0], "%d", stu[i].num);
sprintf(row[1], "%s", stu[i].name);
sprintf(row[2], "%d", stu[i].clanguage);
sprintf(row[3], "%d", stu[i].algo);
sprintf(row[4], "%d", stu[i].database);
sprintf(row[5], "%d", stu[i].sum);
}
else if (flag == 1) {//打印排序后的信息
sprintf(row[0], "%d", stu1[i].num);
sprintf(row[1], "%s", stu1[i].name);
sprintf(row[2], "%d", stu1[i].clanguage);
sprintf(row[3], "%d", stu1[i].algo);
sprintf(row[4], "%d", stu1[i].database);
sprintf(row[5], "%d", stu1[i].sum);
}
printTableRow(TABLE_WIDTH, row, 6);
if (i < endIndex)
printTableMidLine(TABLE_WIDTH, 6);
else
printTableTail(TABLE_WIDTH, 6);
}
flag = 0;
}
>>写入保存函数
bool save() {
//覆盖式写入操作
FILE *fp = fopen("studentdata.txt", "wb");
if (fp == NULL) {
fclose(fp);
return false;
}
for (int i = 0; i < studentCount; i++) {
int ret = fwrite(&stu[i], sizeof(struct student), 1, fp);
//一次写入一组学生的信息,写入成功返回1
if (ret != 1) {
fclose(fp);
return false;
}
}
fclose(fp);
return true;
}
>>删除信息函数
void del() {
FILE* fp;
int stunum3;
char str[16] = "";
system("cls");
printf("请输入需要删除的学生信息:>");
scanf("%d", &stunum3);
int i = searchStu(stunum3);
if (i < 0) {
printf("没有找到该学生信息!n");
return;
}
printf("找到该学生信息,是否删除(y/n):>");
scanf("%s", str);
if (strcmp(str, "Y") == 0 || strcmp(str, "y") == 0) {
for (int j = i; j < studentCount; j++) {
stu[j] = stu[j + 1];
}
studentCount--;
if (save())
printf("删除成功!n");
else
printf("保存文件失败!n");
}
else {
printf("取消删除!n");
}
}
>>修改信息函数
void modify() {
int stunum1;
system("cls");
printf("请输入需要修改的学生学号:>");
scanf("%d", &stunum1);
int i = searchStu(stunum1);
if (i < 0) {
printf("没有找到该学生信息!n");
return;
}
printf("找到该学生信息,可进行修改信息!n");
rewind(stdin);
rewind(stdin);//先清空缓冲区
printf("学号(10位数):>");
scanf("%d", &stu[i].num);
printf("姓名:>");
scanf("%s", &stu[i].name);
printf("C语言成绩(0-100分):>");
scanf("%d", &stu[i].clanguage);
printf("算法成绩(0-100分):>");
scanf("%d", &stu[i].algo);
printf("数据库成绩(0-100分):>");
scanf("%d", &stu[i].database);
stu[i].sum = stu[i].clanguage + stu[i].algo + stu[i].database;
if (save())
printf("修改成功!n");
else
printf("保存文件失败!n");
int stunum = 0;
}


