2次元配列の累乗について
2次元配列の累乗について
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");
}
}
#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次元配列の累乗について
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
提示されたコードでは、aおよびbが宣言なしで使用されているため、コンパイルエラーになりますね。
以下のような手順で処理を行うといいでしょう。
ただし、擬似コード中の配列の添字は0から始まり、ループの範囲は両端を含むものとします。
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
提示されたコードでは、aおよびbが宣言なしで使用されているため、コンパイルエラーになりますね。
以下のような手順で処理を行うといいでしょう。
ただし、擬似コード中の配列の添字は0から始まり、ループの範囲は両端を含むものとします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 2次元配列の累乗について
配列は定数式で定義しなければなりません。
#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次元配列の累乗について
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次元配列の累乗について
参考: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次元配列の累乗について
cでは x[4] は配列の記号ですらなく *(x+4) を意味します。
詳しくは
ポインタ虎の巻 多次元配列の実現 で検索 してみましょう
『C言語では、Fortran や BASIC でおなじみの多次元配列を扱う手段が、厳格に言えば存在しない。二次元座標の個々の値を保存する手段として、int x[10][10]; のような表現でデータを確保したいのはどのプログラミング言語でも同じである。しかし、C言語では他の言語で一般的な「多次元配列」という考え方自体が存在しないのである。あるのは正確には「配列の配列」だけである。http://www.nurs.or.jp/~sug/soft/tora/tora10.htm より
詳しくは
ポインタ虎の巻 多次元配列の実現 で検索 してみましょう
『C言語では、Fortran や BASIC でおなじみの多次元配列を扱う手段が、厳格に言えば存在しない。二次元座標の個々の値を保存する手段として、int x[10][10]; のような表現でデータを確保したいのはどのプログラミング言語でも同じである。しかし、C言語では他の言語で一般的な「多次元配列」という考え方自体が存在しないのである。あるのは正確には「配列の配列」だけである。http://www.nurs.or.jp/~sug/soft/tora/tora10.htm より
Re: 2次元配列の累乗について
cでは x[4] は配列の記号ですらなく *(x+4) を意味します。
詳しくは
ポインタ虎の巻 多次元配列の実現 で検索 してみましょう
『C言語では、Fortran や BASIC でおなじみの多次元配列を扱う手段が、厳格に言えば存在しない。二次元座標の個々の値を保存する手段として、int x[10][10]; のような表現でデータを確保したいのはどのプログラミング言語でも同じである。しかし、C言語では他の言語で一般的な「多次元配列」という考え方自体が存在しないのである。あるのは正確には「配列の配列」だけである。http://www.nurs.or.jp/~sug/soft/tora/tora10.htm より
詳しくは
ポインタ虎の巻 多次元配列の実現 で検索 してみましょう
『C言語では、Fortran や BASIC でおなじみの多次元配列を扱う手段が、厳格に言えば存在しない。二次元座標の個々の値を保存する手段として、int x[10][10]; のような表現でデータを確保したいのはどのプログラミング言語でも同じである。しかし、C言語では他の言語で一般的な「多次元配列」という考え方自体が存在しないのである。あるのは正確には「配列の配列」だけである。http://www.nurs.or.jp/~sug/soft/tora/tora10.htm より
Re: 2次元配列の累乗について
C言語では他の言語で一般的な「多次元配列」という考え方自体が存在しないのである。あるのは正確には「配列の配列」だけである。[ポインタ虎の巻 多次元配列の実現 ]より
サンプルを作ってみました
サンプルを作ってみました
Re: 2次元配列の累乗について
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次元配列の累乗について
これは
D5[5] = 55;//2次元配列へも反映
printf("%d\n",D[5][5]);
printf("%d\n",D5[5]);
と同じ
D5[5] = 55;//2次元配列へも反映
printf("%d\n",D[5][5]);
printf("%d\n",D5[5]);
と同じ
Re: 2次元配列の累乗について
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次元配列の累乗について
cポインターの参考書として「C言語 ポインタ完全制覇(第2版)」c11に対応
を強くお勧めします。
http://kmaebashi.com/seiha2/index.html
http://kmaebashi.com/programmer/pointer.html
正しく 優しく 教えてくれる 唯一の本です
目から鱗が落ちる本です
を強くお勧めします。
http://kmaebashi.com/seiha2/index.html
http://kmaebashi.com/programmer/pointer.html
正しく 優しく 教えてくれる 唯一の本です
目から鱗が落ちる本です
Re: 2次元配列の累乗について
筆者の上記ホームページ より まったくそうでしたね この本に早くであってれば
[C言語は、現在広く使用されている言語である。しかし、Cは、 より良い言語を開発しようという目的の下に開発された言語ではなく、 UNIXを開発するために、いわば「いきあたりばったり」で 開発された言語である。ゆえに、ダーティな構文や、コンパイラの実装を 容易にするために手を抜いた部分が存在する。]
[本文では、そのような「Cの暗部」のうち、 「配列とポインタ」について述べる。]
[対象読者は、Cをそれなりに習得しており、かつ、 以下のような疑問を感じる人である。]
Cの宣言では、[] は* よりも優先順位が高い。 ゆえに、char *s[10]; という宣言は、「char へのポインタの配列」を意味する ---逆じゃないか?
[このような点については、たいていの市販のCの参考書において、 記述されていないか、書いてあっても目立たないか、 著者が明らかに勘違いをしているかのどれかである。 Cのバイブルと呼ばれる「プログラミング言語C」(本文では以後K&Rと表記する。 ページ数等を付記する時は、第2版の日本語訳改訂版に従う)も例外ではない (というより、この本(の原書)が諸悪の根源かもしれない)。]
[Cの文法は、一見首尾一貫しているようで、実は数多くの例外が存在する。]
本文は、上記の疑問に答え、Cの文法上の問題点を洗い出すことを目的とする。
[C言語は、現在広く使用されている言語である。しかし、Cは、 より良い言語を開発しようという目的の下に開発された言語ではなく、 UNIXを開発するために、いわば「いきあたりばったり」で 開発された言語である。ゆえに、ダーティな構文や、コンパイラの実装を 容易にするために手を抜いた部分が存在する。]
[本文では、そのような「Cの暗部」のうち、 「配列とポインタ」について述べる。]
[対象読者は、Cをそれなりに習得しており、かつ、 以下のような疑問を感じる人である。]
Cの宣言では、[] は* よりも優先順位が高い。 ゆえに、char *s[10]; という宣言は、「char へのポインタの配列」を意味する ---逆じゃないか?
[このような点については、たいていの市販のCの参考書において、 記述されていないか、書いてあっても目立たないか、 著者が明らかに勘違いをしているかのどれかである。 Cのバイブルと呼ばれる「プログラミング言語C」(本文では以後K&Rと表記する。 ページ数等を付記する時は、第2版の日本語訳改訂版に従う)も例外ではない (というより、この本(の原書)が諸悪の根源かもしれない)。]
[Cの文法は、一見首尾一貫しているようで、実は数多くの例外が存在する。]
本文は、上記の疑問に答え、Cの文法上の問題点を洗い出すことを目的とする。