C语言学习打卡11.22

上一周学习内容:函数

初学函数笔记:

  • 返回类型一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void
  • 函数名称这是函数的实际名称。函数名和参数列表一起构成了函数签名。
  • 参数(参数类型)参数就像是占位符。当函数被调用时,你向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
  • 函数主体:函数主体包含一组定义函数执行任务的语句。

步骤:先确定函数的返回类型int/float/其他,+函数名+(参数类型+参数名称)+

          在主函数后面解释该函数,同理:函数的返回类型int/float/其他,+函数名+(参数类型+参数名称) 不需要加分号;

例子:

#include<stdio.h>
int main ()
{
	int m,n,temp,i;     
	int prime(int num);      //先声明一下,我下面要用到 prime这个函数
	int prime_sum(int m,int n);  //同理,用prime_sum函数 
	scanf("%d %d",&m,&n);
	printf("Sum of ( ");
	if(m>n){
	temp=m;
	m=n;
	n=temp;
	}
	for(i=m;i<n;i++){
		if(prime(i)==1){     //使用函数, prime(i)意思是将主函数中的i值传递给prime函数中的num值 
			printf("%d ",i);  //然后  num值在函数prime里一顿操作后返回出一个整型flag的值 
		}
	}
	printf(") = %d",prime_sum(m,n));
	return 0;

}
int prime(int num)     //末尾一定没有分号 
{
	int i,fact,flag;
	flag=1;
	if(num==1){
		flag=0;
	}
	for(i=2;i<sqrt(num)+1;i++){
		if(num%i==0){
			flag=0;
			break;
		}
	}
	if(num==2){
		flag=1;
	}	
	return flag;   //返回的值是flag,函数开头定义了返回值flag的类型是int型 
}


int prime_sum(int m,int n)
{
	int temp,i,result;
	int prime(int num);
	result=0;
	if(m>n){
		temp=m;
		m=n;
		n=temp;
	}
	for(i=m;i<n;i++){
		if(prime(i)==1){
			result=result+i;
		}
	}
	return result;
}

课后练习:

1.公约/公倍数

#include<stdio.h>
int main ()
{
	int m,n,a,b;
	int gcd(int m,int n);    //引用公约数函数 
	int lcm(int m,int n);    //引用公倍数函数 
	scanf("%d %d",&m,&n);
	printf("%d ",gcd(m,n));
	printf("%d ",lcm(m,n));
	return 0;
}
int lcm (int m,int n)       //定义最小公倍数函数 
{
	int temp,i,result;
	int gcd (int m,int n);
	if(m>n){
		temp=m;
		m=n;
		n=temp;
	}
	result=m*n/gcd(m,n);    //最小公倍数=两数之积除以最大公约数 
	return result;
}
int gcd (int m,int n)       //定义最大公约数 
{
	int r,temp;
	if(m<n){
		temp=m;
		m=n;
		n=temp;
	}
	r=m%n;                 //用辗转相除法求最大公约数 
	while(r!=0){
		m=n;
		n=r;
		r=m%n;
	}
	return n;
}

难点:不知道最小公倍数如何求。

方法:

①(利用最小公倍数的定义)最小公倍数肯定≥最大的一个数,所以可以从最大的数开始递增,若能整除最小的数则为最小公倍数。

int lcm (int m,int n)       //定义最小公倍数函数 
{
	int temp,i,result;
	int gcd (int m,int n);
	if(m>n){
		temp=m;
		m=n;
		n=temp;
	}
	result=n;
	while (result%m!=0||result%n!=0) {
	result++;
	}        
	return result;
}

②(利用公式)最小公倍数=两数之积除以最大公约数 。(代码如上上图)

2. 空心的数字金字塔

#include<stdio.h>
int main() 
{
	int n,j,i,k,temp,l,a;
	scanf("%d", &n);
	temp=n;
	for(k=1;k<=n;k++){                 //k代表第几行 
		if(k==1){
			for(i=n-1;i>0;i--){
				printf(" ");           //第一行有 n-1个空格 
			}
			printf("1\n");
			continue;
		}
		if(k==n){                   //第一行和最后一行找不出规律使用强行破解法。太菜了,没办法~~ 
			for(j=2*n-1;j>0;j--){
				printf("%d",n);	
			}
			break;
		}
		for(l=n-k;l>0;l--){       //从第二行到倒数第二行(n-1>=k>=2)数字与数字间间隔2k-3个空格 
			printf(" ");
		}
		printf("%d",k);
		for(a=2*k-3;a>0;a--){
			printf(" ");
		}
		printf("%d\n",k);
		
	}
	return 0;
}

难点:找不出思路,只会打出实心数字金字塔,第一次见到还有空心的数字金字塔。

思路:虽然我想不出空心的怎么打,但是初学C语言时我学会了打出这个:

#include<stdio.h>
int main() 
{
	int n,i,k;
	scanf("%d", &n);
	for(k=1;k<=n;k++){
		for(i=k;i<n;i++){         //k代表第几行 ,n-i代表要打的空格数 
		printf(" ");           
		}
		printf("%d\n",k);
	}
	return 0;
}

结果:

 接着两图对比,可以发现出好像有些一点点接近了(实际还差很远呢)。我们好像可以知道样例从第二行开始到倒数第二行都有空格,且这个空格数还有些奇妙:

行数(k)空格数(a)
21
33
45

发现了什么,他们之间是不是存在关系,这时就可以用函数来表达:a=2*k-3。

这样我们就可以在原有的基础上再进行一次循环,先打印出空格,再打印出数字。

至于第一行和最后一行实在不知道怎么把他们写在一起,于是只能将他们单独分开,一一讨论了。

偶然发现:

我可以先在主函数前编写函数体,接着主函数中可以不用声明我要用这个函数,只需直接使用即可。将第一个例题的代码微调如图:

#include<stdio.h>
#include<math.h>
int prime(int num)     //先编写我这个函数,末尾一定没有分号 
{
	int i,fact,flag;
	flag=1;
	if(num==1){
		flag=0;
	}
	for(i=2;i<sqrt(num)+1;i++){
		if(num%i==0){
			flag=0;
			break;
		}
	}
	if(num==2){
		flag=1;
	}	
	return flag;   //返回的值是flag,函数开头定义了返回值flag的类型是int型 
}
int main ()    //主函数 
{
	int m,n,temp,i; 
	int prime_sum(int m,int n);  //请看,我并没有声明我要用prime函数 
	scanf("%d %d",&m,&n);
	printf("Sum of ( ");
	if(m>n){
	temp=m;
	m=n;
	n=temp;
	}
	for(i=m;i<n;i++){
		if(prime(i)==1){     //使用函数, prime(i)意思是将主函数中的i值传递给prime函数中的num值 
			printf("%d ",i);  //然后  num值在函数prime里一顿操作后返回出一个整型flag的值 
		}
	}
	printf(") = %d",prime_sum(m,n));
	return 0;

}

int prime_sum(int m,int n)
{
	int temp,i,result;
	int prime(int num);
	result=0;
	if(m>n){
		temp=m;
		m=n;
		n=temp;
	}
	for(i=m;i<n;i++){
		if(prime(i)==1){
			result=result+i;
		}
	}
	return result;
}

先定义函数要执行什么操作,返回什么值,后在主函数中直接引用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值