🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Q&A

解決済

5回答

11064閲覧

配列のなかで最大値と最小値を表示させたい。

Seeeveeen

総合スコア7

C#

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

0グッド

0クリップ

投稿2021/03/14 07:43

編集2021/03/16 08:31

乱数で1~10の数字を発生させて最大値と最小値を表示させたいのですが、以下のように書いてもうまくできません。

c#

1 Random rnd = new Random(); 2 string num = " "; 3 4 5 for(int i = 0; i < 11; i++) 6 { 7 int dise = rnd.Next(1, 11); 8 num += dise + " "; 9 } 10 11 Console.WriteLine(num); 12 Console.WriteLine(num.Max()); 13 Console.WriteLine(num.Min()); 14

結果が以下のようになってしまいます。
イメージ説明
9が最大値なのもおかしいし最小値が表示されません。

{追記}
自分なりに調べて、最大値と最小値はたぶん以下のコードで出てくるようになりました。たぶんというのは、乱数で発生した10個の数字が表示できないから確認できないのです。以下の通り、listを使って書いてみたのですが、listの中身を表示させるために一回stringに変換してからconsole.writelineで表示させようとしたところ失敗してしまいました。

c#

1 var samplelist = new List<int>(); 2 Random rnd = new Random(); 3 4 5 for(int i = 0; i < 11; i++) 6 { 7 int a = rnd.Next(1, 11); 8 samplelist.Add(a); 9 } 10 11 string n = samplelist.ToString(); 12 Console.WriteLine(" " + n); 13 Console.WriteLine(samplelist.Max()); 14 Console.WriteLine(samplelist.Min());

出てくる結果
イメージ説明

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

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

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

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

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

dodox86

2021/03/14 07:49

たぶん先の質問、回答の延長で考えているのかもしれませんが、 https://teratail.com/questions/327609 > string num = " "; ... > int dise = rnd.Next(1, 11); > num += dise + " "; はstring(文字列)で扱っていて、それすなわち配列ではありません。
退会済みユーザー

退会済みユーザー

2021/03/14 08:37

文字列に対してMax、Minを行っても、文字列の中で辞書順で一番最大の文字'9'と最小の文字' 'が出力されてるだけです。
BluOxy

2021/03/16 08:39

samplelist.ToString では List の各要素は表示されません。 List を何かの文字で区切って表示したい場合には string.Join メソッドが使えます。
guest

回答5

0

ベストアンサー

C#は強力なプログラミング言語なので、やりたいことがあってもそれを実現するに様々便利な方法があり、「調べる」と称してWEBを検索すると色んな情報が得られてしまいます。それは良いことではあるのですが、初心の方が一人で学習するには情報に振り回されがちになり、消化不良になることもあります。まずは「基本を学んだ上で、今、自分が扱える手持ちのテクニックだけでどこまでできるか」を考えて挑まれた方が良いケースも多いと思います。

言葉の捉え方の問題ですが、「調べる」とは自分にとって未知の情報を探しにいくことであり、配列やリストの中から最大のもの、最小のものを探しにいくことは普段の日常生活でも頭の中で同じようにやっていることで、その行為の仕方を「調べる」と言うよりは、普段やっていることをコードに書き起こすだけです。

