#include
#include
#include
#include
typedef struct student {
int numb;
char name[10];
int score[3];
double ave;
}STU;
void input(STU* p, int num);
void showAll(STU*, int);
int searchByNumb(STU *,int);
int searchByName(STU *,int);
void search(STU *, int);
void insert(STU *, int *,int);
void del(STU *, int *);
void update(STU *, int);
void sort(STU *, int);
void save_info(STU *,int);
void load_info(STU *,int *);
void backup();
void main() {
int num = 0, choice;
STU stuArray[100];
for (;;) {
system("cls");
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(" * 7.对学生信息排序 \n");
printf(" * 8.保存当前信息到文件 \n");
printf(" * 9.从文件加载学生信息 \n");
printf(" * 10.备份 \n");
printf(" * 0.退出系统 \n");
printf("--------------------------------------------------------------------------\n");
printf("请选择要实现功能的相应序号 :");
scanf("%d", &choice);
if (choice == 0) break;
switch (choice) {
case 1: printf("输入人数:"); scanf("%d", &num); input(stuArray, num); break;
case 2: showAll(stuArray,num); break;
case 3: search(stuArray, num); break;
case 4: insert(stuArray,&num,100); break;
case 5: del(stuArray, &num); break;
case 6: update(stuArray, num); break;
case 7: sort(stuArray, num); break;
case 8: save_info(stuArray, num); break;
case 9: load_info(stuArray, &num); break;
case 10: backup(); break;
}
printf("请按任意键继续.......\n");
getch();
}
printf("感谢您的使用,再见!\n");
}
//1.输入学生信息
void input(STU* p, int num) {
int i;
printf("请输入%d名学生信息\n", num);
printf("学号\t姓名\t数学\t英语\t语文\n");
for (i = 0; i < num; i++) {
scanf("%d%s%d%d%d", &p[i].numb, p[i].name, &p[i].score[0], &p[i].score[1], &p[i].score[2]);
p[i].ave = (p[i].score[0] + p[i].score[1] + p[i].score[2]) / 3.0;
}
printf("输入完成\n");
}
// 2.显示全部学生信息
void showAll(STU* p, int num) {
int i;
system("cls");
printf("目前共有%d名学生信息\n",num);
printf("学号\t姓名\t数学\t英语\t语文\t平均分\n");
for (i = 0; i < num; i++) {
printf("%d\t%s\t%d\t%d\t%d\t%.2lf\t\n", p[i].numb, p[i].name, p[i].score[0], p[i].score[1], p[i].score[2], p[i].ave);
}
printf("输出完成\n");
}
int searchByNumb(STU *p,int num){
int i,number;
printf("请输入要查询学生的学号:");
scanf("%d",&number);
for(i = 0;i<num;i++)
{
if(p[i].numb==number)
break;}
return i;
}
int searchByName(STU* p, int num){
int i;
char name[10];
printf("请输入要查询学生的姓名:");
scanf("%s", name);
for(i=0;i<num;i++)
if(strcmp(p[i].name,name)==0)
break;
return i;
}
//3.查询学生信息
void search(STU *p,int num){
int choice,result=1;
for(;;)
{
system("cls");
printf("现在进入查询学生信息的填写\n");
printf("按学号查询请按1,按姓名查询请按2:");
scanf("%d",&choice);
switch(choice)
{
case 1: result=searchByNumb(p,num);break;
case 2: result=searchByName(p,num);break;
}
if(result>=num)
printf("查无此人\n");
else{
printf("找到了,该生信息如下: \n");
printf("学号\t姓名\t数学\t英语\t语文\t平均分\n");
printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",p[result].numb,p[result].name,p[result].score[0],p[result].score[1],p[result].score[2],p[result].ave);
}
printf("继续查找请按1,退出请按0;");
scanf("%d",&choice);
if(choice==0) break;
}
}
//4.新增学生信息函数
void insert(STU *p,int *pnum,int maxLen)
{
STU stu;
int choice;
for(;;)
{
if(*pnum>100){
printf("人数已达上限,无法添加!\n");
break;
}
else{
system("cls");
printf("现在进行新增学生信息填写\n");
printf("学号\t姓名\t数学\t英语\t语文\n");
scanf("%ds%d%d%d",&stu.numb,stu.name,&stu.score[0],&stu.score[1],&stu.score[2]);
stu.ave=(stu.score[0]+stu.score[1]+stu.score[2])/3.0;
p[*pnum]=stu;
(*pnum)++;
printf("成功添加!继续添加请按1,退出请按0;");
scanf("%d",&choice);
if(choice==0) break;
}
}
}
//5.删除学生信息
void del(STU *p,int *pnum){int result,i,choice;
for(;;){
system("cls");
printf("现在进入删除学生信息的处理\n");
result=searchByNumb(p,*pnum);
if(result>=*pnum)
printf("查无此人\n");
else
{
printf("找到了,确定删除请按1,取消删除请按2;");
scanf("%d",&choice);
if(choice==i){
//
for(i=result;i<*pnum-1;i++)
p[i]=p[i+1];
(*pnum)--;
printf("成功删除,当前学生总人数是%d人\n",*pnum);
}
}
printf("继续删除请按1,退出请按0;");
scanf("%d",&choice);
if(choice==0) break;
}
}
//6.修改学生信息
void update(STU *p,int num){
STU stu;
int result,choice,key_code;
loop1:
printf("请输入五位数密码:\n");
scanf("%d",&key_code);
if(key_code == 20230){
if(result != -1){
for(;;){
system("pause");
printf("现在进入修改学生信息的处理\n");
result = searchByNumb(p,num);
if(result >= num)
printf("查无此人\n");
else
{
printf("找到了,该生信息如下: \n");
printf("学号\t姓名\t数学\t英语\t语文\t平均分\n");
printf("%d\t%s\t%d\t%d\t%d\t%.2lf\n",p[result].numb,p[result].name,p[result].score[0],p[result].score[1],p[result].score[2],p[result].ave);
printf("确定修改请按1,取消修改请按2;");
scanf("%d",&choice);
if(choice==1){
printf("现在进行修改学生信息的填写\n");
printf("学号\t姓名\t数学\t英语\t语文\n");
scanf("%d%s%d%d%d",&stu.numb,stu.name,&stu.score[0],&stu.score[1],&stu.score[2]);
stu.ave=(stu.score[0]+stu.score[1]+stu.score[2])/3.0;
p[result]=stu;
printf("成功修改,修改后的信息如下\n");
printf("学号\t姓名\t数学\t英语\t语文\t平均分\n") ;
printf("%d\t%s\t%d\t%d\t%d\t%.2lf\n",p[result].numb,p[result].name,p[result].score[0],p[result].score[1],p[result].score[2],p[result].ave);
}
}
printf("继续修改请按1,退出请按0;");
scanf("%d",&choice);
if(choice==0) break;
}
}
}
else{
printf("密码错误,请重新输入:");
goto loop1;
}
}
//7.排序
void sort(STU *p,int num){
char style='a';
int type=1,i,j,index;
STU temp;
system("cls");
printf("现在进入对当前信息排序的处理\n");
printf("按升序排列请按a,按降序排列请按d;");
getchar();
scanf("%c",&style);
printf("按学号排序请按1,按平均分排序请按2;");
scanf("%d",&type);
if(style=='a'){
if(type==1){
for(i=0;i<num-1;i++){
if(p[index].numb>p[j].numb)
index=j;
temp=p[i];p[i]=p[index];p[index]=temp;
}
}
else if(type==2){
for(i=0;i<num-1;i++){
index=i;
for(j=i+1;j<num;j++)
if(p[index].ave>p[j].ave)
index=j;
temp=p[i];p[i]=p[index];p[index]=temp;
}
}
}
if(style=='d'){
if(type==1){
for(i=0;i<num-1;i++){
if(p[index].numb>p[j].numb)
index=j;
temp=p[i];p[i]=p[index];p[index]=temp;
}
}
else if(type==2){
for(i=0;i<num-1;i++){
index=i;
for(j=i+1;j<num;j++)
if(p[index].ave>p[j].ave)
index=j;
temp=p[i];p[i]=p[index];p[index]=temp;
}
}
}
printf("排序成功\n");
}
//8.保存当前信息到文件
void save_info(STU *p,int num){
char filename[20];
FILE *fp;
int i;
system("cls");
printf("现在进入保存当前信息到文件的处理\n");
printf("请输入文件名:");
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL){
printf("无法打开文件\n");
return;
}
fprintf(fp,"目前共有%d名学生信息\n",num);
fprintf(fp,"学号\t姓名\t数学\t英语\t语文\t平均分\n") ;
for(i=0;i<num;i++)
{
fprintf(fp,"%d\t%s\t%d\t%d\t%d\t%.2lf\t\n", &p[i].numb, p[i].name, &p[i].score[0], &p[i].score[1], &p[i].score[2], p[i].ave);
}
fclose(fp);
printf("保存成功\n");
}
//9.从文件加载学生信息
void load_info(STU *p,int *pnum){
char filename[20],secondLine[50];
FILE *fp;
int i,num;
system("cls");
printf("现在进入从文件加载学生信息的处理\n");
printf("请输入文件名:");
scanf("%s",filename);
if((fp=fopen(filename,"r"))==NULL){
printf("无法打开文件\n");
return ;
}
fscanf(fp,"目前共有%d名学生信息",&num);
//过滤第二行信息("学号\t姓名\t数学\t英语\t语文\t平均分\n") ;
for(i=0;i<6;i++)
fscanf(fp,"%s",secondLine);
for(i=0;i<num;i++){
fscanf(fp,"%d%s%d%d%d%lf",&p[i].numb, p[i].name, &p[i].score[0], &p[i].score[1], &p[i].score[2], p[i].ave);
}
*pnum=num;
fclose(fp);
printf("加载成功\n");
}
//10.备份
void backup(){
FILE *in,*out;
char infile[20],outfile[20],ch;
printf("请输入源文件的文件名:");
scanf("%s",infile);
printf("请输入备份文件的文件名:");
scanf("%s",outfile);
if((in=fopen(infile,"r"))==NULL)
{
printf("无法打开该文件\n");
return ;
}
if((out=fopen(outfile,"w"))==NULL)
{
printf("无法打开该文件\n");
return ;
}
ch=fgetc(in);
while(ch!=EOF){
fputc(ch,out);
ch=fgetc(in);
}
printf("备份成功\n");
fclose(in);
fclose(out);
}
求指点,谢谢!
在菜单里面加上
case 某个值: printf("班级最高分为:%d\n", class_max(stuArray, num)); break;
以及代码
double class_average(STU* p, int num) {
int i;
double sum = 0.0;
for (i = 0; i < num; i++) {
sum += p[i].ave;
}
return sum / num;
}
参考GPT和自己的思路:可以增加求班级平均值和最大值以及最小值的功能代码。可以在输入学生信息后,遍历所有学生的成绩,统计班级的平均分、最大值和最小值,并在显示全部学生信息函数中添加班级的统计信息的显示。具体代码实现如下:
在学生结构体中添加全局变量:
int class_total[3]; // 班级成绩的总和
int class_max[3]; // 班级成绩的最大值
int class_min[3]; // 班级成绩的最小值
在输入学生信息函数中完成班级成绩的统计:
void input(STU* p, int num) {
int i, j;
printf("请输入%d名学生信息\n", num);
printf("学号\t姓名\t数学\t英语\t语文\n");
for (i = 0; i < num; i++) {
scanf("%d%s%d%d%d", &p[i].numb, p[i].name, &p[i].score[0], &p[i].score[1], &p[i].score[2]);
p[i].ave = (p[i].score[0] + p[i].score[1] + p[i].score[2]) / 3.0;
for (j = 0; j < 3; j++) {
p[i].class_total[j] += p[i].score[j];
if (p[i].score[j] > p[i].class_max[j]) {
p[i].class_max[j] = p[i].score[j];
}
if (p[i].score[j] < p[i].class_min[j] || p[i].class_min[j] == 0) {
p[i].class_min[j] = p[i].score[j];
}
}
}
printf("输入完成\n");
}
在显示全部学生信息函数中添加班级统计信息的显示:
// 2.显示全部学生信息
void showAll(STU* p, int num) {
int i, j;
system("cls");
printf("目前共有%d名学生信息\n",num);
printf("学号\t姓名\t数学\t英语\t语文\t平均分\n");
for (i = 0; i < num; i++) {
不知道你这个问题是否已经解决, 如果还没有解决的话:一般用带有头结点来建立链表,这样更简便一些
#include<cstdlib>
#include<cstdio>
#include<string.h>
typedef struct student//建立结构体
{
int n;
char name[100];//这里没有选择用string
//原因是scanf里的%s对string不兼容,好像是这样的......
int s;
struct student *next;
} stu;
using namespace std;
int main()
{
int x,y;
char a[100];
scanf("%d",&x);
stu* head = NULL;//定义头结点
head = new stu();
head->next =NULL;
stu *p =head;
while(x!=0)
{
scanf(" %s %d",a,&y);//没有用cin,而是选择scanf,对于整型和字符串的输入需要注意
stu *q = NULL;
q = new stu();
p->next = q;
q->n = x;
strcpy(q->name,a);//关于字符串函数的使用
q->s = y;
p = q;
scanf("%d",&x);
}
//以前因为判断是不是输入错误所以debug: printf("\nbull shit\n");
int line;
scanf("%d",&line);
p = head->next;
while(p!=NULL)
{
if(p->s>=line)
{
printf("%d %s %d\n",p->n,p->name,p->s);
p = p->next;
}
else
p = p->next;
}
p = head;
while(p!=NULL)//删除链表,防止超时
{
stu *q =p;
p = q->next;
free(q);
}
return 0;
}