函数一

1、写一个求阶乘的函数,在主函数输入一个整数,并输出该整数的阶乘。

//
//功能描述     :阶乘
//返回值       :void
//编写日期     :2018年11月24日
//
#include "stdio.h"
long double jiecheng(long double n)
{
 if (n==1||n==0)
 {
  return 1;
 }
 else 
 {
  return n*jiecheng(n-1);
 }
}
void main()
{
    long double n,m;
 printf("请输入需要求的阶乘\n");
 scanf("%lf",&n);
 m=jiecheng(n);
 printf("%.0lf的阶乘为%.0lf\n",n,m);
}

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

//
//功能描述     :求根
//返回值       :void
//编写日期     :2018年11月24日
//
#include "stdio.h"
#include "math.h"
void qiugen(int a,int b,int c,double *m,double *n)
{
 *m=(-b+sqrt(b*b-4*a*c))/(2*a);
 *n=(-b-sqrt(b*b-4*a*c))/(2*a);
}
void output(double *m,double *n)
{
 if (*m==*n)
 {
  printf("有两个等根为 %lf\n",*m);
 }
 else 
 {
  printf("两个不同的根为%.0lf %.0lf\n",*m,*n);
 }
}
void main()
{
 int a,b,c;
 double x1,x2;
 printf("请依序输入x二次方的系数,x一次方的系数和常数项\n");
    scanf("%d%d%d",&a,&b,&c);
 if (b*b-4*a*c<0)
 {
  printf("此方程有两个虚根\n");
 }
 else
 {
  qiugen(a,b,c,&x1,&x2);
  output(&x1,&x2);
 }
}

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

//
//功能描述     :四则运算
//返回值       :void
//编写日期     :2018年11月26日
//
#include "stdio.h"
long double yunsuan(double a,char b,double c)
{
 long double i;
 switch (b)
 {
 case '+': i=a+c; break;
 case '-': i=a-c; break;
    case '*': i=a*c; break;
 case '/': i=a/c; break;
 }
  return i;
}
void main()
{
 double a,c;
 char b;
 printf("请输入表达式\n");
 scanf("%lf%c%lf",&a,&b,&c);
 printf("%lf%c%lf=%lf",a,b,c,yunsuan(a,b,c));
}

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

//
//功能描述     :判断闰年
//返回值       :void
//编写日期     :2018年11月24日
//
#include "stdio.h"
void panduan (int year,int *m)
{
 if (( year % 4 == 0 && year % 100 != 0 )||year % 400 == 0 )
 {
  *m = 1;
 }
 else 
  *m = 0;
}
void main()
{
 int year ,n;
 printf("请输入年份\n");
 scanf("%d",&year);
 panduan(year ,&n);
 if ( n == 1 )
 {
  printf("%d是闰年\n",year);
 }
 else
 {
  printf("%d不是闰年\n",year);
 }
}

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

//
//功能描述     :圆的面积
//返回值       :void
//编写日期     :2018年11月24日
//
#include "stdio.h"
#define m 3.1415926
void syuan(double r,long double *s)
{
 *s = m * r * r;
}
void main()
{
 double r;
 long double n;
 printf("请输入圆的半径\n");
 scanf("%lf",&r);
 syuan(r,&n);
 printf("圆的面积为%lf\n",n);
}

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

//
//功能描述     :有多少桃子
//返回值       :void
//编写日期     :2018年11月24日
//
#include "stdio.h"
int houzi(int n)
{
 int i = 1;
 if (n == 9||n==10)
 {
  return 1;
 }
 else 
  return  2 * ( houzi (n+1) + 1 );
}
void main()
{
 int m;
 printf("请输入需要求第几天的桃子数\n");
 scanf("%d",&m);
 while (m>10)
 {
  printf( "错误输入请重新输入\n");
  scanf("%d",&m);
 }
    printf("%d\n",houzi (m));
}

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

函数接口如下:int fun(int score[],int m,int below[])

//
//功能描述     :求低于平均分的人数和分数
//返回值       :void
//编写日期     :2018年11月24日
//
#include "stdio.h"
int fun(int *score,int m,int *below)
{
 double sum=0,aver;
 int i,j=0;
 for (i=0;(score+i)<=(score+m-1);i++)
 {
  sum+=*(score+i);
 }
 aver=sum/m;
 for (i=0;(score+i)<=(score+m-1);i++)
 {
  if (*(score+i)<aver)
  {
   *(below+j)=*(score+i);
   j++;
  }
 }
 return j;
}
void main()
{
 int score[200],m,below[200],i,l;
 printf("请输入需要输入多少个人的成绩\n");
 scanf("%d",&m);
 printf("请输入他们的成绩\n");
 for (i=0;i<m;i++)
 {
  scanf("%d",score+i);
 }
 l=fun (score,m,below);
 printf("低于平均分的人数为%d人\n",l);
 printf("低于平均分的分数为\n");
 for (i=0;i<l;i++)
 {
  printf("%-3d",*(below+i));
 }
 printf("\n");
}

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

