【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进

简介: 【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进

前言

鹏哥C语言刷题训练营第六课代码来咯,大家可以参考一下:


代码链接(有需要请自行复制链接进入牛客网练习)

  1. 计算单位阶跃函数 题号:BC70 链接:https://www.nowcoder.com/
    practice/0b23793ae48a4e6cb7dfff042c959a04?tpId=290&tqId=39858&ru=/exam/oj
  2. 三⻆形判断 题号:BC71 链接:https://www.nowcoder.com/practic
    e/689ec1e742394e09b1059556fc167b65?tpId=290&tqId=39859&ru=/exam/oj
  3. 衡量⼈体胖瘦程度 题号:(⽆) 链接:https://www.nowcoder.com/
    questionTerminal/4d604603fae94a26b59b7bc18f363bc0
  4. 计算⼀元⼆次⽅程 题号:BC73 链接:https://www.nowcoder.com/
    practice/7da524bb452441b2af7e64545c38dc26?tpId=290&tqId=39861&ru=/exam/oj
  5. 获得⽉份天数 题号:BC74 链接:https://www.nowcoder.com/practi
    ce/13aeae34f8ed4697960f7cfc80f9f7f6?tpId=290&tqId=39862&ru=/exam/oj
  6. 简单计算器 题号:BC77 链接:https://www.nowcoder.com/practic
    e/b8f770674ba7468bb0a0efcc2aa3a239?tpId=290&tqId=39865&ru=/exam/oj
  7. 线段图案 题号:BC98 链接:https://www.nowcoder.com/practice/
    a95744270f274a14a8a0dafe10421589?tpId=290&tqId=39886&ru=/exam/oj
  8. 正⽅形图案 题号:BC99 链接:https://www.nowcoder.com/practic
    e/1304bb23c2e344989d5c7a578d263e4c?tpId=290&tqId=39887&ru=/exam/oj
  9. 直⻆三⻆形图案 题号:BC100 链接:https://www.nowcoder.com/pr
    actice/00dd93f7c7074754b7511bf56d1f15ac?tpId=290&tqId=39888&ru=/exam/oj

T1:

这个题就是咱们数学的学的那种分段函数,而且y值就仨,很简单,用if控制x的变化就行了其实。

思路1:

直接用if控制x,然后构造分段函数的逻辑

void T1_way1(void)
{
  int t = 0;
  while (~scanf("%d", &t))
  {
    if (t > 0)
      printf("1\n");
    else if (t < 0)
      printf("0\n");
    else
      printf("0.5\n");
  }
}

然后就是这个题目没啥好说的,下一个题目吧

T2:

这里可以简单写一下逻辑哈,看下面图吧:

思路1:

按照上面逻辑用if写出来就行了

代码:

void T2_way1(void)
{
  int a = 0;
  int b = 0;
  int c = 0;
  while (~scanf("%d %d %d", &a, &b, &c))
  {
    //确保他是一个三角形
    if (a + b > c && a + c > b && b + c > a)
    {
      //三个边都相等,是等边三角形
      if (a == b && a == c)
        printf("Equilateral triangle!\n");
      //有两个边一样,另一个不一样是等腰三角形
      else if ((a == b && a != c) || (a == c && a != b) || (b == c && b != a))
      {
        printf("Isosceles triangle!\n");
      }
      //一般的三角形
      else
        printf("Ordinary triangle!\n");
    }
    //他不是一个三角形
    else
    {
      printf("Not a triangle!\n");
    }
  }
}

T3:

这个感觉也是一个类型的代码,跟前面俩一样都是锻炼将简单的数学公式转换成代码的这种类型

思路1:

void T3_way1(void)
{
  int w = 0;//input kg
  int h = 0;//input cm
  while (~scanf("%d %d", &w, &h))
  {
    //求BMI的公式是:体重(kg)/升高的平方(m)
    double BMI = w / ((h / 100.0) * (h / 100.0));
    if (BMI < 18.5)
    {
      printf("Underweight\n");
    }
    else if (BMI >= 18.5 && BMI <= 23.9)
    {
      printf("Normal\n");
    }
    else if (BMI > 23.9 && BMI <= 27.9)
    {
      printf("Overweight\n");
    }
    else
      printf("Obese\n");
  }
}

