C语言经典练习题(一)

✨作者:@平凡的人1

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

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

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

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


文章目录

    • 前言
    • 倒置字符串
    • BC60 带空格直角三角形图案
    • BC96-有序序列判断
    • BC100 有序序列合并
    • BC106 上三角矩阵判定
    • BC107 矩阵转置
    • 总结

前言

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

你可能会问了为什么

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

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

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

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

倒置字符串

传送门

C语言经典练习题(一)_第1张图片

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

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

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

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

下面,实现我们的代码:

#include 
#include 
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;
}

提交运行:C语言经典练习题(一)_第2张图片

BC60 带空格直角三角形图案

传送门

C语言经典练习题(一)_第3张图片

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

#include 
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;
}

提交运行:C语言经典练习题(一)_第4张图片

BC96-有序序列判断

传送门

C语言经典练习题(一)_第5张图片

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

#include 
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;
}

提交运行:C语言经典练习题(一)_第6张图片

BC100 有序序列合并

传送门

C语言经典练习题(一)_第7张图片

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

#include 
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;
}


提交运行:C语言经典练习题(一)_第8张图片

BC106 上三角矩阵判定

传送门

C语言经典练习题(一)_第9张图片

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

#include 
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;
}

提交运行:C语言经典练习题(一)_第10张图片

BC107 矩阵转置

传送门

C语言经典练习题(一)_第11张图片

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

#include 
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语言经典练习题(一)_第12张图片


总结

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

C语言经典练习题(一)_第13张图片

你可能感兴趣的:(小菜鸟刷题,c语言,算法,开发语言)