《数据结构实验》第一章实验

 

设计一个程序,统计一个班(最多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;
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值