ページ 11

2次元配列の累乗について

Posted: 2020年12月02日(水) 01:39
by 周45
2 つの正の整数xとyをキーボードから読み込み、1 行目にはxから1までを表示、2 行目にはxの2乗から1の2乗までを表示・・・y行目にはxのy乗から1のy乗まで表示するプログラムを作成したいのですが、よくわかりません。なんやかんやあって下のようになったのですが出力されませんでした。誰か教えてください。
#include<stdio.h>

int main(void)
{
int x,y;

scanf("%d %d",&x,&y);


int i,j;
int c[y][x];

for(i=1;i<=b;i++){
for(j=a;j>0;j--){

j=j*i;
c[j]=j;
printf("%3d",c[j]);
}
printf("\n");
}
}

Re: 2次元配列の累乗について

Posted: 2020年12月02日(水) 02:36
by みけCAT
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。

提示されたコードでは、aおよびbが宣言なしで使用されているため、コンパイルエラーになりますね。
以下のような手順で処理を行うといいでしょう。
ただし、擬似コード中の配列の添字は0から始まり、ループの範囲は両端を含むものとします。

コード:

xとyを読み込む

y行x列の配列を確保する

for jを0からx-1までループ
    配列の0行j列目の値を(x-j)にする
next

for iを1から(y-1)までループ
    for jを0から(x-1)までループ
        配列のi行j行目の値を((配列の(i-1)行j行目の値)×(x-j))にする
    next
next

配列の内容を順に出力する

Re: 2次元配列の累乗について

Posted: 2020年12月02日(水) 15:05
by Meta3
配列は定数式で定義しなければなりません。

コード:

#include<stdio.h> 

int main(void)
{
int x,y;

scanf("%d %d",&x,&y);


int i,j;
//int c[y][x];
int c[100][100];
//for(i=1;i<=b;i++){
//for(j=a;j>0;j--){

//j=j*i;
//c[j]=j;
//printf("%3d",c[j]);

for(i=0;i<x;i++){
	c[0][i]=i+1;
}
for(j=1;j<y;j++){
	for(i=0;i<x;i++){
	c[j][i]=c[j-1][i]*c[0][i];
	}
}
for(j=0;j<y;j++){
	for(i=0;i<x;i++){
		printf("%3d ",c[j][i]);
	}
printf("\n");
}

printf("\n");

}

Re: 2次元配列の累乗について

Posted: 2020年12月02日(水) 15:14
by Meta3

コード:

c:\b>c

c:\b>cl c1.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.26.28806 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

c1.c
Microsoft (R) Incremental Linker Version 14.26.28806.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:c1.exe
c1.obj

c:\b>c1
3 4
  1   2   3
  1   4   9
  1   8  27
  1  16  81

Re: 2次元配列の累乗について

Posted: 2020年12月02日(水) 15:45
by Meta3
>配列は定数式で定義しなければなりません。

または動的に配列を確保することができます。
https://www.math.nagoya-u.ac.jp/~naito/ ... atrix.html

Re: 2次元配列の累乗について

Posted: 2020年12月02日(水) 16:29
by Meta3

コード:

c:\b>c1
3 4
  1   2   3
  1   4   9
  1   8  27
  1  16  81
「2 つの正の整数xとyをキーボードから読み込み、1 行目にはxから1までを表示、2 行目にはxの2乗から1の2乗までを表示・・・y行目にはxのy乗から1のy乗まで表示するプログラムを作成したいのですが、よくわかりません。なんやかんやあって下のようになったのですが出力されませんでした。誰か教えてください。」

と書いてあるので表示が逆かな?forループを変えくださいね

Re: 2次元配列の累乗について

Posted: 2020年12月02日(水) 20:21
by Meta3
参考:cの2次元配列を1次元配列として扱える:

コード:

#include <stdio.h>
int main(void)
{
int b[2][3] = {
	{ 0, 1, 2 },
	{ 3, 4, 5 },
};
int *x;        //int のポインター
x=&(b[0][0]);  //2次元配列のポインター値を代入する:正しいです
printf("-----%d\n",x[4]);//1次元配列x[4]にアクセス:宣言x[]無くてもok
x[4]=777;                //1次元配列x[4]に代入する
printf("---%d\n",b[1][1]);//2次元配列に反映	
	
	printf("c[%p %p]",&x[0],&b[0][0]);

printf("c[%d %d]",x[0],b[0][0]);

return 0;
}

Re: 2次元配列の累乗について

Posted: 2020年12月02日(水) 20:36
by Meta3

コード:

c:\b>c1
-----4
---777
c[002BF754 002BF754]c[0 0]
c:\b>

コード:

int b[2][3] = {
	{ 0, 1, 2 },
	{ 3, 4, 5 },
};

コード:

int x[6]={0,1,2,3,4,5,6}
のように扱えます

Re: 2次元配列の累乗について

Posted: 2020年12月02日(水) 22:19
by Meta3
cでは x[4] は配列の記号ですらなく *(x+4) を意味します。

詳しくは
ポインタ虎の巻 多次元配列の実現 で検索 してみましょう

