コマンドプロンプト上の標準入力で文字列と数値を比較して表示するプログラム

このQ&Aのポイント
  • プログラムを作成する際には、コマンドプロンプト上での標準入力を扱う方法を学ぶ必要があります。
  • 入力された文字列と数値を、1つのクラスのフィールドとして定義することでデータを管理することができます。
  • 入力されたデータを比較し、その結果を大きい順に表示するために、適切なデータ構造やソートアルゴリズムを使用する必要があります。
回答を見る
  • ベストアンサー

このようなプログラムを教えて下さい

コマンドプロンプト上の標準入力で文字列と数値を複数組入力していき、 その入力された文字列とそれに対する数値をその数値で比較し最後に大きい順で順に表示するようなプログラムを作りたいのですが、よく構造がわからないので教えて下さい。(ちなみに入力された文字列と数値は、それらを1つのクラスのフィールドとして定義するとして) たとえば人の名前と年齢を入力し大きい順に並べるとか NAME :Bob age :12 NAME :Tom age :25 NAME :Ken age :3 NAME : NAME:Tom,age:25 NAME:Bob,age:12 NAME:Ken,age:3 このように出力したいのですが もしこのようなプログラムを作成することのできる方いましたら、 教えてやってください。

  • Java
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • Harry_
  • ベストアンサー率55% (36/65)
回答No.1

長いですけど、作ってみました。 コメントも何もつけてないですが、わからないところがあったら質問してください。 // Personクラス public class Person implements Comparable {   private String name;   private int age;   public Person(String name, int age) {     this.name = name;     this.age = age;   }   public String getName() {     return name;   }   public int getAge() {     return age;   }   public int compareTo(Object obj) {     Person other = (Person)obj;     return other.age - this.age;   }   public String toString() {     return "NAME : " + name + "\t\tAGE : " + age;   } } // ここからメインのクラス import java.io.*; import java.util.*; public class InputPerson {   public static void main(String[] args) throws Exception {     BufferedReader reader =       new BufferedReader(new InputStreamReader(System.in));     List people = new ArrayList();     while (true) {       System.out.print("NAME : ");       String name = reader.readLine();       if (name.equals("")) {         break;       }       int age = 0;       do {         System.out.print("AGE : ");       } while ((age = toDigit(reader.readLine())) < 0);       people.add(new Person(name, age));     }     System.out.println("");     show(people);   }   private static void show(List people) {     Collections.sort(people);     for (Iterator itr = people.iterator(); itr.hasNext(); ) {       System.out.println(itr.next());     }   }   private static int toDigit(String str) {     int result = 0;     try {       result = Integer.parseInt(str);     }     catch (Exception ex) {       result = -1;     }     return result;   } }

