• ベストアンサー

C#の質問

コンソールからの入力で2つの整数を取得したいのですが、 下記のように、2行に渡って取得する他ないのでしょうか? Console.WriteLine("何行何列ですか?"); int gyou = Convert.ToInt32(Console.ReadLine()); int retu = Convert.ToInt32(Console.ReadLine()); 私としましては、ユーザーに2,3のように1行で入力してもらって、 gyouには2をretuには3を保存したいのですが・・・。 そんなことは可能でしょうか? どなたかご教授お願いいたします。

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

  • ベストアンサー
  • x415f484f
  • ベストアンサー率71% (57/80)
回答No.4

ご質問なさる時はお使いの環境を書いたほうがよろしいかと思います。 # 正しい回答が欲しいならOS や開発環境などを必ず書くべきです。 ANo.2 の補足から引用 > 普通配列を宣言・初期化するときは、 > string[] split = new buf[要素数]{初期値, ・・・}; > でしますよね? あなたが仰っているのは string[] split についてかと思われますが > なんで、buf.Split(new Char[] { ',' });でsplitの宣言・初期化 > できるんですか?? 落ち着いてよく見ましょう、Split() の引数は char 配列となっていて new char[] {','} は、丁寧に引数の配列の初期化をしているだけです。 また、配列は Split() で割り当てされます。 string[] split = Console.ReadLine().Split(','); のように書いても可能ですが。 ちなみに Split() の引数は char[] 以外に他にもあります。 # というか、まずマニュアルを見るべきでしょう。 ANo.1 の補足から引用 > 数字以外の物が入力された時にエラー表示を出すにはどうすれば > よいのでしょうか? TryParse がありますが、前述のようにあなたのお使いの環境についての 記述がないので、動くかどうかはわかりません。 # TryParse が使えない場合は Try, Catch 等で対処可能です。 文字列を数値に変換するには?(TryParse編)[2.0のみ、C#、VB] - @IT http://www.atmarkit.co.jp/fdotnet/dotnettips/408tryparse/tryparse.html その他の入力数値の最大・最小のチェックは if 等で条件分岐処理すれば済みます。 # これについてのご質問であれば承りますが、他のご回答者の方の回答の # 説明ですので私へのお礼などは要りません。 # あなたが望むものであった場合は、私以外のご回答者の方にお礼をする # べきです。

その他の回答 (5)

回答No.6

#No.5です。 >string str = new string(new char[]{'1','2'}); >の意味がわかりません。 string はクラスです。なので、 string str=new string(new char[]{'1','2'}); のように、オブジェクトを作らなければなりません。 しかし、これでは面倒なので、 string str="12"; のように文字列を代入できるようになっています。 >配列の初期化じゃないのになぜnew演算子をつかっているんですか? クラス(参照型)や、配列などは、new演算子などでオブジェクトを生成して、初期化とかしないといけません。 (ただし、string型やobject型のような一部のクラスはnewでオブジェクトを生成しなくても良いし、することが出来ないものもある。) 構造体(値型)はnew演算子でオブジェクトを生成できますし、newしなくてもできます。ただし、インターフェイスを継承した場合は、new演算子でオブジェクトを作成しないといけません。

回答No.5

>string[] split = buf.Split(new Char[] { ',' }); >が分からないんですよね。 例えば、 string str = new string(new char[]{'1','2'}); これってつまり、 string str="12"; ということです。 string []sprit=buf.Split(new Char[]{','}); は戻り値がstring型の配列なので、文字列の中に','があったとき、string 型の配列を作成して、','で分けた文字列をspritに返すと考えればわかり易いかもしれません。 とりあえず、適当にサンプル作ってみました。 bool b = false; do { try { b = true; Console.WriteLine("数値を入力してください 例:数値,数値"); string[] split = Console.ReadLine().Split(new char[]{','}); int gyou = Convert.ToInt32(split[0]); int retu = Convert.ToInt32(split[1]); Console.WriteLine("gyou={0},retu={1}", gyou, retu); } catch { b = false; Console.WriteLine("数値を入力してください"); } } while (b==false);

