c语言第五次作业

更新时间:2023-10-09 15:18:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第五次作业:函数

1. 自然数的计算

编写自己的两个函数,分别求出两个整数的最大公约数和最小的公倍数。

编写一个程序,功能是能够由键盘输入两个整数,并能调用自己编写的函数,计算并输出这两个整数的最大公约数和最小公倍数。

程序代码:

#include void main() { intgreatest_common(intx,int y),lowest_common(intx,int y); inta,b,c,d; printf(\ scanf(\ c=greatest_common(a,b); d=lowest_common(a,b); printf(\最大公约数为%d,最小公倍数为%d\\n\}

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]={\ 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. 三角函数

请使用台劳级数编写自己的常用三角近似值计算函数,用于自己程序的调用。台劳级数为:

xx3x5x7sinx?????...

1!3!5!7!x0x2x4x6cosx?????...

1!2!4!6!舍去的值由自己定义一个最小值。

请用自己的函数计算下面两个表达式的值,并且与VC++提供的标准函数之间的误差进行比较。请输入结果。

?

y?1?cos?o,(??60) 2?

oy?2*sin2x?sinx?cosx-cos2x,(x?45)

#include #include void main() {

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(\ y3=sqrt((1-cos(a))/2); y4=sin(b)*(2*sin(b)+cos(b))-cos(b)*cos(b); printf(\}

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)=x

3

-5x2+16x-80=0的根。

要求使用和编写如下的函数:

32

? float f(float x)代表f(x)=x-5x+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(\scanf(\ f1=f(x1); f2=f(x2); } while(f1*f2>=0); x=root(x1,x2);

printf(\}

5. 最长单词

编写一个自己的函数,能够将一个字符串中最长的单词查找出来。 编写一个程序,功能是能够由键盘输入一行字符,并能调用自己编写的最长单词查找函数,输出这个单词。

#include #include

char longest(intn,charstr[100]) { char a[100][100],b[100]={\ inti,j=0,k,max=0,m; int length; length=strlen(str); for(k=0,i=0,j=0;i

k=-1; continue; } } return(b[n]); }

void main() { charstr[100],a[100]={\ inti; gets(str); for(i=0;a[i]!='';i++) a[i]=longest(i,str); puts(a); }

6. 勒让德多项式

用递归思想求n阶勒让德多项式的值,该多项式为:

1 n?0??pn(x)??x n?1?((2n?1)*x*p(x)?(n?1)*p(x))/n n?1n?1n?2?

#include void main() { }

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); int p(intn,int x); intn,x,y;

printf(\scanf(\if(n<0) { }

y=p(n,x);

printf(\

printf(\scanf(\

}

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(\ scanf(\ if(n==0)break; while(n!=1) { y=f(n); printf(\

n=y; } printf(\ } }

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(\ scanf(\ while((m-n)!=0) { m=n; f(n,arr); printf(\ n=arr[2]; } printf(\ } }

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++) { if(a[j]

9. 设计递归程序

任意给定输入的一个小写英文字符串a1a2a3…an-1an(n≥5) 输出:字符串Ana1An-1a2An-2a3…A2an-1A1an,其中Ai为ai的大写形式 例如,输入aybdx,则递归程序输出XaDyBbYdAx

#include #include void main() { void f(char a[20]); char a[20]; printf(\请输入字符串:\ gets(a); f(a); putchar('\\n'); }

void f(char a[20]) { char b[20]; int l,i; l=strlen(a); for (i=0;i<=l-1;i++) b[i]=a[l-i-1]-32;

}

for (i=0;i<=l-1;i++) printf(\

10. 成绩排名

期中考试快要结束了,老师需要进行年级成绩排名。排名的规则如下: ? 以期中考试的平均成绩为排名依据(满分为100分);

? 对学生A,如果一共有K个学生的平均成绩比A的平均成绩高,则学生A的年级排

名为K+1;

? 如果学生A和学生B的平均成绩相同,则他们的排名相同。 要求编写几个函数,分别实现以下的功能:

? 函数1:输入N个同学的学号、姓名、平均成绩

? 函数2:按平均成绩由大到小的顺序进行排序,学号、姓名也随之调整,并请按照

上述规则进行排名

? 函数3:输入一个同学的学号,能够用折半查找法找出该同学的姓名、平均成绩、

排名等信息

编写一个程序来使用验证上述函数。 ? 输入、输出格式要求:

(1) 第一行为一个整数N(1 < N <200),表示学生的人数。随后有N行,每

行有两个非负整数和字符串描述一个学生的信息,依次为学号、姓名和平均成绩。

(2) 随机输入一个同学的学号,请输出这个同学的姓名、平均成绩、排名等信

息。如果学号不存在,输出错误提示信息。

(3) 输入 学号0000000000 时,程序退出。

#include

void input(int n,int number[200],char name[200][10],int grade[200]) { int i; for(i=0;i

void rank(int n,int number[200],char name[200][10],int grade[200],int r[200]) { int i,j,k,t; for(i=0;i

void find(int n,int number[200],char name[200][10],int grade[200],int r[200]) { int x,i,j,k,t; for(i=0;i

k=i; for(j=i;jnumber[k]) j=k-1; else i=k+1; } if(t

void main()

{ }

char name[200][10];

int n,i,number[200],grade[200],r[200];

printf(\scanf(\

printf(\input(n,number,name,grade); rank(n,number,name,grade,r); find(n,number,name,grade,r);

11. 日历计算

请使用已学的知识来编写一个自己的日历计算程序。功能要求任意输入一个日期(年、月、日),请输出该日期为该年度的第几天、第几周、星期几。

请不要使用VC 环境提供的日期计算函数。 已知公元1年1月1日为星期一。 #include

int monthday[12]={31,28,31,30,31,30,31,31,30,31,30,31}; void time(int a,int b,int c,int d[3]) { int date=0,week,week1=0,week2=0,weekday=0; int i,year,totalday1=0,totalday2; //计算第几天 if (b==1)date=c; else if (b>=2) {

for (i=0;i<=b-2;i++) date+=monthday[i]; date=date+c; } if((b>2)&&((a%4==0)&&(a0!=0)||(a@0==0))) date++;

//计算到上一年末有多少天 for(year=1;year

void main() { int i,year,month,day,d[3]; for(i=0;i<=5;i++) { printf(\ scanf(\ time(year,month,day,d); printf(\第%d天,第%d周,星期%d\\n\ } }

(以下为选作题,请用递归思想尝试编写程序)

12. 分书问题

有编号分别为1,2,3,4,5的五本书,准备分给A,B,C,D,E五个人,每个人阅读兴趣用一个二维数组加以描述:

?1 i喜欢j书 like[i][j]??

0 i不喜欢j书?希望你写一个程序,输出所有分书方案,让人人皆大欢喜。假定5个人对5本书的阅读兴

趣如下表:

人人人人人书A B C D E 0 0 1 0 0 0 书1 0 1 1 0 1 书2 1 0 1 0 0 书3 1 0 0 1 0 书4 0 1 1 0 1

1、定义一个整型的二维数组,将上表中的阅读喜好 用初始化的方法赋给这个二维数组。

可定义:(为了方便,数组第0行、第0列不用) int Like[6][6] = {{0}, {0, 0,0,1,1,0},

{0, 1,1,0,0,1}, {0, 0,1,1,0,1},

{0, 0,0,0,1,0},

{0, 0,1,0,0,1}};

2、定义一个整型一维数组BookFlag[6]用来记录书是否已被选用。用后五个下标作为五本书的标号,被选用的元素值为1, 未被选用的值为0, 初始化皆为0. intBookFlag[6] = {0};

3、定义一个整型一维数组BookTaken[6]用来记录每一个人选用了哪一本书。用数组元素的下标来作为人的标号,用数组元素的值来表示书号。如果某个人还没有选好书,则相应的元素值为0。初始化时,所有的元素值均为0。 intBookTaken[6] = {0};

4、循环变量i表示人,j 表示书,i, j ? {1, 2, 3, 4, 5}

#include void person(int i);

int Like[6][6]={{0},{0,0,0,1,1,0},

{0, 1, 1, 0, 0, 1}, {0, 0, 1, 1, 0, 1},

{0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1}}; int BookFlag[6]={0}; int BookTaken[6]={0}; void main() { person(1); }

void person(int i) { int j,k;

for(j=1;j<=5;j++) {

if((BookFlag[j]!=0)||(Like[i][j]==0)) continue; BookTaken[i]=j; BookFlag[j]=1; if(i==5) {

for(k=1;k<=5;k++) printf(\ printf(\ } else {

person(i+1); }

BookTaken[i]=0; BookFlag[j]=0;

} }

本文来源:https://www.bwwdw.com/article/2r9f.html

Top