トップページ⇒tech
13コメント6KB

**PP 教えてください。

■ このスレッドは過去ログ倉庫に格納されています
0001おしえてくんNGNG
クラスで出た課題です。期日はもう過ぎてしまったんですが。
下に書きます。
0002おしえてくんNGNG
Cのクラスで突然宿題が出たんですが、さっぱり分かりません。
パスカルの三角形?
(a+b)^xのxの部分を大きくしていき、係数を求めるらしいんですが
もともとmallocとポインターの復習ということなのですが。
いままでC++のクラスしかとっていません。ポインターは
まだしも、mallocがよくわかりません。しかも ダブルポインター
がなぜ必要なのかも良く分かりません。
**pascalsTriangle(int n)の部分以外は先生の希望により
変えられません。たぶんダブルポインターを使って
解かせたいんだと思います。結局期限はすぎたので間に合いませんが
このままでは寝れません。どなたか教えてください。

#include<stdio.h>
#include<stdlib.h>

int combinations(int r,int k)
{
if(r<0)
return 0;
else if(k<0)
return 0;
else if(k==0)
return 1;
else if(k==1)
return r;
else return combinations(r-1,k)+combinations(r-1,k-1);
}

void print(int **p,int n)
{
int i,j;
for(i=0;i<=n;i++)
{
for(j=0;j<(n-i)/1;j++)
printf(" ");
for(j=0;j<=i;j++)
printf("%4d ",*(*(p+i)+j));
printf("\n");
}
}

int **pascalsTriangle(int n)
{
ここがさっぱり分からない。
}

void test(int n)
{
printf("\n\nPascal's Triangle for n=%d\n",n);
print(pascalsTriangle(n),n);
}

int main()
{
int i;
for(i=0;i<=12;i++)
test(i);
return 0;
}
0003デフォルトの名無しさんNGNG
ああ、それはね
(省略されました・・全てを読むにはここを押してください)
0004デフォルトの名無しさんNGNG
インデントしてないのを読み気になりますか???????????????
0005デフォルトの名無しさんNGNG
**p はポインタのポインタです。
というか p がポインタのポインタです。
というか、pascalsTriangleがポインタのポインタになってるから
printの引数もポインタのポインタになっているだけです。
というか多分pascalsTriangleの中で配列の配列に何かをつめてるんです。
というか配列の配列だからポインタのポインタみたいなもんです。
0006デフォルトの名無しさんNGNG
pascal の三角形って何だっけ
  1 1
  1 2 1
 1 3 3 1
ってアレか?
0007デフォルトの名無しさんNGNG
つーかさ、さっきざっと見たけど何コレ。
こんなん、ちゃんと動くのか?
先生から教育しなおさなきゃならんぞ。それともネタか?
pascalsTriangle で malloc して返すワケ?
なんにせよバグてんこもりになりそうだ。
0008おしえてくんNGNG
出来ました。結局自分であーだこーだやりました。
これで動いてるんですが、確信がありません。
mallocで確保したメモリーを
freeするやりかたは、これで良いんでしょうか?
また、freeが成功したかどうかってどうやって調べるんですか?
free -k ? とかでみるしかないんでしょうか?
インデントしてないの申し訳ない。なんかおかしくなったようです。

#include<stdio.h>
#include<stdlib.h>

int combinations(int r,int k);
void print(int **p,int n);
void test(int n);
void freem(int **p,int n);
int **pascalsTriangle(int n);
int **p;

int combinations(int r,int k)
{
if(r<0)
return 0;
else if(k<0)
return 0;
else if(k==0)
return 1;
else if(k==1)
return r;
else return combinations(r-1,k)+combinations(r-1,k-1);
}

void print(int **p,int n)
{
int i,j;
for(i=0;i<=n;i++)
{
for(j=0;j<(n-i)/1;j++)
printf(" ");
for(j=0;j<=i;j++)
printf("%4d ",*(*(p+i)+j));
printf("\n");
}
}

void freem(int **p,int n)
{
int i;
for(i=0;i<=n;i++)
free(*(p+i));

free(p);
}

int **pascalsTriangle(int n)
{
int i,j;
p=(int **)malloc((n+1)*sizeof(int *));
for(i=0;i<=n;i++)
{
*(p+i)=(int *)malloc((i+1)*sizeof(int));
for(j=0;j<=i;j++)
*(*(p+i)+j) = combinations(i,j);
}
return p;
}

void test(int n)
{
printf("\n\nPascal's Triangle for n=%d\n",n);
print(pascalsTriangle(n),n);
}

int main()
{
int i;
for(i=0;i<=12;i++)
test(i);

freem(p,12);
return 0;
}
0009デフォルトの名無しさんNGNG
フリーの失敗は確認不可です。
またフリーに失敗したからといってやり直しが効くわけではありません。
人生は一度しかないのですから。
0010デフォルトの名無しさんNGNG
(;´д`)学校の宿題は自分でやりましょう
0011デフォルトの名無しさんNGNG
main()のfor〜freem(〜);を無限ル〜プさせてみれば。
ほっといて落ちるようなら快方失敗でしょ?
0012おしえてくんNGNG
色々とありがとうございました。
0013デフォルトの名無しさんNGNG
>>8
数行で出来る事を何故そこまでゴチャゴチャにする・・・
■ このスレッドは過去ログ倉庫に格納されています