Skip to content

Latest commit

 

History

History
463 lines (374 loc) · 10.8 KB

[题解]四、函数.md

File metadata and controls

463 lines (374 loc) · 10.8 KB

四、函数

程序片段编程题

实验04-1:求一组数中奇数的和

【问题描述】输入一批正整数,以零或复数为结束标记,求其中所有奇数的和。要求定义和调用函数$even(n)$​判断整数的奇偶性,当$n$​为偶数时返回$1$,否则返回零。 根据程序中的提示,在对应位置编写相关函数及内容。

#include<stdio.h>
//在此处编写函数代码
int even(int n){
    
}
int main(){
	int sum=0,x;
	scanf("%d",&x);
	while(x>0){
		if(even(x)==0)
			sum=sum+x;
		scanf("%d",&x);
	}
	printf("sum=%d\n",sum);
	return 0;
}
int even(int n){
	if(n%2==0)
		return 1;
	else
		return 0;
}

实验04-2:使用函数计算两点间的距离

【问题描述】给定平面上任意两点坐标$(x1,y1)$​和$(x2,y2)$​,求这两点之间的距离(保留两位小数)。要求定义和调用函数$dist(x1,y1,x2,y2)$计算两点间的距离。 根据程序中的提示,在对应位置编写相关函数及内容。

#include<stdio.h>
#include<math.h>
//在此处编写dist函数
double dist(float x1,float y1,float x2,float y2){

}
int main(){
	float xs,ys,xe,ye,d;
	scanf("%f%f",&xs,&ys);
	scanf("%f%f",&xe,&ye);
	d=dist(xs,ys,xe,ye);
	printf("Distance=%.2f",d);
	return 0;
}
double dist(float x1,float y1,float x2,float y2){
	double Distance=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
return Distance;
}

实验04-3:使用函数计算素数并求和

【问题描述】输入两个正整数$m$和$n(m<=1,n<=500)$,统计并输出$m$和$n$之间的素数个数以及这些素数的和。注意:$1$​不是素数,要求定义并调用函数$prime(m)$​判断$m$​是否为素数,当$m$为素数是返回$1$​,否则返回$0$。根据程序中的提示,在对应位置编写相关函数及内容。

#include<stdio.h>
//在此处添加函数声明

int main(){
	int m,n,ct=0,sum=0,i;
	scanf("%d%d",&m,&n);
	if(m<2) m=2;
	for(i=m;i<=n;i++)
		if(prime(i)){
			ct++;
			sum=sum+i;
		}
	printf("count=%d,sum=%d\n",ct,sum);
	return 0;
}
int prime(int m){
//在此处编写函数
}
int prime(int m){
	int i=2;
	for(i;i<m;i++){
	    if(m%i==0)
	    break;            
	}
    	if(i==m)
    	    return 1;
    	else
    	    return 0;
}

实验04-4:使用函数统计指定数字个数

【问题描述】输入一个整数$m$,再输入一个数字$n$,统计该整数中一共包含了几个数字$n$。输出统计结果。要求定义并调用函数$countdigit(number,digit)$​,它的功能是统计整数$number$​中数字$digit$的个数。根据程序中的提示,在对应位置编写相关函数及内容。

#include<stdio.h>//根据题意,在此处编写函数代码int countdigit(int number,int digit){	}int main(){	int n,d,y;	scanf("%d%d",&n,&d);	y=countdigit(n,d);	printf("Number of digit %d:%d",d,y);	return 0;}
int countdigit(int number,int digit){
	int sum=0;
	while(number!=0){
		if(number%10==digit)
			sum++;
		number=number/10;	
	}
	return sum;	
}

实验04-5:使用函数求余弦函数的近似值

【问题描述】输入精度e,用公式就$cos(x)$的近似值,精确到最后一项的绝对值小于$e$。 求$cos(x)$的公式:$cos(x)=x^0/0! -x^2/2!+x^/4!-x^6/6!+……$​​ 要求定义和调用函数$funcos(e,x)$求余弦函数的值。

