C语言函数有无参、有无返,递归

1.在主函数定义二维数组,在有参无返函数中实现杨辉三角

程序代码:

 1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 void Y_H(int n,int arr[n][n]);
  5 int main(int argc, const char *argv[])
  6 {
  7     int n;//定义n,终端输入
  8     printf("enter n:");
  9     scanf("%d",&n);
 10     int arr[n][n];//定义二维数组,杨辉三角行列相等
 11     Y_H(n,arr);//调用函数Y_H
 12     return 0;
 13 }
 14 void Y_H(int n,int arr[n][n])
 15 {
 16     for(int i=0;i<n;i++)//外循环,行
 17     {
 18         for(int j=0;j<=i;j++)//内循环,列
 19         {
 20             if(j==0||i==j)//第一列为1,行列相等时为1
 21             {
 22                 arr[i][j]=1;
 23             }
 24             else//其他按规律计算
 25             {
 26                 arr[i][j]=arr[i-1][j]+arr[i-1][j-1];
 27             }
 28             printf("%-4d ",arr[i][j]);//循环打印
 29         }
 30         printf("\n");//每次打印一行后,换行
 31     }
 32 }   

运行结果:

2.在主函数定义二维数组并输入,在有参无返函数中计算二维数组的第二大值

程序代码:

 1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 int Second_max(int line,int row,int arr[line][row]);
  5 int main(int argc, const char *argv[])
  6 {
  7     int arr[3][4];//定义二维数组
  8     int line=sizeof(arr)/sizeof(arr[0]);//计算行
  9     int row=sizeof(arr[0])/sizeof(arr[0][0]);//计算列
 10     for(int i=0;i<line;i++)//循环输入
 11     {
 12         for(int j=0;j<row;j++)
 13         {
 14             scanf("%d",&arr[i][j]);
 15         }
 16     }
 17     Second_max(line,row,arr);//调用函数,传参
 18     int s=Second_max(line,row,arr);//接函数返回值
 19     printf("second=%d\n",s);
 20     return 0;
 21 }
 22 int Second_max(int line,int row,int arr[line][row])//有参有返函数,接参
 23 {
 24     int max=arr[0][0],min=arr[0][0];//定义最值
 25     int maxi=0,maxj=0;//定义最值下标
 26     for(int i=0;i<line;i++)//循环比较大小,求最值,外行
 27     {
 28         for(int j=0;j<row;j++)//内列
 29         {
 30             if(max<=arr[i][j])//判断最大值
 31             {
 32                 max=arr[i][j];//最大
 33                 maxi=i;maxj=j;//最值下标                                                                  
 34             }
 35             if(min>arr[i][j])//判断最小
 36                 min=arr[i][j];//最小
 37         }
 38     }
39     int second=min;//定义第二大值为最小
 40     for(int i=0;i<line;i++)//循环比较,外行
 41     {
 42         for(int j=0;j<row;j++)//内列
 43         {
 44         /*  if(max==arr[i][j])//如果不用下标来判断,使用最大值判断
 45          *                      当有两个相等最大值,就会输出第三大值
 46                 continue;       第二次运行结果
 47         */
 48             if(maxi==i&&maxj==j)
 49                 continue;
 50             if(second<arr[i][j])//判断第二大值,大于所有值(除最大值)
 51                                 //先判断遇到最大值,结束,再循环(continue)
 52                 second=arr[i][j];
 53         }
 54     }
 55     return second;//返回值
 56 }

运行结果:

3.在主函数中定义两个字符串并输入,在有参无返函数中实现字符串拷贝

程序代码:

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 void my_strcpy(char a[10],char b[10]);//函数声明
  5 int main(int argc, const char *argv[])
  6 {
  7     char a[10]="";//定义两个字符串
  8     char b[10]="";
  9     printf("enter a :");
 10     gets(a);
 11     printf("enter b :");
 12     gets(b);
 13     my_strcpy(a,b);//调用函数,传参
 14     return 0;
 15 }
 16 void my_strcpy(char a[10],char b[10])//自定义函数,接参
 17 {
 18     int i=0;
 19     for(i=0;b[i]!='\0';i++)//循环赋值,遇到'\0'结束
 20     {
 21         a[i]=b[i];
 22     }
 23     a[i]='\0';//'\0进不去循环,单独赋值
 24     puts(a);                                                                   
 25 }

 运行结果:

4.在主函数中定义两个字符串并输入,在有参无返函数中实现字符串连接

程序代码:

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 void my_strcat(char a[20],char b[10]);//函数声明
  5 int main(int argc, const char *argv[])
  6 {
  7     char a[20]="";//定义两个字符串,终端输入
  8     char b[10]="";
  9     printf("enter a :");
 10     gets(a);
 11     printf("enter b :");
 12     gets(b);
 13     my_strcat(a,b);//调用函数,传参
 14     return 0;
 15 }
 16 void my_strcat(char a[20],char b[10])//自定义函数,接参
 17 {
 18     int i=0,j=0;
 19     for(i=0;a[i]!='\0';i++);//计算目标字符串的最后一位下标(\0),就是连接点
 20     for(j=0;b[j]!='\0';j++)
 21     {
 22         a[i+j]=b[j];
 23     }
 24     a[i+j]='\0';//'\0'循环进不去,赋值
 25     puts(a);
 26 } 

 运行结果:

5.在主函数中定义一个字符串并输入,在有参有返函数中实现atoi

程序代码:

