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

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

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

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

Q&A

解決済

5回答

6210閲覧

Listの可変長配列を作成する行為をfor文で生成したいです。

57svu

総合スコア28

C#

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

0グッド

0クリップ

投稿2017/05/19 03:53

某サイトの問題に手を焼いています。
ここの問題6_3なのですが、以下参照
『 0から100までの乱数を発生させてその値を表示し、0が出たら、それまで出力した整数の1の位が同じものをまとめて表示するプログラムを作りなさい。このとき、入力された整数値は、Listで作った可変長配列の中に格納すること。 』
とのことです。
考え方は同リンク問題6_1の乱数を発生させ偶奇で判別、格納のやりかたの
今度は選択しが10個に増えました。
というイメージはつかめたのですが、実際に冒頭で0から9までの順で何もはいていない(null)のList型の入れ物を10個生成したとすると、
Listクラスのどこをいじればfor文を駆使してList型クラスをnewできるのでしょうか。
自分のイメージとしては
① 最初にList型クラスを0~9verをnewする

② whileで0が出るまで乱数発生

③ 0以外の乱数は判別

④ 判別した1の位の数をもとに
0から9までのListにList名.Add(乱数);で格納

⑤ 0がでたらFin。

⑥ 最後に表示
for文で0から9まで繰り返し
ただif文でnullじゃないときに数表示
それ以外なら
なしと表示
という構成です。

そのイメージが初めはつかめないために、配列を駆使し全体のコードは作成しました。

配列の場合だと
①、配列の型はStirngにして冒頭に10個newに置き換わり
④、判別した1の位をもとに格納先を検索、格納する直前にToStringして変換処理
と処理内容が少々変更します。
ちなみに以下自分が配列で作成したものです。
この配列で10個newしてるのを
Listで10個newしたいです。

c#

