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

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

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

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

Q&A

解決済

3回答

746閲覧

何故この数字になるのかわかりません。

sugaryfig

総合スコア1

C#

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

1グッド

0クリップ

投稿2024/07/14 00:27

C#の勉強を始めたばかりの初心者です。

「九九の計算結果の配列を活用し、1桁の数値(1~9に限定)を2つ入力し、その積を表示するプログラムを作成しなさい。」という問題で、下記のコードが解答例としてありました。

static void Main(string[] args)
{
int[,] kuku = new int[9,9];

for (int i = 0; i < 9; i++) for (int j = 0; j < 9; j++) kuku[i,j] = (i + 1) * (j + 1); int p = int.Parse(Console.ReadLine()); int q = int.Parse(Console.ReadLine()); Console.WriteLine(kuku[p-1,q-1]);

}

その中で、一番最後の「Console.WriteLine(kuku[p-1,q-1])」で、何故「[p-1,q-1]」になるのかがわかりません。
わざわざ「-1」にする理由を教えて頂きたく、ご教授頂けたらと思います。

掛け算なので、「P*Q」で良いのではと思ったのですが、そうすると二桁以上の掛け算も出来てしまいます。
1~9までの1桁にする為に「-1」にする理由があると思うのですが、教えて頂けますでしょうか。

また、他のコード例がありましたら教えて頂きたいです。

TN8001😄を押しています

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

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

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

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

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

YAmaGNZ

2024/07/14 00:37

入力したのがp=1、q=1として1X1の結果がkukuという配列のどこに入っているのか分かりますか?
fana

2024/07/14 06:05

> 「P*Q」で良いのでは 「九九の計算結果の配列を活用し…」という指示を無視してよいのですか?
otn

2024/07/14 08:22

> 掛け算なので、「P*Q」で良いのではと思ったのですが、 「p*q」の書き間違いでしょうけど、積を表示すれば良いだけであれば、別にそれでもいいですよ。 ただし、題意を無視しているので、提出課題であれば、×もしくは減点でしょうけど。 題意の、 > 九九の計算結果の配列を活用し という日本語の意味を理解できないとすると、なかなかつらいですが、 「問題文のうち理解できない部分は無視する」という方針だと題意に沿った解答は無理です。 「問題文の中に理解できない部分があれば理解できるまで考える」が正しい態度かと思います。 > そうすると二桁以上の掛け算も出来てしまいます。 回答例のコードを見る限り、1~9の数字以外を入力した場合は、どうなってもかまわない (何が表示されても、エラーでプログラムがこけてもかまわない) ということかと思います。
sugaryfig

2024/07/15 09:02

返信ありがとうございます。 九九の配列を活用することと、1~9までの人桁の数字のみで掛け算の計算をするコードの作成なので、「p*q」だと二桁でも三桁でも計算が出来てしまうのでどうしたらしいのかと思いまして、質問させて頂きました。
otn

2024/07/15 09:48

> 「p*q」だと二桁でも三桁でも計算が出来てしまうのでどうしたらしいのかと思いまして、 「想定外の入力があった時にどうするか?」は、実用プログラムではもちろん、きちんと対処が必要ですが、 この手の練習問題で、Teratailに質問に出てくる模範解答などを見る限りでは、「想定外の入力があることは全く考慮しなくていい」ようですね。 少なくとも、考慮が必要な場合は、「1桁の数字以外が入力されたら、これこれのエラーメッセージを出して再度入力を求めよ(orエラーで終了しろ)」とか書いてないと、それに応じたプログラムの書きようが無いです。実用プログラムの場合はそのあたりどうするかは設計者が考えます。 書籍の練習問題であれば、書籍の最初の方に、サイトに掲載された問題なら、回答者への注意事項かどこかに、「想定外の入力があることは全く考慮しなくていい」を意味する説明があるべきですね。実際書いてあるのかどうかは知りませんが。
TN8001

2024/07/15 11:42