id my_atoi(char a[10]);//声明函数
  5 int main(int argc, const char *argv[])
  6 {
  7     char a[10]="";//定义字符串,终端输入
  8     printf("enter a :");
  9     gets(a);
 10     my_atoi(a);//调用函数,传参
 11     return 0;
 12 }
 13 void my_atoi(char a[10])//自定义函数,接参
 14 {
 15     int i=0;
 16     for(i=0;a[i]==' ';i++);//跨过空格,i空格后面的一位
 17     int j=i;//定义j=i,判断+-号要用到
 18     if(a[i]=='+'||a[i]=='-')//判断+、-,继续向后循环
 19     {
 20         i++;
 21     }
 22     int sum=0;
 23     while(a[i]!='\0')//循环i(符号)后的函数
 24     {
 25         if(a[i]>='0'&&a[i]<='9')//判断0-9
 26         {
 27             sum=sum*10+(a[i]-'0');//计算0-9字符组成的数字,-'0'(32)
 28         }                                                                                                 
 29         else
 30             break;
 31         i++;
 32     }
 33     if(a[j]=='-')//判断j点处符号的正负
 34         sum=-sum;
 35     printf("sum=%d\n",sum);
 36 }

 运行结果:

6.在主函数定义二维数组并输入,在有参无返函数中实现二维数组转置

程序代码:

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 void rev(int line,int row,int arr[2][3]);//声明函数
  5 int main(int argc, const char *argv[])
  6 {
  7     int arr[2][3];//定义二维数组,终端输入
  8     int line=sizeof(arr)/sizeof(arr[0]); //计算行
  9     int row=sizeof(arr[0])/sizeof(arr[0][0]); //计算列
 10     for(int i=0;i<line;i++) //循环输入
 11     {
 12         for(int j=0;j<row;j++)
 13         {
 14             scanf("%d",&arr[i][j]);
 15         }
 16     }
 17     rev(line,row,arr);//函数调用,传参
 18     return 0;
 19 }
 20 void rev(int line,int row,int arr[2][3])//自定义,被调函数,接参
 21 {
 22     int b[3][2];//定义二维数组
 23     for(int i=0;i<line;i++)//循环逆置,赋值
 24     {
 25         for(int j=0;j<row;j++)
 26         {
 27             b[j][i]=arr[i][j];
 28         }
 29     }
 30     for(int i=0;i<row;i++)//循环输出
 31     {
 32         for(int j=0;j<line;j++)
 33         {
 34             printf("%-4d ",b[i][j]);
 35         }                                                                      
 36         printf("\n");
 37     }
 38 }

运行结果:

7.在主函数定义一维数组并输入,在有参有返函数中计算一维数组的第二小值

程序代码:

 1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 int second_min(int n,int arr[]);//函数声明
  5 int main(int argc, const char *argv[])
  6 {
  7     int n;//定义n,终端输入n个数
  8     printf("enter n :");
  9     scanf("%d",&n);
 10     int arr[n];
 11 //  int len=sizeof(arr)/sizeof(arr[0]);//计算长度,len即为n,用len还需传len
 12     for(int i=0;i<n;i++)//循环输入n个数
 13     {
 14         printf("enter %d num:",i+1);
 15         scanf("%d",&arr[i]);
 16     }
 17     second_min(n,arr);//函数调用,传参
 18     int s=second_min(n,arr);//接收返回值
 19     printf("min_second=%d\n",s);
 20     return 0;
 21 }
 22 int second_min(int n,int arr[])//自定义函数,被调函数,接参
 23 {
 24     int min=arr[0],max=arr[0],j=0;
 25     for(int i=0;i<n;i++)//循环比较,最值
 26     {
 27         if(min>arr[i])//最小值
 28         {
 29             min=arr[i]; j=i;//保留i的值,下标判断,防止两个相等的最小值
 30         }
 31         if(max<arr[i])
 32             max=arr[i];//最大值
 33     }                                                                                                     
 34     int second=max;//定义second,并最大值赋给,进行比较
 35     for(int i=0;i<n;i++)//循环比较
 36     {
 37         if(i==j)//i=j,最小值(排除最小值)
 38             continue;//遇到最小值跳过,继续下一次循环
 39         if(second>arr[i])//arr[i]始终小于second
 40             second=arr[i];//循环和second比较,second越来越小,又不能等于最小值
 41     }                     //second为第二小
 42     return second;
 43 }                     

 运行结果:

8.递归计算各个位数字的乘积(2315——>2*3*1*5)

程序代码:

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 int fun(int num);
  5 int main(int argc, const char *argv[])
  6 {
  7     int num;//定义数字,终端输入
  8     printf("enter num:");
  9     scanf("%d",&num);
 10     if(num!=0)//对num判断,为0,输出sum=0,否则调函数
 11     {
 13         int sum=fun(num);//接收返回值
 14         printf("sum=%d\n",sum);
 15     }
 16     else
 17         printf("sum=0\n");
 18     return 0;
 19 }
 20 int fun(int num)//自定义函数,被调函数,接参
 21 {
 22     if(num==0)//递归出口,递归边界(if(n>=0&&n<=9))
 23     {
 24         return 1;//返回1          (return n;)
 25     }
 26     else
 27     {
 28         return num%10*fun(num/10);//递归前进段,递归公式
 29     }                             //不能sum,累乘
 30 }
 31 /*
 32  * int num=1234;//主函数
 33  * int sum=1;
 34  * while(num!=0)//递归出口,递归边界
 35  * {
 36  *     sum*=num%10;//循环体和自调结合——>递归前进段,递归公式
 37  *     num/=10;     //
 38  * }
 39  * */ 

 运行结果:

流程图:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值