您的位置:首页 > 编程语言 > C语言/C++

C语言:返回指针的函数,函数声明、定义和调用,嵌套调用

2017-07-20 21:54 609 查看
任务代码:

例题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()

{

...

}

心得体会:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