C语言问题,假设有N个学生,学生信息包含姓名、学号、外语、数学、程序设计三门课程。请实现如下功能:

2025-03-10 18:59:27
推荐回答(4个)
回答1:

#include
#include
#include
#include

typedef struct //结构体
{
char name[20]; //学生姓名
char No[20]; //学号
float en; //英语成绩
float math; //数学成绩
float program; //程序设计成绩
float sum; //总成绩
} STUDENT;

STUDENT* s=NULL; //定义一个指向结构体的指针,即结构体动态数组
char work_dir[100]={'\0'}; //程序绝对路径
char data_filename[100]={'\0'}; //数据文件名称(绝对路径)
int count=0; //计数

int main()
{
_getcwd(work_dir,100); //获取完整路径
strcpy(data_filename,work_dir);
strcat(data_filename,"\\data.dat"); //拼接成数据文件名称
printf("请输入一共有多少个学生 : ");
scanf("%d",&count);
if(count>0) //如果输入的学生数大于0,
{ //则构建一个结构体数组
s=(STUDENT*)malloc(sizeof(STUDENT)*count);
}
else //如果学生数不大于0,则退出程序
{
printf("\n输入的数过小, 程序将退出!");
_getch();
return 0;
}
int i;
for(i=0;i{
printf("\n请输入第%d个(%d/%d)学生信息\n格式:姓名 学号 外语 数学 程序设计(中间用空格间隔):\n",i+1,i+1,count);
fflush(stdin);
scanf("%s %s %f %f %f",s[i].name,s[i].No,&s[i].en,&s[i].math,&s[i].program);
s[i].sum=s[i].en+s[i].math+s[i].program;
}
////写入数据文件---开始,(文件结构为ini文件,具体可打开该文件查看)////
char ch[20]={'\0'};
char value[20]={'\0'};
sprintf(ch,"%d",count);
WritePrivateProfileString("COUNT","count",ch,data_filename);
for(i=0;i{
sprintf(ch,"%d",i+1);
WritePrivateProfileString(ch,"姓名",s[i].name,data_filename);
WritePrivateProfileString(ch,"学号",s[i].No,data_filename);
sprintf(value,"%.1f",s[i].en);
WritePrivateProfileString(ch,"外语",value,data_filename);
sprintf(value,"%.1f",s[i].math);
WritePrivateProfileString(ch,"数学",value,data_filename);
sprintf(value,"%.1f",s[i].program);
WritePrivateProfileString(ch,"程序设计",value,data_filename);
}
printf("\n\n信息已保存在%s文件中",data_filename);
////写入数据文件---结束/////////////////////////////////////////////
fflush(stdin);
_getch();
printf("\n\n程序设计成绩为85分的学生:");
printf("\n\n姓名 学号 外语 数学 程序设计\n");
int find=0;
for(i=0;i{
if(s[i].program==85)
{
find++;
printf("\n%s %s %.1f %.1f %.1f",s[i].name,s[i].No,s[i].en,s[i].math,s[i].program);
}
}
printf("\n\n共有%d个学生",find);

////排序---开始////
STUDENT stu;
int j;
for(i=0;i{
for(j=0;j{
if(s[j].sum{
stu=s[j];
s[j]=s[j+1];
s[j+1]=stu;
}
}
}
////排序---结束////
////以下为输出排序后的数据////
printf("\n\n全部学生按总分由高到低的顺序排列为:\n\n");
printf("姓名 学号 外语 数学 程序设计 总成绩\n");
for(i=0;i{
printf("\n%s %s %.1f %.1f %.1f %.1f",s[i].name,s[i].No,s[i].en,s[i].math,s[i].program,s[i].sum);
}
return 0;
}

回答2:

#include
#include
typedef struct{
char name[30];
int number;
float english;
float math;
float programme;
float score;
}ST_STUDENT;
int main()
{
#define N 5
ST_STUDENT stu_list[N],tmp;
int i,j=0;
FILE *fp;

//输入学生信息
for(i=0;i {
printf("请输入第%d位学生的姓名、学号、外语成绩、数学成绩、程序设计成绩:\n", i+1);
fflush(stdin);
scanf("%s%d%f%f%f",stu_list[i].name,&stu_list[i].number,
&stu_list[i].english,&stu_list[i].math,&stu_list[i].programme);
stu_list[i].score=stu_list[i].english+stu_list[i].math+stu_list[i].programme;
}

//将学生信息保存成文件
fp=fopen("/Users/zhengliang/Downloads/out.txt", "w");
if(fp!=NULL)
{
for(i=0;i {
fprintf(fp, "%s %d %.2f %.2f %.2f\n", stu_list[i].name, stu_list[i].number,
stu_list[i].english, stu_list[i].math, stu_list[i].programme);
}
fclose(fp);
}

//查找程序设计分数为85分的学生
for(i=0;i {
if(stu_list[i].programme==85)
{
if(j==0)
{
printf("程序设计分数为85分的学生是:");
j++;
}
printf(" %s",stu_list[i].name);
}
}
if(j==0)
{
printf("未找到程序设计分数为85分的学生");
}
printf("\n");

//按总分排序
for(i=0;i {
for(j=0;j {
if(stu_list[j].score {
tmp=stu_list[j];
stu_list[j]=stu_list[j+1];
stu_list[j+1]=tmp;
}
}
}
printf("总分排序结果:\n");
for(i=0;i {
printf("%s %d %.2f %.2f %.2f %.2f\n", stu_list[i].name, stu_list[i].number,
stu_list[i].english, stu_list[i].math, stu_list[i].programme, stu_list[i].score);
}

return 0;
}

回答3:

这个我可以写,只不过有点费时间,兄弟

回答4:

必须自己写冒泡嘛?用库里面的快排可以不