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

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

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

#1

投稿記事 by 周45 » 3年前

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");
}
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 3年前

ソースコードを提示する際は、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

配列の内容を順に出力する
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Meta3

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

#3

投稿記事 by Meta3 » 3年前

配列は定数式で定義しなければなりません。

コード:

#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");

}

Meta3

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

#4

投稿記事 by Meta3 » 3年前

コード:

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

Meta3

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

#5

投稿記事 by Meta3 » 3年前

>配列は定数式で定義しなければなりません。

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

Meta3

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

#6

投稿記事 by Meta3 » 3年前

コード:

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ループを変えくださいね

Meta3

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

#7

投稿記事 by Meta3 » 3年前

参考: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;
}

Meta3

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

#8

投稿記事 by Meta3 » 3年前

コード:

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}
のように扱えます

Meta3

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

#9

投稿記事 by Meta3 » 3年前

cでは x[4] は配列の記号ですらなく *(x+4) を意味します。

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

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

Meta3

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

#10

投稿記事 by Meta3 » 3年前

cでは x[4] は配列の記号ですらなく *(x+4) を意味します。

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

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

Meta3

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

#11

投稿記事 by Meta3 » 3年前

#8の間違い
int x[6]={0,1,2,3,4,5,6}

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

Meta3

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

#12

投稿記事 by Meta3 » 3年前

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;	
}

Meta3

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

#13

投稿記事 by Meta3 » 3年前

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>



Meta3

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

#14

投稿記事 by Meta3 » 3年前

これは
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;	
}

Meta3

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

#15

投稿記事 by Meta3 » 3年前

コード:

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>

Meta3

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

#16

投稿記事 by Meta3 » 3年前

cポインターの参考書として「C言語 ポインタ完全制覇(第2版)」c11に対応
を強くお勧めします。

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

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

Meta3

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

#17

投稿記事 by Meta3 » 3年前

筆者の上記ホームページ より まったくそうでしたね この本に早くであってれば


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

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

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

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

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

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

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

返信

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