#include<stdio.h>
#include<math.h>
//在此处编写要求的函数
double funcos(double e,double x){
	
}
int main(){
	double e,x,rz;
	scanf("%lf%lf",&e,&x);
	rz=funcos(e,x);
	printf("sum=%lf",rz);
	return 0;
}
double funcos(double e,double x){
	double cosx=0,i=0,k=0,a=1,j=1;
	while(fabs(a)>=e) {
		double b=1;
		for (j=1;j<=i;j++)
			b=b*j;
		a=pow(x,i)*pow(-1,k++)/b;
		cosx=cosx+a;
		i=i+2;
		
	}
	return cosx;
}

编程题

实验04-6:统计字符串中各类字符个数

【问题描述】输入一行字符,统计其中英文字母、空格、数字和其他字符的个数。 【输入形式】输入一行字符。 【输出形式】输出各类字符串的个数。 【样例输入1】

Programming is fun!

【样例输出】

letter=16,blank=2,digit=0,other=1

【样例输入2】

13 is a luck digit

【样例输出】

letter=12,blank=4,digit=2,other=0

【样例说明】输入的数据之间以一个空格相隔。英文字母区分大小写。必须严格按样例输入输出。

#include<stdio.h>
int main(){
	char ch;
	int letter=0,blank=0,digit=0,other=0;
	while((ch=getchar())&&ch!='\n'){
		if ((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
			letter++;
		else if	(ch>='0'&&ch<='9')
			digit++;
		else if (ch==' ')
			blank++;
		else
			other++;
	}
	printf("letter=%d,blank=%d,digit=%d,other=%d",letter,blank,digit,other);
}

实验04-7:编程题,输出m ~n 之间所有的Fibonacci 数

【问题描述】 输入$2$​​​个正整数m和$n(m<1,n<=10 000)$​​​​,输出$m-n$​​​ 之间所有的$Fibonacci$​​数。$Fibonacci$​​数列(第一项起):$1,1,2,3,5,8,13,21,$​​…。要求定义并调用函数$fib(n)$​​,它的功能是返回第$n$​项$Fibonacci$​ 数。例如,$fib(7)$​的返回值是13。 【输入形式】从键盘输入$2$​个整数$m$​和$n$​​。 【输出形式】输出$m-n$​之间所有的$Fibonacci$ 数。 【样例输入1】

Input m: 20
Input n: 100

【样例输出1】

21 34 55 89

【样例输入2】

Input m: 50
Input n: 300

【样例输出2】

55 89 144 233

【样例说明】 输入提示符后要加一个空格。例如$Input integers:$​,其中:后要加一个且只能一个空格。输出数据之间有且仅有一个空格。英文字母区分大小写。必须严格按样例输入输出。

#include<stdio.h>
int fib(int n);
int main()
{
	int m,n;
	printf("Input m: ");
	scanf("%d",&m);
	printf("Input n: ");
	scanf("%d",&n);
	int i;
    for(i=1;i<100;i++){
        if(fib(i)>=m&&fib(i)<=n)
            printf("%d ",fib(i));
    }
    return 0;
}
int fib(int n){
	int i,x1=1,x2=1,x;
	if(n == 1 || n == 2){
		return 1;
	}else{
	  	for(i = 3; i <= n; i++){
			x = x1+x2;
			x1 = x2;
			x2 = x;
	  	}
		return x;
	}
}

实验04-8:求m~n 之间的所有完数

【问题描述】输入$2$​​ 个正整数$m$​​ 和$n(m>=1,n>=1 000)$​​,输出$m -n$​​ 之间的所有完数,完数就是因子和与它本身相等的数。要求定义并调用函数$factorsum(number)$​,它的功能是返回$number$ 的因子和。 例如,$factorsum(12)$​的返回值是$16(1 +2 +3 +4 +6)$​​。 【输入输出样例1】 (加粗部分为键盘输入,其余部分为程序输出)

Input m: <u>1</u>Input n: <u>100</u>1    6   28        (输出格式控制符为:%5d)  

【输入输出样例2】 (下划线部分为键盘输入,其余部分为程序输出)

Input m: <u>1</u>
Input n: <u>500</u>
1    6   28  496   (输出格式控制符为:%5d)

【样例说明】输入提示符后要加一个空格。例如"$Input m:$​ ",其中":"后要加一个且只能一个空格。英文字母区分大小写。必须严格按样例输入输出。

#include<stdio.h>
int factorsum(int a);
int main(){
	int m,n;
		printf("Input m: ");
		scanf("%d",&m);
		printf("Input n: ");
		scanf("%d",&n);
	for(;m<=n;m++){
		if(factorsum(m)!=0)
		printf("%5d",factorsum(m));
	}
}
int factorsum(int number){
	if(number == 1)
		return 1;
	int i,sum = 0;
	for(i = 1; i < number/2+1; i++){
		if(number % i == 0)
			sum+=i;
	} 
	if(sum == number)
		return sum;
	return 0;
}

实验04-9:求两个正整数之间的水仙花数

【问题描述】输入$2$​​​ 个正整数$m$​​​ 和$n(1<m,n<1000)$​​​​​,输出$m-n$​​之间的所有水仙花数。水仙花数是指各位数字的立方和等于其自身的数。要求定义并调用函数$is(number)$​判断$number$​​的各位数字之立方和是否等于其自身。 【输入形式】输入$2$​个正整数$m$​​ 和$n(1<m,n>1000)$​​ 【输入输出样例1】 (下划线部分表示输入)

Input m: <u>100</u>
Input n: <u>400</u>
153
370
371

【样例说明】 输入提示符后要加一个空格。例如$Input m:$​ ,其中:后要加一个且只能一个空格。英文字母区分大小写。必须严格按样例输入输出。

#include<stdio.h>
int is (int m,int n){
	int a,b,c,i;
	for (i=m;i<=n;i++){
			a=i/100;
			b=(i%100)/10;
			c=i%10;
		if (i==a*a*a+b*b*b+c*c*c)
			printf("%d\n",i);
	}
	return 0;
}
int main(){
	int m,n;
		printf("Input m: ");
		scanf("%d",&m);
		printf("Input n: ");
		scanf("%d",&n);
	is(m,n);
}

实验04-10:验证歌德巴赫猜想

【问题描述】任何一个大于$6$的偶数均可表示为$2$个素数之和。例如$6=3+3,8=3+5$​,...,$18=5+13$。将$6-100$之间的偶数都表示成$2$个素数之和,打印时一行打印5组。素数就是只能被1和自身整除的正整数,最小的素数是2。要求定义并调用函数$prime(m)$判断$m$​是否为素数,当$m$​为素数时返回$1$​,否则返回$0$​​。 【输入形式】无输入 【输出形式】按从小到大、每组五行。每组的格式为:%4d=%2d+%2d, 等号和加号两侧无空格。

#include<stdio.h>
int prime(int m);
int main(){
	for(int m=6;m<=100;m+=2) {
		for(int i=3;i<=m/2;i++) {
			if(prime(i)==1&&prime(m-i)==1){
				printf("%4d=%2d+%2d",m,i,m-i);
				if ((m-4)%10==0)
					printf("\n");
				break;
			}
		}
	}
}
int prime(int m){
	if(m==1)
		return 0;
	int i=2;
	for(i;i<m;i++){
    	if(m%i==0)
    		break;
	}
    if(i==m)
        return 1;
    else
    	return 0;
}

实验04-11:求$a +aa +aaa +aa…a$($n$ 个$a$) 之和

【问题描述】输入2个正整数a和n,求a+aa+aaa+aa...a(n个a)之和。例如,输入2和3,输出246(2+22+222)。 【输入形式】从键盘输入正整数a和正整数n。 [输入输出样例1]】(下划线部分表示输入)

Input a, n:

8 5
s=98760

【样例说明】输入提示符后要加一个空格。其中":"后要加一个且只能一个空格。输出语句的"="两边无空格。英文字母区分大小写。必须严格按样例输入输出。

#include<stdio.h>
#include<math.h>
int fn(int a,int n){
	int i=0,j=0,sum_1=0,sum_2=0;
	for (j;j<n;j++){
		sum_2=sum_2+a*pow(10,j);
		sum_1=sum_1+sum_2;
	}
	return sum_1;
}
int main(){
	int a,n;
	printf("Input a, n: ");
	scanf("%d%d",&a,&n);
	printf("s=%d",fn(a,n));
}