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

このエントリーをはてなブックマークに追加
750デフォルトの名無しさん
int main()
なら、関数として戻り値が定義されてる以上returnステートメントがいる。
ちなみに、0を返せば正常終了、それ以外は異常終了とみなされるはずです。
void main(void)
なら、組み込み系(自分は書いたこと無いが)とかだと、一度立ち上げたら
ずっと動かすためにvoidを使ってソースを書くらしい。
751デフォルトの名無しさん:2007/01/21(日) 21:49:29
>>749
int main()
{
・・・・・・・・・・・・
・・・・・・・・・・・・
return 0;
}
システムに渡されるコード(戻り値)は何になる?
return がなかったら戻り値は何になる?
752デフォルトの名無しさん:2007/01/21(日) 21:52:41
いいか、プログラムを呼び出す奴に戻り値を返す必要がある場合があるだろ?
失敗とか成功とか
main()の戻り値はそーゆー時に必要なんぢゃよ
753デフォルトの名無しさん:2007/01/21(日) 22:01:54
おききしたいのですが

出力は1文字づつで
縦7横15の*の平行四辺形をかくにはどうすればいいんでしょうか
***************
***************
***************
***************
***************
***************
***************
***************
バージョンとこのはんたいバージョンなんですが
2重るーぷをつかわなければいけないんですけど

縦のループのあと横のループはわかるんですけど
縦にうつるときがわかりません

ちなみに使用できるのはfor,while,int,printfです
754デフォルトの名無しさん:2007/01/21(日) 22:05:49
>>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;
}

こういうこと?
755デフォルトの名無しさん:2007/01/21(日) 22:17:47
>>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;
}
756デフォルトの名無しさん:2007/01/21(日) 22:18:05
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3484.txt

これ何やってるかコメント文で説明を付けて教えてもらえませんか?
っていう質問はありですか?
757749: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;じゃダメなのか、と思ってるんだ。
要するに戻り値というのを分かりやすく教えてほしい。
758デフォルトの名無しさん:2007/01/21(日) 22:25:00
>>754

これは長方形になりませんか?

>>755縦と横でループをわけるということでしょうか?
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;ってのは正常終了をシステムに伝えてる、はず
760デフォルトの名無しさん:2007/01/21(日) 22:31:40
>>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); とか書いてると思うが、これは関数コールであるとともに代入文でもある。
762754:2007/01/21(日) 22:37:12
>>758
ゴメン平行四辺形なのね.
>>755でいいと思う
763デフォルトの名無しさん:2007/01/21(日) 22:39:20
>>762
>>755

ありがとうございます!

初心者ですみませんがreturn0って必要なんでしょうか

これなしになぜかコンパイルできるんですが・・・
764デフォルトの名無しさん:2007/01/21(日) 22:51:55
>>763
このあたりが参考になるんじゃないかな
http://pc10.2ch.net/test/read.cgi/tech/1167325490/750-
765754: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の関数を縦のループにつかうんでしょうか?

これも
ーーーーーー
|    /
|   /
|  /
| /
|/


|\
| \
|  \
|   \
|    \
=====

の形を*でつくりたいんです
768754: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;
769754:2007/01/21(日) 23:15:53
あっ
return 0;
のあとに } つけてね
770デフォルトの名無しさん:2007/01/21(日) 23:18:31
>>768->>769

なるほど・・・やっぱりスキャンフの関数を
そのままつかうんですね

ありがとうございます!
771デフォルトの名無しさん:2007/01/21(日) 23:21:45
多倍長演算の仕方がわかりません。
ライブラリの使い方からさっぱりです。どなたか教えていただけませんか?
772756:2007/01/21(日) 23:35:27
スレ違いでした?
773771:2007/01/21(日) 23:36:45
ごめんなさい事故解決しました
774デフォルトの名無しさん:2007/01/21(日) 23:41:46
>>772
スレ違いとは思わないが、プログラムの質が低すぎて読む気にもなれないだけ。
775754:2007/01/21(日) 23:41:58
>>772
宿題スレから来たのか?
776756:2007/01/21(日) 23:57:20
>>774
質が低い質問に答えてくれるとおもって入門篇にきたんです・・・

>>775
いえ、一応宿題ってわけではないんでそっちに行ってないです。
宿題スレで聞いたほうが良いですか?
777デフォルトの名無しさん:2007/01/22(月) 00:00:25
質問です。
double型の数値をchar型の文字列に変換する関数を作ったのですが、どうしても誤差が出てしまいます。
printfで表示されるみたいな誤差の出ない(厳密な突っ込みは今しないで。)文字列に変換する方法を教えてください。

http://sakuratan.ddo.jp/uploader/source/date31366.txt
に問題の関数をupしておきますた。
778デフォルトの名無しさん:2007/01/22(月) 00:01:52
>>776
・他人の書いたソースなら、書いた本人に解説して貰え。
・そもそも勝手に晒していいのか?
・疑問点を聞きたいのなら、聞きたいポイントを指定しろ。
779754:2007/01/22(月) 00:09:46
>>776
>>778が言うとおりだと思う
すべてにコメントつけるなんて無理
で、キミがどこが分からないのか、こっちはそれも分からない
どーしてもソースを理解したいならまず分解してすこしずつ稼動する範囲を広げていくのがいい
と、言っても難しいかなぁ
780デフォルトの名無しさん:2007/01/22(月) 00:10:54
>>777
小数点以下7桁目まで表示したいなら、8桁目を四捨五入すれば?
printf()も指定桁の一つ下で四捨五入していることだし。
つーか、この関数を作った理由は勉強のため?
まさか"%.7f"を知らないってわけじゃないよね?
781777:2007/01/22(月) 00:12:00
>>778
>>776って書いてあるけど文章の内容から推測して私のことですか?

そうだとしたら。

・これは自分で書いたソースですが、自分で書いたソースを勝手に晒す事は違法ですか?

・疑問点は小数部分を文字列に変換する際に誤差が生じてしまう原因とその対処法です。
782777:2007/01/22(月) 00:14:09
>>780
勉強じゃなくてファイルに出力するためです。
ありがとうございました。
早速改造してみます。
783754:2007/01/22(月) 00:15:36
>>777
具体的にどの実数を与えたとき?
だれかに検証もとめるなら成功するときと成功しないときのテストケースぐらい書いて
784754:2007/01/22(月) 00:16:46
>>781
>>778じゃないけどそれは>>776あてだよ
キミじゃない
785デフォルトの名無しさん:2007/01/22(月) 00:17:38
>>780
便乗ですみませんが、"%.7f"について説明されてるサイトを教えてください。
786756:2007/01/22(月) 00:19:49
>>778>>779
質問がアバウトすぎたんですね。失礼しました。
mainのdo-while文の中身のy--;やx--;、if文の条件と
reverseの中のif文がどういうときで場合分けしてるのか
についてお願いします。
787デフォルトの名無しさん:2007/01/22(月) 00:24:45
>>782
>>780=778だけど、>784の言う通り君宛じゃない。
勉強のためじゃないのなら、無駄な努力をする必要はない。
fprintf()で"%.7f"するか、sprintf()で"%.7f"したものをfputs()すればいい。
あーそうそう、誤差が生じる原因は、小数をdoubleで表現すると循環小数になって誤差が生じるため。
788デフォルトの名無しさん:2007/01/22(月) 00:25:34
789785:2007/01/22(月) 00:30:55
ありがとうございます。
発見しました。
790754: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文はユーザ指定のマスから方向番号により方向チェックをする
チェックの結果、相手の石ならその方向を再帰的に調べ、自分の石が見つかるか空いたあマスまで繰り返す
自分の石が見つかったならチェックしてきたマスを戻りながら自分の石にしていく
空いたマスなら相手の石の色を返すことによって石を取れない(エラー)としている
石を取れた場合、ユーザ指定のマスへの自分の石を置く
取れなかった(エラー)場合、なにもしないでユーザ入力に戻る

長文なので誤字脱字があるかも知れん
791754:2007/01/22(月) 00:53:36
>>786
プログラムの概要は↑
んで当初の質問は
>reverseの中のif文がどういうときで場合分けしてるのか
つまり石を置いた場所からそれぞれの方向に対して相手の石を取れるかチェックし、取れると判断できたなら相手の石を自分の石に変えていく
そして、方向は「1: 左下 2: 下 3: 右下 4: 左 6: 右 7: 左上 8: 上 9: 右上」 の8方向だから
if文も8つあるわけだ
792754:2007/01/22(月) 00:58:46
ここまで書いてやったのに当の質問者はすでに寝てます・・・・・だったら許せんな
つか俺が眠い
793756:2007/01/22(月) 01:05:45
すみません、必死に説明とプログラムを交互に見比べてました。
眠いのに詳しく書いていただいてすみません。
引き続き読んできます。ありがとうございました
794754:2007/01/22(月) 01:14:19
>>793
いや、起きてたから俺的には許しちゃる
まぁわかんなきゃまた質問しな
ただし、ちゃんとどこがどー分からないのかを書くこと
具体的にってのは無理だと思うけど、せめてここはどういう意味か?どーしてこうなるのか?とかさ
でなければ答えようがないからな
まーがんばれ
んじゃ、オヤスミ
795デフォルトの名無しさん:2007/01/22(月) 01:24:20
ポインタのポインタのポインタのポインタのポインタのポインタ
796デフォルトの名無しさん:2007/01/22(月) 02:21:23
君のおかげで間違ってブックマークしていたことに気付いた
ありがとう
そして
さようなら
797デフォルトの名無しさん:2007/01/22(月) 02:22:22
ポインタポインタ
798デフォルトの名無しさん:2007/01/22(月) 02:36:36
あれ、まだ消えてなかったのか
んじゃ
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()においてキーボード入力にするにはストリームになんと記述すればいいのでしょうか?
802デフォルトの名無しさん:2007/01/22(月) 04:49:31
>>801
標準入力にキーボードが向けられてるならFILE *にstdin。
あと名前入力しなくていい。しない方がいい。
803デフォルトの名無しさん:2007/01/22(月) 12:55:43
c言語勉強してるのですが 肝心のコンパイラが使えません・・・Borland++compilerってのつかってるんですけど
c:\sampleディレクトリーに保存するらしいんんですけど c:\sampleディレクトリーってなんですか? 超初歩な質問ですけど
独学でやってるせいで全然わかりません・・教えてください お願いします
804デフォルトの名無しさん:2007/01/22(月) 14:18:30
>>803
C言語の前にOSの勉強からしたほうがいいと思うよ。
805デフォルトの名無しさん:2007/01/22(月) 15:51:01
>>803
左下の「スタート」を押して「全てのプログラム」を押して「アクセサリー
」を押して「エクスプローラー」を選ぶ。
エクスプローラーが開いたら画面の左側にフォルダ一覧が表示されていると思う。
その中に「マイコンピューター」と言うのがあるはず。
それを押すと「ローカルディスク(C:)」と言うのがあるはず。
そのローカルディスク(C:)に「sample」というディレクトリーを作る。
ちなみにディレクトリーを理解するには、まず家を考えて欲しい。
家には部屋がある。ローカルディスクが「家」、ディレクトリーが「部屋」と思ったらいい。
パソコンを使っているといろんなファイルやプログラムが増えてくる。
それを整理整頓するために、分かりやすい名前の部屋を好きなだけ作って、そこにファイルなどを入れていくわけだ。

で、今はまだローカルディスク(C:)には「sample」ディレクトリーは無いはず。
作り方は、まず先ほどのエクスプローラーのローカルディスク(C:)をマウスでクリックして
一番左上にある「ファイル(F)」を選んで、そこに「新規作成」が一番上にあるはず。
そこに「フォルダ」があるのでそれを選ぶ。その名前を「sample」にする。
まぁsampleじゃなくても好きな名前でいいけれどね。
それとフォルダはディレクトリーの別名です。

これでわかるかな?
・・・・ひょっとしておいらは思いっきり釣られてしまったのかな。
806デフォルトの名無しさん:2007/01/22(月) 16:09:33
クジラ飛行机氏がテレビに出る模様

TV初出演!1/22(月)放送予定! 20:42

