C言語なら俺に聞け(入門篇) Part 5

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2006/12/28(木) 20:19:18
古い規格の話って、初心者に良いとは思えないがな。
K&Rの、何がレベルが高いんだ?
著者のスキルは高いとは思うが、昔の規格や昔の仕様語るのは、ただの懐かし話。
953デフォルトの名無しさん:2006/12/28(木) 20:31:32
K&Rが書いたプログラミング言語Cの今の版はANSI C準拠のはず。
954デフォルトの名無しさん:2006/12/28(木) 20:50:42
質問があるまでだまっとれ
955デフォルトの名無しさん:2006/12/28(木) 21:14:18
初めまして。よろしくお願いします。
K&Rの演習5-10「コマンド行からの逆ポーランド式を計算するプログラムexprを書け。
各演算子あるいは被演算数は引数として分離されているものとする。例えば
expr 2 3 4 + *
なら,2×(3+4)を計算するようにせよ」の問題の「*」文字の
取り扱いについて教えてください。
「アンサーブック」のプログラムで試してみましたところ,
コマンド引数にワイルドカードの「*」が含まれているためか,
「\*」のようにエスケープしないと不定値として取り扱われてしまいます。
問題の条件は,「例えば expr 2 3 4 + * なら,2×(3+4)を
計算するようにせよ」なので,このコマンド引数の形式を忠実に守ろうと
した場合,どのような変更が必要になってくるのでしょうか。
ワイルドカードやエスケープシーケンスは,シェルでの評価に依存する可能性もあるかなあと
今のところ考えているのですが,そうだとすると,環境依存(処理系依存?)ということに
なってくるのでしょうか。
956952:2006/12/28(木) 21:56:37
>>953
なるほど。
レスありがとう。
957デフォルトの名無しさん:2006/12/28(木) 22:21:17
>>955
「外側でどうやって 2 3 4 + * の列を用意するかは様々」の一言で片付いてしまうわけだが
958デフォルトの名無しさん:2006/12/28(木) 22:44:14
シェルを変えてみればわくるかもよ
959955:2006/12/28(木) 22:49:18
>>957
レスありがとうございます。
同じ処理内容(逆ポーランド計算機)に対する引数を
ファイルにしておいた列からパイプで受け取ったり,
実行後に標準入力から受け取ったりする方法は,
K&Rではその該当演習問題の少し前のところ(邦訳で92ページ付近)で取り扱っています。
その流れからして,演習5-10ではコマンド引数を取り扱うことに
焦点が当てられていると思うのです。
コマンド引数としての「*」を,エスケープシーケンスを使わずに
不定値としてではなく,うまく受け取る方法があるものかなあという意味合いの質問です。
よろしくお願いします。
960デフォルトの名無しさん:2006/12/28(木) 22:52:35
""で囲め、 man すれ
961955:2006/12/28(木) 22:53:40
>>958
Visual Studio 2005コマンドプロンプトでcl使ってコンパイルして
やってみたところ,「*」がそのまま適切に受理されました。
ありがとうございます。
(やっぱり,何とか依存というやつなのかなあ...)
962デフォルトの名無しさん:2006/12/28(木) 22:57:52
ポインタで少数を間接参照するにはどうすればいいですか?
963955:2006/12/28(木) 23:01:45
>>960
それも手,,,と思ったりもするのですが,
やっぱり前述の問題の条件からはずれてくるような気がして。
(気分の問題かもしれませんが)

ちなみに,「アンサーブック」の解答例のルーチンですと,”op1 op2 op3”のような囲みで
複数の引数を与えると,きちんと複数個の引数には分けてくれませぬ。。。
””囲みで与えることを考えるのであれば,
「アンサーブック」よりもうちょっと手の込んだルーチンを書かねばならぬような感じが
いたします。
964デフォルトの名無しさん:2006/12/28(木) 23:03:17
いみわかんね
965デフォルトの名無しさん:2006/12/28(木) 23:03:51
>>962
意味がわからん、もうちょっと具体的に
966デフォルトの名無しさん:2006/12/28(木) 23:07:26
>>955
シェルの多くは * を合致するファイル名に展開する
シェルのオプションで * をファイル名に展開する機能を抑制するか、
エスケープシーケンスなどを使うことでシェルがファイル名に展開しないように指示する必要がある。

また、コンパイラによっては引数として * を受け取るとスタートアップルーチン内でファイル名に展開して、
main(int argc, char **argv) の引数として渡すものもある
967962:2006/12/28(木) 23:12:45
失礼いたしました・・