函数接口如下:void fun(int x, int pp[ ], int *n)

//
//功能描述     :求奇数可以整除一个数的数
//返回值       :void
//编写日期     :2018年11月24日
//
#include "stdio.h"
void fun(int x,int *pp,int *n)
{
 int i,j=0;
 for (i=1;i<=x;i+=2)
 {
  if (x%i==0)
  {
   *(pp+j)=i;
   j++;
  }
 }
 *n=j;
}
void main()
{
 int x,pp[100],n,i;
 printf("请输入一个数\n");
 scanf("%d",&x);
 fun (x,pp,&n);
 printf("这些奇数可以整除%d\n",x);
 for (i=0;i<n;i++)
 {
  printf("%-3d",*(pp+i));
 }
 printf("\n");
}

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

函数接口如下:void fun(char *tt, int pp[])

//
//功能描述     :求字母a到z的个数
//返回值       :void
//编写日期     :2018年11月24日
//
#include "stdio.h"
void fun(char *tt,int *pp)
{
 int i;
 for (i=0;*(tt+i);i++)
 {
  if (*(tt+i)>='a'&&*(tt+i)<='z')
  {
   (*(pp+*(tt+i)-'a'))++;
  }
 }
}
void main()
{
 char tt[200];
 int pp[26]={0},i;
 printf("请输入字符串\n");
 gets(tt);
 fun (tt,pp);
 printf("字母a到z的个数依次为\n");
 for (i=0;i<26;i++)
 {
  printf("%-3d",*(pp+i));
 }
 printf("\n");
}

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

//
//功能描述     :求大于一个整数的素数
//返回值       :void
//编写日期     :2018年11月24日
//
#include "stdio.h"
void fun(int m, int k, int *xx)
{
 int i,p,j=0;
 for (i=m+1;j<k;i++)
 {
  for (p=2;p<i;p++)
  {
   if (i%p==0)
    break;
  }
  if (p==i)
  {
   *(xx+j)=i;
   j++;
  }
 }
}
void main()
{
 int m,k,xx[1000],i;
 printf("请依次输入整数m和个数k\n");
 scanf("%d%d",&m,&k);
 fun (m,k,xx);
 printf("大于%d的%d个素数依次为\n",m,k);
 for (i=0;i<k;i++)
 {
  printf("%-3d",*(xx+i));
 }
 printf("\n");
}

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

//
//功能描述     :逆序存放字符串
//返回值       :void
//编写日期     :2018年11月24日
//
#include "stdio.h"
void nixu (char *l,char *k,int g)
{
 int i;
 *(k+g)='\0';
 for (i=0;*(l+i);i++)
 {
  *(k+g-i-1)=*(l+i);
 }
}
void main()
{
 char l[1000],k[1000];
 int i=0;
 printf("请输入你的字符串\n");
 gets(l);
 while(*(l+i))
 {
  i++;
 }
 nixu (l,k,i);
 puts(k);
}

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

//
//功能描述     :递归逆序
//返回值       :void
//编写日期     :2018年11月24日
//
#include "stdio.h"
void nixu (int p,char *l)
{
 if (p>0&&p<=5)
 {
  printf("%c",*(l+p-1));
  nixu (p-1,l);
 }
}
void main()
{
 int i;
 char l[5];
 printf("请输入五个字符\n");
 for (i=0;i<5;i++)
 {
  scanf("%c",l+i);
 }
 printf("逆序后为\n");
 nixu (5,l);
 printf("\n");
}

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

//
//功能描述     :1到100之内能被7或者11整除,但不能同时被7和11整除的所有整数
//返回值       :void
//编写日期     :2018年11月25日
//
#include "stdio.h"
void fun (int *q,int *a)
{
 int i,j=0;
 for (i=1;i<=100;i++)
 {
  if ((i%7==0||i%11==0)&&!(i%7!=0&&i%11!=0))
  {
   *(a+j)=i;
   j++;
  }
 }
 *q=j+1;
}
void main()
{
 int a[100],i,n;
 fun (&n,a);
 printf("1到100之内能被7或者11整除,但不能同时被7和11整除的所有整数有%d个\n",n);
 for (i=0;i<n-1;i++)
 {
  printf("%-3d",*(a+i));
 }
 printf("\n");
}

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

///
//功能描述     :按照原来的规律插入一个数
//返回值       :void
//编写日期     :2018年11月25日

