【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)

前言

注:本文题目是作者听课视频讲解,来自比特鹏哥C语言刷题训练营,有些许代码思路借鉴。

在本节博客当中,题目难度有了一点点提升,然后就是更注重一些题目的多解性了,仔细对比不同的代码和思路解法,就能促进自己对代码的理解和掌握。


题目链接(有需要请自行链接做题)

第5讲

  1. 精选社⻓ 题号:BC147 链接:https://www.nowcoder.com/practic
    e/45a30e3ef51040ed8a7674984d6d1553?tpId=290&tqId=39935&ru=/exam/oj
  2. 你是天才吗 题号:BC50 链接:https://www.nowcoder.com/practic
    e/557cc54704bb4d56b73b62d1a5455331?tpId=290&tqId=39838&ru=/exam/oj
  3. 完美成绩 题号:(⽆) 链接:https://www.nowcoder.com/questionTe
    rminal/8312e497509a450f968d9a6a2381ce32
  4. 及格分数 题号:BC51 链接:https://www.nowcoder.com/practice/
    56513524333148b38945e1989bc7df4e?tpId=290&tqId=39839&ru=/exam/oj
  5. 判断整数的奇偶性 题号:BC52 链接:https://www.nowcoder.com/
    practice/a8b018667e274af29b5f76a6673450fc?tpId=290&tqId=39840&ru=/exam/oj
  6. 最⾼分数 题号:(⽆) 链接:https://www.nowcoder.com/questio
    nTerminal/52c18a3b49a54fc98107fbdde1415f90
  7. 判断元⾳还是辅⾳ 40题号:BC53 链接:https://www.nowcoder.com/p
    ractice/7eb4df4d52c44d309081509cf52ecbc4?tpId=290&tqId=39841&ru=/exam/oj
  8. 判断是不是字⺟ 题号:BC60 链接:https://www.nowcoder.com/practice/91a588dd4cd244bfa616f17603ec123c?tpId=290&tqId=39848&ru=/exam/oj
  9. 大小写字母转换 题号:BC48 链接:https://www.nowcoder.com/practice/850ebd30a2a34cfc87199da3fc15786a?tpId=107&&tqId=33329&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking

T1:

题目解析:

看着挺高大上,还是竞选社长,其实说白了就是给一串字符串,然后这个字符串里有A有B,该字符串以0为结束标志,让你数一数哪个多罢了。

思路1:

创建一个数组,存储一下字符串,然后用数组+循环进行挨个访问,挨个计数就行了

代码实现:

void T1_way1(void)
{
  //创建一个数组,读入并存储字符串
  char str[100] = { 0 };
  scanf("%s", str);//一般scanf需要给一个地址,这里数组名就是数组首元素地址
  //循环依次访问,直到遇到0或者EOF
  int i = 0;
  int count_a = 0;
  int count_b = 0;
  while (str[i] != '0' && str[i] != EOF)
  {
    if (str[i] == 'A')
      count_a++;
    if (str[i] == 'B')
      count_b++;
    i++;
  }
  //按照情况来打印
  if (count_a > count_b)
    printf("A\n");
  else if (count_a < count_b)
    printf("B\n");
  else
    printf("E\n");
}

思路2:

其实计数这个地方可以升级一下哈,咱有俩计数的变量,有点多,其实一个就够了,数个A计数+1,数个B-计数就1,这样的话是比较不错的。

然后代码就变成这样了:

void T1_way2(void)
{
  //创建一个数组,读入并存储字符串
  char str[100] = { 0 };
  scanf("%s", str);//一般scanf需要给一个地址,这里数组名就是数组首元素地址
  //循环依次访问,直到遇到0或者EOF
  int i = 0;
  int count = 0;
  while (str[i] != '0' && str[i] != EOF)
  {
    if (str[i] == 'A')
      count++;
    if (str[i] == 'B')
      count--;
    i++;
  }
  //按照情况来打印
  if (count > 0)
    printf("A\n");
  else if (count < 0)
    printf("B\n");
  else
    printf("E\n");
}

思路3:

感觉我们得把一个字符串需要存起来,存起来的话,是不是有点浪费空间,我们到最后又不需要这个数组里的值,,,只是看看A多还是B多而已。。。要不我干脆补存储字符串了,一边读,一边计数不就得了

void T1_way3(void)
{
  //一边读一边计数,循环依次访问,直到遇到0或者EOF
  char ch = '0';
  int count = 0;
  while (ch = getchar() != '0'&& ch != EOF)
  {
    if (ch == 'A')
      count++;
    if (ch == 'B')
      count--;
  }
  //按照情况来打印
  if (count > 0)
    printf("A\n");
  else if (count < 0)
    printf("B\n");
  else
    printf("E\n");
}

这样的话其实没了数组计数变量也被我们搞成一个了,所以说应该是代码效率提升了不少哈哈,所以这种简单题目可以试试能不能我们把他的这个效率还有需要的内存给他搞得好一点。。。注意细节得。

T2:

题意:这个题也是一个超级简单的题目,说白了就是编一个程序,这个程序是这样滴:搞一个比较值,一个数字大于等于这个比较值,就是天才,小于就不是。

思路1:

直接搞俩变量,一个是存储这个比较值另一个输入值就行了

void T2_way1(void)
{
  int a = 140;
  int iq = 0;
  while(scanf("%d", &iq)!=EOF)
  {
    if (iq >= a)
      printf("Genius\n");
  }
}

思路2:

其实这个多组输入还可以换一种写法:

void T2_way2(void)
{
  int a = 140;
  int iq = 0;
  while (~scanf("%d", &iq))
  {
    if (iq >= a)
      printf("Genius\n");
  }
}

可以自己稍微考量一下为啥这个多组输入还可以这么写哈,不会的私信我,我给你说哈。

然后这个题目就没啥好说的了吧,毕竟太简单了,没有可以改进的地方啊。。。

T3:

额,其实这个题目跟上一个一样的,就是改了改那个比较数字而已。。。

思路1:

代码我就直接copy上一个的代码了,没事可以自己再试一下。。。

void T3_way1(void)
{
  int a = 90;
  int iq = 0;
  while (~scanf("%d", &iq))
  {
    if (iq >= a)
      printf("Perfect\n");
  }
}

T4:

题目解析:跟前面俩题一样的,不多废话了。。。感觉这三个题目选的有点划水的感觉。。。

思路1:

void T4_way1(void)
{
  int a = 60;
  int iq = 0;
  while (~scanf("%d", &iq))
  {
    if (iq >= a)
      printf("Pass\n");
    else
      printf("Fail\n");
  }
}

T5:

题目解析:

就是你搞个数字进去,让程序看看是偶数还是奇数。。。用%操作就行了。

思路1:

void T5_way1(void)
{
  int num = 0;
  while (scanf("%d", &num) != EOF)
  {
    if (num % 2 == 0)
      printf("Even\n");
    else
      printf("Odd\n");
  }
}

T6:

题目解析:就是输入三个数字,程序输出其中的最大的数字。

额。。。这个题目的话很多人可能想到了类似于打擂台的那种方式。。。其实这种三个比较量的时候,可以用三目操作符搞一下。

思路1:

三目操作符的使用,主要就是复习一下,省的忘干净C语言还有这个东西,这东西用起来其实相当好用的,不过很多人想不到而已。

void T6_way1(void)
{
  int a, b, c;
  while (~scanf("%d %d %d", &a, &b, &c))
  {
    int max = a > b ? a : b;
    max = max > c ? max : c;
    printf("%d\n", max);
  }
}

思路2:

就是平常那种打擂台的方式,或者再加上数组高级一点。

void T6_way2(void)
{
  int n1 = 0;
  int n2 = 0;
  int n3 = 0;
  int max = 0;
  while (scanf("%d %d %d",&n1,&n2,&n3) != EOF)
  {
    max = n1;
    if (n2 > max)
      max = n2;
    if (n3 > max)
      max = n3;
    printf("%d\n", max);
  }
  
}

T7:

题目分析:就是输入一个字母看看是元音还是辅音。。。

思路1:

void T7_way1(void)
{
  char str[] = "AEIOUaeiou";
  char ch = 0;
  while (scanf("%c", &ch) != EOF)
  {
    int i = 0;
    for (i = 0; i < 10; i++)
    {
      if (ch == str[i])
      {
        printf("Vowel\n");
        break;
      }
    }
    getchar();
    if (i == 10)
      printf("Consonant\n");
  }
}

这里得说一下哈,scanf输入字符时候,我们按回车也算一个字符,为了把那个回车给“吃掉”,所以就有搞了个getchar()函数。。。

思路2:

然后那个回车问题的话,其实在scanf%c前面加个空格也可以解决哈,就是也可以不用特地加一个getchar()来“吃掉”多余的回车。。。

void T7_way2(void)
{
  char str[] = "AEIOUaeiou";
  char ch = 0;
  while (scanf(" %c", &ch) != EOF)
  {
    int i = 0;
    for (i = 0; i < 10; i++)
    {
      if (ch == str[i])
      {
        printf("Vowel\n");
        break;
      }
    }
    if (i == 10)
      printf("Consonant\n");
  }
}

思路3:

void T7_way3(void)
{
  char str[] = "AEIOUaeiou";
  char ch = 0;
  while (scanf(" %c", &ch) != EOF)
  {
      if (strchr(str,ch))
      {
        printf("Vowel\n");
      }
      else
      printf("Consonant\n");
  }
}

然后这里简单提及一下strchr函数吧,就是一个库函数,这个库函数是用来判断一个字符是否在某个数组当中。。。有的话就返回非0,没有的话返回0。。。

T8:

思路1:

直接用库函数判断

头文件:#include<string.h>

void T8_way1(void)
{
  char ch = 0;
  while (scanf(" %c", &ch) != EOF)
  {
    if (isalpha(ch))
      printf("%c is an alphabet.\n",ch);
    else
      printf("%c is not an alphabet.\n",ch);
  }
}

思路2:

oid T8_way2(void)
{
  char ch = 0;
  while (scanf(" %c", &ch) != EOF)
  {
    if (('a'<= ch && ch <= 'z') ||('A' <= ch && ch <= 'Z'))
      printf("%c is an alphabet.\n",ch);
    else
      printf("%c is not an alphabet.\n",ch);
  }
}

T9:

思路1:

void T9_way1(void)
{
  char ch = 0;
  while (scanf(" %c", &ch) != EOF)
  {
    if ('a' <= ch && ch <= 'z')
      printf("%c", ch-32);
    else if('A' <= ch && ch <= 'Z')
      printf("%c\n", ch+32);
  }
}

思路2:

利用库函数

islower,isupper

头文件:#include<ctype.h>

void T9_way2(void)
{
  char ch = 0;
  while (scanf(" %c", &ch) != EOF)
  {
    if (islower(ch))
      printf("%c", ch - 32);
    else if (isupper(ch))
      printf("%c\n", ch + 32);
  }
}

思路3:

还有库函数tolower,toupper

void T9_way3(void)
{
  char ch = 0;
  while (scanf(" %c", &ch) != EOF)
  {
    if (islower(ch))
      printf("%c", toupper(ch));
    else if (isupper(ch))
      printf("%c\n", tolower(ch));
  }
}

所有代码展示:

#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<ctype.h>
void T1_way1(void)
{
  //创建一个数组,读入并存储字符串
  char str[100] = { 0 };
  scanf("%s", str);//一般scanf需要给一个地址,这里数组名就是数组首元素地址
  //循环依次访问,直到遇到0或者EOF
  int i = 0;
  int count_a = 0;
  int count_b = 0;
  while (str[i] != '0' && str[i] != EOF)
  {
    if (str[i] == 'A')
      count_a++;
    if (str[i] == 'B')
      count_b++;
    i++;
  }
  //按照情况来打印
  if (count_a > count_b)
    printf("A\n");
  else if (count_a < count_b)
    printf("B\n");
  else
    printf("E\n");
}
void T1_way2(void)
{
  //创建一个数组,读入并存储字符串
  char str[100] = { 0 };
  scanf("%s", str);//一般scanf需要给一个地址,这里数组名就是数组首元素地址
  //循环依次访问,直到遇到0或者EOF
  int i = 0;
  int count = 0;
  while (str[i] != '0' && str[i] != EOF)
  {
    if (str[i] == 'A')
      count++;
    if (str[i] == 'B')
      count--;
    i++;
  }
  //按照情况来打印
  if (count > 0)
    printf("A\n");
  else if (count < 0)
    printf("B\n");
  else
    printf("E\n");
}
void T1_way3(void)
{
  //一边读一边计数,循环依次访问,直到遇到0或者EOF
  char ch = '0';
  int count = 0;
  while (ch = getchar() != '0' && ch != EOF)
  {
    if (ch == 'A')
      count++;
    if (ch == 'B')
      count--;
  }
  //按照情况来打印
  if (count > 0)
    printf("A\n");
  else if (count < 0)
    printf("B\n");
  else
    printf("E\n");
}
void T2_way1(void)
{
  int a = 140;
  int iq = 0;
  while (scanf("%d", &iq) != EOF)
  {
    if (iq >= a)
      printf("Genius\n");
  }
}
void T2_way2(void)
{
  int a = 140;
  int iq = 0;
  while (~scanf("%d", &iq))
  {
    if (iq >= a)
      printf("Genius\n");
  }
}
void T3_way1(void)
{
  int a = 90;
  int iq = 0;
  while (~scanf("%d", &iq))
  {
    if (iq >= a)
      printf("Perfect\n");
  }
}
void T4_way1(void)
{
  int a = 60;
  int iq = 0;
  while (~scanf("%d", &iq))
  {
    if (iq >= a)
      printf("Pass\n");
    else
      printf("Fail\n");
  }
}
void T5_way1(void)
{
  int num = 0;
  while (scanf("%d", &num) != EOF)
  {
    if (num % 2 == 0)
      printf("Even\n");
    else
      printf("Odd\n");
  }
}
void T6_way1(void)
{
  int a, b, c;
  while (~scanf("%d %d %d", &a, &b, &c))
  {
    int max = a > b ? a : b;
    max = max > c ? max : c;
    printf("%d\n", max);
  }
}
void T6_way2(void)
{
  int n1 = 0;
  int n2 = 0;
  int n3 = 0;
  int max = 0;
  while (scanf("%d %d %d", &n1, &n2, &n3) != EOF)
  {
    max = n1;
    if (n2 > max)
      max = n2;
    if (n3 > max)
      max = n3;
    printf("%d\n", max);
  }
}
void T7_way1(void)
{
  char str[] = "AEIOUaeiou";
  char ch = 0;
  while (scanf("%c", &ch) != EOF)
  {
    int i = 0;
    for (i = 0; i < 10; i++)
    {
      if (ch == str[i])
      {
        printf("Vowel\n");
        break;
      }
    }
    getchar();
    if (i == 10)
      printf("Consonant\n");
  }
}
void T7_way2(void)
{
  char str[] = "AEIOUaeiou";
  char ch = 0;
  while (scanf(" %c", &ch) != EOF)
  {
    int i = 0;
    for (i = 0; i < 10; i++)
    {
      if (ch == str[i])
      {
        printf("Vowel\n");
        break;
      }
    }
    if (i == 10)
      printf("Consonant\n");
  }
}
void T7_way3(void)
{
  char str[] = "AEIOUaeiou";
  char ch = 0;
  while (scanf(" %c", &ch) != EOF)
  {
    if (strchr(str, ch))
    {
      printf("Vowel\n");
    }
    else
      printf("Consonant\n");
  }
}
void test(void)
{
  char str[] = "AEIOUaeiou";
  char ch = 0;
  scanf("%c", &ch);
  int c = strchr(str, ch);
  printf("%d", c);
}
void T8_way1(void)
{
  char ch = 0;
  while (scanf(" %c", &ch) != EOF)
  {
    if (isalpha(ch))
      printf("%c is an alphabet.\n", ch);
    else
      printf("%c is not an alphabet.\n", ch);
  }
}
void T8_way2(void)
{
  char ch = 0;
  while (scanf(" %c", &ch) != EOF)
  {
    if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z'))
      printf("%c is an alphabet.\n", ch);
    else
      printf("%c is not an alphabet.\n", ch);
  }
}
void T9_way1(void)
{
  char ch = 0;
  while (scanf(" %c", &ch) != EOF)
  {
    if ('a' <= ch && ch <= 'z')
      printf("%c", ch - 32);
    else if ('A' <= ch && ch <= 'Z')
      printf("%c\n", ch + 32);
  }
}
void T9_way2(void)
{
  char ch = 0;
  while (scanf(" %c", &ch) != EOF)
  {
    if (islower(ch))
      printf("%c", ch - 32);
    else if (isupper(ch))
      printf("%c\n", ch + 32);
  }
}
void T9_way3(void)
{
  char ch = 0;
  while (scanf(" %c", &ch) != EOF)
  {
    if (islower(ch))
      printf("%c", toupper(ch));
    else if (isupper(ch))
      printf("%c\n", tolower(ch));
  }
}
int main()
{
  //T1_way1();
  //T1_way2();
  //T1_way3();
  //T2_way1();
  //T2_way2();
  //T3_way1();
  //T4_way1();
  //T5_way1();
  //T6_way1();
  //T6_way2();
  //T7_way1();
  //T7_way2();
  //test();
  //T8_way1();
  //T8_way2();
  //T9_way1();
  //T9_way2();
  T9_way3();
  return 0;
}

总结:

以上就是对鹏哥刷题训练营第五节课所有的代码笔记了~希望同学们还是自己动手敲一下。

相关文章
|
11天前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
11天前
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)
|
11天前
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
|
1月前
|
安全 C语言
在C语言中,正确使用运算符能提升代码的可读性和效率
在C语言中,运算符的使用需要注意优先级、结合性、自增自减的形式、逻辑运算的短路特性、位运算的类型、条件运算的可读性、类型转换以及使用括号来明确运算顺序。掌握这些注意事项可以帮助编写出更安全和高效的代码。
39 4
|
11天前
|
机器学习/深度学习 编译器 C语言
C语言刷题(中)(保姆式详解)
C语言刷题(中)(保姆式详解)
11 0
|
16天前
|
C语言
C语言练习题代码
C语言练习题代码
|
1月前
|
存储 算法 C语言
C语言手撕实战代码_二叉排序树(二叉搜索树)_构建_删除_插入操作详解
这份二叉排序树习题集涵盖了二叉搜索树(BST)的基本操作,包括构建、查找、删除等核心功能。通过多个具体示例,如构建BST、查找节点所在层数、删除特定节点及查找小于某个关键字的所有节点等,帮助读者深入理解二叉排序树的工作原理与应用技巧。此外,还介绍了如何将一棵二叉树分解为两棵满足特定条件的BST,以及删除所有关键字小于指定值的节点等高级操作。每个题目均配有详细解释与代码实现,便于学习与实践。
|
1月前
|
存储 算法 C语言
C语言手撕实战代码_二叉树_构造二叉树_层序遍历二叉树_二叉树深度的超详细代码实现
这段代码和文本介绍了一系列二叉树相关的问题及其解决方案。其中包括根据前序和中序序列构建二叉树、通过层次遍历序列和中序序列创建二叉树、计算二叉树节点数量、叶子节点数量、度为1的节点数量、二叉树高度、特定节点子树深度、判断两棵树是否相似、将叶子节点链接成双向链表、计算算术表达式的值、判断是否为完全二叉树以及求二叉树的最大宽度等。每道题目均提供了详细的算法思路及相应的C/C++代码实现,帮助读者理解和掌握二叉树的基本操作与应用。
|
1月前
|
存储 算法 C语言
C语言手撕实战代码_循环单链表和循环双链表
本文档详细介绍了用C语言实现循环单链表和循环双链表的相关算法。包括循环单链表的建立、逆转、左移、拆分及合并等操作;以及双链表的建立、遍历、排序和循环双链表的重组。通过具体示例和代码片段,展示了每种算法的实现思路与步骤,帮助读者深入理解并掌握这些数据结构的基本操作方法。
|
1月前
|
算法 C语言 开发者
C语言手撕实战代码_单链表
本文档详细介绍了使用C语言实现单链表的各种基本操作和经典算法。内容涵盖单链表的构建、插入、查找、合并及特殊操作,如头插法和尾插法构建单链表、插入元素、查找倒数第m个节点、合并两个有序链表等。每部分均配有详细的代码示例和注释,帮助读者更好地理解和掌握单链表的编程技巧。此外,还提供了判断子链、查找公共后缀等进阶题目,适合初学者和有一定基础的开发者学习参考。