C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 課題が進みません・・・


(過去ログ 27 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■12438 / inTopicNo.1)  課題が進みません・・・
  
□投稿者/ ニナ (1回)-(2008/01/09(Wed) 17:14:04)

分類:[Java] 

現在、入力ファイル名をキーボードから入力し、入力ファイルに出現する平仮名(あ〜ん、濁音、半濁音、ゐ、ゑを含む)の出現頻度を求めて表示するプログラムの作成を頑張ってますが、なかなか進みません・・・

順番は
「開始」→「count作成」→「キーボードからファイル名を入力」→「ファイルに対する入力ストリーム作成」→「ファイルから1文字読み込み」→
「ファイルの末尾に到達した?」
Yesの場合は「各平仮名の出現回数を表示」→「終了」
Noの場合は「読んだ文字cは「あ〜ん」の範囲にあるか?」→Yesの場合、「配列countのc番目の値を1増やす」→「ファイルから 1文字読み込み」に戻る Noの場合は「ファイルから1文字読み込み」に戻る

※「あ」の文字コードは「12354」で「ん」の文字コードは「12435」
※文字がある範囲にあるかどうかは、文字コードの大小比較すれば分かる。
※出現頻度を画面に表示する代わりに、ファイルに出力するようにした方がデバッグしやすい。
※PrintList1.javaを元にして作るのが楽。

一応
import java.io.FileReader;

class PrintList1{
public static void main(String args[]){
try{
FileReader fr = new FileReader(args[0]);
int c;
while( (c=fr.read()) != -1) {
System.out.print((char)(c));
}
fr.close();
} catch (Exception e) { }}}

class Hiragana{
public static void main(String args[]){
double [] count;

ここまでやりましたが、その後が全然駄目なのです。
あと最初の内容も変ですが・・・

これは、

1.ファイルから文字を読み込む
2.キーボードから文字を入力する
3.配列を扱う
4.文字についての処理(文字の数え上げ)を行う

上の4つのトピックを扱わないと駄目なのです。
あとはアルファベットの出現回数を求めるプログラムも作成しないといけないのです。

分かる人がいましたら、是非教えて下さい。

補足
文字の演算は、
class CharacterCode{
public static void main(String args[]){
char c1 = `A`; char c2 = `B`;
System.out.print(c1);
System.out.println((int)c1);
System.out.print(c2);
System.out.println((int)c2);
}}
が少し参考になると友人に言われましたが、これを利用すればよいのでしょうか・・・?
引用返信 編集キー/
■12442 / inTopicNo.2)  Re[1]: 課題が進みません・・・
□投稿者/ επιστημη (770回)-(2008/01/09(Wed) 17:58:40)
επιστημη さんの Web サイト
2008/01/09(Wed) 17:58:52 編集(投稿者)
↓ PrintList1.java を基にした「ものすごいヒント」

import java.io.FileReader;

public class PrintList1 {
  public static void main(String args[]){
    int[] count = new int[テキトーに大きなサイズ];
    try {
      FileReader fr = new FileReader(args[0]);
      int c;
      while( (c=fr.read()) != -1) {
        if ( 「読んだ文字cは「あ〜ん」の範囲にあるか?」) {
         「配列countのc番目の値を1増やす」
        }
      }
      fr.close();
    } catch (Exception e) { 
    }
  「各平仮名の出現回数を表示」
  }
}

引用返信 編集キー/
■12494 / inTopicNo.3)  Re[2]: 課題が進みません・・・
□投稿者/ 凪瀬 (1回)-(2008/01/10(Thu) 13:41:12)
凪瀬 さんの Web サイト
課題なんで出題の趣旨に従った方法で実装するのがよいのでしょうが…
Javaでのプログラミングの一般論として書きますので適時判断してください。

1.ファイルから文字を読み込む

1文字ずつ読み込めているなら、あとはどうにでもなりますが、
BufferedReader#readLine()を用いると1行単位で読み込めるので楽ですよ。
http://java.sun.com/javase/ja/6/docs/ja/api/java/io/BufferedReader.html#readLine()

課題なんでメモリの効率とか無視して、ファイルを全部読み込んで
ひとつのStringにしちゃってから頻度を走査する方法で構わないでしょう。

2.キーボードから文字を入力する

一般的にはコンソールのアプリケーションの場合、標準入力からの入力
(要するに「キーボードからファイル名を入力」の部分)をやるよりも
実行時の引数にファイル名を渡して
public static void main(String[] args)
のargsで受け取る手法が簡単でよく用いられます。

愚直にキーボードからの入力をしたい場合は、System.inというフィールドが
InputStream型で利用できます。これがコンソールからのキーボード入力、
つまるところ標準入力となりますので、ここから文字列を取得します。
Enterキーが入力されるまで読み込み続けるなどの工夫がいるので
課題にしてはかなり難しいですね。出題者に意図を聞きたいところ。

3.配列を扱う

本当に配列で処理する必要があるでしょうか?
データ構造をよく考えましょう。
出現頻度の集計をするならjava.util.Mapを使うとよいでしょうね。
http://java.sun.com/javase/ja/6/docs/ja/api/java/util/Map.html

4.文字についての処理(文字の数え上げ)を行う

1でひとつの大きなStringにファイルをすべて読み込んであるなら
String#charAt(int)で1文字ずつ調べればよいので簡単です。
http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/String.html#charAt(int)

自分なら、集計用にMapを用いて
Map<Character, Integer> counter = new HashMap<Character, Integer>();
String str; // ファイルの内容をすべて読み込んだString
for (int i=0; i<str.length(); i++) {
Integer temp = counter.get(str.charAt(i));
if (temp != null) {
counter.put(str.charAt(i), temp + 1);
} else {
counter.put(str.charAt(i), 1);
}
}
みたいにするかな。対象の文字かどうか篩にかけるとなおよしか。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -