
#include <stdioh>
#include <stdlibh>
#include <stringh>
#define status int
#define NAME 30 /各类名称字数上限/
#define STU 100 /学生人数上限/
#define SUB 10 /课程数上限/
typedef struct record {
float score; /成绩分数/
} record;
typedef struct student {
int id; /索引性质的id/
int no; /学号/
char name[NAME]; /姓名/
record scores[SUB]; /各门课成绩分数/
float totalScore; /总分/
float averageScore; /平均分/
int ranking; /名次/
} student;
int subNum = 3; /课程数/
char subject[SUB][NAME] = {"数学","英语","计算机"}; /课程名称/
/以下为函数声明/
int stuInfoEmpty (student stu[], int stuNum); /学生信息判空/
status inputStuInfo (student stu[], int stuIndex, int subNum); /录入单个学生信息/
status inputAllStuInfo (student stu[], int stuNum, int subNum); /录入全部学生信息/
status calcStuInfo (student stu[], int stuIndex, int subNum); /计算处理单个学生信息/
status calcAllStuInfo (student stu[], int stuNum, int subNum); /计算处理全部学生信息/
status printStuInfo (student stu[], int stuIndex, int subNum, int inclRanking); /输出单个学生信息/
status printAllStuInfo (student stu[], int stuNum, int subNum, int inclRanking); /输出全部学生信息/
status descSort (student stu[], int stuNum, int subNum); /按总分降序排列并录入名次/
int getCommand (void); /输入命令编号/
status printMeunText (void); /打印菜单文本/
status runMeun (student stu[], int stuNum, int subNum); /调出菜单/
/以上为函数声明/
int main (void) {
student stu[STU] = {-1}; /学生结构体数组/
int stuNum;
int i;
runMeun (stu, stuNum, subNum);
return 0;
}
/学生信息判空/
/为空返回1;不空返回0/
int stuInfoEmpty (student stu[], int stuNum) {
int i;
if (stuNum == 0)
return 1;
for (i=0; i<stuNum; i++)
if (stu[i]id == -1)
return 1;
return 0;
}
/录入单个学生信息/
status inputStuInfo (student stu[], int stuIndex, int subNum) {
int i;
scanf ("%d",&stu[stuIndex]no); /学号/
if (stu[stuIndex]no == -1) { /学号录入-1以结束/
stu[stuIndex]id = -1;
return -1; /本次未录入/
}
scanf ("%s",&stu[stuIndex]name); /姓名/
for (i=0; i<subNum; i++) {
scanf ("%f",&stu[stuIndex]scores[i]score);
} /各门课成绩分数/
for (i=0; i<subNum; i++)
if (stu[stuIndex]scores[i]score>100 || stu[stuIndex]scores[i]score<0)
return 0; /本次录入错误/
return 1; /本次录入成功/
}
/录入全部学生信息/
status inputAllStuInfo (student stu[], int stuNum, int subNum) {
int i,inputStatus,count;
puts ("======================================================");
puts ("录入学生信息");
puts ("======================================================");
putchar ('\n');
if (stuNum!=0) {
printf ("已有%d名学生信息!\n",stuNum);
putchar ('\n');
puts ("继续录入以新增(学号录入-1以结束)↓↓");
putchar ('\n');
}
else {
puts ("请录入学生信息(学号录入-1以结束)↓↓");
putchar ('\n');
}
/录入信息之表头/
puts ("------------------------------------------------------");
printf ("\t\t学号\t姓名\t");
for (i=0; i<subNum; i++)
printf ("%s\t",subject[i]);
putchar ('\n');
puts ("------------------------------------------------------");
/录入信息/
count=0;
i=stuNum;
while (1) {
printf ("第%d名学生\t",i+1);
stu[i]id = i+1;
inputStatus = inputStuInfo (stu, i, subNum);
if (inputStatus==1) {
i++;
count++;
}
else if (inputStatus==0) {
putchar ('\n');
puts ("成绩输入错误!请重新输入↓");
continue;
}
else if (inputStatus==-1)
break;
}
stuNum += count;
puts ("------------------------------------------------------");
putchar ('\n');
putchar ('\n');
if (count!=0)
printf ("本次%d名学生信息录入完毕!即将返回主菜单。\n",count);
else
printf ("您本次未输入学生信息!即将返回主菜单。\n");
putchar ('\n');
puts ("按任意键继续");
putchar ('\n');
fflush (stdin);
getch ();
return 1;
}
/计算处理单个学生信息/
status calcStuInfo (student stu[], int stuIndex, int subNum) {
int i;
stu[stuIndex]totalScore = stu[stuIndex]averageScore = 0;
/计算总分/
for (i=0; i<subNum; i++) {
stu[stuIndex]totalScore += stu[stuIndex]scores[i]score;
}
stu[stuIndex]averageScore = stu[stuIndex]totalScore/subNum; /计算平均分/
return 1;
}
/计算处理全部学生信息/
status calcAllStuInfo (student stu[], int stuNum, int subNum) {
int i;
/计算总分、平均分等/
for (i=0; i<stuNum; i++)
calcStuInfo (stu, i, subNum);
return 1;
}
/输出单个学生信息/
status printStuInfo (student stu[], int stuIndex, int subNum, int inclRanking) {
int i;
if (inclRanking)
printf ("%d\t",stu[stuIndex]ranking); /名次/
printf ("%d\t",stu[stuIndex]no); /学号/
printf ("%s\t",stu[stuIndex]name); /姓名/
for (i=0; i<subNum; i++) /各门课成绩分数/
printf ("%2f\t",stu[stuIndex]scores[i]score);
printf ("%2f\t",stu[stuIndex]totalScore); /总分/
printf ("%2f\t",stu[stuIndex]averageScore); /平均分/
putchar ('\n');
return 1;
}
/输出全部学生信息/
status printAllStuInfo (student stu[], int stuNum, int subNum, int inclRanking) {
int i;
if (stuInfoEmpty (stu,stuNum)) {
puts ("尚未录入学生信息!即将返回主菜单。");
putchar ('\n');
puts ("按任意键继续");
putchar ('\n');
fflush (stdin);
getch ();
return 0;
}
puts ("======================================================");
puts ("全部学生信息");
puts ("======================================================");
putchar ('\n');
if (inclRanking)
printf ("%d名学生信息如下,按总分由高到低排列名次 ↓↓\n",stuNum);
else
printf ("%d名学生信息如下 ↓↓\n",stuNum);
putchar ('\n');
/输出信息之表头/
puts ("------------------------------------------------------");
if (inclRanking)
printf ("名次\t");
printf ("学号\t");
printf ("姓名\t");
for (i=0; i<subNum; i++)
printf ("%s\t",subject[i]);
printf ("总分\t");
printf ("平均分\t");
putchar ('\n');
puts ("------------------------------------------------------");
/输出信息/
for (i=0; i<stuNum; i++)
printStuInfo (stu, i, subNum, inclRanking);
puts ("------------------------------------------------------");
putchar ('\n');
putchar ('\n');
puts ("学生信息输出完毕!即将返回主菜单。");
putchar ('\n');
puts ("按任意键继续");
putchar ('\n');
fflush (stdin);
getch ();
return 1;
}
/按总分降序排序、录入名次并输出/
status descSort (student stu[], int stuNum, int subNum) {
int i,j;
student temp;
if (stuInfoEmpty (stu,stuNum))
return 0;
/按总分降序/
for (i=0; i<stuNum-1; i++)
for (j=0; j<stuNum-1-i; j++)
if (stu[j]totalScore < stu[j+1]totalScore) {
temp = stu[j];
stu[j] = stu[j+1];
stu[j+1] = temp;
}
/录入名次/
for (i=0; i<stuNum; i++)
stu[i]ranking = i+1;
return 1;
}
/输入命令编号/
int getCommand (void) {
int key; /命令编号/
printf("请输入命令编号以开启 *** 作:");
scanf ("%d",&key);
return key;
}
/打印菜单文本/
status printMeunText (void) {
puts ("======================================================");
puts ("学生信息管理");
puts ("------------------------------------------------------");
printf ("%4c\t功能详情\n",'#');
puts ("------------------------------------------------------");
printf ("%4d\t输入学生信息\n",1);
printf ("%4d\t按成绩由高到低排序\n",2);
printf ("%4d\t退出\n",7);
puts ("======================================================");
putchar ('\n');
return 1;
}
status runMeun (student stu[], int stuNum, int subNum) {
int key;
do {
system("cls"); /清屏/
printMeunText (); /打印菜单文本/
key = getCommand (); /输入命令编号/
putchar('\n');
switch (key) {
case 1: system("cls"); inputAllStuInfo (stu, &stuNum, subNum); calcAllStuInfo (stu, stuNum, subNum); break;
case 2: system("cls"); descSort (stu, stuNum, subNum); printAllStuInfo (stu, stuNum, subNum, 1); break;
case 7: puts("程序结束!\n"); break;
default:puts("输入错误,请重新输入!\n\n\n按任意键继续"); getch (); break;
}
} while (key!=7);
getch ();
return 1;
}
运行结果
主菜单
录入学生信息
排名次并输出
以上就是关于c语言中排名问题全部的内容,包括:c语言中排名问题、、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)