C言語って… (278レス)
1-

83: 02/08/04 17:16 ID:hUZim/2I(2/2) AAS
71さんの周りの人って、関数定義探すのにgrepしてるの?
TAGファイル作っとけば、一発でジャンプできるのに。
TAGジャンプが出来ないエディタ使ってるのかな?
84
(3): 02/08/04 17:22 ID:??? AAS
xをn乗するコードを書きましたがどうですか?Cを初めて3日目の者です。

/* xをy乗するといくらか? */
printf("xをy乗します。\n");
printf("xを入力(not 0):");
scanf("%d", &x);
if(x == 0) return 0; /* 0が入力されたら終了 */

printf("yを入力(not 0):");
scanf("%d", &y);
if(y == 0) return 0; /* 0が入力されたら終了 */

if(y == 1) { /* 1乗ならそのまま出力して終了 */
printf("%dの%d乗は%d\n\n", x,y,x);
return 0;
}

ox = x; /* xの値を避難 */
count = 1;

while(count != y) {
x = x * ox;
count++;
}

printf("%dの%d乗は%d\n\n", ox,y,x);
85
(6): 02/08/04 18:02 ID:??? AAS
どうしてx^nと謳っておきながら
コードとドキュメントはx^yなの?
記号の不統一性は混乱する元です。

また、場合わけが気持ち悪いですね。
むしろループや再帰を効率的に使ってもっと簡潔に書くべきでは?

ループを使った場合をささっと書くと、

int res=1;
for(int i=0;i<y;++i){
res*=x;
}

て感じ。

ちなみに0^0=1は定義だけど、いいね?
86: 85 02/08/04 18:06 ID:??? AAS
あー、ごめん、ちょっと補足。
85のコードはx,yに値が代入された後、場合わけを含めて計算する。
0を入力されても止める必要は無いし、1の場合の場合わけも不要。

考慮していないのは乗数<0の場合。
0で計算される。
87
(1): 02/08/04 18:50 ID:??? AAS
x, y の値を計算の途中で変えちゃってイイならば
while(--y) x*=x; とか。x が答えになる。
ただしこれは y<1 のときにかなり最悪なことになる。

ところで >>84 は一応ループつかってるんじゃないのか? > 85
88: 85 02/08/04 19:03 ID:??? AAS
>>87
えへっ、(省略されました・・全てを読むにはここを押してください)を読まなかったの v
私めんどうくさがりだもん。

…ごめんね。
89: 02/08/04 19:06 ID:??? AAS
>x*=x
ここは困った事になると思う。
90: 85 02/08/04 19:22 ID:??? AAS
そだね。
87さんのだと最終的な結果がx^(2^y)になるかな?
swapと一緒でtmpが一個いるよ。

tmp無しで書こうと思ったら、church数みたいに

int func(int xx,int yy){return (n==0)?1:xx*func(yy-1);}

とかあらかじめ関数を作っておいて、

printf("%d ^ %d = %d\n",x,y,func(y));

でOK。
しかし再帰でバグ出すと最悪数時間が消えるので、
他にいい方法があったり、あるいは急ぐときにはあんまりお勧めしないです。
91: 85 02/08/04 19:23 ID:??? AAS
ああっ、やってしまった…。
訂正です。

int func(int xx,int yy){return (yy==0)?1:(xx*func(xx,yy-1));}

これならうまくいくはず…。たぶん…。
92: 85 02/08/04 19:34 ID:??? AAS
やっぱりダメだぁ…。
訂正が面倒だから今回はちゃんとコンパイラ通した。

//再帰を使った階乗計算
#include<stdlib.h>
#include<stdio.h>

int func(int xx,int yy){return (yy==0)?1:(xx*func(xx,yy-1));}

void main(void){
int x,y;

printf("x?");scanf("%d", &x);//xを入力
printf("y?");scanf("%d", &y);//yを入力

printf("%d ^ %d = %d\n",x,y,func(x,y));//計算&結果表示

}
93
(1): 02/08/04 20:04 ID:??? AAS
>84
pow()でいいじゃん。
94: [0] 02/08/04 21:18 ID:??? AAS
外部リンク:www.kokorode.com
95: 02/08/04 21:27 ID:??? AAS
>93
ツェペリさんを思い出すのでいやです。
96: 84 02/08/04 22:34 ID:??? AAS
>>85 さんご意見ありがとう!
97
(1): 02/08/04 23:14 ID:l10.DAfI(1/4) AAS
ところでx*=xって未定義だったっけ?

x*=xはx=(x*x)と等価だったと思ったけど
98: 02/08/04 23:21 ID:??? AAS
0
99
(1): 02/08/04 23:25 ID:??? AAS
>>97
そんなことないよ。
xの内容をレジスタに入れてから演算、
その結果をxとして格納する、の順番に処理される(と思う)ので
何ら問題なくxにはx^2が格納されます。
100: 02/08/04 23:30 ID:l10.DAfI(2/4) AAS
>>99
「x*=xって未定義」に対してそんなこと無いよ
といっておられるのですか?

それとも「x*=xはx=(x*x)と等価」に対してですか?

話の内容から前者だと思いますが、ただ
>xの内容をレジスタに入れてから演算、
>その結果をxとして格納する、の順番に処理される(と思う)ので
a++=a;
とかがあるから、そういう言い方は出来ないと思うんだけど
101
(1): 02/08/04 23:32 ID:??? AAS
未定義になるのは副作用完了点と副作用完了点の間で、変数の値が
2回以上変更されているようなケースです。x*=x; は式の先頭から、
副作用完了点である;の位置までに x の値は1度しか変更されて
いませんので未定義には当たりません。
102
(1): 02/08/04 23:36 ID:??? AAS
> a++=a;
> とかがあるから、

ありません。

確認しましたがVCではエラー吐きますね。
103: 02/08/04 23:44 ID:l10.DAfI(3/4) AAS
>>102
書き込みミスです
104: 02/08/04 23:45 ID:l10.DAfI(4/4) AAS
>>101
やっぱりそうですか、
一応、あってたか・・・
どうもすみません
105: 02/08/04 23:46 ID:??? AAS
なんだかすごいことになってきたね。(笑)
106: 02/08/05 00:10 ID:??? AAS
知識のなさをひけらかす場になってきたな(笑)
107: 02/08/05 01:35 ID:??? AAS
C++も無名関数とクロージャがあればなぁ。
108: 02/08/05 02:00 ID:??? AA×

109: 02/08/06 17:58 ID:RPPDYFAM(1) AAS
z
110: 02/08/15 16:07 ID:??? AAS
行番号をいちいち書かずに例えば、

「現在1203行目を実行しました。
「現在1452行目を実行しました。

みたいに表示させいってて実行時の処理経路を明確にして行きたい
んだくぅえども、いちいち行番号を書くのが面倒くさい。
なんかちゃちな置換アプーリ作っておくしかない?
ちなみに環境はbcc+Terapad・・・
111: 02/08/15 17:23 ID:??? AAS
組み込みマクロ __LINE__ と __FILE__ を使う?

全部の行でなくブロック単位にトレース情報を埋め込むツールがあったような気がする・・・
112: 02/08/15 18:36 ID:??? AAS
>111
おぉ、それかも。
さんくす
1-
あと 166 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.009s