【头歌C语言程序与设计】数组及其应用

目录

写在前面

正文

第1关:折半查找

第2关:二维数组操作

第3关:二维数组的展开

第4关:数组元素交换

第5关:幻方

写在最后


写在前面

本文代码是我自己所作,本人水平有CC限,可能部分代码看着不够简练,运行效率不高,但都能运行成功。另外,如果想了解更多,请订阅专栏头歌C语言程序与设计

正文

第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关:二维数组的展开

本关任务:编写程序,功能是将MN列的二维数组中的字符数据按列的顺序依次放到一个字符串(一维数组)中。

测试输入:

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

写在最后

👍🏻点赞,你的认可是我创作的动力!

⭐收藏,你的青睐是我努力的方向!

✏️评论,你的意见是我进步的财富!

  • 5
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

畅游星辰大海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值