C语言成绩排名次。

Python030

C语言成绩排名次。,第1张

此题有最大人数限制,所以可用数组实现。创建一个结构体类型,成员包括学号、题设各科成绩、总分和平均分。在主函数中声明一个30个此结构体元素的数组,然后输入数据,再进制排序、输出和查找。参考代码如下:

#include <stdio.h>

typedef struct stu{//创建结构类型

    int MT,EN,PH,TO,ID

    double AV

}STU

int main(void){

    STU s[30],t

    int i,j,k,n

    printf("Please enter the student's scores(<0 end):\n")

    printf("\n STUID MA  EN  PH\n------------------\n")

    n=0,j=10000

    while(1){//输入数据

        printf(" %d ",s[n].ID=j++)

        if(scanf("%d",&s[n].MT),s[n].MT<0)

            break

        scanf("%d%d",&s[n].EN,&s[n].PH)

        s[n].TO=s[n].EN+s[n].MT+s[n].PH

        s[n++].AV=s[n].TO/3.0

    }

    printf("\n STUID MATH ENGL PHYS TOTA AVER\n")

    printf("---------------------------------\n")

    for(i=0i<ni++){//排序

        for(k=i,j=k+1j<nj++)

            if(s[k].TO<s[j].TO)

                k=j

        if(k-i)

            t=s[k],s[k]=s[i],s[i]=t

        printf("%6d%4d%5d%5d%5d%7.2f\n",s[i].ID,s[i].MT,s[i].EN,s[i].PH,s[i].TO,s[i].AV)//输出表格

    }

    printf("Please enter ID(%d~%d)...\n",10000,9999+n)//查询

    scanf("%d",&k)

    for(i=0i<ni++)

        if(s[i].ID==k){

            printf("\n STUID MATH ENGL PHYS TOTA AVER\n")

            printf("---------------------------------\n")

            printf("%6d%4d%5d%5d%5d%7.2f\n",s[i].ID,s[i].MT,s[i].EN,s[i].PH,s[i].TO,s[i].AV)

        break

    }

    if(i>=n)

        printf("No %d...\n",k)

    return 0

}

运行结果如图:

#include<stdio.h>

int main()

{int n,i,j,a[100][2]

 scanf("%d",&n)

 for(i=0i<ni++)

   scanf("%d",&a[i][0])

 for(i=0i<ni++)

   {a[i][1]=1

    for(j=0j<nj++)

   a[i][1]+=a[j][0]>a[i][0]

   }

 for(i=0i<ni++)

   printf("%d %d\n",a[i][0],a[i][1])

 return 0

}

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#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

}

运行结果

主菜单

录入学生信息

排名次并输出