以下内容仅供娱乐,欢迎随时探讨,请多指教!
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;
}