C语言函数练习题

1.编写一个函数实现该功能:从键盘输入一个字串符,再输入两个正整数m和n,输出字符串中从m开始,连续n个字符。例如,输入abcdefg,2,3,输出 bcd.

#include <stdio.h>
/*编写一个函数实现该功能:从键盘输入一个字串符,再输入两个正整数m和n,输出字符串中从m开始,连续n个字符。例如,输入abcdefg,2,3,输出 bcd.*/

void Fun(char *p,int a,int b);
int main()
{
	char buf[32]={0};
	int m=0,n=0;
	
	printf("请输入字符串:\n");
	scanf("%s",buf);
	getchar();//吸收字符串输入结束后的回车
	printf("请输入m和n的值:\n");
	scanf("%d%d",&m,&n);
	
	Fun(buf,m,n);
	printf("\n");
	return 0;
}

void Fun(char *p,int a,int b)
{
	int i=0;
	for(i=1;i<=b;i++)
	{
		printf("%c",*(p+(a-1)+(i-1)));
	}		
	return;
}

运行结果:

请输入字符串:
abcdefg
请输入m和n的值:
2 3
bcd

2.已知银行定期存款利率为 r=2.25%,输入存款本金x,存款年数n,输出本利之和r=x(1+r)(1+r).....(1+r),共n个(1+r).

#include <stdio.h>
/* 已知银行定期存款利率为 r=2.25%,输入存款本金x,存款年数n,输出本利之和r=x(1+r)(1+r).....(1+r),共n个(1+r).*/

float Rates(int a,int b);
int main()
{
	int x=0,n=0;
	printf("请输入本金x,存款年数n:\n");
	scanf("%d%d",&x,&n);
	float r=Rates(x,n);
	printf("输出本利之和:%f\n",r);
	return 0;
}

float Rates(int a,int b)
{
	float r=0.0225;
	float sum=0;
	int n=0;
	for(n=1;n<=b;n++)
	{
		a*=(float)(1+r);
	}
	return a;
}

运行结果:

请输入本金x,存款年数n:
10000 10
输出本利之和:12487.000000

3.一个皮球从100米高度自由落下,每次落地后反弹回原高度的一半再落下,再反弹.求当它第 n 次落地式时,共经过了多少米

#include <stdio.h>
/*一个皮球从100米高度自由落下,每次落地后反弹回原高度的一半再落下,再反弹.求当它第 n 次落地式时,共经过了多少米*/

float Fun(int n);
int main()
{
	int n=0;
	printf("请输入落地次数n:\n");
	scanf("%d",&n);
	float m=Fun(n);
	printf("共经过了%f米\n",m);
	return 0;
}

float Fun(int n)
{
	float m=100;//高度
	float sum =0;
	if(n==1)
	{
		sum+=m;
	}
	else if(n>=2)
	{
		sum+=m;
		for(int i=2;i<=n;i++)
		{
		//第1次 100,第2次 100+100,第3次 200+50,第4次 250+25
			m/=2;
			sum+=(2*m);
		}
	}
	return sum;
}

运行结果:

请输入落地次数n:
4
共经过了275.000000米

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

#include <stdio.h>
/*写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个整数由键盘输入。*/
int Fun1(int a,int b);
int Fun2(int a,int b);
int main()
{
	int num1=0,num2=0;
	printf("输入两个整数:\n");
	scanf("%d%d",&num1,&num2);
	int gys=Fun1(num1,num2);
	printf("最大公约数:%d\n",gys);
	int gbs=Fun2(num1,num2);
	printf("最小公倍数:%d\n",gbs);
	return 0;
}
//最大公约数,找出两数中的最小值,然后直接相模,当能够同时被两数整除时则为最大公约数
int Fun1(int a,int b)
{
	int m=(a<b)?a:b;
	while(m>0)
	{
		if((a%m==0)&&(b%m==0))
		{
			break;
		}
		m--;
	}
	
	return m;
}
//最小公倍数,可以用(a*b)/最大公约数求
int Fun2(int a,int b)
{
	int n=(a*b)/Fun1(a,b);//调用一下子函数Fun1
	return n;
}

最小公倍数也可以写成:

int Fun2(int a,int b)
{
	int m=(a>b)?a:b;
	while(m<(a*b))
	{
		if((m%a==0)&&(m%b==0))
		{
			break;
		}
		m++;
	}
	return m;
}

运行结果:

输入两个整数:
12 15
最大公约数:3
最小公倍数:60

5.编写一个名为sumnarrays( )的函数,它接受两个数组作为参数,将两个数组中的所有值相加,并返回得到的结果

#include <stdio.h>
/*编写一个名为sumnarrays( )的函数,它接受两个数组作为参数,将两个数组中的所有值相加,并返回得到的结果*/
int Sumnarrays(int n,int *a,int *b);
int main()
{
	int num1[100]={0},num2[100]={0};
	int i=0,n=0;
	printf("请输入数组存储的个数:\n");
	scanf("%d",&n);
	printf("输入数组1:\n");
	for(i=0;i<n;i++)
	{
		scanf("%d",&num1[i]);
	}
	printf("输入数组2:\n");
	for(i=0;i<n;i++)
	{
		scanf("%d",&num2[i]);
	}
	int sum=Sumnarrays(n,num1,num2);
	printf("数组中的所有值相加:%d\n",sum);
	return 0;
}

int Sumnarrays(int n,int *a,int *b)
{
	int i=0,sum=0;
	for(i=0;i<n;i++)
	{
		sum+=*(a+i);
		sum+=*(b+i);
	}
	return sum;
}

运行结果:

请输入数组存储的个数:
6
输入数组1:
1 2 3 4 5 6
输入数组2:
1 2 3 4 5 6 
数组中的所有值相加:42

6.写一个功能函数,求字符串的长度( 用指针来实现)类比 strlen 库函数

#include <stdio.h>
/*写一个功能函数,求字符串的长度( 用指针来实现)类比 strlen 库函数*/
int My_Strlen(const char *a);
int main()
{
	char buf[32]={0};
	
	printf("请输入字符串:\n");
	scanf("%s",buf);
	
	int n=My_Strlen(buf);
	printf("字符串的长度:%d\n",n);
	return 0;
}

int My_Strlen(const char *a)
{
	int n=0;
	for(;*(a+n)!=0;n++);
	
	return n;
}

运行结果:

请输入字符串:
abcdef
字符串的长度:6

7.写一个功能函数,字符串的连接。 
"hello" "world"把两个字符串连接成一个字符串,
并且返回连接好的字符串的首地址。
仿写: char *strcat(char *dest, const char *src)

#include <stdio.h>
/*写一个功能函数,字符串的连接。 
"hello" "world"把两个字符串连接成一个字符串,
并且返回连接好的字符串的首地址。
仿写: char *strcat(char *dest, const char *src)*/
char *My_Strcat(char *a,const char *b);
int main()
{
	char buf1[64]={0};
	char buf2[32]={0};
	printf("请输入字符串1:\n");
	scanf("%s",buf1);
	getchar();
	printf("请输入字符串2:\n");
	scanf("%s",buf2);
	getchar();
	char *w=My_Strcat(buf1,buf2);
	printf("字符串1:%s\n",w);
	return 0;
}

char *My_Strcat(char *a,const char *b)
{
	char *p=a;
	while(*a)
	{
		a++;
	}
	while(*b)
	{
		*a=*b;
		a++;
		b++;
	}
	*a='\0';
	return p;
}

运行结果:

请输入字符串1:
abc
请输入字符串2:
efg
字符串1:abcefg

8.编写一个函数,使得输入的一个字符串逆序存放

#include<stdio.h>
#include <string.h>
/*编写一个函数,使得输入的一个字符串逆序存放*/

void Fun(char *p);
int main()
{
	char buf[32]={0};
	printf("请输入字符串:\n");
	scanf("%s",buf);
	getchar();
	
	Fun(buf);
	printf("逆序:%s\n",buf);
	return 0;
}

void Fun(char *p)
{
	char t=0;
	int n=strlen(p);
	for(int i=0;i<=n/2;i++)
	{
		t=*(p+i);
		*(p+i)=*(p+n-1-i);
		*(p+n-1-i)=t;
	}
	return;
}

运行结果:

请输入字符串:
abcdef
逆序:fecdba

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值