関連するQ&A

  • 配列の中を変更

    入力したnameに、入力したageの数だけ文字を進める(例えばnameがOda、ageが12→表示結果がAmp)にする関数を作成しようとしたのですが、やり方がまったくわかりません。 そもそもこのような場合、文字1つ1つに別の配列を使わなければならないのでしょうか? #include <stdio.h> #define N 1 #define NAME 20 typedef struct{ char name[NAME]; char age; } person; int main(void){ int i; person persons[N]; for(i=0;i<N;i++){ printf("name > "); scanf("%s" , persons[i].name); printf("age > "); scanf("%d" , &persons[i].age); } for(i=0;i<N;i++){ printf("name = %s\n" , persons[i].name); printf("age = %d\n" , persons[i].age); } return 0; }

  • プログラム教えてください

    このプログラム教えてください 問題で キーボードから10個の数値を入力すると 数値を小さい順に並べ換え 画面に表示するプログラムを作りなさい  DIM文使うかもしれません

  • プログラム教えてください

    問題が キーボードから10個の 数値を入力すると 数値を小さい順に並べ換え画面に表示する プログラムを作りなさい。 行番号つきでお願いします

  • プログラムのトレース

    プログラムのトレース  参考書のプログラムを読んでいて、どうしてもわからないところがあります。  自己参照構造体の利用例というところなのですが、次のプログラムです。 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct person { char name[30]; int age; struct person *next; } Person; int main(void) { Person dmy = {"", 0, NULL}; Person *start = &dmy; Person *wkdtp; Person *ip; char name[30], age_ss[10]; while(1){ /* キーボードからデータを入力する */ printf("名前="); gets(name); if(strcmp(name, "") == 0) break; printf("年齢="); gets(age_ss); /* 構造体1個分のメモリを確保する */ wkdtp = (Person *)malloc(sizeof(Person)); if(wkdtp == NULL){ printf("メモリ確保できません。\n"); exit(1); } /* 確保した構造体に名前と年齢を設定する */ strcpy(wkdtp->name, name); wkdtp->age = atoi(age_ss); /* 作成した構造体wkdtpを既存のチェーンにはめ込んでいく */ for(ip=start; ip->next != NULL; ip = ip->next){ if(wkdtp->age < ip->next->age){ wkdtp->next = ip->next; ip->next = wkdtp; break; } } /* 最高齢だったらチェーンの最後につなぐ */ if(ip->next == NULL){ ip->next = wkdtp; wkdtp->next = NULL; } } /* チェーンをたどって構造体の内容を表示する */ for(ip = start->next; ip != NULL; ip = ip->next){ printf("%s %d\n", ip->name, ip->age); } return 0; } /* 作成した構造体wkdtpを既存のチェーンにはめ込んでいく */ の次のforループの始めで、つまづいてしまうのです。 ip=start で、startをipに代入していますが、このstartの中身って、構造体dmyすなわち、{"", 0, NULL}なのではないですか? forループの継続条件が、ip->nextがNULLでないことですから、その時点でforループの中の文を実行せずにループから抜けてしまうのではないでしょうか。「これはきっと何かの間違いだ」と思い、リストを打ち込んで、コンパイル・リンク・実行してみたら、参考書の通り、 名前=田中一郎←入力する 年齢=20 名前=伊藤二郎 年齢=40 名前=鈴木三郎 年齢=10 名前=内田四郎 年齢=30 名前=[enter]←[enter]だけ押下で入力終了 鈴木三郎 10←年齢順になっている 田中一郎 20 内田四郎 30 伊藤二郎 40 と、うまく作動しました。済みません、すごく初歩的な質問をしていると思うのですが、私の理解のどこが間違っているのでしょうか、どなたか解説をお願いします。

  • accessのVBAで変数名でフィールド指定は?

    VBAの記述として フィールド名を指定するときに通常であれば forms![顧客一覧]![ID]やforms![顧客一覧]![age]と記述しますが この[ID]という部分についてあるフォームから IDという文字があるときはIDフィールド、 ageという文字があるときはageフィールドに記述というのはできるのでしょうか?

  • プログラムのトレース

    プログラムのトレース  参考書を読んでいて、どうしてもわからないところがあります。  自己参照構造体の利用というところなのですが、次のプログラムです。 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct person { char name[30]; int age; struct person *next; } Person; int main(void) { Person dmy = {"", 0, NULL}; Person *start = &dmy; Person *wkdtp; Person *ip; char name[30], age_ss[10]; while(1){ /* キーボードからデータを入力する */ printf("名前="); gets(name); if(strcmp(name, "") == 0) break; printf("年齢="); gets(age_ss); /* 構造体1個分のメモリを確保する */ wkdtp = (Person *)malloc(sizeof(Person)); if(wkdtp == NULL){ printf("メモリ確保できません。\n"); exit(1); } /* 確保した構造体に名前と年齢を設定する */ strcpy(wkdtp->name, name); wkdtp->age = atoi(age_ss); /* 作成した構造体wkdtpを既存のチェーンにはめ込んでいく */ for(ip=start; ip->next != NULL; ip = ip->next){ if(wkdtp->age < ip->next->age){ wkdtp->next = ip->next; ip->next = wkdtp; break; } } /* 最高齢だったらチェーンの最後につなぐ */ if(ip->next == NULL){ ip->next = wkdtp; wkdtp->next = NULL; } } /* チェーンをたどって構造体の内容を表示する */ for(ip = start->next; ip != NULL; ip = ip->next){ printf("%s %d\n", ip->name, ip->age); } return 0; } /* 作成した構造体wkdtpを既存のチェーンにはめ込んでいく */ の次のforループの最初のところでつまづいてしまいます。 ip=start でipにstartを代入していますが、このstartの中身って、dmyすなわち{"", 0, NULL}ではないですか。forループの継続条件が、ip->nextがNULLでないことですから、ループの開始時点でループの中の文を実行せずに抜けてしまうのではないでしょうか。「これは何かの間違いだ」と思い、打ち込んでコンパイル・リンク・実行してみると、参考書の通りに、 名前=田中一郎←入力する 年齢=20 名前=伊藤二郎 年齢=40 名前=鈴木三郎 年齢=10 名前=内田四郎 年齢=30 名前=[enter]←[enter]だけ押下で入力終了 鈴木三郎 10←年齢順になっている 田中一郎 20 内田四郎 30 伊藤二郎 40 と、動きました。済みません、すごく初歩的なことで悩んでいると思いますが、私の理解のどこが間違っているのでしょうか。どなたか解説をお願い致します。

  • 変数のinsertに関しまして

    MySQLのインサートに関して質問です。 2つの値を登録したい場合、 下記のように対応すれば、 データの挿入は通常どおり完了しますが、 insert into テーブル名 (フィールド1, フィールド2) values (値1, 値2);  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 私の場合は、 「ken_name」と「machi_name」という変数を、 上記でいうところの、 「値1」と「値2」に入力したいと思っています。 変数の指す部分は、 それぞれ30文字程度の英数字です。 プログラム内で、 以下のように、 インサートのクエリー処理を行ってみたら、 DB接続も正常に出来ているし、 エラーとかも一切出ていないのですが、 DB内のテーブルに何も登録されていませんでした。 insert into テーブル名 (フィールド1, フィールド2) values (ken_name, machi_name);  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ やり方としては、合っていますでしょうか? 何かアドバイスいただけると嬉しいです。 宜しくお願い致します。

  • javaの初心者向けプログラムの宿題です

    「指定された値の倍数を10個表示するプログラム」 です。 選択授業で取ったjavaプログラミングの宿題ですが行き詰ってしまいました。 部分的にはなんとなく理解できるのですが、全体像がつかめません。 流れだけでもご教示願います。 (1)値の入力を促す「数値入力」メッセージを表示し、文字列入力を待機する。 (2)その入力から文字列を取得して文字列をint型の数値に変換。 (3) 入力された文字列が数値以外の場合は、例外(NumberFormatException)が発生した場合に、メッセージ「半角数字で数値指定」を表示してアプリケーションを終了。 (4) 倍数を表示できる数値の範囲は、2以上100未満、範囲外の数値が入力された場合にはメッセージ「[入力から取得した数値]の倍数は表示できません。0から100までの数値を指定してください。」を表示してアプリケーションを終了。 注) 処理を開始するメッセージを表示し、入力された数値の倍数を標準出力に10個表示する。 各数値は、タブ(¥t)で区切り、5個表示毎に改行。 倍数は、0を含めて表示。 よろしくおねがいします。

  • VBAに関して、selectを使わない方法

    現在、全国の都道府県の市町村別である数値を測るプログラムをつくっています。 現在のプログラムはselectを使い、市町村を選択した(人口や県庁所在地等で大まかにわけた)後、47都道府県を選択し計算するようになっています。下にプログラム例を張ります。ageと面積は入力画面(ユーザーフォームにて作成)にて入力する値となります。 select city case 札幌  age1*○○+age2*△△+age3*◆◆ case 町村  age1*●●+age2*▲▲+age3*□□ ・ ・ ・ end select ・ ・ ・ select area case 北海道  面積1*☆☆+面積2*★★ case 青森  面積1*▼▼+面積2*▽▽ ・ ・ ・ end select といった感じです。selectを使っているため非常に量が多いので、selectを使わないようにしたいのです。ループ文を使おうと考えたのですが、かける数値(★や□)も違い、計算する箇所がふたつあるためどのようにすればよいか分かりません。 つかったとしてもプロシージャが大きくなりすぎないようにしたいのですが、ifをつかって別のモジュールで市町村だけ計算させ、さらにifを使い別のモジュールで都道府県だけで計算させ、出力の時に結果だけ抽出することなど可能でしょうか?他に簡単な方法とかありますか? 皆さんの力をお貸しください。 回答よろしくお願いします。

  • C++のプログラムを作って頂けませんか?

    ソースをこちらにお願い致します!全て別のプログラムです cin.getline()を使用すること。また、stringクラス及び標準ライブラリの文字列関連の関数は使用しないこと 一つ目。 文字を入力すると、文字列中のアルファベット大文字を小文字に変換するプログラム。入力できる文字数は最大80文字。 例 入力:ABcdEFgh 結果:abcdefgh 二つ目。 文字列を入力すると、文字を循環しているように見えるプログラム。入力できる文字数は最大80文字。 例 入力:Hello 結果: Hello elloH lloHe loHel oHell Hello 三つめ。 文字列を入力すると、文字が逆順になるプログラム。入力できる文字数を最大80文字とする。 例 入力:Hello 結果:olleH どなたかお願いします!

専門家に質問してみよう