设计一个程序,统计一个班(最多50人)的学生成绩,要求能实现如下四个功能:
(1) 由键盘或文件输入每个学生的学号和四门课程的成绩;
(2) 计算每个学生的平均成绩和总成绩;
(3) 按总成绩从高到低排名,并按名次输出每个学生的情况,包括:
学号,各科成绩,平均成绩,总成绩,排名
(4) 由键盘输入课程号,输出该课程成绩在90分(含90分)以上且总分在前3名的学生情况,要求能多次查询。(请采用结构体数据类型,并采用模块化结构实现)
实现代码如下
#include <stdio.h>
#include <stdlib.h>
struct student{
char id[10];
float sub_1;
float sub_2;
float sub_3;
float sub_4;
float sum;
float aver;
int order;
};
//函数原型
void order_stu(struct student stu[],int sum_stu);
void aver_stu(struct student *pt_1);
int main()
{
int sum_stu;//学生的人数
printf("请输入学生人数(最多50人):");
scanf("%d",&sum_stu);
while(sum_stu>50)
{
printf("最多输入50个学生!请重新输入\n");
scanf("%d",&sum_stu);
}
getchar();
struct student stu[sum_stu];
//从键盘读取学生学号和四门课的成绩
int i,j;
for(i=0;i<sum_stu;i++)
{
printf("请分别输入第%d名学生的学号、四门课的成绩,以空格隔开:",i+1);
scanf("%s %f %f %f %f",&stu[i].id,&stu[i].sub_1,&stu[i].sub_2,&stu[i].sub_3,&stu[i].sub_4);
getchar();
aver_stu(&stu[i]);
}
order_stu(stu,sum_stu);
//输入课程号获取学生信息
int class_num,class_score;
int count=0;//计数器,记录符合条件的人数
printf("请输入课程号(1-4),若您想结束程序,请按输入非数字字符:");
while((scanf("%d",&class_num))!=0)
{
if(class_num>=5)
{
printf("输入非法!请重新输入:\n");
continue;
}
for(i=0;i<sum_stu;i++)
{
switch(class_num)
{
case 1:class_score=stu[i].sub_1;break;
case 2:class_score=stu[i].sub_2;break;
case 3:class_score=stu[i].sub_3;break;
case 4:class_score=stu[i].sub_4;break;
default:break;
}
if(class_score>=90&&stu[i].order<=3)
{
printf("%s %5f %5f %5f %5f %7f %5d\n",stu[i].id,stu[i].sub_1,stu[i].sub_2,stu[i].sub_3,stu[i].sub_4,stu[i].aver,i+1);
count++;
}
}
if(count==0)
printf("对不起,没有找到符合条件的学生\n");
printf("请输入课程号(1-4),若您想结束程序,请按输入非数字字符:");
};
}
//计算总分和平均值
//利用指针,目的在于在本函数内为结构体内的aver和sum赋值,即改变结构体的内容
void aver_stu(struct student *pt_1)
{
pt_1->sum=pt_1->sub_1+pt_1->sub_2+pt_1->sub_3+pt_1->sub_4;
pt_1->aver=(pt_1->sum)/4;
}
//排名次
void order_stu(struct student stu[],int sum_stu)
{
float sum_score;//总分
float aver;
int i,j;
struct student *p[sum_stu];//定义一个指针数组
//struct student *ord[sum_stu];
//使每个指针指向一个结构体数组元素
for(i=0;i<sum_stu;i++)
{
p[i]=&stu[i];
//ord[i]=&stu[i].order;
}
struct student *temp;
//用冒泡排序法排序(从大到小)
for(i=0;i<sum_stu-1;i++)
{//遍历sum_stu-1轮
for(j=0;j<sum_stu-i-1;j++)
{//每过一轮,遍历的元素数目-1
if((p[j]->sum)<(p[j+1]->sum))
{
temp=p[j+1];//交换两结构体在结构体数组中的位置
p[j+1]=p[j];
p[j]=temp;
}
}
}
//将结果通过列表的方式打印在屏幕上
printf("id sub_1 sub_2 sub_3 sub_4 average order\n");
for(i=0;i<sum_stu;i++)
{
printf("%s %5f %5f %5f %5f %7f %5d\n",p[i]->id,p[i]->sub_1,p[i]->sub_2,p[i]->sub_3,p[i]->sub_4,p[i]->aver,i+1);
stu[i].order=i+1;
}
}
每个城市信息由城市名(字符串)和位置坐标组成(x,y)。设计实现一程序,完成如下功能:
(1)从键盘或文件输入各城市信息
(2)按城市名字非递减排序后输出
(3)输入某个位置信息,查询该位置的城市名称,要求能多次查询。
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20
typedef char ElemType;
struct info
{
ElemType name[MAXSIZE];
int x;
int y;
};
int main()
{
struct info city[MAXSIZE];
//从键盘输入信息
int i=0,count=0;
printf("请输入城市名和位置坐标x,y,以空格键隔开(输入“q 0 0”以结束):");
while((scanf("%s %d %d",city[i].name,&city[i].x,&city[i].y)!=0))
{
if(i>=MAXSIZE)
{
printf("超出最大输入个数!");
break;
}
if(strcmp(city[i].name,"q")==0)
break;
i++;
count++;
printf("请输入城市名和位置坐标x,y,以空格键隔开:");
}
//排序
int m,n;
struct info temp;
for(m=0;m<count-1;m++)
{
for(n=0;n<count-m-1;n++)
{
if(strcmp(city[n].name,city[n+1])>0)
{
temp=city[n];
city[n]=city[n+1];
city[n+1]=temp;
}
}
}
//按非递减顺序输出
for(i=0;i<count;i++)
{
printf("%s %d %d \n",city[i].name,city[i].x,city[i].y);
}
//查询
int x,y;
printf("请输入您要查找的位置坐标x,y,之间以空格隔开,以“q q”结束操作:");
while(scanf("%d %d",&x,&y)!=0)
{
for(i=0;i<count;i++)
{
if(x==city[i].x&&y==city[i].y)
{
printf("\n您要查找的城市为 %s ",city[i].name);
printf("请输入您要查找的位置坐标x,y,之间以空格隔开,以“q q”结束操作:");
break;
}
else if(i==count-1)
{
printf("\n未找到匹配的城市!\n请重新输入:");
}
}
}
printf("\n感谢您的使用,再见!");
return 0;
}