这个题目的代码怎么打呢😂
本人对C语言不是很了解,在编码时不知道如何将学生的数据按班级划分并储存至不同文件中。
求各位专家帮忙打一下代码🙏
谢谢☺️
谢谢啦
参考如下,纯手打,望采纳,谢谢
//
#include<stdio.h>
#include<windows.h>
#define Max_stu_num 25
#define obj_num 3
char File_Path[]="student_inf.txt";
typedef struct
{
char Name[25]; //姓名
int Number; //学号
char gender[25]; //性别
char city[25]; //籍贯
int score[obj_num]; //数学成绩//语文成绩//英语成绩
int Sum_score; //总成绩
} Stu;
char obj_name[obj_num][25]= {"数学","语文","英语"};
double ave[obj_num];
double stu_avescore[Max_stu_num]; //平均成绩
Stu stu[Max_stu_num];
int count_stu=0;
void cal_sum_score(int index)
{
stu[index].Sum_score=0;
for(int j=0; j<obj_num; j++)
{
stu[index].Sum_score+=stu[index].score[j];
}
}
void input()
{
printf("输入姓名:\n");
fflush(stdin);
scanf("%s",stu[count_stu].Name);
printf("输入学号:\n");
fflush(stdin);
scanf("%d",&stu[count_stu].Number);
printf("输入性别:\n");
fflush(stdin);
scanf("%s",stu[count_stu].gender);
printf("输入籍贯:\n");
fflush(stdin);
scanf("%s",stu[count_stu].city);
for(int i=0; i<obj_num; i++)
{
printf("输入%s成绩:\n",obj_name[i]);
fflush(stdin);
scanf("%d",&stu[count_stu].score[i]);
}
cal_sum_score(count_stu);
count_stu++;
}
void output_head()
{
printf("姓名\t学号\t\t性别\t籍贯\t");
for(int i=0; i<obj_num; i++)
{
printf("%s\t",obj_name[i]);
}
printf("总分\n");
}
void outputOne(int index)
{
printf("%s\t",stu[index].Name);
printf("%d\t",stu[index].Number);
printf("%s\t",stu[index].gender);
printf("%s\t",stu[index].city);
for(int i=0; i<obj_num; i++)
{
printf("%d\t",stu[index].score[i]);
}
printf("%d\t",stu[index].Sum_score);
printf("\n");
}
void output_all(int n)
{
output_head();
int j;
for(j=0; j<n; j++)
{
outputOne(j);
}
printf("---------------------------------------------------\n");
}
int search(int number)
{
int i,p=-1;
for(i=0; i<count_stu; i++)
{
if(stu[i].Number==number)
{
p=i;
return p;
}
}
return -1;
}
void modify(int number)
{
int index=search(number);
if(index==-1)
{
printf("找不到该学号\n");
}
else
{
printf("学号%d的学生是第%d位\n",number,index+1);
output_head();
outputOne(index);
puts("修改信息");
printf("输入姓名:\n");
fflush(stdin);
scanf("%s",stu[index].Name);
printf("输入学号:\n");
fflush(stdin);
scanf("%d",&stu[index].Number);
stu[index].Sum_score=0;
for(int i=0; i<obj_num; i++)
{
printf("输入%s成绩:\n",obj_name[i]);
fflush(stdin);
scanf("%d",&stu[index].score[i]);
stu[index].Sum_score+=stu[index].score[i];
}
cal_sum_score(index);
printf("修改成功\n");
}
}
void del(int number)
{
int index=search(number);
if(index==-1)
{
printf("找不到该学号\n");
}
else
{
printf("学号%d的学生是第%d位\n",number,index+1);
output_head();
outputOne(index);
int i;
for(i=index; i<count_stu-1; i++)
{
stu[i]= stu[i+1];
}
printf("删除成功\n");
count_stu--;
}
}
double calave()
{
int score_sum[obj_num]= {0};
for(int i=0; i<count_stu; i++)
{
for(int j=0; j<obj_num; j++)
{
score_sum[j]+=stu[i].score[j];
}
}
for(int j=0; j<obj_num; j++)
{
ave[j]=(double)score_sum[j]/count_stu;
}
}
void save()
{
FILE *fp;
fp = fopen(File_Path,"w");
if(fp == NULL)
{
printf("error!");
}
else
{
for(int j=0; j<count_stu; j++)
{
fprintf(fp,"%s %d ",stu[j].Name,stu[j].Number);
fprintf(fp,"%s %s ",stu[j].gender,stu[j].city);
for(int i=0; i<obj_num; i++)
{
fprintf(fp,"%d ",stu[j].score[i]);
}
fprintf(fp,"%d\n",stu[j].Sum_score);
}
printf("文件写入成功\n");
}
fclose(fp);
}
void read()
{
FILE *fp;
fp = fopen(File_Path,"r");
int count=0;
if(fp == NULL)
{
printf("error!");
}
else
{
int flag=2;
int j=count_stu;
do
{
flag=fscanf(fp,"%s %d ",stu[j].Name,&stu[j].Number);
fscanf(fp,"%s %s ",stu[j].gender,stu[j].city);
for(int i=0; i<obj_num; i++)
{
fscanf(fp,"%d ",&stu[j].score[i]);
}
fscanf(fp,"%d\n",&stu[j].Sum_score);
if(flag!=-1)
{
cal_sum_score(count);
count++;
}
j++;
}
while(flag>0);
printf("文件读取成功\n");
count_stu+=count;
}
fclose(fp);
}
void swap_stu_inf(Stu stu[],int a,int b)
{
Stu tem=stu[a];
stu[a]=stu[b];
stu[b]=tem;
}
void BubbleSort_number(Stu stu[],int n)
{
int j,k;
Stu t;
for(j=0; j<n-1; j++)
{
for(k=0; k<n-j-1; k++)
{
if(stu[k].Number>stu[k+1].Number)
{
t=stu[k];
stu[k]=stu[k+1];
stu[k+1]=t;
}
}
}
}
void BubbleSort_score(Stu stu[],int n)
{
int j,k;
Stu t;
for(j=0; j<n-1; j++)
{
for(k=0; k<n-j-1; k++)
{
if(stu[k].Sum_score<stu[k+1].Sum_score)
{
t=stu[k];
stu[k]=stu[k+1];
stu[k+1]=t;
}
}
}
}
void out_aveScore()
{
printf("平均分\t\t");
for(int i=0; i<obj_num; i++)
{
printf("%.2lf\t",ave[i]);
}
printf("\n");
}
void cal_stu_avescore()
{
for(int i=0; i<count_stu; i++)
{
stu_avescore[i]=(double)stu[i].Sum_score/obj_num;
}
}
void color(short x) //自定义函根据参数改变颜色
{
if(x>=0 && x<=15)//参数在0-15的范围颜色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x); //只有一个参数,改变字体颜色
else//默认的颜色白色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
void put_stu_ave_score()
{
cal_stu_avescore();
printf("姓名\t学号\t平均分\n");
for(int i=0; i<count_stu; i++)
{
if(stu_avescore[i]<60)
{
color(6);
}
printf("%s\t%d\t%.2f\n",stu[i].Name,stu[i].Number,stu_avescore[i]);
color(7);
}
//color(7);
}
void sort_menu()
{
puts("--------1.按学号排序------------------------------");
puts("--------2.按总成绩排序----------------------------");
puts("--------3.返回主菜单------------------------------");
int option=0;
fflush(stdin);
scanf("%d",&option);
if(option==1)
{
system("cls");
BubbleSort_number(stu,count_stu);
puts("排序完成");
output_all(count_stu);
}
else if(option==2)
{
system("cls");
BubbleSort_score(stu,count_stu);
puts("排序完成");
output_all(count_stu);
}
else if(option==3)
{
return;
}
}
void count_stu_()
{
printf("统计学生总数\n");
printf("一共 %d 名学生\n",count_stu);
}
void insert(int index,Stu stu_)
{
for(int i=count_stu+1; i>index; i--)
{
stu[i]=stu[i-1];
}
stu[index]=stu_;
count_stu++;
cal_sum_score(index);
}
void menu()
{
int option=0;
while(option!=11)
{
system("cls");
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("------11.退出系统---------------------------------------------------------------\n");
printf("--------------------------------------------------------------------------------\n");
printf("输入选项:\n");
fflush(stdin);
scanf("%d",&option);
if(option==1)
{
system("cls");
input();
system("pause");
}
else if(option==2)
{
system("cls");
//output(count_stu);
int number;
printf("输入要查找的学号:");
fflush(stdin);
scanf("%d",&number);
int index=search(number);
if(index==-1)
{
printf("查找失败\n");
}
else
{
printf("查找成功\n");
output_head();
outputOne(index);
}
system("pause");
}
else if(option==3)
{
system("cls");
int number;
printf("输入要删除的学号:");
scanf("%d",&number);
del(number);
puts("完成");
system("pause");
}
else if(option==4)
{
system("cls");
output_all(count_stu);
int number;
printf("输入要修改成绩的学生对应的学号:");
scanf("%d",&number);
modify(number);
system("pause");
}
else if(option==5)
{
system("cls");
sort_menu();
system("pause");
}
else if(option==6)
{
system("cls");
count_stu_();
system("pause");
}
else if(option==7)
{
system("cls");
puts("显示所有学生信息");
/**/
output_all(count_stu);
system("pause");
}
else if(option==8)
{
system("cls");
int index;
printf("输入要插入的位置(0~%d)",count_stu);
scanf("%d",&index);
Stu stu_;
printf("输入姓名:\n");
fflush(stdin);
scanf("%s",stu_.Name);
printf("输入学号:\n");
fflush(stdin);
scanf("%d",&stu_.Number);
printf("输入性别:\n");
fflush(stdin);
scanf("%s",stu_.gender);
printf("输入籍贯:\n");
fflush(stdin);
scanf("%s",stu_.city);
for(int i=0; i<obj_num; i++)
{
printf("输入%s成绩:\n",obj_name[i]);
fflush(stdin);
scanf("%d",&stu_.score[i]);
}
insert(index,stu_);
puts("插入完成");
system("pause");
}
else if(option==9)
{
system("cls");
read();
system("pause");
}
else if(option==10)
{
system("cls");
save();
system("pause");
}
else if(option==11)
{
system("cls");
return;
system("pause");
}
}
}
int main()
{
menu();
return 0;
}
根据你的要求编写代码,非GTP,纯手工编写,望采纳。
(1)部分截图
主界面截图
显示全部信息截图(以二维数组方式显示)
不同班级学生保存到不同的文件
(2)代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NMBSCORE 3
const char* kcname[NMBSCORE] = { "语文","数学","英语" };
typedef struct _stNode
{
int num; //学号
char name[20]; //姓名
char sex; //性别
int age; //年龄
int cls; //班级(1-3)
int score[NMBSCORE]; //成绩
struct _stNode* next;
}StNode;
//保存的文件
const char* filename1 = "class1.txt";
const char* filename2 = "class2.txt";
const char* filename3 = "class3.txt";
//学生信息保存
void Save(StNode* head)
{
StNode* node;
FILE* fp1, * fp2, * fp3;
FILE* fp;
int i;
//system("cls");
fp1 = fopen(filename1, "w");
fp2 = fopen(filename2, "w");
fp3 = fopen(filename3, "w");
node = head;
while (node)
{
if (node->cls == 1)
fp = fp1;
else if (node->cls == 2)
fp = fp2;
else
fp = fp3;
fprintf(fp, "%d%20s %c%4d%4d", node->num, node->name, node->sex, node->age, node->cls);
for (i = 0; i < NMBSCORE; i++)
fprintf(fp, "%4d", node->score[i]);
fprintf(fp, "\n");
node = node->next;
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
printf("文件保存成功!\n");
//system("pause");
}
//添加学生信息
StNode* Input(StNode* head)
{
StNode* p, * node;
int i;
system("cls");
node = (StNode*)malloc(sizeof(StNode));
//录入信息
printf("请输入学号:");
scanf("%d", &node->num);
printf("请输入姓名:");
scanf("%s", node->name);
printf("请输入性别:");
scanf(" %c", &node->sex);
printf("请输入年龄:");
scanf(" %d", &node->age);
printf("请输入班级(1-3):");
scanf("%d", &node->cls);
for (i = 0; i < NMBSCORE; i++)
{
printf("请输入%s成绩:", kcname[i]);
scanf("%d", &node->score[i]);
}
node->next = 0;
if (head == 0)
{
head = node;
//
}
else
{
p = head;
while (p->next)
p = p->next;
//新建节点
p->next = node;
}
Save(head);
system("pause");
return head;
}
//显示单个学生信息
void showSingle(StNode* p)
{
int j;
printf("%10s %20s %4s %4s %4s", "学号", "姓名", "性别", "年龄", "班级");
for (j = 0; j < NMBSCORE; j++)
printf(" %4s", kcname[j]);
printf("\n");
printf("%10d ", p->num);
printf("%20s ", p->name);
printf("%4c ", p->sex);
printf("%4d ", p->age);
printf("%4d", p->cls);
for (j = 0; j < NMBSCORE; j++)
printf(" %4d ", p->score[j]);
printf("\n");
}
//显示所有学生信息
void showAll(StNode* head, int flag)
{
StNode* p;
int j;
if (flag == 1)
system("cls");
p = head;
printf("%10s %20s %4s %4s %4s", "学号", "姓名", "性别", "年龄", "班级");
for (j = 0; j < NMBSCORE; j++)
printf(" %4s", kcname[j]);
printf("\n");
while (p)
{
printf("%10d ", p->num);
printf("%20s ", p->name);
printf("%4c ", p->sex);
printf("%4d ", p->age);
printf("%4d", p->cls);
for (j = 0; j < NMBSCORE; j++)
printf(" %4d", p->score[j]);
printf("\n");
p = p->next;
}
system("pause");
}
//查询信息
void Find(StNode* head)
{
int opt;
StNode* p = head;
int id;
char name[20] = { 0 };
system("cls");
printf("1.按学号查询\n");
printf("2.按姓名查询\n");
scanf("%d", &opt);
switch (opt)
{
case 1:
printf("请输入学号:");
scanf("%d", &id);
while (p)
{
if (p->num == id)
{
showSingle(p);
break;
}
p = p->next;
}
if (p == 0)
printf("查无此人\n");
break;
case 2:
printf("请输入姓名:");
scanf("%s", name);
while (p)
{
if (strcmp(p->name, name) == 0)
{
showSingle(p);
break;
}
p = p->next;
}
if (p == 0)
printf("查无此人\n");
break;
}
system("pause");
}
//插入学生信息
void Insert(StNode* head)
{
StNode* node = 0;
StNode* pnew = 0;
int id, i;
system("cls");
//输入新学生的信息
pnew = (StNode*)malloc(sizeof(StNode));
//录入信息
printf("录入新学生的信息\n");
printf("请输入学号:");
scanf("%d", &pnew->num);
printf("请输入姓名:");
scanf("%s", pnew->name);
printf("请输入性别:");
scanf(" %c", &pnew->sex);
printf("请输入年龄:");
scanf(" %d", &pnew->age);
printf("请输入班级:");
scanf("%d", &pnew->cls);
for (i = 0; i < NMBSCORE; i++)
{
printf("请输入%s成绩:", kcname[i]);
scanf("%d", &pnew->score[i]);
}
pnew->next = 0;
//插入
printf("请输入需要插入位置(某个学号的后面):");
scanf("%d", &id);
node = head;
while (node)
{
if (node->num == id)
break;
else
node = node->next;
}
if (node == 0)
{
printf("未找到该学号,插入失败\n");
delete pnew;
pnew = 0;
}
else
{
pnew->next = node->next;
node->next = pnew;
printf("插入成功!\n");
Save(head); //插入后保存文件
}
system("pause");
}
//删除学生信息
void DeleteInfo(StNode* head)
{
StNode* node, * pre;
int id, i = 0;
system("cls");
printf("请输入需要删除信息的学生学号:");
scanf("%d", &id);
if (head->num == id)
{
showSingle(head);
node = head->next;
free(head);
head = node;
printf("该学生信息已经删除\n");
Save(head);
system("cls");
return;
}
else
{
pre = head;
node = head->next;
while (node)
{
if (node->num == id)
{
pre->next = node->next;
showSingle(node);
free(node);
node = 0;
printf("该学生信息已经删除\n");
Save(head);
system("pause");
return;
}
else
{
pre = node;
node = node->next;
}
}
printf("查无此人\n");
system("pause");
}
}
//成绩计算
void Caculate(StNode* head)
{
StNode* p = head;
double t;
int i;
while (p)
{
t = 0;
for (i = 0; i < NMBSCORE; i++)
t += p->score[i];
printf("学号:%10d\t 姓名:%20s 总分:%6d\t 平均分:%.2f\n", p->num, p->name, (int)t, (t / NMBSCORE));
p = p->next;
}
}
//总分降序排序
StNode* Sort(StNode* head)
{
StNode* min_pre = NULL;
StNode* min = head;
StNode* tmp = head;
StNode* new_list = NULL;
StNode* tail_sort = NULL;
char name[20] = { 0 };
int i = 0;
int s1, s2;
system("cls");
if (NULL == head) //若链表为空则不用排序
{
return NULL;
}
if (NULL == head->next) //若链表中只有一个数,则不用比较
{
printf("min is head\n");
return head;
}
while (head)
{
min = head;
tmp = head;
while (tmp->next)
{
//根据总分降序排序
s1 = 0;
s2 = 0;
for (i = 0; i < NMBSCORE; i++)
{
s1 += min->score[i];
s2 += tmp->next->score[i];
}
if (s1 < s2) //降序
{
min = tmp->next;
min_pre = tmp;
}
tmp = tmp->next;
}
if (min == head)
{
head = head->next;
}
else
{
min_pre->next = min->next;
min->next = NULL;
}
if (NULL == new_list) //按照尾插将最小的数组成新的链表
{
tail_sort = min;
new_list = tail_sort;
}
else
{
tail_sort->next = min;
tail_sort = min;
}
}
return new_list;
}
int main()
{
StNode* head = 0;
int opt = 0;
int bgo = 1;
while (bgo)
{
system("cls");
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");
scanf("%d", &opt);
switch (opt)
{
case 0:
bgo = 0;
break;
case 1:
head = Input(head);
break;
case 2:
showAll(head, 1);
break;
case 3:
Find(head);
break;
case 4:
Insert(head);
break;
case 5:
DeleteInfo(head);
break;
case 6:
Caculate(head);
break;
case 7:
head = Sort(head);
showAll(head, 0);
break;
}
}
return 0;
}
以下是一个基础的成绩管理系统的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
#define MAX_CLASS_NUM 3
#define MAX_STUD_NUM_PER_CLASS 10
struct grade {
int chinese;
int math;
int english;
int total; // 总分
};
struct student {
char name[MAX_NAME_LEN];
int id;
int class_id;
struct grade grade;
struct student *next;
};
// 初始化头结点数组
struct student *head[MAX_CLASS_NUM];
// 打印菜单
void print_menu() {
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("\n");
}
// 从文件加载学生信息
void load_students_from_file() {
int i;
for (i = 0; i < MAX_CLASS_NUM; i++) {
FILE *fp;
char filename[20];
sprintf(filename, "class_%d.txt", i+1);
fp = fopen(filename, "r");
if (fp == NULL) {
head[i] = NULL;
} else {
struct student *cur = NULL;
while (1) {
struct student *s = (struct student *)malloc(sizeof(struct student));
int ret = fscanf(fp, "%s %d %d %d %d %d", s->name, &s->id, &s->class_id,
&s->grade.chinese, &s->grade.math, &s->grade.english);
if (ret == EOF) {
// 文件读取结束
s->next = NULL;
if (cur != NULL) {
cur->next = s;
} else {
head[i] = s;
}
break;
}
s->grade.total = s->grade.chinese + s->grade.math + s->grade.english;
s->next = NULL;
if (cur != NULL) {
cur->next = s;
} else {
head[i] = s;
}
cur = s;
}
fclose(fp);
}
}
}
// 保存学生信息到文件
void save_students_to_file() {
int i;
for (i = 0; i < MAX_CLASS_NUM; i++) {
FILE *fp;
char filename[20];
sprintf(filename, "class_%d.txt", i+1);
fp = fopen(filename, "w");
struct student *p = head[i];
while (p != NULL) {
fprintf(fp, "%s %d %d %d %d %d\n", p->name, p->id, p->class_id,
p->grade.chinese, p->grade.math, p->grade.english);
p = p->next;
}
fclose(fp);
}
}
// 添加学生信息
void add_student() {
struct student *s = (struct student *)malloc(sizeof(struct student));
printf("请输入学生姓名:");
scanf("%s", s->name);
printf("请输入学生学号:");
scanf("%d", &s->id);
printf("请输入学生班级:");
scanf("%d", &s->class_id);
printf("请输入语文成绩:");
scanf("%d", &s->grade.chinese);
printf("请输入数学成绩:");
scanf("%d", &s->grade.math);
printf("请输入英语成绩:");
scanf("%d", &s->grade.english);
s->grade.total = s->grade.chinese + s->grade.math + s->grade.english;
// 找到学生所在的链表尾部
struct student *p = head[s->class_id - 1];
if (p == NULL) {
head[s->class_id - 1] = s;
} else {
while (p->next != NULL) {
p = p->next;
}
p->next = s;
}
printf("添加成功!\n");
}
// 显示学生信息
void show_students() {
int i, j;
for (i = 0; i < MAX_CLASS_NUM; i++) {
printf("====================\n");
printf("班级%d:\n", i+1);
printf("--------------------\n");
printf("姓名\t学号\t语文\t数学\t英语\t总分\n");
struct student *p = head[i];
while (p != NULL) {
printf("%s\t%d\t%d\t%d\t%d\t%d\n", p->name, p->id, p->grade.chinese,
p->grade.math, p->grade.english, p->grade.total);
p = p->next;
}
printf("====================\n\n");
}
}
不一定要按班级划分到不同班级文件啊,存在一个文件之后按照某种逻辑进行班级分类就行,比如整型1表示1班......
问题最佳方案——
这是一个成绩管理系统的课程设计,需要实现添加、显示、查找、插入、删除、成绩计算、按总分降序输出等功能。以下是一些实现这个系统的思路:
定义一个结构体类型来存储学生的信息。结构体中应包括学号、姓名、三门课程的成绩、班级等信息。
定义一个文件管理系统,将每个班级的学生信息存储在不同的文件中。可以通过文件名来区分不同的班级。
实现添加学生信息的功能。当用户输入新的学生信息后,将其存储在相应的文件中。可以通过文件名来找到对应的班级。
实现显示学生信息的功能。从文件中读取数据,并按照要求显示所有的学生信息。可以使用二维表格的形式输出。
实现查找学生信息的功能。可以按照姓氏、学号、最高/最低成绩、平均分等条件进行查找。
实现插入学生信息的功能。根据学号顺序进行插入。首先读取对应班级的文件中的学生信息,按照学号排序,然后将新的学生信息插入到正确的位置。
实现删除学生信息的功能。可以根据姓名或学号进行删除。先显示需要删除的记录,并让用户确认后再删除。
实现成绩计算的功能。可以计算每个学生的总分平均分,以及每个班级每门课的权重平均分等。
实现按总分降序输出的功能。从文件中读取数据,并按照总分降序或升序排列,然后显示所有的学生信息。
建议将每个功能实现为一个独立的函数,然后在主函数中调用这些函数,实现模块化设计。同时,为了保证程序的可读性和可维护性,建议添加必要的注释和错误处理机制。
首先,需要定义学生信息结构体类型,包括姓名、学号、三门课程成绩和班级等信息。例如:
struct Student {
char name[20];
char id[10];
float score1;
float score2;
float score3;
char class[10];
};
其次,需要实现以下基本功能函数:
add_student_info(): 添加学生信息到文件中;
display_student_info(): 从文件中读取数据,并按照要求显示所有学生信息;
search_student_by_name(): 根据姓名查找学生信息并显示;
search_student_by_id(): 根据学号查找学生信息并显示;
insert_student_info(): 根据学号顺序插入学生信息;
delete_student_info(): 根据学号或姓名删除学生信息,并在删除前显示相应记录;
calculate_total_average(): 计算每个学生的总分和平均分;
calculate_class_average(): 计算每个班级的每门课程的权重平均分;
sort_by_total_score(): 按总分降序输出所有学生信息;
最后,需要编写主函数,根据用户输入调用对应的功能函数,形成一个简单的菜单设计。例如:
int main() {
int choice;
while(1) {
printf("\n1. Add student information\n");
printf("2. Display student information\n");
printf("3. Search student information by name\n");
printf("4. Search student information by ID\n");
printf("5. Insert student information\n");
printf("6. Delete student information\n");
printf("7. Calculate each student's total and average scores\n");
printf("8. Calculate each class's average score for each course\n");
printf("9. Sort students by total score in descending order\n");
printf("0. Exit\n");
scanf("%d", &choice);
switch(choice) {
case 1:
add_student_info();
break;
case 2:
display_student_info();
break;
case 3:
search_student_by_name();
break;
case 4:
search_student_by_id();
break;
case 5:
insert_student_info();
break;
case 6:
delete_student_info();
break;
case 7:
calculate_total_average();
break;
case 8:
calculate_class_average();
break;
case 9:
sort_by_total_score();
break;
case 0:
exit(0);
default:
printf("Invalid choice!\n");
break;
}
}
return 0;
}
以上是一个大致的框架和思路,您可以根据需要自行定制和细化。同时,为了保证程序的稳定性和健壮性,还需要注意输入检查、异常处理、文件读写等方面的问题
让我们分别来实现这些功能函数。
add_student_info()
该函数的作用是将新的学生信息添加到指定班级的文件中。在添加之前,需要先打开文件,并判断是否打开成功。如果打开失败,则应该输出错误信息并返回。
void add_student_info() {
struct Student student;
FILE *fp;
char filename[20];
printf("Enter the class name to add student information: ");
scanf("%s", filename);
fp = fopen(filename, "a");
if (fp == NULL) {
printf("Failed to open file!\n");
return;
}
// 输入学生信息
printf("Enter the student's name: ");
scanf("%s", student.name);
printf("Enter the student's ID: ");
scanf("%s", student.id);
printf("Enter the student's score1: ");
scanf("%f", &student.score1);
printf("Enter the student's score2: ");
scanf("%f", &student.score2);
printf("Enter the student's score3: ");
scanf("%f", &student.score3);
printf("Enter the student's class name: ");
scanf("%s", student.class);
// 将学生信息写入文件
fprintf(fp, "%s %s %.1f %.1f %.1f %s\n", student.name, student.id, student.score1, student.score2, student.score3, student.class);
fclose(fp);
printf("Student information added successfully!\n");
}
display_student_info()
该函数的作用是从指定班级的文件中读取数据,并按照要求显示所有的学生信息。
void display_student_info() {
FILE *fp;
char filename[20], c;
printf("Enter the class name to display student information: ");
scanf("%s", filename);
fp = fopen(filename, "r");
if (fp == NULL) {
printf("Failed to open file!\n");
return;
}
// 输出表头
printf("%-15s%-10s%-10s%-10s%-10s%s\n", "Name", "ID", "Score1", "Score2", "Score3", "Class");
// 读取并输出每个学生信息
while(fscanf(fp, "%s %s %f %f %f %s", student.name, student.id, &student.score1, &student.score2, &student.score3, student.class) != EOF) {
printf("%-15s%-10s%-10.1f%-10.1f%-10.1f%s\n", student.name, student.id, student.score1, student.score2, student.score3, student.class);
}
fclose(fp);
}
search_student_by_name()
该函数的作用是根据姓名查找学生信息,并显示找到的所有学生信息。
void search_student_by_name() {
FILE *fp;
char filename[20], name[20], c;
int found = 0;
printf("Enter the class name to search student information: ");
scanf("%s", filename);
printf("Enter the student's name to search: ");
scanf("%s", name);
fp = fopen(filename, "r");
if (fp == NULL) {
printf("Failed to open file!\n");
return;
}
// 输出表头
printf("%-15s%-10s%-10s%-10s%-10s%s\n", "Name", "ID", "Score1", "Score2", "Score3", "Class");
// 读取并查找每个学生信息
while(fscanf(fp, "%s %s %f %f %f %s", student.name, student.id, &student.score1, &student.score2, &student.score3, student.class) != EOF) {
if (strcmp(student.name, name) == 0) {
printf("%-15s%-10s%-10.1f%-10.1f%-10.1f%s\n", student.name, student.id, student.score1, student.score2, student.score3, student.class);
found = 1;
}
}
if (!found) {
printf("No matching student found.\n");
}
fclose(fp);
}
search_student_by_id()
该函数的作用是根据学号查找学生信息,并显示找到的所有学生信息。
void search_student_by_id() {
FILE *fp;
char filename[20], id[10], c;
int found = 0;
printf("Enter the class name to search student information: ");
scanf("%s", filename);
printf("Enter the student's ID to search: ");
scanf("%s", id);
fp = fopen(filename, "r");
if (fp == NULL) {
printf("Failed to open file!\n");
return;
}
// 输出表头
printf("%-15s%-10s%-10s%-10s%-10s%s\n", "Name", "ID", "Score1", "Score2", "Score3", "Class");
// 读取并查找每个学生信息
while(fscanf(fp, "%s %s %f %f %f %s", student.name, student.id, &student.score1, &student.score2, &student.score3, student.class) != EOF) {
if (strcmp(student.id, id) == 0) {
printf("%-15s%-10s%-10.1f%-10.1f%-10.1f%s\n", student.name, student.id, student.score1, student.score2, student.score3, student.class);
found = 1;
}
}
if (!found) {
printf("No matching student found.\n");
}
fclose(fp);
}
insert_student_info()
该函数的作用是将新的学生信息按照学号顺序插入到指定班级的文件中。在插入之前,需要先打开文件,并判断是否打开成功。如果打开失败,则应该输出错误信息并返回。插入时需要遍历文件中的学生信息,找到插入位置,并将剩余的信息向后移动。
void insert_student_info() {
struct Student student;
FILE *fp, *tmp;
char filename[20], c;
printf("Enter the class name to insert student information: ");
scanf("%s", filename);
fp = fopen(filename, "r");
if (fp == NULL) {
printf("Failed to open file!\n");
return;
}
tmp = fopen("temp.txt", "w");
if (tmp == NULL) {
printf("Failed to open temporary file!\n");
fclose(fp);
return;
}
// 输入学生信息
printf("Enter the student's name: ");
scanf("%s", student.name);
printf("Enter the student's ID: ");
scanf("%s", student.id);
printf("Enter the student's score1: ");
scanf("%f", &student.score1);
printf("Enter the student's score2: ");
scanf("%f", &student.score2);
printf("Enter the student's score3: ");
scanf("%f", &student.score3);
printf("Enter the student's class name: ");
scanf("%s", student.class);
// 遍历文件中的学生信息,找到插入位置
while(fscanf(fp, "%s %s %f %f %f %s", temp.name, temp.id, &temp.score1, &temp.score2, &temp.score3, temp.class) != EOF) {
if (strcmp(student.id, temp.id) < 0) {
fprintf(tmp, "%s %s %.1f %.1f %.1f %s\n", student.name, student.id, student.score1, student.score2, student.score3, student.class);
// 将剩余的信息向后移动
fprintf(tmp, "%s %s %.1f %.1f %.1f %s\n", temp.name, temp.id, temp.score1, temp.score2, temp.score3, temp.class);
while(fscanf(fp, "%s %s %f %f %f %s", temp.name, temp.id, &temp.score1, &temp.score2, &temp.score3, temp.class) != EOF) {
fprintf(tmp, "%s %s %.1f %.1f %.1f %s\n", temp.name, temp.id, temp.score1, temp.score2, temp.score3, temp.class);
}
break;
} else {
fprintf(tmp, "%s %s %.1f %.1f %.1f %s\n", temp.name, temp.id, temp.score1, temp.score2, temp.score3, temp.class);
}
}
// 如果新信息比文件中所有记录的学号都大,直接在文件末尾添加
if (feof(fp)) {
fprintf(tmp, "%s %s %.1f %.1f %.1f %s\n", student.name, student.id, student.score1, student.score2, student.score3, student.class);
}
fclose(fp);
fclose(tmp);
// 删除原文件并将新文件重命名为原文件名
remove(filename);
rename("temp.txt", filename);
printf("Student information inserted successfully!\n");
}
6. delete_student_info()
该函数的作用是根据学号或姓名删除学生信息,并在删除前显示相应记录。
void delete_student_info() {
FILE *fp, *tmp;
char filename[20], id_or_name[20], c;
int found = 0;
printf("Enter the class name to delete student information: ");
scanf("%s", filename);
printf("Enter the student's ID or name to delete: ");
scanf("%s", id_or_name);
fp = fopen(filename, "r");
if (fp == NULL) {
printf("Failed to open file!\n");
return;
}
tmp = fopen("temp.txt", "w");
if (tmp == NULL) {
printf("Failed to open temporary file!\n");
fclose(fp);
return;
}
// 遍历文件中的学生信息,找到要删除的学生信息并输出
while(fscanf(fp, "%s %s %f %f %f %s", temp.name, temp.id, &temp.score1, &temp.score2, &temp.score3, temp.class) != EOF) {
if (strcmp(temp.id, id_or_name) == 0 || strcmp(temp.name, id_or_name) == 0) {
printf("%-15s%-10s%-10.1f%-10.1f%-10.1f%s\n", temp.name, temp.id, temp.score1, temp.score2, temp.score3, temp.class);
found = 1;
} else {
fprintf(tmp, "%s %s %.1f %.1f %.1f %s\n", temp.name, temp.id, temp.score1, temp.score2, temp.score3, temp.class); // 将未删除的学生信息写入临时文件
}
}
fclose(fp);
fclose(tmp);
// 如果没有找到要删除的学生信息,输出错误信息并返回
if (!found) {
printf("No matching student found.\n");
remove("temp.txt");
return;
}
// 删除原文件并将新文件重命名为原文件名
remove(filename);
rename("temp.txt", filename);
printf("Student information deleted successfully!\n");
}
7. calculate_total_average()
该函数的作用是计算每个学生的总分和平均分,并输出结果。
void calculate_total_average() {
FILE *fp;
char filename[20], c;
printf("Enter the class name to calculate total average: ");
scanf("%s", filename);
fp = fopen(filename, "r");
if (fp == NULL) {
printf("Failed to open file!\n");
return;
}
// 输出表头
printf("%-15s%-10s%-10s%-10s%-10s%s\n", "Name", "ID", "Score1", "Score2", "Score3", "Total Average");
float total, average;
int count;
// 读取并计算每个学生的总分和平均分
while(fscanf(fp, "%s %s %f %f %f %s", student.name, student.id, &student.score1, &student.score2, &student.score3, student.class) != EOF) {
total = student.score1 + student.score2 + student.score3;
average = total / 3.0;
printf("%-15s%-10s%-10.1f%-10.1f%-10.1f%.1f\n", student.name, student.id, student.score1, student.score2, student.score3, average);
}
fclose(fp);
}
8. calculate_class_average()
该函数的作用是计算每个班级的每门课程的权重平均分,并输出结果。
void calculate_class_average() {
FILE *fp;
char filename[20], c;
int count = 0;
float score1_total = 0, score2_total = 0, score3_total = 0;
printf("Enter the class name to calculate class average: ");
scanf("%s", filename);
fp = fopen(filename, "r");
if (fp == NULL) {
printf("Failed to open file!\n");
return;
}
// 计算每个班级的每门课程的权重平均分
while(fscanf(fp, "%s %s %f %f %f %s", student.name, student.id, &student.score1, &student.score2, &student.score3, student.class) != EOF) {
if (strcmp(student.class, filename) == 0) {
score1_total += student.score1;
score2_total += student.score2;
score3_total += student.score3;
count++;
}
}
fclose(fp);
// 如果没有找到当前班级的任何学生信息,输出错误信息并返回
if (count == 0) {
printf("No matching student found.\n");
return;
}
// 输出结果
printf("Class %s:\n", filename);
printf("Score1 Average: %.1f\n", score1_total / count);
printf("Score2 Average: %.1f\n", score2_total / count);
printf("Score3 Average: %.1f\n", score3_total / count);
}
C语言小项目——学生成绩管理系统
#include <stdio.h>
#include <stdlib.h>
//#include "hs.h"
struct student
{
int id;
float yw;
float sx;
float wy;
float pj;
};
void help(void);
int type(struct student *p);
void list(struct student *p,int n);
void average(struct student *p,int n);
void search (struct student *p);
void sort(struct student *p,int n);
int main(int argc, const char *argv[])
{
char ch;
struct student stu[32];
int n=0;
while(1)
{
printf("请输入命令 = ");
//getchar();
scanf("%c",&ch);
putchar(10);
if(ch=='T')
{
n=type(stu);
}
else if(ch=='L')
{
if(n==0)
{
printf("成绩表为空!请先使用T录入成绩!\n");
putchar(10);
}
else
list(stu,n);
}
else if(ch=='A')
{
if(n==0)
{
printf("成绩表为空!请先使用T录入成绩!\n");
putchar(10);
}
else
{
average(stu,n);
printf("平均分已计算,请使用命令L查看!\n");
putchar(10);
}
}
else if(ch=='H')
help();
else if(ch=='C')
system("clear");
else if(ch=='S')
{
if(n==0)
{
printf("成绩表为空!请先使用T录入成绩!\n");
putchar(10);
}
else
{
search(stu);
putchar(10);
}
}
else if(ch=='P')
{
if(n==0)
{
printf("成绩表为空!请先使用T录入成绩!\n");
putchar(10);
}
else
{
sort(stu,n);
putchar(10);
}
}
else if(ch=='Q')
{
printf("Press any key to continue!\n");
return -1;
}
getchar();
}
return 0;
}
int type(struct student *p)
{
int n=0;
printf("请输入学生人数:");
scanf("%d",&n);
printf("请输入学生三门课的成绩:\n");
printf("学号 语文 数学 外语\n");
for(int i=0;i<n;i++)
{
printf("%d ",i+1);
struct student stu[i];
scanf("%f %f %f",&(p+i)->yw,&(p+i)->sx,&(p+i)->wy);
}
return n;
}
void list(struct student *p,int n)
{
printf("学生成绩如下:\n");
printf("学号 语文 数学 外语 平均分\n");
for(int i=0;i<n;i++)
{
printf("%d ",i+1);
printf("%.1f %.1f %.1f %.1f",p->yw,p->sx,p->wy,p->pj);
p++;
putchar(10);
}
}
void average(struct student *p,int n)
{
for(int i=0;i<n;i++)
{
(p->pj)=((p->yw)+(p->sx)+(p->wy))/3;
p++;
}
}
void help(void)
{
printf("**********************************\n");
printf(" * 学生成绩管理系统——帮助菜单 * \n");
printf("**********************************\n");
printf(" * H = 显示帮助菜单 * \n");
printf(" * T = 成绩录入 * \n");
printf(" * A = 计算学生平均分 * \n");
printf(" * L = 列出成绩单 * \n");
printf(" * P = 按平均成绩由高到低排序 * \n");
printf(" * S = 按学号查询学生成绩 * \n");
printf(" * C = 清屏 * \n");
printf(" * Q =退出系统 * \n");
printf("**********************************\n");
printf(" *Copyright(c) 2022.3.15 By liq* \n");
printf("**********************************\n");
}
void search(struct student *p)
{
int s=0;
printf("请输入要查询的学生号:");
scanf("%d",&s);
printf("学号 语文 数学 外语 平均分\n");
printf("%d %.1f %.1f %.1f %.1f",s,(p+s-1)->yw,(p+s-1)->sx,(p+s-1)->wy,(p+s-1)->pj);
putchar(10);
}
void sort(struct student *p,int n)
{
struct student temp;
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if(p[j].pj<p[j+1].pj)
{
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
}
printf("排序完成,请使用命令L查看!\n");
}
不知道你这个问题是否已经解决, 如果还没有解决的话:void TwoSum(int a[],int target){
for(int i=0;i<len(a);i++){
for(int j=i+1; j<len(a);j++){
if(a[i] + a[j] == target){
printf("[%d, %d]", i, j);
}
}
}
}
回答:
针对该问题,我可以提供以下解决方案: 1. 先确定需要储存的数据结构,可以定义一个结构体来存放学生的各项信息,包括姓名、学号、班级、各科成绩等。注意,班级信息需要作为一个单独的字段来记录,方便后续按班级划分。 2. 定义一个文件名的规则,以班级信息为文件名的一部分,例如“class1.txt”, “class2.txt”等等。 3. 在读入学生信息后,根据学生的班级信息将学生信息存入相应的文件中。以C语言为例,可以使用fopen函数打开文件,使用fprintf函数将学生信息写入文件中,最后使用fclose函数关闭文件。具体代码如下:
FILE *fp; //文件指针
char filename[20];//文件名
int i;
struct student{ //定义学生信息结构体
char name[20];
int id;
int classno;
float score;
};
struct student stu[10]; //定义存放学生信息的结构体数组
//读入学生信息的代码省略
for(i=0;i<10;i++){
sprintf(filename, "class%d.txt", stu[i].classno); //生成文件名
fp = fopen(filename, "a"); //打开文件追加模式
if(fp == NULL){
printf("Error: fail to open %s\n", filename);
return;
}
fprintf(fp, "%s %d %d %.2f\n", stu[i].name, stu[i].id, stu[i].classno, stu[i].score); //写入学生信息
fclose(fp); //关闭文件
}
注意,以上代码仅为示例,具体实现需根据实际需求进行修改。
FILE *fp; //文件指针
char filename[20];//文件名
int classno, count = 0, i, j, flag;
float total_score = 0;
struct student{ //定义学生信息结构体
char name[20];
int id;
int classno;
float score;
};
struct student stu[100]; //定义存放学生信息的结构体数组
printf("please input class number: ");
scanf("%d", &classno);
sprintf(filename, "class%d.txt", classno); //生成文件名
fp = fopen(filename, "r"); //打开文件读取模式
if(fp == NULL){
printf("Error: fail to open %s\n", filename);
return;
}
//读取学生信息并存入结构体数组
while(fscanf(fp, "%s %d %d %f", stu[count].name, &stu[count].id, &stu[count].classno, &stu[count].score) != EOF){
if(stu[count].classno == classno){
count++;
total_score += stu[count].score;
}
}
fclose(fp);
//冒泡排序
for(i = 0; i < count; i++){
flag = 0;
for(j = count - 1; j > i; j--){
if(stu[j - 1].score > stu[j].score){
struct student temp;
temp = stu[j - 1];
stu[j - 1] = stu[j];
stu[j] = temp;
flag = 1;
}
}
if(flag == 0) break; //优化,若已排好序则直接退出循环
}
//输出排序结果
printf("name\tid\tclassno\tscore\n");
for(i = 0; i < count; i++){
printf("%s\t%d\t%d\t%.2f\n", stu[i].name, stu[i].id, stu[i].classno, stu[i].score);
}
printf("average score: %.2f\n", total_score / count);
同样需要说明的是,以上代码仅为示例,具体实现需根据实际需求进行修改。