『C言語では、Fortran や BASIC でおなじみの多次元配列を扱う手段が、厳格に言えば存在しない。二次元座標の個々の値を保存する手段として、int x[10][10]; のような表現でデータを確保したいのはどのプログラミング言語でも同じである。しかし、C言語では他の言語で一般的な「多次元配列」という考え方自体が存在しないのである。あるのは正確には「配列の配列」だけである。http://www.nurs.or.jp/~sug/soft/tora/tora10.htm より

Re: 2次元配列の累乗について

Posted: 2020年12月02日(水) 22:21
by Meta3
cでは x[4] は配列の記号ですらなく *(x+4) を意味します。

詳しくは
ポインタ虎の巻 多次元配列の実現 で検索 してみましょう

『C言語では、Fortran や BASIC でおなじみの多次元配列を扱う手段が、厳格に言えば存在しない。二次元座標の個々の値を保存する手段として、int x[10][10]; のような表現でデータを確保したいのはどのプログラミング言語でも同じである。しかし、C言語では他の言語で一般的な「多次元配列」という考え方自体が存在しないのである。あるのは正確には「配列の配列」だけである。http://www.nurs.or.jp/~sug/soft/tora/tora10.htm より

Re: 2次元配列の累乗について

Posted: 2020年12月02日(水) 23:11
by Meta3
#8の間違い
int x[6]={0,1,2,3,4,5,6}

int x[6]={0,1,2,3,4,5} でした

Re: 2次元配列の累乗について

Posted: 2020年12月04日(金) 20:50
by Meta3
C言語では他の言語で一般的な「多次元配列」という考え方自体が存在しないのである。あるのは正確には「配列の配列」だけである。[ポインタ虎の巻 多次元配列の実現 ]より
サンプルを作ってみました

コード:

#include <stdio.h>

int main()
{
int D0[10];
int D1[10];
int D2[10];
int D3[10];
int D4[10];
int D5[10];
int D6[10];
int D7[10];
int D8[10];
int D9[10];

int *D[10] = { D0, D1,D2,D3,D4,D5,D6,D7,D8, D9 };

D[5][5] = 55;//2次元配列D10][]宣言されてないのに!

printf("%d\n",D[5][5]);


return 0;	
}

Re: 2次元配列の累乗について

Posted: 2020年12月04日(金) 20:56
by Meta3
VisualStudio2019使用

コード:

c:\b>c

c:\b>cl c1.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.26.28806 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

c1.c
Microsoft (R) Incremental Linker Version 14.26.28806.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:c1.exe
c1.obj

c:\b>c1
55

c:\b>



Re: 2次元配列の累乗について

Posted: 2020年12月04日(金) 21:13
by Meta3
これは
D5[5] = 55;//2次元配列へも反映

printf("%d\n",D[5][5]);

printf("%d\n",D5[5]);
と同じ

コード:

#include <stdio.h>

int main()
{
int D0[10];
int D1[10];
int D2[10];
int D3[10];
int D4[10];
int D5[10];
int D6[10];
int D7[10];
int D8[10];
int D9[10];

int *D[10] = { D0, D1,D2,D3,D4,D5,D6,D7,D8, D9 };

D5[5] = 55;//2次元配列へも反映

printf("%d\n",D[5][5]);

printf("%d\n",D5[5]);
return 0;	
}

Re: 2次元配列の累乗について

Posted: 2020年12月04日(金) 21:16
by Meta3

コード:

c:\b>c

c:\b>cl c1.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.26.28806 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

c1.c
Microsoft (R) Incremental Linker Version 14.26.28806.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:c1.exe
c1.obj

c:\b>c1
55
55

c:\b>

Re: 2次元配列の累乗について

Posted: 2020年12月04日(金) 22:50
by Meta3
cポインターの参考書として「C言語 ポインタ完全制覇(第2版)」c11に対応
を強くお勧めします。

http://kmaebashi.com/seiha2/index.html
http://kmaebashi.com/programmer/pointer.html

正しく 優しく 教えてくれる 唯一の本です
目から鱗が落ちる本です

Re: 2次元配列の累乗について

Posted: 2020年12月05日(土) 11:31
by Meta3
筆者の上記ホームページ より まったくそうでしたね この本に早くであってれば


[C言語は、現在広く使用されている言語である。しかし、Cは、 より良い言語を開発しようという目的の下に開発された言語ではなく、 UNIXを開発するために、いわば「いきあたりばったり」で 開発された言語である。ゆえに、ダーティな構文や、コンパイラの実装を 容易にするために手を抜いた部分が存在する。]

[本文では、そのような「Cの暗部」のうち、 「配列とポインタ」について述べる。]

[対象読者は、Cをそれなりに習得しており、かつ、 以下のような疑問を感じる人である。]

Cの宣言では、[] は* よりも優先順位が高い。 ゆえに、char *s[10]; という宣言は、「char へのポインタの配列」を意味する ---逆じゃないか?

[このような点については、たいていの市販のCの参考書において、 記述されていないか、書いてあっても目立たないか、 著者が明らかに勘違いをしているかのどれかである。 Cのバイブルと呼ばれる「プログラミング言語C」(本文では以後K&Rと表記する。 ページ数等を付記する時は、第2版の日本語訳改訂版に従う)も例外ではない (というより、この本(の原書)が諸悪の根源かもしれない)。]

[Cの文法は、一見首尾一貫しているようで、実は数多くの例外が存在する。]

本文は、上記の疑問に答え、Cの文法上の問題点を洗い出すことを目的とする。