ページ 11

プログラム 初心者です もっと コンパクトにならないでしょうか?

Posted: 2011年7月03日(日) 01:45
by シー
各 行、列の合計を表示するプログラムを作りたいのですが私ではこれが精一杯でした
指摘 指導 よろしくお願いします

#include<stdio.h>
int main(void)
{
int array[5][4];
int i,j;
int tate[6];
int yoko[5];

for(i = 0; i <= 4; i++){
for(j = 0; j <= 3; j++){
array[j] = i+j;
tate[j] = 0;
}
yoko = 0;
}

for(i = 0; i <= 4; i++){
for(j = 0; j <= 3; j++){
printf("%5d",array[j]);
yoko += array[j];
tate[j] += array[j];
}
printf(" %5d",yoko);
tate[j] += yoko;
printf("\n\n");
}
printf("\n");
for(j = 0; j <= 3; j++){
printf(" %d",tate[j]);
}
printf("\n");

return 0;
}

Re: プログラム 初心者です もっと コンパクトにならないでしょうか?

Posted: 2011年7月03日(日) 07:28
by bitter_fox
まず、codeタグで囲ってくださいますようにお願いします。インデントが継承されて非常に見やすくなります。(詳しくはフォーラムルールを参照ください。)
シー さんが書きました:各 行、列の合計を表示するプログラムを作りたいのですが私ではこれが精一杯でした
指摘 指導 よろしくお願いします

コード:

	int array[5][4];
	int tate[6];
	int yoko[5];
arrayの要素数が5と4なのですが、tate及びyokoの要素数がそれらより一つ多いのはなぜでしょうか?プログラム内でも末尾の要素が使われていないように見えます。

また、このプログラムにおいてはtate及びyokoの価値があまりなくその二つを用いなくても実現できます。
シー さんが書きました:

コード:

	int array[5][4];

	for(i = 0; i <= 4; i++){
		for(j = 0; j <= 3; j++){
ここは次のようにするとforの終了判定とarrayの要素数がイコールになるので分かりやすくなるのではないでしょうか?

コード:

	int array[5][4];

	for(i = 0; i < 5; i++){
		for(j = 0; j < 4; j++){
さらに次のように定数を導入してあげるとより理解しやすくなります。

コード:

#define X_MAX 4
#define Y_MAX 5

	int array[Y_MAX][X_MAX];

	for(i = 0; i < Y_MAX; i++){
		for(j = 0; j < X_MAX; j++){
これらをまとめると次のようなプログラムになりました。

コード:

#define X_MAX 4
#define Y_MAX 5

#include <stdio.h>

int main()
{
	int array[Y_MAX][X_MAX];
	int i, j;
	int total;

	for (i = 0; i < Y_MAX; i++)
	{
		for (j = 0; j < X_MAX; j++)
		{
			array[i][j] = i+j;
		}
	}

	for (i = 0; i < Y_MAX; i++)
	{
		for (total = j = 0; j < X_MAX; j++)
		{
			printf("%5d", array[i][j]);
			total += array[i][j];
		}
		printf(" %5d\n\n", total);
	}

	for (j = 0; j < X_MAX; j++)
	{
		for (total = i = 0; i < Y_MAX; i++)
		{
			total += array[i][j];
		}
		printf("%5d", total);
	}

	return 0;
}

このプログラムのtotalには一時的に各行列の合計が保存されています。

[hr][修正]
XとYの対応が間違っていたので修正

Re: プログラム 初心者です もっと コンパクトにならないでしょうか?

Posted: 2011年7月03日(日) 08:54
by non
>また、このプログラムにおいてはtate及びyokoの価値があまりなくその二つを用いなくても実現できます。

恐らく、問題には表示するとあるが、縦横の合計を配列に格納した後、表示しなさいという問題だと思われます。

>arrayの要素数が5と4なのですが、tate及びyokoの要素数がそれらより一つ多いのはなぜでしょうか?

縦合計を入れる要素数が1つ多いのは、横合計の縦合計を求めているからでしょう。
横合計の要素数は1つ多くする必要はありません。
ただし、横合計の縦合計が求められているのにもかかわらず、答えを出力していません。
また、初期化されていません。

Re: プログラム 初心者です もっと コンパクトにならないでしょうか?

Posted: 2011年7月03日(日) 12:59
by 初級者
何をもってコンパクトというかは議論の余地があると思いますが、
とりあえず計算部分と出力部分とを分けてみました。

コード:

#include <stdio.h>

#define X_MAX (5)
#define Y_MAX (4)

void calc(int (*p)[Y_MAX], int *t, int *y)
{
    int i, j;

    for (i = 0; i < X_MAX; i++) {
        for (j = 0; j < Y_MAX; j++) {
            p[i][j] = i + j;
            t[j]     += p[i][j];
            y[i]     += p[i][j];
            t[Y_MAX] += p[i][j];
        }
    }
}

void print(int (*p)[Y_MAX], int *t, int *y)
{
    int i, j;

    for (i = 0; i < X_MAX; i++) {
        for (j = 0; j < Y_MAX; j++) {
            printf("%5d", p[i][j]);
        }
        printf(" | %5d\n", y[i]);
    }
    for (i = 0; i < Y_MAX; i++) {
        printf("-----");
    }
    printf("-+------\n");
    for (i = 0; i < Y_MAX; i++) {
        printf("%5d", t[i]);
    }
    printf(" | %5d\n", t[Y_MAX]);
}

int main(void)
{
    int array[X_MAX][Y_MAX];
    int tate[Y_MAX+1] = { 0 };
    int yoko[X_MAX]   = { 0 };
    int i, j;

    calc(array, tate, yoko);
    print(array, tate, yoko);
    return 0;
}

Re: プログラム 初心者です もっと コンパクトにならないでしょうか?

Posted: 2011年7月03日(日) 14:27
by シー
bitter_foxさん nonさん 初級者さん 回答ありがとうございます。
codeタグを付けず見ずらい文失礼しました。
int tate[6] 確かにひとつ多かったです、tate[5]にしたのはfor文中でyokoをtate[j]に加算したかった為です とにかく 複雑に考えすぎていたようです、皆さんのおかげで 解決できました ありがとうございました。