数组精选练习,从一维到二维,进来张张脑叽~

文章展示了三个C语言编程示例:一是使用一维数组模拟字符从两端向中间汇聚的过程,添加了延迟和清屏功能;二是实现二分查找算法在升序数组中查找目标元素;三是编写程序进行矩阵转置操作,强调了输入输出和数组大小的处理。
摘要由CSDN通过智能技术生成

练习一:一维数组元素互换问题

编写代码,演⽰多个字符从两端移动,向中间汇聚
例如:
让***************从两端开始向中间逐渐变成“ I want to creat codes."

思路:创建两个一维数组,用循环将两个数组内元素从两端向中间互换

1.基本代码形式

#include<string.h>
#include<stdio.h>
int main()
{
	char arr1[] = "I want to creat codes!";
	char arr2[] = "**********************";
	int left = 0;
	int sz = strlen(arr1) - 1;//数组内元素编号从0开始
	int right = sz-1;
	printf("%s\n", arr2);
	while (left <= right)//往中间走
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		left++;
		right--;
		printf("%s\n", arr2);
		
	}
	

	return 0;
}

运行结果:

在这里插入图片描述
现在,加入拖时和清屏:

#include<string.h>
#include<stdio.h>
#include<windows.h>
int main()
{
	char arr1[] = "I want to creat codes! ";
	char arr2[] = "**********************";
	int left = 0;
	int sz = strlen(arr1) - 1;
	int right = sz-1;
	printf("%s\n", arr2);
	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		left++;
		right--;
		printf("%s\n", arr2);
		Sleep(500);//表示休眠,单位是毫秒,需要头文件<windows.h>
		system("cls");//用来执行系统命令的,清屏
		
	}
	
	printf("%s\n", arr2);//为了留住最后打印完的句子
	return 0;
}

运行结果是动态的,自己调试奥

2.在元素升序排列的数组中查找给定项——二分查找

在⼀个升序的数组中查找制定的数字n,每次区间减半

#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int goal = 7;//规定要找的数字
	int prograss = 0;
	int left = 0;//左标号
	int right = (sizeof(arr) / sizeof(arr[0])) - 1;//右标号
	int mid = 0;
	while (left <= right)//往中间凑,最后left==right时再验证一次,若此次找不到,就找不到了
	{
		 mid = (left + right) / 2;
		if (goal < arr[mid])
		{
			right = mid - 1;
		}
		else if (goal > arr[mid])
		{
			left = mid + 1;
		}
		else
		{
			prograss = 1;
			break;

		}
	}
	if (prograss)
		printf("找到了,下标是%d\n", mid);
	else
		printf("找不到了\n");
	return 0;

}

总结:这里巧妙引入prograss变量的意义是:跳出循环有两种可能,一种是不满足left=right(找完了);一种是找到了,break跳出
所以要判断这两种情况,可以用prograss变量的值判断

取平均值时的优化:
int c=(a+b)/2取平均值的方法,如果遇到a=INT_MAX,b=INT_MAX的情况,那a,b一加超过了int能存储的范围
所以:int mid=left+(right-left)/2;
是求平均值的最优解

3.矩阵转置

题目如下:将矩阵的行列互换得到的新矩阵称为转置矩阵,写程序将输入的矩阵转置
输入格式:
2 3 //先输入行和列
1 2 3
4 5 6
输出格式:
1 4
2 5
3 6

题目分析:1.循环输入,循环输出
2.行号列号互换输出

#include<stdio.h>
int main()
{
    int n = 1;//输入行数
    int m = 0;//输入列数
    int i = 0;//行中元素标号
    int j = 0;//列中元素标号
    scanf("%d %d", &n, &m);
    int arr1[10][10] = { 0 };
    for (i = 0;i < n;i++)
    {
        for (j = 0;j < m;j++)
            scanf("%d", &arr1[i][j]);
    }
    for (i = 0;i < m;i++)
    {
        for (j = 0;j < n;j++)
        {
            printf("%d ", arr1[j][i]);
        }
        printf("\n");
    }

}

易错细节1:对arr1的初始化太小
如果初始化是这样:

int arr1[2][3]={0};

那么,如果输入时行或列有超过2或3的情况时:
在这里插入图片描述

在这里插入图片描述
超出范围,数组被破坏
//

易错点2:互换时,for循环中的范围问题
在这里插入图片描述
换前,i 表示每一行中的元素标号,要小于要求输入的行号n
换后,i 成了列的表示,自然要小于要求输入的列号m

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值