そんな訳で、比較的素直、それほど深く考えずにコードに落とし込むと、例えば以下のようになります。

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4 5namespace ConApp1 6{ 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 var list = new List<int>(); 12 Random rnd = new Random(); 13 14 // 10個作りたいのであれば、0から9まで 15 for (int i = 0; i < 10; i++) 16 { 17 int a = rnd.Next(1, 11); 18 list.Add(a); 19 } 20 21 // 乱数の範囲は1から10の値なので、最小値の初期値を11、最大値の初期値を0とでも 22 // しておき、それぞれの要素と比較して自力で取得すれば良い。 23 int minValue = 11; 24 int maxValue = 0; 25 for (int i = 0; i < list.Count; i++) 26 { 27 if (list[i] < minValue) 28 { 29 minValue = list[i]; 30 } 31 32 if (maxValue < list[i]) 33 { 34 maxValue = list[i]; 35 } 36 } 37 38 // 生成したList要素数分の乱数値を確認したいのであれば、 39 // Listの各要素を順番にConsole.WriteLine()すれば良い。要素の間は" "で区切る。 40 // ※ foreach文を使えば少しだけシンプルになるが、あえて普通のfor文で。 41 for (int i = 0; i < list.Count; i++) 42 { 43 if (0 < i) 44 { 45 Console.Write(" "); 46 } 47 48 // Console.WriteLine()の引数は、int型の変数を渡せる。 49 Console.Write(list[i]); 50 } 51 52 Console.WriteLine(); 53 Console.WriteLine("MAX=" + maxValue); 54 Console.WriteLine("MIN=" + minValue); 55 56 // おまけ: Linqを使った例 57 Console.WriteLine("---- Linq:"); 58 59 // List中のint型要素をstring型にして配列にし、 60 // string.Join()メソッドで' ' 区切りの文字列にする。 61 var s = string.Join(' ', list.Select(v => v.ToString()).ToList().ToArray()); 62 Console.WriteLine(s); 63 64 // Linqを使えば、List中のMaxもMinも得られる。 65 Console.WriteLine("MAX=" + list.Max()); 66 Console.WriteLine("MIN=" + list.Min()); 67 } 68 } 69}

これを実行すると、例えば以下のような結果が出力されます。

CMD

1C> ConApp1.exe 27 5 3 9 6 5 4 10 7 4 3MAX=10 4MIN=3 5---- Linq: 67 5 3 9 6 5 4 10 7 4 7MAX=10 8MIN=3

Linqを使ったやり方はおまけで入れたものですが、同じ結果が出力されているのが分かりますね。ですが、そういった最適、効率的、便利な方法を学ぶのは後でも良くて、まずは愚直でも基本的な方法を自分が困らない程度に扱えるようになるのが先だと、少なくとも個人的には思います。

投稿2021/03/17 00:24

dodox86

総合スコア9256

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

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

Seeeveeen

2021/03/18 04:27

回答ありがとうございます。 疑問なんですが int minValue = 11; int maxValue = 0; for (int i = 0; i < list.Count; i++) { if (list[i] < minValue) { minValue = list[i]; } if (maxValue < list[i]) { maxValue = list[i]; } } のところで、minvalueを0に設定していて、乱数は1~10の間で発生しているのになんでlist[i]<minvalueのように0より小さいときに代入、としているのでしょうか。
dodox86

2021/03/18 05:23

> のところで、minvalueを0に設定していて、 いえ、最初にminValueの初期値は11(10でもいいですけど)としています。"考えられる最大の値"を"最小値の初期値"とすることで、発生した乱数1~10の値で、順次更新できるようにします。
dodox86

2021/03/18 05:30

また、minVallueやmaxValueについては必ずしも初期値をセットしておかなくても良くて、例えば最初の要素list[0]の値をそれぞれに必ずセットし、list[1]からのものを比較して更新していっても良いです。更に、乱数を生成させるときに同時に比較、更新してしまえば、乱数生成時のループだけで処理できます。それだと最大、最小値を取得する為のループを減らすことができます。ただの最小値、最大値の取得にしても、色々な方法(考え方)でできる、ということです。
Seeeveeen

2021/03/18 14:00

見間違えてた。。。 わかりやすい回答ありがとうございます。 もっと柔軟に考えれるように頑張ります。
guest

0

発生乱数の確認だけならこれでできます。

for(int i = 0; i < 11; i++) { int a = rnd.Next(1, 11); samplelist.Add(a); Console.Write($" {a}"); // これ追加 } Console.WriteLine(""); // これも追加。改行しときます。※個人的にWriteLine("")で改行してる派

投稿2021/03/16 10:07

sinya0320

総合スコア211

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

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

0

既に指摘が出ておりますが
string型に対してMax()、Min()を行った場合
stringをchar配列として扱い、最大、最小を取得するので
文字コード上の最小としてスペース、文字コード上の最大として9が取得されます。

数値配列に入れるか、Split()で分割してからSelect()メソッドでint変換を挟んでからMax()、Min()を使うか
方法は色々ありますので、工夫してみてください。

投稿2021/03/14 14:59

編集2021/03/14 15:01
sinya0320

総合スコア211

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

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

0

もう指摘してくださってる人がいる人もいると思うのですが、
string num = " ";
これが非常に怪しく見えます。
数字の大きさを比較するのに、stringでやるのは違和感を感じますね。

投稿2021/03/14 08:37

hon.ki

総合スコア157

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

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

0

多分、仕様通りの動作ではないでしょうか。 (MSDN string)

string num = " ";

文字列に数字を入れてますが、文字列に入れることで、数字でなく、文字となります。 string.Max()は、文字列の中の最大の文字を取得し、string.Min()は最小の文字を取得します。
上記の場合、最大は、9ですが、最小は、 (空白)となります。 (多分、空白が出力されている)

数字として扱いたいならば、List<int> とか、int[] で配列として扱う必要があります。

投稿2021/03/14 08:35

pepperleaf

総合スコア6385

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問