各 行、列の合計を表示するプログラムを作りたいのですが私ではこれが精一杯でした
指摘 指導 よろしくお願いします
#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;
}
プログラム 初心者です もっと コンパクトにならないでしょうか?
- bitter_fox
- 記事: 607
- 登録日時: 15年前
- 住所: 大阪府
Re: プログラム 初心者です もっと コンパクトにならないでしょうか?
まず、codeタグで囲ってくださいますようにお願いします。インデントが継承されて非常に見やすくなります。(詳しくはフォーラムルールを参照ください。)
また、このプログラムにおいてはtate及びyokoの価値があまりなくその二つを用いなくても実現できます。
これらをまとめると次のようなプログラムになりました。
このプログラムのtotalには一時的に各行列の合計が保存されています。
[hr][修正]
XとYの対応が間違っていたので修正
arrayの要素数が5と4なのですが、tate及びyokoの要素数がそれらより一つ多いのはなぜでしょうか?プログラム内でも末尾の要素が使われていないように見えます。
また、このプログラムにおいてはtate及びyokoの価値があまりなくその二つを用いなくても実現できます。
ここは次のようにするとforの終了判定とarrayの要素数がイコールになるので分かりやすくなるのではないでしょうか? さらに次のように定数を導入してあげるとより理解しやすくなります。
#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;
}
[hr][修正]
XとYの対応が間違っていたので修正
Re: プログラム 初心者です もっと コンパクトにならないでしょうか?
>また、このプログラムにおいてはtate及びyokoの価値があまりなくその二つを用いなくても実現できます。
恐らく、問題には表示するとあるが、縦横の合計を配列に格納した後、表示しなさいという問題だと思われます。
>arrayの要素数が5と4なのですが、tate及びyokoの要素数がそれらより一つ多いのはなぜでしょうか?
縦合計を入れる要素数が1つ多いのは、横合計の縦合計を求めているからでしょう。
横合計の要素数は1つ多くする必要はありません。
ただし、横合計の縦合計が求められているのにもかかわらず、答えを出力していません。
また、初期化されていません。
恐らく、問題には表示するとあるが、縦横の合計を配列に格納した後、表示しなさいという問題だと思われます。
>arrayの要素数が5と4なのですが、tate及びyokoの要素数がそれらより一つ多いのはなぜでしょうか?
縦合計を入れる要素数が1つ多いのは、横合計の縦合計を求めているからでしょう。
横合計の要素数は1つ多くする必要はありません。
ただし、横合計の縦合計が求められているのにもかかわらず、答えを出力していません。
また、初期化されていません。
non
Re: プログラム 初心者です もっと コンパクトにならないでしょうか?
何をもってコンパクトというかは議論の余地があると思いますが、
とりあえず計算部分と出力部分とを分けてみました。
とりあえず計算部分と出力部分とを分けてみました。
#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: プログラム 初心者です もっと コンパクトにならないでしょうか?
bitter_foxさん nonさん 初級者さん 回答ありがとうございます。
codeタグを付けず見ずらい文失礼しました。
int tate[6] 確かにひとつ多かったです、tate[5]にしたのはfor文中でyokoをtate[j]に加算したかった為です とにかく 複雑に考えすぎていたようです、皆さんのおかげで 解決できました ありがとうございました。
codeタグを付けず見ずらい文失礼しました。
int tate[6] 確かにひとつ多かったです、tate[5]にしたのはfor文中でyokoをtate[j]に加算したかった為です とにかく 複雑に考えすぎていたようです、皆さんのおかげで 解決できました ありがとうございました。