问题1:从键盘输入一个M*M方阵,输出该方阵,然后求出两条对角线上元素之和,并作为函数值返回。
代码如下:
#include<stdio.h>
#include<time.h>
int djx2(int (*a)[lie],int x,int y){
int s,l;
int sum=0;
for(s=0;s<x;s++){
for(l=0;l<y;l++){
if(s+l==x-1){
sum=sum+a[s][l];
}
}
}
return sum;
}
int djx(int (*a)[lie],int x,int y){
int s,l;
int sum=0;
for(s=0;s<x;s++){
for(l=0;l<y;l++){
if(s==l){
sum=sum+a[s][l];
}
}
}
return sum;
}
int main(){
int s,l;
srand((unsigned) time(NULL));
int fs[5][5]={0};
int *pfs=fs;
sc(pfs,5,5);
pri(pfs,5,5);
printf("\n");
s=djx(pfs,5,5);
l=djx2(pfs,5,5);
printf("两条对角线分别为%d,%d",s,l);
return 0;
}
结果如下:
这道题要注意观察两条对角线元素角标的规律,用for循环得出结果。
2. 请编写一个函数void fun(int x,int p[],int *n),他的功能是:求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回。
#include<stdio.h>
#include<time.h>
void fun(int x,int (*p),int *n){
int a;
int b=0;
printf("请输入一个整数:\n");
scanf("%d",&x);
for(a=1;a<=x;a++){
if(x%a==0 && a%2!=0){
p[b]=a;
b++;
}
}
for(a=0;a<100;a++){
*n=p[a];
if(*n!=0){
printf("除数为%d\n",*n);
}
}
}
int main(){
int a,b;
int *p=&b;
int fs[100]={0};
int *pfs=fs;
fun(a,pfs,p);
return 0;
}
结果为:
这道题主要是先根据判断得到除数,然后再用数组接一下,之后让多余的0不打印即可。
3.两个数组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<time.h>
int jj(int (*a),int (*b),int (*c),int length1,int length2,int length3){
int s,l;
int k=0;
int m=0;
for(s=0;s<length1;s++){
for(l=0;l<length2;l++){
if(a[s]==b[l]){
c[k]=a[s];
k++;
}
}
}
for(s=0;s<length3;s++){
m=0;
for(l=s+1;l<length3;l++){
if(c[s]==c[l]){
m=1;
break;
}
}
if(m==0){
if(c[s]!=0){
printf("%d ",c[s]);
}
}
}
return 0;
}
int main(){
int fs[10]={0};
int fu[10]={0};
int fz[10]={0};
srand((unsigned) time(NULL));
int *pfs=fs;
int *pfu=fu;
int *pfz=fz;
sc_1(pfs,10);
pri_1(pfs,10);
printf("\n");
sc_1(pfu,10);
pri_1(pfu,10);
printf("\n");
jj(pfs,pfu,pfz,10,10,10);
return 0;
}
结果如下:
结果的第一行是第一个数组,第二行是第二个数组,第三行是交集。思路是,先将两个数组的相同元素提取出来,然后接到一个一维数组里,再在一维数组里降重,得到结果。
总结:要想熟练掌握指针,必须要将它和数组联合起来,一起练习。在编程中,总会出现一些小错误,排查很困难,之后编程逻辑要清楚,避免犯一些小错误,影响编程效率。