T4:

思路,这个题目可能稍微繁琐一点,分的条件可能比较多…慢慢来吧,问题不大

思路1:

void T4_way1(void)
{
  double a = 0.0;
  double b = 0.0;
  double c = 0.0;
  while (scanf("%lf%lf%lf", &a, &b, &c) != EOF)
  {
    //a == 0,这种不属于一元二次方程
    if (a == 0)
    {
      printf("Not quadratic equation\n");
    }
    //a != 0,这种情况下就属于一元二次方程了,接下来对disc进行分类就好了
    else
    {
      //因为接下来是以disc为依据进行分类的,所以需要先求一下disc是多少?
      double disc = b * b - 4 * a * c;
      //disc==0,这种情况,x1==x2
      if (disc == 0)
      {
        if ((-b + sqrt(disc)) / (2 * a) == 0)
          printf("x1=x2=0.00\n");
        else
          printf("x1=x2=%.2lf\n", (-b + sqrt(disc)) / (2 * a));
      }
      //disc>0这种情况的话这种情况x1,x2有两个值
      else if (disc > 0)
      {
        printf("x1=%.2lf;x2=%.2lf\n", (-b - sqrt(disc)) / (2 * a), (-b + sqrt(disc)) / (2 * a));
      }
      else
      {
        double real = (-b) / (2 * a);
        double image = sqrt(-disc) / (2 * a);
        printf("x1=%.2lf-%.2lfi;x2=%.2lf+%.2lfi\n", real, image, real, image);
      }
    }
  }
}

这里细节还是比较多的哈,建议自己写完代码要放在OJ题目上去试一试能不能通过。

T5:

题目大概意思就是输入年月份,输出这个月多少天,这里需要注意的是有闰年,闰年大部分月份跟正常月份一个天数,就是二月的时候需要多加1天,这里需要注意一下哈。

思路1:

这里就是用数组就行,结合if语句

void T5_way1(void)
{
  //先创建变量,初始化值
  int y = 0;
  int m = 0;
  int days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
  //循环判断
  while (scanf("%d %d", &y, &m) != EOF)
  {
    int day = days[m - 1];
    //看看是不是闰年的2月份
    if ((((y % 4 == 0 && y % 400 != 0) || y % 400 == 0)) && m == 2)
    {
      day++;
    }
    printf("%d", day);
  }
}

思路2:

其实这里还有一种比较奇妙的思路,大家知道就行,就是数组第一个元素可以给0,这样就是可以咱们输入几,就可以调用数组中第几个元素了。

void T5_way2(void)
{
  //先创建变量,初始化值
  int y = 0;
  int m = 0;
  int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
  //循环判断
  while (scanf("%d %d", &y, &m) != EOF)
  {
    int day = days[m];
    //看看是不是闰年的2月份
    if ((((y % 4 == 0 && y % 400 != 0) || y % 400 == 0)) && m == 2)
    {
      day++;
    }
    printf("%d", day);
  }
}

T6:

这个题目就是一个简单的计算器,其实也没啥好说的,后面有机会可以说一下转移表。

思路1:

首先用比较简单的思路吧:

void T6_way1(void)
{
  double n1 = 0;
  double n2 = 0;
  char op = 0;
  while (~scanf("%lf%c%lf", &n1,&op, &n2))
  {
    switch (op)
    {
    case '+':
      printf("%.4lf+%.4lf=%.4lf\n", n1, n2, n1 + n2);
      break;
    case '-':
      printf("%.4lf-%.4lf=%.4lf\n", n1, n2, n1 - n2);
      break; 
    case '*':
        printf("%.4lf*%.4lf=%.4lf\n", n1, n2, n1 * n2);
        break; 
    case '/':
      if (n2 == 0)
        printf("Wrong!Division by zero!\n");
      else
        printf("%.4lf/%.4lf=%.4lf\n", n1, n2, n1 / n2);
        break;
    default:
      printf("Invalid operation!\n");
    }
    
  }
}

