1

重複の可能性:
本の目次を印刷する Java プログラムの作成にヘルプが必要

目次を出力するプログラムを作成することになっています。私の任務の背景を説明させてください。ユーザーは、章のタイトルとして 4 つのアスタリスクを入力するまで、章のタイトルと開始ページ番号をループで入力することになっています。ユーザーが 4 つのアスタリスクを入力した後、次のような出力を出力することになっています。

アーサー王の宮廷......................................3

ナイツ・オブ・ザ・テーブル・ラウンド ....................................8

サー・ディナダン・ザ・ユーモリスト..................................................12

私は自分のコーディングのほとんどが正しいと思います。私のテスト プログラムでは、ユーザーが章のタイトルと開始ページ番号を入力できるようにする while ループを作成しました。このループは、ユーザーが章のタイトルに 4 つのアスタリスクを入力すると終了します。しかし、私が立ち往生しているのは、ユーザーがアスタリスクを入力した後に出力を生成するために、while ループの後です。目次を表示する代わりに、出力を取得しています。タイトル、ドット、ページ番号を出力するために for ループを試しましたが、アスタリスクしか表示されません。ループがおかしいと思います。

これまでの私のコードは次のとおりです。

// My Table of Contents class
public class TocEntry
{

public TocEntry(String title, int page) // 2 Argument Constructor
{
           chapterTitle = title;
           startPage = page;
}


public String toString() // toString method to print out chapter title,
                         // given dots, and start page
{
    String temp = "" + startPage;
    int numDots = 60 - (temp.length()+ chapterTitle.length());

    String toc_out = chapterTitle;
    for(int i = 0; i < numDots; i++)
       toc_out=toc_out +".";
       toc_out= toc_out + startPage;
    return toc_out;
}


private String chapterTitle; 
private int startPage;


    }// End of class TocEntry

// My Test program
import java.util.Scanner;
public class useToEntry {

public static void main(String[] args)
{
    Scanner input = new Scanner(System.in);

    final int TOCSIZE = 100;// Max size of TOC
    TocEntry toc[] = new TocEntry[TOCSIZE];
    int toc_curlen = 0;// The toc_curlen is intended to keep track of the number 
                       // of chapters entered by the user

    System.out.print("Enter chapter title: ");
    String chapterTitle = input.next();

    while(!"****".equals(chapterTitle))
    {
       System.out.print("Enter starting page number: ");
       int page = input.nextInt();

       System.out.print("Enter chapter title: ");
       chapterTitle= input.next();

       toc [toc_curlen] = new TocEntry(chapterTitle,page);
       toc_curlen = toc_curlen++;

    }// End of while loop

       for (int line = 0; line < toc_curlen; line++)
       {
         System.out.println(chapterTitle.toString());
       }// End of for loop
  }// End of main method

}// End of class useToEntry

ループを修正して出力を生成するのを手伝ってくれませんか。私は提案を受け入れます。

ありがとう!

4

3 に答える 3

2

いくつかの提案:

この線

toc_curlen = toc_curlen++;

toc_curlenインクリメントすることはありません。インクリメント演算子を単独で使用できます。

toc_curlen++;

初めて使用するとき

String chapterTitle = input.next();

TocEntry配列に割り当てることtocは決してないので、この章は表示されません。

表示ループで変数chapterTitleを繰り返し出力しています-TocEntryここに出力する必要があります:

for (int line = 0; line < toc_curlen; line++) {
   System.out.println(toc[line].toString());
}
于 2012-09-22T00:03:58.553 に答える
1

コードを少し変更しました。まず、多くの文字列をまとめたい場合は、+演算子の代わりにStringBuilderを使用することを検討してください。文字列は不変であるため、+演算子を使用するたびに、新しい文字列が作成され、連結された2つがガベージに入れられます。

public String toString()
{
    String temp = Integer.toString(startPage);
    int numDots = 60 - (temp.length() + chapterTitle.length());

    StringBuilder sb = new StringBuilder();
    sb.append(chapterTitle);
    for (int i = 0; i < numDots; i++)
        sb.append('.');

    sb.append(startPage);
    return sb.toString();
}

しかし、問題は、配列を反復処理せず、現在の章のタイトルのみを出力することでした。

for (int line = 0; line < toc_curlen; line++)
{
    System.out.println(chapterTitle.toString());
}

main()関数の「より良い」バージョンは次のとおりです。

public static void main(String[] args)
{
    Scanner input = new Scanner(System.in);
    //its much easier to work with lists
    List<TocEntry> list = new ArrayList<TocEntry>();
    String chapterTitle = "";

    //sorry for the while(true), but it looks easier doing everything 
    //inside the loop instead ofdoing half the job outside, half inside of it.
    while (true)
    {
        System.out.print("Enter chapter title: ");
        chapterTitle = input.next();
        if("****".equals(chapterTitle)) break;

        System.out.print("Enter starting page number: ");
        int page = input.nextInt();

        list.add(new TocEntry(chapterTitle, page));
    }

    for (TocEntry entry : list)
        System.out.println(entry);
}
于 2012-09-22T00:03:29.940 に答える
0

これは宿題に非常によく似ています...まあ、最初に行toc_curlen = toc_curlen++;を短くする必要がありますtoc_curlen++;(理由を考えてください)。

あなたの本当の問題は、印刷に使用しているforループにあります。あなたが印刷しているものを正確に見てください、そしてあなたはそれを見つけるでしょう。

于 2012-09-22T00:03:18.823 に答える