GDPU C语言 天码行空6 数组

🍑 C语言实验专栏 (代码可免登录复制)


1. 数组顺序查找

在这里插入图片描述
⭐ 语法题

#include<stdio.h>

int main()
{
	int n,x,i;
	int a[102];
	scanf("%d", &n);
	
	for (i = 0; i < n; i++){
		scanf("%d", &a[i]);
	}
	scanf("%d", &x);
	int idx = -1;//记录x的最大下标
	int max = 0;// 记录大于x的数
	int min = 0;// 记录小于x的数

	for (i = 0; i < n; i++)//从前往后遍历数组
	{
		int t = a[i];
		if (t == x)
			idx = i;
		if (t > x)
			max++;
		if (t < x)
			min++;
	}
	printf("%d\n%d\n%d\n", idx, max, min);
	return 0;
}

2. 数组指定位置插入和删除

在这里插入图片描述
⭐ 细节输出(注意数组有效元素个数)

#include<stdio.h>

int main()
{
	int x1,n1,n2,i;
	int a[11] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	scanf("%d %d", &x1, &n1);
	scanf("%d", &n2);

	//原数组输出
	for (i = 0; i < 10; i++)
		printf("%5d", a[i]);
	printf("\n");

	//插值,输出
	if (n1 < 0 || n1 > 10){
		n1 = 10;
	}
	//要插入x的位置 后边的所有元素 往后挪一位,腾出空间给 x
	for (i = 10; i > n1; i--){
		a[i] = a[i - 1];
	}
	a[n1] = x1;//插入 x1
	for (i = 0; i < 11; i++)
		printf("%5d", a[i]);
	printf("\n");

	//删除,输出
	if (n2 > 10 || n2 < 0)//删除的位置不合法
	{
		n2 = 0;//改为删除第一个元素
	}
	//删除的元素位置 后边的元素 都往前挪一位 覆盖前边的就ok了
	for (i = n2; i < 10; i++)
		a[i] = a[i + 1];
	
	for (i = 0; i < 10; i++)
		printf("%5d", a[i]);
	printf("\n");

	return 0;
}

3. 数组元素修改

在这里插入图片描述
⭐ 统一输出

#include<stdio.h>

int main()
{
	int r,c;
	int a[20] = { 81, 55, 102, 84, 204, 105, 56, 85, 58, 202, 101, 83, 104, 103, 82, 201, 59, 203, 57, 205 };
	for (r = 0; r < 4; r++)//枚举行
	{
		for (c = 0; c < 5; c++)//枚举列
		{
			int idx = r * 5 + c;//数组下标
			int score = a[idx];//分数

			if (score < 60)
				score = -1;
			else if (score > 100 && score <= 200)
				score = -2;
			else if (score > 200)
				score = -3;
			printf("%5d", score);
		}
		printf("\n");//记得换行
	}
	return 0;
}

4. 字符个数统计

在这里插入图片描述
⭐ 数组下标映射:字符 --> ASCII 值 --> 数组下标
🤬 局部数组无默认值(记得初始化就好)

#include<stdio.h>

int main()
{
	char a[100];
	int i;
	for (i = 0; i < 100; i++)//记得初始化数组,不然就是随机值啦
		a[i] = ' ';
	int cnt[256];//cnt 数组记录字母出现的次数,ASCII码值 0 - 256 覆盖大部分字符
	for (i = 65; i < 130; i++)//初始计数数组
		cnt[i] = 0;

	scanf("%s", a);
	for (i = 0; i <= 80; i++)
	{
		char c = a[i];
		cnt[c]++;
	}
	for (i = 97; i <= 122; i++){
		int num = cnt[i] + cnt[i - 32];
		if (num)// 非0即真
			printf("%c is %d\n", i, num);
	}
	return 0;
}

5. 数组元素共享

在这里插入图片描述
⭐ 从两边往中间找,不符合要求就交换
⭐ 补充:while 循环一定要写 i < j,以免数组越界

#include <stdio.h>
#include <math.h>

int IsPrimer(int num){

	int i, flag = 0;

	for (i = 2; i <= num / 2; i++){

		if (num%i == 0)

			break;

	}

	if (i>num / 2)

		flag = 1;

	return flag;

}

int main(){

	int a[100], n, i, j, temp;

	scanf("%d", &n);

	for (i = 0; i<n; i++)

		scanf("%d", &a[i]);

	i = 0, j = n - 1;

	while (i<j){
		//【1】//请在此填入多行语句
		//【1】//请在此填入多行语句
		while (i < j && !IsPrimer(a[i]))//从左往右找,找到第一个 素数 的下标i
			i++;
		while (i < j && IsPrimer(a[j]))//从右往左找,找到第一个 和数 的下标j
			j--;
			
		if (i < j)//交换
		{
			/* 临时变量交换
			temp = a[i];
			a[i] = a[j];
			a[j] = temp;
			*/
			// 异或交换(这里有个坑!当 i == j 时会出现归零的问题)
			a[i] ^= a[j];
			a[j] ^= a[i];
			a[i] ^= a[j];
		}
	}

	for (i = 0; i<n; i++)
		printf("%5d", a[i]);

	return 0;
}

6. 找两个数组中共同元素值问题

在这里插入图片描述
⭐ 先枚举已有数组的元素,再枚举输入数组的元素,相同就输出
⭐ 已有数组的元素不重复,可以间接实现去重

#include <stdio.h>

int main()
{
	int n, i, j, s1[10] = { 10, 21, 34, 12, 15, 8, 17, 20, 23, 30 }, s2[10];

	scanf("%d", &n);

	for (i = 0; i<n; i++)

		scanf("%d", &s2[i]);

	//【1】//请在此填入多行语句

	for (i = 0; i < 10; i++)//枚举已有数组的元素
		for (j = 0; j < n; j++)//枚举输入数组的元素
			if (s1[i] == s2[j]){
				printf("%5d", s2[j]);
				break;
			}

	return 0;
}

7. 数组循环右移k个位置

在这里插入图片描述
⭐ 一步一步来右移就好啦

#include <stdio.h>

int main(){
	int a[100], n, k, i, j;
	int tmp;
	scanf("%d", &k);
	scanf("%d", &n);
	for (i = 0; i<n; i++)
		scanf("%d", &a[i]);
	//【1】//请在此填入多行语句
	while (k--)//向右移动 k 次,每次移动 1 位
	{
		tmp = a[n - 1];
		for (i = n-1; i > 0; i--){
			a[i] = a[i - 1];
		}
		a[0] = tmp;
	}
	for (i = 0; i<n; i++)
		printf("%3d", a[i]);
	return 0;
}

8. 数组逆序保存

在这里插入图片描述
⭐ 逆序输出就好啦

for (i = n-1; i >= 0; i--)
		printf("%3d", a[i]);

⭐ 非得折腾一下的话

#include <stdio.h>

int main(){

	int a[100], n, i, tmp;
	scanf("%d", &n);

	for (i = 0; i<n; i++)
		a[i] = 2 * i + 1;

	for (i = 0; i<n; i++)
		printf("%3d", a[i]);

	printf("\n");

	//【1】//请在此填入多行代码
	for (i = 0; i + i < n; i++){//第1 和 倒1 交换,第2 和 倒2 交换……
		tmp = a[i];
		a[i] = a[n - 1 - i];
		a[n - 1 - i] = tmp;
	}

	for (i = 0; i<n; i++)
		printf("%3d", a[i]);

	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值