【C语言】基础刷题训练4(含全面分析和代码改进示例)

简介: 【C语言】基础刷题训练4(含全面分析和代码改进示例)

前言

本章刷题博客主要面向基础性题目,包含的主要知识点包括分支循环,数组的使用,循环嵌套等等…比较重点的内容有冒泡排序和库函数qsort的使用。


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

  1. 时间转换 题号:BC30 链接:https://www.nowcoder.com/practice/
    c4ae7bcac7f9491b8be82ee516a94899?tpId=290&tqId=39818&ru=/exam/oj
  2. 总成绩和平均分计算 题号:(⽆) 链接:https://www.nowcoder.com/
    questionTerminal/0fa5132c156b434da4347ad051c4be22
  3. KIKI和酸奶 题号:BC35 链接:https://www.nowcoder.com/practice/c
    7721f3a1b1a47a783974453e82cadbb?tpId=290&tqId=39823&ru=/exam/oj
  4. 发布会信息 题号:(⽆)链接:https://www.nowcoder.com/questi
    onTerminal/20e59d0f388448c68f581b9d3ca66049
  5. 输出学⽣信息 题号:(⽆)链接:https://www.nowcoder.com/que
    stionTerminal/8e94458049eb4e838f711bbd1be0045e
  6. 计算平均成绩 题号:(⽆) 链接:https://www.nowcoder.com/que
    stionTerminal/30a28eb88c3f4e87be1a5b397ddd6fe2
  7. 进制A+B 题号:BC20 链接:https://www.nowcoder.com/practice/6
    187581174ac48278ca3bccf8d534897?tpId=290&tqId=39808&ru=/exam/oj
  8. ⽹购 题号:BC63 链接:https://www.nowcoder.com/practice/5d7d
    fd405e5f4e4fbfdff6862c46b751?tpId=290&tqId=39851&ru=/exam/oj
  9. 争夺前五名 题号:BC120 链接:https://www.nowcoder.com/practi
    ce/cd052308a1c44a88ad00255f312c3e14?tpId=290&tqId=39908&ru=/exam/oj

T1:

思路1:

用循环的方式先处理小时再处理分钟再处理秒

代码展示:

//T1:way1
void T1_way1(void)
{
  //三个变量,分别用来表示秒,分钟,小时
  int s = 0;
  int m = 0;
  int h = 0;
  scanf("%d", &s);
  //处理分钟:
  while (s >= 60)
  {
    s -= 60;
    m++;
  }
  //处理小时:
  while (m >= 60)
  {
    m -= 60;
    h++;
  }
  printf("%d %d %d", h, m, s);
}
int main()
{
  T1_way1();
  return 0;
}

思路2:

用/和%的方式依次对小时分钟和秒进行处理

//T1:way2
void T1_way2(void)
{
  //创建三个变量,分别表示秒,分钟,小时
  int s = 0;
  int m = 0;
  int h = 0;
  scanf("%d", &s);
  //计算
  h = s / 60 / 60;
  m = s / 60 % 60;
  s = s % 60;
  //打印
  printf("%d %d %d", h, m, s);
}
int main()
{
  //T1_way1();
  T1_way2();
  return 0;
}

T1总结:

我感觉上面两种方法都是先处理小时再处理分钟最后处理秒的一个思路,只不过感觉第一种用循环比较容易想到,第二种的话是对/和%比较深入的理解才有所想法。

T2:

思路1:

创建三个变量,然后打印平均值

需要注意的是:相除要得到浮点数结果,除号的两个操作数至少有一个是浮点类型的值才行。

void T2_way1(void)
{
  //创建三个变量,用来存储该学生的每科成绩
  double a, b, c;
  scanf("%lf %lf %lf", &a, &b, &c);
  //打印
  printf("%.2lf %.2lf", a + b + c, (a + b + c) / 3.0);
}
int main()
{
  //T1_way1();
  //T1_way2();
  T2_way1();
  return 0;
}

思路2:

利用数组进行存储数值,然后求平均值

用数组的好处是:可以处理大量数值,如果输入300科的成绩也可以进行处理

void T2_way2(void)
{
  //存储
  double arr[3] = { 0 };
  //输入
  scanf("%lf %lf %lf", &arr[0], &arr[1], &arr[2]);
  //计算
  double sum = arr[0] + arr[1] + arr[2];
  double average = sum / 3.0;
  
  //输出
  printf("%.2lf %.2lf\n", sum, average);
}
int main()
{
  //T1_way1();
  //T1_way2();
  //T2_way1();
  T2_way2();
  return 0;
}

思路3:

一边输入,一边计算

这种思路的好处是节省内存空间,提升效率

