结构体 ---找最大//排序从小到大---区别--期末测试

一开始写错了,

因为这个再定义一个和原函数一样类型的进行存储, 

然后将第一个设置为最大的,依次用循环比较后面的,

最后输出

但是这个适用于找最大的、字符串这样最后只输出一个最大项比较好

对于结构体不好将比较的这个数所带的一系列的对应的数据一起输出

这个是小杜写的找最长字符串的题

找最长或者最短字符串

#include <stdio.h>
#include <string.h>
int main()
{
    int n;
    char p[81],max[81];
    scanf("%d",&n);
    scanf("%s",p);
    strcpy(max,p);
    for(int i=1; i<n; i++)
    {
        scanf("%s",p);
        if(strlen(p)>strlen(max))
            strcpy(max,p);
    }
    printf("The longest is: %s",max);
    return 0;
}

这个是我一开始按这个思路写错的,是答案错误,编译没有错误

#include<stdio.h>
#include<string.h>
struct information{
	char data[11];
	char category[31];
	double money;
	
};


int main()
{
	
	int n;
	scanf("%d",&n);
	
	struct information inform[n],min;
	
	int i;
	scanf("%s %s %ld",inform[0].data,inform[0].category,&inform[0].money);
	
	strcpy(min.data,inform[0].data);
	for(i=1;i<n;i++)
	{
		scanf("%s %s %lf",inform[i].data,inform[i].category,&inform[i].money);
		if(strcmp(inform[i].data,min.data)<0)
		strcpy(min.data,inform[i].data);
	}
	
	for(i=0;i<n;i++)
	{
		printf("%s %s %.2f",min.data,min.category,min.money);
	}
		
	
	return 0;
 } 

这个是我想到比较题型中如果要输出的不只是最大的,而是输出从小到大的问的AI

自己也有不会的地方

冒泡排序适合用到比较重输出从小到大或者从大到小的排序

#include<stdio.h>
#include<string.h>
struct information{
	char data[11];
	char category[31];
	double money;
	
};


int main()
 {
 	int n;
 	scanf("%d",&n);
 	
 	struct information inform[n];
 	
 	int i;
 	for(i=0;i<n;i++)
 	{
 		scanf("%s %s %lf",inform[i].data,inform[i].category,&inform[i].money);
 		
	}
	
	
	for(int i=0;i<n-1;i++)
	{
		for(int j=0;j<n-i-1;j++)
		{
			if(strcmp(inform[j].data,inform[j+1].data)>0)
			{
				struct information temp=inform[j];
			    inform[j]=inform[j+1];
			    inform[j+1]=temp;
			}
			 
		}
	}	
	
	
	
	for(int i=0;i<n;i++)
	{
		printf("%s %s %.2f\n",inform[i].data,inform[i].category,inform[i].money);
	}
	
 	return 0;
 }

注意的点

1.冒泡排序的循环记住          i < n-1;j < n - i - 1     

2.struct information temp = inform [  j  ];

inform[ j ] = inform [ j+1 ] ;

inform [ j + 1 ]  = temp;

改的是整体的 inform【j】-----因为最后输出的就是inform【j】的所有对应的数据

找出平均成绩最高的学生

#include <stdio.h>
struct student{
	char num[6];
	char name[11];
	int a,b,c;
};
int main()
{
    int n;
    scanf("%d",&n);
    struct student stu[n];
    
    int i;
    for(i=0;i<n;i++)
    {
    	scanf("%s%s%d%d%d",stu[i].num,stu[i].name,&stu[i].a,&stu[i].b,&stu[i].c);
	}
	
	
	int max=0;
	for(i=1;i<n;i++)
	{
		if(stu[i].a+stu[i].b+stu[i].c>stu[max].a+stu[max].b+stu[max].c)
		max=i;
	}
	
	printf("%s %s %d",stu[max].name,stu[max].num,stu[max].a+stu[max].b+stu[max].c);
	return 0;
}

找出总分最高的学生

#include <stdio.h>
struct student{
	char num[6];
	char name[11];
	int a;
	int b;
	int c;

};
int main()
{
	int n;
	scanf("%d",&n);
	struct student stu[n];
	
	int i;
	for(i=0;i<n;i++)
	{
		scanf("%s %s %d %d %d",stu[i].num,stu[i].name,&stu[i].a,&stu[i].b,&stu[i].c);
		int sum=stu[i].a+stu[i].b+stu[i].c;
	}
	
	
	int sum[n];
	for(i=0;i<n;i++)
	{
		sum[i]=stu[i].a+stu[i].b+stu[i].c;
	}
	
	int max=sum[0];
	int j;
	for(i=1;i<n;i++)
	{
		if(sum[i]>max)
		{
			max=sum[i];
			j=i;
		}
	
	}
	
	printf("%s %s %d",stu[j].name,stu[j].num,max);
	
}

这个代码的一个优点:

用 j 存储了 i,也就是存储了最大的下标,然后输出的时候就不用纠结其他的,直接输出stu[ j ].num即可 

