c语言练习

c语言练习,第1张

目录

每日练习:一、数组逆序

每日练习:二、用递归求N的阶乘

每日练习:三、用条件循环求阶乘

每日练习:四、求阶乘的加和

每日练习:五、数组冒泡排序

每日练习:六、选择排序法

每日练习:七、二维数组每行中交换最大的元素

每日练习:八、二维数组以以一维数组形式输出


每日练习:一、数组逆序

键盘中输入五个数,写一个函数实现一维数组中的逆序重新存放,要求输入输出军在主函数中。

#include

int main()

{

   int arr[5];

   int i,j,tmp;

   

   //模块一:赋值数组

   for(i=0;i<5;i++)

   {

      scanf("%d",&arr[i]);

   }

   

   //模块二:数组逆排序

   for(i=0;i<5;i++)

   {

       for(j=0;j<5;j++)

       {

           if(arr[i]>arr[j])

           {

              tmp=arr[i];

              arr[i]=arr[j];

              arr[j]=tmp;

           }  

       }

   }

   

   //模块三:打印输出

   for(i=0;i<5;i++)

   {

       printf("%d ",arr[i]);

   }

   return 0;

}

每日练习:二、用递归求N的阶乘

键盘中输入一个数,写一个程序揪出这个数的阶乘,要求使用递归法。

//用递归求N的阶乘
#include 
int fun(int a)
{
     if(a>0)
     {
        if(a==1||a==0)
        {
            return 1;
        }
        else
            return a*fun(a-1);
     }
}
int main()
{ 
    int n=0;
    scanf("%d",&n);
    int a=fun(n);
    printf("%d",a);
   
   return 0; 
}

注意事项:负数没有阶乘,0的阶乘是1

int fun(int a)

{

     if(a>0)

     {

        if(a==1)

        {

            return a;

        }

        else

            return a*fun(a-1);

     }

}

看这个自定义函数,其实是有其实是有BUG,没有考虑0的情况,与其再写一个if函数进行限定,不如使用&& ,返回只用a改为1(因为0的阶乘刚好是1),修改后的代码件上面完整代码。


每日练习:三、用条件循环求阶乘

从键盘输入一个数,写一个程序,计算这个数的阶乘,要求使用循环。

#include

int fun(int n)

{

    int a=1;

    int ret=1;

    for(a=1;a<=n;a++)

    {

       ret=ret*a;

    }

     return ret;

}

int main()

{

    int a=0;

    scanf("%d",&a);

    int ret=fun(a);

    printf("%d",ret);

    return 0;

}

每日练习:四、求阶乘的加和

编程求1!+2!+3!+4!+5!

#include

int fun(int a)

{

    int i,j;

    int ret=1;

    int sum=0;

    for(i=1;i<=a;i++)

    {



        for(j=1;j<=i;j++)

        {

            ret=ret*j;

        }

        sum=sum+ret;

    }

    return sum;

}    

int main()

{

    int a=0;

    scanf("%d",&a);

    int sum=fun(a);

    printf("%d",sum);

    return 0;

}

这是个错误代码,具体原因:

1.ret=1*1=1

2.ret=1*1*1*2=2

3.ret=1*1*1*2*1*2*3=12

所以解决办法为在第一个和第二个for循环之间, 重置ret=1,如下

#include

int fun(int a)

{

    int i,j;

    int ret=1;

    int sum=0;

    for(i=1;i<=a;i++)

    {

        ret=1;

        for(j=1;j<=i;j++)

        {

            ret=ret*j;

        }

        sum=sum+ret;

    }

    return sum;

}    

int main()

{

    int a=0;

    scanf("%d",&a);

    int sum=fun(a);

    printf("%d",sum);

    return 0;

}
  • 当然,我们通过调整算法,得到更优,更简单的算法
#include

int main()

{

    int i,n;

    int ret=1;

    int sum=0;

    

    scanf("%d",&n);

    if(n==0)

       printf("sum=1");

    else

    {

       for(i=1;i<=n;i++)

       {

            ret=ret*i;

            sum=sum+ret;

       }

       printf("sum=%d",sum);

    }

    return 0;  

}

每日练习:五、数组冒泡排序

用冒泡排序将十个整数按照从小到大的顺序排序

#include

int main()

