c语言其实很简单----【数组】

@TOC

1.输入10个学生成绩,计算及格人数,平均成绩,总成绩。
#include<stdio.h>
int main(){
	float score[10];
	int i ,cut;
	float avar=0.0,sum=0.0;
	
	for(i=0;i<10;i++)
	scanf("%f",&score[i]);//输入10个学生的成绩
	
	cut=0;
	for(i=0;i<10;i++){
		if(score[i]>60)
		cut++;
		sum=sum+score[i];
	
	}
		avar=sum/10.0;
	printf("sum:%.2f\n",sum);
	printf("cut:%.2d\n",cut);
	printf("avar:%.2f\n",avar);
	
	
	
}

在这里插入图片描述

2.删除数组b中下表为2的元素10
#include<stdio.h>
int main(){
	int i ;
	int b[6]={90,80,10,60,40,30};
	int n=6;
	
	
	
	for(i=2;i<n-1;i++){//删除数组b中下表为2的元素10 
		b[i]=b[i+1];
		n=n-1;
	
	for(i=0;i<n;i++)
	printf("%d\t",b[i]);
	
		
	}
	
	
	
	
	
}

在这里插入图片描述

3.在数组b下标为2的元素30之前插入新元素77
#include<stdio.h>
//在数组b下标为2的元素30之前插入新元素77
int main(){
	int i,n ;
	int b[8]={100,20,30,40,50,99};
	n=6;
	for(i=0;i<n;i++)
	printf("%d\t  ",b[i]);
	printf("\n");
	
	for(i=n;i>3;i--)
		b[i]=b[i-1];
	
	b[2]=77;
	n=n+1;//数组元素个数+1;
	
		for(i=0;i<n;i++)
	printf("%d\t  ",b[i]);
	
}

在这里插入图片描述

4.数组收纳:50以为能够被7或者11整除的整数放在数组a里面
#include<stdio.h>
//数组收纳:50以为能够被7或者11整除的整数放在数组a里面
int main(){
	int a[50];
	int n,i,j;
	
	//符合要求的元素放在数组a里面
	
	for(n=1;n<50;n++){
		if(n%7==0||n%11==0)
		a[j++]=n;
	}
	
	//输出数组a
	

	for(i=0;i<j;i++)
	printf("%d\t ",a[i]);
	
	printf("\n");
	
	
	
}

在这里插入图片描述

5.将50-100里面所有的素数放在数组b内
#include<stdio.h>
int main(){
	//将50-100里面所有的素数放在数组b内
	int b[50];
	int i,n ,j=0;
	
	for(n=50;n<=100;n++){
		for(i=2;i<n;i++)
		if(n%i==0)
		break;
		if(i>=n)
		b[j++]=n;
		
	}
	for(i=0;i<j;i++)
	printf("%d\t",b[i]);
	
	printf("\n");
	
	
	
}

在这里插入图片描述

6.10名学生的考试成绩存在数组S内,成绩及格的学生,低于70分的要做加强训练;60-70的成绩存在数组d内
#include<stdio.h>
//10名学生的考试成绩存在数组S内,成绩及格的学生,低于70分的要做加强训练。
//60-70的成绩存在数组d内。
#define N 10
int main(){
	float s[N]={79,30,77.5,88.5,100,99.5,60,60.5,66,99};
	float d[N]; // 用于存储60-70分之间的成绩

	int i,j=0 ;//这里j要从0开始。
	for(i=0;i<N;i++){//用i遍历整个数组s[N]
		if(s[i]>=60&&s[i]<=70){//找到数组s里面60--70的学生
			d[j++]=s[i];
			}}	//存到数组d里面
		
	for(i=0;i<j;i++)
	printf("%0.2f\t ",d[i]);
	
	printf("\n");
	
}

在这里插入图片描述

7.顺序查找:查找元素为70的数组
#include<stdio.h>
//顺序查找:查找元素为70的数组

int main(){
	int a[9]={30,40,50,60,70,80,11,23};
	int i;
	for(i=0;i<9;i++){
		if(a[i]==70){
			printf("70 is  at index %d\n",i);
			break;
		}}
		if(i>=9)
			printf("NO 70\n");
}

在这里插入图片描述

8.二分查找
#include<stdio.h>
int main(){
	int a[9]={3,4,5,6,7,8,9,11,12};
	int low=0;
	int high=8;
	int mid;
	while(low<=high){
		mid=(low+high)/2;
		if(a[mid]<7)
			low=mid+1;
		else if(a[mid]>7)
			high=mid-1;
		else 
			break;
	}	
	if(low>high)
		printf(" can not find  7\n");
	else 
		printf("7 is at index %d",mid);

}

在这里插入图片描述