对于这样的时候,一定要想到可以用新的变量去存储一个不能改变初始值的变量!!!!

遇到的问题:

想要比较完总数后不只能输出最高的总数,还想输出总数最高所对应的学生信息

max能不能写成 struct student max[ n ]

或者说

int sum写到struct student{  }的括号里

这几种形式有什么区别? 

AI好棒好棒,一解释就懂啦!!!

sum字段添加到struct student并将max变量替换为结构体数组中的元素,代码可以这样修改:

这种方式下,sum已经作为struct student的一个成员存在。这使得我们可以直接访问每个学生的信息以及他们的总分数,而不需要额外的数组来跟踪这些信息。

也就是说,不用写下面这个代码

   int sum[n];
    for(i=0;i<n;i++)
    {
        sum[i]=stu[i].a+stu[i].b+stu[i].c;
    }

====等价于=====

stu[ i ].sum

#include <stdio.h>

struct student{
	char num[6];
	char name[11];
	int a;
	int b;
	int c;
	int sum; // 添加sum作为成员变量
};

int main()
{
	int n;
	scanf("%d",&n);
	struct student stu[n];
	
	int i;
	for(i=0;i<n;i++)
	{
		scanf("%s %s %d %d %d",stu[i].num,stu[i].name,&stu[i].a,&stu[i].b,&stu[i].c);
		stu[i].sum = stu[i].a + stu[i].b + stu[i].c; // 计算每个学生的总和并存储在结构体中
	}
	
	// 寻找最大值及其位置
	int max_sum = stu[0].sum;
	int j = 0;
	for(i=1;i<n;i++)
	{
		if(stu[i].sum > max_sum)
		{
			max_sum = stu[i].sum;
			j = i;
		}
	}
	
	printf("%s %s %d",stu[j].name,stu[j].num,max_sum);

	return 0;
}

对于将max定义的时候写成struct max[n],比较大小的时候不太方便

max[n]中包含了各种类型的变量

不知道该用strcmp还是用 < 小于    > 大于 直接比较,会比较麻烦

总结

至于使用struct student max[n];这种方式,它并不适合本题目的需求,因为在这里max应该是一个标量用来记录最大的总分数,而不是一个结构体数组。而且我们更关心的是找到具有最大总成绩的学生,而非创建一个叫做“max”的结构体数组。如果结构体里都是学生的成绩这种一个类型的,需要找最大最小或者排序的时候可以用这种方法

总结一下两者的主要区别:

  1. sum作为一个结构体成员:便于管理和查询每个个体的所有相关信息。
  2. 使用max或等价的名称作为标量变量:用于追踪计算过程中遇到的最大值,通常不将其用作结构体数组的名称。

struct student min [n];

struct student min;

而用struct student max 也可以写

#include <stdio.h>
struct student{
	char num[6];
	char name[11];
	int a;
	int b;
	int c;
	int sum;

};
int main()
{
	int n;
	scanf("%d",&n);
	struct student stu[n];
	struct student max{" "," ",0,0,0,-1};
	
	int i;
	for(i=0;i<n;i++)
	{
		scanf("%s %s %d %d %d",stu[i].num,stu[i].name,&stu[i].a,&stu[i].b,&stu[i].c);
		stu[i].sum=stu[i].a+stu[i].b+stu[i].c;
	}
	
	

	max.sum=stu[0].sum;
	int j;
	for(i=1;i<n;i++)
	{
		if(stu[i].sum>max.sum)
		{
			max=stu[i];
		}
	
	}
	
	printf("%s %s %d",max.name,max.num,max.sum);
	
}

对于开始定义struct  student  stu[n],max;

初始化struct student max={" "," ",0,0,0,-1},就是初始化开始的最大学生都是空,字符串的空就是" ",分数的空就是0总分的空要写一个总分不可能出现的情况,以免后续排序的时候混淆,-1是总分中不可能出现的数字,所以初始化为-1

AI的解释:

在这个版本的实现中,我们初始化了一个额外的字段totalstudent结构体里以直接存储每个学生的总分。然后我们在数组之外声明了另一个student类型的变量max,并将其total字段初始化为一个不可能出现的成绩(例如 -1),以便之后进行比较。

每次循环时,我们都计算当前学生的总分,并检查它是否超过了max的总分。如果是,则我们将当前学生的信息整体赋给max,由于C语言允许对结构体类型进行直接赋值,这里直接用 max = stu[i]; 将整个学生信息复制给了max

这种方法的好处是简化了寻找最大值的过程,不需要再维护一个额外的索引和整型数组来记录所有人的总分数。但是缺点是它只保存最新找到的最大值,对于需要返回多个高分学生或统计更多细节的情况,可能就需要更复杂的数据结构或者处理逻辑了。而且,如果学生之间有平分的情况,这种方式只能保留最后一个达到该最高分的学生数据。

