此题有最大人数限制,所以可用数组实现。创建一个结构体类型,成员包括学号、题设各科成绩、总分和平均分。在主函数中声明一个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
}
运行结果
主菜单
录入学生信息
排名次并输出