| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1678 人关注过本帖
标题:大佬们帮忙看看是哪里有问题吧(显示柱状图)感激不尽!
只看楼主 加入收藏
Sopphhiiaa
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2020-12-7
结帖率:80%
收藏
已结贴  问题点数:10 回复次数:7 
大佬们帮忙看看是哪里有问题吧(显示柱状图)感激不尽!
描述
根据输入的数字和符号生成相应的柱状图显示。
输入
每个输入包含一个测试用例,第一个整数m(1<=m<=20),表示随后有m组数据,每组数据由一个数字n(-15<=n<=15)和一个字符组成,每组数据之间用空格分隔。数字代表柱状图的高度,字母代表该柱使用的画图符号。如果数字后没有字母,默认该柱的画图符号使用加号’+’。
输出
每个柱之间用1个空格间隔,图的空白处用空格填充。用减号’-’表示x轴。正数柱状向上,负数柱状向下。
样例
输入
6 1a 3 4b 2 -2 1
输出

    b      
  + b      
  + b +   
a + b +   +
-----------
        +  
        +
程序代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int m,i;
    scanf("%d",&m);//输入一个整数 
    char histogram[21][31];//声明一个名为柱状图的字符型数组 
    char str[20];//声明存入字母的数组 
    int num[20];//声明存入数字的数组 
    if(1<=m<=20){
        for(i=0;i<m;i++){//将数据存入数组中 
            scanf("%d",&num[i]);
            scanf("%c",&str[i]);
            }
        int shang,xia;//shang表示x轴上方的行数,xia表示x轴下方的行数 
        shang=0;
        xia=0;
        for(i=0;i<m;i++){
        
            if(num[i]>0&&shang<num[i]){
                shang=num[i];//找出上方应该有的行数 
            }
            else if(num[i]<=0&&xia>num[i]){
                xia=num[i];//找出下方应该有的行数 
            }
         }
        
        int hang,lie;
        hang=shang-xia+1;//总的行数 
        lie=m;//总的列数 
        int j;
        for(j=0;j<lie;j++){//一列一列的看,先对列进行循环 
            if(num[j]>0){//讨论在数字大于零时的情况 
                for(i=0;i<hang;i++){//再对行进行循环 
                    if(i<shang-num[j]){//x轴上方为空格的情况 
                        histogram[i][j]=' ';
                    }
                    else if(i>=shang-num[j]&&i<shang){ 
                        if(str[j]==' '||str[j]=='\n'){//数字后不带字母的情况
                            histogram[i][j]='+';
                        }
                        else//数字后带字母的情况 
                            histogram[i][j]=str[j];
                    }
                    else if(i==shang)//x轴 
                        histogram[i][j]='-';
                    else//在x轴下方为空格的情况 
                        histogram[i][j]=' ';
                }
                
            }
            else if(num[j]>=0) {//讨论数字小于等于零时的情况 
                for(i=0;i<hang;i++){
                    if(i<shang){//因数字小于零,在x轴上方都是空格 
                        histogram[i][j]=' ';
                    }
                    else if(i==shang)//x轴 
                        histogram[i][j]='-';
                    else if(i>shang&&i<=shang-num[j]){
                        if(str[j]==' '||str[j]=='\n'){//数字后无字母 
                            histogram[i][j]='+';
                        }
                        else//数字后有字母 
                            histogram[i][j]=str[j];
                    }
                    else//在这列中的其他行是空格 
                        histogram[i][j]=' ';
                }
            }
        }
        for(i=0;i<shang;i++){
             if(i==shang){
                 for(j=0;j<lie;j++)
                     {
                     if(j==lie-1)
                       {
                       printf("%c",histogram[i][j]);}
                    else
                       {
                       printf("%c-",histogram[i][j]);}
                    }
        }
             else
                {
                 for(j=0;j<lie;j++)
                    {
                      printf("%c ",histogram[i][j]);}
                }
            printf("\n");
        }
    }
    return 0;
    
         
    
}

我的运行结果如下:
6 1a 3 4b 2 -2 1
    b
  + b
  + b +
a + b + ?+
麻烦帮我看看到底是哪里出了错,已经想了很久了,可是运行结果就是不对  
搜索更多相关主题的帖子: for num str 数字 字母 
2020-12-19 23:07
Sopphhiiaa
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2020-12-7
收藏
得分:0 
样例输出的格式有点不对,我贴一张图
图片附件: 游客没有浏览图片的权限,请 登录注册