#include "stdio.h"
void charu(int *a,int d)
{
 int i=0,j;
 while(d>*(a+i))
 {
  i++;
  if(i==10)
   break;
 }
 for(j=10;j>=i+1;j--)
 {
  *(a+j)=*(a+j-1);
 }
 *(a+i)=d;
}
void main()
{
 int a[11]={1,8,11,15,56,78,89,95,100,120};
 int d,k;
 printf("排好序的数为\n");
 for (k=0;k<10;k++)
 {
  printf("%-5d",*(a+k));
 }
 printf("\n");
 printf("请输入需要插入的数\n");
 scanf("%d",&d);
 charu(a,d);
 printf("插入后为\n");
 for (k=0;k<=10;k++)
 {
  printf("%-5d",*(a+k));
 }
 printf("\n");
}

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

//
//功能描述     :转置矩阵
//返回值       :void
//编写日期     :2018年11月25日
//
#include "stdio.h"
void Change(int a[][100],int b[][100],int n,int m)
{
 int i,j;
 for (i=0;i<=n-1;i++)
 {
  for (j=0;j<=m-1;j++)
  {
   *(*(b+j)+i)=*(*(a+i)+j);
  }
 }
}
void main()
{
 int a[100][100],b[100][100],m,n,i,j;
 printf("请输入需要输入矩阵得行数和列数\n");
 scanf("%d%d",&n,&m);
 printf("请输入你的矩阵\n");
 for (i=0;i<=n-1;i++)
 {
  for (j=0;j<=m-1;j++)
  {
   scanf("%d",*(a+i)+j);
  }
 }
 Change(a,b,n,m);
 printf("转置后的矩阵为\n");
 for (i=0;i<=m-1;i++)
 {
  for (j=0;j<=n-1;j++)
  {
   printf("%-3d",*(*(b+i)+j));
  }
  printf("\n");
 }
}

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

//
//功能描述     :有多少桃子
//返回值       :void
//编写日期     :2018年11月25日
//
#include "stdio.h"
void houzi(int *a)
{
 int i = 1,j=9;
 *(a+10)=1;
 *(a+j)=1;
 for (;j>0;j--)
 {
  *(a+j-1)=2*((*(a+j))+1);
 }
}
void main()
{
 int a[11],i;
 houzi (a);
 for (i=0;i<=10;i++)
    {
  printf("第%d天还剩余%d个桃子\n",i,*(a+i));
 }
}

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

函数接口如下:void fun(char a[],char b[], int n)

//
//功能描述     :删除一个字符串中指定下标的字符
//返回值       :void
//编写日期     :2018年11月25日
//
#include "stdio.h"
void fun(char *a,char *b,int *n)
{
 int i,j;
 for (j=0,i=0;*(a+i);i++)
 {
  if (i==*n)
   continue;
  *(b+j)=*(a+i);
  j++;
 }
 *(b+j)='\0';
}
void main()
{
 char a[1000],b[1000];
 int n;
 printf("请输入原来的字符串\n");
 gets(a);
 printf("请输入需要删除的字符的下标\n");
 scanf("%d",&n);
 fun (a,b,&n);
 printf("删除后的字符串为\n");
    puts (b);
}

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

函数接口如下:void fun (int *s, int t, int *k)

//
//功能描述     :找出数组中最大的数的下标
//返回值       :void
//编写日期     :2018年11月25日
//
#include "stdio.h"
void fun (int *s, int t, int *k)
{
 int i;
 *k=0;
 for (i=0;i<t;i++)
 {
  if (*(s+i)>*(s+(*k)))
   *k=i;
 }
}
void main()
{
 int s[1000],k,t,i;
 printf("请输入需要输入几个数\n");
 scanf("%d",&t);
 printf("请输入你的数组\n");
 for (i=0;i<t;i++)
 {
  scanf("%d",s+i);
 }
 fun (s,t,&k);
 printf("最大数的下标为%d\n",k);
}

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

//
//功能描述     :判断素数
//返回值       :void
//编写日期     :2018年11月25日
//
#include "stdio.h"
void panduan (int n, int *t)
{
 int i;
 for (i=2;i<n;i++)
 {
  if (n%i==0)
  break;
 }
 if (i==n)
  *t=1;
 else
  *t=0;
}
void main()
{
 int n,t;
 printf("请输入需要判断的数\n");
 scanf("%d",&n);
 panduan (n,&t);
 if (t==1)
 {
  printf("是素数\n");
 }
 else 
 {
  printf("不是素数\n");
 }
}

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

///
//功能描述     :求最大公约数和最小公倍数
//返回值       :void
//编写日期     :2018年11月25日

#include "stdio.h"
int Gy(int a,int b)
{
 int c;
 while (a!=0)
 {
  c=b%a;
  b=a;
  a=c;
 }
 return b;
}
int Lcm(int a,int b)
{
 int c;
 c=b/a;
 return c;
}
void main()
{
 int a,b,c,s,d,t;
 printf("请输入两个数\n");
 scanf("%d%d",&a,&b);
 if(a>b)
 {
  t=a,a=b,b=t;
 }
 s=a*b;
 c=Gy(a,b);
 d=Lcm(c,s);
 printf("最大公约数为%d最小公倍数为%d\n",c,d);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值