c语言中排名问题

c语言中排名问题,第1张

#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语言中排名问题、、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9736698.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存