c语言第五次作业
第五次作业:函数
1.自然数的计算
编写自己的两个函数,分别求出两个整数的最大公约数和最小的公倍数。
编写一个程序,功能是能够由键盘输入两个整数,并能调用自己编写的函数,计算并输出这两个整数的最大公约数和最小公倍数。
程序代码:
#include
void main()
{
intgreatest_common(intx,int y),lowest_common(intx,int y);
inta,b,c,d;
printf("please input two integer:");
scanf("%d,%d",&a,&b);
c=greatest_common(a,b);
d=lowest_common(a,b);
printf("最大公约数为%d,最小公倍数为%d\n",c,d);
}
intgreatest_common(intx,int y)
{
inti,min;
if (x>y)min=y;
else min=x;
for(i=min;i>=1;i--)
if ((x%i==0)&&(y%i==0))
return(i);
}
intlowest_common(intx,int y)
{
inti,max;
if (x>y)
max=x;
else
max=y;
for (i=max;;i++)
if((i%x==0)&&(i%y==0))
return (i);
}
2.字符串连接
请使用字符数组,编写自己的字符串连接函数。
编写一个程序,功能是能够由键盘输入两个字符串,并能调用自己编写的字符串连接函数,输出新的字符串。
#include
#include
void main()
{
char link(char a[40],char b[20]);
char str1[40]={"0"},str2[20];
printf("请输入第一个字符串:");
gets(str1);
printf("请输入第二个字符串:");
gets(str2);
printf("合并后的字符串为:\n");
link(str1,str2);
puts(str1);
}
char link(char a[40],char b[20])
{
inti,j;
i=strlen(a);
for(j=0;b[j]!=0;j++)
a[i+j]=b[j];
return(a[i]);
}
3. 三角函数
请使用台劳级数编写自己的常用三角近似值计算函数,用于自己程序的调用。台劳级数为:
...!7!5!3!1sin 7
53+-+-=x x x x x
...!
6!4!2!1cos 6
420+-+-=x x x x x
舍去的值由自己定义一个最小值。
请用自己的函数计算下面两个表达式的值,并且与VC++提供的标准函数之间的误差进行比较。请输入结果。
●
2
cos 1α-=
y ,(o
60=α) ●
x x x x y 22cos -cos sin sin *2?+=,(o
45=x )
#include
float s(float x),c(float x);
float y1,y2,y3,y4,a=3.14159/3,b=3.14159/4;
y1=sqrt((1-c(a))/2);
y2=s(b)*(2*s(b)+c(b))-c(b)*c(b);
printf("y1=%f,y2=%f\n",y1,y2);
y3=sqrt((1-cos(a))/2);
y4=sin(b)*(2*sin(b)+cos(b))-cos(b)*cos(b);
printf("y1'=%f,y2'=%f\n",y3,y4);
}
float s(float x)
{
int m=1,i=0;
float a=0,b=1,t=0;
while(m<=11)
{
t=1./b*pow(x,m)*pow(-1,i);
i++;
a=a+t;
m++;
b*=m;
m++;
b*=m;
}
return(a);
}
float c(float x)
{
float a=0,b=1,t=0;
int m=0,i=0;
while(m<=12)
{
t=1./b*pow(x,m)*pow(-1,i);
i++;
a=a+t;
m++;
b*=m;
m++;
b*=m;
}
return(a);
}
4.弦截法解方程
用弦截法求解方程f(x)=x3-5x2+16x-80=0的根。
要求使用和编写如下的函数:
●float f(float x)代表f(x)=x3-5x2+16x-80的值
●float xpoint(float x1, float x2) 来求出(x1,f(x1))与 (x2,f(x2))的连线与x
轴的交点x坐标;
●float root(float x1, float x2)用于求出 (x1,x2)区间的近似根。
要求使用的x1与x2的初始值分别为-10.5 和 20
#include
#include
float f(float x)
/*定义f函数,以实现f(x)=x3-5x2+16x-80 */
{
float y;
y=((x-5.0)*x+16.0)*x-80.0;
return (y);
}
float xpoint (float x1,float x2)
/*定义xpoint函数,求出弦与x轴交点*/
{
float y;
y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
return (y);
}
float root(float x1,float x2)
/* 定义root函数,求近似根 */ {
float x,y,y1;
y1=f(x1);
do
{
x=xpoint(x1,x2);
y=f(x);
if (y*y1>0) /*f(x)与f(x1)同符号 */
{
y1=y;
x1=x;
}
else x2=x;
}
while (fabs(y)>=0.0002);
return (x);
}
void main() /*主函数*/
{
float x1,x2,f1,f2,x;
do
{
printf("input x1,x2:\n");
scanf("%f,%f",&x1,&x2);
f1=f(x1);
f2=f(x2);
}
while(f1*f2>=0);
x=root(x1,x2);
printf("A root of equation is %8.4f\n",x);
}
5.最长单词
编写一个自己的函数,能够将一个字符串中最长的单词查找出来。
编写一个程序,功能是能够由键盘输入一行字符,并能调用自己编写的最长单词查找函数,输出这个单词。
#include
#include
char longest(intn,charstr[100])
{
char a[100][100],b[100]={"0"};
inti,j=0,k,max=0,m;
int length;
length=strlen(str);
for(k=0,i=0,j=0;i { a[j][k]=str[i]; if(str[i]=='') { if(max { max=k; for(m=0;m b[m]=a[j][m]; } j++; k=-1; continue; } } return(b[n]); } void main() { charstr[100],a[100]={"0"}; inti; gets(str); for(i=0;a[i]!='';i++) a[i]=longest(i,str); puts(a); } 6. 勒让德多项式 用递归思想求n 阶勒让德多项式的值,该多项式为: 121 0() 1 ((21)**()(1)*())/ 1 n n n n p x x n n x p x n p x n n --=? ? ==??--->? #include void main() { int p(intn,int x); intn,x,y; printf("please input n,x:"); scanf("%d,%d",&n,&x); if(n<0) { printf("error!please input n,x:"); scanf("%d,%d",&n,&x); } y=p(n,x); printf("y=%d\n",y); } int p(intn,int x) { int y; if(n==0)y=1; else if(n==1)y=x; else y=((2*n-1)*x*p(n-1,x)-(n-1)*p(n-2,x))/n; return(y); } 7.角夫猜想 日本数学家角夫提出了如下的猜想:任意一个自然数,比如奇数,将其乘以3再加1;如果是偶数将其除以2;反复运算。请大家编写程序,看会出现什么结果? 编写程序功能要求能够不停的输入自然数,遇到输入自然数0时,程序结束。如 ●输入:请输入自然数n:30 ●输出:自然数n按照角夫猜想运算规则变化的各次结果:15 46 23 70 35 106 53 160 80 40 20 10 5 16 8 。。。。。。(直到结果收敛,不再 变化) #include void main() { intn,y,i,k; int f(int x); for(i=0;;i++) { printf("please input n="); scanf("%d",&n); if(n==0)break; while(n!=1) { y=f(n); printf(" %d ",y); n=y; } printf("\n"); } } int f(int x) { int y; if(x%2==0)y=x/2; else if(x%2!=0)y=3*x+1; return(y); } 8.数学黑洞 任意一个4位自然数(除4个数字完全一样除外,例如4444、7777等),,将组成该数的各位数字重新排列,形成一个最大数和一个最小数,之后两数相减,其差仍然为一个自然数,重复上述运算,你会发现一个神秘数。 编写程序功能要求能够不停的输入自然数,遇到输入0时,程序结束。如 ●输入:请输入自然数n: 7754 ●输出:自然数n按照以上运算规则变化的各次规律:(7754,4577,3177)(7731, 1377,6534)(6543,3456,3087)(8730,0378,8352)(8532,2358,6174)。。。。。 (直到结果收敛,不再变化) #include #include void main() { intn,m,i,arr[3]={0}; void f(intx,intarr[3]); while(n!=0) { printf("please input n="); scanf("%d",&n); while((m-n)!=0) { m=n; f(n,arr); printf(" (%d,%d,%d) ",arr[0], arr[1], arr[2]); n=arr[2]; } printf("\n"); } } void f(intx,intarr[3]) { int m=0,n=0,i,j,t; int a[4]; for(i=0;i<=3;i++) a[i]=fmod(floor(x/pow(10,i)),10); for(i=0;i<=3;i++) { for(j=0;j<=3;j++) {