ACM试题: 输入四行大写英文字母组成的文字,输出一个反映每个字母出现的图表。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM试题: 输入四行大写英文字母组成的文字,输出一个反映每个字母出现的图表。相关的知识,希望对你有一定的参考价值。

Sample Input

1
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.
THIS IS AN EXAMPLE TO TEST FOR YOUR
HISTOGRAM PROGRAM.
HELLO!
Sample Output

*
*
* *
* * * *
* * * *
* * * * * *
* * * * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
为什么我写的程序老是报java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1516
这是我的源代码:import java.io.IOException;
import java.util.Scanner;

import java.io.*;;

public class Main
static int Cn[];
static int bign;
static int zuigaol;
static int jz[][];
static int zuihou[];
static Scanner scan=new Scanner(System.in);
static Scanner scan2=new Scanner(System.in);
static String[] inp;
public static void main(String[] args) throws IOException
int N;
N=scan2.nextInt();
inp=new String[4];
for(int i=0;i<N;i++)

for(int j=0;j<4;j++)
inp[j]=scan.nextLine();

deal();





public static void deal()
Cn=new int[26];
for(int i=0;i<4;i++)
dealOne(inp[i]);

bign=getBig();
zuihou=new int [bign];
jzCS();
showResult();



public static void dealOne(String s)

char cs[]=s.toCharArray();
char temp;
for(int i=0;i<s.length();i++)
temp=cs[i];
if(temp>=65&&temp<=123)
Cn[temp-65]++;




public static int getBig()
int big=0;
for(int i=0;i<26;i++)
if(Cn[i]>=big)
big=Cn[i];
zuigaol=i;


return big;


public static void jzCS()
jz=new int[bign][26];

for(int i=0;i<26;i++)
yhCS(i);


public static void yhCS(int l)
int n=Cn[l];
if(l<zuigaol)
for(int f=bign-n;f<bign;f++)
jz[f][l]=1;

for(int f=bign-n-1;f>=0;f--)
jz[f][l]=0;

else if(l==zuigaol)
for(int f=bign-1;f>=0;f--)
jz[f][l]=1;


else
for(int f=bign-n;f<bign;f++)
jz[f][l]=1;
changeTo(f,l);

for(int f=bign-n-1;f>=0;f--)
jz[f][l]=2;




public static void changeTo(int h,int l)
for(int i=0;i<l;i++)
if(jz[h][i]==2)
jz[h][i]=0;



public static int lastOne(int h)
int l=0;
for(int i=0;i<26;i++)
if(jz[h][i]==1)
l=i;


return l;

public static void showResult()
for(int i=0;i<bign;i++)
//System.out.println(lastOne(i));
for(int j=0;j<26;j++)
if(jz[i][j]==0)
if(j==0)
System.out.print(" ");
else
System.out.print(" ");
else if(jz[i][j]==1)
if(j==0)
System.out.print("*");
else
System.out.print(" *");

else
System.out.print("");

System.out.println();

System.out.println("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z");

参考技术A 不知道你做的是哪里的题目,反正我知道北大poj上的一道题目和你题目类似
但是不用输入第一个1,而如果你输入了的话,就把后面的一行给用了 于是就后面少了一行就出错了
这个是解答:
http://www.java3z.com/cwbwebhome/article/article17/acm003.html
//int N;
// N=scan2.nextInt();
// inp=new String[4];
// for(int i=0;i<N;i++)
//
for(int j=0;j<4;j++)
inp[j]=scan.nextLine();

deal();

// 追问

解决了,第一个scanner是用的next方法,第二个用了nextLine方法,这样next读完第一行之后并没有负责换行,nextLine继续在空的第一行读取就出错了。麻烦您了

追答

既然你自己解决了就好
我当时也在想你为什么不第一个也用int n = Integer.parserInt(in.nextLine());

参考技术B 你检查下循环中getline的次数对不对
这个异常说明你可能多运行了一次getline 结果在scanner中没有对应的数据而抛出异常追问

恩,我也是这么想的,但是在自己机子上运行每次输入都没报错,应该不是geiLine次数的问题,不知道是不是输入格式不一致

洛谷—— P1598 垂直柱状图

 P1598 垂直柱状图

题目描述

写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过72个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。

输入输出格式

输入格式:

 

四行字符,由大写字母组成,每行不超过72个字符

 

输出格式:

 

由若干行组成,前几行由空格和星号组成,最后一行则是由空格和字母组成的。在任何一行末尾不要打印不需要的多余空格。不要打印任何空行。

 

输入输出样例

输入样例#1: 复制
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.
THIS IS AN EXAMPLE TO TEST FOR YOUR
HISTOGRAM PROGRAM.
HELLO!
输出样例#1: 复制
                            *
                            *
        *                   *
        *                   *     *   *
        *                   *     *   *
*       *     *             *     *   *
*       *     * *     * *   *     * * *
*       *   * * *     * *   * *   * * * *
*     * * * * * *     * * * * *   * * * *     * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

说明

每行输出后面不允许出现多余的空格。

 

哇塞、、

#include<cstdio>
#include<cstring>
#include<iostream>
#define N 1010
using namespace std;
char ch[N];
int l,maxn,s[N];
int main()
{
    for(int i=1;i<=4;i++)
    {
        gets(ch+1);
        l=strlen(ch+1);
        for(int i=1;i<=l;i++)
         s[ch[i]-A+1]++;
    } 
    for(int i=1;i<=26;i++)
     maxn=max(maxn,s[i]);
    for(int i=maxn;i>=1;i--)
    {
        for(int j=1;j<=26;j++)
         if(s[j]<i) printf("  ");
         else printf("* ");
        printf("\n");
    }
    for(int i=0;i<26;i++)
     cout<<char(i+A)<<" ";
    return 0;
}

 

以上是关于ACM试题: 输入四行大写英文字母组成的文字,输出一个反映每个字母出现的图表。的主要内容,如果未能解决你的问题,请参考以下文章

C语言试题八十二之输入小写字母,把小写字母转换成大写字母。

C语言试题八十二之输入小写字母,把小写字母转换成大写字母。

洛谷—— P1598 垂直柱状图

洛谷 P1598 垂直柱状图

P1598 垂直柱状图

洛谷 P1598 垂直柱状图字符串