ウノウ(株) (http://unoh.net) の開発合宿がTV取材されました!
開発合宿の模様をテレビ東京さんに取材していただきました。
「ワールドビジネスサテライト」テレビ東京系列(http://www.tv-tokyo.co.jp/wbs/)
1/22(月)23:00〜にて放送される予定です。
たぶん、私は温泉のシーンでセミヌードが、映るのではないかと思います。
807デフォルトの名無しさん:2007/01/22(月) 16:20:21
>>805
釣られたって言うか、思いっきり鼬害。
仮に釣りじゃないとしても、>803に理解できると思えないが。
808sage:2007/01/22(月) 16:22:57
"%s0"と"%s1"をいれたプログラムがあるんだけど
どういう意味かわかりますか?

%sの後ろに数字をいれるのは
809デフォルトの名無しさん:2007/01/22(月) 16:33:10
>>808
特に意味はないな。
単純に文字列の後ろの数字を書きたいだけじゃね?

Ex.
printf("%s0", "321"); // ⇒3210
810デフォルトの名無しさん:2007/01/22(月) 16:33:32
0なら0を表示
1なら1を表示
811デフォルトの名無しさん:2007/01/22(月) 17:03:21
805>>ありがとうございます ローカルディスクに「sample」を作って
コマンドプロンプトに【cd sample】と打ったら【バスが見つかりません】と出てしまいました
何回も質問して本当に申し訳ないのですが 今度はどうすればいいのでしょう?
812デフォルトの名無しさん:2007/01/22(月) 17:09:34
>>811
スレ違い
初心者板にでも逝け
813デフォルトの名無しさん:2007/01/22(月) 17:37:52
811です 本当に聞いてばかりですいません コマンドラインはなんとかなったのですが
ファイルの【名前.c】でsampleに保存してもコンパイルできません どうすればコンパイル
できますか? 
814デフォルトの名無しさん:2007/01/22(月) 17:39:28
>>881
釣りっていう文章の書き方だな
815デフォルトの名無しさん:2007/01/22(月) 17:40:58
>コンパイルできません

何をしたらどういう風になってコンパイルできなかったのかな?
816デフォルトの名無しさん:2007/01/22(月) 18:05:44
815>>
805さんのいうとおりsampleというディレクトリーを作ったあと コマンドプロンプト
でカレントディレクトリーを【cd sample】と打って変更してsammpleに【ファイルの名前.c】で保存しても
コンパイルされなくて ためしにソースコードそのまま貼ってみたら【〜は内部コマンド
または外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません】
とでてきます・・ いったいどうやったらコンパイルできるのでしょう?
817754:2007/01/22(月) 18:05:48
コンパイルできないんじゃなくて
sampleをフォルダが作れないから何にもできないってだけだろうな
818sage:2007/01/22(月) 18:06:42
ってゆーかここC言語のスレだろ
それはUNIXとかwindowsのコマンドプロンプトの話でしょ。
全く関係ないw
819デフォルトの名無しさん:2007/01/22(月) 18:07:50
その昔MS-DOSをみんな使ってたころは
こういう初歩的なことを理解しないとPCをまともに使えなかったんだよな。
820デフォルトの名無しさん:2007/01/22(月) 18:08:49
ここでFM-TOWNSを使っていた俺が華麗に登場。
821754:2007/01/22(月) 18:10:36
まぁ右も左も分からない人に買わせてこそシェアも広がったわけだし、MSは
822デフォルトの名無しさん:2007/01/22(月) 18:11:52
>>816
コンパイルのやり方は環境依存なので、それぞれのコンパイラのスレで聞いてくれ
823sage:2007/01/22(月) 18:12:11
ハフマン記号を作るプログラムを今作ってるんだが
ややこしくて頭がてんぱってきたからこのスレみたら
あの質問
824デフォルトの名無しさん:2007/01/22(月) 18:13:05
>>823
いい具合に解れただろ?
825デフォルトの名無しさん:2007/01/22(月) 18:14:53
ソースコードを保存しただけで勝手にコンパイルしてくれる素敵なスレはここですか?

この初心者君は何でもいいからC言語の初心者本を買ってきて読んだ方がいい。
Cの質問ってレベルじゃねーよ。
826デフォルトの名無しさん:2007/01/22(月) 18:19:47
Cインタープリタなら、ソース保存だけでも… ま、希少種だな
827デフォルトの名無しさん:2007/01/22(月) 18:21:56
だ、だから学校ではC MACHINEを使ってたのか。
828754:2007/01/22(月) 18:33:15
そういえば高校のときポケコンってあって
アレCインタプリタだったな
あれからCが好きになったんだ
829デフォルトの名無しさん:2007/01/22(月) 18:41:51
質問です

元金と年利を入力し、複利計算をするときに
元金が2倍をこえるのに要する年数と、その時点元利合計をもとめて
利息計算は円未満切捨てなのですが

実数をintがたにキャストしてint型変数として代入すればいいともうのですが・・・

ちなみに複利は
元金1000円年利10%で
      りそく          元金合計
1ねんご 100(1000*10%)  1100
2年後   110(1100*10%)  1210

といった計算です
830sage:2007/01/22(月) 18:55:50
何が質問なのか全くわからんw
831デフォルトの名無しさん:2007/01/22(月) 18:59:39
>>830すみませんw
この計算プログラムをつくりたいんです
832デフォルトの名無しさん:2007/01/22(月) 19:02:40
>>831
結局何を聞きたいのかわからん。
円未満切捨てで扱う数が整数のみでいいなら
int同士で計算すれば加減乗除の計算結果は
キャストするまでもなく全部intになる。
833デフォルトの名無しさん:2007/01/22(月) 19:07:59
>>832

年利のときに小数点をつかうからdoubleじゃないとだめじゃないんですか?
834805:2007/01/22(月) 19:15:57
>>816
よしっ!!もう一度釣られるぞ!!イヤッホッー!!

cd sampleでsampleディレクトリに入ったら、画面に

C:\sample>

ってなっていると思う。そこに

[コンパイルしなさいという命令文][スペース][ファイル名].c

と打てばいい。
例えば命令文が bcc32 でファイル名が reidai と言うものならば
画面には

C:\sample>bcc32 reidai.c

となるように打ち込み、リターンキーを押す。
でコンパイルできるはず。
ただ命令文が何なのかはそのコンパイラに拠るからそれは自分で調べてほしいのだが・・・できるか?
835デフォルトの名無しさん:2007/01/22(月) 19:20:02
>>833
そのように計算式を立てれば、そうなる。
全て整数型でやろうと思えばできなくもない。
836754:2007/01/22(月) 19:20:55
そもそもパスが通ってないってこと無いよな
837デフォルトの名無しさん:2007/01/22(月) 19:20:57
>[コンパイルしなさいという命令文][スペース][ファイル名].c
間違い。
838デフォルトの名無しさん:2007/01/22(月) 19:21:38
>>835やってみます!
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;
}
複利計算ってこれでいいんだっけ?
840805:2007/01/22(月) 19:29:07
あっそうか、パス自体通していないのか?

命令文というのは間違いか。
841754:2007/01/22(月) 19:30:47
>>840
だって実行可能ファイル、プログラムだし bcc32は
842デフォルトの名無しさん:2007/01/22(月) 19:33:03
入門書も古いと対象読者が慣れてるだろうGUIでできることまでわざわざCUIで書いてるからなぁ
環境変数にパスセットするだけのバッチファイルも奈にやってるか分から無かったですよ、ええ
843デフォルトの名無しさん:2007/01/22(月) 19:44:39
>>842
昔はそういうことはPCを触った段階で覚えなきゃ話にならんかったのよ。
そういう時代に書かれた本の対象読者はCUIに慣れてたのさ。
過去を現在の常識で評価するなんてまるで朝鮮人みたいだな。
844デフォルトの名無しさん:2007/01/22(月) 20:07:23
いや、まあ2000年入ってからの本なんですけどね
どうやら書き方が悪かったようで、すんません
845デフォルトの名無しさん:2007/01/22(月) 20:24:17
>>844
こちらこそ早とちりしてすまんかった。
90年代前半を想像してたんだが。
846デフォルトの名無しさん:2007/01/22(月) 20:25:19
今ひどいジェネレーションギャップを見た。
847デフォルトの名無しさん:2007/01/22(月) 20:32:38
記念カキコ..._〆(゚▽゚*)
848sage:2007/01/22(月) 20:43:37
ノードを使ってハフマン記号をつくるプログラム作りたいんだけど
0.8
0.3
0.1
0.06
0.03
とかから計算はできるんだが0と1での表し方がわからないんですけど。

849デフォルトの名無しさん:2007/01/22(月) 20:49:24
小数を二進数で表示したいってこと?
850sage:2007/01/22(月) 20:57:08
http://www.yobology.info/text/Huffman_code/Huffman_code.htm
これに表があるけどこのprobabilityを入力していって
code wordを出すプログラムです。

これの計算ができたんだけども1と0の割り当てがうまくいなくてね。
851754:2007/01/22(月) 21:05:13
>>850
木は作ってる?
852デフォルトの名無しさん:2007/01/22(月) 21:06:58
>>850
ハフマン木が出来てるならrootから辿って
符号を割り当てていくのが普通だと思うんだが。
というか俺は学校の課題ではそうした。
853デフォルトの名無しさん:2007/01/22(月) 21:09:04
>>850
URL削ったらそこのサイト面白いな。
何か得した気分だ。
854sage:2007/01/22(月) 21:11:09
作りました。
木の根の部分にポインタがさしてる状態です。

ここから一番下までポインタを動かして
一番下から下の2つずつに0と1をつけていってから
・・・
考えれば考えるほどこんがらがってくる
855デフォルトの名無しさん:2007/01/22(月) 21:20:00
>>854
木のデータ構造をどんな表現にしてるからわからないから出来ないかも知れないけど
rootから全てのleafまで走査していく過程で左に行ったら1付加、右にいったら0付加でいいんじゃないの。
そんな難しく考える事じゃない。そのサイトで言うなら
"A"に行く走査→rootから左で到着→1
"B"に行く走査→rootから右→左で到着→01



"H"に行く走査→rootから右→右→右→右→右→右で到着→000000
856754:2007/01/22(月) 21:23:37
>>854
どして?
>>855と大差ない説明だけど(説明下手だからわかんなかったらこっちは見なくても・・・)

木はどういう構成なの?つまり(サイトの場合)rootに対して左側が確率が高く右側が低いよね.
再帰処理使うといいよ.
そして現在通過した枝の数字を記憶させておく
だからrootからまず左を辿る.rootからAの赤点までだから Aは 1
次にひとつ戻って今度は右の枝に向かう 通過した枝は今は 0 だよね
節についてもまだ枝があるから、こんどもまた左の枝に向かう 0 1
ここで葉についたからBは01
次にひとつ戻って今度は右の枝に向かう 0 0
するとまた節にたどりつくのでその左を・・・・・

って感じでやればいいと思うけど
857sage:2007/01/22(月) 22:33:23
いやこれ昇順、降順で値がかわってくるから
短いやつならいいけど
長いやつを入力したら値が違うんだよね。
つくったやつで試しても>>850
のページの結果にならない・・・
858デフォルトの名無しさん:2007/01/22(月) 22:50:21
>>857
俺の頭が悪いからかもしらんけど
君が何を言っているのかわからない
859754:2007/01/22(月) 23:13:44
>>857
だから最初にソートするんだよ
それから確率の小さい方から木を構成していくの
で、0 1 付加するのはrootから
860754:2007/01/22(月) 23:17:46
>>857
可能ならソースをアップして
そのほうがコメント付けやすい

>>859はちょっと勘違いしてレスしたけど

確率の大きい順にソートするでしょ
あとは確率の値は必要ないの
木の構成で必要なのは「順番」だけ
code wordの生成に必要なのは木だけ
確率の値は必要ない
861sage:2007/01/22(月) 23:28:19
わかりました。
迷惑かけてすいませんでした。
書いてたプログラムをニ分木で全部書いたら
みなさんがいってたことがわかりました
862754: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
ちなみにハフマンを学校でならったとか書いているけど、大学か専門学校で習うの?
まさか高校で・・・。(((゜Д゜)))
865sage:2007/01/22(月) 23:56:50
データ構造のプログラムを書くための参考書があったんだけどない。。。
左のポインタがNULLになるまで左をすすめ
右のポインタがNULLになるまで右をすすめる。
これを再帰的にやったらいいんですかね?
問題はどう0と1を付加していくかだな。
866デフォルトの名無しさん:2007/01/23(火) 00:11:40
入力された文字列がファイルパスとして正しいか、を調べたいです。

単に指定された文字列のファイルが開けなかったから不正、ではなく、
Windows のパスとして不正な文字列 <>: 等、
エクスプローラで指定するとエラーになるケースを判別したいです。

すみませんが、皆さんのお知恵を貸してください。
867デフォルトの名無しさん:2007/01/23(火) 00:14:32
>>863
リダイレクトとパイプ。知ってる単語連ねただけだ。
868754: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まで・・・・って言うのを繰り返す


ってゴメン.いまさらながら勘違いしてた
木の生成方法だけどひとつ連結(アルファベットを結ぶ)するたびにソートが必要だった
ゴメンナサイ
どーしよ.説明したほうがいい?
869デフォルトの名無しさん:2007/01/23(火) 01:44:14
>>866
それはこのスレで扱うべき話題ではないと思う。
どこかWindowsのプログラミング関連のスレできくべき。
870754:2007/01/23(火) 02:00:05
>>865
あーーーごめんなさいぃー
リンクもダメだった
直接リンク踏んでも正常に飛ばないから
一回リンクをコピーしてからブラウザのアドレスに貼り付けて移動して・・・

それから、木の生成方法だけど説明が必要なら言ってください
うまく説明する自信は無いけど・・・
でも、今日は寝ます.寝ちゃいます
871デフォルトの名無しさん:2007/01/23(火) 02:08:36
普通に飛ぶけど?
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')の意味ががよくわからないんですけど、
教えてくださいませんか
873デフォルトの名無しさん:2007/01/23(火) 03:49:48
>>872
str[0]=str[1]+('A'-'a');

先頭の文字を2文字目を大文字にしたものに置き換えてる。
874デフォルトの名無しさん:2007/01/23(火) 03:53:43
>>873
即レスありがとうございました!
これですっきりねれますw
875デフォルトの名無しさん:2007/01/23(火) 03:57:59
toupper()の方が行儀よいんだけどな
876デフォルトの名無しさん:2007/01/23(火) 06:15:53
>>863
EXEの出力をファイルに落とし、VBではそのファイルから読み込んでやるのが一番楽かな。
具体的な方法は該当スレでどうぞ。
877デフォルトの名無しさん:2007/01/23(火) 06:30:08
charを初期化する方法って何かありますか?
char text[10]
for(i=0;i<10;i++)
{
text[i]=' '
}

みたいな原人のような方法しか思いつきません・・・しかも初期化とは言い切れないorz
878sage:2007/01/23(火) 06:45:33
おれも寝てしまいました。
基本的に左にすすめると。
そして1付加する。
if(左のポインタ==NULL)
if(右のポインタ==NULL)

言葉じゃ説明できんな。。。
左も右のポインタもひとつずつNULLじゃないかをみて
基本的には左にいくんだけどもNULLになったらひとつ戻って右にいく
こうかな?
879デフォルトの名無しさん:2007/01/23(火) 07:29:41
>>877
目的は?
文字列として使うのが目的なら、text[0] = '\0';だが。
#つーか、コンパイルできないコードを提示して原人もへったくれもないと思うが。
880デフォルトの名無しさん:2007/01/23(火) 07:48:57
>>879 目的は
あるファイルの文字を一文字ずつ読む→アルファベットが続く限りtextに一字ずつ入れる
→そうやって出来た単語を読んで単語ごとにカウントする
という風なプログラムに使用したかったんですが、textの中の全文字列を初期化しないと
次の単語を読むときに前の単語の後半の文字が残っちゃって・・・
元のcファイルは大きすぎて提示できませんでした
881デフォルトの名無しさん:2007/01/23(火) 08:24:10
>>880
文字列の取り扱いを勉強しなおせ。
882デフォルトの名無しさん:2007/01/23(火) 16:46:37
20MBほどの.hファイルをインクルードしようとしたらヒープ領域を使い果たしましたというエラーになりました。
うまくインクルードする方法はないでしょうか?
883デフォルトの名無しさん:2007/01/23(火) 17:34:53
>>880
memset()とかstrcpy()は?

>>882
ヘッダファイルを分割して、分割した各々を#includeするヘッダファイルを作り、それを#include
884デフォルトの名無しさん:2007/01/23(火) 17:35:33
20MBって何が書いてあるんだよw
インクルード以外の方法を考えた方がいい。
885デフォルトの名無しさん:2007/01/23(火) 17:38:30
WinXP上で無料でできるという条件で、Cのコンパイルが一番早いのはどのソフトですか?
886754:2007/01/23(火) 17:48:28
>>871
えっ?ほんとに?
リンク踏むとアドレスバーが↓になって「項目はありません」って表示されちゃうんだよね
http://ja.wikipedia.org/wiki/2a??a?¢c´¢a?¨

>>878
>基本的には左にいくんだけどもNULLになったらひとつ戻って右にいく
そう その通り
木の生成のほうは・・・大丈夫だよね・・・
887デフォルトの名無しさん:2007/01/23(火) 18:36:05
>>885
LSI-C86試食版かな。最近の最適化なんかの成果が全く入っていない、
今となっては単純なコンパイラなので爆速だろうと思う。

まったくお勧めはしないけど。規格準拠度が低いし、
16bitコードしか吐けないし、ライブラリはスモールモデルしかないし。
888デフォルトの名無しさん:2007/01/23(火) 18:39:55
>>887
使えねーな
889デフォルトの名無しさん:2007/01/23(火) 18:40:18
>>888
うん。だからそう書いた。
890デフォルトの名無しさん:2007/01/23(火) 20:38:02
vc2005expとか、SDK/DDKについてくるコンパイラとかどうよ。
891デフォルトの名無しさん:2007/01/23(火) 21:08:05
cl.exeがいい感じ
892デフォルトの名無しさん:2007/01/23(火) 21:25:33
Cのコンパイルについては、だいぶん前から、IO律速になった、
ってUNIXな連中が言ってた記憶があるけどな。
893デフォルトの名無しさん:2007/01/23(火) 21:29:11
頼む不毛な雑談は止めてくれ
雑談するなら理由もなく「〜はいい感じ」とか教科書や
ウェブで調べればすぐに見つかりそうな痛いレスはやめて
もう少し知識になるような雑談をしてくれないか?
894デフォルトの名無しさん:2007/01/23(火) 21:39:50
>893
その書き込みがどんな知識になるのか納得いくように説明してくれたらそうしてやるよ。
895sage:2007/01/23(火) 21:51:20
正直コテハンつけないと誰が書いてるのかわかんね
896デフォルトの名無しさん:2007/01/23(火) 21:56:50
つ[#ぶるじょあ]

898754:2007/01/23(火) 22:10:31
>>893
不毛な雑談って・・・・
雑談ってそういうもんじゃないのかな?
899デフォルトの名無しさん:2007/01/23(火) 22:25:07
頭の悪い奴が多いな このスレは
900754:2007/01/23(火) 22:27:11
雑談の意味を知らない人もいるけどね このスレは
901デフォルトの名無しさん:2007/01/23(火) 22:35:34
じゃー建設的な雑談とはなにか、ちょっと建設的に話し合ってみよーじゃないか
902デフォルトの名無しさん:2007/01/23(火) 23:14:14
役所の近くには必ず喫茶店があります。何故でしょう?
903754:2007/01/23(火) 23:26:51
>>902
役所って手続きに時間かかるから
そこで待ってろよ、ってことじゃない
904デフォルトの名無しさん:2007/01/24(水) 00:01:47
なんでいつまでも754をアピールしてるの?
というか恥をさらしてるだけ?




905754:2007/01/24(水) 00:05:10
>>904
別に、なんとなく
このほうがNG入れやすいでしょ

754はNGでどーぞ
906デフォルトの名無しさん:2007/01/24(水) 00:21:52
苦笑
907デフォルトの名無しさん:2007/01/24(水) 00:23:56
const int a = 0;
const int b = a + 1;

って書くと、gccで
tmp.c:2: error: initializer element is not constant
って怒られるんですが、
なんか書き方ないですか?
#defineにしろ、以外でお願いします。
908754: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 って名前がクソとかはなしでね
909デフォルトの名無しさん:2007/01/24(水) 00:36:03
>>908
コンパイラはaがconstだって認識してくれないもの?
右辺の成分は全部constな値じゃんかよ、
initializer element is not constant
とか嘘じゃん、
って思ってしまうんですが。

#defineが駄目なんじゃなくて、
それは思いつくから他にないものかと思いまして。

あざっす。
910754: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 を初期化できる
911754:2007/01/24(水) 00:52:38
×Cの場合 const 変数で初期化

○Cの場合 const を変数で初期化
912909: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

これ教えてください(>_<)
914デフォルトの名無しさん:2007/01/24(水) 11:17:06
>>913
宿題なら宿題スレで聞いたら?
http://pc10.2ch.net/test/read.cgi/tech/1169575464/
1をよく読んでから書いてね。
915デフォルトの名無しさん:2007/01/25(木) 00:20:48
つまりわからないってことか。。。
916デフォルトの名無しさん:2007/01/25(木) 00:24:58
mixiならやさしく教えてくれるおじさんがいるのに。。。
917デフォルトの名無しさん:2007/01/25(木) 00:26:51
socket.h や、 netdb.h など、特殊なインクルードファイルというのを、
無償でダウンロードできるところはありませんか?
918デフォルトの名無しさん:2007/01/25(木) 00:31:16
>>917
unix用のコードをwindowsで動かそうとしてないか?
919デフォルトの名無しさん:2007/01/25(木) 00:32:38
477 名前:ぼるじょあ ◆yBEncckFOU [sage] 投稿日:2007/01/25(木) 00:18:46
>>473
(・3・) エェー おもしろそうだけどそろそろ風呂入って寝るから回答できないお
          土曜日までやってくれる人がいなさそうならもいらが回答してやるお
          忘れっぽいから土曜日にゆうこりん似のアナ○画像か大沢あかねたんのコラ
          (アナ○見せてると尚可)をうpして気づかしてくれお

478 名前:ぼるじょあ ◆yBEncckFOU [sage] 投稿日:2007/01/25(木) 00:20:08
補足: コラじゃなくても大沢あかねたんの激似のエロ画像(ア○ルが見えてると最高なんだけど・・・)
でもいいお
920デフォルトの名無しさん:2007/01/25(木) 00:39:00
>>918
あ、すいませんでした、とんだ勘違いしてました。

ご教授ありがとうございます。
921デフォルトの名無しさん:2007/01/25(木) 00:40:28
>>919
あ、すいませんでした、とんだ勘違いしてました。

ご教授ありがとうございます。
922デフォルトの名無しさん:2007/01/25(木) 11:29:58
グローバルで仮引数を設定したあと、
ローカルでその引数をいろいろ変えていった場合
それは関数をまたいで保存されるのでしょうか?
923デフォルトの名無しさん:2007/01/25(木) 11:48:26
>>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
なるほど外側で設定した値は変わらないんですね。
ありがとうございました
925デフォルトの名無しさん:2007/01/25(木) 12:06:31
>>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 は 「ポインタを書き換えている」 のではなく 「ポインタが示している場所の内容」 を書き換えている
926925:2007/01/25(木) 12:07:37
× char *ptr = global_buffer;
○ char *ptr = buffer;
92725: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();/* キーを押すまで前文で停止している */

}
わかりますか?
928754: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
ポインタを使えばいいんですね。
ありがとうございました。よく分かりました。
93025: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();/* 任意のキー入力待ち */

}
じゃあこれもわかりますか?
931754: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();/* 任意のキー入力待ち */

}
93225: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();/* 任意のキー入力待ち */

}
これはどうでしょう?
933754:2007/01/25(木) 14:20:38
>>932
? ? ?
934754:2007/01/25(木) 14:41:49
>>932
これもどーしろと?
コピペミス?
935デフォルトの名無しさん:2007/01/25(木) 15:21:46
手取り足取り教えてるとつけあがる、ってことだな
936デフォルトの名無しさん:2007/01/25(木) 17:46:48
再帰のプログラム
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とする。
まあハフマンなんだけどね。

あるノードの中の値を前順走査で探したいんだけど
その経路をつけながらやるのってどうやればいいですか?
937754: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);
}
938754:2007/01/25(木) 18:03:22
>>936
あっゴメン、経路のこと忘れてた
ちょっとまってね
939754: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で経路探索終了
実際に動かしてないからバグあるかも
940デフォルトの名無しさん:2007/01/25(木) 18:35:15
>>939
だったら
struct node_tag
{
struct node_tag *parent, *child_left, *child_right;
}
てなかんじだろ?

双方向の二分木ってところか
941936:2007/01/25(木) 18:41:23
再帰をして経路を出す方法でお願いします。
何かのノードを探索するプログラムはできるんだけど
それの経路となるとね
942デフォルトの名無しさん:2007/01/25(木) 18:52:07
しかしローマ字関数名ってなあ・・・学校でそう教えてるのかな?
943デフォルトの名無しさん:2007/01/25(木) 18:56:42
>>941
宿題?
ここは作ってもらうところじゃないぞ
944936:2007/01/25(木) 19:10:34
いや宿題の一部だし。
再帰を使ってニ分木の前順走査をしたときの
経路の出し方がわからなくてね。

945デフォルトの名無しさん:2007/01/25(木) 19:19:35
>>944
>>937-939に対して何か言うことないの?

