函数一 2018年11月10日

以下内容仅供娱乐,欢迎随时探讨,请多指教
2018年11月10日
函数(一)
1、写一个求阶乘的函数,在主函数输入一个整数,并输出该整数的阶乘。

#include <stdio.h>
int fact(int n)
{
    int i,fact=1;
    for(i=1;i<=n;i++)
    {
        fact*=i;
    }
    return fact;
}
int main()
{
	int n;
	printf("input n\n");
    scanf("%d",&n);
    printf("%d",fact(n));
    return 0;
}

2、用一个函数求一元二次方程(a,b,c三个系数)的根(提示可能:实根、等根、虚根),并输出结果。从主函数中输入a,b,c的值。

#include"math.h"
#include"stdio.h"
void root(double a,double b,double c)
{
    double d;
    int n;
    d=sqrt(b*b-4*a*c);
    n=(int)d;
    if(n>0)
        printf("%lf\t%lf\n",(-b+d/(2*a)),(-b-d/(2*a)));
    else if(n == 0)
    printf("%lf\n",-(b/(2*a)));
    else if(n<0)
        printf("实部%lf虚部%lf\n实部%lf虚部%lf\n"
                ,-b/(2*a),-d/(2*a),-b/(2*a),-d/(2*a));
}
int main()
{
    double a,b,c;
    printf("请输入3个数a,b,c(形如ax*x+bx+c=0)\n");
    //ax*x+bx+c=0,注意数学求解方法
    scanf("%lf%lf%lf",&a,&b,&c);
    root(a,b,c);
    return 0;
}

3、用一个函数完成四则运算中的四种运算,从主函数中输入两个整数以及运算符,并输出运算之后的结果。

#include"stdio.h"
#include"math.h"
int caculate(double s1,char a,double s2)
{
    double s;
    switch(a)
   {
       case '+':s=s1+s2;break;
       case '-':s=s1-s2;break;
       case '*':s=s1*s2;break;
       case '/':if(fabs(s2) <= 1e-6)printf("Wrong input!\n");
                else s=s1/s2;
                break;
       default:printf("Wrong input!\n");break;
    }
    return s;
}
int main()
{
    double s1,s2,s;
    char a;
    printf("输入表达式的值"
      "(表达式的格式为:s1 $ s2,"
      " s1和s2是两个实数)\n");
    scanf("%lf%c%lf",&s1,&a,&s2);
    s=caculate(s1,a,s2);
    printf("结果是:%.2lf",s);
    return 0;
}

4、写一个判断闰年的函数,在主函数输入一个年份,并输出是否是闰年的信息。

#include <stdio.h>
void ask(int year)
{
    (year%4==0&&year%100!=0)||(year%400==0)?printf("Yes\n"):printf("No\n");
}
int main()
{
    int year;
    printf("请输入年份\n");
    scanf("%d",&year);
    ask(year);
    return 0;
}

5、写一个求圆面积的函数,在主函数输入圆的半径,并输出圆的面积。

#include <stdio.h>
#define pi 3.1415926
double  s(double r)
{
    double s;
    s=pi*r*r;
    return s;
}
int main()
{
    double r;
    printf("请输入半径\n");
    scanf("%lf",&r);
    printf("面积是%.3lf\n",s(r));
    return 0;
}

6、猴子吃桃问题, 小猴摘了很多桃子,第一天吃了一半又多吃一个,第二天又吃掉余下的一半再多吃一个,以后每天早上都吃了前一天剩下的一半零一个。如此下去,到第十天只剩一个桃子可以吃。写一个求第x天剩余的桃子个数的函数。从主函数中输入具体的x值,并输出相应的桃子个数。

#include <stdio.h>
int fun(int x)
{
    int i,sum=1;
    for(i=0;i<10-x;i++)
        sum=(sum+1)*2;
    return sum;
}
int main()
{
    int x;
    printf("请输入天数(1--10)\n");
    scanf("%d",&x);
    printf("number=%d\n",fun(x));
    return 0;
}
/*递归法*/
#include<stdio.h>
int fun(int n)
{
    if(n==1)return 1;
    return (fun(n-1)+1)*2;
}
int main()
{
    int n;
    printf("input n\n");
    scanf("%d",&n);
    printf("%d\n",fun(n));
    return 0;
}

7、m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平均分的人数作为函数值返回,将低于平均分的分数放在below所指定的函数中。
函数接口如下:int fun(int score[],int m,int below[])

#include <stdio.h>
int fun(int score[],int m,int below[]);
void input(int score[],int m);
int main()
{
	int score[1000],n,below[1000];
	printf("input your number of people\n");
	scanf("%d",&n);
	input(score,n);
	fun(score,n,below);
	return 0;
}
int fun(int score[],int m,int below[])
{
	int i=0,sum,k=0;;
	for(i=0,sum=0; i<m; i++)
		sum+=score[i];
	for(i=0; i<m; i++)
		if(score[i]<1.0*sum/m) {
			below[k++]=score[i];
		}
	for(i=0; i<k; i++)
		printf(" %d ",below[i]);
	return *below;
}
void input(int score[],int m)
{
	int i=0;
	printf("input your scores\n");
	for(i=0; i<m; i++)
		scanf("%d",score+i);
}

