ぼるじょあがC/C++の宿題を片づけますYO! 21代目

このエントリーをはてなブックマークに追加
918917:04/04/27 05:24
int ***malloc3Dint(int l, int m, int n){
int i, j;
int ***aaai2;
int **aai2;
int *ai2;

if((aaai2 = (int ***)malloc(sizeof(int *)*l)) == NULL)
exit(1);
if((aai2 = (int **)malloc(sizeof(int *)*l*m)) == NULL)
exit(1);
if((ai2 = (int *)malloc(sizeof(int)*l*m*n)) == NULL)
exit(1);
for(i=0; i<l; i++){
for(j=0; j<m; j++)
aai2[i*m + j] = ai2 + i*m*n + j*n;
aaai2[i] = aai2 + i*l;
}
return aaai2;
}

void free3Dint(int ***aaai2){
free(aaai2[0][0]);
free(aaai2[0]);
free(aaai2);
}

このプログラムは何をやっているのか順を追って説明していただけませんか?
よろしくおねがいします。
919910:04/04/27 06:12
>>919
count_bits()の中
> while (x){
> if(x&1U)count++;
> }
if文の次に x >>= 1; を追加。
以上。
921助けてください。:04/04/27 11:49
C言語を使ってやる宿題なんですができません。
わかる方お願いしますm(_ _)m
自力では何もできないもので。バカなんです。

次のような規則にしたがって離散時間tにおける状態xtから次の時刻t+1における状態xt+1が決まるシステムがある。

xt+1=tanh(axt) t=0,1,2,3.....
この規則を繰り返し適用すれば初期状態xoから出発してそれ以降の任意の時刻での系の状態を計算できる。
x0→x1→x2・・・→xt→・・・

次の2つの場合について初期値(正負どちらもあり得る)をいろいろ変えながら系の時間発展を計算せよ。典型的な例について状態xを時間の関数として図示し、系の振る舞いについてわかったことを述べよ。またなぜそうなるのかも考えてみよ。

(1)a=0.95の場合
(2)a=1.05の場合

マジお願いします。泣きそうなので。
922ラポ:04/04/27 12:06
すいませんがこの問題わかりません
またお願いしたいです。
スタックを初期化する関数 void stack_initialize(stack *stk)
およびスタックが空であるかどうかを判断する関数 int is_stack_empty(stack *stk) を作れ.
is_stack_empty は,スタックが空であるときに 1 を,空ではないときに 0 を返す.
>>922
stack の宣言はどうなってる?
>>922
初期化→スタックポインタを0にすればいいんだろ。
俺ならスタックポインタの初期値は -1 にする。
使ってないって感じがするから。
-1が有効なアドレスだったらどうするよ。
ポインタならNULL使えって。
二つのやり方があるだろって言ってるんだよ。
stack[sp++] = push_data;
stack[++sp] = push_data;
>>921
初期値の配列作って。ループ回して計算。
CVS形式でprintfした後,出力をExcelにでも読み込んで観察すれば?

プログラム書く必要がないなら,漏れはExcelだけで済ますけどな。
929助けてください。:04/04/27 13:59
921について。
928>>
図と説明はいいとして最初のプログラムがわかりません。
わかる方教えていただけたら幸いです。
int i,j;
double x[10];
const int t_max = 1<<16;
const int t_delta = 1;
const double a=1.05;
printf("a=%f\n");
printf("0,\t");
for(i=0; i<sizeof(x)/sizeof(x[0]); ++i) { printf("%f,\t",x[i]=0.1*i); }
printf("\n");
for( i=1; i<t_max; i+=t_delta ){
printf("%d,\t",i);
for( j=0; j<sizeof(x)/sizeof(x[0]); ++i){
printf("%f,\t",x[i]=tanh(a*x[i]));
}
printf("\n");
}

しかし,SASとかグラフ描画ライブラリをか,しかるべきものを使うべき演習じゃねーのか,コレ?
縦5×横5のマスに○×をランダムで表示させる。
毎回同じであってはならない
マスの左と上には座標数字を表示
マスの2行下に座標指定を‘XY’で入力する
‘00’を入力したら現在状態を破棄し、最初から始める
‘001’のように入力したらエラー、再入力
‘Z’を入力で終了する
座標指定入力において何を入力しても不正な動作はしない。
‘66’とか入力したら再入力にする

