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

多练习多练习,哈哈。

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