古い規格の話って、初心者に良いとは思えないがな。
K&Rの、何がレベルが高いんだ?
著者のスキルは高いとは思うが、昔の規格や昔の仕様語るのは、ただの懐かし話。
K&Rが書いたプログラミング言語Cの今の版はANSI C準拠のはず。
質問があるまでだまっとれ
初めまして。よろしくお願いします。
K&Rの演習5-10「コマンド行からの逆ポーランド式を計算するプログラムexprを書け。
各演算子あるいは被演算数は引数として分離されているものとする。例えば
expr 2 3 4 + *
なら,2×(3+4)を計算するようにせよ」の問題の「*」文字の
取り扱いについて教えてください。
「アンサーブック」のプログラムで試してみましたところ,
コマンド引数にワイルドカードの「*」が含まれているためか,
「\*」のようにエスケープしないと不定値として取り扱われてしまいます。
問題の条件は,「例えば expr 2 3 4 + * なら,2×(3+4)を
計算するようにせよ」なので,このコマンド引数の形式を忠実に守ろうと
した場合,どのような変更が必要になってくるのでしょうか。
ワイルドカードやエスケープシーケンスは,シェルでの評価に依存する可能性もあるかなあと
今のところ考えているのですが,そうだとすると,環境依存(処理系依存?)ということに
なってくるのでしょうか。
956 :
952:2006/12/28(木) 21:56:37
>>955 「外側でどうやって 2 3 4 + * の列を用意するかは様々」の一言で片付いてしまうわけだが
シェルを変えてみればわくるかもよ
959 :
955:2006/12/28(木) 22:49:18
>>957 レスありがとうございます。
同じ処理内容(逆ポーランド計算機)に対する引数を
ファイルにしておいた列からパイプで受け取ったり,
実行後に標準入力から受け取ったりする方法は,
K&Rではその該当演習問題の少し前のところ(邦訳で92ページ付近)で取り扱っています。
その流れからして,演習5-10ではコマンド引数を取り扱うことに
焦点が当てられていると思うのです。
コマンド引数としての「*」を,エスケープシーケンスを使わずに
不定値としてではなく,うまく受け取る方法があるものかなあという意味合いの質問です。
よろしくお願いします。
""で囲め、 man すれ
961 :
955:2006/12/28(木) 22:53:40
>>958 Visual Studio 2005コマンドプロンプトでcl使ってコンパイルして
やってみたところ,「*」がそのまま適切に受理されました。
ありがとうございます。
(やっぱり,何とか依存というやつなのかなあ...)
962 :
デフォルトの名無しさん:2006/12/28(木) 22:57:52
ポインタで少数を間接参照するにはどうすればいいですか?
963 :
955:2006/12/28(木) 23:01:45
>>960 それも手,,,と思ったりもするのですが,
やっぱり前述の問題の条件からはずれてくるような気がして。
(気分の問題かもしれませんが)
ちなみに,「アンサーブック」の解答例のルーチンですと,”op1 op2 op3”のような囲みで
複数の引数を与えると,きちんと複数個の引数には分けてくれませぬ。。。
””囲みで与えることを考えるのであれば,
「アンサーブック」よりもうちょっと手の込んだルーチンを書かねばならぬような感じが
いたします。
いみわかんね
>>955 シェルの多くは * を合致するファイル名に展開する
シェルのオプションで * をファイル名に展開する機能を抑制するか、
エスケープシーケンスなどを使うことでシェルがファイル名に展開しないように指示する必要がある。
また、コンパイラによっては引数として * を受け取るとスタートアップルーチン内でファイル名に展開して、
main(int argc, char **argv) の引数として渡すものもある
967 :
962:2006/12/28(木) 23:12:45
失礼いたしました・・
キーボードから入力した整数と少数をプラスした結果をポインタによる
間接参照をしようして入力、乗算、表示部分すべてでポインタを用いる
プログラムを作ろうと思うのですが
少数をポインタに代入する方法がわかりません
>>940 人に質問したいのに、どうして
その質問に関わる一番肝心な部分を省略するのかなぁ・・・
そういえば、このスレにソースコードを貼り付ける奴って、
いつもそんな感じだな。
必ずといっていいほど、一番肝心な部分が「省略」されている。
>>967 中途半端に専門用語が混ざるとわけわからん文章になる典型
それと小数、な
彼はポインタの意味がわかっちょらんのだろ
>>967 少数とはなにかって辺りから説明してくれたまえ。
972 :
962:2006/12/28(木) 23:26:52
>>中途半端に専門用語が混ざるとわけわからん文章になる典型
課題プリントの文章ちょこっと削ったらこんな文章になりました。
>>少数とはなにかって辺りから説明してくれたまえ
少数じゃなくて小数でした
973 :
955:2006/12/28(木) 23:30:01
>>966 ということは,やっぱりコンパイラやシェルの影響をかぶってしまう訳ですね。
「シェルのオプションで * をファイル名に展開する機能を抑制」できることは
初めて知りました。ありがとうございます。
>>972 意味が分からんが言いたいことはこんな感じ?
***************************
キーボードから入力した整数と少数を加算した結果を出力する.
で、入力、乗算、表示部分すべてでポインタを行うプログラムを作りたい
しかし小数をポインタに代入する方法がわかりません
***************************
で、聞くけどまずポインタが何かは分かってるのか?
>入力、乗算、表示部分すべてでポインタを行う
この部分がどうしたいのかがよくわからん
それぞれを関数として実装して値はポインタ渡しってことか?
975 :
974:2006/12/28(木) 23:39:44
976 :
962:2006/12/28(木) 23:51:00
レスありがとうございます。
ポインタの理解度は初心者程度です。
小数をポインタに代入する方法が分かりません。(まさにその通りです
先生が作った課題プリントですので推測で述べさせていただくと
ポインタとは別の変数を用意してそこに小数を代入し、
その変数をポインタに代入してポインタから代入、乗算、表示をする
という意味だと思います。ちなみに、関数はつかわなくておkです。
文字列を一文字だけ書き換えたいのですが
ポインタを用いずに、配列で
char month[] = "January";
month[4] = 'E';
とすれば正常に動くのですが
ポインタを用いて
char *month = "January";
*(month+4) = 'E';
とするとエラーがでてしまいます。やっていることは同じだと思うのですが、
配列だけの場合とどう違うのでしょうか?
>>977 書き換えてはいけない領域を書き換えようとしたのが原因と思われる。
次のようにすればおk
char buf[]="January";
char *month;
month=buf;
*(month+4)='E';
979 :
974:2006/12/29(金) 00:00:42
980 :
977:2006/12/29(金) 00:07:29
>>978 うまくいきました。ありがとうございます!
>>952 (・3・) エェー おまい馬鹿じゃないかお? まさかそんなことを言って
回答者やってるんじゃないだろうな、それともただの通りすがりの入門者かお?
982 :
962:2006/12/29(金) 00:12:20
>>979 ありがとうございます!
すいませんポインタはint型じゃないと宣言できないと思い込んでいました(汗
丸投げするつもりはなかったのですが、とりあえずポインタに小数を
代入する方法を教えてもらいたくて・・・
ちなみに原文ですが僕がアップした内容とたいして変わりません
キーボードから入力した整数と小数(それぞれ一つずつ)を加算した結果を
表示するプログラムを、ポインタによる間接参照を用いて、作成せよ
(入力、数値変換、表示部分すべてでポインタを用いる)
なにはともあれありがとうございました!
983 :
974:2006/12/29(金) 00:16:51
>>981 オマエのスレ見たけどえらそーなこと言うほど回答してないな
しかも変態だし…
686 名前:ぼるじょあ ◆yBEncckFOU [sage] 投稿日:2006/12/21(木) 21:30:41
(・3・) エェー 大沢あかねたんととアナ○セックスしたいなあ・・・切実だお
最低で250万までなら余裕で出せるお
肛○のなかに発射してしばらく挿入したままで余韻を味わって
最後に中に放尿して引き抜いたそれをあかねたんの口できれいに
掃除して貰いたいお・・・はあ・・・。
986 :
974: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);
>>981 (・з・) エェー
なんで馬鹿と思ったか書かなきゃ訳わからないお
988 :
962:2006/12/29(金) 01:00:02
>>986 回答まで教えて頂いてありがとうございます!
次スレはどこですか?
>>987 友達いないと構ってもらうためにこんなに必死になれるんだね
元になる数『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));
}
続きます・・
上の続きです。
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
なにこのスレ文字化けだらけじゃん
>>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;
}
あらあら
おやおや
1000ごっと
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。