座標指定された位置、及び上下左右のマークを反対にする
指定された位置の上下左右が範囲外の時、何もしない。該当する部分のみ反対にする。

全マス同じマークになったら‘You win’を表示
全マス同じマークになったら何を入力しても最初から始める

条件は
グローバル変数はマスに使うtableのみ
ほかの変数はグローバルは認めない
メイン関数の中身は
初期化処理する関数
ランダムで○×を表示する関数
座標を入力する関数
マークを反転させる関数
その結果を表示する関数
全マス同じマークか判定する関数
You winを表示する関数

どうかよろしくお願いします。m(_ _)m
本当に泣きそうです・・・
んーこれは、どこかで見たようなゲームかな。
■□■□■
□■■■□
■■■■■
□■■■□
■□■□■
この状態で、中央を指定すると、
■□■□■
□■□■□
■□□□■
□■□■□
■□■□■
このように反転する、と。
>>931
メイン関数の中身は関数、って嘘だろ?
934931:04/04/27 16:28
>>932
そんな感じです

>>933
ユーザー定義関数で以下を作れと言われました。
で、メインから呼び出せと・・・
この説明で分かるでしょうか?

初期化処理する関数
ランダムで○×を表示する関数
座標を入力する関数
マークを反転させる関数
その結果を表示する関数
全マス同じマークか判定する関数
You winを表示する関数
「ライツアウト」だろ?そのゲーム。
>>931
>全マス同じマークになったら何を入力しても最初から始める
これがよく判らん…が、他は↓こんなんでいい?

tp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1074774948&res=8
いかん、'z' 入力で終わるって仕様を実装すんの忘れた。
まあそれくらいは自分でやってちょ。
「float *p[10];」と「float (*p)[10];」の2つの変数宣言の違い、
「float a[][10]」と「float (*a)[10]」という
2つの関数の引数の宣言の違いについて
説明せよ、というのが分かりません。

お願いします。
float型のポインタの10要素配列、float型の10要素配列のポインタ
float型の10要素配列の配列
940デフォルトの名無しさん:04/04/28 01:48
猿ロダにうpしたソースファイル
ttp://www1.linkclub.or.jp/~yon/haha/saru-img/saru0757.c
をポインタで書き換えたいのです。

//-------------------------------------------------------------------
// 以下のプログラムを作成してください
//       上記の四則演算関数の結果をポインタを用いて得るように改造する
// 次のような関数を作成する
// void Add(int a, int b, int *ans)
// void Sub(int a, int b, int *ans)
// void Mul(int a, int b, int *ans)
// void Div(int a, int b, int *ans)
//
//-------------------------------------------------------------------

初期値はプログラム内部で設定するので、入出力は気にしなくていいです。
お暇な方、よろしくお願いします<(_ _)>
void Add(int a,int b,int *ans)
{
*ans = a + b;
}



int x,y,z;
x = 10;
y = 5;
Add(x,y,&z);

これだけ書けば、あとは自分でできるよな、というほどの問題でもないが。

942940:04/04/28 01:59
>>941
速レスありがd。
943931:04/04/28 08:26
>>936
本当にありがとうございますm(_ _)m
自分でも読んでしっかり理解できるよう頑張ります
944911:04/04/28 10:41
ありがとうございました。無事プログラムが完成しました。
なんで誰も>125に突っ込まないの?
946940:04/04/28 16:48
続きものです。

//-------------------------------------------------------------------
// 以下のプログラムを作成してください。
//        941の作ってくれた関数をさらに一般化します。演算の仕方も引数で渡してください
//        void Calc(int calc, int a, int b, int *ans)
// calc == 0 和
// calc == 1 差
// calc == 2 積
// calc == 3 商
//
//-------------------------------------------------------------------

