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就想到了做题思路