小言_互联网的博客

C语言经典练习题(一)

477人阅读  评论(0)

✨作者:@平凡的人1

✨专栏:《小菜鸟爱刷题》

✨推荐刷题网站👉:进入网站

✨一句话:凡是过往,皆为序章

✨说明: 过去无可挽回, 未来可以改变


💘前言

最近,有粉丝私信问我,有没有比较推荐的在线刷题网站。实际上,如果是刚开始刷题的话,我是比较推荐👉牛客网

你可能会问了为什么

  • 对于新手比较友好,不会像其他一些刷题网站一上来就看不懂,不会做
  • 牛客网是找工作必备的,同时也拥有大量的笔试题库
  • 白嫖党的福利,一站式服务:课程+刷题+面经+求职+面试,最最最重要的里面的资源全部免费!
  • 方便代码的调试运行

C语言的学习还是得基础知识+自己动手练习,这是我们常说的,学习的过程也得多刷题,这也是我建立这个专栏的初衷!

所以,如果是C语言新手,需要找一个可以在线练习的网站,我还是先建议你去牛客网刷题的,不要好高骛远哦!

下面,我们一起开始刷题把,如有错误,请指出哦💖

💘倒置字符串

🚪传送门

这道题有一点小坑:这是让我们倒置每一个单词即可,而不是倒置整个字符串,刚开始看错题目,一直写不出来😅

解题思路:题目也不难,将一句话的单词进行倒置,标点不倒置。我们可以采用三步翻转法:即先将字符串整体逆置,再对逆置后的字符串中每一个单词部分进行逆置。 比如:I like beijing.

第一步,字符串整体逆置,得到:.gnijieb ekil I

第二步,将字符串中每一个单词逆置,得到:beijing. like I

下面,实现我们的代码:

#include <stdio.h>
#include <assert.h>
void reverse(char* left, char* right)
{
   
    assert(left);
    assert(right);

    while (left < right)
    {
   
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}

int main()
{
   
    char arr[101] = {
    0 };
    //输入
    gets(arr);//I like beijing.
    //逆置
    int len = strlen(arr);
    //1. 逆序整个字符串
    reverse(arr, arr + len - 1);
    //2. 逆序每个单词
    char* start = arr;

    while (*start)
    {
   
        char* end = start;
        while (*end != ' ' && *end != '\0')
        {
   
            end++;
        }
        reverse(start, end - 1);
        if (*end != '\0')
            end++;
        start = end;
    }

    //输出
    printf("%s\n", arr);

    return 0;
}

 

提交运行:

💘BC60 带空格直角三角形图案

🚪传送门

解题思路:当前i行和j列满足的关系是什么找出来,即可很容易的写出这道题,右对角线满足i+j=n-1,而右对角线的左侧空格满足i+j<n-1,所以我们可以很容易的写出代码:

#include <stdio.h>
int main()
{
   
    int n = 0;
    while(~scanf("%d",&n))
    {
   
        int i = 0;
        for(i=0;i<n;i++)
        {
   
            int j = 0;
            for(j = 0;j<n;j++)
            {
   
                if(i+j<n-1)
                {
   
                    printf("  ");
                }
                else
                {
   
                    printf("* ");
                }
            }
             printf("\n");
        }
    }
    return 0;
}

 

提交运行:

💘BC96-有序序列判断

🚪传送门

解题思路:有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。就是说有序满足两种情况,一种是从大到小,另一种是从小到大,我们可以定义两个临时变量来帮助判断是否有序,一个判断有序,另一个判断无序。具体的有序或者无序的判断只需要去比较相邻元素的大小即可。下面实现代码:

#include <stdio.h>
int main()
{
   
    int n = 0;
    int arr[50] = {
   0};
    int flag1 = 1;//升序有序
    int flag2 = 1;//降序有序
    int i = 0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
   
        scanf("%d ",&arr[i]);
    }
    for(i=0;i<n-1;i++)
    {
   
        if(arr[i]>=arr[i+1])
        {
   
            flag1 = 0;
        }
        if(arr[i]<arr[i+1])
        {
   
            flag2 = 0;
        }
    }
    if(flag1+flag2 == 1)
    {
   
        printf("sorted\n");
    }
    else
    {
   
        printf("unsorted\n");
    }
    
    return 0;
}

 