而使用struct student max[n]的方式则意味着你创建了一个包含n个元素的student结构体数组max。但通常来说,在这种场景下定义为单个结构体实例作为“最大值”容器会更加合理一些。

期末测试计科二班关于结构体输出总分最高以及每门课最高成绩

吕   考试搜的:(PTA通过):

#include<stdio.h>
struct ss{
	int c,m,e,z;
};
int main()
{
	struct ss stu[100],max;
	int n,i;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%d %d %d",&stu[i].c,&stu[i].m,&stu[i].e);
		stu[i].z=stu[i].c+stu[i].m+stu[i].e;
	}
	max=stu[0];
	for(i=0;i<n;i++){
		if(stu[i].c>max.c){
			max.c=stu[i].c;
		}
		if(stu[i].m>max.m){
			max.m=stu[i].m;
		}
		if(stu[i].e>max.e){
			max.e=stu[i].e;
		}
		if(stu[i].z>max.z){
			max.z=stu[i].z;
		}
	}
	printf("%d %d %d %d",max.z,max.c,max.m,max.e);
	return 0;
}

自己写的:(dev运行不报错且案例实现正确,但是PTA能不能通过未知) 

#include <stdio.h>
struct student{
	int a,b,c;
	int sum;
	
};
int main()
{
	int n;
	scanf("%d",&n);
	struct student stu[n];
	
	int i;
	int sum1=0,sum2=0,sum3=0;
	for(i=0;i<n;i++)
	{
		scanf("%d %d %d",&stu[i].a,&stu[i].b,&stu[i].c);
		stu[i].sum=stu[i].a+stu[i].b+stu[i].c;	
	}
	
	int maxsum=stu[0].sum;
	for(i=1;i<n;i++)
	{
		if(stu[i].sum>maxsum)
		{
			maxsum=stu[i].sum;
		}
	}
	
	int max_a=stu[0].a;
	for(i=1;i<n;i++)
	{
		if(stu[i].a>max_a)
		{
			max_a=stu[i].a;
		}
	}
	
	int max_b=stu[0].b;
	for(i=1;i<n;i++)
	{
		if(stu[i].b>max_b)
		{
			max_b=stu[i].b;
		}
	}
	
	int max_c=stu[0].c;
	for(i=1;i<n;i++)
	{
		if(stu[i].c>max_c)
		{
			max_c=stu[i].c;
		}
	}
	
	printf("%d %d %d %d",maxsum,max_a,max_b,max_c);
	
	
	return 0;
}

总结:

这道题结合了上面所说的两种方式:

第一、找三门课的总成绩最高 :

最好把 sum 定义到结构体里面>>>>>>>> 

理由是:还需要多写一步 int sum [ n ] 

而下面这个在输入的循环中就可以把三门课总成绩直接加起来了

很重要!!!!

>>>>>>>>需要注意的是要用  j 这个新下标 来存储最大下标,否则无法正确输出

例如:

没有存储最大总分所对应的学生的最大下标 

用了 j = i ;存储

第二、找每一门成绩最高

不用在结构体里定义

主函数中另外定义和成绩一样类型的变量就行

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

之前的一些总结,和上面的意思差不多,可做参考

找出总分最高的同学信息

存在的问题:sum,average,max这些变量到底在什么时候去定义,定义完后分别该怎么用?

 有一个最简单的办法,就是代码写的长,但是不用担心这样的问题

#include <stdio.h>
struct student{
	char num[6];
	char name[11];
	int a,b,c;
};
int main()
{
    int n;
    scanf("%d",&n);
    struct student stu[n];
    
    int i;
    for(i=0;i<n;i++)
    {
    	scanf("%s%s%d%d%d",stu[i].num,stu[i].name,&stu[i].a,&stu[i].b,&stu[i].c);
	}
	
	
	int max=0;
	for(i=1;i<n;i++)
	{
		if(stu[i].a+stu[i].b+stu[i].c>stu[max].a+stu[max].b+stu[max].c)
		max=i;
	}
	
	printf("%s %s %d",stu[max].name,stu[max].num,stu[max].a+stu[max].b+stu[max].c);
	return 0;
}

经过修改实验

sum最好定义到结构体里面,后面才可以用stu[i].sum

max最好直接int max=0;

下面的循环从1开始

更改以后的简便一点的 

  相应代码:

#include <stdio.h>
struct student{
	char num[6];
	char name[11];
	int a,b,c;
	int sum;
};
int main()
{
    int n;
    scanf("%d",&n);
    struct student stu[n];
    
    int i;
    for(i=0;i<n;i++)
    {
    	scanf("%s%s%d%d%d",stu[i].num,stu[i].name,&stu[i].a,&stu[i].b,&stu[i].c);
	}
	
	
	int max=0;
	for(i=1;i<n;i++)
	{
		stu[i].sum=stu[i].a+stu[i].b+stu[i].c;
		if(stu[i].sum>stu[max].sum)
		max=i;
	}
	
	printf("%s %s %d",stu[max].name,stu[max].num,stu[max].sum);
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值