【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函数去了。

多练习多练习,哈哈。

相关文章
|
1月前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
1月前
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)
|
1月前
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
|
2月前
|
安全 C语言
在C语言中,正确使用运算符能提升代码的可读性和效率
在C语言中,运算符的使用需要注意优先级、结合性、自增自减的形式、逻辑运算的短路特性、位运算的类型、条件运算的可读性、类型转换以及使用括号来明确运算顺序。掌握这些注意事项可以帮助编写出更安全和高效的代码。
47 4
|
1月前
|
机器学习/深度学习 编译器 C语言
C语言刷题(中)(保姆式详解)
C语言刷题(中)(保姆式详解)
13 0
|
1月前
|
C语言
C语言练习题代码
C语言练习题代码
|
2月前
|
存储 算法 C语言
C语言手撕实战代码_二叉排序树(二叉搜索树)_构建_删除_插入操作详解
这份二叉排序树习题集涵盖了二叉搜索树(BST)的基本操作,包括构建、查找、删除等核心功能。通过多个具体示例,如构建BST、查找节点所在层数、删除特定节点及查找小于某个关键字的所有节点等,帮助读者深入理解二叉排序树的工作原理与应用技巧。此外,还介绍了如何将一棵二叉树分解为两棵满足特定条件的BST,以及删除所有关键字小于指定值的节点等高级操作。每个题目均配有详细解释与代码实现,便于学习与实践。
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
32 3
|
4天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
19 6
|
24天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
33 10