それで作ったプログラムを、また猿ロダにあげました
ttp://www1.linkclub.or.jp/~yon/haha/saru-img/saru0759.c
エラーが4つ、同じ関数の部分で出てしまいました。
どなたか添削していただけないでしょうか・・。
void型は戻値を持たない。
>>945
解説きぼん
>>946
最後の引き数 「&z」 を渡すことで
戻り値は z の中に入るから
「z = 」は要らないよん。
こういうのってenumとか使ったほうがいいんじゃないの?
951デフォルトの名無しさん:04/04/28 22:08
952デフォルトの名無しさん:04/04/28 22:37
>>950
よくない
953940:04/04/28 23:10
通りますたー!
949ありがd。947は、その通りですた。
「950のenumを使うのはC++だ」と言いたい951も(ついでに)ありがとお。

・・実は、この続きがもう一問ありまつ。

//---------------------------------------------------------
//
// さきほどのソースファイルの関数をさらに完全なものとする
//      @返り値を付加する(0なら正常/1ならエラー)
//      A計算方法を分かりやすくするため、#define定義にする
//
//---------------------------------------------------------

これで最後です。最終形態のラスボスです。
クリアしてエンディングを自力で見たいので、もちっと考えますが。
>>953
>>951は単なる宣伝なので、礼を言うことはない。
955デフォルトの名無しさん:04/04/28 23:43
すいません。自然定数eを計算によって求め、結果を表示するプログラムの作り方を教えてください。
>>955
マルチ帰れ。
自然定数eなんてものは存在しないだろ。
>>953
>enumを使うのはC++だ
意味不明
958デフォルトの名無しさん:04/04/28 23:56
そう問題に書かれていているからわからんのです。
959デフォルトの名無しさん:04/04/28 23:57
(*n)[10] と n[10] はどう違うんですか?
>>958
そこまでマルチに徹するとは。
おそれいった。
あるファイルから文字を呼び出し、他のファイルへ左右逆にして
貼り付けたい時はどうすればいいですか?

I am a boy.
I like 2ch.

.yob a ma I
.hc2 ekil I

こんな感じです。
for文とstrlen()を使えばいいです
char buf[1024];while(gets(buf)){char*p=buf+strlen(buf);while(p!=buf)putchar(*--p);}
964マルチやめれ >>955:04/04/29 00:50
#include <iostream>
#include <iomanip>
#include <limits>
#include <cmath>

double exp_(){
double tmp = 1.0; // eを計算するための一時変数
double term = 1.0; // eの展開級数の各項を保存する変数
int k = 1; // 展開級数の項番号
double eps = std::numeric_limits<double>::epsilon(); // machine epsilon
while( term / tmp > eps ){ // 収束判定
term /= k;
// 展開級数の各項が1 / k!なので,前の項の計算結果を使って
// 1 / k! = 1 / (k-1)! * (1 / k)
// と計算できる
tmp += term; // 各項を足していく
++k; // 次の項の計算へ
}
return tmp;
}

int main(int argc, char *argv[]){
std::cout << std::setprecision(15); // 表示精度を15桁に
std::cout << exp_() << std::endl; // 計算結果表示
std::cout << std::exp(1.0) << std::endl; // 比較のため
}
>>963
一行の長さが1023超えたら条件を満たさなくなる。
ってことで、こんなもんかな。

static bool revCpChr(FILE *fpSrc, FILE *fpDest);
void revCp(FILE *fpSrc, FILE *fpDest)
{
while (revCpChr(fpSrc, fpDest)) {
}
}
bool revCpChr(FILE *fpSrc, FILE *fpDest)
{
int ch = fgetc(fpSrc);
switch (ch) {
case EOF:
return false;
case '\n':
return true;
default:
bool rtn = revCpChr(fpSrc, fpDest);
fputc(ch, fpDest);
return rtn;
}
966965:04/04/29 00:58
最後の}が抜けた気がする。
ついでに蛇足ながら、
FILE *fpSrc = fopen("original", "r");
FILE *fpDest = fopen("reversed", "w");
revCp(fpSrc, fpDest);
fclose(fpSrc);
fclose(fpDest);
って感じで利用する。
>>964
それは自然対数の底。