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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

215閲覧

スキャンした数字のデータがどう扱われているのか。

carnage0216

総合スコア194

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/07/08 12:29

環境 Windows10,visual studio2017

#define N 2 int a[2][2] ; printf("\n1つ目の行列 A を入力\n"); for(i=0;i<2;++i){ for(j=0;j<2;++j){ printf("A[%d][%d] = ", i+1, j+1); scanf("%d", &a[i][j]); } }

に関して

#define N 2 int a[N][N],

で既に2×2の配列を行う事を宣言しているのに、(スキャンした数字をいれる箱は用意したのに)なぜ、

for(i=0;i<2;++i)

for(j=0;j<2;++j)

が必要なのかわかりません。

#define N 2 int a[N][N],

でメモリを確保して、

for(i=0;i<2;++i)

for(j=0;j<2;++j)よりスキャンした数字をどのような順番で入れるかを表しているとかですか?

できればcpu内部でプログラムがどのように処理されているかを箱などを用いてわかりやすく説明して頂けないでしょうか?

実行したこと
for(i=0;i<2;++i)

for(j=0;j<2;++j)を消して#define N 2 int a[2][2] ;のみにしたところ、スキャンした数字は使われず、すべて0で配列の計算をしていました。

スキャンした数字にアドレスを振ってfor(i=0;i<2;++i)、for(j=0;j<2;++j)でスキャンした数字を扱っているのでしょうか?仮にそうだとしてもfor(i=0;i<2;++i)、for(j=0;j<2;++j)がスキャンした数字を扱うと宣言する必要はあるのでしょうか?宣言している部分らしきものは見えませんが。
for(i=0;i<2;++i)、for(j=0;j<2;++j)だけでは変数iとjが2になるまで+1されるだけでスキャンした数字を扱う部分には見えないのですが。

内部でどうやって処理されて計算を実現しているのか細かく理解したいです。
どうかよろしくお願いします。

また、今回のような計算のプログラムが内部でどのように処理されているかが詳しく書かれている本などありましたら是非紹介して頂けるとありがたいです。

どうかよろしくお願いします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

ループ内でやってる事を表にまとめてみる

ij表示される文字列scanfに渡されるアドレス
00A[1][1] =&A[0][0]
01A[1][2] =&A[0][1]
10A[2][1] =&A[1][0]
11A[2][2] =&A[1][1]

ついでに2次元配列について

  • 箱の名前(正確には各要素へアクセスするための式)
A[0][0]A[0][1]
A[1][0]A[1][1]
  • それぞれの要素へのアドレスの1例
0x100x14
0x180x1C

上2つの表はヘッダ行を消せないMarkdownの仕様上空白行があるが読み飛ばしてください

投稿2018/07/09 02:22

asm

総合スコア15147

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

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

carnage0216

2018/07/09 10:20

丁寧に説明していただきありがとうございます。
guest

0

以下のように書けばfor文は使わなくてよいです。
今回は2x2行列ですが、これが100x3行列とかになるといちいち書くのがめんどくさいですよね?
だからfor文によるループで配列の添え字をインクリメントしているのです。

c

1printf("\n1つ目の行列 A を入力\n"); 2printf("A[1][1] = "); 3scanf("%d",&a[0][0]); 4 5printf("A[1][2] = "); 6scanf("%d",&a[0][1]); 7 8printf("A[2][1] = "); 9scanf("%d",&a[1][0]); 10 11printf("A[2][2] = "); 12scanf("%d",&a[1][1]); 13

投稿2018/07/08 13:45

TaroToyotomi

総合スコア1430

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

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

carnage0216

2018/07/08 16:48

なるほど、どうもありがとうございます。
guest

0

なぜ、

for(i=0;i<2;++i)
for(j=0;j<2;++j)
が必要なのかわかりません。

必ずしも必要ではありませんscanf1つで、4つの値全てを埋めることもできます。

ただ、今回のプログラムでは、printf("A[%d][%d] = ", i+1, j+1);と、「要素を表示して入力」を1項目ごとに行うために、ループで回しています。「こういう動作をさせたい」という、意図的な選択です。

投稿2018/07/08 12:37

maisumakun

総合スコア145123

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

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

maisumakun

