初学函数笔记:
返回类型:一个函数可以返回一个值。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.公约/公倍数
难点:不知道最小公倍数如何求。
方法:
①(利用最小公倍数的定义)最小公倍数肯定≥最大的一个数,所以可以从最大的数开始递增,若能整除最小的数则为最小公倍数。
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) |
2 | 1 |
3 | 3 |
4 | 5 |
发现了什么,他们之间是不是存在关系,这时就可以用函数来表达: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;
}
先定义函数要执行什么操作,返回什么值,后在主函数中直接引用。