TAN2005
質問者

補足

string str = new string(new char[]{'1','2'}); の意味がわかりません。 配列の初期化じゃないのになぜnew演算子をつかっているんですか?

  • _himajin_
  • ベストアンサー率65% (128/195)
回答No.3

前提として、私はC#使ったことも勉強したこともないので間違った答えかもしれません。 string 型の配列を格納する変数(誤解を恐れず言えば string[] 型の変数) split を定義して、その内容として String.Split() の戻り値を受けているだけです。 配列自体は初期化してません。 分離すると↓ string[] split; split = buf.Split(...); MSDNのサンプルでこのように使っているので、実体は String.Split() の中で作られているものと判断しました。

  • _himajin_
  • ベストアンサー率65% (128/195)
回答No.2

参考URL載せ忘れてましたので、↓を見てください。 http://msdn.microsoft.com/ja-jp/library/b873y76a(VS.80).aspx ここの使用例から少し改変して例示させていただいただけなので、詳しく説明はできないのですが Console.ReadLine() で読んだ buf を区切り文字として ',' で分割して string の配列 split に入れているつもりです。 エラー処理に関しては Convert.ToInt32 のサンプル↓が参考になるのではないでしょうか。 http://msdn.microsoft.com/ja-jp/library/sf1aw27b(VS.80).aspx

TAN2005
質問者

補足

どうしても、 string[] split = buf.Split(new Char[] { ',' }); が分からないんですよね。 普通配列を宣言・初期化するときは、 string[] split = new buf[要素数]{初期値, ・・・}; でしますよね? なんで、buf.Split(new Char[] { ',' });でsplitの宣言・初期化できるんですか??

  • _himajin_
  • ベストアンサー率65% (128/195)
回答No.1

Console.ReadLine() で受け取った文字列を、',' までを文字列1、それ以降を文字列2に分割してあげれば可能なはずです。 String.Split() で文字列の配列として受け取れるようなので、これでできるんじゃないでしょうか。 // C#使ったことないので動くかどうかはわかりません。 // ついでにエラーチェックもいれてないのであくまでも参考程度にどうぞ string buf = Console.ReadLine(); string [] split = buf.Split(new Char [] {','}); int gyou = Convert.ToInt32(split[0]); int retu = Convert.ToInt32(split[1]);

TAN2005
質問者

補足

string[] split = buf.Split(new Char[] { ',' }); この行の意味がイマイチ分からないのですが詳しく教えていただけませんか? また、数字以外の物が入力された時にエラー表示を出すにはどうすればよいのでしょうか?