8、请编写函数void fun(int x,int pp[],int *n),它的功能是:求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回。
函数接口如下:void fun(int x, int pp[ ], int *n)

#include <stdio.h>

void fun(int x, int pp[ ], int *n)
{
    int j=0,i;
    for(i=1;i<=x;i+=2){
        if(x%i == 0)pp[j++]=i;
    }
    *n=j;
    for(i=0;i < j;i++)
        printf(" %d ",pp[i]);
    printf("\n");
}
int main()
{
    int x,pp[100],n;
    printf("input x\n");
    scanf("%d",&x);
    fun(x,pp,&n);
    printf("numbers=%d\n",n);
    return 0;
}

9、请编写一个函数void fun(char *tt,int pp[]),统计在tt字符中"a"到"z"26个字母各自出现的次数,并依次放在pp所指的数组中。
函数接口如下:void fun(char *tt, int pp[])

#include "stdio.h"
void fun(char *tt,int pp[]);
int main()
{
	char tt[1000];
	int pp[1000];
	printf("input your strings\n");
	gets(tt);
	fun(tt,pp);
}
void fun(char *tt,int pp[])
{
	int i,count=0;
	for(i=0; tt[i] != '\0'; i++)
		if(tt[i]>='a' && tt[i]<='z')pp[count++]=tt[i];
	for(i=0; i<count; i++)
		printf(" %d ",pp[i]);
	printf("\n");
	printf("ammount=%d\n",count);
}

10、请编写一个函数void fun(int m,int k,int xx[]),该函数的功能是:将大于整数m且紧靠m的k个素数存入xx所指的数组中。
函数接口如下:void fun(int m, int k, int xx[])

#include<stdio.h>

void fun(int m,int k,int xx[])
{
	int i,j,n;
	for(i=m+1,n=0; n<k; i++) {
		for(j=2; j<i; j++)
			if(i%j == 0)
				break;
		if(j>=i)
			xx[n++]=i;
	}
}
void main()
{
	int k,m,zz[100];
	printf("Please enter two integers:\n");
	scanf("%d%d",&m,&k);
	fun(m,k,zz);
	for(m=0; m<k; m++)
		printf(" %d ",zz[m]);
	printf("\n");
}

11、写一个逆序存放字符串的函数,在主函数中输入字符串,并输出逆序后的字符串。

#include <stdio.h>
void traverse(char str[])
{
	int i,j;
	char x;
	for(i=0; str[i]!='\0'; i++)
		for(j=0; j<i; j++)
			x=str[i],str[i]=str[j],str[j]=x;
	puts(str);
}
int main()
{
	char str[1000];
	printf("input strings\n");
	gets(str);
	traverse(str);
	return 0;
}

12、利用递归函数调用方式,将主函数所输入的5个字符,以逆序打印输出。

#include"stdio.h"
void fun(int n);
int main()
{
	printf("please input 5 strings:\n");
	fun(5);
	return 0;
}
void fun(int n)
{
	char next;
	if(n <= 1)
	{
		next = getchar();
		putchar(next);
	}
	else
	{
		next = getchar();
		fun(n-1);
		putchar(next);
	}
}

13、编写函数fun,它的功能是:求出1到100之内能被7或者11整除,但不能同时被7和11整除的所有整数,并将他们保存在数组中,并统计这些数的个数。在主函数中输出这些数以及个数。

#include "stdio.h"
int fun(int pp[])
{
	int i,count=0;
	for(i=1; i<100; i++)
		if(i%7==0||i%11==0)pp[count++]=i;
		return count;
}
int main()
{
	int pp[100],i;
	for(i=0; i<fun(pp); i++)
		printf("%d\t",pp[i]);
		return 0;
}

14、编写一个函数,实现在一个已经排好序的数组中插入一个数。在主函数中输入有序的数组,以及待插入的数,并输出插入该数之后的数组。

#include <stdio.h>
void fun(int k,int a[],int pos)
{
	int i,j;
	a[pos] = k;
	for(i = 0 ; i < pos+1 ; i++)
		for(j = 0 ; j < pos+1 ; j++) {
			int temp;
			if(a[i] < a[j]) {
				temp = a[i];
				a[i] = a[j];
				a[j] = temp;
			}
		}
	printf("then are :\n");
	for(i = 0 ; i < pos+1 ; i++)
		printf("%5d",a[i]);
	printf("\n");
}
int main()
{
	int a[100] = {1,2,3,4,5};
	int i,k,pos=5;
	for(i = 0 ; i < 5 ; i++)
		printf("%5d",a[i]);
	printf("\n");
	printf("please input your numbers(0 end)\n");
	do {
		scanf("%d",&k);
		fun(k,a,pos);
		pos++;
	} while(k);
	return 0;
}