下面是我运行的结果
图片附件: 游客没有浏览图片的权限,请 登录注册
2020-12-19 23:12
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:0 
这个是打印一个二维数组的题目。
数组的总行数为:正数最大值加上负数绝对值的最大值再加一
数组的总列数为:m+m-1其中m-1是列空格数
思路是把数组填充好后直接打印
而填充的思路是按列填充,比如填充第一列,按楼主的用例,如何填a
设总行数为n,n=4+2+1=7;总列数为m,m=6+6-1=11
而a前的数为1,也就是从X轴位置开始向上第一个位置,只填一个a,其余填空格
X轴下也填空格,X轴填-
要计算这个位置,那么先计算X轴的行数k=正数最大值加一
所以填充的技术思路是以X轴为起点上下填充
下一个回复是一段以X轴为中心的填充代码

[此贴子已经被作者于2020-12-20 07:24编辑过]


学C语言从底层开始,学编程从问题开始,一日学会C!!!
2020-12-20 07:23
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:0 
      
        if(num[i]>0)
        for(f=1;f<=num[i];f++)
             a[k-1-f][j]=str[i];
    else if(num[i]<0)
        for(f=1;f<=abs(num[i]);f++)
              a[k-1+f][j]=str[i];
但这个代码还需要完善
如判断字符为空的就要填充+号
x轴的填充
间隔符为空格的填充等等一些附加

   若为方便可以一开始就把数组初始化为空格,可以省去填充空格的操作

[此贴子已经被作者于2020-12-20 08:03编辑过]


学C语言从底层开始,学编程从问题开始,一日学会C!!!
2020-12-20 07:56
Sopphhiiaa
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2020-12-7
收藏
得分:0 
回复 4楼 do8do8do8
我发现我就是x轴和x轴下方的显示不出来,可是在代码中又确实检查不出来哪里有错误(另外把if中num[j]改成<=0了 运行结果仍然有错)

[此贴子已经被作者于2020-12-20 11:43编辑过]

2020-12-20 11:41
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:5 
你的代码太长,太长的缺点是别人没时间和耐心去看

程序代码:
#include <stdio.h>

int main( void )
{
    unsigned m;
    int ns[20];
    char cs[20];
    int high=0, low=0;
    
    // 输入
    scanf( "%u", &m );
    for( unsigned i=0; i!=m; ++i )
    {
        int t = scanf( "%d%c", ns+i, cs+i );
        if( t!=2 || cs[i]==' ' || cs[i]=='\n' )
            cs[i] = '+';
        if( ns[i] > high )
            high = ns[i];
        if( ns[i] < low )
            low = ns[i];
    }
    
    // 输出
    for( int r=high; r>=low; --r )
    {
        for( unsigned c=0; c!=m; ++c )
        {
            if( r == 0 )
                printf( "-%c", "-\n"[c+1==m] );
            else if( (ns[c]>0 && r>0 && r<=ns[c]) || (ns[c]<0 && r<0 && r>=ns[c]) )
                printf( "%c%c", cs[c], " \n"[c+1==m] );
            else
                printf( "%c%c", ' ', " \n"[c+1==m] );
        }
    }
}
收到的鲜花
  • Sopphhiiaa2020-12-20 14:38 送鲜花  1朵  
2020-12-20 12:31
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:5 
回复 5楼 Sopphhiiaa
你说的这个问题,我忘记了~~,现在补上

 for(i=0;i<shang;i++){
             if(i==shang){   //问题就这里吧  i 是不会等于 shang 因为 for 里 的 i<shang 涮掉了
                 for(j=0;j<lie;j++)
                     {
                     if(j==lie-1)
                       {
                       printf("%c",histogram[i][j]);}
                    else
                       {
                       printf("%c-",histogram[i][j]);}
                    }
        }
             else
                {
                 for(j=0;j<lie;j++)
                    {
                      printf("%c ",histogram[i][j]);}
                }
            printf("\n");
        }

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2020-12-20 13:16
Sopphhiiaa
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2020-12-7
收藏
得分:0 
回复 7楼 do8do8do8
我明白了 应该写成i<hang 而不是<shang
2020-12-20 14:37
快速回复:大佬们帮忙看看是哪里有问题吧(显示柱状图)感激不尽!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022457 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved