练习一:一维数组元素互换问题
编写代码,演⽰多个字符从两端移动,向中间汇聚
例如:
让***************从两端开始向中间逐渐变成“ 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