BSP Day 20

今天分享一些关于数组和指针的练习

1.请编写一个函数void fun(int x,int p[],int *n),他的功能是:求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回

#include<stdio.h>
#define N 100
void fun(int x, int *p, int *n); 
 
int main()
{
	int num;
	int number = 0;
	int *p = &number;
	printf("请输入你想整除的数:\n");
	scanf("%d", &num);
	int arr[N] = {0};
	fun(num, arr, p);
	printf("能整除这个数且不是偶数的整数有%d个,这些值是:\n", number);
	for(int i = 0; i < N; i++)
	{
		if(arr[i] != 0)
		printf("%d	", arr[i]);
	}
	
	
	
	return 0;
}
 
 
void fun(int x, int *p, int *n)
{
	int j = 0;
	for(int i = 1; i < x; i++)
	{
		if(x % i == 0 && i % 2 != 0)
		{
			p[i] = i;
			j++;
		}
	}
	*n = j;
}

定义一个N*N的二维数组,请编写四个函数fun(int *p[N]),该函数的功能是将数组的左下半三角元素中的值全部置0, 右下半三角元素中的值全部置0,左上半,右上半三角元素中的值全部置0

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 4
void leftup(int (*p)[N]);
void rightdown(int (*p)[N]);
void rightup(int (*p)[N]);
void leftdown(int (*p)[N]);
 
int main()
{
	srand((unsigned) time(NULL));
	int arr[N][N];
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < N; j++)
		{
			arr[i][j] = rand() % 100 + 1;
		}
	}
//	leftup(arr);
//	rightdown(arr);
//	rightup(arr); 
	leftdown(arr);
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < N; j++)
		{
			printf("%d	", arr[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}
 
void leftup(int (*p)[N])
{
	
	for(int i = 0; i < N; i++)
	{
		for(int j = N - 1 - i; j >= 0 ; j--)
		{
			p[i][j] = 0;
		}
	}	
}
void rightdown(int (*p)[N])
{
	
	for(int i = 0; i < N; i++)
	{
		for(int j = N - 1; j >= N - i - 1 ; j--)
		{
			p[i][j] = 0;
		}
	}	
}
 
void rightup(int (*p)[N])
{
	for(int i = 0; i < N; i++)
	{
		for(int j = N - 1; j >= i; j--)
		{
			p[i][j] = 0;
		}
	}
}
void leftdown(int (*p)[N])
{
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < i + 1; j++)
		{
				p[i][j] = 0;
		}
	}
}

 从键盘输入一个M*M方阵,输出该方阵,然后求出两条对角线上元素之和,并作为函数值返回
 

#include<stdio.h>
#define M 5
 
void scanfArr(int (*p)[M]);
int sumDiagonalLines(int (*p)[M]);
void printArr(int (*p)[M]); 
 
int main()
{
	int arr[M][M] = {0};
	int result;
	scanfArr(arr);
	printArr(arr); 
	result = sumDiagonalLines(arr);
	printf("对角线的和为:%d", result);
	
	return 0;
}
 
void scanfArr(int (*p)[M])
{
	printf("请为数组赋值:\n"); 
	for(int i = 0; i < M; i++)
	{
		for(int j = 0; j < M; j++)
		{
			printf("请给第%d行,第%d列赋值:", i + 1, j + 1);
			scanf("%d", &p[i][j]);
		} 
	}
}
 
int sumDiagonalLines(int (*p)[M])
{
	int sum = 0;
	for(int i = 0; i < M; i++)
	{
		for(int j = 0; j < M; j++)
		{
			if(i == j)
			{
				sum += p[i][j];
			}
		}
	}
	int k = 4;
	for(int i = 0; i < M; i++)
	{
		sum +=p[i][k];
		k--;
	}
	return sum;
}
void printArr(int (*p)[M])
{
	for(int i = 0; i < M; i++)
	{
		for(int j = 0; j < M; j++)
		{
			printf("%d	", p[i][j]);	
		}
		printf("\n");	
	}	
}