経路を出すって何をしたいんだ?
struct areに何らかの値を持たせて出力でもしたいのか、
ノードのアドレスでも出力するのか
946デフォルトの名無しさん:2007/01/25(木) 19:20:09
だから宿題はスレ違いだって言ってるんじゃないのか
947デフォルトの名無しさん:2007/01/25(木) 19:23:50
>>946
あなたの言い方だと質問=宿題だな
質問も無理ならなんなんだこのスレ
948936:2007/01/25(木) 19:25:26
>>937
ありがとうございます。
参考にさせていただきます。
再帰を使っての経路の表示の仕方は少し難しいようですね
949デフォルトの名無しさん:2007/01/25(木) 19:31:57
>>947
日本語でok
950754:2007/01/25(木) 19:36:03
>>940
>>939ののコードの prev を parrennt にしろってこと?


>>944
>経路の出し方がわからなくてね
どう出したいの?
root から だどる道を知りたいんでしょ
戻るときの一度通過した節も必要ってこと?
経路が root->left->root->right てこと?
951デフォルトの名無しさん:2007/01/25(木) 19:38:02
宿題スレは実質宿題丸投げスレだから
せっかく自分で努力しようという学生の向上心を無碍に扱うのもどうかと
952754:2007/01/25(木) 19:39:48
>>948
>>937じゃなくて>>939だよ
>>937はするーで、p->p0 ,p->p1 がNULLの時エラーになるなぁと思ってたら経路のこと忘れてレスしちゃったから