キーボードから入力した整数と少数をプラスした結果をポインタによる
間接参照をしようして入力、乗算、表示部分すべてでポインタを用いる
プログラムを作ろうと思うのですが
少数をポインタに代入する方法がわかりません
968デフォルトの名無しさん:2006/12/28(木) 23:12:58
>>940
人に質問したいのに、どうして
その質問に関わる一番肝心な部分を省略するのかなぁ・・・

そういえば、このスレにソースコードを貼り付ける奴って、
いつもそんな感じだな。

必ずといっていいほど、一番肝心な部分が「省略」されている。
969デフォルトの名無しさん:2006/12/28(木) 23:19:23
>>967
中途半端に専門用語が混ざるとわけわからん文章になる典型

それと小数、な
970デフォルトの名無しさん:2006/12/28(木) 23:20:38
彼はポインタの意味がわかっちょらんのだろ
971デフォルトの名無しさん:2006/12/28(木) 23:20:42
>>967
少数とはなにかって辺りから説明してくれたまえ。
972962:2006/12/28(木) 23:26:52
>>中途半端に専門用語が混ざるとわけわからん文章になる典型
課題プリントの文章ちょこっと削ったらこんな文章になりました。
>>少数とはなにかって辺りから説明してくれたまえ
少数じゃなくて小数でした
973955:2006/12/28(木) 23:30:01
>>966
ということは,やっぱりコンパイラやシェルの影響をかぶってしまう訳ですね。
「シェルのオプションで * をファイル名に展開する機能を抑制」できることは
初めて知りました。ありがとうございます。
974デフォルトの名無しさん:2006/12/28(木) 23:38:54
>>972
意味が分からんが言いたいことはこんな感じ?

***************************
キーボードから入力した整数と少数を加算した結果を出力する.
で、入力、乗算、表示部分すべてでポインタを行うプログラムを作りたい
しかし小数をポインタに代入する方法がわかりません
***************************

で、聞くけどまずポインタが何かは分かってるのか?
>入力、乗算、表示部分すべてでポインタを行う
この部分がどうしたいのかがよくわからん
それぞれを関数として実装して値はポインタ渡しってことか?
975974:2006/12/28(木) 23:39:44
アンカー間違えた

>>972じゃなくて>>967宛て

