/* Note:Your choice is C IDE */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*****函数声明*********/
/////////////////////////////////////////////////////
// 主业务
//////////////////////////////////////////////////////
// 增加:
void addStudent();
// 删除:
void deleteStudent();
// 查找:
void queryStudent();
void queryBySno();
void queryByName();
// 修改:
void updateStudnt();
// 打印所有信息:
void printAll();
// 按成绩排序:
void sortNodeByTotal();
/////////////////////////////////////////////
//辅助业务
/////////////////////////////////////////////
// 读文件:
int readData();
// 写文件:
int writeData();
// 自动生成学号:
int createSno();
// 根据学号查找索引:
int findIndex(int sno);
// 显示当前学生信息:
void printCurrent(int index);
// 主菜单:
void mainMenu();
/*********数据结构*********/
struct student
{
int sno; // 学号
char name[20]; // 姓名
int chinese; // 语文
int maths; // 数学
int english; // 英语
int total; // 总成绩
int state;//状态(1正常,0删除)
};
// 定义结构体数组存储学生信息
struct student students[100];
// 定义存储当前的最大索引
int maxIndex = -1;
// 定义文件指针,操作文件
FILE *fp;
/*****主函数***********/
int main()
{
maxIndex = readData();
mainMenu();
return 0;
}
/*****函数定义*********/
void mainMenu()
{
// 循环显示主业务
// 提供选择项提示
// 根据输入选择项调用主业务函数
int select = 0;
while(1)
{
printf("|------------------------------|\n");
printf("|--- 欢迎使用学生成绩管理 ---|\n");
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("| 0. 退出系统 |\n");
printf("|------------------------------|\n");
printf("请选择业务:");
scanf("%d",&select);
switch(select)
{
case 1:
addStudent();
break;
case 2:
deleteStudent();
break;
case 3:
updateStudnt();
break;
case 4:
queryStudent();
break;
case 5:
printAll();
break;
case 6:
sortNodeByTotal();
break;
case 0:
exit(0);
default:
printf("您的选择有误,请重新选择!\n");
}
}
}
//读文件
int readData()
{
// 定义读取文件的行数
int i = 0;
// 1打开文件
if((fp = fopen("student.txt","r")) == NULL)
{
// 创建新文件
fp = fopen("student.txt","w");
return -1;
}
// 2读文件
while(!feof(fp))
{
fscanf(fp,"%d %s %d %d %d %d %d",
&students[i].sno,
students[i].name,
&students[i].chinese,
&students[i].maths,
&students[i].english,
&students[i].total,
&students[i].state);
// 读取一行数据,索引+1
i++;
}
// 3关闭文件
fclose(fp);
// 多读取一行,索引从0开始
return i-2;
}
int writeData()
{
// 数组索引
int i = 0;
// 1打开文件
if((fp = fopen("student.txt","w")) == NULL)
{
printf("打开文件失败!");
return 0;
}
// 2写文件 - 遍历数组循环操作
for(i = 0; i <= maxIndex; i++ )
{
fprintf(fp,"%d %s %d %d %d %d %d\n",
students[i].sno,
students[i].name,
students[i].chinese,
students[i].maths,
students[i].english,
students[i].total,
students[i].state);
}
// 3关闭文件
fclose(fp);
return 1;
}
int createSno()
{
// 如果是第一个学生
if(maxIndex == 0)
{
return 101;
}
else
{
// 上一个学生的学号 +1
return students[maxIndex -1].sno + 1;
}
}
//按学号查询学生在数组中的索引位置
int findIndex(int sno)
{
int index = -1;
int i = 0;
for(i = 0; i <= maxIndex; i++)
{
// 保证学生是正常状态
if(students[i].state == 1)
{
if(students[i].sno == sno)
{
// 记录当前索引
index = i;
break;
}
}
}
return index;
}
//打印当前索引的学生信息
void printCurrent(int index)
{
printf("|-------------------------------------------------------------------------|\n");
printf("|%-8s|%-10s|%-8s|%-8s|%-8s|%-8s|\n","学号","姓名","性别","语文","数学","英语","总成绩");
printf("|--------+----------+--------+--------+--------+--------+--------+--------|\n");
printf("|%-8d|%-10s|%-8d|%-8d|%-8d|%-8d|\n",
students[index].sno,
students[index].name,
students[index].chinese,
students[index].maths,
students[index].english,
students[index].total);
printf("|-------------------------------------------------------------------------|\n");
}
void addStudent()
{
char answer = 'n';
printf("---------- 增加学生信息 ----------\n");
// 输入数据到数组
maxIndex++;
// 给学生信息赋值
while(1)
{
//学号自增
students[maxIndex].sno = createSno();
fflush(stdin);//清空缓存
printf("姓名: ");
gets(students[maxIndex].name);
fflush(stdin);//清空缓存
printf("语文: ");
scanf("%d",&students[maxIndex].chinese);
printf("数学: ");
scanf("%d",&students[maxIndex].maths);
printf("英语: ");
scanf("%d",&students[maxIndex].english);
// 计算总成绩
students[maxIndex].total =
students[maxIndex].chinese+
students[maxIndex].maths+
students[maxIndex].english;
// 状态默认置为1
students[maxIndex].state = 1;
// 写文件
if(writeData() == 1)
{
printf("增加成功!\n");
}
else
{
printf("增加失败!\n");
}
printf("是否继续:是(y) 否(n): ");
fflush(stdin);//清空缓存
scanf("%c",&answer);
if(answer == 'y')
{
continue;
}
else
{
break;
}
}
}
void printAll()
{
int i;
printf("---------- 打印全部信息 ----------\n");
printf("|-------------------------------------------------------|\n");
printf("|%-8s|%-10s|%-8s|%-8s|%-8s|%-8s|\n","学号","姓名","语文","数学","英语","总成绩");
printf("|--------+----------+--------+--------+--------+--------|\n");
for(i=0;i<=maxIndex;i++)
{
if(students[i].state==1)
{
printf("|%-8d|%-10s|%-8s|%-8d|%-8d|%-8d|\n",
students[i].sno,
students[i].name,
students[i].chinese,
students[i].maths,
students[i].english,
students[i].total);
if(i < maxIndex)
{
printf("|--------+----------+--------+--------+--------+--------|\n");
}
else
{
printf("|-------------------------------------------------------|\n");
}
}
}
}
void deleteStudent()
{
}
void queryStudent()
{
}
void updateStudnt()
{
}
void sortNodeByTotal()
{
}
C语言 学生成绩管理系统的打印全部信息功能不可用,不能打印被增加的,数据文件里的信息,并且按功能键回闪退(应用数组遍历循环打印信息)就输入功能数字,可看到打印格式,然后就闪退,没有学生信息