2018/07/08 12:44

もしかして、「2次元配列の要素はa[添字][添字]のようにアクセスする」、というところから説明しないといけないでしょうか。
carnage0216

2018/07/08 16:46

説明していただけるのであれば説明していただきたいです。どうかよろしくお願いいたします。
guest

0

っていうか、iとjみたいな紛らわしいイテレータを使うの、いい加減止めようね。

投稿2018/07/08 15:48

編集2018/07/08 15:48
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

carnage0216

2018/07/08 16:48

紛らわしくてすいません。
catsforepaw

2018/07/09 09:25

carnage0216さん 全然紛らわしくないので気にしなくても良いですよ。 for文におけるループカウンターとしては、i,j(k,lあたりまで)はごく普通に使われています。特に配列の添字として利用する際は、i,j,...を使う方がむしろ自然です。数学の世界でも、添字を表す変数としてi,j(k,lあたりまで)はよく使われますからね。それを紛らわしいと思う人は、少なくともC/C++上級者にはいませんよ。
carnage0216

2018/07/09 10:19

そういっていただけると安心します。どうもありがとうございます。
退会済みユーザー

退会済みユーザー

2018/07/09 23:24

頭悪そうだなぁ、相変わらず巷のプログラマ気取りって。本当にロボばっか。
catsforepaw

2018/07/10 00:54

> 頭悪そうだなぁ、相変わらず巷のプログラマ気取りって。本当にロボばっか。 何故あなたがそのように他人を侮辱するような言葉を書くのか、私にはさっぱり理解できないのですが、それを読んで同意する人が、あなたが思っているほどには多くないだろということには気づくべきです。 同意を得たいのであれば、せめてそう考える理由を説明すべきでしょう。 同意を得る気がないのであれば、それは「バーカバーカおまえのかーちゃんで~べ~そ~」と同レベルであり、子供が言うのならともかく、大人がそれを言うと「何この人……ぷっ」と思われてしまうことになりかねないので、ご注意ください。
退会済みユーザー

退会済みユーザー

2018/07/10 11:03

> 何故あなたがそのように他人を侮辱するような言葉を書くのか、私にはさっぱり理解できないのです あんたが頭悪いからにきまってんじゃん。 > for文におけるループカウンターとしては、i,j(k,lあたりまで)はごく普通に使われています。 この一文に、あんたの頭の悪さが如実にあらわれてる。あんた、日本語読めてないでしょ? 頭使ってないでしょ? それはプログラム書いてるときもそうでしょ。 だ か ら、頭わるそうだと言ってる。もう一回、頭冷やして俺の回答読んでみ。それで言ってることがわかんなきゃ、もう、救いようねぇよ。
退会済みユーザー

退会済みユーザー

2018/07/10 11:28

アホすぎて屁をこらえられないか? 小学生だな。
maisumakun

2018/07/12 07:13

「慣習になっていること」と「紛らわしい」ことは確かに両立しますね。 ただ、「行列」という場面であるということを踏まえれば、数学的にも添字として「iとj」が使われますので、数式とコードの対応を取るなどで、「iとj」に特別な有利さがある場面ではあります。
退会済みユーザー

退会済みユーザー

2018/07/12 12:13

なわけねーだろ。
退会済みユーザー

退会済みユーザー

2018/07/12 12:17

おまえらみたいなアホに、ニーチェの言葉を教えてやる。 「お前たちは私を敬うが、何故私の花冠をむしり取ろうとしないのか? 良き生徒であることは、教師に対する最善の敬意を払っている事にはならない」 言ってる意味分かるか? よく考えて覚えとけ、ボケナス共。
catsforepaw

2018/07/12 13:35

はいはい、おりこーさんですね。 それにしても、何をそんなに興奮しているのかさっぱり判りませんが、悪態をつかないとどうにかなってしまう病気か何かでしょうか。 あなたは私のことを小学生だなどとおっしゃいますが、客観的に見れば、どっちがだよ、と思ってしまうのは仕方ありませんよね。
退会済みユーザー

退会済みユーザー

2018/07/12 14:15

ありませんくありあせんねー。 屁こいて逃亡した幼稚な坊やは無理に出てこなくていいから、ずっと一人で口から屁をこいててくださいね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問