今天分享一些关于数组和指针的练习
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;
}
这些习题都很好的利用了前期学到的知识,还需努力啊