思路2:

其实这种方法就属于自定义函数的方法了。

double add(double n1,double n2)
{
  return n1 + n2;
}
double sub(double n1, double n2)
{
  return n1 - n2;
}
double mul(double n1, double n2)
{
  return n1 * n2;
}
double div(double n1, double n2)
{
  return n1 / n2;
}
void T6_way2(void)
{
  double n1 = 0;
  double n2 = 0;
  char op = 0;
  while (~scanf("%lf%c%lf", &n1, &op, &n2))
  {
    switch (op)
    {
    case '+':
      printf("%.4lf+%.4lf=%.4lf\n", n1, n2, add(n1, n2));
      break;
    case '-':
      printf("%.4lf-%.4lf=%.4lf\n", n1, n2, sub(n1,n2));
      break;
    case '*':
      printf("%.4lf*%.4lf=%.4lf\n", n1, n2, mul(n1,n2));
      break;
    case '/':
      if (n2 == 0)
        printf("Wrong!Division by zero!\n");
      else
        printf("%.4lf/%.4lf=%.4lf\n", n1, n2, div(n1,n2));
      break;
    default:
      printf("Invalid operation!\n");
    }
  }
  
}

思路3

下面咱们用指针结合转移表来做一下哈,转移表就是函数指针数组,跟题目稍微有点不符合,可以自己稍微改改哈,知道有这么一种方法就行,不用太拘泥在那个题里面。

double add(double n1,double n2)
{
  return n1 + n2;
}
double sub(double n1, double n2)
{
  return n1 - n2;
}
double mul(double n1, double n2)
{
  return n1 * n2;
}
double div(double n1, double n2)
{
  return n1 / n2;
}
menu()
{
  printf("1:'+'\n");
  printf("2:'-'\n");
  printf("3:'*'\n");
  printf("4:'/'\n");
}
void T6_way3(void)
{
  double n1 = 0;
  double n2 = 0;
  int op = 0;
  
  //转移表(函数指针数组)
  double (*p[5])(double n1, double n2) = { 0,add,sub,mul,div };
  menu();
  while (~scanf("%lf%d%lf",&n1,&op,&n2)&&op)
  {
    if (op > 0 && op < 5)
    {
      printf("%.4lf\n", (*p[op])(n1, n2));
    }
    else if (op == 0)
      printf("退出计算器\n"); 
    else
      printf("输入有误,重新输入\n");
  }
}

T7:

这个题目简单,用循环就行了,三种循环都行。

思路1:

这里就只说这么一种循环了,其他都差不多。

void T7_way1(void)
{
  int n = 0;
  while (~scanf("%d", &n))
  {
    for (int i = 0; i < n; i++)
    {
    printf("*");
    }
    printf("\n");
  }
  
}

T8:

就是一个双层嵌套循环。

这个题也很简单,直接看代码吧。

思路1:

void T8_way1(void)
{
  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++)
      {
        printf("* ");
      }
      printf("\n");
    }
  }
}

T9:

双层嵌套,这个的话把循环的判断条件一改就行。

思路1:

void T9_way1(void)
{
  int n = 0;
  scanf("%d", &n);
  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j <= i; j++)
    {
      printf("* ");
    }
    printf("\n");
  }
}

结语:

以上就是本节的所有内容了,因为这些代码都是在vs上随手敲的,难免有一些错误哈,测试用例基本都用了1个就过去了,有错误评论区提醒一下,这些题目虽然说很简单,我觉得一些思路还是比较好的,大家借鉴哈~

