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

2023-12-17 15:34:47

系列文章目录

提示:该系列文章暂未全部完成,暂时欠缺系列文章目录,见谅
基础刷题训练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函数去了。
多练习多练习,哈哈。

文章来源:https://blog.csdn.net/2302_79031646/article/details/135043363
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。