質問させてください。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アジノ

質問させてください。

#1

投稿記事 by アジノ » 17年前

forループ文などでキーボードから入力されたデータの列和や行和を表示するプログラムを作ったのですが、何故列和と行和が同じループ内で処理できるのかと問われて困っています。
列和と行和が同じループ内で処理できるのは何故なのでしょうか?

初歩的な質問かもしれませんがどなたか教えてくださると嬉しいです。

box

Re:質問させてください。

#2

投稿記事 by box » 17年前

作ったものを見ないことには、誰も何も答えられません。

管理人

Re:質問させてください。

#3

投稿記事 by 管理人 » 17年前

入力されたデータの列和や行和といわれても、どのようなデータ構造になっているのか
こちらにはわかりませんが
二次元配列のようなものなら、アドレスが連続している事を用いたり、
配列要素番号を1次元要素数ごとに処理すれば可能でしょう。

例えば以下のような場合
横のトータルと

 0  1  2  3

 4  5  6  7

 8  9 10 11

12 13 14 15

縦のトータルを計算したい時は
 0  1  2  3

 4  5  6  7

 8  9 10 11

12 13 14 15


#include <stdio.h>

int main(void) {
	int i,arr[16];
	int gyou=0,retu=0;
	for(int i=0;i<16;i++)arr=i;
	
	for(i=0;i<4;i++){
		gyou+=arr;
		retu+=arr[i*4];
	}

	printf("行合計=%d,列合計=%d",gyou,retu);	
	return 0; 
} 

実行結果

行合計=6,列合計=24


こんな感じで計算出来ますよね?
こういうことでしょうか?

kazuoni

Re:質問させてください。

#4

投稿記事 by kazuoni » 17年前

まず・・・どんなコードかみたいですね。行、列があるということは二次配列ですか?書き方によって変わってくるとおもうので。。
int x[4][4],i,j,sum1=0,sum2=0;
for(i=0,i<4,i++)
   for(j=0,j<4,j++)
      x[j]=i;

/*行和*/
for(i=0,i<4,i++)
  sum1=sum1+x[0]

/*列和*/
for(i=0,i<4,i++)
  sum2=sum1+x[0]


こんな感じですか?
なぜかと聞かれると・・・行和は列を定数、行をインクリメントするので・・・
みたいな感じになってしまうのですが・・・図を描くとてっとり早いのですが。(行×列)

アジノ

Re:質問させてください。

#5

投稿記事 by アジノ » 17年前

言葉足らずで申し訳ありませんでした・・・。
ただ私の作ったプログラムは素人故わかりにくく長すぎるので、上で管理人様が書いてくださったプログラムが私の言った「入力されたデータの列和や行和を表示するプログラム」だとお考えください。
kazuoni様もわかりやすいプログラムありがとうございます。
(ちなみに作成したプログラムは二次配列でした。)

列和と行和を求めるループは for(i=0;i<4;i++){~} の部分ですよね?
列和と行和を求める式2つはこのループ内に入っています。
「この2つ(列和と行和の式)は何故同じループ内で処理出来るのか」と言うのが私の疑問です。

列和と行和に限らず、同じループ内で2つの処理出来る事に疑問を持ったことがなかったので理由を聞かれてすごく戸惑いました。
どうか教えてくださると嬉しいです。

管理人

Re:質問させてください。

#6

投稿記事 by 管理人 » 17年前

私の説明ではわからなかったでしょうか?
ループ文や配列についてはわかりますか?
私が提示したサンプルはまさに列の和と行の和を計算するプログラムなので、
これがわかれば疑問も解けるはずですが、
どの辺がわかりませんか?

アジノ

Re:質問させてください。

#7

投稿記事 by アジノ » 17年前

>ループ文や配列についてはわかりますか?
一通り習ったのでだいたい理解はできていると思いたいです。

>私の説明ではわからなかったでしょうか?
とてもわかりやすいと思いました。
ですが言葉にして説明する、文章に書くとなるとどうもうまくいきません。
私の語彙が拙い所為だと思うのですが・・・。

box

Re:質問させてください。

#8

投稿記事 by box » 17年前

管理人さんが提示されたコードの当該ループでは、
変数iを0から3まで変化させていますね。

そして、
変数gyouの計算では、変数iの値をそのまま添字として使い、
行方向(横方向)[0]~[3]の値を順次加えています。

また、変数retuの計算では、変数iの値を4倍して(当該行列が4列だからです)添字として使い、
列方向(縦方向)[0], [4], [8], [12]の値を順次加えています。

管理人

Re:質問させてください。

#9

投稿記事 by 管理人 » 17年前

ちょっと問題を解いてもらった方がいいかもしれません。
このトータルと
 0  1  2  3

 4  5  6  7

 8  9 10 11

12 13 14 15

このトータル
 0  1  2  3

 4  5  6  7

 8  9 10 11

12 13 14 15
 
 
を計算して出力するプログラムを作って下さい。

また、この表の大きさNxNはキーボード入力で指定出来るように拡張して下さい。
その表の上限は10x10とします。

そうすれば解ると思います。

アジノ

Re:質問させてください。

#10

投稿記事 by アジノ » 17年前

ご丁寧に例題まで出していただいてありがとうございます。
解いてみようと思いましたが
>また、この表の大きさNxNはキーボード入力で指定出来るように拡張して下さい。
>その表の上限は10x10とします。
この部分ですら理解できなかった自分はかなりの勉強不足だと思いました。
自分がわからないわからないと言っていかに今まで人任せだったか思い知らされた気がします。

上で理解はできていると言った私はとても惨めですね。申し訳ありません。
出直してきます。
皆様ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る