976962:2006/12/28(木) 23:51:00
レスありがとうございます。
ポインタの理解度は初心者程度です。
小数をポインタに代入する方法が分かりません。(まさにその通りです

先生が作った課題プリントですので推測で述べさせていただくと
ポインタとは別の変数を用意してそこに小数を代入し、
その変数をポインタに代入してポインタから代入、乗算、表示をする
という意味だと思います。ちなみに、関数はつかわなくておkです。
977デフォルトの名無しさん:2006/12/28(木) 23:55:27
文字列を一文字だけ書き換えたいのですが
ポインタを用いずに、配列で
char month[] = "January";
month[4] = 'E';
とすれば正常に動くのですが
ポインタを用いて 
  char *month = "January";
*(month+4) = 'E';
とするとエラーがでてしまいます。やっていることは同じだと思うのですが、
配列だけの場合とどう違うのでしょうか?
978デフォルトの名無しさん:2006/12/28(木) 23:58:47
>>977
書き換えてはいけない領域を書き換えようとしたのが原因と思われる。

次のようにすればおk
char buf[]="January";
char *month;
month=buf;
*(month+4)='E';
979974:2006/12/29(金) 00:00:42
>>976
>先生が作った課題プリント
これをうpしろ
うp出来ないなら出来るだけ原文を…
それと宿題をマル投げならするつもりならこっちな
http://pc8.2ch.net/test/read.cgi/tech/1166969820/
ポインタってのは実体のある場所をしめすものだ
double d; ←こっちが実体
double *p; ←こっちがポインタ
p = &d; ←dのある場所の情報を p に入れる
*p と d の内容は同じものとなる
つまり*p = 1.02 とすると d も1.02になる
980977:2006/12/29(金) 00:07:29
>>978
うまくいきました。ありがとうございます!
981ぼるじょあ ◆yBEncckFOU :2006/12/29(金) 00:11:11
>>952
(・3・) エェー おまい馬鹿じゃないかお? まさかそんなことを言って
          回答者やってるんじゃないだろうな、それともただの通りすがりの入門者かお?
982962:2006/12/29(金) 00:12:20
>>979
ありがとうございます!
すいませんポインタはint型じゃないと宣言できないと思い込んでいました(汗
丸投げするつもりはなかったのですが、とりあえずポインタに小数を
代入する方法を教えてもらいたくて・・・

ちなみに原文ですが僕がアップした内容とたいして変わりません
キーボードから入力した整数と小数(それぞれ一つずつ)を加算した結果を
表示するプログラムを、ポインタによる間接参照を用いて、作成せよ
(入力、数値変換、表示部分すべてでポインタを用いる)

なにはともあれありがとうございました!
983974:2006/12/29(金) 00:16:51
>>981
オマエのスレ見たけどえらそーなこと言うほど回答してないな
しかも変態だし…

686 名前:ぼるじょあ ◆yBEncckFOU [sage] 投稿日:2006/12/21(木) 21:30:41
(・3・) エェー 大沢あかねたんととアナ○セックスしたいなあ・・・切実だお
          最低で250万までなら余裕で出せるお
          肛○のなかに発射してしばらく挿入したままで余韻を味わって
          最後に中に放尿して引き抜いたそれをあかねたんの口できれいに
          掃除して貰いたいお・・・はあ・・・。
984ぼるじょあ ◆yBEncckFOU :2006/12/29(金) 00:23:37
(*>3<*) エェー もいらの誤爆レスをコピペしないでお
             ここで回答するつもりはないしお




             質問者はこちらへGOだお!ぼるじょあと名無しが
             親切ていねいに君たちの質問に答えるお!

ぼるじょあがC/C++の宿題を片づけますYO! 67代目
http://pc8.2ch.net/test/read.cgi/tech/1165718021/
985デフォルトの名無しさん:2006/12/29(金) 00:24:25
>>984
要するに宣伝かよw
986974:2006/12/29(金) 00:31:45
>>982
じゃあこんな感じかな?
int a,*pa;
double d,*pd;
double x,*px;
pa=&a;
pd=&d;
px=&x;
printf("整数値=");
scanf("%d",pa);
printf("実数値=");
scanf("%lf",pd);
*px = *pd + *pa;
printf("出力=%lf",*px);

987デフォルトの名無しさん:2006/12/29(金) 00:43:26
>>981
(・з・) エェー
なんで馬鹿と思ったか書かなきゃ訳わからないお
988962:2006/12/29(金) 01:00:02
>>986
回答まで教えて頂いてありがとうございます!
989デフォルトの名無しさん:2006/12/29(金) 01:01:17
次スレはどこですか?
990デフォルトの名無しさん:2006/12/29(金) 01:33:09
>>987
友達いないと構ってもらうためにこんなに必死になれるんだね
991デフォルトの名無しさん:2006/12/29(金) 01:43:08
元になる数『n個』から『m個』取り出す時の
組み合わせをだすプログラムなんですが、

自分で階乗も使ってつくってみましたが
おかしい結果になってしまいました。
ヒントをくれませんか?


#include <stdio.h>


int kaijo(int s);
int ncm(int n,int m);

int main()
{
/*num1 = 元になる数,num2 = 取り出す数*/
/*初期化*/
int num1 = 0,num2 = 0;

/*データの取得*/
printf("n= ");
scanf("%d",&num1);
printf("m= ");
scanf("%d",&num2);
/*結果表示*/
printf("x = %d",ncm(num1,num2));

}

続きます・・
992991 (2):2006/12/29(金) 01:44:44
上の続きです。

int ncm(int n,int m)
{
/*元になる数nと取り出す数mが同じ場合と、取り出す数が0の場合は組み合わせは1になる*/
if(n == m || m == 0)
{
return 1;
}
else
{
return ((kaijo(n-1) * kaijo(m-1)) + (kaijo(n-1) * kaijo(m)));
}
}

よろしくお願いします!
int kaijo(int s)
{
if(s < 0)
{
return 1;
}
else (s * kaijo(s-1));

}
993デフォルトの名無しさん:2006/12/29(金) 01:54:44
なにこのスレ文字化けだらけじゃん
994デフォルトの名無しさん:2006/12/29(金) 01:54:56
>>991
ヒント:

#include <stdio.h>

iint kaijo(int s)
{
if(s < 0)
{
return 1;
}
else (s * kaijo(s-1));
}

int main()
{
int i;
for (i=0; i<6; i++) {
printf("%d, %d\n", i, kaijo(i));
}
return 0;
}
995デフォルトの名無しさん:2006/12/29(金) 01:56:58
>>993
ちみだけじゃまいか?
996デフォルトの名無しさん:2006/12/29(金) 02:05:22
次スレたてておきました

C言語なら俺に聞け(入門篇) Part 6
http://pc8.2ch.net/test/read.cgi/tech/1167325490/
997デフォルトの名無しさん:2006/12/29(金) 02:06:31
あらあら
998デフォルトの名無しさん:2006/12/29(金) 02:14:52
おやおや
999デフォルトの名無しさん:2006/12/29(金) 02:19:07
>>993
自分の環境くらい整えとけよ
1000デフォルトの名無しさん:2006/12/29(金) 02:19:49
1000ごっと
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。