質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

2108閲覧

配列の添え字を使って、条件と一致する要素のみ取得し表示したい

SsEe_egg

総合スコア19

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2019/06/26 02:59

こんにちは。お世話になっております。
Visual Studio2013です。
テストの結果を集計するコンソールアプリケーションを作成中です。

①「受験者数は?」を表示し、受験者数を入力
②「氏名は?」と表示し、氏名を入力
③「点数は?」と表示し、点数を入力
④②、③を受験人数分繰り返す

⑤「平均点:1 合計点:2 最高点:3 終了:9」と表示させ番号を入力
⑥1を選択で平均点、2を選択で合計点、3を選択で最高点の氏名と点数が表示されて、⑤に戻る

⑦9が選択されるとプログラムが終了する

自分が作成したコードは以下の通りです

using System; using System.Diagnostics; using System.Threading; class Program { static void Main(string[] args) { Console.WriteLine("受験者数は?"); int ninzu = int.Parse(Console.ReadLine()); // 人数分の名前と点数を格納する配列を宣言 string[] name = new string[ninzu]; int[] score = new int[ninzu]; int sum = 0; for (int i = 0; i < ninzu; ++i) { Console.WriteLine("氏名は?"); name[i] = Console.ReadLine(); Console.WriteLine("点数は?"); score[i] = int.Parse(Console.ReadLine()); sum = sum + score[i]; } bool pEnd = false; while(true) { Console.WriteLine("平均点:1 合計点:2 最高点:3 終了:9"); string str = Console.ReadLine(); switch (str) { case "1": // 平均点 double average = (double)sum / ninzu; string aveScore = average.ToString("F1"); Console.WriteLine("平均点" + aveScore + "点"); continue; case "2":  // 合計点 Console.WriteLine("合計点" + sum + "点"); continue; case "3": // 最高点と最高得点者の名前(複数あり) int highscore = -1; int j, k; for (j = 0; j < ninzu; ++j) // 最高得点 { if (highscore < score[j]) highscore = score[j]; } for (k = 0; k < ninzu; ++k) { // 条件は… // 「highscore」と配列score[]の要素が同じ かつ // その配列score[]とname[]の添え字が一致する // name[](つまり最高得点者)を表示させたい  // 最高得点者のみを全て表示する条件にしたい // if(…) ?? } Console.WriteLine(highscore); continue; case "9":  // プログラム終了 pEnd = true; break; } if (pEnd) { break; } } } }

配列name[]の中から最高得点者(複数の場合もあり)を取得し表示させる方法がわからず、苦戦しております。

for文で受験者数分まわして、if文で配列score[]の要素がhighscoreと一致、かつ
その要素の添え字とname[]の添え字が一致とすれば、
最高得点者の氏名が取得できるのでは?
と思いましたが、うまくコードが書けません。

なにかよい方法はないでしょうか?
知恵をお借りしたいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/26 03:18

配列を使うのは必須条件ですか? そうでなければ List<T> 型のオブジェクトに格納することを考えてはいかがですか? T は例えば以下のようなクラスです。 public class NameScore { public string Name { get; set; } public int Score { get; set; } } そうすれば「添え字が一致」で悩む必要はなくなりますし、Linq を使うなどでより容易に望む結果を得られるのではないかと思います。
SsEe_egg

2019/06/26 04:13

こんにちは。 ご回答、ありがとうございます。 説明不足でした。申し訳ございません。 配列は使用必須ではありません。 ですが、配列の使い方の勉強する目的もあって配列に格納していました。ListやLinqも勉強しておきたいのでそちらのやり方でももう一度プログラムを作ってみようと思います。
退会済みユーザー

退会済みユーザー

2019/06/26 06:08

> 配列は使用必須ではありません。 であれば、今回のような課題を解決するのに配列を使ってわざわざ茨の道を歩く必要はないと思います。はっきり言って、今回の問題のために解列を使うのは不適切だと思います。勉強するなら適材適所を考えましょう。
SsEe_egg

2019/06/26 07:40

承知しました。 Listに関して、まだ使用したことがなくて、このようなケースで使用する便利なものだったのですね。 勉強して使えるようにしたいと思います。 アドバイスありがとうございました。
guest

回答2

0

ベストアンサー

こんにちは。

直接の回答はしませんが、ヒントとして、
「name と score をペアとして扱いたいなら、先に NameScore を持つ新しい class を作ってしまう」
というものがあります。

こんな感じのイメージです。

csharp

1// Name と Score を持つクラス 2class Person 3{ 4 public string Name { get; set; } 5 public int Score { get; set; } 6} 7 8static void Main(string[] args) 9{ 10 Console.WriteLine("受験者数は?"); 11 int ninzu = int.Parse(Console.ReadLine()); 12 13 // 人数分の名前と点数を格納する配列を宣言 14 // string[] name = new string[ninzu]; 15 // int[] score = new int[ninzu]; 16 17 // Person の配列一つだけにしてしまう 18 var persons = new Person[ninzu]; 19 20 int sum = 0; 21 for (int i = 0; i < ninzu; ++i) 22 { 23 var person = new Person(); // ここで新しい Person を作る 24 25 Console.WriteLine("氏名は?"); 26 person.Name = Console.ReadLine(); // person の中に書き込む 27 28 Console.WriteLine("点数は?"); 29 person.Score = int.Parse(Console.ReadLine()); 30 sum = sum + person.Score; 31 32 persons[i] = person; // ここで persons に person を追加 33 } 34 35 // ...

こうすることで、Score が分かる場面では Name も分かり、Name が分かるなら Score も簡単に取れます。

投稿2019/06/26 03:11

編集2019/06/26 03:13
tamoto

総合スコア4105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SsEe_egg

2019/06/26 04:19

回答ありがとうございます。 クラスを利用するのですね!勉強になります。 アドバイスありがとうございます。 ここから、目的の点数と名前を抽出できるよう工夫したいます。
guest

0

配列を利用するなら

for (k = 0; k < ninzu; ++k) { if(score[k] == highscore) {       Console.WriteLine(最高得点と一致した点数と名前の表示); } }

これで良いと思いますが、クラスのリストを作ったほうが効率的です。

投稿2019/06/26 04:22

k.matsuda

総合スコア293

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SsEe_egg

2019/06/26 04:39

回答ありがとうございます。 添え字にこだわりすぎていました…。 こちらの条件で思ったとおりの動作しました。 皆さんがおっしゃるとおり、クラス利用にかえて作り直したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問