1.:例题:
7. 餐饮服务质量打分
【题目描述】
在商业和科学研究中,人们经常需要对数据进行分析并将结果以直方图的形式显示出来,这会大大增加这些数据的直观性,也便于数据的分析与对比。下面以顾客对餐饮服务打分为例,输入一个正整数repeat (0<repeat<10),做repeat次下列运算:
输入一个正整数n(1≤n≤20),表示有n个学生被邀请来给自助餐厅的食品和服务质量打分,分数划分为1~5这5个等级(1表示最低分,5表示最高分),试统计调查结果,并用*打印出如下形式的统计结果直方图。
【输入格式】
第1个整数repeat为数据组数,一共有repeat组数据,请分别处理每组数据,每组数据输出一个直方图。
接下来为repeat组数据,每组数据的第1个数为打分人数n,接下来为这n个人的n个打分。
【输出格式】
按输出样例的样式输出结果。
2.经验分享:笔者爆肝四天才做对,求个赞赞╮(๑•́ ₃•̀๑)╭,下面开始分析了!
1.看一看题目吧:1.大胆猜想篇之函数:真的有必要吗?增加函数的主要目的为简化大量重复性工作,此题是否有大量重复性工作呢?
2.大胆猜想篇之输入与输出的主体:分析题目特点:需要多次输入多个值,那么解决问题的主体就是循环加数组。
3。问题发现篇之打表:不难发现这个直方图是竖起来的,打几行合适呢?如何判断一个数打几行呢?
那么无论如何,先试一试吧!
2.启动了,但没有完全启动!
1.说好的循环输入数组元素,为啥输入数不能作为数组长度呢?
A:因为数组只能由常量充当数组长度,变量是不可以的哦!ᕙ(`▿´)ᕗ
2.为啥我输入完数据后循环没有结束啊?
A:你真的输入完了整个数组了吗?
3.如何启动成功呢?
P1:设置一个多变量的数组,你不输入让它直接补0就行了嘛,评分也没有零分啊!(难道所有的评分都没有0颗星是这个原因啊(ᕑᗢᓫ∗)˒)
P2:在输入完成的时候换行!换行?难道是回车?那么如何判断呢?(不会用getchar的小伙伴看看笔者之前的文章吧!₍ᐢ.ˬ.⑅ᐢ₎)
4.终于启动了,那么问题来了如何统计数据个数并比较呢?
A:作为一个萌新,你从各路大佬处学到了字符串比较并记在了小本本上,但实操的时候你发现程序根本运行不了!是时候启动gpt了!
发现它还没我聪明呢!( ´◔︎ ‸◔︎`)
那么,让我们换个思路,难道计数操作必须用字符串吗?
想想之前在写循环结构的时候是怎么计数的?
想起来了!直接定义变量,每出现一次就加一呗!
int j = 0;
int o = 0;
int p = 0;
int q = 0;
int r = 0;
int s = 0;
int x = 0;
for (x; x < n; x++)//(分别记录各个分数出现的次数)
{
if (arr[x] == 1)
{
o = o + 1;
}
if (arr[x] == 2)
{
p = p + 1;
}
if (arr[x] == 3)
{
q = q + 1;
}
if (arr[x] == 4)
{
r = r + 1;
}
if (arr[x] == 5)
{
s = s + 1;
}
}
于是,你写出来了这么一大串,虽然丑,但它居然是能运行的!(在出现未知问题的时候,想想如何使用最简单的方法拿捏它!)
现在,该比较了,那么方法也显而易见,利用循环数组的方法比较即可!
5.打表了,如何把表竖起来呢?
根据题目,这又是一项“* ”与“ ”之间的经典问题,看看笔者之前是如何练习的!传送门:空心菱形 · 王赫辰/c语言 - 码云 - 开源中国 (gitee.com)
那么如何打如何不打,如何让打过的一直打?你又困惑了,记住,大道至简!简单的选择循环判断,即可解决这个看上去吓人一跳的问题!
int h = max[0];
int g;
for (max[0]; max[0] != 0; max[0]--)//(打印每一行的数据)
{
if (o >= h)
{
printf("* ");
}
else
{
printf(" ");
}
if (p >= h)
{
printf("* ");
}
else
{
printf(" ");
}
if (q >= h)
{
printf("* ");
}
else
{
printf(" ");
}
if (r >= h)
{
printf("* ");
}
else
{
printf(" ");
}
if (s >= h)
{
printf("* ");
}
else
{
printf(" ");
}
printf("\n");
h = h - 1;
}
printf("1 2 3 4 5\n");
}
还是经典的又长右丑,但是可以运行!(注意\n哦❛‿˂̵✧)
这是成品:
#include<stdio.h>
int main()
{
int arr[50];
int a;
int b;
int i = 0;
int n = 0;
int f = 0;
scanf("%d", &a);
for (f = 0; f < a; f++)
{
scanf("%d", &b);
for (i = 0; i < b; i++)
{
scanf("%d", &arr[i]);
n = n + 1;
if (getchar() == '\n') //(在元素输入完毕后终止读取)
{
break;
}
}
int j = 0;
int o = 0;
int p = 0;
int q = 0;
int r = 0;
int s = 0;
int x = 0;
for (x; x < n; x++)//(分别记录各个分数出现的次数)
{
if (arr[x] == 1)
{
o = o + 1;
}
if (arr[x] == 2)
{
p = p + 1;
}
if (arr[x] == 3)
{
q = q + 1;
}
if (arr[x] == 4)
{
r = r + 1;
}
if (arr[x] == 5)
{
s = s + 1;
}
}
int max[5] = { o,p,q,r,s };
int v;
for (v = 0; v < 3; v++)//(将分数由大到小排序以确定打印行数)
{
if (max[v] < max[v + 1])
{
int u;
u = max[v];
max[v] = max[v + 1];
max[v + 1] = u;
}
}
int h = max[0];
int g;
for (max[0]; max[0] != 0; max[0]--)//(打印每一行的数据)
{
if (o >= h)
{
printf("* ");
}
else
{
printf(" ");
}
if (p >= h)
{
printf("* ");
}
else
{
printf(" ");
}
if (q >= h)
{
printf("* ");
}
else
{
printf(" ");
}
if (r >= h)
{
printf("* ");
}
else
{
printf(" ");
}
if (s >= h)
{
printf("* ");
}
else
{
printf(" ");
}
printf("\n");
h = h - 1;
}
printf("1 2 3 4 5\n");
}
}
最后的最后,编者有话说!
为了解这道题,编者连续四天熬夜到凌晨一点,前三天基本毫无进展,这或许就是IT行业的魅力吧。无论是未来的展望还是儿时的梦想让你走上了这条路,请你坚持码字刷题,偷偷努力然后惊艳所有人!ᕕ( ᐛ )ᕗ
ps:再求个赞赞!ଘ(੭ˊ꒳ˋ)੭