Day 20 一些数组的练习题

1.求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;	
} 

主对角线就是下标相同的元素,用一个for嵌套遍历二维数组,当角标相同的时候,将数据加起来,最后输出

2.两个数组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;
}

用随机数给数组赋值,然后遍历两个数组,将相同的元素存到一个数组中,然后,输出不同的数,用一个flag,在每次遍历的最开始将flag清零,如果相同,将flag置1,再一次循环末尾输出flag是0的数

3.用函数实现

 

#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");	
	} 
}

用数组逆着存储输入数的二进制,然后将它输出,输出的方式是0变成H,1变成T

4.用函数实现:

 

#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;
		}
	}
}

将左下角置0,i控制行号,j控制输出几个0,从第二行置1个0,第三行置2个0...最后左下角全是0,保留右上角的数字

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

#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;	
			}
		

		}	
}

这个题,我用的比较笨的方法,将每一行or每一列的和存到一个一维数组中,在一维数组中找到这个值以及下标,输出下标

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

#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");	
	}	
}

这个题,求主对角线的和和上面写的一样,求另一个对角线的和,我是这样想的,用一个for循环,i控制行号,列用另一个k来控制,没执行一次k--,将这两个对角线的值加起来,就是所有对角线的总和

7.请编写一个函数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;
}

一个数能被x整除,就x分别对1到x-1取余,输出可以取余且不为偶数的数就可以了

8.定义一个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;
		}
	}
}

这个和之前画三角的方式一样,只不过当时是用for循环嵌套来控制i和j来输出*和空格,这个是用i个j控制出数字还是出0

总结:

这些练习题很好的练习了数组和指针以及之前学到的for循环,积累到了一些算法以及一些解题思路,还是很有收获的,输出不同的数,之前虽然做过类似的,但是突然忘掉了,想起了flag就想到了做题思路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值