定义一个NxN的二维数组,使数组左下办三角全部为零

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 5
 
void printArr(int (*p)[N]);
void modifyArr(int (*p)[N]);
 
int main()
{
	srand((unsigned) time(NULL));
	int arr[N][N] = {0};
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < N; j++)
		{
			arr[i][j] = rand() % 100 + 1;	
		}	
	}
	printf("置零前:\n");
	printArr(arr);
	modifyArr(arr);
	printf("置零后:\n");
	printArr(arr);
	 
	
	return 0;
}
 
void printArr(int (*p)[N])
{
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < N; j++)
		{
			printf("%d	", p[i][j]);	
		}
		printf("\n");	
	}	
}
 
void modifyArr(int (*p)[N])
{
	for(int i = 1; i < N; i++)
	{
		for(int j = 0; j <= i - 1; j++)
		{
			p[i][j] = 0;
		}
	}
}

输入一个二维数组求他的最大行和最大列

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 4
 
void printArr(int (*p)[N]);
void maxRow(int (*p)[N], int *q);
void maxColumn(int (*p)[N], int *q);
 
int main()
{
	srand((unsigned) time(NULL));
	int arr[N][N] = {0};
	int arr1[N] = {0};
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < N; j++)
		{
			arr[i][j] = rand() % 2 ;	
		}	
	}
	printArr(arr);
	maxRow(arr, arr1);
	maxColumn(arr, arr1);
		
} 
 
void printArr(int (*p)[N])
{
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < N; j++)
		{
			printf("%d	", p[i][j]);	
		}
		printf("\n");	
	}	
}
 
void maxRow(int (*p)[N], int *q)
{
 
	for(int i = 0; i < N; i++)
	{
		for(int j = 0; j < N; j++)
		{
			q[i] += p[i][j];
		}
	}
	int max = q[0];
	for(int i = 1; i < N; i++)
	{
		if(max < q[i])
		max = q[i];
	}
	for(int i = 0; i < N; i++)
	{
		if(max == q[i])
		{
			printf("最大行是:%d\n", i + 1);
			break;	
		}
	
 
	}
}
 
void maxColumn(int (*p)[N], int *q)
{
	
	for(int i = 0; i < N; i++)
		{
			for(int j = 0; j < N; j++)
			{
				q[i] += p[j][i];
			}
		}
		int max = q[0];
		for(int i = 1; i < N; i++)
		{
			if(max < q[i])
			max = q[i];
		}
		for(int i = 0; i < N; i++)
		{
			if(max == q[i])
			{
				printf("最大列是:%d\n", i + 1);
				break;	
			}
		
 
		}	
}

 (游戏:九个正面和背面)一个 3 x 3 的矩阵中放置了 9 个硬币,这些硬币有些面向上,有些面向下。可以使用 3 x 3 的矩阵中的 0 (正面)或1(反面)表示硬币的状态。下面是一些例子:
0 0 0 1 0 1 1 1 0 1 0 1 1 0 0
0 1 0 0 0 1 1 0 0 1 1 0 1 1 1
0 0 0 1 0 0 0 0 1 1 0 0 1 1 0
每个状态都可以使用一个二进制数表示。例如,前面的矩阵对应到数字 :
000010000 101001100 110100001 101110100 100111110
总共会有 512 种可能性。所以,可以使用十进制数 0, 1,2, 3, 511 来表示这个矩阵的所有状态。编写一个程序,提示用户输入一个在 0 到 511 之间的数字,然后显示用字符 H 和 T表示的对应的矩阵。
 

#include<stdio.h>
#define ROW 3
#define COLUMN 3
 
void result(int (*p)[COLUMN], int a);
 
int main()
{
	int arr[ROW][COLUMN] = {0};
	int num;
	printf("请输入一个0~511的数:\n");
	scanf("%d", &num);
	
	result(arr, num);
	
	return 0;
}
 