疑問が解消したなら、質問を「解決済」にしてください。 [teratail【テラテイル】|ヘルプ](https://teratail.com/help#resolve-question) 解消していないなら、その点を質問に追記してください。 「ほかのパターンももっと見てみたい」ということだと、配列を使う縛りだとあまり余地がない気が^^;
TN8001

2024/07/15 13:39

> 「ほかのパターンももっと見てみたい」ということだと、配列を使う縛りだとあまり余地がない気が^^; 配列がint[,]でなくてもいいなら、int[][]やint[]を使う手もあるか。 まああまり面白くもならないので特に例示はしませんが。
guest

回答3

0

その中で、一番最後の「Console.WriteLine(kuku[p-1,q-1])」で、何故「[p-1,q-1]」になるのかがわかりません。
わざわざ「-1」にする理由を教えて頂きたく、ご教授頂けたらと思います。

y_waiwaiさんの回答の通り、インデックスがゼロ始まりのためですね。
forループ内ではわざわざ「+1」していますよね?

index012345678
0123456789
124681012141618
2369121518212427
34812162024283236
451015202530354045
561218243036424854
671421283542495663
781624324048566472
891827364554637281

1~9までの1桁にする為に「-1」にする理由があると思うのですが、教えて頂けますでしょうか。

いいえ。「1桁にする為」ではありません。
もうすでに分かっておられるとは思いますが、「インデックスがゼロ始まりのため」です。

この問題はおそらく配列の練習で、「インデックスはゼロ始まり」というのを確認させるものなのでしょう。
二桁の数字(や1未満の数値)を入力すると例外が出て止まります(やってみればすぐわかりますが...
IndexOutOfRangeException クラス (System) | Microsoft Learn

数字以外の入力や小数・大きすぎる数値等、ほかの例外も出ます。
FormatException クラス (System) | Microsoft Learn
OverflowException クラス (System) | Microsoft Learn

また、他のコード例がありましたら教えて頂きたいです。

「+1」・「-1」するのが面倒&わかりにくいので、ちょっと無駄が出ますが配列サイズを大きくするのは割とありますね。

cs

1int[,] kuku = new int[10, 10]; // 0~9までの10個*10個 2 3for (int i = 1; i <= 9; i++) // int i = 0; としてもいいが(0の段?)どうせ0なので省略 4 for (int j = 1; j <= 9; j++) // 同上 5 kuku[i, j] = i * j; 6 7int p = int.Parse(Console.ReadLine()); // 0も通ってしまうが... 8int q = int.Parse(Console.ReadLine()); 9 10Console.WriteLine(kuku[p, q]);
index0123456789
00000000000
10123456789
2024681012141618
30369121518212427
404812162024283236
5051015202530354045
6061218243036424854
7071421283542495663
8081624324048566472
9091827364554637281

提出はもちろん普段の利用にも全く勧めませんが、1始まりの配列も作れるには作れます。

cs

1int[,] kuku = (int[,])Array.CreateInstance(typeof(int), [9, 9], [1, 1]); 2 3for (int i = 1; i <= 9; i++) // int i = 0; とするとエラー。ほんとに1始まりになっている 4 for (int j = 1; j <= 9; j++) // 同上 5 kuku[i, j] = i * j; 6 7int p = int.Parse(Console.ReadLine()); 8int q = int.Parse(Console.ReadLine()); 9 10Console.WriteLine(kuku[p, q]);

Array.CreateInstance メソッド (System) | Microsoft Learn

index123456789
1123456789
224681012141618
3369121518212427
44812162024283236
551015202530354045
661218243036424854
771421283542495663
881624324048566472
991827364554637281

投稿2024/07/15 11:39

編集2024/07/15 11:47
TN8001

総合スコア9640

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

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

sugaryfig

2024/07/15 12:23

丁寧な説明、ありがとうございます。 教えて頂いたコードを試して、更に理解を深めたいと思います。 ありがとうございました。
guest

0

ベストアンサー

kuku[i,j] = (i + 1) * (j + 1);

こうやっているから、ですね
kuku[0,0] には、1*1の結果がはいってます

投稿2024/07/14 05:53

y_waiwai

総合スコア87955

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

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

sugaryfig

2024/07/15 08:51

回答ありがとうございます。 なるほどです。 ご説明ありがとうございます!
guest

0

配列番号が0から8まで(Length-1)なので、仮に入力が9だと境界外となってエラーです

入力に対処したいだけなら三項演算子を使うといいでしょう

C#

1for (int i = 0; i < 9; i++) 2 for (int j = 0; j < 9; j++) 3 kuku[i,j] = (i + 1) * (j + 1); 4 5int p = int.Parse(Console.ReadLine()); 6int q = int.Parse(Console.ReadLine()); 7 8Console.WriteLine(kuku[p>0&&p<=9?p-1:0,q>0&&q<=9?q-1:0]); 9

これで想定外の数値の入力に対してインデックスの指定が0に置き換えられ、1*xまたはx*1の形の値が返されます
数値以外の文字列の検知にはTryParseを利用する手段もあります
0の代わりにthrow newを入れてもいいでしょう
これらは例外処理の一端ですが、学習機会はもう少し先になるはずです

投稿2024/07/15 10:27

編集2024/07/15 10:41
nanashi123

総合スコア73

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

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

sugaryfig

2024/07/21 09:42

返信頂きありがとうございます。 引き続き勉強をし、理解を深めていきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問