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

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

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

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

Q&A

解決済

3回答

8602閲覧

奇数と偶数で発生した乱数を振り分けたいです

57svu

総合スコア28

C#

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

0グッド

0クリップ

投稿2017/05/02 06:52

###前提・実現したいこと

始めまして
先日プログラミングをはじめたものです。
c#で配列変数を作成し
値が1から100までの乱数ときめて
配列の大きさは10
で実行した10個の乱数を
偶数だったら
string 1に追加
奇数だったら
string 2に追加
としたいです

問題URL
http://csharp.sevendays-study.com/problem4.html#problem5
###発生している問題・エラーメッセージ

エラーメッセージ

未割当のローカル変数が使われましたとOdd,Evenで出ます

###該当のソースコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace prob5_3
{
class Program
{
static void Main(string[] args)
{
Random rnd = new Random();
int [] data = new int[10];

data[0] = rnd.Next(1, 101); data[1] = rnd.Next(1, 101); data[2] = rnd.Next(1, 101); data[3] = rnd.Next(1, 101); data[4] = rnd.Next(1, 101); data[5] = rnd.Next(1, 101); data[6] = rnd.Next(1, 101); data[7] = rnd.Next(1, 101); data[8] = rnd.Next(1, 101); data[9] = rnd.Next(1, 101); int i; // 文字列 i を宣言 string Odd ; // 文字列 Oddを宣言 string Even; // 文字列 Evenを宣言 for (i = 0; i < data.Length; i++) // i は0で初期化 i がa の大きさ未満ならtrue { Console.Write(data[i] + " "); // 配列変数 data[i]と空白を表示 if (data[i] % 2 != 0) // 配列変数 data[i] が偶数で割れないのであれば { int a = int.Parse(Odd); // データ型変換 文字列oddは int 型の変数 aに置き換える Odd += data[i]; // data[i] は奇数の aに代入 } if (data[i] % 2 == 0) // 配列変数 data[i] が偶数で割りきれるのであれば { int b = int.Parse(Even); Even += data[i]; } } Console.WriteLine(); Console.Write(" 奇数 : " + Odd); Console.WriteLine(); Console.Write(" 偶数 : " + Even); System.Threading.Thread.Sleep(100000); } }

}

###試したこと

stringを使って変換作業を試みるもうまくいかないです

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答3

0

最近ちょっと自信消失気味ですが・・・

stringで宣言した変数が初期化されていないのではないでしょうか?
stringであれば""で空文字を宣言するなど・・・

あと、そのstringにintを入れようとしているので・・・
そこもきちんとしておいたほうがよいと思います。

投稿2017/05/02 07:18

s.t.

総合スコア2021

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

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

57svu

2017/05/02 13:52

ご指摘ありがとうございます。 初期化されていない点に気がつき ひとまず、stringで空白を初期化し stringをそのままint にいれようとしていたので、そこの変換も気がつけました! ありがとうございます????
guest

0

ベストアンサー

要するに偶数奇数で分けて、それらを文字列にしてスペース区切りで結合したいということなので、

C#

1string even = string.Join(" ", data.Where(x => x % 2 == 0)); 2string odd = string.Join(" ", data.Where(x => x % 2 != 0));

つっこみどころ

C#

1if (data[i] % 2 != 0) // 配列変数 data[i] が偶数で割れないのであれば 2{ 3 int a = int.Parse(Odd); // データ型変換 文字列oddは int 型の変数 aに置き換える 4 Odd += data[i]; // data[i] は奇数の aに代入 5}

aどこ行った?

投稿2017/05/02 07:27

編集2017/05/02 07:31
ozwk

総合スコア13512

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

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

57svu

2017/05/02 14:02

aさん、せっかくつくったのに使ってなかったですね。 ツッコミありがとうございます。 あの後自分で調べた方法は intを .ToStringでstringに変換しstringに合算していく方法をとりましたが この方法でもやってみたいと思います ありがとうございます!
guest

0

偶数かどうかを判断して、奇数の処理はelse{}に入れてやったほうがエラーの原因がわかりやすいと思います。
未割当のローカル変数が使われましたってのは、要は( ´∀`)<ぬるぽ

あまりよくありませんが、一応同じプログラムを書いてみました。

using System; class a{ static void Main(){ Random rnd = new Random(); int[] data = new int[10]; for(int i = 0; i < data.Length; i ++){ data[i] = rnd.Next(1, 101); } string Odd = ""; string Even = ""; for(int i = 0; i < data.Length; i ++){ if((double)data[i] % 2.0 == 0) Even += data[i] + " "; else Odd += data[i] + " "; } Console.WriteLine("奇数: " + Odd + "\n偶数: " + Even); Console.ReadLine(); } }

投稿2017/05/02 07:18

編集2017/05/02 15:14
otftrough

総合スコア476

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

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

ozwk

2017/05/02 07:49

> 偶数と奇数の判断は、if (data[i] % 2 != 0)をif ((double)data[i] % 2.0 != 0)にするのが一番手っ取り早いと思います。 何が手っ取り早いんですか?
otftrough

2017/05/02 08:35

javaと混同してました。
ozwk

2017/05/02 08:52

javaだと手っ取り早いんですか?
KSwordOfHaste

2017/05/02 09:36

偶奇を判定するのに整数のままで剰余演算子を用いるのが素直な方法と思います。 が、otftroughさんの回答にちょっと興味を持ちました。なぜ浮動小数点数へ変換するのがよいと考えたか考えを述べてみると何かが得られると思います。自分も過去の回答で間違ったことを言ったとき閲覧者の皆さんに指摘していただき勘違いに気づけたことがありましたよ。
57svu

2017/05/02 13:59

みなさんたくさんのご意見ありがとうございます。 ぬるぽの箇所はひとまず初期化をすることで改善できました ただ なぜdoubleを使うのかがピンときていないです????
otftrough

2017/05/02 15:10

単にいろいろ考えすぎて混乱して間違ってただけでした。 普段自分は除算を使っていて、今回の場合ならif((double)(data[i] / 2) == (double)data[i] / 2.0)とかしてるので、%を使い慣れていないせいで混同してました。%使うなら少数関係ないですね。
KSwordOfHaste

2017/05/02 18:55

なるほど、割り切れるかどうかをi1/i2 == (double)i1/i2としていたということですかね。 そういうことならやはり整数のまま「i1 % i2 == 0」を使う方が素直だと思います。 細かいようですが割り算や剰余は整数でも実数でも演算速度が大変遅いので2回除算するよりは1回の剰余の方が好まれると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問