目录
写在前面
正文
第1关:折半查找
第2关:二维数组操作
第3关:二维数组的展开
第4关:数组元素交换
第5关:幻方
写在最后
写在前面
本文代码是我自己所作,本人水平有CC限,可能部分代码看着不够简练,运行效率不高,但都能运行成功。
正文
第1关:折半查找
本关任务:由
N
个有序整数组成的数列已放在一维数组中,给定程序的功能是:利用折半查找法查找整数m
在数组中的位置。若找到,返回其下标值,否则返回-1
。测试输入:
5
预期输出:
-5 4 9 15 28 45 66 89 100 180
Not be found!
测试输入:
9
预期输出:
-5 4 9 15 28 45 66 89 100 180
m=9,index=2
#include <stdio.h>
#define N 10
int main()
{
int i, arr[N]={-5,4,9,15,28,45,66,89,100,180 }, k=-1, m;
int left=0, right=N-1, mid;
for(i=0;i<N;i++)
printf("%d ", arr[i]);
printf("\n");
scanf("%d",&m);
while( left<= right)
{
mid = ( left+ right) / 2;
if(m < arr[mid])
right= mid-1;
/***** 以下一行有错误 *****/
else if(m > arr[mid])
left=mid+1;
/***** 以下一行有错误 *****/
else
{
k=mid;
break;
}
}
if(k>=0)
printf("m=%d,index=%d\n",m,k);
else
printf("Not be found!\n");
return 0;
}
第2关:二维数组操作
本关任务:输入一个
N×N
的二维数组。编写程序将数组左下半三角元素的值全部置成0
。测试输入:
3
1 2 3
4 5 6
7 8 9
预期输出:
0 2 3
0 0 6
0 0 0
#include<stdio.h>
int main()
{
int N=0;
scanf("%d",&N);
int arr[N][N];
int i,j; //行和列
//对数组进行具体赋值
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
scanf("%d",&arr[i][j]);
}
}
//对数组赋0
for(i=0;i<N;i++)
{
for(j=0;j<=i;j++)
{
arr[i][j] =0;
}
}
//打印矩形数组
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
}
第3关:二维数组的展开
本关任务:编写程序,功能是将
M
行N
列的二维数组中的字符数据按列的顺序依次放到一个字符串(一维数组)中。测试输入:
4 4
SSSS
YYYY
XXXX
YYYY
预期输出:
SYXYSYXYSYXYSYXY
#include<stdio.h>
int main()
{
int M,N;
scanf("%d%d",&M,&N);
char arr1[M][N];//={{"ssss"},{"yyyy"},{"xxxx"},{"mmmm"}};
char arr2[M*N];//创建一维数组
int i,j;
int k=0;
//输入元素
for(i=0;i<M;i++)
{
// for(j=0;j<N;j++)
// {
// scanf("%c",&arr1[i][j]);
// }
scanf("%s", arr1[i]);
// getchar();
}
//将二维数组中中的值赋给一维数组
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
arr2[k]=arr1[j][i];
k++;
}
}
//打印一维数组
for(k=0;k<(M*N);k++)
{
printf("%c",arr2[k]);
}
return 0;
}
第4关:数组元素交换
本关任务:有一个
3*4
矩阵,找出每行中最大的元素并与第1
列元素交换。具体要求如下:
1.
使用二维数组存放该3*4
矩阵
2.
为二维数组输入数据。
3.
输出原矩阵并和处理后的矩阵进行比较。
测试输入:
3 4
1 2 3 4
5 6 7 8
9 10 11 12
预期输出:
原矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
处理后:
4 2 3 1
8 6 7 5
12 10 11 9
#include<stdio.h>
int main()
{
//模块一:初始化及输入
int arr[10][10]={0};//={{4,2,3,1},{5,6,7,8},{9,10,11,12}};
int i,j,k,max;
int m,n;
scanf("%d%d",&m,&n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&arr[i][j]);
}
}
//模块二:输出原矩阵
printf("原矩阵:\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
//模块三:处理后,每行中的最大值与第一列交换
for(i=0;i<m;i++)
{
max=arr[i][0];
for(j=0;j<n;j++)
{
if(arr[i][0]<=arr[i][j])
{
arr[i][0]=arr[i][j];
k=j;//记下最大值的位置
}
}
arr[i][k] =max;
}
//模块四:输出处理后矩阵
printf("处理后:\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
}
第5关:幻方
本关任务:编写程序判定
N×N
(规定N
为奇数,且N<20
)的矩阵是否是"幻方",(N×N
的二维数组各元素的值由用户在程序运行时输入) "幻方"的判定条件是:矩阵每行、每列、主对角线及反对角线上元素之和都相等。输入: 第一行为一个整数,代表矩阵维数
N
。 第二行开始为矩阵输入数据。输出: 判断结果,若是幻方则输出
Yes
不是则输出No
。测试输入:
3
4 9 2
3 5 7
8 1 6
预期输出:
Yes
#include<stdio.h>
// 行H 列L 主对角线Z 反对角线F
//主函数完成赋值和输出,自定义函数完成幻方的判断
//行,列,对角线三次判断,任何一次不满足,就直接返回0
int isMagic(int arr[10][10],int N)
{
int H=0,L=0,Z=0,F=0;
int i=0,j=0,count;
//判断行相等
for(i=0;i<N;i++)
{
H=0;
for(j=0;j<N;j++)
H+=arr[i][j];
if(i==0)//把第一行计算的结果赋值给count,之后把下面每一行的结果与count比较
{
count=H;
continue;
}
if(count!=H)
return 0;
}
//判断列相等
for(j=0;j<N;j++)
{
L=0;
for(i=0;i<N;i++)
L+=arr[i][j];
if(j==0)//把第一列计算的结果赋值给count,之后把后面每一列的结果与count比较
{
count=L;
continue;
}
if(count!=L)
return 0;
}
//判断主对角线和反对角线
for(i=0;i<N;i++)
{
Z+=arr[i][i];
F+=arr[i][N-i-1];
}
if(Z!=F&&Z!=H)
return 0;
return 1;//若上面的判断条件全能跑一遍,则就是幻方
}
int main()
{
int N,H,L,Z,F;
int i=0,j=0;
scanf("%d",&N);
int arr[10][10];
for(i=0;i<N;i++)
for(j=0;j<N;j++)
scanf("%d",&arr[i][j]);
int flag=isMagic(arr,N);
if(flag)
printf("Yes");
else
printf("No");
return 0;
}
//下标
//00 01 02
//10 11 12
//20 21 22