void result(int (*p)[COLUMN], int a)
{
	for(int i = ROW - 1; i >= 0; i--)
	{
		for(int j = COLUMN - 1; j >= 0; j--)
		{
			p[i][j] = a % 2;
			a /= 2;	
		}	
	}
	for(int i = 0; i < ROW; i++)
	{
		for(int j = 0; j < COLUMN; j++)
		{
			if(p[i][j] == 0)
			{
				printf("%c  ", 'H');	
			}
			else
			{
				printf("%c  ", 'T');	
			}	
		}
		printf("\n");	
	} 
}

 两个数组num1和num2,返回他们的交集,交集保存到另外的数组。比如num1={1,2,2,1},num2={2,2}  输出result={2},num1={4,9,5},num2={9,4,9,8,4}  输出result={9,4}或者result={4,9}

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10
 
 
int assignment(int *p, int length);
void printArr(int *p, int length);
int intersection(int *p1, int *p2, int *p3, int length);
 
int main()
{
	srand((unsigned) time(NULL));
	int arr1[N] = {0};
	int arr2[N] = {0};
	int arr3[N] = {0};
	assignment(arr1, N);
	assignment(arr2, N);
	printf("第一个数组为:\n");
	printArr(arr1, N);
	printf("第二个数组为:\n");
	printArr(arr2, N);
	intersection(arr1, arr2, arr3, N);
//	printArr(arr3, N);
	
	 
	
	return 0;
}
 
int assignment(int *p, int length)
{
	for(int i = 0; i < length; i++)
	{
		p[i] = rand() % 7 + 1;
	}
	return 0;
}
 
void printArr(int *p, int length)
{
	for(int i = 0; i < length; i++)
	{
		printf("%d	", p[i]);
	}
	printf("\n");
}
 
int intersection(int *p1, int *p2, int *p3, int length)
{
	for(int i = 0; i < length; i++)
	{
		for(int j = 0; j < length; j++)
		{
			if(p1[i] == p2[j])
			{
				p3[i] = p1[i];
			}
		}
	}
	int flag = 0;
	for(int i = 0; i < N; i++)
		{	
			flag = 0;
			for(int j = i + 1; j < N; j++)
			{
				if(p3[i] == p3[j])
				{
					flag = 1;
					break;
				}
			}
			if(flag == 0)
			{	
				if(p3[i] != 0)
				printf("%d	", p3[i]);
			 } 
		}
	return 0;
}

求5行5列二维数组主对角线(从左上角到右下角)上元素之和 

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 5
#define COLUMN 5
 
void printArr(int (*p)[COLUMN]);
int sumMainDiagonalLines(int (*p)[COLUMN]);
 
int main()
{
	int arr[ROW][COLUMN] = {0};
	int result;
	srand((unsigned) time(NULL));
	for(int i = 0; i < ROW; i++)
	{
		for(int j = 0; j < COLUMN; j++)
		{
			arr[i][j] = rand() % 100 + 1;
		}
	}
	printArr(arr);	
	result = sumMainDiagonalLines(arr);
	printf("对角线的和为:%d\n", result); 
	
	return 0; 
}
 
void printArr(int (*p)[COLUMN])
{
	for(int i = 0; i < ROW; i++)
	{
		for(int j = 0; j < COLUMN; j++)
		{
			printf("%d	", p[i][j]);	
		}
		printf("\n");	
	}	
}
 
int sumMainDiagonalLines(int (*p)[COLUMN])
{
	int sum = 0;
	for(int i = 0; i < ROW; i++)
	{
		for(int j = 0; j < COLUMN; j++)
		{
			if(i == j)
			{
				sum += p[i][j];	
			}	
		}	
	}
	return sum;	
}

这些习题都很好的利用了前期学到的知识,还需努力啊

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

weixiaxiao

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

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

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

打赏作者

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

抵扣说明:

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

余额充值