📄 c指针答案.txt
字号:
{ for(j=0;j<5;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
void change(int *p) /*交换函数*/
{ int i,j,temp;
int *pmax,*pmin;
pmax=p;
pmin=p;
for(i=0;i<5;i++) /*找最大值和最小值的地址,并赋给pmax,pmin*/
for(j=0;j<5;j++)
{ if(*pmax<*(p+5*i+j)) pmax=p+5*i+j;
if(*pmin>*(p+5*i+j)) pmin=p+5*i+j;
}
temp=*(p+12); /*将最大值换给中心元素*/
*(p+12)=*pmax;
*pmax=temp;
temp=*p; /*将最小值换给左上角元素*/
*p=*pmin;
*pmin=temp;
pmin=p+1;
for(i=0;i<5;i++) /*找第二最小值的地址赋给pmin*/
for(j=0;j<5;j++)
if(((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j))) pmin=p+5*i+j;
temp=*pmin; /*将第二最小值换给右上角元素*/
*pmin=*(p+4);
*(p+4)=temp;
pmin=p+1;
for(i=0;i<5;i++) /*找第三最小值的地址赋给pmin*/
for(j=0;j<5;j++)
if(((p+5*i+j)!=(p+4))&&((p+5*i+j)!=p)&&(*pmin>*(p+5*i+j)))
pmin=p+5*i+j; /*将第三最小值换给左下角元素*/
temp=*pmin;
*pmin=*(p+20);
*(p+20)=temp;
pmin=p+1;
for(i=0;i<5;i++) /*找第四最小值的地址赋给pmin*/
for(j=0;j<5;j++)
if(((p+5*i+j)!=p)&&((p+5*i+j)!=(p+4))&&((p+5*i+j)!=
(p+20))&&(*pmin>*(p+5*i+j))) pmin=p+5*i+j;
temp=*pmin; /*将第四最小值换给右下角元素*/
*pmin=*(p+24);
*(p+24)=temp;
}
运行结果:
Input matrix:
35 34 33 32 31↙
3O 29 28 27 26↙
25 24 23 22 21↙
15 14 13 12 ll↙
Now, matrix:
11 34 33 32 12
30 29 28 27 26
25 24 35 22 21
20 l9 18 17 16
13 23 15 31 14
返 回
10.11在主函数中输入10个等长的字符串。用另一个函数对它们排序,然后在主函数输出这10个已排好的字符串。
解:程序如下:(xt10-11.c)
#include <stdio.h>
#include <string.h>
main()
{ void sort(char s[10][6]);
int i;
char str[10][6];
printf("Input 10 strings:\n");
for(i=0;i<10;i++)
scanf("%s",str[i]);
sort(str);
printf("Now, the sequence is:\n");
for(i=0;i<10;i++)
printf("%s\n",str[i]);
}
void sort(char s[10][6])
{ int i,j;
char *p,temp[10];
p=temp;
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(strcmp(s[j],s[j+1])>0 )
{ strcpy(p,s[j]);
strcpy(s[j],s[+j+1]);
strcpy(s[j+1],p);
}
}
运行结果:
Input 10 strings:
China↙
Japan↙
Korea↙
Egypt↙
Nepal↙
Burma↙
Ghana↙
Sudan↙
Italy↙
Libya↙
Now, the sequence is:
Burma
China
Egypt
Ghana
Italy
Japan
Korea
Libya
Nepal
Sudan
返 回
10.12用指针数组处理上一题目,字符串不等长。
解:程序如下:(xt10-12.c)
#include <stdio.h>
#include <string.h>
main()
{ void sort(char *p[]);
int i;
char *p[10],str[10][20];
for(i=0;i<10;i++)
p[i]=str[i]; /*将第i个字符串的首地址赋予指针数组p的第i个元素*/
printf("Input 10 strings:\n");
for(i=0;i<10;i++)
scanf("%s",p[i]);
sort(p);
printf("Now, the sequence is:\n");
for(i=0;i<10;i++)
printf("%s\n",p[i]);
}
void sort(char *p[])
{ int i,j;
char *temp;
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(strcmp(*(p+j),*(p+j+1))>0)
{ temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
运行情况如下:
Input 10 strings:
China↙
Japan↙
Yemen↙
Pakistan↙
Mexico↙
Korea↙
Brazil↙
Iceland↙
Canada↙
Mongolia↙
Now, the sequence is:
Brazil
Canada
China
Iceland
Japan
Korea
Mexico
Mongolia
Pakistan
Yemen
返 回
10.13 写一个用矩形法求定积分的通用函数,分别求:
, ,
(说明:sin、cos、exp 已在系统的数学函数库中,程序开头要用 #include <math.h> )。
解:程序如下:(xt10-13.c)
#include <stdio.h>
#include <math.h>
main()
{ float integral(float (*p)(float),float a,float b,int n);
float a1,b1,a2,b2,a3,b3,c,(*p)(float);
float fsin(float); /*声明fsin函数*/
float fcos(float); /*声明fcos函数*/
float fexp(float); /*声明fexp函数*/
int n=20;
printf("Input a1,b1: "); /*输入求sinx定积分的下限和上限*/
scanf("%f,%f",&a1,&b1);
printf("Input a2,b2: "); /*输入求cosx定积分的下限和上限*/
scanf("%f,%f",&a2,&b2);
printf("Input a3,b3: "); /*输入求定积分的下限和上限*/
scanf("%f,%f",&a3,&b3);
p=fsin;
c=integral(p,a1,b1,n); /*求出sinx的定积分*/
printf("The integral of sin(x) is: %f\n",c);
p=fcos;
c=integral(p,a2,b2,n); /*求出cosx的定积分*/
printf("Tht integral of cos(x) is: %f\n",c);
p=fexp;
c=integral(p,a3,b3,n); /*求出ex的定积分*/
printf("The integral of exp(x) is: %f\n",c);
}
float integral(float(*p)(float),float a,float b,int n)
/*用矩形法求定积分的通用函数*/
{ int i;
float x,h,s;
h=(b-a)/n;
x=a;
s=0;
for(i=1;i<=n;i++)
{ x=x+h;
s=s+(*p)(x)*h;
}
return(s);
}
float fsin(float x) /*计算sinx的函数*/
{ return sin(x);}
float fcos(float x) /*计算cosx的函数*/
{return cos(x);}
float fexp(float x) /*计算ex的函数*/
{return exp(x);}
运行情况如下,
Input a1,b1:0,1↙
Input a2,b2: -l,1↙
Input a3,b3: 0,2↙
The integral of sin(x) is: O.480639
The integral of cos(x) is: 1.681539
The integral of exp(x) is: 6.713833
说明:sin、cos和exp是系统提供的数学函数。在程序中定义3个函数fsin、fCOS和fexp分别用来计算sin(x)、cos(x)和exp(x)的值,在main函数中要声明这3个函数。在main函数中定义p为指向函数的指针变量,定义形式是“float(*p)(float)”,表示p指向的函数有一个实型形参,p可指向返回值为实型的函数。在main函数中有“p=fsin;”,表示将fsin函数的人口地址赋给p。在调用integral函数时,用p作为实参,把fsin函数的人口地址传递给形参p(形参p也定义为指向函数的指针变量),这样形参P也指向fsin函数,(*p)(x)就相当于fsin(x)。fsin(x)的值就是sinx的值。因此通过调用integral函数求出了sinx的定积分。求其余两个函数定积分的情况与此类似。
返 回
10.14将n个数按输入顺序的逆序排列,用函数实现。
解:程序如下:(xt10-14.c)
#include <stdio.h>
main()
{ void sort(int *p,int m);
int i,n;
int *p,num[20];
printf("input n: ");
scanf("%d",&n);
printf("please input these numbers:\n");
for(i=0;i<n;i++)
scanf("%d",&num[i]);
p=&num[0];
sort(p,n);
printf("Now, the sequence is:\n");
for(i=0;i<n;i++)
printf("%d ",num[i]);
}
void sort(int *p,int m)
{ int i;
int temp,*p1,*p2;
for(i=0;i<m/2;i++)
{ p1=p+i;
p2=p+(m-1-i);
temp=*p1;
*p1=*p2;
*p2=temp;
}
}
运行结果:
input n: l0↙
please input these numbers:
l0 9 8 7 6 5 4 3 2 1 ↙
Now,the sequence is:
1 2 3 4 5 6 7 8 9 10
返 回
10.15有一个班4个学生,5门课。(1)求第一门课的平均分;(2)找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均成绩;(3)找出平均成绩在90分以上或全部课程成绩在85分以上的学生。分别编3个函数实现以上3个要求。
解:程序如下:(xt10-15.c)
#include <stdio.h>
main()
{ void avsco(float *psco,float *pave);
void avcour1(char *pcou,float *psco);
void fali2(char course[5][10],int num[4],float score[4][5],float aver[4]);
void good(char course[5][10],int num[4],float score[4][5],float aver[4]);
int i,j,*pnum,num[4];
float score[4][5],aver[4],*psco,*pave;
char course[5][10],*pcou;
printf("Input course: \n");
pcou=course[0];
for(i=0;i<5;i++)
scanf("%s",course[i]);
printf("Input NO. and scoures: \n");
printf("NO.");
for(i=0;i<5;i++)
printf(",%s",course[i]);
printf("\n");
psco=&score[0][0];
pnum=&num[0];
for(i=0;i<4;i++)
{ scanf("%d",pnum+i);
for(j=0;j<5;j++)
scanf(",%f",psco+5*i+j);
}
pave=&aver[0];
printf("\n\n");
avsco(psco,pave); /*求出每个学生的平均成绩*/
avcour1(pcou,psco); /*求出第一门课的平均成绩*/
printf("\n\n");
fali2(pcou,pnum,psco,pave); /*找出2门课不及格的学生*/
printf("\n\n");
good(pcou,pnum,psco,pave); /*找出成绩好的学生*/
}
void avsco(float *psco,float *pave) /*求每个学生的干均成绩的函数*/
{ int i,j;
float sum,average;
for(i=0;i<4;i++)
{ sum=0.0;
for(j=0;j<5;j++)
sum=sum+(*(psco+5*i+j)); /*累计每个学生的各科成绩*/
average=sum/5; /* 计算平均成绩*/
*(pave+i)=average;
}
}
void avcour1(char *pcou,float *psco) /*第一门课的平均成绩的函数*/
{ int i;
float sum,average1;
sum=0.0;
for(i=0;i<4;i++)
sum=sum+(*(psco+5*i)); /*累计每个学生的得分*/
average1=sum/4; /*计算平均成绩*/
printf("course 1: %s ,average score: %6.2f. \n", pcou,average1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -