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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 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;
}

总结:

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

相关文章
|
2月前
|
存储 安全 数据管理
C语言之考勤模拟系统平台(千行代码)
C语言之考勤模拟系统平台(千行代码)
60 4
|
1月前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
2月前
|
存储 安全 物联网
C语言物联网开发之设备安全与代码可靠性隐患
物联网设备的C语言代码安全与可靠性至关重要。一是防范代码安全漏洞,包括缓冲区溢出和代码注入风险,通过使用安全函数和严格输入验证来预防。二是提高代码跨平台兼容性,利用`stdint.h`定义统一的数据类型,并通过硬件接口抽象与适配减少平台间的差异,确保程序稳定运行。
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
65 1
|
3月前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
3月前
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
|
3月前
|
机器学习/深度学习 编译器 C语言
C语言刷题(中)(保姆式详解)
C语言刷题(中)(保姆式详解)
21 0
|
1月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
66 10
|
1月前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
52 9
|
1月前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
41 8