15、编写一个函数,实现一个二维数组的行列互换即矩阵的转置。在主函数中输入矩阵,并输出转置后的矩阵。

#include <stdio.h>
void swap(int a[][100],int b[][100],int m,int n)
{
	int i,k;
	for(i=0; i<m; i++)
		for(k=0; k<n; k++)
			b[k][i]=a[i][k];//转置
}
int main()
{
	int a[100][100];
	int b[100][100];
	int i,k,m,n;
	printf("请输入矩阵大小m,n\n");
	scanf("%d%d",&m,&n);
	printf("请输入%d*%d矩阵\n",m,n);
	for(i=0; i<m; i++)
		for(k=0; k<n; k++)
			scanf("%d",&a[i][k]);
	printf("原来的的是:\n");
	for(i=0; i<m; i++) {
		for(k=0; k<n; k++)
			printf("%5d",a[i][k]);
		printf("\n");
	}
	swap(a,b,m,n);
	printf("变化后的是:\n");
	for(i=0; i<n; i++) {
		for(k=0; k<m; k++)
			printf("%5d",b[i][k]);
		printf("\n");
	}
	return 0;
}

16、猴子吃桃问题, 小猴摘了很多桃子,第一天吃了一半又多吃一个,第二天又吃掉余下的一半再多吃一个,以后每天早上都吃了前一天剩下的一半零一个。如此下去,到第十天只剩一个桃子可以吃。写一个求从第1天到第10天剩余的桃子数目的函数(这十个值放入一维数组中)。在主函数中输出这十天的桃子个数。

#include <stdio.h>

int fun(int n)
{
	if(1 == n)return 1;
	else return (fun(n-1)+1)*2;
}
int main()
{
	int i,a[10];
	for(i=0; i<10 ; i++) {
		a[i]=fun(i+1);
		printf("day%d:%d\n",10-i,a[i]);
	}
	return 0;
}

17、请编写一个函数void fun(char a[],char b[],int n),其功能是:删除一个字符串中指定下标的字符。其中,a指向原字符串,删除后的字符串存放在b所指的数组中,n中存放指定的下标。
函数接口如下:void fun(char a[],char b[], int n)

#include <stdio.h>

void fun(char a[],char b[], int n)
{
	int i;
	b[n]=a[n];
	for(i=n; a[i] != '\0'; i++) {
		a[i]=a[i+1];//覆盖删除
	}
	for(i=0; a[i] != '\0'; i++)
		printf("%c",a[i]);
	printf("\n");
}
int main()
{
	char a[1000],b[10];
	int n;
	printf("input strings\n");
	gets(a);
	do {
		printf("input postion(- end)\n");
		scanf("%d",&n);
		fun(a,b,n-1);
	} while(n >= 0);
	return 0;
}

18、请编写一个函数int fun(int *s,int t,int *k),将s数组中的最大元素的下标存放在k所指的储存单元中。
函数接口如下:void fun (int *s, int t, int *k)

#include <stdio.h>

void fun(int *s,int t,int *k)
{
	int i;
	for(i=0; i<t-1 ; i++) {
		if(s[i]>s[i+1])*k=i;
		else *k=i+1; 
	}
}
int main()
{
	int i,s[111],t,k=1;
	printf("input ammount\n");
	scanf("%d",&t);
	printf("input %d numbers\n",t);
	for(i=0; i<t ; i++) {
		scanf("%d",s+i);
	}
	fun(s,t,&k);
	printf("postion=%d\n",k=1);
	return 0;
}

19、写一个判断素数的函数,在主函数输入一个整数,并输出是否素数的信息

#include"stdio.h"
#include"math.h"
int fun(int x)
{
	int i;
	for(i=2;i <= sqrt(x);i++){
		if(x%i==0)return 0;
	}
	return 1;
}
int main()
{
	int x;
	printf("input your number\n");
	scanf("%d",&x);
	if(fun(x)==0)printf("不是素数\n");
	else printf("是素数\n");
	return 0;
}

20、写两个函数,分别求两个正数的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果。两个正数由键盘输入。

#include"stdio.h"
#include"math.h"
int fun1(int a,int b)
{
	while(b) {
		a=a%b,b=b%a;
	}
	return a;
}
int fun2(int a,int b)
{
	int c;
	c=a*b/fun1(a,b);
}
int main()
{
	int a,b,t;
	printf("input two numbers\n");
	scanf("%d%d",&a,&b);
	if(a<b)t=a,a=b,b=t;
	printf("最大公约数%d\n最小公倍数%d\n",fun1(a,b),fun2(a,b));
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43310774/article/details/83929487