>>951
禿同
向上心があることはいいことです
953936:2007/01/25(木) 19:41:18
いや
5個くらいのノードにはいってる割合をみつけて、
rootからそのノードまでの道を表示したいんです。

木で表示してあって一番上がroot,left,rightは用います。
左にいくときは1を表示、右に行く時は0を表示したいんです。

954936:2007/01/25(木) 19:44:51
http://www.yobology.info/text/Huffman_code/Huffman_code.htm
図はこれの木をたてたものです。
probabilityとcode wordを表示したいのです
955デフォルトの名無しさん:2007/01/25(木) 19:49:59
>>953
> 左にいくときは1を表示、右に行く時は0を表示したいんです。
>>954
> probabilityとcode wordを表示したいのです

最初からそう書けよ

saiki関数の引数に0or1を格納するための配列と、格納した数(=深さ)でも渡せばいいと思う
956754:2007/01/25(木) 19:50:08
>>953-954
いや、君があのときに人ってのは分かってるの
それを知ってる上でレスしたんだけど

この前も書いたけど
木を作る段階でね
1.確率が低い2つを見つける
2.あわせてひとつの節にする
1と2を繰り返して木を作るんだけど、それは出来たの?
957936:2007/01/25(木) 19:53:24
はいできました。
rootが一番上をさすようになってます
958754:2007/01/25(木) 20:08:47
知っててコード書いたけどよく見りゃ意味の無いコードだわ>>939

