750 :
デフォルトの名無しさん :
2007/01/21(日) 21:44:51 int main() なら、関数として戻り値が定義されてる以上returnステートメントがいる。 ちなみに、0を返せば正常終了、それ以外は異常終了とみなされるはずです。 void main(void) なら、組み込み系(自分は書いたこと無いが)とかだと、一度立ち上げたら ずっと動かすためにvoidを使ってソースを書くらしい。
>>749 int main()
{
・・・・・・・・・・・・
・・・・・・・・・・・・
return 0;
}
システムに渡されるコード(戻り値)は何になる?
return がなかったら戻り値は何になる?
いいか、プログラムを呼び出す奴に戻り値を返す必要がある場合があるだろ? 失敗とか成功とか main()の戻り値はそーゆー時に必要なんぢゃよ
おききしたいのですが 出力は1文字づつで 縦7横15の*の平行四辺形をかくにはどうすればいいんでしょうか *************** *************** *************** *************** *************** *************** *************** *************** バージョンとこのはんたいバージョンなんですが 2重るーぷをつかわなければいけないんですけど 縦のループのあと横のループはわかるんですけど 縦にうつるときがわかりません ちなみに使用できるのはfor,while,int,printfです
>>753 int main()
{
int i,k;
for(i=0;i<7;i++){
for(k=0;k<15;k++){
printf("*");
}
printf("\n");
}
return 0;
}
とこのはんたいバージョンって?
int main()
{
int i,k;
for(i=0;i<15;i++){
for(k=0;k<7;k++){
printf("*");
}
printf("\n");
}
return 0;
}
こういうこと?
>>753 >>754 に手を加えた
#include<stdio.h>
int main(void){
int i,k;
for(i=0;i<7;i++){
for(k=0;k<i;k++) printf(" ");
for(k=0;k<15;k++) printf("*");
printf("\n");
}
printf("\n");
for(i=0;i<7;i++){
for(k=0;k<7-1-i;k++) printf(" ");
for(k=0;k<15;k++) printf("*");
printf("\n");
}
return 0;
}
757 :
749 :2007/01/21(日) 22:20:34
うーむスマン真性初心者なんで皆の言ってることも分からん。 戻り値という事の意味も分からないんだ。 今までint main(void)と書いて、最後にreturn 0;と意味も分からず書いてきたんだが 自分で関数を作るとこまで来て、例えば累乗計算の関数を書くとき int ruijo(int a, int b) { int n, ans; ans = 1; for(n = 1; n <= b; n++){ ans = ans * a; } return ans; } と本に書いてあるんだが、今までreturn 0;と書いてきたが今度はreturn ans; になってて、今までと同じreturn 0;じゃダメなのか、と思ってるんだ。 要するに戻り値というのを分かりやすく教えてほしい。
759 :
デフォルトの名無しさん :2007/01/21(日) 22:29:13
>>757 int main(void)というのは引数を取らずに関数呼び出し元にint型の値を返すってこと
だからint ruijo(int a, int b)はint型の値を二つ取り」、int型の値を返すってこと
そこで、関数で戻る時(return)にint型であるansを返している。
return 0;ってのは正常終了をシステムに伝えてる、はず
>>757 たとえばこんな関数があったとする
int nibai(int x)
{
int y;
y= 2 * x;
return y; @
}
int a;
a=nibai(10);・・・A
関数 nibaiに 10 という数字を与えると
関数 nibai は 2×10=20 という計算をしてそれを返すわけだが
戻り値ってのは @で返した値が呼び出したAに戻ってくるというもの
a には 20 が入る
これで分かるかな?
761 :
デフォルトの名無しさん :2007/01/21(日) 22:36:58
>>757 そのruijoという関数には値の受け渡しの箱が3つあると思いなされ。
コールする時はint aとint b、実行終了したら結果がint ruijo()として戻ると。
コールする側で kekka = ruijo(2, 3); とか書いてると思うが、これは関数コールであるとともに代入文でもある。
762 :
754 :2007/01/21(日) 22:37:12
763 :
デフォルトの名無しさん :2007/01/21(日) 22:39:20
>>762 >>755 ありがとうございます!
初心者ですみませんがreturn0って必要なんでしょうか
これなしになぜかコンパイルできるんですが・・・
765 :
754 :2007/01/21(日) 22:52:12
>>763 void main()
になってるんじゃない?
766 :
デフォルトの名無しさん :2007/01/21(日) 22:55:15
>>764 なるほどありがとうございます!
>>765 そうです!void main(void)
ではじめます
767 :
デフォルトの名無しさん :2007/01/21(日) 22:59:53
あともうひとつおききしたいのですが 直角三角形をかくときに最初に高さを入力するけいしきなんですが scanfで入力はいいんですが scanfの関数を縦のループにつかうんでしょうか? これも ーーーーーー | / | / | / | / |/ |\ | \ | \ | \ | \ ===== の形を*でつくりたいんです
768 :
754 :2007/01/21(日) 23:14:47
>>767 どやー
#include<stdio.h>
int main(void){
int i,k,height;
printf("入力(n)=");
scanf("%d",&height);
for(i=1;i<=height;i++){
for(k=i;k<=height;k++) printf("*");
printf("\n");
}
for(i=1;i<=height;i++){
for(k=i;0<k;k--) printf("*");
printf("\n");
}
return 0;
769 :
754 :2007/01/21(日) 23:15:53
あっ return 0; のあとに } つけてね
770 :
デフォルトの名無しさん :2007/01/21(日) 23:18:31
>>768-
>>769 なるほど・・・やっぱりスキャンフの関数を
そのままつかうんですね
ありがとうございます!
多倍長演算の仕方がわかりません。 ライブラリの使い方からさっぱりです。どなたか教えていただけませんか?
772 :
756 :2007/01/21(日) 23:35:27
スレ違いでした?
773 :
771 :2007/01/21(日) 23:36:45
ごめんなさい事故解決しました
>>772 スレ違いとは思わないが、プログラムの質が低すぎて読む気にもなれないだけ。
775 :
754 :2007/01/21(日) 23:41:58
776 :
756 :2007/01/21(日) 23:57:20
>>774 質が低い質問に答えてくれるとおもって入門篇にきたんです・・・
>>775 いえ、一応宿題ってわけではないんでそっちに行ってないです。
宿題スレで聞いたほうが良いですか?
>>776 ・他人の書いたソースなら、書いた本人に解説して貰え。
・そもそも勝手に晒していいのか?
・疑問点を聞きたいのなら、聞きたいポイントを指定しろ。
779 :
754 :2007/01/22(月) 00:09:46
>>776 >>778 が言うとおりだと思う
すべてにコメントつけるなんて無理
で、キミがどこが分からないのか、こっちはそれも分からない
どーしてもソースを理解したいならまず分解してすこしずつ稼動する範囲を広げていくのがいい
と、言っても難しいかなぁ
>>777 小数点以下7桁目まで表示したいなら、8桁目を四捨五入すれば?
printf()も指定桁の一つ下で四捨五入していることだし。
つーか、この関数を作った理由は勉強のため?
まさか"%.7f"を知らないってわけじゃないよね?
781 :
777 :2007/01/22(月) 00:12:00
>>778 >>776 って書いてあるけど文章の内容から推測して私のことですか?
そうだとしたら。
・これは自分で書いたソースですが、自分で書いたソースを勝手に晒す事は違法ですか?
・疑問点は小数部分を文字列に変換する際に誤差が生じてしまう原因とその対処法です。
782 :
777 :2007/01/22(月) 00:14:09
>>780 勉強じゃなくてファイルに出力するためです。
ありがとうございました。
早速改造してみます。
783 :
754 :2007/01/22(月) 00:15:36
>>777 具体的にどの実数を与えたとき?
だれかに検証もとめるなら成功するときと成功しないときのテストケースぐらい書いて
784 :
754 :2007/01/22(月) 00:16:46
>>780 便乗ですみませんが、"%.7f"について説明されてるサイトを教えてください。
786 :
756 :2007/01/22(月) 00:19:49
>>778 >>779 質問がアバウトすぎたんですね。失礼しました。
mainのdo-while文の中身のy--;やx--;、if文の条件と
reverseの中のif文がどういうときで場合分けしてるのか
についてお願いします。
>>782 >>780 =778だけど、>784の言う通り君宛じゃない。
勉強のためじゃないのなら、無駄な努力をする必要はない。
fprintf()で"%.7f"するか、sprintf()で"%.7f"したものをfputs()すればいい。
あーそうそう、誤差が生じる原因は、小数をdoubleで表現すると循環小数になって誤差が生じるため。
789 :
785 :2007/01/22(月) 00:30:55
ありがとうございます。 発見しました。
790 :
754 :2007/01/22(月) 00:47:43
>>786 >mainのdo-while文の中身のy--;やx--;、
scanf による入力は1〜8、しかし配列のインデックスは0〜7なので -1 してる
>reverseの中のif文がどういうときで場合分けしてるのか
文で説明するのは難しいんだが(苦手)
まずreverseの最後の引数(整数)は以下の意味があると覚えておく(仮に方向番号とする)
「1: 左下 2: 下 3: 右下 4: 左 6: 右 7: 左上 8: 上 9: 右上」
この引数はその方向のマスをチェックしていくと言う意味になる
で、オセロの動作を考えて欲しい
1.まずユーザがマスを選択する(scanf入力)
2.ユーザが指定したマスが空いているマスかチェック(if(brd[y][x] == -1))
3.reverseの方向番号が指定する最初のマス(ユーザが4.4を指定して方向番号が7(左上)なら3.3となる)が自分の持ってる石かチェック (仮に方向チェックとする)
4.3.が相手のマスであるならさらに次のreverseを呼び出す(方向番号がさす方向、上の例だと2.2をチェック)
5.3.4を繰り返す
6.自分の持ってるマスに行き着いたら自分の石の色の数値を返す(再帰的に呼び出しているので4.5.でチェックしたマスに自分の石の色が入ることになる)
mainからの
最初のreverse呼び出しがあるif文はユーザ指定のマスから方向番号により方向チェックをする
チェックの結果、相手の石ならその方向を再帰的に調べ、自分の石が見つかるか空いたあマスまで繰り返す
自分の石が見つかったならチェックしてきたマスを戻りながら自分の石にしていく
空いたマスなら相手の石の色を返すことによって石を取れない(エラー)としている
石を取れた場合、ユーザ指定のマスへの自分の石を置く
取れなかった(エラー)場合、なにもしないでユーザ入力に戻る
長文なので誤字脱字があるかも知れん
791 :
754 :2007/01/22(月) 00:53:36
>>786 プログラムの概要は↑
んで当初の質問は
>reverseの中のif文がどういうときで場合分けしてるのか
つまり石を置いた場所からそれぞれの方向に対して相手の石を取れるかチェックし、取れると判断できたなら相手の石を自分の石に変えていく
そして、方向は「1: 左下 2: 下 3: 右下 4: 左 6: 右 7: 左上 8: 上 9: 右上」 の8方向だから
if文も8つあるわけだ
792 :
754 :2007/01/22(月) 00:58:46
ここまで書いてやったのに当の質問者はすでに寝てます・・・・・だったら許せんな つか俺が眠い
793 :
756 :2007/01/22(月) 01:05:45
すみません、必死に説明とプログラムを交互に見比べてました。 眠いのに詳しく書いていただいてすみません。 引き続き読んできます。ありがとうございました
794 :
754 :2007/01/22(月) 01:14:19
>>793 いや、起きてたから俺的には許しちゃる
まぁわかんなきゃまた質問しな
ただし、ちゃんとどこがどー分からないのかを書くこと
具体的にってのは無理だと思うけど、せめてここはどういう意味か?どーしてこうなるのか?とかさ
でなければ答えようがないからな
まーがんばれ
んじゃ、オヤスミ
795 :
デフォルトの名無しさん :2007/01/22(月) 01:24:20
ポインタのポインタのポインタのポインタのポインタのポインタ
君のおかげで間違ってブックマークしていたことに気付いた ありがとう そして さようなら
ポインタポインタ
あれ、まだ消えてなかったのか んじゃ
799 :
デフォルトの名無しさん :2007/01/22(月) 03:04:47
アルゴリズムの質問っておk?
800 :
デフォルトの名無しさん :2007/01/22(月) 03:05:39
おk
801 :
タケ :2007/01/22(月) 04:37:23
教えて欲しいことがあります。 「char *fgets(char *s, int size, FILE *stream);」であるfgets()についてですが、 fgets()においてキーボード入力にするにはストリームになんと記述すればいいのでしょうか?
>>801 標準入力にキーボードが向けられてるならFILE *にstdin。
あと名前入力しなくていい。しない方がいい。
803 :
デフォルトの名無しさん :2007/01/22(月) 12:55:43
c言語勉強してるのですが 肝心のコンパイラが使えません・・・Borland++compilerってのつかってるんですけど c:\sampleディレクトリーに保存するらしいんんですけど c:\sampleディレクトリーってなんですか? 超初歩な質問ですけど 独学でやってるせいで全然わかりません・・教えてください お願いします
>>803 C言語の前にOSの勉強からしたほうがいいと思うよ。
805 :
デフォルトの名無しさん :2007/01/22(月) 15:51:01
>>803 左下の「スタート」を押して「全てのプログラム」を押して「アクセサリー
」を押して「エクスプローラー」を選ぶ。
エクスプローラーが開いたら画面の左側にフォルダ一覧が表示されていると思う。
その中に「マイコンピューター」と言うのがあるはず。
それを押すと「ローカルディスク(C:)」と言うのがあるはず。
そのローカルディスク(C:)に「sample」というディレクトリーを作る。
ちなみにディレクトリーを理解するには、まず家を考えて欲しい。
家には部屋がある。ローカルディスクが「家」、ディレクトリーが「部屋」と思ったらいい。
パソコンを使っているといろんなファイルやプログラムが増えてくる。
それを整理整頓するために、分かりやすい名前の部屋を好きなだけ作って、そこにファイルなどを入れていくわけだ。
で、今はまだローカルディスク(C:)には「sample」ディレクトリーは無いはず。
作り方は、まず先ほどのエクスプローラーのローカルディスク(C:)をマウスでクリックして
一番左上にある「ファイル(F)」を選んで、そこに「新規作成」が一番上にあるはず。
そこに「フォルダ」があるのでそれを選ぶ。その名前を「sample」にする。
まぁsampleじゃなくても好きな名前でいいけれどね。
それとフォルダはディレクトリーの別名です。
これでわかるかな?
・・・・ひょっとしておいらは思いっきり釣られてしまったのかな。
クジラ飛行机氏がテレビに出る模様
TV初出演!1/22(月)放送予定! 20:42
ウノウ(株) (
http://unoh.net ) の開発合宿がTV取材されました!
開発合宿の模様をテレビ東京さんに取材していただきました。
「ワールドビジネスサテライト」テレビ東京系列(
http://www.tv-tokyo.co.jp/wbs/ )
1/22(月)23:00〜にて放送される予定です。
たぶん、私は温泉のシーンでセミヌードが、映るのではないかと思います。
>>805 釣られたって言うか、思いっきり鼬害。
仮に釣りじゃないとしても、>803に理解できると思えないが。
"%s0"と"%s1"をいれたプログラムがあるんだけど どういう意味かわかりますか? %sの後ろに数字をいれるのは
>>808 特に意味はないな。
単純に文字列の後ろの数字を書きたいだけじゃね?
Ex.
printf("%s0", "321"); // ⇒3210
0なら0を表示 1なら1を表示
811 :
デフォルトの名無しさん :2007/01/22(月) 17:03:21
805>>ありがとうございます ローカルディスクに「sample」を作って コマンドプロンプトに【cd sample】と打ったら【バスが見つかりません】と出てしまいました 何回も質問して本当に申し訳ないのですが 今度はどうすればいいのでしょう?
813 :
デフォルトの名無しさん :2007/01/22(月) 17:37:52
811です 本当に聞いてばかりですいません コマンドラインはなんとかなったのですが ファイルの【名前.c】でsampleに保存してもコンパイルできません どうすればコンパイル できますか?
>コンパイルできません 何をしたらどういう風になってコンパイルできなかったのかな?
816 :
デフォルトの名無しさん :2007/01/22(月) 18:05:44
815>> 805さんのいうとおりsampleというディレクトリーを作ったあと コマンドプロンプト でカレントディレクトリーを【cd sample】と打って変更してsammpleに【ファイルの名前.c】で保存しても コンパイルされなくて ためしにソースコードそのまま貼ってみたら【〜は内部コマンド または外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません】 とでてきます・・ いったいどうやったらコンパイルできるのでしょう?
817 :
754 :2007/01/22(月) 18:05:48
コンパイルできないんじゃなくて sampleをフォルダが作れないから何にもできないってだけだろうな
ってゆーかここC言語のスレだろ それはUNIXとかwindowsのコマンドプロンプトの話でしょ。 全く関係ないw
その昔MS-DOSをみんな使ってたころは こういう初歩的なことを理解しないとPCをまともに使えなかったんだよな。
ここでFM-TOWNSを使っていた俺が華麗に登場。
821 :
754 :2007/01/22(月) 18:10:36
まぁ右も左も分からない人に買わせてこそシェアも広がったわけだし、MSは
>>816 コンパイルのやり方は環境依存なので、それぞれのコンパイラのスレで聞いてくれ
ハフマン記号を作るプログラムを今作ってるんだが ややこしくて頭がてんぱってきたからこのスレみたら あの質問
ソースコードを保存しただけで勝手にコンパイルしてくれる素敵なスレはここですか? この初心者君は何でもいいからC言語の初心者本を買ってきて読んだ方がいい。 Cの質問ってレベルじゃねーよ。
Cインタープリタなら、ソース保存だけでも… ま、希少種だな
だ、だから学校ではC MACHINEを使ってたのか。
828 :
754 :2007/01/22(月) 18:33:15
そういえば高校のときポケコンってあって アレCインタプリタだったな あれからCが好きになったんだ
質問です 元金と年利を入力し、複利計算をするときに 元金が2倍をこえるのに要する年数と、その時点元利合計をもとめて 利息計算は円未満切捨てなのですが 実数をintがたにキャストしてint型変数として代入すればいいともうのですが・・・ ちなみに複利は 元金1000円年利10%で りそく 元金合計 1ねんご 100(1000*10%) 1100 2年後 110(1100*10%) 1210 といった計算です
何が質問なのか全くわからんw
>>830 すみませんw
この計算プログラムをつくりたいんです
>>831 結局何を聞きたいのかわからん。
円未満切捨てで扱う数が整数のみでいいなら
int同士で計算すれば加減乗除の計算結果は
キャストするまでもなく全部intになる。
>>832 年利のときに小数点をつかうからdoubleじゃないとだめじゃないんですか?
834 :
805 :2007/01/22(月) 19:15:57
>>816 よしっ!!もう一度釣られるぞ!!イヤッホッー!!
cd sampleでsampleディレクトリに入ったら、画面に
C:\sample>
ってなっていると思う。そこに
[コンパイルしなさいという命令文][スペース][ファイル名].c
と打てばいい。
例えば命令文が bcc32 でファイル名が reidai と言うものならば
画面には
C:\sample>bcc32 reidai.c
となるように打ち込み、リターンキーを押す。
でコンパイルできるはず。
ただ命令文が何なのかはそのコンパイラに拠るからそれは自分で調べてほしいのだが・・・できるか?
>>833 そのように計算式を立てれば、そうなる。
全て整数型でやろうと思えばできなくもない。
836 :
754 :2007/01/22(月) 19:20:55
そもそもパスが通ってないってこと無いよな
>[コンパイルしなさいという命令文][スペース][ファイル名].c 間違い。
839 :
デフォルトの名無しさん :2007/01/22(月) 19:25:14
#include <stdio.h> int main(void) { double r=0.1; int base = 1000; int risoku; for(risoku = 0 ; base < 2000 ;) { risoku += base*r; base += risoku; printf("risoku = %d\n",risoku); printf("base = %d\n",base); } return 0; } 複利計算ってこれでいいんだっけ?
840 :
805 :2007/01/22(月) 19:29:07
あっそうか、パス自体通していないのか? 命令文というのは間違いか。
841 :
754 :2007/01/22(月) 19:30:47
>>840 だって実行可能ファイル、プログラムだし bcc32は
入門書も古いと対象読者が慣れてるだろうGUIでできることまでわざわざCUIで書いてるからなぁ 環境変数にパスセットするだけのバッチファイルも奈にやってるか分から無かったですよ、ええ
>>842 昔はそういうことはPCを触った段階で覚えなきゃ話にならんかったのよ。
そういう時代に書かれた本の対象読者はCUIに慣れてたのさ。
過去を現在の常識で評価するなんてまるで朝鮮人みたいだな。
いや、まあ2000年入ってからの本なんですけどね どうやら書き方が悪かったようで、すんません
>>844 こちらこそ早とちりしてすまんかった。
90年代前半を想像してたんだが。
今ひどいジェネレーションギャップを見た。
記念カキコ..._〆(゚▽゚*)
ノードを使ってハフマン記号をつくるプログラム作りたいんだけど 0.8 0.3 0.1 0.06 0.03 とかから計算はできるんだが0と1での表し方がわからないんですけど。
小数を二進数で表示したいってこと?
851 :
754 :2007/01/22(月) 21:05:13
>>850 ハフマン木が出来てるならrootから辿って
符号を割り当てていくのが普通だと思うんだが。
というか俺は学校の課題ではそうした。
>>850 URL削ったらそこのサイト面白いな。
何か得した気分だ。
作りました。 木の根の部分にポインタがさしてる状態です。 ここから一番下までポインタを動かして 一番下から下の2つずつに0と1をつけていってから ・・・ 考えれば考えるほどこんがらがってくる
>>854 木のデータ構造をどんな表現にしてるからわからないから出来ないかも知れないけど
rootから全てのleafまで走査していく過程で左に行ったら1付加、右にいったら0付加でいいんじゃないの。
そんな難しく考える事じゃない。そのサイトで言うなら
"A"に行く走査→rootから左で到着→1
"B"に行く走査→rootから右→左で到着→01
・
・
・
"H"に行く走査→rootから右→右→右→右→右→右で到着→000000
856 :
754 :2007/01/22(月) 21:23:37
>>854 どして?
>>855 と大差ない説明だけど(説明下手だからわかんなかったらこっちは見なくても・・・)
木はどういう構成なの?つまり(サイトの場合)rootに対して左側が確率が高く右側が低いよね.
再帰処理使うといいよ.
そして現在通過した枝の数字を記憶させておく
だからrootからまず左を辿る.rootからAの赤点までだから Aは 1
次にひとつ戻って今度は右の枝に向かう 通過した枝は今は 0 だよね
節についてもまだ枝があるから、こんどもまた左の枝に向かう 0 1
ここで葉についたからBは01
次にひとつ戻って今度は右の枝に向かう 0 0
するとまた節にたどりつくのでその左を・・・・・
って感じでやればいいと思うけど
いやこれ昇順、降順で値がかわってくるから
短いやつならいいけど
長いやつを入力したら値が違うんだよね。
つくったやつで試しても
>>850 のページの結果にならない・・・
>>857 俺の頭が悪いからかもしらんけど
君が何を言っているのかわからない
859 :
754 :2007/01/22(月) 23:13:44
>>857 だから最初にソートするんだよ
それから確率の小さい方から木を構成していくの
で、0 1 付加するのはrootから
860 :
754 :2007/01/22(月) 23:17:46
>>857 可能ならソースをアップして
そのほうがコメント付けやすい
>>859 はちょっと勘違いしてレスしたけど
確率の大きい順にソートするでしょ
あとは確率の値は必要ないの
木の構成で必要なのは「順番」だけ
code wordの生成に必要なのは木だけ
確率の値は必要ない
わかりました。 迷惑かけてすいませんでした。 書いてたプログラムをニ分木で全部書いたら みなさんがいってたことがわかりました
862 :
754 :2007/01/22(月) 23:48:19
>>861 迷惑だなんて思ってません
少なくとも自分は、
おもしろそーなサイト教えてくれたしね
がんばってね
863 :
デフォルトの名無しさん :2007/01/22(月) 23:50:49
多言語との複合なのですが、 VBで作ったフォームAのボタンクリックで、 Cで作ったexeファイルを実行させてその結果を フォームAのテキストボックスに表示させるには どうしたらよいのですか?
864 :
デフォルトの名無しさん :2007/01/22(月) 23:51:11
ちなみにハフマンを学校でならったとか書いているけど、大学か専門学校で習うの? まさか高校で・・・。(((゜Д゜)))
データ構造のプログラムを書くための参考書があったんだけどない。。。 左のポインタがNULLになるまで左をすすめ 右のポインタがNULLになるまで右をすすめる。 これを再帰的にやったらいいんですかね? 問題はどう0と1を付加していくかだな。
入力された文字列がファイルパスとして正しいか、を調べたいです。 単に指定された文字列のファイルが開けなかったから不正、ではなく、 Windows のパスとして不正な文字列 <>: 等、 エクスプローラで指定するとエラーになるケースを判別したいです。 すみませんが、皆さんのお知恵を貸してください。
>>863 リダイレクトとパイプ。知ってる単語連ねただけだ。
868 :
754 :2007/01/23(火) 01:37:45
>>865 ん〜〜なんか違うような.
http://ja.wikipedia.org/wiki/2%E5%88%86%E6%8E%A2%E7%B4%A2%E6%9C%A8 この図で説明すると
今8にいるのね
で左がNULLになるまで進む(1までいっちゃう)
次にひとつ上に戻る.3にもどるの
3から今度は1つだけ右にいく.6に行くわけね
6からはまた左にNULLまで進む(4にいくのね)
そしたらまた次にひとつ上に戻る.つまり6にもどる
6からは1つだけ右に行く.7ね.ここで7は左も右もNULLだから上に戻るの
6に戻る.3に戻る.8に戻る
したら今度は8からひとつだけ右に行く(10ね)
10からは左にNULLまで・・・・って言うのを繰り返す
ってゴメン.いまさらながら勘違いしてた
木の生成方法だけどひとつ連結(アルファベットを結ぶ)するたびにソートが必要だった
ゴメンナサイ
どーしよ.説明したほうがいい?
>>866 それはこのスレで扱うべき話題ではないと思う。
どこかWindowsのプログラミング関連のスレできくべき。
870 :
754 :2007/01/23(火) 02:00:05
>>865 あーーーごめんなさいぃー
リンクもダメだった
直接リンク踏んでも正常に飛ばないから
一回リンクをコピーしてからブラウザのアドレスに貼り付けて移動して・・・
それから、木の生成方法だけど説明が必要なら言ってください
うまく説明する自信は無いけど・・・
でも、今日は寝ます.寝ちゃいます
普通に飛ぶけど?
872 :
デフォルトの名無しさん :2007/01/23(火) 03:46:28
void a(char str[]) { *str=str[1]+('A'-'a'); } int main(void) { char str[10]; strcpy(str,"abcdefg"); a(str); printf("%s\n",str); return (0); } これの*str=str[1]+('A'-'a')の意味ががよくわからないんですけど、 教えてくださいませんか
>>872 str[0]=str[1]+('A'-'a');
先頭の文字を2文字目を大文字にしたものに置き換えてる。
>>873 即レスありがとうございました!
これですっきりねれますw
toupper()の方が行儀よいんだけどな
>>863 EXEの出力をファイルに落とし、VBではそのファイルから読み込んでやるのが一番楽かな。
具体的な方法は該当スレでどうぞ。
charを初期化する方法って何かありますか? char text[10] for(i=0;i<10;i++) { text[i]=' ' } みたいな原人のような方法しか思いつきません・・・しかも初期化とは言い切れないorz
おれも寝てしまいました。 基本的に左にすすめると。 そして1付加する。 if(左のポインタ==NULL) if(右のポインタ==NULL) 言葉じゃ説明できんな。。。 左も右のポインタもひとつずつNULLじゃないかをみて 基本的には左にいくんだけどもNULLになったらひとつ戻って右にいく こうかな?
>>877 目的は?
文字列として使うのが目的なら、text[0] = '\0';だが。
#つーか、コンパイルできないコードを提示して原人もへったくれもないと思うが。
>>879 目的は
あるファイルの文字を一文字ずつ読む→アルファベットが続く限りtextに一字ずつ入れる
→そうやって出来た単語を読んで単語ごとにカウントする
という風なプログラムに使用したかったんですが、textの中の全文字列を初期化しないと
次の単語を読むときに前の単語の後半の文字が残っちゃって・・・
元のcファイルは大きすぎて提示できませんでした
882 :
デフォルトの名無しさん :2007/01/23(火) 16:46:37
20MBほどの.hファイルをインクルードしようとしたらヒープ領域を使い果たしましたというエラーになりました。 うまくインクルードする方法はないでしょうか?
>>880 memset()とかstrcpy()は?
>>882 ヘッダファイルを分割して、分割した各々を#includeするヘッダファイルを作り、それを#include
20MBって何が書いてあるんだよw インクルード以外の方法を考えた方がいい。
WinXP上で無料でできるという条件で、Cのコンパイルが一番早いのはどのソフトですか?
886 :
754 :2007/01/23(火) 17:48:28
>>885 LSI-C86試食版かな。最近の最適化なんかの成果が全く入っていない、
今となっては単純なコンパイラなので爆速だろうと思う。
まったくお勧めはしないけど。規格準拠度が低いし、
16bitコードしか吐けないし、ライブラリはスモールモデルしかないし。
vc2005expとか、SDK/DDKについてくるコンパイラとかどうよ。
cl.exeがいい感じ
Cのコンパイルについては、だいぶん前から、IO律速になった、 ってUNIXな連中が言ってた記憶があるけどな。
頼む不毛な雑談は止めてくれ 雑談するなら理由もなく「〜はいい感じ」とか教科書や ウェブで調べればすぐに見つかりそうな痛いレスはやめて もう少し知識になるような雑談をしてくれないか?
>893 その書き込みがどんな知識になるのか納得いくように説明してくれたらそうしてやるよ。
正直コテハンつけないと誰が書いてるのかわかんね
つ[#ぶるじょあ]
898 :
754 :2007/01/23(火) 22:10:31
>>893 不毛な雑談って・・・・
雑談ってそういうもんじゃないのかな?
頭の悪い奴が多いな このスレは
900 :
754 :2007/01/23(火) 22:27:11
雑談の意味を知らない人もいるけどね このスレは
じゃー建設的な雑談とはなにか、ちょっと建設的に話し合ってみよーじゃないか
役所の近くには必ず喫茶店があります。何故でしょう?
903 :
754 :2007/01/23(火) 23:26:51
>>902 役所って手続きに時間かかるから
そこで待ってろよ、ってことじゃない
なんでいつまでも754をアピールしてるの? というか恥をさらしてるだけ? w
905 :
754 :2007/01/24(水) 00:05:10
>>904 別に、なんとなく
このほうがNG入れやすいでしょ
754はNGでどーぞ
苦笑
const int a = 0; const int b = a + 1; って書くと、gccで tmp.c:2: error: initializer element is not constant って怒られるんですが、 なんか書き方ないですか? #defineにしろ、以外でお願いします。
908 :
754 :2007/01/24(水) 00:32:41
>>907 const にb = a + 1 いかんでしょ
#define だめなの?
私なら
#define INIT_A 0
const int a = INIT_A;
const int b = INIT_A + 1;
とかにする
INIT_A って名前がクソとかはなしでね
>>908 コンパイラはaがconstだって認識してくれないもの?
右辺の成分は全部constな値じゃんかよ、
initializer element is not constant
とか嘘じゃん、
って思ってしまうんですが。
#defineが駄目なんじゃなくて、
それは思いつくから他にないものかと思いまして。
あざっす。
910 :
754 :2007/01/24(水) 00:51:58
>>909 const int a = 0;
const int b = a + 1;
この場合 a は変数でしょ
C++ならいいんだけど.
Cの場合 const 変数で初期化できない(みたい、規格的なことはしらないんです、無知でゴメンナサイ)
#define INIT_A 0
const int a = INIT_A;
const int b = INIT_A + 1;
この場合なら右辺も定数になるから cnost を初期化できる
911 :
754 :2007/01/24(水) 00:52:38
×Cの場合 const 変数で初期化 ○Cの場合 const を変数で初期化
912 :
909 :2007/01/24(水) 01:10:43
>>910 ああ、そうか、C++ならいいのか。
普段はC++で書いてるもんで、
なんでこんなんで怒られたっけかなーと思ってました。
913 :
デフォルトの名無しさん :2007/01/24(水) 10:44:21
整数を入力し,それを10進,16進(8桁),8進(11桁)で, 次のように並べて表示するプログラムを作成せよ。16進,8進についてはビ ット処理を行うこと。繰返し文を用いることにより,幾つかのデータで実行を 確認してみよ。 12 0000000C 000000000014 -1 FFFFFFFF 37777777777 これ教えてください(>_<)
915 :
デフォルトの名無しさん :2007/01/25(木) 00:20:48
つまりわからないってことか。。。
mixiならやさしく教えてくれるおじさんがいるのに。。。
917 :
デフォルトの名無しさん :2007/01/25(木) 00:26:51
socket.h や、 netdb.h など、特殊なインクルードファイルというのを、 無償でダウンロードできるところはありませんか?
>>917 unix用のコードをwindowsで動かそうとしてないか?
477 名前:ぼるじょあ ◆yBEncckFOU [sage] 投稿日:2007/01/25(木) 00:18:46
>>473 (・3・) エェー おもしろそうだけどそろそろ風呂入って寝るから回答できないお
土曜日までやってくれる人がいなさそうならもいらが回答してやるお
忘れっぽいから土曜日にゆうこりん似のアナ○画像か大沢あかねたんのコラ
(アナ○見せてると尚可)をうpして気づかしてくれお
478 名前:ぼるじょあ ◆yBEncckFOU [sage] 投稿日:2007/01/25(木) 00:20:08
補足: コラじゃなくても大沢あかねたんの激似のエロ画像(ア○ルが見えてると最高なんだけど・・・)
でもいいお
>>918 あ、すいませんでした、とんだ勘違いしてました。
ご教授ありがとうございます。
>>919 あ、すいませんでした、とんだ勘違いしてました。
ご教授ありがとうございます。
922 :
デフォルトの名無しさん :2007/01/25(木) 11:29:58
グローバルで仮引数を設定したあと、 ローカルでその引数をいろいろ変えていった場合 それは関数をまたいで保存されるのでしょうか?
>>922 日本語で(ry
エスパーしてみる
>グローバルで仮引数を設定
関数の引数にグローバル変数を渡した。
>ローカルでその引数をいろいろ変えた
関数の内部において、引数を書き換えた。
>それは関数をまたいで保存されるのでしょうか?
グローバル変数の値はどうなるよ?
グローバル変数の値は、関数内部の引数書き換えでは変わらない
int global = 10;
void func(int arg) { arg++; }
void hoge(void)
{
func(global);
func(global);
.... /* 何回 func() を呼ぼうが global は 10 のまま */
}
924 :
デフォルトの名無しさん :2007/01/25(木) 11:57:35
>>923 お察しいただいた内容ですw
なるほど外側で設定した値は変わらないんですね。
ありがとうございました
>>924 ポインタまわりで混乱するかもなw
char buffer[10] = "123";
char *ptr = global_buffer;
void func(char *p) { p[0]++; }
void hoge(void)
{
func(ptr); /* ptr は buffer の先頭を指している が buffer の中身が変わって "223" になる */
func(ptr); /* ptr は buffer の先頭を指している が buffer の中身が変わって "323" になる */
}
func は 「ポインタを書き換えている」 のではなく 「ポインタが示している場所の内容」 を書き換えている
926 :
925 :2007/01/25(木) 12:07:37
× char *ptr = global_buffer; ○ char *ptr = buffer;
927 :
25 :2007/01/25(木) 13:48:42
/* kimatsu2.c */ /* [メモリの内容とメモリの番地(アドレス)の表示実験] */ /* 変数dataの値をポインタ変数ptrを用いて表示せよ */ #include<stdio.h>/* getchar()関数を使う時に、必要 */ main() { int data=123; int *ptr;/* ポインタ変数の宣言 */ ptr=?????;/* 変数dataのアドレスをポインタ変数に代入 */ printf("\n変数dataの値 = %d\n\n",data); /* 変数dataのアドレスを10進数及び16進数で表示せよ */ printf("変数dataのアドレス = %? @10進表示, %?@16進表示\n\n",?data,?data); /* 変数dataのアドレスをポインタ変数ptrを使って表示せよ */ printf("ポインタ変数ptrの値= %u\n\n",ptr); /* 変数dataの値をポインタ変数ptrを使って表示せよ */ printf("ポインタ *ptrの値= %d\n\n",????); /* ポインタ変数ptrのアドレスを10進数及び16進数で表示せよ */ printf("ポインタ変数ptrのアドレス = %? @10進表示 ,%? @16進表示\n\n",&ptr,&ptr); printf("\n\n何かキーを押してくれ"); getchar();/* キーを押すまで前文で停止している */ } わかりますか?
928 :
754 :2007/01/25(木) 13:54:49
>>927 #include<stdio.h>/* getchar()関数を使う時に、必要 */
main()
{
int data=123;
int *ptr;/* ポインタ変数の宣言 */
ptr=&data;/* 変数dataのアドレスをポインタ変数に代入 */
printf("\n変数dataの値 = %d\n\n",data);
/* 変数dataのアドレスを10進数及び16進数で表示せよ */
printf("変数dataのアドレス = %d @10進表示, %x@16進表示\n\n",&data,&data);
/* 変数dataのアドレスをポインタ変数ptrを使って表示せよ */
printf("ポインタ変数ptrの値= %u\n\n",ptr);
/* 変数dataの値をポインタ変数ptrを使って表示せよ */
printf("ポインタ *ptrの値= %d\n\n",*ptr);
/* ポインタ変数ptrのアドレスを10進数及び16進数で表示せよ */
printf("ポインタ変数ptrのアドレス = %d @10進表示 ,%x @16進表示\n\n",&ptr,&ptr);
printf("\n\n何かキーを押してくれ");
getchar();/* キーを押すまで前文で停止している */
}
929 :
デフォルトの名無しさん :2007/01/25(木) 13:56:57
>>925 ポインタを使えばいいんですね。
ありがとうございました。よく分かりました。
930 :
25 :2007/01/25(木) 14:02:59
928>ありがとうございます。 /* ポインタ変数を使って文字列の長さを求めよ。但しスペースや","、"."は 一文字とカウントする。 */ #include<stdio.h>/* getchar()関数を使用する為に必要 */ main() { char moji[]="To be or not to be,that is the problem.";/* →39文字 */ char *ptr;/* ポインタ変数の宣言 */ int ls=0;/* 文字列の長さの格納場所 */ ???=????; /* ポインタ変数に文字列を代入 */ while (*ptr??'\0'){ /* 文字列の長さのカウント */ ptr++; ls++; } printf("\"%s\" の文字数 = %d文字\n",moji,??); printf("\n\n何かキーを押せ"); getchar();/* 任意のキー入力待ち */ } じゃあこれもわかりますか?
931 :
754 :2007/01/25(木) 14:11:32
>>930 #include<stdio.h>/* getchar()関数を使用する為に必要 */
main()
{
char moji[]="To be or not to be,that is the problem.";/* →39文字 */
char *ptr;/* ポインタ変数の宣言 */
int ls=0;/* 文字列の長さの格納場所 */
ptr=moji; /* ポインタ変数に文字列を代入 */
while (*ptr!='\0'){ /* 文字列の長さのカウント */
ptr++;
ls++;
}
printf("\"%s\" の文字数 = %d文字\n",moji,ls);
printf("\n\n何かキーを押せ");
getchar();/* 任意のキー入力待ち */
}
932 :
25 :2007/01/25(木) 14:15:50
931>いつもいつもすみません #include<stdio.h>/* getchar()関数を使用する為に必要 */ main() { char moji[]="To be or not to be,that is the problem.";/* →39文字 */ char *ptr;/* ポインタ変数の宣言 */ int ls=0;/* 文字列の長さの格納場所 */ ptr=moji; /* ポインタ変数に文字列を代入 */ while (*ptr!='\0'){ /* 文字列の長さのカウント */ ptr++; ls++; } printf("\"%s\" の文字数 = %d文字\n",moji,ls); printf("\n\n何かキーを押せ"); getchar();/* 任意のキー入力待ち */ } これはどうでしょう?
933 :
754 :2007/01/25(木) 14:20:38
934 :
754 :2007/01/25(木) 14:41:49
手取り足取り教えてるとつけあがる、ってことだな
再帰のプログラム struct are{ struct are *p0; struct are *p1; } void saiki(struct are *tp) { struct are *p; if(p==NULL) return; saiki(p->p0); saiki(p->p1); } 前順走査を再帰でやりたいんだけど ノードの左のノードへつなぐポインタはp0 右のノードへつなぐポインタをp1とする。 まあハフマンなんだけどね。 あるノードの中の値を前順走査で探したいんだけど その経路をつけながらやるのってどうやればいいですか?
937 :
754 :2007/01/25(木) 18:02:13
>>936 これでどーかな?
p0 p1 じゃなくて left right の方が分かりやすいと思うけどまぁいいや
void saiki(struct are *tp)
{
struct are *p;
if(p==NULL) return; // rootのsaiki呼び出しでNULLチェック入れてるならいらない
if(p->p0 != NULL) saiki(p->p0);
if(p->p1 != NULL) saiki(p->p1);
}
938 :
754 :2007/01/25(木) 18:03:22
>>936 あっゴメン、経路のこと忘れてた
ちょっとまってね
939 :
754 :2007/01/25(木) 18:24:59
>>936 こういう手法が許されるかは分からないけど
struct are{
struct are *p0;
struct are *p1;
struct are *next;
}
struct are *p_prev=NULL;// グローバルで宣言
// p_prev がNULL は 現在の p がrootということになる
void saiki(struct are *p)
{
if(p==NULL) return; // rootのsaiki呼び出しでNULLチェック入れてるならいらない
if(Prev!=NULL) prev->next=p;
prev=p;
if(p->p0 != NULL) saiki(p->p0);
if(p->p1 != NULL) saiki(p->p1);
}
あとはrootの struct are から nextを辿ればそれが経路になる
next==NULLで経路探索終了
実際に動かしてないからバグあるかも
>>939 だったら
struct node_tag
{
struct node_tag *parent, *child_left, *child_right;
}
てなかんじだろ?
双方向の二分木ってところか
941 :
936 :2007/01/25(木) 18:41:23
再帰をして経路を出す方法でお願いします。 何かのノードを探索するプログラムはできるんだけど それの経路となるとね
しかしローマ字関数名ってなあ・・・学校でそう教えてるのかな?
>>941 宿題?
ここは作ってもらうところじゃないぞ
944 :
936 :2007/01/25(木) 19:10:34
いや宿題の一部だし。 再帰を使ってニ分木の前順走査をしたときの 経路の出し方がわからなくてね。
>>944 >>937-939 に対して何か言うことないの?
経路を出すって何をしたいんだ?
struct areに何らかの値を持たせて出力でもしたいのか、
ノードのアドレスでも出力するのか
だから宿題はスレ違いだって言ってるんじゃないのか
>>946 あなたの言い方だと質問=宿題だな
質問も無理ならなんなんだこのスレ
948 :
936 :2007/01/25(木) 19:25:26
>>937 ありがとうございます。
参考にさせていただきます。
再帰を使っての経路の表示の仕方は少し難しいようですね
950 :
754 :2007/01/25(木) 19:36:03
>>940 >>939 ののコードの prev を parrennt にしろってこと?
>>944 >経路の出し方がわからなくてね
どう出したいの?
root から だどる道を知りたいんでしょ
戻るときの一度通過した節も必要ってこと?
経路が root->left->root->right てこと?
宿題スレは実質宿題丸投げスレだから せっかく自分で努力しようという学生の向上心を無碍に扱うのもどうかと
952 :
754 :2007/01/25(木) 19:39:48
953 :
936 :2007/01/25(木) 19:41:18
いや 5個くらいのノードにはいってる割合をみつけて、 rootからそのノードまでの道を表示したいんです。 木で表示してあって一番上がroot,left,rightは用います。 左にいくときは1を表示、右に行く時は0を表示したいんです。
954 :
936 :2007/01/25(木) 19:44:51
>>953 > 左にいくときは1を表示、右に行く時は0を表示したいんです。
>>954 > probabilityとcode wordを表示したいのです
最初からそう書けよ
saiki関数の引数に0or1を格納するための配列と、格納した数(=深さ)でも渡せばいいと思う
956 :
754 :2007/01/25(木) 19:50:08
>>953-954 いや、君があのときに人ってのは分かってるの
それを知ってる上でレスしたんだけど
この前も書いたけど
木を作る段階でね
1.確率が低い2つを見つける
2.あわせてひとつの節にする
1と2を繰り返して木を作るんだけど、それは出来たの?
957 :
936 :2007/01/25(木) 19:53:24
はいできました。 rootが一番上をさすようになってます
958 :
754 :2007/01/25(木) 20:08:47
知っててコード書いたけどよく見りゃ意味の無いコードだわ
>>939 >>957 木の形は表のTree of Code と同じになってる?
root から左がAで右がH
959 :
754 :2007/01/25(木) 20:15:01
あーあと経路探索は rootから A, B, C,・・・H までのすべての経路が欲しいわけだよね それって一度にA〜Hまでの経路を出すの? それともAの経路が欲しいと思った時に初めて経路探索するようにするの? (Bが欲しいと思ったらroot → Bの経路を出力のように)
960 :
936 :2007/01/25(木) 20:16:59
ひとつの経路のみでいいです。 それがわかればそれをループすればいいですから。 入力の配列も作りなおさないといけないけど
961 :
754 :2007/01/25(木) 20:31:05
>>960 こんな感じかなぁ
引数のstruct are *targetは探索したい葉のアドレス
文字で、たとえば 'A ' や'B' とかで検索したいならchar alpha とかにして
struct are{
struct are *p0;
struct are *p1;
}
char codeword[10];
int saiki(struct are *target,struct are *p,int level,codeword[])
{
if(p==NULL) return 0; // rootのsaiki呼び出しでNULLチェック入れてるならいらない
if( p==target)
{
codeword[level] = '\0';
return 1;
}
if(p->p0 != NULL)
{
codeword[level] = '1';
if(saiki(target,p->p0,level+1,codeword)==1) return 1;
}
if(p->p1 != NULL)
{
codeword[level] = '0';
if(saiki(target,p->p1,level+1,codeword)==1) return 1;
}
return 0;
}
>>936 のやる気が感じられないなあ。
一問一答が延々と続いてるのは質問の仕方等が悪いせいだって事に気づいてないのかね。
void saiki(struct are *tp, int *a, int idx)
{
struct are *p;
if(p==NULL) {
int i;
for(i=0;i<idx;i++) {
printf("%d ", a[i]);
}
printf("\n");
return;
}
a[idx] = 1;
saiki(p->p0, a, idx+1);
a[idx] = 0;
saiki(p->p1, a, idx+1);
}
コンパイルさえもしてないのでいい加減だが、こんなのじゃだめなのかな
963 :
936 :2007/01/25(木) 20:42:50
964 :
754 :2007/01/25(木) 20:45:51
965 :
936 :2007/01/26(金) 00:16:29
num prob
0 0.34
1 0.23
2 0.20
3 0.10のnumとprobを構造体のメンバとして
このノードを作り木を作ったんだけど、それのnumをターゲットとしてできるように
main関数で0から3をループしてをの変数を、
その中に
>>961 さんのプログラムを
参考にして作ったプログラムに、引数として送るように
プログラム作ってようやくコンパイル通ったけど出力できない。。。
わかりにくい文章ですまそ。
このin levelっていう引数って何を送ってるのですか?
numと同じと考えていいのでしょうか?
966 :
754 :2007/01/26(金) 00:36:25
>>965 prob の型は何?
int lebelは節(実際は枝)の深さでありcodewordのインデックスになる
rootの時0で、rootから次の節へ行くたびに1増える.
>>954 のサイトでいうとrootからHへ行くとする
rootから1番目の節までがlebel0、1番目から2番目の節がlebel1ってなって最後の枝は5になる
現在の節から左の節にいく場合はlebelで指定されるcodeword[lebel]に1が、
右にいく場合はcodeword[lebel]に0が入る
葉に到達した場合はcodewordの最後に'\0'が入り
これを文字列出力すれば サイトのcodewordと同じになるはずです
>numと同じと考えていいのでしょうか?
違います
木を作ったソースが気になるのですが、
前にも言いましたがソースを提示してもらったほうが解説しやすいです
まぁ私も人に自分のソース見せるのは恥ずかしくてイヤなんですけどね
967 :
936 :2007/01/26(金) 01:01:04
struct are{ struct are *root; struct are *pointer0; struct are *pointer1; double prob; //割合(0.50,0.31,0.22,0.10・・・) int node_num; //ノードの数(1とか2とか int node; //ノード列(0,1,2,3,4) }; main(){ struct are *root; int i,j; char prob1[N],codeword[10]={'\0'}; 〜 for(j=0;j<N;j++){ prob1[j]=saiki(root,j,j,codeword); printf("%s",prob1[j]); } int saiki(struct are *p,int j,int level,char *codeword) { if(p=NULL)return 0; if((p->node)==j){ codeword[level] ='\0'; return 1; } else if(p->pointer0 != NULL){ codeword[level] ='1'; if(saiki((p->pointer0),j,level+1,codeword)==1)return 1; } else if(p->pointer1 != NULL){ codeword[level] ='0'; if(saiki((p->pointer1),j,level+1,codeword)==1) return 1; } return 0; }
968 :
936 :2007/01/26(金) 01:07:54
木はある配列に0からprobにいれて、N−1までいれて PのポインタがN−1とN−2番目のノードをさすようにして その2つのprobを足してpのprobにいれる。そしてpがひとつ上を指すようにする 一回ループすることにソートかけてるので あってると思います
969 :
754 :2007/01/26(金) 01:12:54
>>965 >このノードを作り木を作ったんだけど
分かりづらいかもしれませんが木はこのように出来ましたか?
ちなみに木構成はrootを上にしたとき 0が左側、3が右側です
root ------- 0 (0.34)
|
----------1 (0.23)
|
------2 (0.20)
|
--- 3 (0.10)
木の作成以外を書いてみました
このコードは木の構造が重要です
しかし木の構成が分からないので動作チェックはしていません
http://sa-wiki.com/upload/src/up0094.txt >>967 のコードは今チェックしてみます
970 :
754 :2007/01/26(金) 01:24:02
>>967-968 for(j=0;j<N;j++){
prob1[j]=saiki(root,j,j,codeword);
printf("%s",prob1[j]);
}
このコードが違います
saiki(...) が返す 0 および 1 は再起処理を継続するかしないかのフラグです
目的のノードが見つかったとき関数saiki(...)は1を返すようにしています
そして関数saiki(...)は自分が呼んだsaiki(...)から1が返ると以降の処理をやめ、return 1を返します
これにより呼び出し元の関数saiki(...)自身もすぐに終了するというものです
ただしくは
for(j=0;j<N;j++){
prob1[j]=saiki(root,j,j,prob1[j],codeword);
printf("%s",prob1[j],codeword);
}
です.
ただし処理ごとに表示しているので配列の必要はないんですけど.
971 :
754 :2007/01/26(金) 01:26:33
>>967-968 ×
prob1[j]=saiki(root,j,j,prob1[j],codeword);
これだと prob1[j],codeword を破壊してしまいます
○
saiki(root,j,j,prob1[j],codeword);
main においては戻り値はいりません
972 :
936 :2007/01/26(金) 01:29:03
973 :
754 :2007/01/26(金) 01:50:01
>>967-968 もう2点
関数saiki(...)のはじめの方の
if(p=NULL)return 0;
ですが、不正な代入です.等価式ではないです
if(p==NULL)return 0;
にしてください
あとmainの表示処理
>>970 のprintf("%s",prob1[j],codeword);の部分ですが
改行を入れたほうが...printf("%s\n",prob1[j],codeword);
今のところ以上です.
明日早出なの忘れてました.
私、今日はもう寝ますので...と、思ったらレス付いてる.
えぇ〜と、明日で良いですか?ソースチェック...
たぶん私以外の人が見てくれると思いますが.
>>972 のソースは略したソースと同じものですよね.省略して無い部分については...
>>972 のソースは明日チェックします.
時間は夜7時以降だと思いますけど.
先に寝かせていただきますね.ゴメンナサイ
では、お疲れ様でしたぁ.
明日には次スレ立ってるのかなぁ((ひとりごと・・・・
974 :
936 :2007/01/26(金) 01:52:55
>>973 すいませんP=NULLのとこなおしたら
それらしいのでました。
ありがとうございました
「続行するには何かキーを押してください」状態を while(1){ if (kbhit() == 1){ break; }else{ Sleep(500); } } fflush(stdin); このように作ったのですが、押したキーがこの次にあるfgetsによって読まれてしまいます。 どうすれば解決できるでしょうか?
>>975 fflush(stdin)は未定義です。getc()等で読んで捨ててください。
>>975 これでいける!多分…
while(1){
if (kbhit() == 1){
while(kbhit())
getch();
break;
}else{
Sleep(500);
}
}
978 :
754 :2007/01/26(金) 17:59:49
>>974 それはよかったです
なにかあったらまた質問どーぞ
あれから書き込み4件しかないとは......
次スレまでまだまだですねぇ
( ・3・)<宿題しか受け付けないから
>>980 は無視するのがいいYO!
淋しい
>>980 は宿題を持ってくれば相手をしてあげるお
>>976-977 ありがとうございます。
しかし、fflush(stdin)を全部入れ替えたら新たな問題が。
#include<stdio.h>
#include <string.h>
#include <conio.h>
main(){
int check=0;
char word[8]="string\n",input[8];
while(check == 0){
// fflush(stdin);
while(kbhit()){
getch();
}
fgets(input, 8, stdin);
if (strcmp(word,input) == 0){
printf("OK\n");
check = 1;
}else{
printf("NG\n");
}
}
return 0;
}
>982 その問題ってなによ?
984 :
982 :2007/01/27(土) 21:22:06
(続き)
単純化すると
>>982 のようなプログラムなのですが、
コメントアウトされたfflush(stdin);の代わりにその下の3行を入れたところ
標準入力の中身が捨てられず、8文字以上入力すると8文字ごとに読み込み
strcmpして、NGと表示してしまいます。
kbhit()って、先頭が読み込まれていたらその残りに関しては
1を返さないんでしょうか。
>>984 kbhit() はキーボードバッファの状態を調べて返す関数だが、
fgets() 関数が呼ばれたときに、キーボードバッファの中身が
ストリームバッファ stdin に移ってしまって、
キーボードバッファの中身が空になってしまい、
意図した動作になっていないんだと思われる。
fgets() を使わずに getch() で読むように変更するか、
fgets() で得られた文字列の終端が '\n' でなければ、
\n または EOF がくるまで読み飛ばすようにすればOK
986 :
985 :2007/01/28(日) 05:55:32
>>984 fgets(input, 8, stdin);
↓
fgets(input, 8, stdin);
if(input[strlen(input)-1]!='\n')
{
char lfbuf[2];
fscanf(stdin, "%*[^\n]%1[\n]", lfbuf);
}
>>984 fflush(stdin); はやめれ
どうしてもというなら環境依存スレ行け
>>987 fflush(stdin)を違う方法で置換したいがための質問だと思われ。
昔も今も、fflush(stdin)はいかんと思うが。
991 :
デフォルトの名無しさん :2007/01/28(日) 14:55:55
992 :
デフォルトの名無しさん :2007/01/28(日) 15:19:11
フォーとらアッーん
993 :
デフォルトの名無しさん :2007/01/28(日) 15:54:07
994 :
デフォルトの名無しさん :2007/01/29(月) 04:51:10
fflush(stdin)はLSI-Cではおk
>>995 んな過去の遺物に依存したプログラミングは推奨できません。
997 :
デフォルトの名無しさん :2007/01/29(月) 11:09:23
これじゃどっちが昔の人かわからんなw
LSI-Cwwwwwwwwwwwwwwwwwww
999 :
999 :2007/01/29(月) 17:41:23
銀河鉄道999
1000 :
999 :2007/01/29(月) 17:42:17
と言うわけで1000年女王も頂きます
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。