C语言:返回指针的函数,函数声明、定义和调用,嵌套调用
2017-07-20 21:54
609 查看
任务代码:
例题1:
实践1:
设计程序,计算:
实践2:
实践3:
下面是sin函数的泰勒展式:
(注:x取弧度值,而非角度值)
用sin泰勒展式编写程序,求出sin(π/2)和sin(56°)的值,精度要求达到小数点后6位(即当最后一项的绝对值小于0.00001时,累加结束,求绝对值的函数也可以自定义函数myabs实现)。
在以上程序基础上的进一步制作:
要求在main()函数中调用show_sin_table(min_angle, max_angle),显示角度值为min_angle到max_angle之间的所有角度(间隔为1度)的正弦值。
例如show_sin_table(0, 90)可以显示出所有0到90度的正弦值。可以考虑以速查表格的形式(例,单位转换对照表)给出结果。
执行情况:
泰勒展开式1:
泰勒展开式输出2:
知识总结:
返回值为指针的函数:
野指针:
1.直接给指针变量赋值——因为指针变量是指向地址不确定,只不过是赋入存在里面的值;
2.直接给指针人工指定位置——因为指针指向的存储单元是系统自动分配的,不有人工自由分配决定;
t返回值会被内存清理:(无效地址)
函数的声明,定义和调动:
被调用的函数要已经存在;
函数要先定义后调用;若要先调用,后定义那就需要函数的声明;
函数的声明不需要变量,只需要声明变量类型;例如:void max(int,int),int min(*,*);
函数的调用不一定需要参数的传递例如:void max();
编码规范:函数定义前的注释
/*
功能:
参数:
返回值:
算法:
*/
int gcd(int a,int b)
{
...
}
函数的嵌套调用:
在调用一个函数的过程中,调用另外一个函数的过程
int main()
{
...a();
}
int a()
{
...b();
}
int b()
{
...
}
心得体会:
例题1:
/* 功能:弦截法求f(x)=x^3-5x^2+16x-80的根 算法:去两个不同的点x1,x2,如果对应的f(x1),f(x2)是异号的则在区间(x1,x2)区间内必有一个根 */ #include <stdio.h> #include <math.h> double xpoint(double,double); double f(double); double root(double,double); /*main主控输入和输出*/ int main() { double x1,x2,f1,f2,x; printf("此程序执行求方程f(x)=x^3-5x^2+16x-80的根!\n"); while(1) { printf("请输入x1,x2:"); scanf("%lf %lf",&x1,&x2); f1=f(x1); f2=f(x2); if(f1*f2>=0)//f1,f2同号的时候循环输入,知道异号的时候停止 continue; else break; } x=root(x1,x2);//当f1,f2异号的时候才能将此时的x1,x2传输到root printf("方程的根是:%lf",x); return 0; } /* 功能:求(x1, x2)区间方程的实根 参数:两个浮点型值,表示x轴上两点,由主调函数保证f(x1)和f(x2)是异号 返回值:方程的根 */ double root (double x1,double x2) { double x,y,y1; y1=f(x1); do { x=xpoint(x1,x2); y=f(x);//(x,y)为弦和x轴的切点坐标 if(y*y1>0) { y1=y; x1=x; }else { x2=x; } }while(fabs(y)>=0.00001);//无限接近x轴,也就切点的时候 return x; } /* 功能:求(x1, f(x1))和(x2, f(x2))的连线与x轴的交点x 参数:两个浮点型值,表示x轴上两点 返回值:交点的x轴坐标 */ double xpoint(double x1,double x2) { double x; x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1)); return x; } /* 功能:求函数f(x)=x3-5x2+16x-80的值 参数:一个浮点型数表示x轴上的一点 返回值:给定函数值 */ double f(double x) { double y; y=pow(x,3)-5*pow(x,2)+16*x-80; return y; }
实践1:
设计程序,计算:
#include<stdio.h> int power(int m,int n); //求m的n次方(m^n) int sum_of_power(int k,int n); //从1^k到n^k的累加和 int main( ) { int k, n; printf("计算f(k,n)=1^k+...n^k,请输入k和n:"); scanf("%d %d", &k, &n); printf("f(%d, %d)=%d\n", k, n, sum_of_power(k,n)); //m^k的累加和 return 0; } int sum_of_power(int k,int m) //累加循环 { int i,sum=0; for(i=1;i<=m;i++) { sum+=power(i,k); } return sum; } int power(int m,int n) //累乘循环 { int i=1,result=1; while(i<=n) { result=result*m; i++; } return result; }
实践2:
#include<stdio.h> #include <stdlib.h> void calScore(int); int main() { int n;//评委人数 char choice;//继续按钮 printf("请输入评委人数:"); scanf("%d",&n); calScore(n); printf("****************succeed***************\n"); printf("按N继续,其他继续...\n"); fflush(stdin); choice=getch();//getch或者getche不同于getchar()或scanfz(%c),需要用户输入后敲击回车才能运行,而是自动在用户输入后回车运行 if(choice=='N'||choice=='n') exit(0); else main(); } void calScore(int n) { int i=1;//指标 double mark;//评分 double max=0;//最高分初始化 double min=10;//最低分初始化 double score,sum=0;//最终得分,和分数总和初始化 do//至少有一位 { printf("第%d位评委的评分:",i); scanf("%lf",&mark); if(mark>10||mark<0) { printf("评分区间为0-10,请重新输入!\n"); continue; } i++; if(mark>max) max=mark; if(mark<min) min=mark; sum+=mark; }while(i<=n); score=(sum-max-min)/(n-2); printf("去掉一个最高分%.2lf,去掉一个最低分最终得分为:%.2lf\n",max,min); printf("当前选选手的最终得分为:%.2lf\n",score); return; }
实践3:
下面是sin函数的泰勒展式:
(注:x取弧度值,而非角度值)
用sin泰勒展式编写程序,求出sin(π/2)和sin(56°)的值,精度要求达到小数点后6位(即当最后一项的绝对值小于0.00001时,累加结束,求绝对值的函数也可以自定义函数myabs实现)。
#include<stdio.h> #include <stdlib.h> #define pi 3.1415926 double mysin(double x);//为区分原本c语言自带的函数sin,cos double myabs(double x); int main( ) { printf("该方程使用泰勒展开式求编辑sin,cos的近似值!\n"); printf("sin((π/2))的值为%.5f\n",mysin(pi/2)); printf("sin(56°)的值为%.5f\n",mysin((56.0/180)*pi));//因为定义成了弧度制,所以所有角度制换成弧度制 return 0; } //下面定义mysin函数 double mysin(double x) { int n=1,sign=1; int i,j; double sum=0; double x_result=1,fac_result=1; double item; do { i=1; while(i<=(2*n-1))//得到每一项的分子得到x^2*n-1次方 { x_result=x_result*x; i++; } j=1; while(j<=(2*n-1))//得到每一项的分母2^n-1的阶乘 { fac_result=fac_result*j; j++; } item=(x_result/fac_result)*sign;//得到每一项 sum=sum+item; sign=-sign;//颠倒符号 x_result=1;fac_result=1;//还原x_result,facresult n++; }while(myabs(item)>=0.00001); return sum; } double myabs(double x) { return ((x>=0)?x:-x);//绝对值条件运算符号 }
在以上程序基础上的进一步制作:
要求在main()函数中调用show_sin_table(min_angle, max_angle),显示角度值为min_angle到max_angle之间的所有角度(间隔为1度)的正弦值。
例如show_sin_table(0, 90)可以显示出所有0到90度的正弦值。可以考虑以速查表格的形式(例,单位转换对照表)给出结果。
#include<stdio.h> #include <stdlib.h> #define pi 3.1415926 double mysin(double x);//为区分原本c语言自带的函数sin,cos double myabs(double x);//用来计算三角函数的绝对值 void show_sin_table(int ,int);//显示table int main( ) { show_sin_table(0,90); return 0; } //下面定义show_sin_table()函数 void show_sin_table(int iFromAngle, int iToAngle) { int x,count=0; printf("由 %d °到 %d°的三角函数表(分三列显示):\n", iFromAngle, iToAngle); for(x=0; x<3; x++) printf("角度x\tsin(x)\t\t"); printf("\n"); //逐个地转换并输出 for(x=iFromAngle; x<=iToAngle; x++) { printf("%d\t", x); printf("%.3f\t\t", mysin(x*pi/180)); if (count%3==2) printf("\n"); ++count; } printf("\n"); return; } //下面定义mysin函数 double mysin(double x) { int n=1,sign=1; int i,j; double sum=0; double x_result=1,fac_result=1; double item; do { i=1; while(i<=(2*n-1))//得到每一项的分子得到x^2*n-1次方 { x_result=x_result*x; i++; } j=1; while(j<=(2*n-1))//得到每一项的分母2^n-1的阶乘 { fac_result=fac_result*j; j++; } item=(x_result/fac_result)*sign;//得到每一项 sum=sum+item; sign=-sign;//颠倒符号 x_result=1;fac_result=1;//还原x_result,facresult n++; }while(myabs(item)>=0.00001); return sum; } double myabs(double x) { return ((x>=0)?x:-x);//绝对值条件运算符号 }
执行情况:
泰勒展开式1:
泰勒展开式输出2:
知识总结:
返回值为指针的函数:
野指针:
1.直接给指针变量赋值——因为指针变量是指向地址不确定,只不过是赋入存在里面的值;
2.直接给指针人工指定位置——因为指针指向的存储单元是系统自动分配的,不有人工自由分配决定;
t返回值会被内存清理:(无效地址)
函数的声明,定义和调动:
被调用的函数要已经存在;
函数要先定义后调用;若要先调用,后定义那就需要函数的声明;
函数的声明不需要变量,只需要声明变量类型;例如:void max(int,int),int min(*,*);
函数的调用不一定需要参数的传递例如:void max();
编码规范:函数定义前的注释
/*
功能:
参数:
返回值:
算法:
*/
int gcd(int a,int b)
{
...
}
函数的嵌套调用:
在调用一个函数的过程中,调用另外一个函数的过程
int main()
{
...a();
}
int a()
{
...b();
}
int b()
{
...
}
心得体会:
相关文章推荐
- C语言学习9: malloc动态内存存储,动态内存分配去空格字符增长版,动态内存分配去符号incr增长版,型参和返回值都是int型的函数的指针,main函数的地址也可以用指针指向,typedef定义函数指针,函数定义与嵌套的作用,返回函数指针类型,const作用
- C语言如何跨文件调用函数定义中声明的变量
- 第4周 C语言及程序设计提高例程-8 函数的声明、定义和调用
- C语言提高-第8讲: 函数的声明、定义和调用(歌手大奖赛计分函数版)
- C语言,函数的声明,定义,以及调用(实现).举例应用.学了这么长时间,初步明白,汗颜啊
- C语言如何跨文件调用函数定义中声明的变量
- c语言中的函数的定义以及相关的调用、嵌套、递归以及和数组的关系
- 作业《IOS_C语言》函数分类、函数声明和定义、函数调用、形参实参、函数嵌套调用
- C语言及程序设计提高例程-8 函数的声明、定义和调用
- 《IOS_C语言》函数分类、函数声明和定义、函数调用、形参实参、函数嵌套调用
- 程序猿之---C语言细节22(函数返回指针注意事项<悬空指针>、查看进程可以分配的内存大小)
- C语言 函数指针三(反向调用)
- 解读C语言中函数指针数组构成的复杂定义
- 第4周 C语言及程序设计提高例程-7 返回指针的函数
- C语言调用函数指针
- 【02-C语言】11-函数的声明和定义
- 【C语言提高10】【指针铁律】铁律4:应用指针必须和函数调用相结合(指针做函数参数)
- 【C语言】14-返回指针的函数与指向函数的指针
- 返回类型是函数指针的函数指针 类比复杂的数组声明
- 函数声明放在头文件中,函数的定义放在实现文件中,然后在主函数中调用