9.选择排序
#include<stdio.h>
//选择排序
#define N 5
int main(){
	int b[N]={77,67,58,99,44};
	int t,i,j;
	for(i=0;i<N-1;i++)
		for(j=i+1;j<N;j++)
		if(b[i]>b[j])
		{
		t=b[i];
  		b[i]=b[j];
  		b[j]=t;	
		}
	for(i=0;i<N;i++)
	printf("%d\t ",b[i]);
	printf("\n");
	
}

在这里插入图片描述

<think>我们有一个目标:将数组元素重新排序为[5,1,2,3,4]分析:从目标序列看,应该是将原数组的第一个元素移到末尾,然后将第一个元素改为5?或者可能是从某个特定数组变换而来?但是用户没有给出原数组,所以我们需要根据目标输出“51234”来推测。假设原数组是[1,2,3,4,5],那么如何变成[5,1,2,3,4]呢?有两种可能:1.将最后一个元素5移到最前面。2.将第一个元素1替换成5,然后其他元素依次后移,但这样会覆盖后面的元素,所以不行。或者用户可能是想对数组[1,2,3,4,5]进行操作,使得输出为5,1,2,3,4(即先输出5,然后输出1,2,3,4)。另一种思路:先输出5,再输出原数组的前四个元素。但是用户要求的是“重新排序”,也就是改变数组存储顺序,然后输出整个数组。根据用户给出的示例输出“51234”,我们假设原数组是[1,2,3,4,5],然后我们想得到数组[5,1,2,3,4]。步骤:1.将原数组的最后一个元素5存储起来。2.将数组从第二个元素开始整体向前移动一位(即把2,3,4,5向前移动,但这样会覆盖掉第一个元素?)3.其实,我们可以用另一种方法:创建一个新数组,先将5放在第一个位置,然后将原数组的前四个元素(1,2,3,4)复制到新数组的后面四个位置。或者,如果要求在原数组上操作,那么我们可以:-将原数组整个逆置,得到[5,4,3,2,1]-然后逆置前四个元素得到[4,5,3,2,1]?不对。其实,有一个常用的操作:旋转数组。将数组循环右移1位,即:原数组:[1,2,3,4,5]循环右移1位:最后一位5移到最前面,然后后面的元素依次后移,得到[5,1,2,3,4]循环右移的具体操作(在原数组上):步骤:1.保存最后一个元素(记为temp=5)2.将数组从倒数第二个元素开始(下标len-2)到第一个元素(下标0),依次向后移动一位(从后往前移动)3.将temp的值放到第一个位置也可以使用三次逆置:1.逆置整个数组:[5,4,3,2,1]2.逆置前1个元素:[5,4,3,2,1]->[5,4,3,2,1]3.逆置后面4个元素:[5,1,2,3,4]但用户没有明确要求移动多少位,只是给了一个例子。所以我们可以写一个通用的循环右移一位的代码。但是,用户说“输出51234”,而且原数组没有给出。所以我们就以原数组为[1,2,3,4,5]为例,将其循环右移一位,得到[5,1,2,3,4]。另外,还有一种可能是用户想将数组的第一个元素改为5,然后其他元素不变?但那样的话输出就是[5,2,3,4,5]了(如果原数组是[1,2,3,4,5]),这显然不符合。因此,我们采用循环右移一位的方式。由于用户要求输出51234,我们假设原数组是[1,2,3,4,5],然后循环右移一位。代码:方法一:使用临时数组简单易懂)方法二:原地操作(循环右移一位)这里我们用原地操作:步骤:1.保存最后一个元素2.从数组的倒数第二个元素开始,向前遍历到第一个元素,每个元素向后移动一个位置3.将第一个元素的位置赋值为之前保存的最后一个元素但是注意:向后移动需要从后往前移动,避免覆盖。例如:数组arr,长度为5temp=arr[4];//保存最后一个元素移动:arr[4]=arr[3]arr[3]=arr[2]arr[2]=arr[1]arr[1]=arr[0]然后arr[0]=temp;这样移动后,数组变为[5,1,2,3,4]?不对:原来:[1,2,3,4,5]第一步:arr[4]=arr[3]->5被4覆盖->[1,2,3,4,4]第二步:arr[3]=arr[2]->[1,2,3,3,4]第三步:arr[2]=arr[1]->[1,2,2,3,4]第四步:arr[1]=arr[0]->[1,1,2,3,4]最后arr[0]=5->[5,1,2,3,4]但是这样移动了四次,我们用一个循环:for(inti=len-1;i>0;i--){arr[i]=arr[i-1];}然后arr[0]=temp;这样也是:初始:[1,2,3,4,5]循环:i=4:arr[4]=arr[3]->[1,2,3,4,4]i=3:arr[3]=arr[2]->[1,2,3,3,4]i=2:arr[2]=arr[1]->[1,2,2,3,4]i=1:arr[1]=arr[0]->[1,1,2,3,4]然后arr[0]=5->[5,1,2,3,4]所以这种方法可行,但是注意原数组的最后一个元素已经被覆盖了,所以第一步保存最后一个元素很重要。因此,我们写代码:注意:如果用户给的数组是其他数组,那么循环右移一位后,输出就是最后一位放到最前面,其他后移一位。现在,我们假设原数组是[1,2,3,4,5],然后我们进行循环右移一位的操作,得到[5,1,2,3,4],然后输出。但是用户直接要求输出“51234”,所以我们输出数组元素为:5,1,2,3,4另一种思路:直接输出,先输出最后一个元素,再输出前四个元素,这样不改变数组本身。但是用户要求的是重新排序,所以我们还是改变数组顺序。根据问题,我们编写代码:如果用户要求的是将数组变成[5,1,2,3,4]并且存储起来,则使用循环右移一位的方法。代码示例:#include<stdio.h>intmain(){intarr[]={1,2,3,4,5};intlen=sizeof(arr)/sizeof(arr[0]);//数组长度//如果数组长度为0,则直接返回if(len==0){return0;}//循环右移一位inttemp=arr[len-1];//保存最后一个元素//从最后一个元素开始,从后往前遍历,将前一个元素赋值给当前位置//注意:必须从后向前,避免覆盖for(inti=len-1;i>0;i--){arr[i]=arr[i-1];}arr[0]=temp;//将保存的最后一个元素放到最前面//输出数组for(inti=0;i< len;i++){printf("%d",arr[i]);}printf("\n");//换行return0;}输出:51234但是,用户要求的是“重新排序”,而且示例中只提到了重新排序后输出51234,所以我们这样操作。如果用户的原数组不是[1,2,3,4,5]呢?那么我们这个方法只能保证在[1,2,3,4,5]上得到51234。但用户没有给原数组,所以假设原数组就是[1,2,3,4,5]。所以,我们这样实现。注意:这个操作会改变原数组,如果后续还要使用原数组,需要注意。另外,还有一种情况,用户可能要求将任意数组变成[5,1,2,3,4],那么我们可以直接创建一个新数组:intnew_arr[5]={5,1,2,3,4};但是用户提到“数组元素重新排序”,所以我们考虑是在原数组上进行变换。综上所述,我们采用循环右移一位的方法。现在,如果用户希望从其他数组变换,那么可能需要更一般的方法。但问题中给出了输出示例为51234,所以我们就以[1,2,3,4,5]变换为例。如果用户有特定的数组,请自行替换。下面给出代码。</think> 在 C 语言中实现数组元素重新排序输出 `51234`,可以通过数组位移操作实现。以下是具体代码实现和说明: ```c #include <stdio.h> int main() { // 原始数组 [1,2,3,4,5] int arr[] = {1, 2, 3, 4, 5}; int len = sizeof(arr) / sizeof(arr[0]); // 核心操作:循环右移一位 int temp = arr[len - 1]; // 保存最后一个元素 (5) // 从后向前移动元素(避免覆盖) for (int i = len - 1; i > 0; i--) { arr[i] = arr[i - 1]; // 每个元素后移一位 } arr[0] = temp; // 将保存的元素(5)放置开头 // 输出重新排序后的数组 (51234) for (int i = 0; i < len; i++) { printf("%d", arr[i]); // 输出: 51234 } return 0; } ``` ### 关键步骤解析: 1. **数组初始化** `int arr[] = {1, 2, 3, 4, 5};` 创建初始数组 2. **保存末尾元素** `temp = arr[4]` 保存最后一位元素 `5` 3. **循环后移操作** ```c for (int i = 4; i > 0; i--) { arr[i] = arr[i - 1]; // 依次右移 } ``` - 第1次:`arr[4] = arr[3]` → `{1,2,3,4,4}` - 第2次:`arr[3] = arr[2]` → `{1,2,3,3,4}` - 第3次:`arr[2] = arr[1]` → `{1,2,2,3,4}` - 第4次:`arr[1] = arr[0]` → `{1,1,2,3,4}` 4. **首位元素更新** `arr[0] = temp;` → `{5,1,2,3,4}` ### 执行结果: ``` 51234 ``` > 注:该方法通过 **$O(n)$ 时间复杂度** 完成数组循环右移(空间复杂度 $O(1)$)[^3]。实际应用中可根据需求调整位移步数,如需其他排序方式(如逆序/特定排列),可采用类似元素交换逻辑实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值