1 2static void Main(string[] args) 3 { 4 /* 5 * 0から100までの乱数を発生させてその値を表示し 6 * 0が出たら、それまで出力した整数の1の位が同じものを 7 * まとめて表示するプログラムを作りなさい。 8 * この際入力された整数値は、Listで作った可変長配列の中に格納すること。 9 */ 10 11 // 乱数発生のオブジェクトを生成 12 Random r = new Random(); 13 14 // 0から9までの1の位の数に応じて格納先が変わるListを生成 15 16 for (int f = 0; f <= 9; f++) 17 { 18 List<String> NumberBox_f = new List<String>(); 19 } 20 //List<String> NumberBox = new List<String>(); 21 22 23 string[] BoxOfRndomNumber = new string[10]; 24 25 for (int a = 0; a < BoxOfRndomNumber.Length; a++) 26 { 27 BoxOfRndomNumber[a] = null; 28 } 29 30 31 32 //Dictionary<int, int> NumberBox = new Dictionary<int, int>(); 33 34 while (true) 35 { 36 int RandomNumber = r.Next(0, 101); 37 Console.WriteLine("0~100までの値を出力 : " + RandomNumber); 38 // 0が出るまで繰り返し 39 if (RandomNumber == 0) 40 { 41 break; 42 } 43 // 一の位を判別するため判別用に発生した乱数と同じ値をとる変数を用意 44 int JudgementRandomNumber = RandomNumber; 45 46 /* もし値が10以上なら10で割った余りの数で1のけたを判別 47 * 例:36や50はこのifに入り、 48 * 10で割った際の余りの数に変数値を上書き 49 */ 50 51 if (JudgementRandomNumber >= 10) 52 { 53 JudgementRandomNumber %= 10; 54 } 55 // 1の位の判別完了 JudgeRNが判別用、格納用はRN 56 57 // 0から9までの配列に各々格納 58 for (int i = 0; i <= 9; i++) 59 { 60 if (JudgementRandomNumber == i) 61 { 62 BoxOfRndomNumber[JudgementRandomNumber] += " " + RandomNumber.ToString(); 63 } 64 } 65 } 66 67 for (int j = 0; j <= 9; j++) 68 { 69 if (BoxOfRndomNumber[j] != null ) 70 { 71 Console.WriteLine("一の位が{0}:{1}", j, BoxOfRndomNumber[j]); 72 } 73 else 74 { 75 Console.WriteLine("一の位が{0}:なし", j); 76 } 77 } 78 System.Threading.Thread.Sleep(100000); 79 } 80

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

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

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

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

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

coco_bauer

2017/05/19 04:11

[ヒント] 生成する乱数はint型ですから、list<String>ではなくlist<Int>。10個のlistを別々に作るのではなく、listの配列を作れば良いのではないでしょうか。 また、整数の1の位の値は ('元の値' % 10 )で求められます。
57svu

2017/05/22 08:57

ヒントをありがとうございます。listの配列を使うのと、わざわざsting型にしないでint型でなおしたところ、先ずListの配列を作ろうとしたのでずか、エラーが出てしまいました。
guest

回答5

0

この問題の書いてあるページの一番上に

この問題を解くためには…

応用編第6日目参照

とあります。
そのリンク先はここです。
コレクション

コレクションとは

List
サンプルプログラム
実行結果
Listの宣言と生成
Listへのデータの追加
Addメソッドの利用
Insertメソッドの利用
Listの出力
Listの中のデータの削除
Listクラスの主要メソッド
ハッシュテーブルの利用
ハッシュテーブルとは
サンプルプログラム
実行結果
Dictionaryクラスの宣言と生成
Dictionaryクラスの宣言と利用
Dictionaryクラスのデータの設定
Dictionaryクラスの働き
データの出力
Dictionaryクラスのキーの取得
HashSet
サンプルプログラム
実行結果
HashSetクラスの働き
練習問題 : 問題6.

最後の「練習問題 : 問題6.」からのリンクがこの問題です。
つまり、応用編第6日目を勉強してから練習問題に入りなさいということです。

そんなに面倒ならもうやめればいいじゃないですか。

投稿2017/05/19 07:50

Zuishin

総合スコア28660

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

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

57svu

2017/05/19 17:04

やる気スイッチを押していただきありがとうございました。
guest

0

ベストアンサー

一応自分なりに考えた結果みたいだから丸投げじゃないと判断しておく

List<int>にポコポコぶち込んだ後、Linq使って0~9の順に表示するのかと思ったけど、
Zuishinさんの指摘にある「この問題を解くためには…」を見るとたぶんDictionary使ってねって気がする
少なくともList<int>[10]は違うと思う。

なので、Dictionary<int, List<int>>でkeyになるintに1の位の数値を、ランダムで作った数値自身はvalueになるList<int>に追加する形でやればいいんじゃないかな?
、というのを念頭に置いてもう一度「この問題を解くためには…」を見直して頑張ってみるといいと思う。

ソースをまるっと書くと勉強にならないと思うのであえてぼんやりとした表現にしています

投稿2017/05/19 11:49

len_souko

総合スコア1348

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

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

Zuishin

2017/05/19 16:29

いやいや List の説明がまんま書いてありますよ。
57svu

2017/05/19 16:34

Dictionaryで0から9まで各々割り振り対応する選択肢を用意しておく ↓ 乱数発生 ↓ どこいれる? ↓ 乱数%10=判別等の変数 i 判別式(dictionary名,ContainsKey( i ){ ditionary(i), Add(乱数); こんなイメージですかね 実践してみます。 回答へと向かうベクトルを示していただいてありがとうございました! 15分考えても具体的なイメージがわかなかったので質問を投稿したのですが、自分が伝えたいことが明確に言語化にできずに困っていました。 ほんとにありがとうございました!
guest

0

A.Listの配列を作る
B.とりあえず0が出るまで一つのListに詰めて、0が出たらDictionaryなり別のリストなり配列なりに仕分ける

投稿2017/05/19 04:09

ozwk

総合スコア13521

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

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

0

C#

1void Main() 2{ 3 IEnumerable<int> Generate(int maxValue) 4 { 5 var random = new Random(); 6 7 while (true) 8 { 9 yield return random.Next(maxValue); 10 } 11 } 12 13 var dictionary = Generate(101) 14 .Select(value => 15 { 16 Console.WriteLine($"0~100の値を出力:{value}"); 17 return value; 18 }) 19 .TakeWhile(value => value != 0) 20 .GroupBy(value => value % 10) 21 .ToDictionary(_ => _.Key, _ => _.ToList()); 22 23 foreach (var i in dictionary.Keys.OrderBy(_ => _)) 24 { 25 Console.WriteLine($"一の位が{i} : {string.Join(" ", dictionary[i])}"); 26 } 27}

とか。

投稿2017/05/19 04:09

編集2017/05/20 12:41
hidori

総合スコア402

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

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

0

えーっと。
何を聞きたいのかがよくわかりませんが(問題を全部解け、ということじゃないですよね?)
質問を簡潔にまとめると
「string型の要素が10個のListクラスのインスタンスを生成する方法はなんですか?」
ということでしょうか。

List<string> BoxOfRndomNumber = new List<string>(10);
ですかね。

でも質問文には可変長と書いてあるので
List<string> BoxOfRndomNumber = new List<string>();
なのかな。

投稿2017/05/19 04:09

編集2017/05/19 04:34
workaholist

総合スコア559

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問