関連するQ&A

  • C#の数値の変換について

    ユーザーが数値以外を入力したらエラーを返すコードを作成したのですが while (!int.TryParse(Console.ReadLine(), out enterNum)) こちらの行を TryParse だけでなく、それ以外の分解した書き方でも作成するように指示を受けたのですが、書き方が分からず、どなたか教えて頂けないでしょうか? 【ソースコード】 int enterNum; Console.WriteLine("勝負回数を入力してください"); //入力された文字が数値に変換出来なかった場合、inputerrorを表示させループさせる while (!int.TryParse(Console.ReadLine(), out enterNum)) { Console.WriteLine("inputerror"); }

  • C言語の問題が解けません

    C言語の問題ができなくて困っています。 これが問題文です。 与えられた表の縦・横の値の平均/合計をそれぞれの行・列ごとに求め出力するプログラムを作成しなさい。ただし、縦・横のデータ数は10個未満とし、それぞれの数字は整数とする。また、出力は右詰め6桁で出力することとし、平均における小数点以下は1桁まで表示する。平均行/列および合計行/列がぶつかる個所は、表全体の平均と合計を計算した結果を表示する。 補足として入力された行列数が10未満であることは、プログラム内でチェックすること。 例:20,3→再入力となる(行が9未満でない)  :2,-5→再入力となる(行が負の値) 実行結果例はこんな感じらしいです。 行数(最大9),列数(最大9)をカンマ区切りで入力(行,列):4,4 データをカンマ区切りで行ごとに入力[4行 4列] 52,96,15,20 86,22,35,45 45,78,54,36 16,86,74,55  52 96 15 20 45.8 183  86 22 35 45 47.0 188  45 78 54 36 53.3 213  16 86 74 55 57.8 231 49.8  70.5 44.5 39.0 50.9 - 199 282 178 156 - 815 自分はここまで自力でやったのですがここからが試行錯誤してもできません。このあとどのようにプログラムを書いていけばいいのですか? よろしくお願いします。 #include <stdio.h> int main(){ int gyou,retu,Loop1=0,Loop2=0; int kazu[8][8]; printf("行数(最大9行)、列数(最大9列)をカンマで区切って入力 (行,列):"); scanf("%d,%d",&gyou,&retu); if((gyou<=9)&&(retu<=9)){ printf("データをカンマ区切りで行ごとに入力 [%d行,%d列]\n",gyou,retu); for(Loop2=0;Loop2<gyou;Loop2++){ for(Loop1=0;Loop1<retu;Loop1++){ scanf("%d\n",&kazu[gyou--][retu--]);

  • C#について

    using System; class AddressBook: PhoneBook { private string address; public AddressBook() : base() { address=""; } public void Input() { base.Input(); Console.Write("住所?"); string address=Console.ReadLine(); } public void Writes() { base.Write(); Console.WriteLine("住所:{0}",address); } } class kadai62 { public static void Main() { Console.Write("電話帳に入力する人数を入れてください:"); int n = int.Parse(Console.ReadLine()); AddressBook[] pb = new AddressBook[n]; int i; for (i = 0; i < pb.Length; i++) { pb[i] = new AddressBook(); Console.WriteLine("{0}番目を入力してください.", i+1); pb[i].Input(); } Console.WriteLine(); while(true) { Console.Write("どこから探しますか?[1:氏名,2:自宅電話,3:携帯電話,0:終了] "); int t = int.Parse(Console.ReadLine()); if (t == 0) break; Console.Write("探す文字列は?"); string s = Console.ReadLine(); for (i = 0; i < pb.Length; i++) { if (pb[i].Search(t, s)) pb[i].Writes(); } } } } このプログラムで public void Writes() { base.Write(); Console.WriteLine("住所:{0}",address); } のaddressが出力されません・・どうすれば 出力されますか?

  • [C#]順序通りに実行されない

    次のC#のプログラムについて質問です。 //ここから using System; class Myclass { double[] point; string[] name; int nMax; public double this[string str] { get { for (int i = 0; i < nMax; i++) { if (str == name[i]) return point[i]; } return -1.0; } set { for (int i = 0; i < nMax; i++) { if (str == name[i]) { point[i] = value; break; } } } } public Myclass(int n) { point = new double[n]; name = new string[n]; nMax = n; setname(); } void setname() { for(int i=0;i<nMax;i++) { Console.Write("生徒名[{0}] = ",i); name[i] = Console.ReadLine(); } } } class ch08ex02 { public static void Main() { Console.WriteLine( "まずはじめに生徒数と、全員の名前入力が必要です"); Console.Write("生徒数--- "); string strn = Console.ReadLine(); Myclass mc = new Myclass(int.Parse(strn)); string ans, strp; Console.WriteLine("X入力で終了"); while (true) { Console.Write("点数を入力したい生徒名--- "); if ((ans = Console.ReadLine()) == "X") break; Console.Write("点数--- "); strp = Console.ReadLine(); mc[ans] = double.Parse(strp); } Console.WriteLine(); Console.WriteLine("X入力で終了"); while (true) { Console.Write("点数を知りたい生徒名--- "); ans = Console.ReadLine(); if (ans == "X") break; Console.WriteLine("{0}くんの点数は{1}点です", ans, mc[ans]); } } } //ここまで これはプロパティを使って生徒の点数を配列に格納したり参照したりするプログラムですが、実行するとMain()の    Console.Write("生徒数--- "); string strn = Console.ReadLine(); Myclass mc = new Myclass(int.Parse(strn)); string ans, strp; Console.WriteLine("X入力で終了");    while (true) { Console.Write("点数を入力したい生徒名--- "); if ((ans = Console.ReadLine()) == "X") break; Console.Write("点数--- "); strp = Console.ReadLine(); mc[ans] = double.Parse(strp); } の部分が思い通りに動いてくれません。 まずコンソールに「生徒数--- 」と表示されConsole.ReadLine()で数字を受け取り、その数からMyclassのインスタンスを作成し、「X入力で終了」と表示した後whileループで生徒名と点数の入力を受け付けるはずです。 しかしこれを実行すると「X入力で終了」と表示する前にwhileループに入り、ループを抜けた後「X入力で終了」と表示されます。 つまり順番が逆になっているわけです。 なぜこうなるかわかりません。 誰か教えてください、お願いします。

  • C#のメンバ変数について

    下記のコードで enterName の変数を static void Resurut() のメソッドへの受け渡しが上手くいかず、どなたか修正点を教えて頂けないでしょうか? 【ソースコード】 static class Program { static string enterName; static int cntWin = 0; //勝利回数 static int cntLose = 0; //敗北回数 static int cntDraw = 0; //引分回数 //ユーザー名の入力 static void Main(string[] args) { string enterName = Console.ReadLine(); Console.WriteLine("ユーザ名を入力してください: {0}", enterName); Start(); Resurut(); } *一部省略 static void Resurut() { if (cntWin > cntLose) { Console.WriteLine("{0}さんの総合勝利です", enterName); } else if (cntLose > cntWin) { Console.WriteLine("CPUの総合勝利です"); } else if (cntWin == cntLose) { Console.WriteLine("引き分けです"); } } }

  • C#のループについて

    現在C#でジャンケンゲームの課題に取り組んでいるのですが、ループ処理や各メソッドに対しての変数にエラーがでてしまい、修正方法が分からず、どなたか教えて頂けないでしょうか? ・ユーザはグー、チョキ、パーをそれぞれ1、2、3の数字で入力する。 ・CPUは乱数を使って出す手を選ぶ。 ・5回勝負として、人間とコンピュータの勝った回数を数え、勝敗がつくたびに1回ずつ表示する。    あいこは決着がつくまで再勝負。途中でどちらかが3勝しても、5回最後まで勝負を続ける。   ・指定された範囲以外の値を入力したら負けにする 【実行例】  ユーザ名を入力してください:goto  手を入力してください(グー1、チョキ2、パー3): 1  CPU:チョキ  WIN  goto:1勝、CPU:0勝    手を入力してください(グー1、チョキ2、パー3): 3  CPU:パー  DRAW    手を入力してください(グー1、チョキ2、パー3): 3  CPU:チョキ  LOSE  goto:1勝、CPU:1勝    手を入力してください(グー1、チョキ2、パー3): 0  LOSE(反則負け)  goto:1勝、CPU:2勝    (中略)    goto:3勝、CPU:2勝  gotoさんの総合勝利です! using System; namespace Ensyuu007 { static class Program { static string? Myhand; static int CntWin = 0; //勝利回数 static int CntLose = 0; //敗北回数 static int CntDraw = 0; //引分回数 //ユーザー名の入力 static void Main(string[] args) { string EnterName = Console.ReadLine(); Console.WriteLine("ユーザ名を入力してください: {0}", EnterName); Console.ReadLine(); } //じゃんけんを5回行います。 for (int GameCnt = 0; GameCnt <= 5; GameCnt++) { //正しく入力されたかチェックを行うメソッド。 static string Check(ref string Myhand) { static = Console.ReadLine(); Console.WriteLine("手を入力してください(グー1、チョキ2、パー3):{0}", Myhand); //正しく入力されたかチェックします。 Check(ref Myhand); //0,1,2が入力された場合 if (Myhand.Equals("1") || Myhand.Equals("2") || Myhand.Equals("3")) { //入力した数字をそのまま返します。 return Myhand; } //1,2,3以外が入力された場合 else { Console.WriteLine("LOSE(反則負け)"); return Myhand; } } //じゃんけんを開始するメソッド。 static void Start() { //コンピューターとじゃんけんさせます。 Janken(ref Myhand); Console.ReadLine(); } //コンピュータと自分の入力した手を判別するメソッド static void Janken(ref string Myhand) { // Random クラスの新しいインスタンスを生成する Random ran = new System.Random(); //コンピュータの出す手を1以上3以下に設定する。 string[] com = new string[] { "1", "2", "3" }; string con = ran.Next(3).ToString(); //配列型、変数teに出す名前を設定 string[] te = { "グー", "チョキ", "パー" }; //コンピュータが勝利した場合 if (((Myhand == "1") && (con == "3")) || ((Myhand == "2") && (con == "1")) || ((Myhand == "3") && (con == "0"))) { Console.WriteLine("あなた:" + te.GetValue(int.Parse(Myhand))); Console.WriteLine("コンピュータ:" + te.GetValue(int.Parse(con))); Console.WriteLine("LOSE"); CntLose++; //敗北回数に加算 } //自分が勝利した場合 else if (((Myhand == "1") && (con == "2")) || ((Myhand == "2") && (con == "3")) || ((Myhand == "3") && (con == "1"))) { Console.WriteLine("あなた:" + te.GetValue(int.Parse(Myhand))); Console.WriteLine("コンピュータ:" + te.GetValue(int.Parse(con))); Console.WriteLine("WIN"); CntWin++; //勝利回数に加算 } //あいこだった場合 else { Console.WriteLine("あなた:" + te.GetValue(int.Parse(Myhand))); Console.WriteLine("コンピュータ:" + te.GetValue(int.Parse(con))); Console.WriteLine("DRAW"); CntDraw++; //引分回数に加算 } } } static void Resurut() { if (CntWin > CntLose) { Console.WriteLine("総合勝利です"); } else if (CntLose < CntWin) { Console.WriteLine("CPUの総合勝利です"); }

  • C#(VS2013)の漢字<-->数値変換について

    C#(VS2013)の漢字、数値変換に関する質問です。 下記のコードは、文字を数値、数値を文字に変換するものです。 この場合、文字が"A"の場合は、相互に変換できますが、 文字が "換" の場合は、変換出来ません。 Q1)この件に関しまして、回答、コメント頂けますと大変有難いです。 //Project: c:\wk_VS2013ACs\TT_CharCLR.sln using System; using System.Text; public static class Program { public static void Main() { Char c; Int32 n; string str = "シフトJISへ変換"; Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS"); byte[] bytes = sjisEnc.GetBytes(str); Console.WriteLine(BitConverter.ToString(bytes)); // 出力:83-56-83-74-83-67-4A-49-53-82-D6-95-CF-8A-B7 // Convert number <-> character using C# casting // c = (Char)0x95CF; 変 // c = (Char)0x8AB7; 換 //c = (Char)65; c = (Char)0x8AB7; //<------旨く行かず Console.WriteLine(c); // Displays "A" n = (Int32)c; Console.WriteLine(n); // Displays "65" c = unchecked((Char)(65536 + 65)); //============= Console.WriteLine(c); // Displays "A" // Convert number <-> character using Convert c = Convert.ToChar(65); Console.WriteLine(c); // Displays "A" n = Convert.ToInt32(c); Console.WriteLine(n); // Displays "65" // This demonstrates Convert's range checking try { c = Convert.ToChar(70000); // Too big for 16 bits // c = Convert.ToChar(0x95CF); // Too big for 16 bits Console.WriteLine(c); // Doesn't execute } catch(OverflowException) { Console.WriteLine("Can't convert 70000 to a Char."); } // Convert number <-> character using IConvertible c = ((IConvertible)65).ToChar(null); Console.WriteLine(c); // Displays "A" n = ((IConvertible)c).ToInt32(null); Console.WriteLine(n); // Displays "65" Console.ReadKey(); }//public static void Main() { }//namespace

  • C#でカレンダーを作っているのですがここから先がわかりません。どなたかおしえてもらえませんか?

    using System; using System.Collections.Generic; using System.Text; namespace 万年カレンダー { class MyEventCiass { static void Main(string[] args) { int nen, tuki,tukinohi,youbi;    //西暦の入力 System.Console.Out.WriteLine("西暦を入力してください。"); nen = int.Parse(Console.ReadLine()); //月の入力 System.Console.Out.WriteLine("月を入力してください。"); tuki = int.Parse(Console.ReadLine()); //西暦と月の出力 Console.WriteLine(nen + "年" + tuki + "月"); switch (tuki) { case 2: if (nen % 4 == 0 && (nen % 100 != 0 || nen % 400 == 0)) tukinohi = 29; else tukinohi = 28; break; case 4: case 6: case 9: case 11: tukinohi = 30; break; default: tukinohi = 31; break; } if (tuki == 1 || tuki == 2) { nen = nen -1 ; tuki = tuki + 12; } //曜日の出力 Console.WriteLine("日 月 火 水 木 金 土"); youbi = (nen + nen / 4 - nen / 100 + nen / 400 + (13 * tuki + 8) / 5 + 1) % 7; if (youbi == 0) youbi = 7; for (int i = 1; i <= youbi ;i += 1 ) { Console.Write(i.ToString()); } for (int i = 4; i <= tukinohi; i += 1) { Console.Write(i.ToString()); } Console.ReadLine(); } } }

  • C#の整数値以外のエラー表示について

    現在C#のFizzBuzz問題に取り組んでいるのですが 5) nに数値以外の文字(例 abc)が入力された場合はエラーメッセージを表示しユーザに再入力させる。 という箇所が上手くいかず、どなたか教えて頂けないでしょうか? 『課題』 1) 1からnまで順に1行ずつ整数値を表示する。  2) nはユーザが入力する可変のパラメータとする。  3) 3の倍数の時は値の代わりにCUS、5の倍数はPIDEと表示する。  4) 3の倍数でもあり5の倍数でもある場合はCUSPIDEと表示する。 ---------- 応用問題 ~エラー処理~  1)~4)の実装が完了したら 5) にもチャレンジしてみましょう。  5) nに数値以外の文字(例 abc)が入力された場合はエラーメッセージを表示しユーザに再入力させる。 『ソースコード』 using System; namespace Ensyuu001 { class Program { static void Main(string[] args) { String s = ""; int enterNum = int.Parse(Console.ReadLine()); //if(enterNum != 1) Console.WriteLine("inputerror"); for (int n = 1; n <= enterNum; n++) { if (n % 3 == 0) s += "CUS"; if (n % 5 == 0) s += "PIDE"; if (s == "") s += n; Console.WriteLine(s); s = ""; } } } }

  • C#の数値の出力について

    下記のコードで cntLose の変数の数値を、コンソールに出力したいのですが、やり方が分からず、どなたか教えて頂けないでしょうか? 【ソースコード】 static class Program { static string userName; static int cntWin = 0; //勝利回数 static int cntLose = 0; //敗北回数 static int cntDraw = 0; //引分回数 //ユーザー名の入力 static void Main(string[] args) { string enterName = Console.ReadLine(); Console.WriteLine("ユーザ名を入力してください: {0}", enterName); userName = enterName; Start(); Resurut(); } static void Janken(ref string myHand) { // Random クラスの新しいインスタンスを生成する Random ran = new System.Random(); //コンピュータの出す手を1以上3以下に設定する。 string[] com = new string[] { "1", "2", "3" }; string con = com[ran.Next(3)]; //コンピュータが勝利した場合 if (((myHand == "1") && (con == "3")) || ((myHand == "2") && (con == "1")) || ((myHand == "3") && (con == "2"))) { Console.WriteLine("LOSE"); cntLose++; //敗北回数に加算 Console.WriteLine("{0}:cntWin勝、CPU:cntLose勝", userName); }

専門家に質問してみよう