void T2_way3(void)
{
  double sum = 0.0;
  double a = 0;
  //输入+计算
  int i = 0;
  for (i = 0; i < 3; i++)
  {
    scanf("%lf", &a);
    sum += a;
  }
  //输出结果
  printf("%.2lf %.2lf\n", sum, sum / 3.0);
}
int main()
{
  //T1_way1();
  //T1_way2();
  //T2_way1();
  //T2_way2();
  T2_way3();
  return 0;
}

T2总结:

我认为way3是最优的,因为我们这道题不需要存储数据浪费空间的,一边输入一边计算可以节省效率和内存空间,一举两得。

T3:

思路1:

void T3_way1(void)
{
  int n, h, m;
  while (scanf("%d %d %d", &n, &h, &m) != EOF)
  {
    //通常情况:
    n = n - m/h;
    //如果时间有剩余,那么肯定又开了一瓶
    if (m % h)
    {
      n--;
    }
    printf("%d\n", n);
  }
}
int main()
{
  //T1_way1();
  //T1_way2();
  //T2_way1();
  //T2_way2();
  //T2_way3();
  T3_way1();
  return 0;
}

T3总结:

我感觉这个题目主要就是考了一下if的用法吧,没什么值得说的点,其实还有一种思路,跟way1大同小异,也就不说了。

值得注意的是多组输入这个东西,类似于一个模板,就是while(scanf()!=EOF)基本类似于这种东西的一个模板,需要简单提一下。

T4:

思路1:

直接打印就行了

void T4_way1(void)
{
  printf("I lost my cellphone!\n");
}
int main()
{
  //T1_way1();
  //T1_way2();
  //T2_way1();
  //T2_way2();
  //T2_way3();
  //T3_way1();
  T4_way1();
  return 0;
}

T4总结:

这个题目没什么好说的都会。。。

需要注意的是在OJ上做题,尤其这种打印的,直接复制就行了,自己打字打半天还容易打错。。。

T5:

思路1:

直接打印

void T5_way1(void)
{
  printf("Name    Age    Gender\n");
  printf("---------------------\n");
  printf("Jack    18     man\n");
}
int main()
{
  //T1_way1();
  //T1_way2();
  //T2_way1();
  //T2_way2();
  //T2_way3();
  //T3_way1();
  //T4_way1();
  T5_way1();
  return 0;
}

T5总结:

这种打印的题目没啥可以做的,唯一需要掌握的是,打印时候要学会复制。

T6:

思路1:

五个变量,存储求值

这种代码吧,也没什么问题,总感觉就是怪怪的简单

void T6_way1(void)
{
  int a, b, c, d, e;
  scanf("%d %d %d %d %d", &a, &b, &c, &d, &e);
  printf("%.1f\n", (a + b + c + d + e) / 5.0);
}
int main()
{
  //T1_way1();
  //T1_way2();
  //T2_way1();
  //T2_way2();
  //T2_way3();
  //T3_way1();
  //T4_way1();
  //T5_way1();
  T6_way1();
  return 0;
}

思路2:

利用数组进行存储求值

void T6_way2(void)
{
  int arr[5] = { 0 };
  //输入
  int i = 0;
  for (i = 0; i < 5; i++)
  {
    scanf("%d", &arr[i]);
  }
  //求和
  int sum = 0;
  for (i = 0; i < 5; i++)
  {
    sum += arr[i];
  }
  //输出
  printf("%.1lf", sum / 5.0);
}
int main()
{
  //T1_way1();
  //T1_way2();
  //T2_way1();
  //T2_way2();
  //T2_way3();
  //T3_way1();
  //T4_way1();
  //T5_way1();
  //T6_way1();
  T6_way2();
  return 0;
}

思路3:

一边输入一边求值,效率内存最高

void T6_way3(void)
{
  //创建变量
  int i = 0;
  int sum = 0;
  int num = 0;
  
  //输入+求值
  for (i = 0; i < 5; i++)
  {
    scanf("%d", &num);
    sum += num;
  }
  //输出
  printf("%.1lf\n", sum / 5.0);
}
int main()
{
  //T1_way1();
  //T1_way2();
  //T2_way1();
  //T2_way2();
  //T2_way3();
  //T3_way1();
  //T4_way1();
  //T5_way1();
  //T6_way1();
  //T6_way2();
  T6_way3();
  return 0;
}

T6总结:

其实这个题目跟T2基本上是一样的,注意要结合数组,一边输入一边计算来进行求值。

T7:

思路1:

void T7_way1(void)
{
  int a, b;
  //在C语言当中,%x是一个十六进制占位符,%o是一个八进制占位符
  scanf("%x %o", &a, &b);
  printf("%d\n", a + b);
}
int main()
{
  //T1_way1();
  //T1_way2();
  //T2_way1();
  //T2_way2();
  //T2_way3();
  //T3_way1();
  //T4_way1();
  //T5_way1();
  //T6_way1();
  //T6_way2();
  //T6_way3();
  T7_way1();
  return 0;
}

T7总结:

这个题目主要是给大家补充一下知识点,%x是十六进制数字的占位符,%o是八进制数字的占位符。

注意,不同进制的数字只是表示方法的不同而已。

T8:

思路1:

void T8_way1(void)
{
  //表示多少钱
  double a;
  int m, d, flag;
  scanf("%lf %d %d %d", &a, &m, &d, &flag);
  if (m == 11 && d == 11)
  {
    a *= 0.7;
  }
  if (m == 12 && d == 12)
  {
    a *= 0.8;
  }
  if (flag == 1)
  {
    a -= 50;
  }
  if (a >= 0)
    printf("%.2lf\n", a);
  else
    printf("0\n");
}
int main()
{
  //T1_way1();
  //T1_way2();
  //T2_way1();
  //T2_way2();
  //T2_way3();
  //T3_way1();
  //T4_way1();
  //T5_way1();
  //T6_way1();
  //T6_way2();
  //T6_way3();
  //T7_way1();
  T8_way1();
  return 0;
}

T8总结

我感觉这个题目就是训练if的使用的,理好逻辑没啥大问题

T9:

思路1:

利用冒泡排序

void T9_way1(void)
{
  //输入
  int n = 0;
  scanf("%d", &n);
  int arr[50] = { 0 };
  int i = 0;
  for (i = 0; i < n; i++)
  {
    scanf("%d", &arr[i]);
  }
  //冒泡排序
  int j = 0;
  for (i = 0; i < n; i++)
  {
    for (j = 0; j < n - 1; j++)
    {
      if (arr[j] < arr[j + 1])
      {
        int t = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = t;
      }
    }
  }
  //输出
  for (i = 0; i < 5; i++)
  {
    printf("%d ", arr[i]);
  }
}
int main()
{
  //T1_way1();
  //T1_way2();
  //T2_way1();
  //T2_way2();
  //T2_way3();
  //T3_way1();
  //T4_way1();
  //T5_way1();
  //T6_way1();
  //T6_way2();
  //T6_way3();
  //T7_way1();
  //T8_way1();
  T9_way1();
  return 0;
}

思路2:

利用qsort函数进行排序

int cmp_int(const void* e1, const void* e2)
{
  return *(int*)e2 - *(int*)e1;
}
void T9_way2(void)
{
  //输入
  int n = 0;
  scanf("%d", &n);
  int arr[50] = { 0 };
  int i = 0;
  for (i = 0; i < n; i++)
  {
    scanf("%d", &arr[i]);
  }
  //qsort排序
  qsort(arr, n, sizeof(int), cmp_int);
  //输出
  for (i = 0; i < 5; i++)
  {
    printf("%d ", arr[i]);
  }
}
int main()
{
  //T1_way1();
  //T1_way2();
  //T2_way1();
  //T2_way2();
  //T2_way3();
  //T3_way1();
  //T4_way1();
  //T5_way1();
  //T6_way1();
  //T6_way2();
  //T6_way3();
  //T7_way1();
  //T8_way1();
  //T9_way1();
  T9_way2();
  return 0;
}

所有代码展示:

#include<stdio.h>
#include<stdlib.h>
//T1:way1
void T1_way1(void)
{
  //三个变量,分别用来表示秒,分钟,小时
  int s = 0;
  int m = 0;
  int h = 0;
  scanf("%d", &s);
  //处理分钟:
  while (s >= 60)
  {
    s -= 60;
    m++;
  }
  //处理小时:
  while (m >= 60)
  {
    m -= 60;
    h++;
  }
  printf("%d %d %d", h, m, s);
}
//T1:way2
void T1_way2(void)
{
  //创建三个变量,分别表示秒,分钟,小时
  int s = 0;
  int m = 0;
  int h = 0;
  scanf("%d", &s);
  //计算
  h = s / 60 / 60;
  m = s / 60 % 60;
  s = s % 60;
  //打印
  printf("%d %d %d", h, m, s);
}
void T2_way1(void)
{
  //创建三个变量,用来存储该学生的每科成绩
  double a, b, c;
  scanf("%lf %lf %lf", &a, &b, &c);
  //打印
  printf("%.2lf %.2lf", a + b + c, (a + b + c) / 3.0);
}
void T2_way2(void)
{
  //存储
  double arr[3] = { 0 };
  //输入
  scanf("%lf %lf %lf", &arr[0], &arr[1], &arr[2]);
  //计算
  double sum = arr[0] + arr[1] + arr[2];
  double average = sum / 3.0;
  
  //输出
  printf("%.2lf %.2lf\n", sum, average);
}
void T2_way3(void)
{
  double sum = 0.0;
  double a = 0;
  //输入+计算
  int i = 0;
  for (i = 0; i < 3; i++)
  {
    scanf("%lf", &a);
    sum += a;
  }
  //输出结果
  printf("%.2lf %.2lf\n", sum, sum / 3.0);
}
void T3_way1(void)
{
  int n, h, m;
  while (scanf("%d %d %d", &n, &h, &m) != EOF)
  {
    //通常情况:
    n = n - m/h;
    //如果时间有剩余,那么肯定又开了一瓶
    if (m % h)
    {
      n--;
    }
    printf("%d\n", n);
  }
}
void T4_way1(void)
{
  printf("I lost my cellphone!\n");
}
void T5_way1(void)
{
  printf("Name    Age    Gender\n");
  printf("---------------------\n");
  printf("Jack    18     man\n");
}
void T6_way1(void)
{
  int a, b, c, d, e;
  scanf("%d %d %d %d %d", &a, &b, &c, &d, &e);
  printf("%.1f\n", (a + b + c + d + e) / 5.0);
}
void T6_way2(void)
{
  int arr[5] = { 0 };
  //输入
  int i = 0;
  for (i = 0; i < 5; i++)
  {
    scanf("%d", &arr[i]);
  }
  //求和
  int sum = 0;
  for (i = 0; i < 5; i++)
  {
    sum += arr[i];
  }
  //输出
  printf("%.1lf", sum / 5.0);
}
void T6_way3(void)
{
  //创建变量
  int i = 0;
  int sum = 0;
  int num = 0;
  
  //输入+求值
  for (i = 0; i < 5; i++)
  {
    scanf("%d", &num);
    sum += num;
  }
  //输出
  printf("%.1lf\n", sum / 5.0);
}
void T7_way1(void)
{
  int a, b;
  //在C语言当中,%x是一个十六进制占位符,%o是一个八进制占位符
  scanf("%x %o", &a, &b);
  printf("%d\n", a + b);
}
void T8_way1(void)
{
  //表示多少钱
  double a;
  int m, d, flag;
  scanf("%lf %d %d %d", &a, &m, &d, &flag);
  if (m == 11 && d == 11)
  {
    a *= 0.7;
  }
  if (m == 12 && d == 12)
  {
    a *= 0.8;
  }
  if (flag == 1)
  {
    a -= 50;
  }
  if (a >= 0)
    printf("%.2lf\n", a);
  else
    printf("0\n");
}
void T9_way1(void)
{
  //输入
  int n = 0;
  scanf("%d", &n);
  int arr[50] = { 0 };
  int i = 0;
  for (i = 0; i < n; i++)
  {
    scanf("%d", &arr[i]);
  }
  //冒泡排序
  int j = 0;
  for (i = 0; i < n; i++)
  {
    for (j = 0; j < n - 1; j++)
    {
      if (arr[j] < arr[j + 1])
      {
        int t = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = t;
      }
    }
  }
  //输出
  for (i = 0; i < 5; i++)
  {
    printf("%d ", arr[i]);
  }
}
int cmp_int(const void* e1, const void* e2)
{
  return *(int*)e2 - *(int*)e1;
}
void T9_way2(void)
{
  //输入
  int n = 0;
  scanf("%d", &n);
  int arr[50] = { 0 };
  int i = 0;
  for (i = 0; i < n; i++)
  {
    scanf("%d", &arr[i]);
  }
  //qsort排序
  qsort(arr, n, sizeof(int), cmp_int);
  //输出
  for (i = 0; i < 5; i++)
  {
    printf("%d ", arr[i]);
  }
}
int main()
{
  //T1_way1();
  //T1_way2();
  //T2_way1();
  //T2_way2();
  //T2_way3();
  //T3_way1();
  //T4_way1();
  //T5_way1();
  //T6_way1();
  //T6_way2();
  //T6_way3();
  //T7_way1();
  //T8_way1();
  //T9_way1();
  T9_way2();
  return 0;
}

结语:

感觉这种简单题目自己做一遍是最好的,为了方便我写代码时候直接放一个main函数去了。

多练习多练习,哈哈。

相关文章
|
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语言代码示例,展示了如何高效地处理顺序表数据结构的各种问题。
|
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语言中的位运算和文件处理技术。
|
10天前
|
存储 C语言
C语言程序设计核心详解 第七章 函数和预编译命令
本章介绍C语言中的函数定义与使用,以及预编译命令。主要内容包括函数的定义格式、调用方式和示例分析。C程序结构分为`main()`单框架或多子函数框架。函数不能嵌套定义但可互相调用。变量具有类型、作用范围和存储类别三种属性,其中作用范围分为局部和全局。预编译命令包括文件包含和宏定义,宏定义分为无参和带参两种形式。此外,还介绍了变量的存储类别及其特点。通过实例详细解析了函数调用过程及宏定义的应用。