图像文字编程:如何综合应用c语言知识进行题目求解以及思路分析(c语言萌新必看)

1.:例题:

7. 餐饮服务质量打分

【题目描述】

在商业和科学研究中,人们经常需要对数据进行分析并将结果以直方图的形式显示出来,这会大大增加这些数据的直观性,也便于数据的分析与对比。下面以顾客对餐饮服务打分为例,输入一个正整数repeat (0

输入一个正整数n(1≤n≤20),表示有n个学生被邀请来给自助餐厅的食品和服务质量打分,分数划分为1~5这5个等级(1表示最低分,5表示最高分),试统计调查结果,并用*打印出如下形式的统计结果直方图。

【输入格式】

第1个整数repeat为数据组数,一共有repeat组数据,请分别处理每组数据,每组数据输出一个直方图。

接下来为repeat组数据,每组数据的第1个数为打分人数n,接下来为这n个人的n个打分。

【输出格式】

按输出样例的样式输出结果。

图像文字编程:如何综合应用c语言知识进行题目求解以及思路分析(c语言萌新必看)_第1张图片

2.经验分享:笔者爆肝四天才做对,求个赞赞╮(๑•́ ₃•̀๑)╭,下面开始分析了!

1.看一看题目吧:1.大胆猜想篇之函数:真的有必要吗?增加函数的主要目的为简化大量重复性工作,此题是否有大量重复性工作呢?        

        2.大胆猜想篇之输入与输出的主体:分析题目特点:需要多次输入多个值,那么解决问题的主体就是循环加数组。

        3。问题发现篇之打表:不难发现这个直方图是竖起来的,打几行合适呢?如何判断一个数打几行呢?

那么无论如何,先试一试吧!

图像文字编程:如何综合应用c语言知识进行题目求解以及思路分析(c语言萌新必看)_第2张图片

2.启动了,但没有完全启动!

        1.说好的循环输入数组元素,为啥输入数不能作为数组长度呢?

                A:因为数组只能由常量充当数组长度,变量是不可以的哦!ᕙ(`▿´)ᕗ

         2.为啥我输入完数据后循环没有结束啊?

                A:你真的输入完了整个数组了吗?图像文字编程:如何综合应用c语言知识进行题目求解以及思路分析(c语言萌新必看)_第3张图片

3.如何启动成功呢?

                P1:设置一个多变量的数组,你不输入让它直接补0就行了嘛,评分也没有零分啊!(难道所有的评分都没有0颗星是这个原因啊(ᕑᗢᓫ∗)˒)

                P2:在输入完成的时候换行!换行?难道是回车?那么如何判断呢?(不会用getchar的小伙伴看看笔者之前的文章吧!₍ᐢ.ˬ.⑅ᐢ₎)

        图像文字编程:如何综合应用c语言知识进行题目求解以及思路分析(c语言萌新必看)_第4张图片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;
      }
  }

        于是,你写出来了这么一大串,虽然丑,但它居然是能运行的!(在出现未知问题的时候,想想如何使用最简单的方法拿捏它!)

现在,该比较了,那么方法也显而易见,利用循环数组的方法比较即可!

图像文字编程:如何综合应用c语言知识进行题目求解以及思路分析(c语言萌新必看)_第5张图片

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
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:再求个赞赞!ଘ(੭ˊ꒳​ˋ)੭ 

你可能感兴趣的:(c语言,算法,开发语言,学习)