提交运行:

💘BC100 有序序列合并

🚪传送门

题目意思很明确:行升序序列排列合并。合并问题是非常经典的,后面还有链表合并等这些,思路上都是一样的:当两个数组都有元素的时候,我们去比较大小(这里题目原因,并不需要开辟新的数组进行存储,你也可以开辟新的数组进行存储)进行输出即可。当其中一个没有元素了,另一个有元素,我们在对有元素的数组进行输出即可完成本题。话不多说,实现代码:

#include <stdio.h>
int main()
{
   
    int n = 0;
    int m = 0;
    scanf("%d %d",&n,&m);
    int i = 0;
    int arr1[1000] = {
   0};
    int arr2[1000] = {
   0};
    for(i=0;i<n;i++)
    {
   
        scanf("%d ",&arr1[i]);
    }
    for(i=0;i<m;i++)
    {
   
        scanf("%d ",&arr2[i]);
    }
    i = 0;
    int j = 0;
    while(i<n&&j<m)
    {
   
        if(arr1[i]<arr2[j])
        {
   
            printf("%d ",arr1[i]);
            i++;
        }
        else
        {
   
            printf("%d ",arr2[j]);
            j++;
        }
    }
    if(i==n)
    {
   
        for(;j<m;j++)
        {
   
            printf("%d ",arr2[j]);
        }
    }
    else
    {
   
        for(;i<n;i++)
        {
   
            printf("%d ",arr1[i]);
        }
    }
        
    return 0;
}



 

提交运行:

💘BC106 上三角矩阵判定

🚪传送门

解题思路:这种题,我们首先要知道在i行j列的矩阵中,题目的要求i和j满足一种对应的关系是什么,比如如果是对角线的话就是i=j,而题目要求主对角线以下的元素,那就说明了我们要满足i>j的元素。基于此,我们就可以很好的完成这道题目了:

#include <stdio.h>
int main()
{
   
    int n = 0;
    int arr[10][10] = {
   0};
    scanf("%d",&n);
    int i = 0;
    int j = 0;
    for(i=0;i<n;i++)
    {
   
        for(j=0;j<n;j++)
        {
   
            scanf("%d",&arr[i][j]);
        }
    }
    for(i=0;i<n;i++)
        {
   
            for(j=0;j<n;j++)
            {
   
                if(i>j)
                {
   
                    if(arr[i][j]!=0)
                    {
   
                        printf("NO\n");
                        return 0;
                    }
                }
            }
        }
    printf("YES\n");
    return 0;
}

 

提交运行:

💘BC107 矩阵转置

🚪传送门

题目要求很简单,就是想让你输入n行m列,输出m行n列。我们直接用for循环来搞定即可,下面实现代码:

#include <stdio.h>
int main()
{
   
    int n = 0;
    int m = 0;
    int arr[10][10] = {
   0};
    scanf("%d %d",&n,&m);
    int i = 0;
    int j = 0;
    for(i=1;i<=n;i++)
    {
   
        for(j=1;j<=m;j++)
        {
   
            scanf("%d",&arr[i][j]);
        }
    }
    for(i = 1;i<=m;i++)
    {
   
        for(j=1;j<=n;j++)
        {
   
            printf("%d ",arr[j][i]);
            if(j%n==0)
            {
   
                printf("\n");
            }
        }
    }
    return 0;
}

 

提交运行:


💘总结

学习C语言的同时,我们也要去大量的刷题,提高自己的编程能力,如果你不太会做题,没有关系,不要害怕,越害怕只会越害怕。牛客网提供题解专区和讨论区会有大神提供题解思路,对新手玩家及其友好,有不清楚的语法,不理解的地方,我们可以先去看看别人的思路,别人的代码,然后自己进行实现,这也能提高我们的编程能力!让我们一起加油把🌹


转载:https://blog.csdn.net/weixin_60478154/article/details/125689792
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场