>>957
木の形は表のTree of Code と同じになってる?
root から左がAで右がH
959754:2007/01/25(木) 20:15:01
あーあと経路探索は
rootから A, B, C,・・・H までのすべての経路が欲しいわけだよね
それって一度にA〜Hまでの経路を出すの?
それともAの経路が欲しいと思った時に初めて経路探索するようにするの?
(Bが欲しいと思ったらroot → Bの経路を出力のように)
960936:2007/01/25(木) 20:16:59
ひとつの経路のみでいいです。
それがわかればそれをループすればいいですから。
入力の配列も作りなおさないといけないけど
961754: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;
}
962デフォルトの名無しさん:2007/01/25(木) 20:32:52
>>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);
}

コンパイルさえもしてないのでいい加減だが、こんなのじゃだめなのかな
963936:2007/01/25(木) 20:42:50
>>961-962
ありがとうございます
参考にしてみます
964754:2007/01/25(木) 20:45:51
>>963
がんばってください
965936: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と同じと考えていいのでしょうか?

966754: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と同じと考えていいのでしょうか?
違います

木を作ったソースが気になるのですが、
前にも言いましたがソースを提示してもらったほうが解説しやすいです
まぁ私も人に自分のソース見せるのは恥ずかしくてイヤなんですけどね
967936: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;
}