{

    int i,j;

    int arr[10]={9,8,7,5,6,4,3,2,0,1};

    int sz=sizeof(arr)/sizeof(arr[0]);//求数组长度

    

    for(i=0;iarr[j+1])//相邻两个数比较

            {

                int tmp=arr[j+1];

                arr[j+1]=arr[j];

                arr[j]=tmp;

            }

        }

    }

    

    //输出排好的数组

    for(i=0;i

难点:为什么第一个for循环截止到sz-1,第二个for循环截止到sz-1-i?(和下面👇🏻“冒泡排序和选择排序的区别”配合理解)

原因:第一个外层决定循环的趟数,例如四个数只用循环三趟。第二个内层循环决定每趟循环比较的次数,例如第一趟循环中4个数比较3次后,把最大的数放到最后,那么第二趟循环中最后一位就不用参与比较,同理第三趟循环最后两位就不用参与比较了


每日练习:六、选择排序法

用选择排序法将十个数按从小到大的顺序排列

#include

int main()

{

    int i,j;

    int arr[10]={9,8,7,5,6,4,3,2,0,1};

    int sz=sizeof(arr)/sizeof(arr[0]);

    

    

    for(i=0;iarr[j])

            {

              int tmp=arr[i];

              arr[i]=arr[j];

              arr[j]=tmp;

            }

        }

    }

    //输出排好的数组

    for(i=0;i

⭐选择排序与冒泡排序的区别:

拿升序举例⭐

  • 选择排序的原理是:(一个数和后面所有的数比较)第一趟循环中,第一个数和后面的所有数进行比较,能使最小的数排在前面。第二趟循环中,第二个数和第二个数后面所有的数进行比较,能使第二小的数排在第二个位置上,以此类推。

例如:

第一趟              第二趟           第三趟

4  3  2  1           1  4  3  2      1  2  4  3

3  4  2  1           1  3  4  2      1  2  3  4

2  4  3  1           1  2  4  3

1  4  3  2

  • 冒泡排序的原理是:(相邻两个数进行比较)第一趟循环中,第一和第二个数比较,然后第二个和第三个数比较,以此类推,直至最后两个数比较,能使最大的一个数排在最后。第二趟循环中,从第二个和第三个数比较,以此类推,直至最后两个数。

例如:

第一趟              第二趟            第三趟

4  3  2  1          3  2  1  4         2  1  3  4

3  4  2  1          2  3  1  4         1  2  3  4

3  2  4  1          2  1  3  4

3  2  1  4


每日练习:七、二维数组每行中交换最大的元素

有一个3*4矩阵,找出每行中最大的元素并与第1列元素交换。具体要求如下:

1. 使用二维数组存放该3*4矩阵

2. 为二维数组输入数据。

3. 输出原矩阵并和处理后的矩阵进行比较。

测试输入:

3 4

1 2 3 4

5 6 7 8

9 10 11 12

预期输出:

原矩阵:

1 2 3 4

5 6 7 8

9 10 11 12

处理后:

4 2 3 1

8 6 7 5

12 10 11 9

调试小技巧⭐

由于代码量较多,输入的数比较多,调试起来比较麻烦,可以先屏蔽输入模块(最好把scanf以及数组大小都指定完成,原因如下),直接赋值进去。

易错提示⭐

int M,N;//二维数组的行和列

    scanf("%d%d",&M,&N);

    char arr1[M][N];//={'S','S','S','S'};//定义二维数组

这样的代码是错误的,原因,定义数组的时候使用变量来定义数组长度。如下代码:

int a = 10;

char arr[a]; //编译不报错

//char [a] = "abc"; //报错,使用变量定义长度时,不可在定义时同时进行初始化赋值,需要在之后进行赋值
int arr[10][10]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int i,j,n,max;

 /* for(i=0;i<3;i++)

    {

        for(j=0;j<4;j++)

        {

            scanf("%d",arr[i][j]);

        }

    }

 */  

调试后,完整代码如下:

#include

int main()

{

    

    //模块一:初始化及输入

    int arr[10][10]={0};//={{4,2,3,1},{5,6,7,8},{9,10,11,12}};

    int i,j,k,max;

    int m,n;

    scanf("%d%d",&m,&n);

    for(i=0;i
每日练习:八、二维数组以以一维数组形式输出

编写程序,功能是将MN列的二维数组中的字符数据按列的顺序依次放到一个字符串(一维数组)中。 例如,二维数组中的数据为: SSSS YYYY XXXX YYYY 则字符串中的内容应是:SYXYSYXYSYXYSYXY

#include 

int main()

{

    int M,N;

    scanf("%d%d",&M,&N);

    char arr1[M][N];//创建二维数组

    char arr2[M*N];//创建一维数组 

    int i,j;

    int k=0;

    

    //输入元素 

    for(i=0;i

程序解释:首先是输入元素部分,观察题目可知以四个一组的字符串进行一次输入,因此输入字符串数组时只用定义横行。其次是将二维数组赋给一维数组部分,由于要按列输出,第一层for循环就不应以 行 做终止循环的条件,而应以 列 作为终止循环的条件。

创作不易,还希望各位支持!

👍🏻点赞,你的认可是我创作的动力!

⭐收藏,你的青睐是我努力的方向!

💛评论,你的意见是我努力的方向!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/3002180.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-27
下一篇 2022-09-27

发表评论

登录后才能评论

评论列表(0条)