相关文章
|
10天前
|
存储 算法 C语言
数据结构基础详解(C语言):单链表_定义_初始化_插入_删除_查找_建立操作_纯c语言代码注释讲解
本文详细介绍了单链表的理论知识,涵盖单链表的定义、优点与缺点,并通过示例代码讲解了单链表的初始化、插入、删除、查找等核心操作。文中还具体分析了按位序插入、指定节点前后插入、按位序删除及按值查找等算法实现,并提供了尾插法和头插法建立单链表的方法,帮助读者深入理解单链表的基本原理与应用技巧。
|
10天前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
|
10天前
|
存储 算法 C语言
C语言手撕实战代码_二叉排序树(二叉搜索树)_构建_删除_插入操作详解
这份二叉排序树习题集涵盖了二叉搜索树(BST)的基本操作,包括构建、查找、删除等核心功能。通过多个具体示例,如构建BST、查找节点所在层数、删除特定节点及查找小于某个关键字的所有节点等,帮助读者深入理解二叉排序树的工作原理与应用技巧。此外,还介绍了如何将一棵二叉树分解为两棵满足特定条件的BST,以及删除所有关键字小于指定值的节点等高级操作。每个题目均配有详细解释与代码实现,便于学习与实践。
|
10天前
|
存储 算法 C语言
C语言手撕实战代码_二叉树_构造二叉树_层序遍历二叉树_二叉树深度的超详细代码实现
这段代码和文本介绍了一系列二叉树相关的问题及其解决方案。其中包括根据前序和中序序列构建二叉树、通过层次遍历序列和中序序列创建二叉树、计算二叉树节点数量、叶子节点数量、度为1的节点数量、二叉树高度、特定节点子树深度、判断两棵树是否相似、将叶子节点链接成双向链表、计算算术表达式的值、判断是否为完全二叉树以及求二叉树的最大宽度等。每道题目均提供了详细的算法思路及相应的C/C++代码实现,帮助读者理解和掌握二叉树的基本操作与应用。
|
10天前
|
存储 算法 C语言
C语言手撕实战代码_循环单链表和循环双链表
本文档详细介绍了用C语言实现循环单链表和循环双链表的相关算法。包括循环单链表的建立、逆转、左移、拆分及合并等操作;以及双链表的建立、遍历、排序和循环双链表的重组。通过具体示例和代码片段,展示了每种算法的实现思路与步骤,帮助读者深入理解并掌握这些数据结构的基本操作方法。
|
10天前
|
算法 C语言 开发者
C语言手撕实战代码_单链表
本文档详细介绍了使用C语言实现单链表的各种基本操作和经典算法。内容涵盖单链表的构建、插入、查找、合并及特殊操作,如头插法和尾插法构建单链表、插入元素、查找倒数第m个节点、合并两个有序链表等。每部分均配有详细的代码示例和注释,帮助读者更好地理解和掌握单链表的编程技巧。此外,还提供了判断子链、查找公共后缀等进阶题目,适合初学者和有一定基础的开发者学习参考。
|
10天前
|
存储 算法 C语言
C语言手撕数据结构代码_顺序表_静态存储_动态存储
本文介绍了基于静态和动态存储的顺序表操作实现,涵盖创建、删除、插入、合并、求交集与差集、逆置及循环移动等常见操作。通过详细的C语言代码示例,展示了如何高效地处理顺序表数据结构的各种问题。
|
算法 机器人 程序员
大一新生应该如何学习C语言,书上代码看不懂理解不了怎么办?(2)
大一新生应该如何学习C语言,书上代码看不懂理解不了怎么办?
187 0
|
7天前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
|
10天前
|
存储 C语言
C语言程序设计核心详解 第十章:位运算和c语言文件操作详解_文件操作函数
本文详细介绍了C语言中的位运算和文件操作。位运算包括按位与、或、异或、取反、左移和右移等六种运算符及其复合赋值运算符,每种运算符的功能和应用场景都有具体说明。文件操作部分则涵盖了文件的概念、分类、文件类型指针、文件的打开与关闭、读写操作及当前读写位置的调整等内容,提供了丰富的示例帮助理解。通过对本文的学习,读者可以全面掌握C语言中的位运算和文件处理技术。