968936:2007/01/26(金) 01:07:54
木はある配列に0からprobにいれて、N−1までいれて
PのポインタがN−1とN−2番目のノードをさすようにして
その2つのprobを足してpのprobにいれる。そしてpがひとつ上を指すようにする
一回ループすることにソートかけてるので
あってると思います
969754: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のコードは今チェックしてみます
970754: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);
}
です.
ただし処理ごとに表示しているので配列の必要はないんですけど.
971754: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 においては戻り値はいりません
972936:2007/01/26(金) 01:29:03
>>969
すいません。
あれは略してるのでプログラム通らないに決まってます
これが
今つくってるソースです。http://sa-wiki.com/upload/src/up0095.txt.html
973754: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時以降だと思いますけど.
先に寝かせていただきますね.ゴメンナサイ

では、お疲れ様でしたぁ.


明日には次スレ立ってるのかなぁ((ひとりごと・・・・
974936:2007/01/26(金) 01:52:55
>>973
すいませんP=NULLのとこなおしたら
それらしいのでました。
ありがとうございました
975デフォルトの名無しさん:2007/01/26(金) 11:51:24
「続行するには何かキーを押してください」状態を

while(1){
  if (kbhit() == 1){
    break;
  }else{
    Sleep(500);
  }
}
fflush(stdin);

このように作ったのですが、押したキーがこの次にあるfgetsによって読まれてしまいます。
どうすれば解決できるでしょうか?
976デフォルトの名無しさん:2007/01/26(金) 12:23:20
>>975
fflush(stdin)は未定義です。getc()等で読んで捨ててください。
977デフォルトの名無しさん:2007/01/26(金) 17:43:43
>>975
これでいける!多分…

while(1){
  if (kbhit() == 1){
    while(kbhit())
      getch();
    break;
  }else{
    Sleep(500);
  }
}
978754:2007/01/26(金) 17:59:49
>>974
それはよかったです
なにかあったらまた質問どーぞ


あれから書き込み4件しかないとは......
次スレまでまだまだですねぇ
979デフォルトの名無しさん:2007/01/26(金) 21:41:36
次スレ準備♪
★★★★★ スレタイ ★★★★★
C言語なら俺に聞け(入門篇) Part 7
★★★★★ テンプレ ★★★★★
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 6
Part 6 http://pc10.2ch.net/test/read.cgi/tech/1167325490/

過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 http://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 http://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 http://pc8.2ch.net/test/read.cgi/tech/1165022193/

関連スレ
C/C++の宿題を片付けます 82代目
http://pc10.2ch.net/test/read.cgi/tech/1169575464/l50
くだすれC言語(初心者用)
http://pc10.2ch.net/test/read.cgi/tech/1153542424/l50
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc10.2ch.net/test/read.cgi/tech/1159613789/l50
【初心者歓迎】C/C++室 Ver.34【環境依存OK】
http://pc10.2ch.net/test/read.cgi/tech/1169039760/l50

【C 関数検索 man on WWW】 http://www.linux.or.jp/JM/index.html
980デフォルトの名無しさん:2007/01/27(土) 11:09:47
重複です。こちらに移動してください。

ぼるじょあがC/C++の宿題を片づけますYO! 67代目
http://pc10.2ch.net/test/read.cgi/tech/1165718021/
981ぼるじょあ ◆yBEncckFOU :2007/01/27(土) 18:27:59
( ・3・)<宿題しか受け付けないから>>980は無視するのがいいYO!
       淋しい>>980は宿題を持ってくれば相手をしてあげるお
982デフォルトの名無しさん:2007/01/27(土) 20:58:38
>>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;
}
983デフォルトの名無しさん:2007/01/27(土) 21:10:46
>982
その問題ってなによ?
984982:2007/01/27(土) 21:22:06
(続き)
単純化すると>>982のようなプログラムなのですが、
コメントアウトされたfflush(stdin);の代わりにその下の3行を入れたところ
標準入力の中身が捨てられず、8文字以上入力すると8文字ごとに読み込み
strcmpして、NGと表示してしまいます。

kbhit()って、先頭が読み込まれていたらその残りに関しては
1を返さないんでしょうか。
985デフォルトの名無しさん:2007/01/28(日) 05:49:03
>>984
kbhit() はキーボードバッファの状態を調べて返す関数だが、
fgets() 関数が呼ばれたときに、キーボードバッファの中身が
ストリームバッファ stdin に移ってしまって、
キーボードバッファの中身が空になってしまい、
意図した動作になっていないんだと思われる。

fgets() を使わずに getch() で読むように変更するか、
fgets() で得られた文字列の終端が '\n' でなければ、
\n または EOF がくるまで読み飛ばすようにすればOK
986985: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);
    }
987デフォルトの名無しさん:2007/01/28(日) 06:15:03
>>984
fflush(stdin); はやめれ
どうしてもというなら環境依存スレ行け
988デフォルトの名無しさん:2007/01/28(日) 09:09:54
>>987
fflush(stdin)を違う方法で置換したいがための質問だと思われ。
989デフォルトの名無しさん:2007/01/28(日) 12:40:43
>>987
昔の人ですか
990デフォルトの名無しさん:2007/01/28(日) 13:16:26
昔も今も、fflush(stdin)はいかんと思うが。
991デフォルトの名無しさん:2007/01/28(日) 14:55:55
>>989は最先端なだけだよ!からかうなよ!
992デフォルトの名無しさん:2007/01/28(日) 15:19:11
フォーとらアッーん
993デフォルトの名無しさん:2007/01/28(日) 15:54:07
994デフォルトの名無しさん:2007/01/29(月) 04:51:10
>>989の説明まだー?(AAry
995デフォルトの名無しさん:2007/01/29(月) 09:58:33
fflush(stdin)はLSI-Cではおk
996デフォルトの名無しさん:2007/01/29(月) 10:57:45
>>995
んな過去の遺物に依存したプログラミングは推奨できません。
997デフォルトの名無しさん:2007/01/29(月) 11:09:23
これじゃどっちが昔の人かわからんなw
998デフォルトの名無しさん:2007/01/29(月) 15:46:51
LSI-Cwwwwwwwwwwwwwwwwwww
999999:2007/01/29(月) 17:41:23
銀河鉄道999
1000999:2007/01/29(月) 17:42:17
と言うわけで1000年女王も頂きます
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。