C/C++の宿題を片づけます 51代目

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
あなたが解けないC/C++の宿題を片づけます

――【注意点】―――――――――――――――――――――――――
・質問は必ず【質問テンプレ】に従ってください。
・問題文は、解いてもらう方にわかりやすいように全文を書きましょう。
・計算問題は必ず数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です。
―――――――――――――――――――――――――――――――

【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS: Windows/Linux/等々
 [3.2] コンパイラ名とバージョン: gcc 2.9 VC 6.0等
 [3.3] 言語: C/C++/どちらでも可 のいずれか
[4] 期限: [yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか (「できるだけ早く」は不可)
[5] その他の制限: どこまで習っているか、標準ライブラリは使ってはいけない等々

【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
【C 関数検索 man on WWW】
http://www.linux.or.jp/JM/index.html

【前スレ】
50代目: http://pc8.2ch.net/test/read.cgi/tech/1126357741/
2デフォルトの名無しさん:2005/10/05(水) 15:21:54
3デフォルトの名無しさん:2005/10/05(水) 15:22:27
4デフォルトの名無しさん:2005/10/05(水) 15:23:07
5デフォルトの名無しさん:2005/10/05(水) 15:23:41
6デフォルトの名無しさん:2005/10/05(水) 16:39:17
7前回の946,894:2005/10/05(水) 17:14:44
[1] C
[2] http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/955.txt
  テストできる環境にして欲しいです。
[3] 環境
 [3.1] Windows2000
 [3.2] VC 6.0
 [3.3] C
[4]2005年10月5日18:00まで
[5] その他の制限: 特に無いと思います。
8デフォルトの名無しさん:2005/10/05(水) 17:28:42
>>7
余計な注釈入れずにテストしたコードをそのまま上げろ
それに<vector>ってC++だろ
9前回の946,894:2005/10/05(水) 17:39:02
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/955.txt
に全部書いたつもりなんですけどね。。
最初のファイルのバイナリ読み込みモードでのオープンができないです。
10デフォルトの名無しさん:2005/10/05(水) 17:51:07
>>9

正直、糞すぎ。
一番下の
GetEnergy((struct _iobuf*)&allFp,(char*)&lpszFileName,(int)&nStep,(int)&allDNum);
はたぶん。
GetEnergy(allFp,lpszFileName,nStep,allDNum);
こう。

で、こう直してもallFpもnStepも未初期化だから絶対に意図したようには動かない。

これ以上は見る気も失せたから知らん。
11デフォルトの名無しさん:2005/10/05(水) 17:57:07
>>10
lpszFileNameも未初期化ですね。
というか何したいねん。これ
127,8:2005/10/05(水) 18:02:38
ただテストしたいんですけど、どう値を当てていいか解らず、
質問しました。
初めは>>10のGetEnergy(allFp,lpszFileName,nStep,allDNum);
にしたんですけど、↓になってしまい
warning C4700: 値が割り当てられていないローカルな変数 'nStep' に対して参照が行われました。
warning C4700: 値が割り当てられていないローカルな変数 'lpszFileName' に対して参照が行われました。
warning C4700: 値が割り当てられていないローカルな変数 'allFp' に対して参照が行われました。
苦し紛れにキャストしてしまいました。
13デフォルトの名無しさん:2005/10/05(水) 18:07:34
警告はコンパイラの出す唯一の親切。
それを黙らすのがそもそも間違いというか人間として腐ってる。

あと、テストするときの値を何にするかは今の情報だけじゃ、こっちは分かるはずがない。
自分でテストするべき値を割り当てろ。
147,8:2005/10/05(水) 18:13:56
警告はコンパイラの出す唯一の親切←なるほど
もう一回調べてみます。
15デフォルトの名無しさん:2005/10/05(水) 18:17:46
テストって,上の部分もおまいが作ったのか?
167,8:2005/10/05(水) 18:23:01
そうだけど。
17デフォルトの名無しさん:2005/10/05(水) 18:23:56
>>15
自分で作っといてテスト方法が分からんはありえんだろ。
1817:2005/10/05(水) 18:27:07
>>16
Σ(´ロ`;)
19デフォルトの名無しさん:2005/10/05(水) 18:35:53
つーか、最低限どういう引数を取ってどういう処理をする関数なのかぐらい書けよ
20おしえて厨:2005/10/05(水) 18:41:01
[1] 授業単元:画像関連の科目

[2] 問題文(含コード&リンク):
白黒画像ファイルを読み込んで、その画像ファイルを碁盤の目のような感じに小さい正方形たちに区切られているとみなし、
その正方形ひとつひとつにつき、正方形内に占める黒画素の割合をそれぞれ計算して出力するプログラムを作れ。
左上、右上、左下、右下の4つの正方形領域があるとみなして、それぞれの領域内での黒画素の割合を出すってだけでもいい。
何個の正方形に区切るかは任意。

[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C/C++/どちらでも可
[4] 期限: [2005年10月6日まで]
[5] その他の制限: 画像ファイルはpgm形式
21デフォルトの名無しさん:2005/10/05(水) 18:47:56
>>7,8
なんつーかね,君がやりたいことを書いてくれれば一から書き直すからさ.
きちんと全部説明してくれよ.そのほうが絶対に早いし,動くものができるからさ.
22デフォルトの名無しさん:2005/10/05(水) 18:50:42
>>7-8
下のことをまとめてくれ。

1) プログラムの概要(何をするためのプログラムか?)
2) 入力ファイルの形式(orサンプルファイル)
3) プログラムの処理の流れ
4) 期待している処理の結果(出力ファイル、表示形式等)

あと、ソースにmain関数が入ってないぞ。
237,8:2005/10/05(水) 18:50:58
ファイルポインタと、ファイル名と、
nStepって言う名の番号と、allDNumという名のデータ数を渡したいんですけど
ファイル名とnStepとallDNumは渡せたんですけど、
ファイルポインタだけ渡せないんですけどどうすれば渡せますか?
247,8:2005/10/05(水) 19:16:56
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/957.txt
お願いします。
バイナリのallファイルをテキストに変えて、.ascファイルで保存するプログラムです
.allから.asc
処理の流れは出来てます。このソースは他に作った関数と組み合わせて使うので、
mainは別にあります。
関数に引数の渡し方が解らないだけです。。よろしいでしょうか?
25デフォルトの名無しさん:2005/10/05(水) 19:20:31
「話の噛合わなさ」が笑えるずれですね
26デフォルトの名無しさん:2005/10/05(水) 19:22:14
>>24 どうやら君とは意思疎通ができないようだ 力足らずで申し訳ない 諦めてくれ
27デフォルトの名無しさん:2005/10/05(水) 19:29:18
cの質問です

char型の入力をするのに
scanf()とgetchar()
がありますが、それぞれの長所短所って何ですか?
初歩の初歩ですいません
28デフォルトの名無しさん:2005/10/05(水) 19:32:58
>>27 宿題形式の答えが欲しければ>>1のテンプレに従うこと。
そうでなくて、そーゆー疑問をもったのなら、以下のスレで聞くこと。
C言語なら俺に聞け! Part 115
ttp://pc8.2ch.net/test/read.cgi/tech/1127737437/
297,8:2005/10/05(水) 19:37:33
もう一回あとで書き直します。一回リフレッシュします。
30デフォルトの名無しさん:2005/10/05(水) 19:38:02
>28

ごめんなさい。
誘導ありがとうございます。そっちのほうで聞いてみます
31デフォルトの名無しさん:2005/10/05(水) 19:42:59
>>20
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/958.cpp

plain text な pgm (ヘッダが P2) なら動作するはず.
あと,pgm は濃度情報もあるから,完全に黒のときに割合が 1 になるようにしといた.
不都合があったら適当になおしてくれい.
32デフォルトの名無しさん:2005/10/05(水) 19:47:58
いやはー。C++は便利だのぉ。
C++の標準ライブラリ、俺も使いこなしてぇ。>>31
スレ違いだが、参考書を教えてちょ。
33デフォルトの名無しさん:2005/10/05(水) 19:54:51
>>31
main の if (!pgm_read( "sample.pgm", data, max_level)); はセミコロンの前に
return 0 でも入れてください.エラー処理書くつもりで忘れてた.
34& ◆hJb7GWrzxo :2005/10/05(水) 20:16:51
>31, 33

どうもたすかりましたありがとう
35デフォルトの名無しさん:2005/10/05(水) 20:17:03
>>24
エスパーになった気分で質問に答えとく。

AllToAscFileConvert()でバイナリファイルが開けないなら、
引数のファイルパスが本当に正しいか確認しろ。

あと、GetEnergy()はAllToAscFileConvert()の中じゃないと呼べない。
なぜなら、引数で渡してるallFpはAllToAscFileConvert()の中で開いてるファイルの
ポインタだからだ。

コンパイルが通ったなら、あとはブレークポイント張ったり、ログを出力したりで
怪しいところを1個ずつチェックしていけ。
36おしえて君:2005/10/05(水) 20:37:17
[1] 授業単元:画像関連の科目

[2] 問題文(含コード&リンク):
白黒2値画像ファイルを二枚読み込んで、二枚の画像を引き算した結果を出力するプログラムを作れ。
画像の引き算というのは、画像のそれぞれの画素を、もうひとつの画像の同じ座標にある画素で引き算するということ。
引き算の結果は1か0になるように、すべて絶対値をとること。
最後にすべての画素での引き算結果の絶対値を合計する。そしてその数値を出力してほしい。

[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C/C++/どちらでも可
[4] 期限: [2005年10月6日まで]
[5] その他の制限: 画像ファイルはpgm形式
37デフォルトの名無しさん:2005/10/05(水) 20:43:20
まー、その、なんだ。
元画像のファイルをupしてくれ。
38デフォルトの名無しさん:2005/10/05(水) 20:55:47
次から次へと白黒画像ファイルの課題が来る予感('A`)
39& ◆McolPJAn7. :2005/10/05(水) 21:14:45
4036:2005/10/05(水) 21:26:35
> 次から次へと白黒画像ファイルの課題が来る予感('A`)

これでおしまいです。どうもご迷惑おかけしてすみません
41デフォルトの名無しさん:2005/10/05(水) 22:02:34
白黒、01というから、2値画像と思ったんだが。グレイスケールなのな。
引き算の意味がわからんな・・・。
A B A - B
0 0 0
0 1 0
1 0 1
1 1 0
って考えればいいのか?
あと、。閾値もかんがえんといかんのか。
42デフォルトの名無しさん:2005/10/05(水) 22:21:22
>>41
2つの画像で重なってる画素の部分を単純にXORすればいいんじゃないの?
4336:2005/10/05(水) 22:32:24
ありゃあ、そういえば2値画像ではなくてグレイスケール画像なのでした・・・。
でも、255の半分の127か128を閾値にして、それより上は全部255、
それより下は全部0みたいにすればいいと思います。
あと、引き算はマイナスになると絶対値をとるので、
例えば0-1も1となるようにしてもらいたいです。
44デフォルトの名無しさん:2005/10/05(水) 22:39:25
>>42
グレースケールの XORって何物さ?
例えば 0.7 xor 0.4 っていくら?
4536:2005/10/05(水) 22:58:26
>>44

グレイスケールの各要素を閾値を使って2値分割してからXORすれば
いいんじゃないかと
46デフォルトの名無しさん:2005/10/05(水) 23:02:26
>>44 プ
47デフォルトの名無しさん:2005/10/05(水) 23:10:23
>>44

>>42で言ってるのは、
グレースケール1画素=8bitのunsigned値でXORってことでしょ。

・・・って、釣られてる?
4836:2005/10/05(水) 23:53:28
なんだかむずかしくてよくわからない話になってきました・・・
49デフォルトの名無しさん:2005/10/06(木) 00:17:37
単に飽和加算と飽和減算してやればいいと思われ
50デフォルトの名無しさん:2005/10/06(木) 00:18:39
ただし濃度の最大値を最小公倍数に調整
51デフォルトの名無しさん:2005/10/06(木) 01:25:20
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/960.txt
一番重要な部分のアルゴリズムに関しては
・128を閾値にして2値化 → 最上位ビットが1か0か
・2値の差の絶対値 → XOR
・…の和をとる → 該当ビットが0なら足さない、そうでなければ+1
をまとめて1行になってる。

チェックは半端にしかやってない。
$ a.out n0.png std0.png
の形で実行して。
52デフォルトの名無しさん:2005/10/06(木) 09:05:24
pgmは幅高さ深さの情報が、二行に分かれていることを保証していないがいいのだろうか。
例えば、
--
P2 1 1 255
128
--
ってファイルもありなんだけど。
537,8:2005/10/06(木) 12:48:03
[1] C
[2] バイナリモードで開いたallファイルの値をテキストで保存する処理
allファイルの値↓
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/961.txt
[3] 環境
 [3.1] Windows2000
 [3.2] VC 6.0
 [3.3] C
[4] 期限: [2005年10月6日14:00まで]
[5] その他の制限:特になし
54デフォルトの名無しさん:2005/10/06(木) 12:57:27
>>53
入力バイナリファイルのサンプル
出力テキストファイルのサンプル
および、それぞれのファイルの構造を説明した文章
をUPせよ。
557,8:2005/10/06(木) 12:58:11
↑値は入ってるものだと思ってください。
よろしくお願いします。
56デフォルトの名無しさん:2005/10/06(木) 13:00:06
私にはこの情報だけでは無理だ。
57デフォルトの名無しさん:2005/10/06(木) 13:03:54
>>55
だから、あなたが示したものはソースコードであって、バイナリファイルの本体じゃない。
『藻前の持ってるallファイル』をUP汁。それとも人には見せられない内容なのか?
58デフォルトの名無しさん:2005/10/06(木) 13:11:54
>>53
仮にバイナリファイルを読み込んだ結果が>>53だとしても、
出力ファイルの書式がわからないし、
構造体の値をどのように使えばよいのかわからない。

せめて出力結果の例と、構造体メンバとの対応くらいは説明しろ。

なんか3回くらい同じこと言ってる気がするぞ。
59デフォルトの名無しさん:2005/10/06(木) 13:14:47
ポインタをバイナリ形式で保存ってのはムズイと思うんだが。
607,8:2005/10/06(木) 13:18:36
allファイルを拡張子だけ変えて拡張子ascファイルにするんですけど、
allファイルはバイナリの値が入ってるものだと思ってください
出力は例えば、
10.509150
1212
12.90324
4235
 ・
 ・
 ・
BOOLは出力しなくていいです。気にしないで下さい。
AAAは可変なんですAAA内のデータ件(10件)分出力する
MMMも可変でデータ件数(5件)分出力する
AAAのみ出力
AAAはBBBを読み込まないとAAAは解らないとします。
やっぱりバイナリの値を決めます。
バイナリの値は
f=22.33F
i=5
d=12.3
です。
61デフォルトの名無しさん:2005/10/06(木) 13:18:51
> typedef MMM *pAB;
これにものすごい違和感を覚えたのは俺だけだろうか。
627,8:2005/10/06(木) 13:23:02
*.allファイルのAAAの値を*.ascファイル形式に変換して保存
*.ascファイル名は変換元となる*.allファイルの拡張子をascとしたもの
63デフォルトの名無しさん:2005/10/06(木) 13:23:28
>allファイルを拡張子だけ変えて拡張子ascファイルにするんですけど
rename()
64デフォルトの名無しさん:2005/10/06(木) 13:26:14
> *.allファイルのAAAの値を*.ascファイル形式に変換して保存
int c;
FILE *fin, *fout;
/* 略 */
while ((c = getchar(fin)) != EOF)
fprintf(fout, "%02x ", c);
65デフォルトの名無しさん:2005/10/06(木) 13:30:15
>>60

> AAAは可変なんですAAA内のデータ件(10件)分出力する
> MMMも可変でデータ件数(5件)分出力する
データ件数はどこから持ってくる?

> AAAのみ出力
ということは、上の例はAAAのメンバを順番に1行ずつ出力してると
考えていいんだな?その場合、有効桁数はどうするんだ?

> AAAはBBBを読み込まないとAAAは解らないとします。
AAAとBBBの関係を示せ。
BBBからAAAのデータを作るという意味か?わけわからんぞ。
66デフォルトの名無しさん:2005/10/06(木) 13:30:24
> allファイルはバイナリの値が入ってるものだと思ってください
そのファイルの形式が不明(Cの構造体では説明になっていない)。
ってことで、>>54 >>57-58が要求している情報の回答が必要だと思うよ。
677,8:2005/10/06(木) 13:36:50
あっデータ件数は
allファイルにあります。。。
(allファイル)
データ件数  int  ここでは10件とします
687,8:2005/10/06(木) 13:40:10
↑先頭にあります(データ件数)
69デフォルトの名無しさん:2005/10/06(木) 13:42:19
あー。最初から読んでようやくわかった。
>>53 のプログラムは説明用に書いたものか・・・。
わざわざわかりにくくしてるね。
んで、これ、業務? ゼミ?
質問の仕方が下手だと、仕事おわんないよ。とりあえず、本番のプログラム、データをUPしよう。
複数ファイルになるならzipで固めるとかすればよろしい。
707,8:2005/10/06(木) 13:43:42
ちょっとしっかり書きます。みなさんすみません
717,8:2005/10/06(木) 13:49:20
*.allの中身

 項目名       型     備考
データ件数     int   ここでは10件とします

ここからデータ件数分繰り返す
AAA内のデータ数   int   ここでは5件とします
AAAの値      float  AAA内のデータ数分出力
72デフォルトの名無しさん:2005/10/06(木) 13:51:11
あー。こらこら。AAAとか分けのわからん名前をつけたでっちあげのものを使うのはやめなさい。
本番の名前をつかいましょう。
737,8:2005/10/06(木) 13:55:38
出力は(例)
10←データ件数(固定)
10.509150
2.906092
-2.487760



747,8:2005/10/06(木) 13:57:41
本番の名前ですか・・
ええっとAAA→TOP
AAAを格納する構造体の名前→ONESELF
757,8:2005/10/06(木) 13:58:36
>>72
解りやすいかと勘違いしました。それでAAAとしました。すみません。
76デフォルトの名無しさん:2005/10/06(木) 13:58:42
*.allのバイナリファイルをUP。
77デフォルトの名無しさん:2005/10/06(木) 14:02:01
>>74 んー。翻訳されると、逆にわかんないので、
・本番の構造体
・本番のファイル
・本番のソースファイル
をUPしたうえで、>>1のテンプレートにしたがって、書き直してください。
変遷してるみたいだから、書き直してもらわないと、全体がつかめなくなっています。
787,8:2005/10/06(木) 14:02:41
バイナリのファイルはこれが出来上がってじゃないと先生がくれないんですよ。
処理ができたらファイルをくれるので、値は決まってないです。
79デフォルトの名無しさん:2005/10/06(木) 14:04:39
[4] 期限: [2005年10月6日14:00まで]

終了だな。乙。
807,8:2005/10/06(木) 14:06:08
本番用を簡潔に表したんですけど。。掴めなさそうなので、、upします。
81デフォルトの名無しさん:2005/10/06(木) 14:07:58
釣り師同士が釣り合いしているスレはここでつか?
82デフォルトの名無しさん:2005/10/06(木) 14:14:37
要は>>9>>24のソースにあるGetEnergy()を
ちゃんと動くようにしてくれってことでしょ。

>>78
> バイナリのファイルはこれが出来上がってじゃないと先生がくれないんですよ。
それでも、
・バイナリファイルの形式(データ構成)
・テキストファイルの形式(出力フォーマット)
これらは何らかの形で先生から提示されてるはずなので、
それを「そのまま」UPしろ
83デフォルトの名無しさん:2005/10/06(木) 14:20:04
釣りだろ。センセも架空の人物な気がしてきたぞ。
847,8:2005/10/06(木) 14:42:49
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/963.txt
に書いてあります。お願いします。
↑架空の人物じゃありませんよ
857,8:2005/10/06(木) 14:46:33
↑自分で書いたソースは書き込みのところがおかしいのとバイナリの値を
テキストに変えるのが解らないです。
バイナリからテキストに変えるだけが解りません。
書き込みは何とかなると思います
86デフォルトの名無しさん:2005/10/06(木) 14:50:02
まあ、シンプルな解だが、fprintf()とか。
877,8:2005/10/06(木) 14:56:22
fprintfですか!早速試したと思います。
887,8:2005/10/06(木) 15:53:12
できました。fprintfでした!ありがとうございます。fwriteを使ってました。
89デフォルトの名無しさん:2005/10/06(木) 15:58:29
('A`) オチはそれかよ・・・
907,8:2005/10/06(木) 16:27:58
みなさんありがとうございました!ホントにすみませんでした!
9186:2005/10/06(木) 17:05:08
あー。冗談だったんだが。
つーか・・・printf系は教科書の最初の方にでてるはずだし、
仮にfprintfを知らなくてもマニュアルのprintfと同じ位置に書かれてそうに思うが。
92デフォルトの名無しさん:2005/10/06(木) 17:44:05
fwriteって・・・K&Rでは付録の標準ライブラリ関数一覧でしか触れられてない様な奴だぞ
いくらなんでもネタだろ
93デフォルトの名無しさん:2005/10/06(木) 17:47:38
マニュアルってどこにあるの?
94デフォルトの名無しさん:2005/10/06(木) 17:53:32
googleとかMSDNとかJISハンドブック情報処理編(これは今出てないか)とか
manとかLSI Cの付属のものJISCのPDFとか。ネタだと思っても反応してしまう。
俺はマニュアル代わりにH&Sリファレンス使ってるが・・・絶版だな。
957,8:2005/10/06(木) 18:33:13
結構本気でした。うっかり忘れてました。。。すみません
9636:2005/10/06(木) 18:37:28
>31
のこれ
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/958.cpp
ウィンドウズのコマンドプロンプトで動作確認してみたところ、
何も出力されないんだけど、linuxだとうまくいきますか??
ウィンドウズで何も出力されないのは、何が原因なんでしょうか??
どこを変えるとウィンドウズでもlinuxでも動くようになるの??
97デフォルトの名無しさん:2005/10/06(木) 18:41:37
まあ、書き換えればOKじゃない。
9831:2005/10/06(木) 18:47:49
>>36
手元の Windows の Borland C++ Compiler と cygwin の g++,Gentoo の g++ で
pgm の資料のページにあった奴をコピペしたら一応走ったので書いちゃったけど,
エラー処理とか全然してないので駄目かも.

入力に使ったファイルうpできますか?
9936:2005/10/06(木) 18:52:45
>98

ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/959.zip

これが入力画像です
どうも申し訳ない
100デフォルトの名無しさん:2005/10/06(木) 19:03:04
>>99
その画像はバイナリ版(ヘッダがP5)だね。
>96はテキスト版を想定しているから入力ロジックを書き換えないと動かない。
>98が書き換えてくれるのを待つか、今晩遅くに私が自作ロジックをあげるのを待つよろし。

10136:2005/10/06(木) 19:28:40
>100

98氏にも100氏にもどっちにも期待・・・
おねがいします
102デフォルトの名無しさん:2005/10/06(木) 19:34:16
>>101
罠だ、気を付けろ!100はおまえの先生だ!
103デフォルトの名無しさん:2005/10/06(木) 19:39:51
あるあるw
104デフォルトの名無しさん:2005/10/06(木) 19:43:18
適宜,・・・うんぬんのセンセも居たしな
105デフォルトの名無しさん:2005/10/06(木) 19:44:03
[1] 授業単元: C
[2] 問題文(含コード&リンク):
F(s)=(1/(2*PI*PI*s*s))*(sin(2*PI*s*R)-(2*PI*s*R)*cos(2*PI*s*R))

半径Rの球の散乱関数F(s)を求めるプログラムです。
scanfでRを指定して、sは0から無限大を指定したいです(while構文?)
printfでsが変わる度にF(s)を表示したいです。
グラフで表すと、sを無限大にするとF(s)が0に収束するような感じになります。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン:わかりません。
 [3.3] 言語: C
[4] 期限: [明日早朝まで]
[5] その他の制限: 4年前に勉強したがさっぱり忘れました。
もっこすお願いします
106デフォルトの名無しさん:2005/10/06(木) 19:50:43
散乱関数がよくわからない。(ごめんね)
できれば、
・その数式をグラフ付きで説明しているページ
プリーズ。
それから、
・sのキザミはいくつごと?
・プログラムで無限大は扱えないんだけども
ってことで、現在の情報では組めない。
10731:2005/10/06(木) 19:57:01
>>36 (>>99)
>>100 のとおり形式違い.というわけでさくっと作り直しますた

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/965.cpp
108デフォルトの名無しさん:2005/10/06(木) 20:19:45
>>105
>104 のとおりどこまで表示したらいいかわからんかったので
F(s) が十分小さくなるまで h 刻みで表示してやった

#include <stdio.h>
#include <math.h>
#define PI 3.141592653589793238462643383279
#define h 0.001
#define EPS 0.0001
double F(double s, double R) {
  return (1.0/(2.0*PI*PI*s*s))*(sin(2.0*PI*s*R)-(2.0*PI*s*R)*cos(2.0*PI*s*R));
}
int main() {
  double s, R, Fs = -1;
  scanf("%lf", &R);
  for (s = h; fabs(Fs) >= EPS; s += h) {
    Fs = F(s, R);
    printf("%lf %lf\n", s, Fs);
  }
}
109デフォルトの名無しさん:2005/10/06(木) 20:20:07
>>105
刻み幅がわからんから勝手に0.1刻みにした。
都合悪かったらs+=0.1のところの0.1を適当に変えといて

#include<stdio.h>
#include<math.h>
double F(double s,int R){
    return (1/(2* M_PI* M_PI*s*s))*(sin(2*M_PI*s*R)-(2*M_PI*s*R)*cos(2*M_PI*s*R));
}
int main(){
    double R,s;
    printf("R = ");
    scanf("%lf",&R);
    for(s=0;;s+=0.1)printf("F(%f)=%f\n",s,F(s,R));
    return 0;
}
110デフォルトの名無しさん:2005/10/06(木) 20:29:49
>>109
s = 0 でその F(s) は分母ゼロになって未定義になるので lim_{s → 0} F(s) = 0 を
分けて書くかループの開始をずらすかしたほうが幸せと思われ
111109:2005/10/06(木) 20:29:53
あ、修正かけるの忘れてた
×double F(double s,int R)
○double F(double s,double R)
112デフォルトの名無しさん:2005/10/06(木) 20:33:08
収束するとわかってるなら、
s = s*2で、Fの絶対値が0に十分近くなるまで計算しとけばいいんじゃないか?
113105:2005/10/06(木) 20:58:11
>>108
>>109=111
>>110
の先生がたありがとうございます。
グラフは探したけど見当たりませんでした、すいません。
ちなみに
lim_{s → 0} F(s) = 4/3πR^3
になります。
グラフを求めるためのプログラムなので
sの刻みは0.1でお願いします。
F(s)は原点反射で+−を繰り返して0に収束します。
今から夜勤なのでまた早朝チェックします。
114デフォルトの名無しさん:2005/10/06(木) 21:02:42
で、どこが問題なんだろう。
115デフォルトの名無しさん:2005/10/06(木) 21:14:27
>>113
え? Taylor 展開したら F(s) = 4/3 π R^3 s - 8/15 (π^3 R^5) s^3 + O(s^4) になったんだが。
もし s の付け忘れでないなら、式が間違ってる可能性があるのでチェックよろしく。

刻みくらいはプログラム見て直してくれ。
116デフォルトの名無しさん:2005/10/06(木) 21:32:04
[1] 授業単元:プログラム演習
[2] 問題文(含コード&リンク): http://49uper.com:8080/html/img-s/86373.zip
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: [2005年10月07日]
[5] その他の制限: とくにないです。


よろしくお願いします。
117デフォルトの名無しさん:2005/10/06(木) 21:34:10
[1] C演習
[2]
(x-x1)^2+(y-y1)^2+h^2=r1
(x-x2)^2+(y-y2)^2+h^2=r2
(x-x3)^2+(y-y3)^2+h^2=r3
但し r1:r2:r3=a:b:c

x1,x2,x3,y1,y2,y3,h,a,b,cは既知。これを満たすx,y,r1,r2,r3を求めよ。

要は三元連立二次方程式を解けってことだと思います。

[3] 環境
 [3.1] UNIX
 [3.2] gcc ?
 [3.3] C
[4] 期限: [2005年10月8日23:00まで]
[5] 特にないです

急に出題されたもので困っています。よろしくお願いします!
118デフォルトの名無しさん:2005/10/06(木) 22:15:27
>>116
1,2と3,4とでそれぞれ1問と考えてよいのだろう。4つ組む必要があるけどね。

>>117
わからん。式からして、円が3つあって、それぞれ
原点が、(x1, y1), (x2, y2), (x3, y3)
半径^2が、r1-h^2, r2-h^2, r3-h^2で、
半径の比がa, b, c。
この3つの円周が3つとも重なる点がx, yだけど・・・。
数学板で解き方おしえてもらったほうがいいかも。
119デフォルトの名無しさん:2005/10/06(木) 22:27:39
すまん。半径の比は間違いだ。
120デフォルトの名無しさん:2005/10/07(金) 00:05:48
>>116
とりあえず、1.
#include<stdio.h>
int main(int argc,char *argv[]){
char buf[1024];
FILE *fp;
size_t n;
if(argc!=2)return 1;
fp=fopen(argv[1],"r");
if(!fp)return 1;
while(1){
n=fread(buf,1,sizeof(buf),fp);
if(!n)break;
fwrite(buf,1,n,stdout);
}
fclose(fp);
return 0;
}
121デフォルトの名無しさん:2005/10/07(金) 00:08:59
>>116
んでもって、2.
#include<stdio.h>
int main(int argc,char *argv[]){
char buf[1024];
FILE *ifp,*ofp;
size_t n;
if(argc!=3)return 1;
ifp=fopen(argv[1],"r");
if(!ifp)return 1;
ofp=fopen(argv[2],"w");
if(!ofp){
fclose(ifp);
return 1;
}
while(1){
n=fread(buf,1,sizeof(buf),ifp);
if(!n)break;
fwrite(buf,1,n,ofp);
}
fclose(ifp);
fclose(ofp);
return 0;
}
122デフォルトの名無しさん:2005/10/07(金) 01:06:17
>>116
3.完成
#include<stdio.h>
#include<string.h>
int main(int argc,char *argv[]){
char buf[8192];
FILE *fp;
size_t line;
if(argc!=2)return 1;
fp=fopen(argv[1],"r");
if(!fp)return 1;
for(line=1;fgets(buf,sizeof(buf),fp);line++){
if(buf[strlen(buf)-1]=='\n')buf[strlen(buf)-1]='\0';
size_t words;
char *dp;
printf("-----%d-----\n",line);
dp=strtok(buf,",");
for(words=1;dp;words++){
printf("%d:%s\n",words,dp);
dp=strtok(NULL,",");
}
}
fclose(fp);
return 0;
}
123デフォルトの名無しさん:2005/10/07(金) 02:26:47
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc,char *argv[]){
char buf[8192],*data[256];
FILE *fp;
size_t line,a,b;
if(argc!=4)return 1;
if(!(fp=fopen(argv[1],"r")))return 1;
a=atoi(argv[2]),b=atoi(argv[3]);
for(line=1;fgets(buf,sizeof(buf),fp);line++){
if(buf[strlen(buf)-1]=='\n')buf[strlen(buf)-1]='\0';
size_t words=0,i;
char *dp=strtok(buf,",");
printf("-----%d-----\n",line);
if(dp) for(words=1;dp;words++){
data[words-1]=dp;
dp=strtok(NULL,",");
}
if(a<=words&&b<=words){
char *tmp=data[a-1];
data[a-1]=data[b-1];
data[b-1]=tmp;
}
for(i=0;i<words-1;i++) printf("%d:%s\n",i+1,data[i]);
}
fclose(fp);
return 0;
}
124デフォルトの名無しさん:2005/10/07(金) 06:32:32
>>117
要するに連立方程式
(x-x_1)^2 + (y-y_1)^2 + h^2 - t a = 0
(x-x_2)^2 + (y-y_2)^2 + h^2 - t b = 0
(x-x_3)^2 + (y-y_3)^2 + h^2 - t c = 0
の解 (x,y,t) を求めりゃいいんだな.

解析解が結構複雑になるのが見えてるので,適当にNewton法で数値計算.
面倒なので実数解の範囲で求めた.

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/966.c
125113:2005/10/07(金) 07:28:39
>>115
式の計算までしてくださってありがとうございます。
ロピタルの定理を使って分母分子を2回微分してs=0を代入すると
F(s)=4/3πR^3になるみたいです。
ありがとうございました。
126デフォルトの名無しさん:2005/10/07(金) 09:14:57
>>125
もう解決してる気がするけど、分子二回微分したら
4πR^2 ( sin(2πRs) + 2πRs cos(2πRs) )
になって s → 0 で 分子 → 0 だから、結果 0 と思うがなあ。
127125:2005/10/07(金) 11:43:22
>>126
すいません、僕の間違いでした。
最初の式が
F(s)=(1/(2*PI*PI*s*s*s))*(sin(2*PI*s*R)-(2*PI*s*R)*cos(2*PI*s*R))
でした。
すいません。。
128デフォルトの名無しさん:2005/10/07(金) 19:57:06
どうか以下の問題を助けてください┏oペコリッ

【質問テンプレ】
[1] 授業単元: ソートとサーチ

[2] 問題文(含コード&リンク):
                   @主な準備
                    ・対象データ配列作成プログラム
                      その都度指定する個数X(最大100万程度)の整数をランダムに並べた配列を作成、
                      また、必要に応じ整列済み、逆順整列済みなどのデータを作成。
                    ・処理時間の測定方法の調査
                    ・ソート結果が正しいかどうかチェックするプログラム
                   Aサーチプログラム1 与えられた配列から指定した値を検索する。
                   Bソートプログラム1 バブルソート、挿入ソートなどのNの2乗オーダのプログラムを1つ以上。
                   Cサーチプログラム2 整列済みの配列から指定した値を高速に検索する。
                   Dソートプログラム2 クイックソートなどNlogNオーダの高速ソートプログラムを1つ以上。
[3] 環境
 [3.1] OS: Unix
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: [2005年10月14日07:00まで]
[5] その他の制限: 特になしです。

まるっきり分かりません(´・ω・`)
129128:2005/10/07(金) 19:59:19
>>128
すいません
[5]その他の制限:/* */コメントこまめにつけてくれると助かります><
130デフォルトの名無しさん:2005/10/07(金) 20:52:46
よし、いい加減にヒント

(1)
>個数X(最大100万程度)の整数
これって要素数が100万って言うことですよね
→malloc()か初めから無駄に100万要素確保
>ランダムで作成
→とりあえずrand()でいいんじゃないかな
値が気に入らないようだったら複数回呼び出して作るか
(8771と6584と8402とかでたら * / \ % 使って 775840 とか)
自前で疑似乱数作るのも…
>ソート結果が正しいかどうかチェック
昇順か降順かわからないけど
昇順チェックにforかwhile使ってa[i]>a[i+1]だったらbreakして
その時のiの値によって最後までいったか途中で(ry

ごめん…time.hまともに使ったことないんだorz

(2)探してるものをbとすると
a[0]がbかどうか、a[1]が…を延々とやる。見つからない場合は(ry
(4)→バイナリサーチ
a[0]〜a[99]まで昇順のがあったら
a[(0+99)/2]=a[49]を調べる。あたり→よかったね
a[49]より大きい→a[(49+1+99)/2]=a[74]を
a[49]より小さい→a[(0+49-1)/2]=a[24]を
以下あたるまでループ。見つからなかったときの言い訳を考えておくこと
(3)(5)講義で習ったんじゃないの?
わかんなかったらその単語をgoogle他で検索
腕試しに徹夜で考えてみます
131デフォルトの名無しさん:2005/10/07(金) 20:54:28
>>128 ひとつ確認

>必要に応じ整列済み、逆順整列済みなどのデータを作成。
ってのは整列済みのデータを生成する、つまりランダム生成してからソートは駄目ってこと?

あと
>処理時間の測定方法の調査
は、 linux なら time とかいうコマンドがいるはず。詳しくは man time とか Google。
132デフォルトの名無しさん:2005/10/07(金) 21:31:30
133デフォルトの名無しさん:2005/10/08(土) 00:50:30
clock()かな・・・標準ライブラリで時間計測に使うの・・・。
あと・・・n log n のソートだと100万件でもあっとゆー間だったように思う。
1メガ個だろ・・・。今の3ギガHzとかのCPUじゃ1秒もかからんのじゃないか?
134デフォルトの名無しさん:2005/10/08(土) 01:17:11
gettimeofdayなんてどう?時間計測。
135デフォルトの名無しさん:2005/10/08(土) 01:51:21
[1] 授業単元: C言語講座
[2] 問題文:
@高さと幅40*40で8bitのグレースケールビットマップの画素値を入れた[40][40]の二次元配列を使い
  画像のエッジ処理をせよ。(輪郭を際立たせよ)

A高さと幅40*40で8bitのグレースケールビットマップの画素値を入れた[40][40]の二次元配列を使い
  80%に縮小せよ。

[3] 環境
 [3.1] OS: Windows2000
 [3.2] コンパイラ名とバージョン:VC
 [3.3] 言語: C
[4] 期限:[無期限]
[5] その他の制限:ライブラリ禁止 モジュールなど使わずにfor文や配列などの基礎的なものだけで回答せよ。

1の問題はラプラシアンなど微分演算しないでも出来、マスク処理をするとやりやすいとのことでしたが、msdnのサイトや
ビットマップの構造についていろいろ調べてもさっぱりでした。

2の問題は2分の一に縮小は出来たのですが、配列のみで%で縮小・拡大率を変えることが出来ませんでした。
あまり役に立たないと思いますが二分の一の時のソースを記しておきます。よろしくお願いします。
//2分の1縮小
biWidth = srt->biWidth/2;
biHeight = srt->biHeight/2;
Arr = CreateArr2(biHeight, biWidth);
for(i=0; i<Height; i+=2){
  for(j=0; j<Width; j+=2){
   Arr[i/2][j/2] = Arr[i][j];
  }
}


136デフォルトの名無しさん:2005/10/08(土) 02:09:20
>>135
1は注目画素と隣接画素の差を取るだけでもそれっぽくなるけどそれじゃダメなのかな?
2は同じ要領で1/2のかわりに.8倍すればいいと思う。
137128:2005/10/08(土) 03:06:12
>>130
まるっきしソースから分からないんです;;
もし、お暇があればお願いしますです。

>>131
私もそこで迷ったんですが。。。そもそもランダムのさえ作るのがわからなくって・・・全然進展しません;;
いきなり作れって言われた感じで・・・

>>132
ありがとうございます!ありがたく受け取りますです┏oペコリッ
138デフォルトの名無しさん:2005/10/08(土) 07:04:53
スキヤキにビールを入れるとか肉ばっか喰うとか、カンベンしてください。
139デフォルトの名無しさん:2005/10/08(土) 08:08:57
>>128
(2), (3), (4) まとめて。(1) はよくわからんのでパス。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/968.c
140デフォルトの名無しさん:2005/10/08(土) 09:12:24
>>128
>・処理時間の測定方法の調査
時間を計るときにどこにスタートとストップを置くかじゃないかな?
141デフォルトの名無しさん:2005/10/08(土) 09:45:18
>>139
神。・;+゜・(ノД`):・゜+:・。ありがとうです;;
142デフォルトの名無しさん:2005/10/08(土) 10:03:32
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/969.c

不完全の上先越されたけどあぷ
>対象データ配列作成プログラム 
ここくらいしか見るところないかも。領域確保とデータ作成が別になってる
143135:2005/10/08(土) 12:33:59
>>136
@
一応下記のように前後の配列を比べて違う時だけ取り出すやり方を一つのやり方を作ってみたのですが
違うやり方を想定していたらしくて。
下記のものも不完全で縦の行を上下で比べ方が前後を比べるやり方で出来ないため横の直線だけ空白になってしまい
どうしたらいいのか解らないので凍結していました。
for(i=0; i<Height; i++){
for(j=0; j<Width; j++){
if(Arr[i][j+1] != Arr[i][j-1]){
Arr2[i][j] = Arr[i][j];
}
}
}

Aは今は80%だけど35%もしくは117%のように縮小拡大に対応させれるようにしなくてはいけないので。
縮小の場合は配列を何個飛ばしで読み込みの計算が小数の扱いなどがわからなくて。
拡大は2倍の時は2個連続で同じ配列の値を読みこんでいたのですが。
144デフォルトの名無しさん:2005/10/08(土) 12:44:14
>>143 丸数字は避ける癖を付けたほうがいいとおも
(1)
if (Arr[i][j+1] != arr[i][j-1] || Arr[i-1][j] != Arr[i+1][j]) Arr2[i][j] = Arr[i][j]
じゃだめなの?

(2) x パーセントにする → 画像を x 倍して100個飛ばし or 100個の平均を取る
145デフォルトの名無しさん:2005/10/08(土) 13:43:32
>>144

今すぐは試すことが出来ないのですがやってみます。ありがとうございました。
146デフォルトの名無しさん:2005/10/08(土) 15:25:00
[1] 授業単元: プログラミング演習
[2] 問題文(含コード&リンク):
コマンドラインから指定したファイルをいったんメモリに全て読み込み、
その後内容をバイト単位で16進するプログラムを書け
[3] 環境
 [3.1] OS: X端末っていわれてるこんぴゅーたです
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: できれば月曜中でおねがいします
[5] その他の制限: よろしくおねがします
147デフォルトの名無しさん:2005/10/08(土) 15:26:28
[1] 授業単元:応用プログラミング
[2] 問題文:デジタル音声データ処理において、音の高低を求めるピッチを求める時雑音処理のために平均化処理が行われる。
音声を短い時間窓で区切って、各区間で周波数を求めることにより、音の高低の推移がわかる。

ある手法で求められた各時間窓の周波数(HZ)を入力し、その値を平均化するプログラムを作成せよ。
ここで平均化処理は以下のように前後の値の平均からその値を求めることによりなされる。
例えば入力データが以下のようだとする。
104 99 99 97 96 93 90 87 83 79 75 72 69 67......

すると5番目のデータの平均化された値は5番目のデータの前後のデータに重みをつけた平均で求められる。
今回は前後2個のデータと、指定した数値自身のデータ(5番目の場合3,4,5,6,7番目のデータ)で平均を求め、平均を求めるに当たっての重み付けは自分より2つはなれたデータの重みは2、後の3つのデータは3とする。
したがって、5番目のデータの平均化された値は以下の式で求められる。
{(3番目*2)+(4番目*3)+(5番目*3)+(6番目*3)+(7番目*2)}/13

これを一般的に書くと重み関数をw[5]={2,3,3,3,2}
元の値が配列p[]に入っているとすると、
i番目の平均化された値q[i]
q[i]=(廃[i-2+k]*w[k])/13(シグマはk=0,5つの数値の総和)で求めることが出来る

ただし、最初や最後の数値の場合は、前後の値が無いので、i-2+kが0以下の場合は0番目のデータ、データ数を超えた場合は最後のデータを用いることにする。
また、入力データはdouble型の配列で処理する。
実行結果はリダイレクションでファイルからデータを読み込み、結果もリダイレクションでファイルに書き出す。
 [3.1] OS:WindowsXP
 [3.2] コンパイラ名とバージョン:不明
 [3.3] 言語:C++
[4] 期限: [2005年10月12日9:00まで]
[5] その他の制限:配列まで習ってます。
どなたかお願いします。使ってるテキストに書かれている例がわかりづらくてどうにもならないんです。
148デフォルトの名無しさん:2005/10/08(土) 16:18:56
>>147
#include <iostream>
#include <functional>
#include <vector>
#include <algorithm>
#include <iterator>

int main()
{
  using namespace       std;
  vector<double>        v;

  copy(istream_iterator<double>(cin), istream_iterator<double>(), back_inserter(v));
  v.insert(v.begin(), 2, v[0]), v.insert(v.end(), 2, v[v.size() - 1]);

  vector<double>        result(v.size() - 4, 0.0);
  for (int i = 0; i < 5; ++i) {
    int weight[] = {2, 3, 3, 3, 2};
    for (int j = 0; j < weight[i]; ++j) {
      transform(result.begin(), result.end(), v.begin() + i, result.begin(), plus<double>());
    }
  }

  transform(result.begin(), result.end(), ostream_iterator<double>(cout, "\n"), bind2nd(divides<double>(), 13));
}
149128:2005/10/08(土) 18:23:00
後付けっていけないんですよね;;乱数はrand関数だと15ビットまでしか生成できないが
15ビット乱数×2の15乗+15ビット乱数で30ビット乱数が作成できるとか、。。。まず@番
を完成させなくちゃいけないですよね・・・(⊃д⊂)
150デフォルトの名無しさん:2005/10/08(土) 18:42:46
>>148
どうもありがとうございます。
あとこれincludeをiostreamだけで書く方法ありませんか?
自分の書き方が『配列まで習ってる』としか書かなかったので悪いのは自分なんですが、
<functional>も<vector>も<algorithm>も<iterator>も習ってないのですよorz
151デフォルトの名無しさん:2005/10/08(土) 19:04:02
ええっと・・・自作乱数関数とかなら、メルセンヌ・ツイスタとか・・・。>149
152デフォルトの名無しさん:2005/10/08(土) 19:18:58
>>149
>>130で少しいったけど
>値が気に入らないようだったら複数回呼び出して作るか 
>(8771と6584と8402とかでたら * / \ % 使って 775840 とか) 

(int)(1.0 * P * rand() / RAND_MAX);
とかでもいいとは思うけど 最大(RAND_MAX)種類しか値取れないので

v1=(rand()>>4)&255;
v2=(rand()>>4)&255;
v3=(rand()>>4)&255;
a[i]=v1<<16+v2<<8+v3;
たとえばこんなのでどうですか?

stdlib.hのrandはお手軽にランダムな数字を取ってくる二はいいけど
アレなので 統計に使いたいなら>>151でいってるメルセンヌ・ツイスターとかの方がいいかも
ttp://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html
153デフォルトの名無しさん:2005/10/08(土) 20:32:49
[1] 授業単元:C++演習
[2] 問題文(含コード&リンク):まず、getOpenというユーザーから任意のファイル名を入力させ、そのファイルを開く関数を作成しなさい。
               またこのとき、ファイルが存在しなかったら、エラーを返しプログラムを終了するようにしなさい。
               次に、void sumCountAndAverage(ifstream&, double&, double&, double&); という
               先ほど作成した関数から呼び出したファイルの中のdouble型の数の総和とその数の個数を求め、
               その後それらの値から平均値を求める関数を作成しなさい。
               最後にこれらの関数とmain関数を用いて1つのプログラムとして稼動するようにしなさい。
               このとき、main関数において、先ほど求めたファイルの中の数の総和、個数と平均値を表示しなさい。
               なお、今回使用するファイルは一行に1個ずつdouble型の数が収められており、
               最後の行の数が入力されたあとはエンターキーが一回入力された.dat型ファイルとする。
[3] 環境
 [3.1] OS: UNIX
 [3.2] コンパイラ名とバージョン: g++
 [3.3] 言語: C++
[4] 期限: 2005年10月10日20:00まで
[5] その他の制限: 特になし。よろしくお願いします。
154デフォルトの名無しさん:2005/10/08(土) 21:35:04
>>153
#include<iostream>
#include<fstream>
#include<string>
int getOpen(std::ifstream&strm){
    std::string filename;
    std::cout << "Open file name ?:";std::cin >> filename;
    strm.open(filename.c_str());
    return !strm;
}
void sumCountAndAverage(std::ifstream&strm, double&sum, double&n, double&average){
    for(double var;strm>>var;++n)sum+=var;
    average = sum / n;
}
int main(){
    std::ifstream strm;
    double sum=0,n=0,average;
    if(getOpen(strm)){
        std::cout << "Can't open file."<< std::endl;
        return 1;
    }
    sumCountAndAverage(strm,sum,n,average);
    std::cout
        << "    Sum = " <<     sum << std::endl
        << "      N = " <<       n << std::endl
        << "Average = " << average << std::endl;
    return 0;
}
155デフォルトの名無しさん:2005/10/08(土) 21:54:52
>>154
getOpenはboolを返していいだろ。
156デフォルトの名無しさん:2005/10/09(日) 09:46:00
>>146
#include <stdio.h>

hexdump(FILE * fp) {
char byte;
/* ファイルの終りまで一文字ずつ byte に読み込み */
while ((byte = getc(fp)) != EOF) {
printf("%x", (int)byte);
}
}

main(int argc, char **argv)
{
int i;
FILE *input;
if (argc == 1) /* コマンドライン引数がないとき */
printf("Specify the file name.\n");
else{
for (i = 1; i < argc; i++) {
/* argv[i] をファイル名として読み込み用のオープンをする */
input = fopen(argv[i], "rb");
if (input == NULL) {
fprintf(stderr, "cannot open %s\n", argv[i]);
return 1;
}

hexdump(input);
fclose(input);
}
}
return 0;
}
157156:2005/10/09(日) 09:49:31
>>146
失敗。これ↓を見落としていた。

>いったんメモリに全て読み込み、
158デフォルトの名無しさん:2005/10/09(日) 16:18:08
[1] 授業単元: 入社試験(と書いてあった)
[2] 問題文(含コード&リンク):
次のC言語のプログラムを最適化せよ。ただしint型は無限長のbitを持つと仮定して良い。
int f(int x,int y){
  if (x==1||x==y) return 1;
  return f(x?1,y?1)+f(x,y?1);
}
int g(int N){
  int sum=0;
  for(int i=1;i<=N;++i) sum+=f(i,N);
  return sum;
}
int main(){ return g(100000); }
[3] 環境
 [3.1] OS: 規定されていない
 [3.2] コンパイラ名とバージョン: 多分紙と鉛筆だけで解くのだと思う
 [3.3] 言語: C
[4] 期限: とくにありません。
[5] その他の制限: 他に2問あって、合計1時間で解くものでした。
159デフォルトの名無しさん:2005/10/09(日) 16:24:52
return f(x?1,y?1)+f(x,y?1);

何これ?
式 ? 真の時の値:偽の時の値
とは違うよな...
160デフォルトの名無しさん:2005/10/09(日) 16:26:15
けど?が出てくるのって三項演算子以外でないだろ
それでも構文変だが
161デフォルトの名無しさん:2005/10/09(日) 16:27:08
最適化ってのも曖昧な問題だな
162デフォルトの名無しさん:2005/10/09(日) 17:04:58
すまん。f(x-1,y-1)+f(x,y-1)だ。
163デフォルトの名無しさん:2005/10/09(日) 17:11:33
末尾最適化。再帰呼び出しを取り去る。
164デフォルトの名無しさん:2005/10/09(日) 18:09:50
>>158
やねう企画の入社試験
165デフォルトの名無しさん:2005/10/09(日) 18:29:31
>>158
ちょいと樹形図を書けばわかるけど,その g(N) のオーダーは O(2^N) より大きい.
というわけで,小手先の最適化くらいでなんとかなる問題じゃあない.

というわけで動的計画法.簡単のため M を g の入力の最大の数として,

int tbl[M+1][M+1];
int init() {
for (int i = 0; i <= M; ++i) tbl[1][i] = tbl[i][i] = 1;
for (int i = 1; i <= M; ++i)
for (int j = 1; j <= M; ++j)
tbl[i][j] = tbl[i-1][j-1] + tbl[i][j-1];
}
int f(int x,int y) { return tbl[x][y]; }

入力の値に上界を設けたくなければ適当に realloc でもすればいい.
166デフォルトの名無しさん:2005/10/09(日) 18:39:55
>>158 ああ・・・(と、模範解答を見る)・・・なるほど
f()を書き換えるだけで、main()には手をつけんな・・・俺なら。
167デフォルトの名無しさん:2005/10/09(日) 18:41:20
>>158
やっつけで
int g(int N){ 
  int i,sum=1;
  for(int i=1;i<N;i++) sum+=sum; 
  return sum-1; 


int main(){ return g(100000); } 
168デフォルトの名無しさん:2005/10/09(日) 18:41:27
>>158
f = y-1 C x-1

g = 輩-1 C k

g = 2 ^ (y -1)
g = 1 << (y-1)

int main(){ return 1<<(100000-1); } 

 
169デフォルトの名無しさん:2005/10/09(日) 18:43:28
158でつ。問2、3もおねがいしまつ。
170デフォルトの名無しさん:2005/10/09(日) 18:46:25
>>169問題書かなきゃ解けません
171デフォルトの名無しさん:2005/10/09(日) 18:49:18
172デフォルトの名無しさん:2005/10/09(日) 18:52:51
>>169
問い2だけ......
問い3はプログラムじゃないんで放置
//再帰版
int W(int a[7][7],int x,int y){
    return a[y][x]==0?a[y][x]=2,1+W(a,x-1,y)+W(a,x+1,y)+W(a,x,y-1)+W(a,x,y+1):0;
}
//非再帰版
#define push(x,y) (*p)[0]=x,(*p++)[1]=y
#define pop(x,y) p != stack && ( x=(*--p)[0],y = (*p)[1] ,1)
int W(int a[7][7],int x,int y){
    int stack[7*7*6][2]={x,y},(*p)[2]=stack+1,sum = 0;
    while(pop(x,y))
        while(!a[x][y]) a[x][y] = 2,++sum,push(x-1,y),push(x+1,y),push(x,y-1),++y;
    return sum;
}
173デフォルトの名無しさん:2005/10/09(日) 19:52:56
>>169
んじゃ問3.

(1)
φ(φ(x)) = φ(A x + a) = A^2 x + A a + a = x,
整理して (A + I) a = (I - A^2) x.
これが任意の x について成立するためには両辺がゼロにならないといけないので
case1: A = -I
case2: A^2 = I かつ a = 0
のどちらか.ただし I は単位行列.

(2)
case1 のとき φ(x) = x <=> -x + a = x <=> x = a/2.
よって F(φ) = { a/2 }.( x = 0 は A x = x を満たす )
case2 のとき φ(x) = x <=> A x = x.

(3)
case1 のとき一点なのは既に示した.
case2 のとき 0 ∈ F(φ) は明らかだから,非自明な x が F(φ) に入ったら F は一点集合でない.
A を Jordan 標準形にしてみてちょっと計算すると A は対角化できることがわかり,
その固有値は 1 か -1 を取る.
固有値が全て -1 とすると A は -I と相似になって A = -I となって φ(x) = -x で case1 に入る.
一つでも -1 でないものがあったとすると,その固有ベクトル x は A x = x を満たすので ∈ F(φ).
174デフォルトの名無しさん:2005/10/09(日) 20:48:48
[1] 授業単元: C言語
[2] 問題文:
テキスト内にある/home/abcd/ap1,10,A,1,AP1,V01,20041014,log
がファイルフォーマットだとして、
/home/abcd/ap1,10,A,,,V01,,logのように項目が抜けていた場合に
何番目の項目が抜けているのかを特定したいのですが、いいアイディアが浮かびません。
なるべく短いステップで処理したいのですが、いい方法ありませんか?お願いします。
[3] 環境
 [3.1] OS: Windows2000
 [3.2] コンパイラ名とバージョン:VC
 [3.3] 言語: C
[4] 期限:[無期限]
175デフォルトの名無しさん:2005/10/09(日) 20:55:54
問題文
の意味が理解不能です
176デフォルトの名無しさん:2005/10/09(日) 21:03:37
174です。説明不足でした。
/home/abcd/ap1,10,A,,,V01,,logの場合
,と,の間に文字が入ってないのでその位置を特定したい。
(例として、3個目と4個目の間に文字がありません。)
見たいな特定がしたいです。よろしくお願いします。
177namahage:2005/10/09(日) 21:04:40
すいませんどなたかsinxとlogxのテーラー展開するプログラム教えてください
178デフォルトの名無しさん:2005/10/09(日) 21:21:19
>>174,177
宿題なら>>1に従ったフォーマットを。宿題でないなら別スレへ。
179デフォルトの名無しさん:2005/10/09(日) 21:31:20
>>174
#include <string.h>
void check_field( chr *str, int *exist ){
char *tp;
tp = strtok( str, "," );
*exist = tp?1:0; exist++;
while ( tp ) {
tp = strtok( NULL, "," );
*exist = tp?1:0; exist++
}
}
180デフォルトの名無しさん:2005/10/09(日) 21:49:27
>>179
せめてコンパイラぐらいは通してくれ
181デフォルトの名無しさん:2005/10/09(日) 22:35:38
forで回して、,の個数とその間の文字数をカウントするだけだべ?
182128:2005/10/10(月) 01:40:40
>>128です。
2〜5はアレでいいんですね!
1のソース誰かいただけますか。。考えたけど全然だめです・・・
183デフォルトの名無しさん:2005/10/10(月) 01:47:08
>>179
174です。遅れましたがご解答ありがとうございます。
この処理は、','(コンマ)が4つとか連続で入っていた時でも対処できるものでしょうか?
勉強不足ですみません。
例として、3目個と4個目の間に文字がありません。4個目と5個目の間に文字がありません。みたいな事が行ないたいのです。
ソースでなくてもいいアイディアなにか無いでしょうか?おねがいします。
184デフォルトの名無しさん:2005/10/10(月) 01:56:19
【質問テンプレ】
[1] 授業単元: 文字列関係
[2] 問題文(含コード&リンク):1 文字列をキーボードから入力し、その結果を表示するプログラム。
                  2 文字列をキーボードから入力し、入力した文字列の長さを計算し表示するプログラム。(例[Syukudai]→結果[8] [ganbaru]→結果[7])
                 3  文字列をキーボードから入力し、以下の処理を行う(そして表示)。i,英字は全て英大文字に ii,数字はそのまま iii,特殊文字は空白に
                     (例「Syu+ku12dai」→結果「SYU KU12DAI」  「ga(n)baru」→結果「ga n baru」)
                  4 文字列をキーボードから入力し、その文字列を逆転する処理して表示。その処理のフローチャートも書くこと。
                    (例「Syukudai」→結果「iadukuyS」
[3] 環境
 [3.1] OS: UNIX
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: [2005年10月10日23:00あたりまで] または [無期限] のいずれか (「できるだけ早く」は不可)
[5] その他の制限: イ、GOTO文を使用してはいけない
            ロ、入力は繰り返し行えるように(なんらかの行動で終われるようにする。[end]と打つと終わりとかそういう感じ)
            ハ、必ずmain()関数とサブ関数を使用
            ニ、ポインタじゃなく配列を使用

一度全て作成したのですが、文字「列」として出力しなかったりしたり、毎回キーボードで打つのとか繰り返しの判定処理とか
出力するprintfの文とかはほぼ同じだからそこをmainとサブで効率よくできるように〜〜みたいなことを言われました(´・ω・`)
あくまで文字列として出力しろ〜〜みたいなことも・・・どうすればいいかわかりません、、よろしくお願いしますです。
185184:2005/10/10(月) 01:57:36
修正。      ga(n)baru →GA N BARUでした。><
186デフォルトの名無しさん:2005/10/10(月) 02:05:05
>>184
1とかmain一つで事足りるわけだが、それも関数分けないとダメ?
それとctype.hは使っておk?
187デフォルトの名無しさん:2005/10/10(月) 02:06:50
>>183
strchrとか使ったら?ループでstr[i]==','とか判定するのとあんまり変わらんかも知れんが。

>>128
ランダム版 for(i=0;i<N;i++) data[i]=rand();
整列済み版 for(i=0;i<N;i++) data[i]=i;
逆整列済み版 for(i=0;i<N;i++) data[i]=N-i;
でいいんじゃね?ただ、ランダム版でデータ重複がいやだとか(逆)整列済み版で重複有りとなると多少改造が必要だが。
188デフォルトの名無しさん:2005/10/10(月) 02:08:48
>>184 元の奴を改造させた風にする必要があるだろうし、元プログラムをうp
189179:2005/10/10(月) 02:09:27
>>183
確かにコンパイルもパスしない代物で申し訳無かったが
existというintのarrayにトークン(コンマで区切られた文字列)の有無が入るように書いた(つもり)
実行環境が手許に無いので試験してみることが出来ないけど。
main(){
int e[100]=[0];
char *any = "任意の文字列";
check_field( any, e )
/* ここでeの内容を確認 */
}
のようなテストドライバでも書いて試験してみて下さい。
例に挙げたようなことはe(exist)が正しく出来ているなら簡単でそ
190デフォルトの名無しさん:2005/10/10(月) 02:25:55
183です。みなさんさっそくのご解答ありがとうございます。
まだ試していませんがいいアイディアいただけて、感謝しています。
またいいアイディアありましたらよろしくお願いします。
191デフォルトの名無しさん:2005/10/10(月) 03:07:02
192デフォルトの名無しさん:2005/10/10(月) 12:38:28
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
バブルソート法で数列
80 40 30 90 50 20 10 60
を昇順にソートするプログラムを書け
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 2005年10月12日
[5] その他の制限: 無し
よろしくおねがいします
193デフォルトの名無しさん:2005/10/10(月) 12:40:50
つ、つまらん…
194デフォルトの名無しさん:2005/10/10(月) 13:05:16
#include<stdio.h>

void out_num(int *,int);
void srt_bub(int *,int);

int main(int argc,char **argv){
    int a[]={80,40,30,90,50,20,10,60},n=8;
    out_num(a,n);srt_bub(a,n);out_num(a,n);
    return 0;
}

/* 出力 */
void out_num(int *a,int n){
    int i;
    for(i=0;i<n;i++)printf("%d ",a[i]);
    printf("\n");
}

/* (3)バブルソート */
void srt_bub(int *a,int n){
    int i,j,tmp;
    for(i=0;i<n-1;i++)
        for(j=i+1;j<n;j++)
            if(a[i]>a[j]){
                tmp=a[i];a[i]=a[j];a[j]=tmp;
            }
}

ホイ、使い回し
195デフォルトの名無しさん:2005/10/10(月) 14:24:32
[1] 授業単元: C
[2] 問題文(含コード&リンク): UNIXの(ls -l)コマンドをプログラムで再現しなさい。
という課題が出されました。指定のディレクトリ内のファイル等を(ls -l)で表示できる、
パーミッションやユーザ名、ファイルサイズ等を表示したいのですが、
全く知恵が出てきません。ご教授お願いします。
[3] 環境
 [3.1] OS: UNIX
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限:[無期限]
[5] その他の制限: 特にありません。
UNIX全くの無知です。お力を貸してください。よろしくお願いします。
196デフォルトの名無しさん:2005/10/10(月) 14:26:47
>>195
ls.c をwebで検索
197デフォルトの名無しさん:2005/10/10(月) 14:27:35
>>195
int main() {
return system("ls -l");
}
198デフォルトの名無しさん:2005/10/10(月) 15:03:43
195です。さっそく回答ありがとうございます。
追加機能として、自分で決めた任意のディレクトリの表示は可能でしょうか?
199デフォルトの名無しさん:2005/10/10(月) 15:04:37
>>198
試したの?>>195さん。
200デフォルトの名無しさん:2005/10/10(月) 15:09:20
>>194
ありがとうございます
201デフォルトの名無しさん:2005/10/10(月) 15:14:30
199さん。残念ながらまだ試していません。UNIX環境が自宅にないもので。
すみません。
明日さっそく学校で試してみたいと思います。
202デフォルトの名無しさん:2005/10/10(月) 16:21:53
stat()?
203184:2005/10/10(月) 16:59:15
>>184です

>>186
分けないとだめです;;ctypeおkです。
204デフォルトの名無しさん:2005/10/10(月) 17:12:57
205デフォルトの名無しさん:2005/10/10(月) 20:33:29
入社試験ネタやってみた。分けがわからんかった。
でも、この手の面白いな。またあったらネタでもかまわんのでよろしく。
206デフォルトの名無しさん:2005/10/10(月) 22:27:36
[1] 授業単元: コンピュータープログラミング
[2] 問題文 a[ ]の箱を100個作ってi*iを代入。その合計と平均を求める。
       「input」と「nijou」と「calc_sum」と「calc_average」を使って、「input」で、まずa[ ]=i*iの形?いみたいなのを作る。
       そして「nijou」で実際に計算、「calc_sum」で合計を求めて「calc_average」で平均を出して終わり。説明下手でごめんなさい。
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン:よくわからない。
 [3.3] 言語: C
[4] 期限  今日の24時まで・・・。
[5] その他の制限: 関数のい課題です。ポインタとかまだ、習ってません。
大体のプログラムの形は作ったんですが、明らかに変です。これ↓を修正して作ってくれませんか?お願いします。

207206:2005/10/10(月) 22:28:09
#include<stdio.h>

float input(void);
float nijou(float);
float calc_sum(float);
float calc_average(float);

int main(void){
float s,r,a,b;
s=input();
r=nijou(s);
a=calc_sum(r);
calc_average(a);
}
float input(void){
float z,i,a[99];
a[i]=i*i;
z = a[i];
return z;
}
float nijou(float nn){
float a[99],i;
a[i]=i*i;
return a[i];
}
208デフォルトの名無しさん:2005/10/10(月) 22:28:53
問題そのままかいて...
209206続き:2005/10/10(月) 22:29:02
float calc_sum(float ss){
float x,i,sum,a,a[99];
sum=0;
for(i=0;i<=99;i++){
a[i] = i*i;
}
for(i=0;i<99;i++){
sum=sum+a[i];
}
a=sum;
printf("sum=%d\n",sum);
return a;
}
float calc_average(float aa){
float average;
average = (float)aa/100
printf("average=%f\n",average);
}

sage忘れててごめんなさい・・・。

210206:2005/10/10(月) 22:30:42
ちなみに問題文は削除されてしまって分かりません・・・。
分かりにくくてすみません。
211デフォルトの名無しさん:2005/10/10(月) 22:33:31
>>210
出題者に問題聞いて来い。
212デフォルトの名無しさん:2005/10/10(月) 22:35:56
【質問テンプレ】
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):BM法をもちいて住所のデータから郵便局を検索せよ。住所データは配列でファイル読み込みすることです。
[3] 環境:
 [3.1] OS: WindowsXp
 [3.2] コンパイラ名とバージョン: vC.net2003
 [3.3] 言語: C/C++/どちらでも可
[4] 期限:3日以内
[5] ライブラリをもちいての文字列検索は不可
お願いしますm(−−)m

213デフォルトの名無しさん:2005/10/10(月) 22:36:56
BM法って?
214206:2005/10/10(月) 22:37:01
>>211
その出題者と連絡が取れないんです・・・。明日になれば聞けますが、それだと締め切りに間に合いません・・・。

やっぱり、ちゃんとした問題文がないと出来ませんよね・・・。ごめんなさい。
215デフォルトの名無しさん:2005/10/10(月) 22:44:06
あー・・・まあ、10月からの講義だとしても、学校通って半年たってるんだから、友人くらいいるだろ。
そいつらに答え聞くか、問題聞いてみるとか。
216206:2005/10/10(月) 22:59:18
>>215
いや・・・他の友人はみんな金曜に学校で終わらせたんだよね。
・・・で、みんなのそのときのデータは学校。問題文が載ってるサイトも学内専用・・・。
友人に聞いても「課題終わってるのに家にデータ持って帰るわけないだろ」と、言われました。しかも問題文も覚えてないっていうし・・・。

今回は自分が悪いですね・・・。
217初心者:2005/10/10(月) 23:00:44
 商品の金額と出した金額を入力し、おつりを算術するプログラムが出来ません。

#include <stdio.h>
#include <conio.h>
#include <stdio.h>


int main (void)
{
int kai,kane;
int oturi = kane - kai;

char buf[3];

printf("いくらの買い物ですか\n");
kai = atoi(gets(buf));
printf("お金はいくら出しますか\n");
kane = atoi(gets(buf));

printf("おつりは%d円です\n",oturi);
}

 こんな感じで打ったのですがエラーになります。初心者ゆえなにを如何したら改善するのか皆目検討つきません
 ちなみにコンパイラはborlandC++compilerです。
 
 どなたかご教授願えますか?
218デフォルトの名無しさん:2005/10/10(月) 23:00:45
>>213
BM法==ボイヤ・ムーアアルゴリズムです。
http://www.rsch.tuis.ac.jp/~nagai/ALG2/Alg10-18-2004.pdf

自分でつくったんですけど、配列のループがうまくいきませんでした。
219初心者:2005/10/10(月) 23:01:31
エラーメッセージは以下の通りです

警告
W8065 mondai10.c 14: プロトタイプ宣言のない関数 'atoi' の呼び出し(関数 main
)
警告 W8065 mondai10.c 16: プロトタイプ宣言のない関数 'atoi' の呼び出し(関数 main
)
警告 W8070 mondai10.c 20: 関数は値を返すべき(関数 main )
警告 W8004 mondai10.c 16: 'kane' に代入した値は使われていない(関数 main )
警告 W8004 mondai10.c 14: 'kai' に代入した値は使われていない(関数 main )
220デフォルトの名無しさん:2005/10/10(月) 23:01:54
あー、学校へTELNETとか叩けるのか? だったら見られるんじゃねーか?
221デフォルトの名無しさん:2005/10/10(月) 23:04:26
>>217
>>1くらい読め
222206:2005/10/10(月) 23:06:40
Telnetは使い方がよく分からないし、大学のIPアドレスとかまったく知らないので自分が使うのは無理っぽいです・・・。

223デフォルトの名無しさん:2005/10/10(月) 23:21:46
>>217
どうして、
#include <stdio.h>
が二行もあるの?
224デフォルトの名無しさん:2005/10/10(月) 23:32:55
#include <stdio.h>
#include <conio.h>
#include <stdlib.h> // atoiってstdlibでしょ?
int main (void)
{
int kai,kane;
int oturi;
char buf[3];
printf("いくらの買い物ですか\n");
kai = atoi(gets(buf));
printf("お金はいくら出しますか\n");
kane = atoi(gets(buf));
oturi = kane - kai; // kaneとkaiの値が決まってから代入しなきゃダメ。
printf("おつりは%d円です\n",oturi);
return 0; // main関数がint型だから値を返す必要がある
}
225デフォルトの名無しさん:2005/10/10(月) 23:33:51
>>206

#include <stdio.h>

void input(int a[]);
int nijou(int n);
int calc_sum(int a[]);
float calc_average(int a[]);

int main(void)
{
int a[100];
float ave;
input( a );
ave = calc_average( a );

printf("average=%f\n", ave);

return 0;
}

void input(int a[])
{
int i;
for(i = 1; i <= 100; i++)
{
a[i] = nijou( i );
}
}
226デフォルトの名無しさん:2005/10/10(月) 23:35:23
225の続き

int nijou(int n)
{
return n * n;
}

int calc_sum(int a[])
{
int i, sum = 0;
for(i = 0; i < 100; i++)
{
sum += a[i];
}
return sum;
}

float calc_average(int a[])
{
return (float)calc_sum(a) / 100;
}
227デフォルトの名無しさん:2005/10/10(月) 23:36:29
217<<
プロトタイプ宣言のない関数 'atoi' の呼び出し(関数 main

atoiって関数宣言してないからエラーだとおもう。
228デフォルトの名無しさん:2005/10/10(月) 23:47:15
>>227
つ man atoi
229初心者:2005/10/10(月) 23:55:13
>>221
 すいません 今後はテンプレートどおりに質問させて頂きます。
>>223>>224>>227
 ご指摘有難う御座います。
 224さん細かな教授感謝です。
230206:2005/10/10(月) 23:56:18
>>225
ありがとうございます!
でも、実はsumも表示させないといけないんです・・・。



231デフォルトの名無しさん:2005/10/10(月) 23:58:09
>>226
なるほどなー
ホインタ習って無いってのをどうしようか迷っていたが、
int a[]で受けるならポインタ使ってないよって誤魔化せるか
232206:2005/10/11(火) 00:00:05
自分でsum表示させれました。
ありがとうございました。
233デフォルトの名無しさん:2005/10/11(火) 00:05:07
まぁ、>>229は暇ならこれでも読んでいてくれ
ttp://www.tt.rim.or.jp/~rudyard/torii009.html
234初心者:2005/10/11(火) 00:25:07
>>233
 うを 勉強になります
 いい年こいて不勉強でした
235C言語始めたばかり:2005/10/11(火) 00:43:43
[1] 授業単元:データ構造(リンクドリスト)
[2] 問題文(含コード&リンク):
 入力(1):文字列データ apple,banana,peach,pineapple,orange
入力(2):挿入、削除の操作を指定する一文字 I,D,P リンクドリストの何番目のデータに対する操作かを示す自然数、挿入(I)の時は英語の果物名を文字列として入力
 操作:入力(1)で入力された5個の文字列データを入力された順に配列を使って実現されたリンクドリストに記憶する。
   リンクドリストのm番目に文字列を挿入する関数insert、リンクドリストに記憶されているn番目の文字列データを削除する関数delete、
   リンクドリストに記憶されているデータをその記憶されている順に出力する関数plistを定義し、
   入力(2)の一文字I、D、Pの入力によって、入力で指定されたデータをパラメータとして、
   それぞれの関数insert,関数delete,関数plistが呼び出されて実行される。
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 2005年10月17日13:00まで
[5] その他の制限: 特に指示はありませんでした。
自分でもC言語の本とか見て調べたのですが、理解できなかったので、どうかお願いします。
236デフォルトの名無しさん:2005/10/11(火) 00:53:06
マルチ乙
237デフォルトの名無しさん:2005/10/11(火) 00:56:21
理解できない。
→あきらめる
→人にたよる(ま、嫌われんようにな)
→別の本なりサイトなりで調べてみる
238デフォルトの名無しさん:2005/10/11(火) 01:02:59
その「人にたよる」という行為が、このスレなのだが。
239デフォルトの名無しさん:2005/10/11(火) 01:04:47
嫌われんようにな←がポイントだと思う
240デフォルトの名無しさん:2005/10/11(火) 01:29:21
>>235
リンクドリストって聞き慣れないが、要はただの単方向リストか?
大量にサンプルコード有るんだからそれみて理解しろ
無理なら諦めろ
241デフォルトの名無しさん:2005/10/11(火) 01:41:15
あとから書き直しパターンぽいなぁ・・・。
242デフォルトの名無しさん:2005/10/11(火) 01:44:57

[1] 授業単元:アルゴリズム入門
[2] 問題文:まず、符号化したい文字列を入力する。それぞれの文字につい
て出現頻度を表示し、
次にハフマン符号の考え方を用いて、各文字に0と1の符号を割り当てよ。
例 aaaabbbccdを入力。出力結果→出現頻度 a→4回 b→3回 c→2回 d→1回 
符号化した結果はa→0 b→11 c→101 d→100
[3] 環境
 [3.1] OS: Windowsxp home
 [3.2] c++bulider 5.5
 [3.3] 言語:Cのみ
[4] 期限: 今週水曜まで
[5] 学校の授業でcに触れたくらいで、あまりまだプログラミングというものを理解できていません・・・。わかる方がいらっしゃいましたらよろしくお願いします<(_ _)>
243デフォルトの名無しさん:2005/10/11(火) 01:54:09
整数を入力として受け付けて、その数に3足した分だけ*を表示せよ。
例えば、入力が3だとすると出力は以下のようになる。

******

C
244デフォルトの名無しさん:2005/10/11(火) 01:55:14
>>242 C言語による最新アルゴリズム辞典参照
245デフォルトの名無しさん:2005/10/11(火) 03:20:10
>>244
アマゾンで頼んでも水曜には間に合わんと思うがなぁ
246デフォルトの名無しさん:2005/10/11(火) 03:22:23
著者のページにソース置いてあるんで。間に合うんでないかい?
247245:2005/10/11(火) 03:44:30
おぉ、ホントだ!
>error("使用法は本文を参照してください");
なんて書いてあるが、コメントもいっぱい付いてるし、問題なさげだ
248デフォルトの名無しさん:2005/10/11(火) 04:05:51
まだ置いてあったのか・・・grwinとgrgtkが欲しいぞ。
249デフォルトの名無しさん:2005/10/11(火) 04:26:47
すみません、初歩的問題ですが分かりません。
ご指導お願いします。UNIXです? シグインとかいうソフトで起動させてます



・アルファベットがどのような数値で表されているか表示するプログラムを作りなさい

・乱数を発生する関数rand()を使って0〜99の乱数を50個作りなさい
またその50個の乱数の最大値と最小値を見つけるプログラム作りなさい

・switch〜case文を使って、入力された文字について
大文字、小文字、数字、記号などの種類を表示するプログラムを作りなさい

・入力された文字が
大文字なら小文字に、小文字なら大文字に変換し、その他ならそのまま出力するプログラムを
つくりなさい
250デフォルトの名無しさん:2005/10/11(火) 04:41:22
251デフォルトの名無しさん:2005/10/11(火) 04:41:27
こんな時間に乙だが>>1のテンプレに従うこと。
252249:2005/10/11(火) 05:14:03
失礼いたしました。



[1] 授業単元: 情報制御工学
[2] 問題文(含コード&リンク):
・アルファベットがどのような数値で表されているか表示するプログラムを作りなさい

・乱数を発生する関数rand()を使って0〜99の乱数を50個作りなさい
またその50個の乱数の最大値と最小値を見つけるプログラム作りなさい

・switch〜case文を使って、入力された文字について
大文字、小文字、数字、記号などの種類を表示するプログラムを作りなさい

・入力された文字が
大文字なら小文字に、小文字なら大文字に変換し、その他ならそのまま出力するプログラムを
つくりなさい
[3] 環境
 [3.1] OS: WindowsXP セレロン
 [3.2] コンパイラ名とバージョン: gcc (よく分からないですがgccってので起動してます)
 [3.3] 言語: C
[4] 期限: 今日の17時までです。
[5] その他の制限: ほとんど初心者です。すみません
253デフォルトの名無しさん:2005/10/11(火) 05:24:42
>>212
データファイルの形式とかがわからなかったので適当に.
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/971.cpp
254デフォルトの名無しさん:2005/10/11(火) 05:41:07
>>252 (1)
int main() {
  char c;
  for (c = 'a'; c <= 'z'; ++c) printf("%2c ", c);
  printf("\n");
  for (c = 'a'; c <= 'z'; ++c) printf("%02x ", c);
  printf("\n");
  for (c = 'A'; c <= 'Z'; ++c) printf("%2c ", c);
  printf("\n");
  for (c = 'A'; c <= 'Z'; ++c) printf("%02x ", c);
  printf("\n");
  return 0;
}
255デフォルトの名無しさん:2005/10/11(火) 05:43:43
>>252 (2)
int main() {
  int i, tbl[50], min, max;
  srand(time(NULL));
  for (i = 0; i < 50; ++i) 
    tbl[i] = (int)(50.0 * rand() / RAND_MAX);
  min = max = tbl[0];
  for (i = 0; i < 50; ++i) {
    if (min > tbl[i]) min = tbl[i];
    if (max < tbl[i]) max = tbl[i];
  }
  printf("min = %d, max = %d\n", min, max);
  return 0;
}
256デフォルトの名無しさん:2005/10/11(火) 05:44:44
>>252 (3)
int main() {
  char c;
  scanf("%c", &c);
  if ('a' <= c && c <= 'z') {
    printf("small character\n");
  } else if ('A' <= c && c <= 'Z') {
    printf("large character\n");
  else {
    printf("otherwise\n");
  }
  return 0;
}
(4)
int main() {
  char c;
  scanf("%c", &c);
  if ('a' <= c && c <= 'z') {
    printf("%c", c + 'A'-'a');
  }
  else if ('A' <= c && c <= 'Z') {
    printf("%c", c + 'a'-'A');
  } else {
    printf("%c", c);
  }
  return 0;
}
257デフォルトの名無しさん:2005/10/11(火) 06:17:12
[1] 入門プログラミング
[2]ある数字の数だけ記号を表示するにはどうすればいいでしょうか?
  例えば3なら@@@、5なら@@@@@といったようにです。
[3] 環境
 [3.1] Windows2000
 [3.2] VC 6.0
 [3.3] C++
[4] 今日の朝8時まで
[5] 基礎程度です。
  あるプログラムの最後の一部分なんですがこれをどうすればよいかがわかりません。
  どなたかよろしくお願いします。
258デフォルトの名無しさん:2005/10/11(火) 07:00:13
#include <iostream> using namespace std; int main(){ int num, i; cin >> num; for (i = 0; i < num; i++) cout << "@"; return 0; }
259デフォルトの名無しさん:2005/10/11(火) 08:12:25
cout << '@';
260デフォルトの名無しさん:2005/10/11(火) 11:43:54
#include <stdio.h>
int main(void);
int main(void)
{
int i;
float rate,kekka;
rate = 113.95 ;
while(i<=50){
kekka=i*rate;
printf("%.2f\n",kekka);
i++;
}

[1] 授業単元:情報基礎
[2] 問題文(含コード&リンク): forループを使って25ドル〜50ドルまでの円への換算表を作りなさい
為替るーとは113.95円とする

これと同じことをwhileループを使って書け
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 本日14時
[5] 上のプログラムを作ったのですがうまく起動しません

$ gcc j3.c
j3.c: In function `main':
j3.c:20: error: syntax error at end of input

と表示されます、具体的にどこを直せばよいのでしょうか?
261デフォルトの名無しさん:2005/10/11(火) 11:46:02
>>260
int main(void); ←不要
あと中括弧の閉じが一個足りない
262>>260:2005/10/11(火) 11:47:10
nt main(void)
{
int i;
float rate,kekka;
rate = 113.95 ;
while(i<=50){
kekka=i*rate;
printf("%.2f\n",kekka);
i++;
}
}
263デフォルトの名無しさん:2005/10/11(火) 11:50:10
>>253
ありがとうございます。ソースを読んだんですが理解でいません(><)
自分で書いたものがあるんですがみてもらえますか??
264260:2005/10/11(火) 11:50:53
動きました、ありがとうございます。
何故int main が余計なのですか?簡単な理由だったら教えて欲しいです
265デフォルトの名無しさん:2005/10/11(火) 11:52:00
>>264
main関数は特別で、プロトタイプ宣言が必要ないということになってるだけ。
266260:2005/10/11(火) 11:55:19
先ほどの換算プログラム、ホワイルだと
2848.75
2962.70
3076.65
3190.60
3304.55
3418.50
3532.45
3646.40
3760.35
3874.30
3988.25
4102.20
4216.15
4330.10
4444.05
4558.00
4671.95
4785.90
4899.85
5013.80
5127.75
5241.70
5355.65
5469.60
5583.55
5697.50

結果がとなり
267260:2005/10/11(火) 11:56:12
2848.75
2962.70
3076.65
3190.60
3304.55
3418.50
3532.45
3646.40
3760.35
3874.30
3988.25
4102.20
4216.15
4330.10
4444.05
FORだと

4558.00
4671.95
4785.90
4899.85
5013.80
5127.75
5241.70
5355.65
5469.60
5583.55
5697.50

と、結果に違いが生じてしまうのですが、何故でしょうか?
268260:2005/10/11(火) 11:56:54
FORのプログラムはこう作りました

#include <stdio.h>
int main(void)

{
int i;

float rate,kekka;
rate = 113.95 ;

for(i=25;i <=50; i++){
kekka=i*rate;
printf("%.2f\n",kekka);
}
}
269デフォルトの名無しさん:2005/10/11(火) 11:57:13
>>260
よく見たら i 初期化してねぇじゃん。
270260:2005/10/11(火) 11:57:45
>>265
ど丁寧にどうもです。
プロトタイプ宣言というものがよく分からないので
調べてきます。
271260:2005/10/11(火) 11:58:42
>>269

return(0) とか言うヤツですか?
272デフォルトの名無しさん:2005/10/11(火) 12:09:00
>>271
iの初期値は25だろ?どこでその数値を入れてる?
273デフォルトの名無しさん:2005/10/11(火) 12:12:45
int i;

int i = 25;
にしろってことだよ。
274デフォルトの名無しさん:2005/10/11(火) 12:35:12
>>263
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/972.txt

whileのループがうまくまわりません。エラーはないです。みてください。無理やりみじかくしたのでかなりへんですが・・おねがいします。
275260:2005/10/11(火) 12:43:58
>>272-273
直りました。どうもです。
276デフォルトの名無しさん:2005/10/11(火) 15:01:13
277249:2005/10/11(火) 17:08:36
>> 264-256
2〜3のプログラムが上手く走りません、エラーは以下の通りです
何がいけないのでしょうか?


gcc j7.c
j7.c:5: error: syntax error before '{' token
j7.c:7: error: syntax error before string constant
j7.c:7: warning: conflicting types for built-in function `scanf
j7.c:7: warning: data definition has no type or storage class

$ gcc j7.c
j7.c:5: error: syntax error before '{' token
j7.c:7: error: syntax error before string constant
j7.c:7: warning: conflicting types for built-in function `scanf
j7.c:7: warning: data definition has no type or storage class



$ gcc j8.c
j8.c:4: error: syntax error before '{' token
j8.c:6: error: syntax error before string constant
j8.c:6: warning: conflicting types for built-in fun
j8.c:6: warning: data definition has no type or sto
j8.c:16:2: warning: no newline at end of file
278249:2005/10/11(火) 17:10:49
2〜4の間違いでした

こう書きました
(4)
#include<stdio.h>

int main(void);
{
char c;
scanf("%c", &c);
if ('a' <= c && c <= 'z') {
printf("%c", c + 'A'-'a');
}
else if ('A' <= c && c <= 'Z') {
printf("%c", c + 'a'-'A');
} else {
printf("%c", c);
}
return (0);
}
279249:2005/10/11(火) 17:12:03
#include<stdio.h>

int main(void);

{
char c;
scanf("%c", &c);
if ('a' <= c && c <= 'z') {
printf("small character\n");
} else if ('A' <= c && c <= 'Z') {
printf("large character\n");
else {
printf("otherwise\n");
}
return (0);
}

280249:2005/10/11(火) 17:13:03

(2)
#include<stdio.h>

int main(void)


{
int i, tbl[50], min, max;
srand(time(NULL));
for (i = 0; i < 50; ++i)
tbl[i] = (int)(50.0 * rand() / RAND_MAX);
min = max = tbl[0];
for (i = 0; i < 50; ++i) {
if (min > tbl[i]) min = tbl[i];
if (max < tbl[i]) max = tbl[i];
}
printf("min = %d, max = %d\n", min, max);
return (0);
}
281デフォルトの名無しさん:2005/10/11(火) 17:22:46
main()のあとの「;」がいらない
282249:2005/10/11(火) 17:26:15
「;」をとると以下のようなエラーが出ます・・・・

(2)
$ gcc j6.c
j6.c: In function `main':
j6.c:10: error: `RAND_MAX' undeclared (first use in
j6.c:10: error: (Each undeclared identifier is repo
j6.c:10: error: for each function it appears in.)

(3)
$ gcc j7.c
j7.c: In function `main':
j7.c:12: error: syntax error before "else"

(4)
$ gcc j7.c
j7.c: In function `main':
j7.c:12: error: syntax error before "else"
283デフォルトの名無しさん:2005/10/11(火) 17:57:05
もう、どれがj6.cやらj7.cやら。毎回毎回どうしてこうもコピペに失敗するのかねぇ。
284デフォルトの名無しさん:2005/10/11(火) 18:18:03
ケアレスミスの文法エラーを指摘しなければならないのも
スレの範疇なのかねぇ
285249:2005/10/11(火) 18:20:09
どうも皆様すみません
ケアレスミスなのですね、じっくり観察して見ます

ありがとうございました。
286デフォルトの名無しさん:2005/10/11(火) 19:52:53
[1] 単元:情報演習
[2] 環境
 [2.1] OS: Linux
 [2.2] コンパイラバージョン: gcc
 [2.3] 言語: C
[3] 期限: 木曜13時
[4] 問題: ビットごとのXOR演算子を用いて、文字列を暗号化するプログラムを作成し、実行しなさい。ただし、プログラムは以下の条件を満たすものとする。
条件1:対象とする文字列は80文字以下とし、アルファベット小文字、スペース、ピリオド、コンマからなる。
条件2;暗号化は、対象文字列を逆順にするとともに、各文字と0から9までの数字(キーナンバーとして打ち込んだもの)とのXORをとって完了する。ただし、スペース、ピリオド、コンマについてはXOR演算の対象としないこと。
条件3;暗号化、復号化の処理は、それぞれ少なくとも一個ずつ関数を定義し、実行させること。
<仕様>1.ファイルoriginal.dat(ASCII型式)に保存されている文字列を暗号化対象として読み込む。original.datが存在しないときは、最初に対象文字列をそのファイルに書き込ませること。
2.上記条件2で示した方法によって、暗号化する。そして、キーナンバーと暗号化文字列をファイルcoded_wds.dat(ASCII型式)に書き込む。
3.復号化の際は、coded_wds.datを読み込んで実行すること。まず、キーナンバーを打ち込ませる。誤ったキーナンバーを3回連続して打ち込んだ場合、処理を終了させること。正しいキーナンバーが打ち込まれた場合、復号化してその結果を表示させること。

以上が問題なのです、どうかお願いします(iДi)
287デフォルトの名無しさん:2005/10/11(火) 20:11:20
>>274
無理に短くしないで全部上げてくれたほうがよかったな.手元でコンパイルが通らん.

ま,Search 関連だけ見た.アルゴリズム自体は間違ってないはず.
「whileのループがまわらない」ってのはよくわからんが,予想される不具合は
日本語の文字列を char にぶち込んだときに,その値が範囲外になってること.
実際こっちの環境で試したら key[k] が負の値を取ってた.

もしそちらで入力を全部ローマ字にしてまともに動けばこれが原因と思う.
skip[x] を全部 skip[(unsigned char)x] に置き換えればとりあえず動くけど,
検索が「日本語の文字列単位で」まともに動く保証は全く無い.
288287:2005/10/11(火) 21:12:36
>>287
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/973.cpp

skip[(unsigned char)x] はあまりに場当たり的っぽいので wchar_t で書いてみた.
アルゴリズムは >>274 のものを使ってるので読めると思う.

# C/C++ で日本語文字列をシームレスに扱える時代は来ないもんかねえ
289デフォルトの名無しさん:2005/10/11(火) 21:53:52
>>288
そこまでいくと、std::mapを使いたくなるよ
290デフォルトの名無しさん:2005/10/11(火) 22:02:40
【質問テンプレ】
[1] 授業単元:アルゴリズム入門
[2] 問題文(含コード&リンク):下記のプログラムは文字列を入力し、
連続している文字があった場合連続数に直し、結果を表示するプログラムである。
例、abcdを入力→abcdを出力
例2、aabbを入力→a2b2を出力
このプログラムの逆の働きをするプログラムを上記プログラムを参考にし作成せよ。
[3] 環境
 [3.1] OS: Windows2000
 [3.2] コンパイラ名とバージョン: Borland C++builder5.5
 [3.3] 言語: C
[4] 期限:明日17時まで
[5] その他の制限:参考にするプログラムにわからないことが多く、逆のプログラムの作成方法もよくわからないです。明日までと急ですみませんがよろしくお願いします。
291290:2005/10/11(火) 22:07:47
こちらが問題文です。よろしくお願いします。
while (fgets(bun, 256,stdin) != NULLや if (i&&bun[i-1]==bun[i])の意味がよくわからないです。
#include <stdio.h>
#include <conio.h>
    int main (void) {
        char bun[256];
        int i,n;
        printf("文字を入力(256文字まで): ");
        for (i=0;bun[i]!='\0';i++) {
            while (fgets(bun, 256,stdin) != NULL){
                break;
            }
        printf("結果:");
        for (n=i=0;bun[i]!=NULL;i++){
        if (i&&bun[i-1]==bun[i]){
        n++;
        }
        else {
        if(n!=NULL){
        printf("%d",n+1);
        }
        if(!bun[i]) {
        break;
        }
        n = 0;
       putchar(bun[i]);
        }
       }
      }
    getch();
    return 0;
    }
292デフォルトの名無しさん:2005/10/11(火) 22:11:29
意訳:
while (fgets(bun, 256,stdin) != NULL
バッファ(256バイト)にstdinから1行読み込む。読み込めなければ、ループ終了。

if (i&&bun[i-1]==bun[i])
iが0以外(つまり最初の文字でなでなく)、かつ、今の文字が直前の文字といっしょならば・・・
293287:2005/10/11(火) 22:44:54
>>289
まあ基本的に投稿者のプログラムを残してますので.

細かな話をすると,std::map は普通は赤黒木だから要素の参照は
配列参照よりもちょっとだけだけ遅くなります.でも検索が必要となる場面って
「(すごく長い文字列から普通の長さの文字列を探す)×たくさん」が多いから,
参照コストは計算量に響いちゃう,という理由もあります.
294C言語始めたばかり:2005/10/11(火) 22:54:18
>>235
この課題の解答もお願いします。
295デフォルトの名無しさん:2005/10/11(火) 23:00:05
>>294 >>235 レスが結構ついているけど・・・?
296デフォルトの名無しさん:2005/10/11(火) 23:25:47
>>286
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/974.txt

coded_wds.datが存在したら復号化してcoded_wds.datを削除します。
297デフォルトの名無しさん:2005/10/11(火) 23:46:50
[1] 数学系
[2] x^2 * tan(x) = A をニュートン法を使って解く
[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ名とバージョン: 不明
 [3.3] 言語: C言語
[4] 期限: 本日中が望ましいが明日の朝まで(明日の授業で提出)
[5] その他の制限: なし

ずっと考えていましたが解りませんでした。
時間がないですが、よろしくお願いします。
298290:2005/10/12(水) 00:06:02
>>292さん
ご返答ありがとうございます。おかげさまで
この条件文の意味がわかりました。
只今、プログラムに取り組んでますが上手くいきません orz
教えてくださる方がいればよろしくお願いします。
299デフォルトの名無しさん:2005/10/12(水) 00:10:41
>if(i&&bun[i-1]==bun[i])
こんな汚い条件式書くような奴に習いたくないな
300デフォルトの名無しさん:2005/10/12(水) 00:32:54
301初心者:2005/10/12(水) 00:45:36
>>235の課題
できればプログラムのせていただけないでしょうか?
C言語は始めたばかりで>>235の課題のレベルはまだかけなくて
302デフォルトの名無しさん:2005/10/12(水) 00:49:57
>>297
もう寝るので数学っぽいヒントだけ
f(x)=x^2*tan(x)-A だから f'(x)=2*x*tan(x)+x*x/(cos(x)*cos(x))
適当な初期値を x として、
x ← x - f(x)/f'(x)
をひたすら計算。毎回 x の変動量を見て、十分小さくなるまでとかの判定を。
303290:2005/10/12(水) 01:08:41
>>300さん
お答えありがとうございました。自分のほうでもなんとかできましたが、
こちらのプログラムのほうがすっきりしてて大変参考になりました。
ありがとうございますm(_ _"m)
304デフォルトの名無しさん:2005/10/12(水) 01:14:32
>>301
クラスの他の人も同じ課題をしてるわけだから
C言語は始めたばかりってのは何の言い訳にもならん罠
君が嫌われてる理由
1.いちいちageる
2.名前欄の初心者って主張がウザイ
3.そもそもマルチポスト
305286:2005/10/12(水) 01:23:05
296さん、職人さんどうもありがとうございました。
本当にありがとうつД`)
306デフォルトの名無しさん:2005/10/12(水) 03:19:49
>        char bun[256];
>        printf("文字を入力(256文字まで): ");

こんなの書くような奴に習いたくないなw
307デフォルトの名無しさん:2005/10/12(水) 03:25:04
っつーかむしろ漏れは

>        char bun[256];
>        for (i=0;bun[i]!='\0';i++) {
初期化なしかよ

>            while (fgets(bun, 256,stdin) != NULL){
256文字かよ

>        for (n=i=0;bun[i]!=NULL;i++){
char と NULL 比較かよ

んな奴に習いたくないなw
308デフォルトの名無しさん:2005/10/12(水) 03:25:49
>>243
俺のヘボいプログラムやるから今度はテンプレ使えよ

#include <stdio.h>

main(){

int i,j;

printf("数字を入れてみなさい:");
scanf("%d",&i);


if(i<0){
printf("バカ!そんな数字入れんな!\n");
printf("数字を入れてみなさい:");
scanf("%d",&i);
}

for(j=0;j<=i+2;j++)
printf("*");
printf("\n");
}
309デフォルトの名無しさん:2005/10/12(水) 03:37:15
>>308
どうせ書くならもっと萌えるセリフかけよな
310デフォルトの名無しさん:2005/10/12(水) 05:36:09
>>308
二度目のおいたはスルーするのな
311デフォルトの名無しさん:2005/10/12(水) 05:45:41
問題文:行列を読み込み出力する問題です、@〜Eを埋めて下さい
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/976.txt
cはほぼ履修しました。簡単ぽいけど何かうまくいきません何故だろうorz
312デフォルトの名無しさん:2005/10/12(水) 06:07:02
>>311
@p Ap Bb Ca Dk Ek

あと>>1をよく読め。
313311:2005/10/12(水) 06:16:43
>>312 スマソ、忘れてましたorz

出力結果がこうなります、AとBが何か違くありません?

A:
0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000
0.000 +NAN 0.000 0.000
B:
0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000
0.000 +NAN 0.000 0.000
U:
1.000 0.000 0.000
0.000 1.000 0.000
0.000 0.000 1.000
314デフォルトの名無しさん:2005/10/12(水) 06:37:32
宿題じゃないのですが
300万行くらい(サイズは150MBくらい)あるテキストファイルの
\n\n(改行2つ)を\t(タブ)に置換するだけのCのプログラムお願いします
コンパイラはBCC5.5で期限は特にありません
315デフォルトの名無しさん:2005/10/12(水) 10:19:34
[1] 授業単元:生産画像処理工学
[2] 問題文(含コード&リンク): ヒストグラムを求めよう
対象画像
横20×縦15の乱数を用いた画像(値の範囲は0〜9)

画像データを乱数で設定し、その画像のヒストグラムを求め、
求めたヒストグラムを '*' 文字で表示する。

0 : 30 ******************************
1 : 28 ****************************
2 : 32 ********************************

.......
[3] 環境
 [3.1] OS: soralis
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 2005/10/12 まで
[5] その他の制限: 特になし
316デフォルトの名無しさん:2005/10/12(水) 10:37:24
[1] 授業単元:プログラム
[2] 問題文(含コード&リンク):
次に記すcellの構造の定義と変数の宣言の下で、以下の問題に答えよ
struct cell {int data;struct cell *next};
struct cell *p, *q, *r
問題1 次に示す状態で計算が始まるものとする
data next
p□→□ □
50 null
如何に示す各プログラムコードを順に実行したとき、変数p,q,rとそれらが指す
セル内容の各コードに図示せよ。
1 r=(struct cell *)malloc(sizeof(struct cell));
2 p=q->next;
3 p->next=r;
4 r->data= 100;
5 r->next=q;
[3] 環境
 [3.1] OS: 手書きの問題です
 [3.2] コンパイラ名とバージョン: 無し
 [3.3] 言語: C
[4] 期限: 2005年10月13日
[5] その他の制限:
5問ありますがお願いします
317デフォルトの名無しさん:2005/10/12(水) 10:40:01
>>315
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void make_image(int image[15][20]){
    int y,x;
    
    for(y=0;y<15;++y)for(x=0;x<20;++x)image[y][x] = rand()%10;
}
int main(int argc,char**argv){
    int image[15][20],count[10]={0},i,j;
    
    srand(time(NULL));
    make_image(image);
    for(i=0;i<15;++i)for(j=0;j<20;++j)++count[image[i][j]];
    for(i=0;i<10;++i){
        printf("%d : %2d ",i,count[i]);
        for(j=0;j<count[i];++j)
            putchar('*');
        putchar('\n');
    }
    return 0;
}
318電大さんが通る:2005/10/12(水) 11:59:49
授業で出た課題がさっぱりです。
友達にきいたら、こんなんもわからんカスは死ねと言われました。
こんなカスにお力を…
----------------------------------------------------------------------
自給(円/時間)、働いた時間(時間)、交通費(片道、円)を入力してアルバイト料
を計算し、表示する。扱う数(変数)は整数とする。
----------------------------------------------------------------------
319デフォルトの名無しさん:2005/10/12(水) 12:19:39
>>318
>>1も読めないカスは氏ね。
320デフォルトの名無しさん:2005/10/12(水) 13:06:39
>>316
特に図示すべき対象物の指定がないので、
単純に変数p, q, r と問題文の該当コード部分を写した後に
「図示すべき対象物の指定なし」と書いて出せば大丈夫でしょう。簡単!!
321315:2005/10/12(水) 13:34:45
>>317

ありがとうございました!
322デフォルトの名無しさん:2005/10/12(水) 14:41:26
>>316
問題文が正しいかもう一度チェックしてみ(特に2)
それと、初期状態の図は画像でくれた方がわかり易いかも
323デフォルトの名無しさん:2005/10/12(水) 16:34:15
>>287,288
ありがとうございますm(ーー)mいまからやってみます。
324デフォルトの名無しさん:2005/10/12(水) 18:22:26
#include <stdio.h>

main()
{
int n, i, s;

printf("n を入力して下さい : ")
scanf("%d", &n)";
s=0;
for (i=1; i<=n; i++) {
s +=i;
}
printf("n=%f Sum=%d/n",n,s);
}

1 この例題を変更して1+1/2+1/3+........+1/n の結果を表示するプログラムを作成せよ

2 nの値を読み込んで、n!を計算し表示するプログラムを作成せよ

これ課題でてるんだけど解けない。。。orz
頭いい先輩方お願いします。よろしくお願いします。
325デフォルトの名無しさん:2005/10/12(水) 18:33:38
>>324
1.
#include <stdio.h>
int main()
{
 double s;
 int i, n;
 printf("n を入力してください : ");
 scanf("%d", &n);
 s = 0.0;
 for (i=1; i<=n; i++) {
  s += 1.0/i;
 }
 printf("n=%d sum=%g\n", n, s);
 return 0;
}
2.
#include <stdio.h>
int main()
{
 int i, s, n;
 printf("n を入力してください : ");
 scanf("%d", &n);
 s = 1;
 for (i=1; i<=n; i++) {
  s *= i;
 }
 printf("n=%d n!=%d\n", n, s);
 return 0;
}
326デフォルトの名無しさん:2005/10/12(水) 19:57:59
>>287
なんどもすいません。。打ち直していろいろやったんですが、検索された文字列が表示されません。
検索されてないのか??エラーはないです。。警告がありますファイル処理で・・cwcharのincludeを検索したのですがよくわかりません。
wchar_tの型ファイル処理などがこれでいいのかわかりません。何度もすいません。
mainのcpp==http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/979.txt
mainのh==http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/983.txt
searchのcpp==http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/981.txt
公共データ==http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/982.txt
327デフォルトの名無しさん:2005/10/12(水) 20:05:33
こんな宿題がでて、分からず書き込みました。
教えてください。お願いします
[1] 授業単元: ネットワークとプログラミング
[2] 問題文:ホスト名を元にIPアドレス、サブネットマスク、GW、優先DNS、代替DNSを設定するプログラムを作りなさい。
      なお、アドレスの設定は、ファイル(CVS)から読み設定するものとする。
      ファイル(CVS)の中身以下の元のする。
ホスト名IPアドレスサブネットマスクGW優先DNS代替DNS
host110.192.1.5255.255.255.010.192.1.25410.192.30.110.192.40.12
host210.192.1.6255.255.255.010.192.1.25410.192.30.110.192.40.12
host310.192.1.10255.255.255.010.192.1.25410.192.30.110.192.40.12
host410.192.2.10255.255.255.010.192.2.25410.192.30.110.192.40.12




host10010.192.100.5255.255.255.010.192.100.25410.192.30.110.192.40.12 
なお、ホスト名がファイルのリストに無い場合エラーで警告させるようにする
また、正常に設定されたら、再起動させるようにせよ。
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: VC 6.0
 [3.3] 言語: Cまたは、C++
[4] 期限: [2005年10月15日00:00まで]
[5] その他の制限: 特になし。


よろしくお願いします。
328デフォルトの名無しさん:2005/10/12(水) 20:18:42

ホスト名とかがつながって表示されているのでスペースであけました。
ファイルは、以下のようになっています。

ホスト名 IPアドレス サブネットマスク GW 優先DNS 代替DNS
host1 10.192.1.5 255.255.255.0 10.192.1.254 10.192.30.1 10.192.40.12
host2 10.192.1.6 255.255.255.0 10.192.1.254 10.192.30.1 10.192.40.12
host3 10.192.1.10 255.255.255.0 10.192.1.254 10.192.30.1 10.192.40.12
host4 10.192.2.10 255.255.255.0 10.192.2.254 10.192.30.1 10.192.40.12



host100 10.192.100.5 255.255.255.0 10.192.100.254 10.192.30.1   10.192.40.12

なんどもすみません。よろしくお願いします。
329デフォルトの名無しさん:2005/10/12(水) 22:47:30
[1] 授業単元:C言語プログラミング
[2] 問題文:
ある人工衛星が地球を1周する周期は T=2.0π((R+h)^3/(gR^2))^0.5 である
この人工衛星の地球からの高さを100kmからはじめ100kmきざみで
1000kmまで変化させた時のTの値を求めよ。
Tは関数を用いて計算せよ
また
T:周期(秒)
g:重力加速度(9.81m/s^2)
R:地球の半径(6.37*10^6メートル)
h:地表から人工衛星までの高さ(m)
とする

[3] 環境
 [3.1] OS: Windows XP
 [3.3] 言語: C
[4] 期限: 2005年10月14日まで
[5] その他の制限:よろしくお願いします
330デフォルトの名無しさん:2005/10/12(水) 23:01:14
>>329
そのまんま。

#include <stdio.h>
#include <math.h>

#define PI 3.1415926
#define R 6.37e6
#define G 9.81

double T(double h)
{
  retrun 2.0*PI*pow((pow(R + h,2.0) / (G*pow(R,2.0))),0.5);
}

int main(void)
{
  int i;
  double t;
  for(i = 1;i <= 10;i++){
    t = T(i * 100.0);
    printf("%2d:T=%lf\n",i,t);
  }
  return 0;
}
331デフォルトの名無しさん:2005/10/12(水) 23:21:44
>>329
#include<stdio.h>
#include<math.h>

#define PAI 3.14
#define G 9.81
#define R 6.37E6
/*地表から人工衛星までの高さ(km)*/
#define H 100

double CULt(int h)
{
return 2.0*PAI*pow((pow(R + h,3.0) / (G*pow(R,2.0))),0.5);
}

int main(void)
{
int h=1000*H;
int i;

for(i=h;i<=1000000;i=i+100000){
printf("h=%4d(km): T=%f(sec)\n",i/1000,CULt(i));
}

return 0;
}
332デフォルトの名無しさん:2005/10/12(水) 23:32:18
>>330-331
ありがとうございます。
333デフォルトの名無しさん:2005/10/13(木) 00:07:03
>>327 >>328は問題の意味がわかんない。

ホスト名を入力・選択すると、そのPCのネットワーク設定が変更、でいいのかな?
でも正直こんな課題、家とかでも実験しにくいし、出題者は何を考えているんだ...

そして>>333ゲッ
334デフォルトの名無しさん:2005/10/13(木) 00:21:42
【質問テンプレ】
[1] 授業単元:ソフトウェア基礎
[2] 問題文(含コード&リンク): テキストファイルを読み込んで、文字ごとに登場頻度を%表示で表すプログラムを作成せよ。

例えば、aaaabbcccdと書いてあるテキストファイルを読み込むとする。
出力結果は読み込まれたファイル内容→aaaabbcccdと各文字の割合→a=40% b=20% c=30% d=10% と出力されるようにせよ。

[3] 環境
 [3.1] OS: Windowsxp home
 [3.2] コンパイラ名とバージョン:家ではbcpad、学校ではC++ビルダー6.0
 [3.3] 言語: Cのみ
[4] 期限:明日中
[5] その他の制限: ファイルポインタというのをこの前の授業で習ったので、それを使用します。
考えてたらわからないまま期限になってしまいました。どうぞよろしくお願いします。
335デフォルトの名無しさん:2005/10/13(木) 00:28:03
>>334
含まれてる文字はアルファベット小文字のみか?
336デフォルトの名無しさん:2005/10/13(木) 00:28:41
てけとーなんで信用しないように。
#include <stdio.h>
#include <ctype.h>

int main(void)
{
int c, total = 0, count[256] = {0};
while ((c = getchar()) != EOF) {
count[c]++;
total++;
}
for (c = 0; c < 256; i++) {
if (count[i] && isprint(c)) {
printf("%c = %f%%\n", c, count[c] / (double) total);
}
return 0;
}
337デフォルトの名無しさん:2005/10/13(木) 00:39:57
>>334
ファイルポインタを使用するってのが曖昧で
どうしたいかわからんから、推測気味に書いてみた。

#include<stdio.h>
int main(){
    int counts[256]={0},count=0,ch,i;
    FILE* fp = fopen("a.txt","r");
    if(!fp){
        puts("Error: ファイルが存在しません。");
        return 0;
    }
    while((ch=getc(fp))!=EOF)++count,++counts[ch];
    for(i=0;i<256;++i)
        if(counts[i])printf("%c=%g%%\n",i,counts[i]*100.0/count);
    return 0;
}
338334:2005/10/13(木) 00:47:39
>>335
アルファベットの大小と数字でできれば良いと先生が言っていました。
339デフォルトの名無しさん:2005/10/13(木) 00:51:42
>>337のファイル絡み+getcを>>336のに突っ込めばいいんじゃまいか?
340334:2005/10/13(木) 00:53:21
>>335 336
素早い返信大変感謝です。問題には書いてませんが、読み込むファイルは自分で指定できるようにして
と言われました。書いていなくてすみません(*_ _)
341334:2005/10/13(木) 00:56:25
レス間違ってしまった・・・。>>337さん。すみません。
皆さんのを参考にもう少し頑張ってみます
342デフォルトの名無しさん:2005/10/13(木) 00:59:30
>>340
暇なんで貼り絵した。脳内gccすら通してないからミスってたら修正よろ
mainの仮引数間違ってる可能性大

#include<stdio.h>
#include <ctype.h>

int main(int argc, char *argv){
int c, total = 0, count[256] = {0};

if (argc <= 1) {
puts("Error: ファイル名を指定してください");
return 1;
}

FILE* fp = fopen(argv[1], "r");
if(!fp){
puts("Error: ファイルが存在しません。");
return 1;
}
while ((c = getc(fp)) != EOF) {
count[c]++;
total++;
}
for (c = 0; c < 256; i++) {
if (count[i] && isprint(c)) {
printf("%c = %f%%\n", c, count[c] / (double) total);
}
return 0;
}
343デフォルトの名無しさん:2005/10/13(木) 01:03:16
仮引数はchar *argv[]。
return 0;の前に}が1個不足してる。
って、漏れも脳内コンパイラだけど。
344デフォルトの名無しさん:2005/10/13(木) 01:06:48
[]付けるかどうか迷ったんだよな・・・しかもfor閉じられてないし
やっぱり久しぶりに触るとダメだな
Pascalなんて時代遅れな言語やらせる大学がUzeeeeeeeeeeeeeeee('A`)
345デフォルトの名無しさん:2005/10/13(木) 01:17:42
そこまで好きなら大学以外のプログラムもしなっせ。
Javaあたりがおすすめ。(C知ってるとC++を勉強するのに足かせになる)
346デフォルトの名無しさん:2005/10/13(木) 01:19:49
>>345
無論、大学の方は課題だけ仕上げて独学でやってるよ
今はオブジェクト指向とC++学び中

Javaやろうかとは思ったんだけど、どうもあの言語好かないんだよな
言語仕様云々じゃなくてJREが遅いってのが原因だけど
347デフォルトの名無しさん:2005/10/13(木) 01:57:08
えらいな。勉強家は。こういう人ばっかだと、このスレいらんのだろうな。
348デフォルトの名無しさん:2005/10/13(木) 02:25:03
[1] 授業単元:
[2] 問題文 (以下にすべて書きました。)
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/984.txt
[3] 環境
 [3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン: gcc か bcc
 [3.3] 言語: C
[4] 期限:2005/10/14まで
[5] その他の制限:配列はまだです。For文までやりました。
349デフォルトの名無しさん:2005/10/13(木) 02:57:30
スタート状態が、
器A 茶 透 緑
器B 茶 透 緑
器C 茶 透 緑
となっていて、
ゴール状態が
器A 茶 茶 茶
器B 透 透 透
器C 緑 緑 緑
となればよいのか?

移動ってのは例えば、
移動前
器A 茶 透 緑
器B 茶 透 緑
器C 茶 透 緑
移動後
器A 茶 茶 透 緑
器B 茶 透 緑
器C 透 緑
ということか?
350348:2005/10/13(木) 03:17:03
>>349
えと
器A:茶1 緑2 透明3
器B:茶4 緑5 透明6
器C:茶7 緑8 透明9
だったら
器A:茶のみ1+4+7
器B:緑のみ2+5+8
器C:透明のみ3+6+9
と集めて
最小値は4+7+2+8+3+6の30ということになります
出力 BGC 30 (茶緑透明)

なので
器A 茶 透 緑
器B 茶 透 緑
器C 茶 透 緑
となっていて、
ゴール状態が
器A 茶 茶 茶
器B 透 透 透
器C 緑 緑 緑
のように1つの容器を1色だけにするための最小移動数を求めればいいそうです。
351デフォルトの名無しさん:2005/10/13(木) 03:22:01
すまん、理解できんかった。
352デフォルトの名無しさん:2005/10/13(木) 03:41:31
>>350
つまり、r1〜r6の最小の物を見つけて(同値ならr1の方を優先で)
コードを6分岐できればいいということだな?
353デフォルトの名無しさん:2005/10/13(木) 03:42:00
int name; これを宣言
num = r1; name = 1; こう変更

各if内を同様に変更 -> num = r2; name = 2;
printfはifから消す

最後に以下
switch (name) {
1: printf("BCG %d", num); break;
2: printf("BGC %d", num); break;

6: printf("GCB %d", num); break;
}

多分この変更でいけるんじゃまいか?
switchをまだやってないならif (name == 1)とかの羅列に変えてくれ

つーか配列もポインタも使えないからすっきりした実装ができないな
354デフォルトの名無しさん:2005/10/13(木) 03:49:51
>>350
ところで、switch習った?
355デフォルトの名無しさん:2005/10/13(木) 03:52:10
>>351
ttp://online-judge.uva.es/p/v1/102.html
問題の概要はこれ(ただし英語)だろ?これならやったことあるからソース探してみる。似た実装だった気がするが。
356デフォルトの名無しさん:2005/10/13(木) 03:58:11
>>348
while(cin >> b1 >> g1 >> c1 >> b2 >> g2 >> c2 >> b3 >> g3 >> c3) {
bb1 = b2 + b3; gg1 = g2 + g3; cc1 = c2 + c3;
bb2 = b1 + b3; gg2 = g1 + g3; cc2 = c1 + c3;
bb3 = b1 + b2; gg3 = g1 + g2; cc3 = c1 + c2;
// BCG
min = bb1 + cc2 + gg3; color = "BCG";
// BGC
if((sum = bb1 + gg2 + cc3) < min) {
min = sum; color = "BGC";
}
// CBG
if((sum = cc1 + bb2 + gg3) < min) {
min = sum; color = "CBG";
}
// CGB
if((sum = cc1 + gg2 + bb3) < min) {
min = sum; color = "CGB";
}
// GBC
if((sum = gg1 + bb2 + cc3) < min) {
min = sum; color = "GBC";
}
// GCB
if((sum = gg1 + cc2 + bb3) < min) {
min = sum; color = "GCB";
}
cout << color << " " << min << endl;
}
C++だが、根幹が分かれば大丈夫だと思う。重要なのは出力を1カ所で行うことだな。
357デフォルトの名無しさん:2005/10/13(木) 04:09:10
>>356
配列まだって言ってるから文字列無理じゃね?
358348:2005/10/13(木) 04:17:46
>>352
そうです。
アルファベット順(若しくは茶色>透明>緑色)だそうです。
>>353-354
switchは分かります。でも使わなきゃムリなんですかね・・・。
IF文で出来るとかあったけど、switch使ってもいいよってことなのか・・。
>>356
c++は触ったことも無いかも・・・でも同じような感じですね。
もすこし見てみます。
359デフォルトの名無しさん:2005/10/13(木) 04:20:52
>>356
配列をやっていない=>ポインタなんでなおのことやってない
colorをどう宣言すれば良いかもわかんないと思うぞ

Cを標準装備しているならchar *color;でいいが
無理やりするなら
char color1,color2,color3;
color1='B';color2='C';color3='G';
printf("%c%c%c",color1,color2,color3);
かなorz
360287:2005/10/13(木) 06:16:31
>>326
警告とか出たなら書いてくれ.

で……申し訳ないが g++,bcc でも動作するコードは書けなかった.どうやら locale 周りで
死んでるみたい.もしファイル読み込みが fscanf(fp, "%d,%l[^,],%l[^,],%d", 略): で動作するならラッキー.

動かなかったら
1. wchar_t は諦めて素敵な日本語ライブラリを探す.
2. 日本語単位になるのを諦めて char でやる.skip[ (unsigned char)x ].
3. wchar_t でやる方法をがんばって調べる.

お勧めは 2. あと誰か日本語処理強い人が居たらお願いします.
361デフォルトの名無しさん:2005/10/13(木) 07:13:33
>>326 です。
>>333
>ホスト名を入力・選択すると、そのPCのネットワーク設定が変更、でいいのかな?
>でも正直こんな課題、家とかでも実験しにくいし、出題者は何を考えているんだ...

ホスト名は、入力しません。ホストに設定されている、名前とファイルにある名前を照らし合わせて、一致したら
IPを設定するプログラムです。違う場合、エラー通告。
ホストに設定されている、名前がファイル上にあったら、その行のアドレスをPCに設定するプログラムです。

よろしくお願いします。
362デフォルトの名無しさん:2005/10/13(木) 07:25:04
325さんどうもありがとう(泣)
363デフォルトの名無しさん:2005/10/13(木) 14:32:13
[1] 授業単元:ネットワーク
[2] 問題文(含コード&リンク):ウェブサーバーの構築。
[3] 環境
 [3.1] OS: LINUX
 [3.2] gcc
 [3.3] C
[4] 期限: 10月15日。
[5] その他の制限: ネットワークに関する基礎とソケットプログラミングを少し。

ポート80や8080や6789を使う代わりに、自分独自のポートを選ぶ。
次の2つのステップを含む。
「ステップA」
メッセージのリクエストをダンプするウェブサーバーを構築。
ブラウザーを使用して、自分のサーバーにつなぎ、メッセージのリクエストを記録する。
「ステップB」
パートAで作ったコードに基づき、ブラウザーからHTTPリクエストをparseし、、
ヘッダーラインによってprecedeされるリクエストファイルを含むHTTPの応答メッセージをつくり、
応答を直接clientに送るウェブサーバーを作るために、関数を1つ加える。
「注意。」ブラウザーとサーバーを同じマシーンでやっているならば、local hostまたは、127.0.0.1を使う。
contentType functionは少なくともHTMLファイルを認識する。

パートA、パートBが終われば、自分のサーバーをテストする。
最初にHTMLファイルをサーバーのdirectoryにおき、サーバーに接続する。
webserver.c とレポートするhtmlファイルを提出する。

ネットワークの授業の最初のレポートです。
宿題に関しては、教授等まったくサポートしてくれないということになっています。
最初のプロジェクトで、まず何をどう始めていいかさえわかりません。

よろしくお願いします。
364デフォルトの名無しさん:2005/10/13(木) 15:25:40
[1] 授業単元:ゼミ
[2] 問題文:文脈自由文法で入力された
      「わしのにわのわしのきにわしがとまったので,わしがてっぽうでうったら,
       わしもおどろいたが,わしもおどろいた。」
      この仮名文字の文章を,
      「わしの庭のわしの木に鷲が留まったので,わしが鉄砲で撃ったら,
       鷲も驚いたが,わしも驚いた。」
      このように漢字変換されるアルゴリズムと,それに基づくプログラムを作成する課題です。
      入力形式は,1文全てを入力しての1発変換か,カンマ区切りの入力(課題では4回の入力)で,
      正しい日本語に変換するという問題です。

      問題にはカンマはない状態でしたので,もしカンマの位置が不適切でしたら,
      プログラムできるように変えてください。
カンマで区切る場合は,変換の度に正しい漢字に変換できるようにしてください。
      
      例えば,「わしのにわのわしのきにわしがとまったので」と入力されたら
      1回の変換で「わしの庭のわしの木に鷲がとまったので」と変換されるようにしたいです。
      
      それと,「とまった」は「留まった」でいいと思うのですが
      もし間違っているようであれば,訂正してください。
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン:VC 6.0
 [3.3] 言語:C++
[4] 期限: [2005年10月14日2:00まで]
[5] その他の制限: 関数,構造体,ポインタの基本的なことは習っていると思います。
         変換の際,辞書ファイルが必要になるような気もするので
         もし必要であれば,辞書ファイルもアルゴリズムに合わせてください。
         *アホなので,コメント多めでお願いします><

サポートやヒントらしいヒントもなく,まったく組めない状態です。
よろしくお願いします。
365デフォルトの名無しさん:2005/10/13(木) 15:51:57
>>364
問題がよくわからん.その特定の文章の連続部分文字列の変換だけ対応すればいいのか,
もっと一般的なアルゴリズムがほしいのか,とか.

背景が知りたいので,どんなゼミでどんな状況でこの課題が出されたか詳しくキボン.
366デフォルトの名無しさん:2005/10/13(木) 16:14:13
(初期のワードプロセッサで)最長一致が結構認識率が高いということだった。
課題については、strcmp(line, "わしの・・・")
で。
367デフォルトの名無しさん:2005/10/13(木) 16:21:34
[1] 授業単元: 基礎情報処理
[2] 問題文
正整数を入力し、それをローマ数字で表示するプログラムを作りなさい。
例:
3 III
5 V
12 XII
46 XXXXVI
73 LXXIII
111 CXI
378 CCCLXXVIII
521 DXXI
1002 MU
[3] 環境
 [3.1] Windows
 [3.3] C言語
[4] 期限: 10月17日(月)
[5] その他の制限: 制限についてはそこまで考慮していただかなくて
かまいませんが、一応今まで習ったのはfor,if,多重ループ、while、配列、
関数です。多少非効率的でも簡単なプログラムだと嬉しいです。
よろしくお願いします。
368not 287:2005/10/13(木) 17:30:16
>>326

VS.NET 2003のようだし、こんなモンでいいだろ。>>287氏のmain()の変わりに使ってくれ。
stdinから読んでstdoutから吐くのでリダイレクトしてくれ。検索キーは引数で指定。

void look(wchar_t *key)
{
    table(key);
    int m, n;
    wchar_t s[1024], t[1024], *p;
    while (scanf("%d,%l[^,],%l[^,],%d", &m, s, t, &n) == 4)
        if (p = Search(s, key))
            printf("%d,%ls,%ls,%d\n", m, s, t, n);
}

int wmain(int argc, wchar_t **argv) {
    locale::global(locale("japanese"));
    if (argc < 2) {
        fprintf(stderr, "usage: %s searchkey\n", argv[0]);
        return 1;
    }
    look(argv[1]);
    return 0;
}
369デフォルトの名無しさん:2005/10/13(木) 17:38:59
>>367
#include<stdio.h>
int main(){
char *M[10]={"","M","MM","MMM","M?","?","?M","?MM","?MMM","M?"};
char *C[10]={"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
char *X[10]={"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
char *I[10]={"","I","II","III","IV","V","VI","VII","VIII","IX"};
unsigned num;
scanf("%u",&num);
printf("%s",M[num%10000/1000]);
printf("%s",C[num%1000/100]);
printf("%s",X[num%100/10]);
printf("%s",I[num%10]);
return 0;
}
370デフォルトの名無しさん:2005/10/13(木) 17:39:42
<<360
<<368
ありがとうございます早速がんばってみます。
あっ警告いろいろやってたらきえました(−−;)
371デフォルトの名無しさん:2005/10/13(木) 18:05:22
CSVファイルを読みとって、一行ごとに結果を表示したいんだけど、、、

char szStr[1024 * 64];
DWORD dwAccBytes;

HANDLE hFile = ::CreateFile( csvFile.c_str(), GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
// ファイルポインタを読み込む
if( ReadFile(hFile, szStr, 1024*64, &dwAccBytes, NULL) )
{

::CloseHandle( hFile );
}


szStrに、ファイルの全部の内容がどば〜っとはいってしまってどうしたらいいかわかりません。
szStrを改行ごとにしらべて分解していくしかないのでしょうか?
372デフォルトの名無しさん:2005/10/13(木) 18:11:31
>>371
読んだ後にカンマとか改行とかでセパレート
これでわからんようなら >>1 参照
373デフォルトの名無しさん:2005/10/13(木) 19:08:20
>>371
stdioを使え。fopen()してfgets()。
カンマで区切るには
ttp://plaza.harmonix.ne.jp/~fakira/turedure/cprog_01.htm
のGetCSV()でも使え。一応ダブルクォートに対応しているようだ。
374364:2005/10/13(木) 19:18:33
>>365
有難う御座います。説明下手ですみません。
特定の文章の連続部分文字列の変換だけ対応というよりは、
課題も含んだ一般的なアルゴリズムでお願いします。

課題が出された背景は,ゼミで文脈自由文法について習っていた中で
文脈自由文法を漢字変換する際に,
アルゴリズムとすることが難しい例として
「わし」と「鷲」の変換例が出されて,より日本語らしい文章ということで
課題のような仮名文が出されました。

>>366
有難う御座いました。
最長一致法で認識率が高いのは分かるのですが,
この課題では,2回出てくる「わしもおどろいた。」の部分で
それぞれ違う変換を求められるので,最長一致法では無理かなって思ってました。

私が勝手に最長一致法では無理と判断して書かなかったので
もしできるようなら,最長一致法でお願いします。
375デフォルトの名無しさん:2005/10/13(木) 19:30:33
char *henkan(const char *s)
{
if (strcmp(s, "わしのにわのわしのきにわしがとまったので,わしがてっぽうでうったら,わしもおどろいたが,わしもおどろいた。") == 1)
return "わしの庭のわしの木に鷲が留まったので,わしが鉄砲で撃ったら,鷲も驚いたが,わしも驚いた。";
else
return s;
}
ワードプロセッサの「貴社の記者は汽車で帰社した」なんかはこんな発想で作られている。
何がいいたいかというと、特例を作ってしまえばよいってこと。
(マジメにやるなら、その手のフリーソフトのソース読んでください)
376デフォルトの名無しさん:2005/10/13(木) 19:36:10
すまん。strcmp(..) == 0だ・・・吊って来る。
377デフォルトの名無しさん:2005/10/13(木) 19:36:20
>>375
×strcmp(...,...) == 1
○strcmp(...,...) == 0
378377:2005/10/13(木) 19:37:20
おっと、先に本人に気づかれたかw
379デフォルトの名無しさん:2005/10/13(木) 19:52:05
>>369
ちょっと感動した。
380デフォルトの名無しさん:2005/10/13(木) 20:04:19
「単なる宿題」の範囲を超えている問題だと思うのは俺だけ?
381デフォルトの名無しさん:2005/10/13(木) 20:11:07
まともなものができたらお金貰えそうだな

「こういう論文とかプログラムを参考にしてこんなもん考えてこう実装したらこうなった」
「こういう場合にはうまくいくがこういう場合にはうまくいかない」
とか発表するのがゼミならちょうどいいところだと思うが
382デフォルトの名無しさん:2005/10/13(木) 20:18:38
課題の目的が「うまくいかない」と確認させることな気がするし、
それをどう報告するかってのを学ばせるためだと思う。
383デフォルトの名無しさん:2005/10/13(木) 22:25:18
ゼミの宿題ではなくて卒業制作か何かなのではないだろうか。
384デフォルトの名無しさん:2005/10/13(木) 22:39:24
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/985.txt

ソートのプログラムで実行できるのですがn=50となってしまいます。
n=100にしたいんですがどこを修正したらいいでしょうか?
お願いします。
385デフォルトの名無しさん:2005/10/13(木) 22:40:46
D:\randdata.txt の先頭のデータ
386デフォルトの名無しさん:2005/10/13(木) 23:00:54
ありがとうございました。
387デフォルトの名無しさん:2005/10/14(金) 00:21:52
【質問テンプレ】
[1] 授業単元: ソートとサーチ

[2] 問題文(含コード&リンク):
                   @主な準備
                    ・対象データ配列作成プログラム
                      その都度指定する個数X(最大100万程度)の整数をランダムに並べた配列を作成、
                      また、必要に応じ整列済み、逆順整列済みなどのデータを作成。
                    ・処理時間の測定方法の調査
                    ・ソート結果が正しいかどうかチェックするプログラム
                   Aサーチプログラム1 与えられた配列から指定した値を検索する。
                   Bソートプログラム1 バブルソート、挿入ソートなどのNの2乗オーダのプログラムを1つ以上。
                   Cサーチプログラム2 整列済みの配列から指定した値を高速に検索する。
                   Dソートプログラム2 クイックソートなどNlogNオーダの高速ソートプログラムを1つ以上。
[3] 環境
 [3.1] OS: Unix
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: [2005年10月14日07:00まで]
[5] その他の制限: プログラムのソースをお願いします><A〜Dはすでに答えてもらっているので合ってるのでしょうか?
            @のデータを作成っていうあたりもよくわかりません。。プログラムのソースと一緒に説明できる方おられました
            らお願いします。。
388364:2005/10/14(金) 00:29:54
>>375>>378
特例を認めるってことですか。
「貴社の記者は汽車で帰社した。」の例文は知らなかったので、
その辺ももう少し調べてみたいと思います。

>>380>>383
みなさんおっしゃるように、
「うまくいかない」ことを学ばせるためかもしれません。
というか、言われて気づきました・・・。
卒論ではなくゼミなので、
それならサポートもらえないのも理解できますし。

特例の件も含めて、検討してみます。
本当にありがとうございました。
389デフォルトの名無しさん:2005/10/14(金) 00:42:50
>>387
void make_data(int data[], int size, int type)
{
int i, j, k;
if( type == 0 ) { // ランダム(重複有り)
for( i = 0 ; i < size ; i++ ) data[i] = rand();
} else if( type == 1 ) { // ランダム(重複無し)
make_data(data, size, 2);
for( i = 0 ; i < size ; i++ ) {
j = rand() % size;
k = data[i];
data[i] = data[j];
data[j] = k;
}
} else if( type = 2 ) { // 整列済み(重複無し)
for( i = 0 ; i < size ; i++ ) data[i] = i;
} else if( type = 3 ) { // 逆順整列済み(重複無し)
for( i = 0 ; i < size ; i++ ) data[i] = size - i;
}
}
前(>>187)にこれと同様なのを答えたことあるけど、具体的なソースとして
ここまで作ってあげる必要があるんならもっとキミは勉強が必要。
390デフォルトの名無しさん:2005/10/14(金) 02:06:59
まープログラムの課題なんて、他人のプログラムをコピーするくらいしかしないしなぁ。
せっかく段階を踏んで課題をだされても、ぜんぜん理解できないよ。
391デフォルトの名無しさん:2005/10/14(金) 02:20:28
>>389
>>187に気づいてさえいなかったに1票
392デフォルトの名無しさん:2005/10/14(金) 05:44:37
[1] 授業単元:プログラミング演習T
[2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/986.txt
[3] 環境
 [3.1] OS:Unix
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限: 2005年10月17日0:00まで
[5] その他の制限:配列を少しだけやりました
393デフォルトの名無しさん:2005/10/14(金) 06:06:15
#include<stdio.h>
#define MAX 1000
int main(void)
{
int i=0, sum=0, ary[MAX];
puts("整数を入力してください。");
while(i < MAX){
printf("NO.%d:", i+1);
scanf("%d", &ary[i]);
sum += ary[i++];
}
if(i > 1)
printf("合計は%dで平均は%.2fです。\n", sum, (double)sum / i );
return (0);
}
394デフォルトの名無しさん:2005/10/14(金) 06:10:21
>>393
終了条件を消してどうする
395デフォルトの名無しさん:2005/10/14(金) 07:39:41
終了条件ならwhile()の中に入ってるじゃん
396デフォルトの名無しさん:2005/10/14(金) 07:44:20
1000個入力しろってことか。
397デフォルトの名無しさん:2005/10/14(金) 08:57:56
>>389
本当にありがとうございます;;
簡単なプログラムしか作れない初心者で・・・・
授業では一切説明とかなくて・・・「はい、つくって」って感じで・・・助かりました><
自分でも勉強して行きますが、また力不足のとき、ここの方々の力を借りたいと思います;;
398デフォルトの名無しさん:2005/10/14(金) 14:15:24
>>392
そんな汚いコードは見るだけで害だから、すぐ忘れた方がいい
#include<stdio.h>
#define MAX   1000
int main(void)
{
int i=0,sum=0;
puts("整数を入力してください。");
for(i=0;i<MAX;i++){
        int num;
printf("NO.%d:",i+1);
if(scanf("%d",&num)<1)break;
if(num==9999)break;
sum+=num;
}
if(i){
   printf("合計は%dで平均は%.2fです。\n",sum,(double)sum/i);
    }
return 0;
}
399398:2005/10/14(金) 14:18:25
インデントがずれた、というか
入ってしまった
400デフォルトの名無しさん:2005/10/14(金) 14:54:49
1] 授業単元:プログラミング言語
[2] 問題文1:入力された数値を大きい順、小さい順に並びかえよ。
入力の終了条件/継続条件は各自決定すること。ただし、実行時に変更できるようにすること。
問題文2:入力された数値を大きい順、小さい順に並びかえよ。
ただし、同じ値には同じ順位を付けて、順位は一つずつ変化する。
問題文3:入力された数値を大きい順、小さい順に並びかえよ。
ただし、同じ値には同じ順位を付けて、順位は個数ずつ変化する。
[3] 環境
 [3.1] OS:unix
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限:2005/10/24(月)17時まで
[5] その他の制限:選択ソートを使用。
お願いしますorz
4011-1:2005/10/14(金) 16:35:54
>>400#include<stdio.h>
#include<stdlib.h>
#define MAX 10000

void selsort(int data[],int n,int flg);

int main(int argc,char** argv){
int i,n;
int *data;

n=atoi(argv[1]);
data = (int *)malloc(sizeof(int)*n);
for(i=0;i<n;i++){
printf("No.%d = ",i+1);
scanf("%d",&data[i]);
}
selsort(data,n,0);
printf("\n[Ascending order]\n");
for(i=0;i<n;i++){
printf("%d\n",data[i]);
}
selsort(data,n,1);
printf("\n[Descending order]\n");
for(i=0;i<n;i++){
printf("%d\n",data[i]);
}
return 0;
}
4021-2:2005/10/14(金) 16:37:06
void selsort(int data[],int n,int flg){
int i,j,k,min,max,temp;
if(flg==0){
for(i=0;i<n-1;i++){
k=i; min=data[i];
for(j=i+1;j<n;j++){
if(min>data[j]){
min=data[j];
k = j;
}
}
temp=data[i];
data[i]=data[k];
data[k]=temp;
}
}
if(flg==1){
for(i=0;i<n-1;i++){
k=i; max=data[i];
for(j=i+1;j<n;j++){
if(max<data[j]){
max=data[j];
k = j;
}
}
temp=data[i];
data[i]=data[k];
data[k]=temp;
}
}
}
403401-402:2005/10/14(金) 16:38:52
とりあえず問題文1だけやってみました。
自分も学生なんでなんか間違ってるかもしれませんが(´・ω・`)
404デフォルトの名無しさん:2005/10/14(金) 18:17:12
>>403
mallocしたものはfreeしましょう。(OSが…、とかじゃなく気持ち悪いから)

> if(min>data[j]){
> min=data[j];
> k = j;
> }
とかは
if(data[k]>data[j]){
k = j;
}
の方が見やすいかな

あと、int flagはint descとか意味のある名前にしましょう。
405401-402:2005/10/14(金) 18:39:40
>>404
ご指摘ありがとうございます。
mallocしてたこと忘れてましたorz
#define MAX 10000 も要らないですね。
406367:2005/10/14(金) 23:51:08
>369
ありがとうございます!
…が、charというものがよく分かりません。
習っていないものはあまり使わないほうがよいのですが、
他の方法はありませんか?申し訳ないです。
別解を思いついた方、是非教えて下さい。お願いします。
407デフォルトの名無しさん:2005/10/15(土) 00:07:14
[1] 授業単元: プログラミング実験
[2] 問題文
あるファイルには、全て小文字で書かれた英単語が、スペースまたは改行を区切りに書かれている。
このファイルの中には同じ単語が何回か繰り返し入力されている。このようの単語ファイル名をキーボードから入力すると、
各単語とそれぞれの出現回数と、その訳をディスプレイに表示し、かつ指定した出力ファイルにも書き込むプログラムを作成せよ。
ただし、入力単語ファイルの単語の種類は100未満とする。単語の一覧表示の順序はファイル中に出てきた順でよい

このプログラムを作成するに当たり、ofstream、ifstreamを使用する。
ifstreamでは英単語用と、辞書用の二つのifstreamのオブジェクトを定義する。
辞書には『英単語 訳』と入っているので英単語用の配列と訳用の配列を用意し、i番目の英語の訳はi番目に入るようにする。
ファイルに出現した単語を格納するstring配列を用意する。
上記の単語配列にあわせて、その単語の出現頻度を格納する整数配列も用意する。
<実行例>
Specify input file! words.txt
Specify output file! result.txt
result:
and と 3
apple リンゴ 2
button ボタン 1
cat 猫 3
kiwi 未登録 1

辞書ファイル以下にアップロードしてあります
ttp://www.geocities.jp/ryo_haruka2002/dicE1.txt
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: 不明
 [3.3] 言語: C++
[4] 期限: [2005年10月17日9:00まで]
[5] その他の制限: 分岐、多重繰り返し、リダイレクション、配列あたりまでやってます。

作ってるうちに8つくらい配列が出来てしまい、コンパイルしたらエラーだらけで
とても使い物にならなかったので…お力添えをお願いします。
408デフォルトの名無しさん:2005/10/15(土) 00:25:41
std::vector<>とか習った?
409デフォルトの名無しさん:2005/10/15(土) 01:19:08
map使うとすぐだな
410369:2005/10/15(土) 01:30:13
>>406
charが解らないってこと?(それならお手上げ)
*(ポインタ)が解らないってことなら
char M[10][5]={"","M","MM","MMM","M?","?","?M","?MM","?MMM","M?"};
char C[10][5]={"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
char X[10][5]={"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
char I[10][5]={"","I","II","III","IV","V","VI","VII","VIII","IX"};
ならどう?
4111-1:2005/10/15(土) 02:12:17
>>406
#include<stdio.h>

int main(void){

int i,num;

printf("正整数を入力してください:");
scanf("%d",&num);

i=1;
while(i){
if(num>=1000){
printf("M");
num = num-1000;
}
if(num<1000) i=0;
}
i=1;
while(i){
if(num>=900){
printf("CM");
num = num-900;
}
if(num<900) i=0;
}
4121-2:2005/10/15(土) 02:12:53
i=1;
while(i){
if(num>=500){
printf("D");
num = num-500;
}
if(num<500) i=0;
}
i=1;
while(i){
if(num>=400){
printf("CD");
num = num-400;
}
if(num<400) i=0;
}
i=1;
while(i){
if(num>=100){
printf("C");
num = num-100;
}
if(num<100) i=0;
}
i=1;
while(i){
if(num>=90){
printf("XC");
num = num-90;
}
if(num<90) i=0;
}
4131-3:2005/10/15(土) 02:14:01
i=1;
while(i){
if(num>=50){
printf("L");
num = num-50;
}
if(num<50)i=0;
}
while(i){
if(num>=40){
printf("XL");
num = num-40;
}
if(num<40) i=0;
}
i=1;
while(i){
if(num>=10){
printf("X");
num = num-10;
}
if(num<10) i=0;
}
if(num==0) printf("\n"); if(num==1) printf("I\n");
if(num==2) printf("II\n"); if(num==3) printf("III\n");
if(num==4) printf("IV\n"); if(num==5) printf("V\n");
if(num==6) printf("VI\n"); if(num==7) printf("VII\n");
if(num==8) printf("VIII\n"); if(num==9) printf("IX\n");
return 0;
}
414デフォルトの名無しさん:2005/10/15(土) 02:15:42
whileとifだけで書いみた。


って今よく見たら関数使ってもよかったのねorz
415デフォルトの名無しさん:2005/10/15(土) 02:37:53
if(num>=40)のとこのwhileの上のi=1;が抜けてる
416407:2005/10/15(土) 05:47:48
>>408>>409
まだ習ってないです…って>>408は多分>>407へのレスですね
417407:2005/10/15(土) 05:48:33
×>>407への
>>406への
418デフォルトの名無しさん ::2005/10/15(土) 06:53:07
[1] 授業単元:人工知能
[2] 問題文: 狼と山羊とキャベツと男のパズルを横型探索するプログラムを作成せよ。
[3] 環境
 [3.1] OS: Unix
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: [2005年10月18日まで]

よろしくお願いします。
419デフォルトの名無しさん:2005/10/15(土) 10:38:27
>>327
>>328 の問題と似ているんですが、以下の問題でました。

[1] 授業単元:ネットワーク論
[2] 問題文(含コード&リンク):
ホスト名を入力し、ファイルリストのからホスト名を元にIPアドレス、
GW、サブネット、DNSを設定させるプログラムを作成せよ。
なお、ホスト名が正しくない場合、エラーで通告せよ。
IPアドレスなどが、正しく設定されたら、
設定を反映させるために再起動を実行させるプログラムを実行せよ。


[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: VC 6.0等
 [3.3] 言語: C/C++/どちらでも可
[4] 期限: [2005年10月17日00:00まで]
[5] その他の制限: 特になし。

>>327 と違う点は、ホストも変更する点です。

よろしくお願いします。
420デフォルトの名無しさん:2005/10/15(土) 15:40:52
>>419
環境依存スレかネットワーク関係のスレのほうがいいかもねー

>>407
文字列はどうならいました?
#include <string>
std::string ...;
とか
#include <string.h>
string ...;
とか
#include <string>
using namespace std;
string ...;
とかあるんですけど。
421デフォルトの名無しさん:2005/10/15(土) 16:00:01
>>420
そんなこと言われなくてもわかってます。
それ以前に、そんな忠告するぐらいだったら最初から全部答えろやカスが。
422407:2005/10/15(土) 16:28:33
>>420
文字列はその一番下の
#include<string>
using namespace std;
を使ってます
423デフォルトの名無しさん:2005/10/15(土) 17:00:12
了解。C++はよくわからんけど、作ってみるよ。
424デフォルトの名無しさん:2005/10/15(土) 19:26:41
>>422
423 じゃないけど,できたのでうp.
std::vector を避けるためにデータ数の上限を仮定したのと番兵多用したのと
std::map を避けるために回数のカウントとか辞書参照とかは毎回線型探索したので
可読性も効率もあんまりよろしくないけど勘弁してください.
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/987.cpp
425デフォルトの名無しさん:2005/10/15(土) 22:04:01
>>424
ありがとうございます!助かりました!
あと番兵って何ですか?初めて聞く言葉ですが…

>>423
先に>>424さんが作られてしまいましたが、何パターンもみれた方が勉強になるんで完成したらアップしてもらえるとうれしいです。
426424:2005/10/15(土) 22:20:30
>>425
配列の最後に終端記号を置くことを番兵を置く,って言います.配列から何かを検索するときに
int i; for (i = 0; i < size; ++i) if (a[i] == 何か) break; の代わりに
a[size] = 何か; int i; while (a[i] != 何か) ++i; と書いたりする感じです.

上のプログラムの最後の部分では、日本語辞書の一番最後に "未登録" を置いておいて,英語辞書の
対応する部分に翻訳前のを設定して先頭から探索をかければ,もし普通に登録されてれば対応する英語,
登録されてなければ一番最後の部分で引っかかって "未登録" が出る,とかやってます.
427デフォルトの名無しさん:2005/10/15(土) 23:50:55
>>425
C/C++の文字列リテラルのナル文字も、ある意味番兵。
番兵(Sentinel)を使わない場合、文字列長を保存する仕掛けが必要になってしまう。
#そういう言語も少なくないし、C++の文字列クラスもそうなってたりはするが。
428デフォルトの名無しさん:2005/10/16(日) 00:01:08
わはは。423でつ。できませんでした。(手屁)
429デフォルトの名無しさん:2005/10/16(日) 00:07:24
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
あるテキストから(絶対パス、相対パスどちらかが記入されている)
ディレクトリを読み込み、ディレクトリを移動した後、ディレクトリ内にファイル
が存在する場合は、そのファイルのパーミッション、グループ名、ユーザ名、
ファイルサイズ、名前の順に表示する。

例)
テキスト内
/home/users/d05/d05a0rst/dir1/work

workディレクトリ内のファイル
hoge.c
hoge.txt

実行結果
-rw-rw-rw-rw- root root 1541 hoge.c
-rw-rw-rw-rw- users users 2416 hoge.txt

[3] 環境
 [3.1] OS: UNIX
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 無期限
[5] その他の制限: システム関数は使用してはいけない。
私が問題を聞いて感じたのは、構造体から必要な
情報のみを取得し、表示させるプログラムを作る
って事だと思いましたが、ls -l コマンド以外に
思いつきません。
なのでどうか皆さんお力お貸しください。
よろしくお願いします。
430デフォルトの名無しさん:2005/10/16(日) 00:16:08
opendir()/readdir()/closedir()/stat()
ユーザー名とグループ名は持ってきたことないからわからん。
431デフォルトの名無しさん:2005/10/16(日) 00:22:06
システム関数ってのが system("ls -l"); のことなら
FILE* fp=fopen("la -l", "r");
while( !feof(fp) ) { char tmp[1000]; fgets(tmp, 1000, fp); fputs(tmp, stdout); }
(短くするために色々省いた)で行けるんだけどなぁ…
432デフォルトの名無しさん:2005/10/16(日) 00:23:12
あ、なるほど。popenかもしれん。
433デフォルトの名無しさん:2005/10/16(日) 00:27:40
434デフォルトの名無しさん:2005/10/16(日) 00:29:45
>>430さん
>>431さん
さっそくご返答ありがとうございます。
system("ls -l"); が使用できないので、大変困っています。
自分が無知なもので、すみません。
イメージは多分、ディレクトリ内のファイル一つ一つに対して
パーミッション、グループ名、ユーザ名、ファイルサイズ、名前を
取得し表示の繰り返しだと思うんですが。
435デフォルトの名無しさん:2005/10/16(日) 00:35:01
execl使用可だったりして。
436429:2005/10/16(日) 00:41:30
429です。
できればどなたか簡単なパーミッション、グループ名、ユーザ名、ファイルサイズ、名前
取得のサンプルソースなんか書いていただけないでしょうか?
テキストからのディレクトリの取得やディレクトリの移動、あたりは
自分で何とかしようと思っていますが、パーミッションあたりは
何も知識が無く、どうしようもなく困っています。
よろしければ、お願いします。
execlも使用できないと思われます。
構造体からの取得ってものが私の悩みどころです。
437デフォルトの名無しさん:2005/10/16(日) 00:48:14
>>436
stat()のマニュアルページを見よ。
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man2/stat.2.html
438デフォルトの名無しさん:2005/10/16(日) 00:53:23
>>430
stat()したあとに/etc/passwdを検索とか(w
439デフォルトの名無しさん:2005/10/16(日) 00:56:23
先に /etc/passwd と /etc/group から ID→ユーザ名、グループ名 のテーブル作って
stat() で得られる uid gid から逆引きしたら?速さを気にしなければ何とかなるでしょ。

ってまぁ ls のソース見れば多分一発解決なんだろうが。
440デフォルトの名無しさん:2005/10/16(日) 00:57:42
被った上に先人はネタ扱い… (´・ω・`)ショボーン 自分も半分ネタ扱いだけどさ。
441デフォルトの名無しさん:2005/10/16(日) 01:00:46
lsのソースってばどこどこ?
442438:2005/10/16(日) 01:02:29
>>440
別にネタって訳じゃないけど、
思いついた自分も、全然スマートじゃないって感じただけ。
他に有効な方法があるのかは、知らない
443デフォルトの名無しさん:2005/10/16(日) 01:06:13
/etc/passwdとか直截見るのは論外。シャドウされてるかもしれないし。

getpwent()系の関数を使え。
444デフォルトの名無しさん:2005/10/16(日) 01:42:41
429・436です。
皆さんご返答ありがとうございます。
私の力では、>>438さん>>439さんの回答ネタなのかどうかもわかりませんが、
スマートなコーディングを行いたいと言うのが希望です。
unix初心者ですが、やさしい内容でご教授できないでしょうか?
445デフォルトの名無しさん:2005/10/16(日) 01:44:40
スマートかどうか分からんが、今書いてる。そっちのUNIXでどれだけの関数がまともに使えるか分からんが、
こっちでは一応こっちのUNIX・Linux・Cygwinでは動作テストしてみる。
446デフォルトの名無しさん:2005/10/16(日) 01:46:19
ふぁいと。
447444:2005/10/16(日) 01:47:26
おお、>>445さんありがとうございます。
ほんとココの住人の皆さんはしっかり答えてくれる方々が
いてくれて助かります。
ありがとうございます。
448デフォルトの名無しさん:2005/10/16(日) 01:50:44
めんどくさいから、gnuのftpからfileutilのソース持ってきてls.cを読んでみろ
449デフォルトの名無しさん:2005/10/16(日) 01:56:33
>>444
>>195なのかな?

やさしいかどうかは受け皿次第だ。
450447:2005/10/16(日) 02:07:20
>>448さん私には、めんどくさいから、gnuのftpからfileutilのソース持ってきてls.cを読んでみろ
が、わからないんですが・・・
詳しく教えていただけないでしょうか?
>>449さん 元>>195なのかな?
私ではないですが、>>195さんを読む限り同じ授業を受けてると思う
内容に感じます。誰だろ??
451デフォルトの名無しさん:2005/10/16(日) 02:20:32
>>450
ftp.gun.orgの/pub/の下のどっかにfileutil-4.xx.xx.tar.gzと言うファイルがある。
それを持ってきて適切な解凍ツールで解凍するとsrcの中にls.cが有るのでそれを見ろ。
大抵のLinuxで使ってるlsはそれだ。
452448ではないが:2005/10/16(日) 02:21:16
>>450
下のをそのまま打ってくれ
ftp ftp.gnu.org
anonymous
cd gnu/fileutils
binary
ls
get fileutils-4.1.tar.gz
bye
tar xzf fileutils-4.1.tar.gz
cd fileutils-4.1/src
less ls.c
453デフォルトの名無しさん:2005/10/16(日) 02:21:52
>>450
ttp://directory.fsf.org/all/fileutils.html
ここからtarball拾ってくるといい


ってかCの授業で環境依存なのを出すのはどうかと思う俺ガイル
454デフォルトの名無しさん:2005/10/16(日) 02:24:48
んー。システムコールを学ばせる講義はいくつか聴いたことがある。
455448:2005/10/16(日) 02:25:00
そういや確認しないでls.cって書いたけどls.cに本体入ってるよね
456デフォルトの名無しさん:2005/10/16(日) 02:28:51
>>452
gzip -dc fileutils-4.1.tar.gz | tar xf -
推奨。システム標準のtarがzオプションに対応しているとは限らない。
同様にlessではなくmore推奨。

なにせ環境Linuxではなく「UNIX」だからな。
コンパイラはgccみたいだけれど。
457デフォルトの名無しさん:2005/10/16(日) 02:29:47
>>429
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/989.txt
>>430,437,443 を元にしたら簡単にできて、後は単純作業。
最初はオモロイかもと思ってたのが良くなかったか。
Cygwin, Linux(Debian), UNIX で動作確認済み。
458450:2005/10/16(日) 02:47:05
453>>さん
なめてんのか?って言われるかも知れませんが、
ttp://directory.fsf.org/all/fileutils.html からtarball拾いましたが
strフォルダのls.cを見ましたが、理解が出来ませんでした。
>>457さんサンプルありがとうございます。
これを元に何とかしてみようと思います。
お手数おかけしました。
ココの住人の皆さん、もし他にもこんなやりかたあるよ、みたいなソースありましたら、
今後unixを勉強する私に色々なコーディングの行い方の知識を
随時UPしていただけないでしょうか?
このC/C++の宿題を片づけます板を元にどんどんC言語の面白さを
もっともっと感じて行きたいです。
ぜひぜひよろしくお願いします。
459デフォルトの名無しさん:2005/10/16(日) 02:49:45
>>458 UNIXを勉強するならUNIX板へ。少なくともこのスレでは勉強になることはごく稀(5スレくらいに1回で多い方)にしかない。
460450:2005/10/16(日) 02:56:47
>>459さん
了解しました。unix板にも行ってみます。
でもこのC/C++の宿題を片づけます板の方々は、
しっかり回答してくれるし、ここが勉強になると思ってたんです。
これからもよろしくお願いします。
461デフォルトの名無しさん:2005/10/16(日) 02:59:17
>>460
スレタイ100回読め。
ここはC/C++の宿題を片づけるスレであって、それ以上でもそれ以下でもないの。
宿題以外の話はスレ違いだから、他のスレや板を当たれ。
462デフォルトの名無しさん:2005/10/16(日) 03:03:07
>>461さん
そうでした・・・
自分の国語力の無さを感じました。
ごめんなさい。
宿題があるときのみ依頼します。
失礼しました。
463デフォルトの名無しさん:2005/10/16(日) 03:59:38 BE:222831656-#
今、プログラミングの勉強をしているのですが、下記のプログラムが実行できません。
何が原因かわからないので原因を教えてください。お願いします。
/*今日の日付を表示する*/
#include<time.h>
#include<stdio.h>

voidput_date(void)
{
time_tcurrent;
struct tm*local;
charwday_name[][3]={"日","月","火","水","木","金","土"};

time(¤t);/*現在の時刻を取得*/
local=localtime(¤t);/*地方時の構造体に変換*/
printf("%4d年%02d月%02日(%s)",local->tm_year+1900/*年*/
,local->tm_mon+1/*月*/
,local->tm_mday/*日*/
,wday_name[local->tm_wday]/*曜日*/
);
}

void main()
{
printf("今日は");
put_date();
printf("です。\n");
}
464デフォルトの名無しさん:2005/10/16(日) 04:06:07
>>463
空白が消えまくっているのがアレだが、「実行できない」ってのは、
具体的にどういう症状なんだ?
コンパイルはできたんだな?
465463:2005/10/16(日) 04:06:27 BE:401096096-#
書き忘れていましたが
[3]環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン:VC++6.0
 [3.3] 言語: どちらでも可
[4] 期限:無期限
です。
466デフォルトの名無しさん:2005/10/16(日) 04:07:13
構造体だけでいーんじゃまいか? * 不要。
467デフォルトの名無しさん:2005/10/16(日) 04:11:36
× %4d年%02d月%02日(%s)

〇 %4d年%02d月%02d日(%s)

だな。それで動くだろ。
468463:2005/10/16(日) 04:13:31 BE:259970257-#
>>464
空白はTabでやってたのでコピーした時に消えてました(;^ω^)
>>467
できました(;^ω^)ありがとうございます。
何回も見直したのに全く気づかなかったorz
469デフォルトの名無しさん:2005/10/16(日) 14:17:29
[1] 授業単元: プログラミング
[2] 問題文: SSDA法を用いてステレオマッチングを行い,左のカメラの画像の全ての点について,
       右のカメラで撮った画像のどの点に対応するかを求め,対応する点の組を出力せよ。
また得られた対応する点をもとに左のカメラの画像の各点の3次元位置を,三角測量の
原理により計算するプログラムを作成せよ。得られた3次元空間中の点の集合の様子を
描画するプログラムを作成せよ.
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: borland C++ 5.5
 [3.3] 言語: C
[4] 期限: [2005年10月24日7:00まで]
[5] その他の制限:pgm形式の画像ファイル。
  よろしくお願いします。
470デフォルトの名無しさん:2005/10/16(日) 14:28:08
>>469
うぁぁ、面倒だ。

画像のサイズの上限は?
認識率と拒否率は?
safety distanceは?
471デフォルトの名無しさん:2005/10/16(日) 14:55:52
>>470
返信ありがとうございます。
画像サイズの上限は1280×960です。
認識率,拒否率,safety distancとはなんのことなのでしょうか?
よろしければ教えていただけないでしょうか?
よろしくお願いします。
472デフォルトの名無しさん:2005/10/16(日) 15:23:00
VIPPER製作2chブラウザ知ってるか?
使い心地、かなりいいぞ。ギコナビ+プニルみたいな感じ

【おっぱい】うはwww2chブラウザつくったwwうぇwww
http://ex11.2ch.net/test/read.cgi/news4vip/1129427490/l50
473デフォルトの名無しさん:2005/10/16(日) 16:00:05
lsに刺激されてWindows版作ってる。まだトラバースしかできんが。
車輪の再開発だろうけど、まあ、ぼちぼちと。
474名無し:2005/10/16(日) 17:36:50
>>235
期限が近いのでよろしくお願いします。
475デフォルトの名無しさん:2005/10/16(日) 18:07:22
>>474
確認だけど,配列を使った LinkedList ってのは (data, next) のペアの配列で
next が次の配列の中のインデックスを保持する,ってやつでいいの?
476デフォルトの名無しさん:2005/10/16(日) 19:16:55
マルチで5日間何をしてたんだ
477名無し:2005/10/16(日) 20:41:20
>>475
実行結果が課題どうりであれば、配列を使っても構造体をつかってもいいと言っていました。
478デフォルトの名無しさん:2005/10/16(日) 20:57:18
>>477
一応問題文どおり配列で作ったけど,かなり ad hoc なコードになっちゃった.
あと,plist の仕様がよくわからなかったのでとりあえず先頭から全部表示しといた.

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/990.c
479名無し:2005/10/16(日) 21:03:22
>>478
ありがとうございます。
明日 早めに学校へ行って実行してみます。
本当に助かりました。
480デフォルトの名無しさん:2005/10/16(日) 21:31:15
>>479
教科書よもーね
481デフォルトの名無しさん:2005/10/17(月) 03:12:41
すでに既出かもしれないんですが教えてください!
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク): ピボット選択付きガウス消去法のプログラムを作り
Ax=bのxを求めなさい。
また、出てきたxの値をつかいb−Axの値をだすプログラムも追加し、
そのプログラムの計算がどれだけ正確かをレポートしなさい。
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: VC 6.0(推奨)何でもいい。
 [3.3] 言語: C++
[4] 期限: [2005年10月19日12:00pmまで]
今、ガウス消去法(ピボット選択付き)のプログラムを作ってます。
大方、出来ていると思うんですが、
テストしたい値が分数になるとエラーが出てしまいます。
また出てきた値xと入力した値A,bの数値の差b−Axを
付け加えたいんですが、どうしてもしたらいいですか?
以下のサイトを主に参考にしてます↓
http://www.fuka.info.waseda.ac.jp/~kozo/suuchi/simple_equation/simple_equation_2.html
482デフォルトの名無しさん:2005/10/17(月) 03:29:13
>>481
まずは原型プログラムをうpしなさい。行列の入力方法とか、どの範囲で
(質問文を見ると分数処理もする必要あるの?)やらなきゃいけないかも分からん。

>どうしてもしたらいいですか?
あと、日本語の勉強もしなさい。
483481:2005/10/17(月) 03:30:01
481の者です。
参照ページ間違えました。
こちらです↓
http://hp.vector.co.jp/authors/VA009453/prog/gauss.htm
484デフォルトの名無しさん:2005/10/17(月) 03:38:52
とりあえず、いままで作った分とか授業で使ったプログラムとかUP。
485481:2005/10/17(月) 03:43:57
>>482
すみません、なぜか焦ってしまいました。
483に載せてある参照ページのプログラムをほぼ使ってあります。
http://hp.vector.co.jp/authors/VA009453/prog/gauss.htm
486481:2005/10/17(月) 03:51:48
<<482
たびたびすみません。
分数処理が必要です。
487デフォルトの名無しさん:2005/10/17(月) 04:09:32
A[][]は破壊されるので、B[][]でも作ってコピーを取っておく。
解はs[]に入っているがローカル変数なので、他からアクセスできない→外にだす。

b-Axの1行目だけ式でかくと
b_1 - A_11 * x_1 + A_12 * x_2 + ... + A_1N * X_N という式。
i行だと
b_i - A_i1 * x_1 + A_i2 * x_2 + ... + A_iN * x_n という式。

上の式のb_iはプログラム上ではB[i][N+1],同様に、A_ijはB[i][j]、x_jはs[j]な。
まあ、そんなんでがんばれ。
488481:2005/10/17(月) 04:13:56
<<487
ありがとうございます。
何度か作ってみたんですがどうしても無限ループになってしまうので
困ってました!
とりあえず、なんとか頑張ってみます
489デフォルトの名無しさん:2005/10/17(月) 12:22:40
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
>>194の続きで
交換が行われたかどうかを判定する変数exchangeを使った
やり方のバブルソートのプログラムを完成せよ
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 2005年10月19日
[5] その他の制限: 無し
よろしくおねがいします
490デフォルトの名無しさん:2005/10/17(月) 13:32:20
>>489
#include <stdio.h>
void print(int * data, int length) {
  int i;
  for (i = 0; i < length; i++) { printf(" %d", data[i]); }
  puts("");
}
void bubble_sort(int * data, int length) {
  int exchange;
  do {
    int i;
    exchange = 0;
    for (i = 0; i < length - 1; i++) {
      if (data[i] > data[i+1]) {
int temp = data[i];
data[i] = data[i+1];
data[i+1] = temp;
exchange = 1;
      }
    }
    // print(data, length); ソート範囲を表示
    length--;
  } while (exchange);
}
int main(void)
{
  int arr[] = { 80, 40, 30, 90, 50, 20, 10, 60 }, length = sizeof(arr)/sizeof(arr[0]);
  printf("before :"), print(arr, length);
  bubble_sort(arr, length);
  printf("after  :"), print(arr, length);
  return 0;
}
491デフォルトの名無しさん:2005/10/17(月) 13:40:11
[1] 授業単元:システム工学特別講義
[2] レポート課題:
(1)ユークリッド平面上に配置された都市を入力とする巡回セールスマン問題に対する以
下の近似解法のプログラムを作成せよ.
(1-1)Nearest Neighbor法
(1-2)Nearest Addition法(最近追加法)
(1-3)Nearest Neighbor法を適用して得られる巡回路を初期解とする2-opt法
(1-4)Nearest Addition法を適用して得られる巡回路を初期解とする2-opt法

(2)(1)で作成したプログラムおよびランダムな巡回路を初期解とする2-opt法(サンプルプ
ログラム)を用意した全ての例題に対して実行し,得られた巡回路の長さおよび実行時間
を比較せよ.
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 2005年10月20日
[5] ・サンプルプログラムを自由に改変してプログラムを作成して構わない.
うわ〜!破滅だ〜!神様!仏様!プログラム板様〜!!
大変忙しい中すみません!なにとぞ よろしくおながいします!
492デフォルトの名無しさん:2005/10/17(月) 13:45:42
あほう。サンプルプログラムをうp。
493デフォルトの名無しさん:2005/10/17(月) 13:50:27
はい!
/* ランダムな巡回路を生成するプログラム */

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#define MAX_CITY_NUM 3000 /* 最大都市数 */

struct point{ /* 都市の座標を格納する構造体 */
double x;
double y;
};

struct point city[MAX_CITY_NUM]; /* 外部変数: 都市の座標を格納する配列 */
int city_num; /* 外部変数: 都市数 */
int tour[MAX_CITY_NUM]; /* 外部変数: 都市の巡回順を格納する配列 */

/* 関数の宣言 */
double distance(int i, int j); /* 都市(i,j)間のユークリッド距離 */
void random_tour(); /* ランダムな巡回路の生成 */


/* メインプログラム */
int main(int argc, char *argv[]){

FILE *input_file, *output_file;
double length;
int i;
double start_time, search_time;
494491:2005/10/17(月) 14:09:07
ここにいるナイスな野郎さん達 助けてくださいまし うぅ
続き/* 引数のチェック */
if(argc <= 1){
fprintf(stderr,"Please input the name of data file!\n");
exit(1);
}

/* 入力データの読み込み */
input_file = fopen(argv[1], "r");
fscanf(input_file,"%d", &city_num);
for(i = 0; i < city_num; i++){
fscanf(input_file,"%lf %lf",&(city[i].x),&(city[i].y));
}
fclose(input_file);

/* 入力データの表示 */
printf("city_num= %d\n",city_num);
for(i = 0; i < city_num; i++){
printf("%4d\t%f\t%f\n",i,city[i].x,city[i].y);
}
495デフォルトの名無しさん:2005/10/17(月) 14:26:42
以下の場合には,評価を不可とする.
・レポート提出期限内にレポートを提出しない
・提出されたレポートが上記の(1)(2)を満たさない
・作成したプログラムが完成していない
・プログラムもしくはレポートが他人のコピーである
・レポートの内容が基準を満たしていない

梅谷センセにここのURLメールすればいいのか。ふむ。
496491:2005/10/17(月) 15:02:34
ぐあぁぁ 見られた〜(爆死)&終了
497デフォルトの名無しさん:2005/10/17(月) 15:32:59
ネタなのかわからんが茶吹いた
498デフォルトの名無しさん:2005/10/17(月) 15:50:49
>>490
ありがとうございます
499デフォルトの名無しさん:2005/10/17(月) 16:28:15
[1] 授業単元:プログラミング

[2] 問題文(含コード&リンク):

半球電鉄の運賃は距離によって決まる(距離と運賃は整数)

距離 運賃
0km以上3km未満 120円
3 5 150
5 8 190
8 13 240
13 19 310
19 30 450
30 50 560
50km以上 670
距離を画面から入力し運賃を求めるプログラムを作成せよ。
また2次配列、while、EOF、foe、を使いなさい。
また結果は4件以上出しなさい。
[3] 環境 
[3.1] OS: Linux  
[3.2] コンパイラ名とバージョン: gcc  
[3.3] 言語: C
[4] 期限: [2005年10月18日まで]
[5] その他の制限:2次配列まで習っています
何ぶん未熟なもので、どなたか宜しくお願いします。
500デフォルトの名無しさん:2005/10/17(月) 16:55:04
>>499
2次配列は2次元配列の書き間違いだよね?
#include <stdio.h>
#include <stdlib.h>

#define foe for
#undef EOF
#define EOF if

int main(void)
{
  int   table[][2] = {{3,120},{5,150},{8,190},{13,240},{19,310},{30,450},{50,560},{0,670}};
  int   i, distance, table_idx;
  foe (i = 0;;) {
    EOF (scanf("%d", &distance) != 1 || distance < 0) {
      EOF (i < 4) {
        scanf("%*[^\n]");
        continue;
      }
      break;
    }

    foe (table_idx = 0; table[table_idx][0]; table_idx++)
      EOF (distance < table[table_idx][0])
        break;

    printf("\\%d\n", table[table_idx][1]);
    i++;
  }
  return 0;
}
501デフォルトの名無しさん:2005/10/17(月) 16:58:17
C言語の宿題で下のプログラムの実行結果を説明しなさい。なんですがポインタ変数を
なにしてるのかがわからないです><教えて下さい><
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
printf("size of char = %d\n", sizeof(char));
printf("size of short int = %d\n", sizeof(short int));
printf("size of int = %d\n", sizeof(int));
printf("size of long int = %d\n\n", sizeof(long int));

printf("size of float = %d\n", sizeof(float));
printf("size of double = %d\n", sizeof(double));
printf("size of long double = %d\n\n", sizeof(long double));

printf("size of char* = %d\n", sizeof(char*));
printf("size of short int* = %d\n", sizeof(short int*));
printf("size of int* = %d\n", sizeof(int*));
printf("size of long int* = %d\n\n", sizeof(long int*));

printf("size of float* = %d\n", sizeof(float*));
printf("size of double* = %d\n", sizeof(double*));
printf("size of long double* = %d\n", sizeof(long double*));
exit(0);
}
-------------------------------
502500:2005/10/17(月) 17:06:19
あ、while使ってないや。
どこかに適当に while(0); って入れといて。
503デフォルトの名無しさん:2005/10/17(月) 17:18:08
>>502
はい、落第ね。
504デフォルトの名無しさん:2005/10/17(月) 17:27:51
>>501
ポインタ変数なんかどこにもありませんがそれはそうと>>1ぐらい読んでスレ違いに気づこうね
505デフォルトの名無しさん:2005/10/17(月) 17:53:04
>>501
マルチされるのも面倒なのでここで答えとく。

sizeof()の意味はわかってるよな?
あと、データ型の勉強もしてるよな?

そのプログラムでは、指定したデータ型のサイズ(バイト単位)を表示してる。
お前がポインタ変数だと思ってるのは、ポインタのデータ型だ。
ポインタのデータ型は、参照する型の種類に関わらず全部同じサイズになる。

だったらあとはプログラム実行して確かめろ。
506デフォルトの名無しさん:2005/10/17(月) 17:59:54
>>499
>  距離を画面から入力し
どうしてもタッチパネルを思い浮かべてしまう。
507デフォルトの名無しさん:2005/10/17(月) 18:38:18
[1] 単元:情報演習
[2] 環境
 [2.1] OS: Linux
 [2.2] コンパイラバージョン: gcc
 [2.3] 言語: C
[3] 期限: 木曜14時
[4] 問題:人数を入力後、その人数分の名前を入力し、それら名前を入力順序と逆順にして出力するプログラムを作成し、実行しなさい。
その際、人数を入力後、人数に応じたメモリ領域を確保してから、名前を入力すること。
また、最後にメモリ領域の開放もすること。
また、メモリ領域の確保は、標準関数であるmallocを使うこと。

以上ですよろしくお願いいたします
508499:2005/10/17(月) 19:11:06
>>500
早々のレスありがとうございます。
、、、、、、、、、、、、、、、、
大変申し訳ないのですが、foe じゃなくえ for でした。
すみませんが499のものを
2次元配列、while、EOF、for、を使ってお願いします。
509デフォルトの名無しさん:2005/10/17(月) 20:37:00
>>507 名前は256文字より短いと仮定.
#include <stdio.h>
#include <stdlib.h>
typedef char string[256];
int main() {
  int i, n;
  string *namelist;
  scanf("%d", &n);
  namelist = (string*)malloc(sizeof(string) * n);
  for (i = 0; i < n; ++i) 
    scanf("%s", namelist[i]);
  for (i = n - 1; i >= 0; --i)
    printf("%s\n", namelist[i]);
  for (i = 0; i < n; ++i) 
    free(namelist[i]);
}
510509:2005/10/17(月) 20:40:04
ごめん最後編集途中だった
× for (i = 0; i < n; ++i) free(namelist[i]);
○ free(namelist);
511デフォルトの名無しさん:2005/10/17(月) 21:28:21
[1] 単元:C言語演習
[2] 環境
 [2.1] OS: windows
 [2.2] コンパイラバージョン: gcc
 [2.3] 言語: C
[3] 期限: 18日17:00
[4] 問題:ttp://49uper.com:8080/html/img-s/89348.zip

以上です、どうかよろしくお願いいたします。
512デフォルトの名無しさん:2005/10/17(月) 21:34:59
皆さん、宿題をやってもらうんだから、sage進行でいきましょうよ。
ちょっと考えたら分かる事。
513デフォルトの名無しさん:2005/10/17(月) 21:42:45
>>511 これは要するに自前で浮動小数点型を作れってことだよね?
514デフォルトの名無しさん:2005/10/17(月) 22:06:49
はい、そうです。
入力した数値に対して、浮動小数点での表記に書き換えるものです。
515デフォルトの名無しさん:2005/10/18(火) 00:20:40
うまくいってないっぽいんだが……
こんなカンジのが出来ればいいのか?
>>491
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/991.zip
516デフォルトの名無しさん:2005/10/18(火) 11:25:04
>>499
問題文とか条件を省略してないか?
その問題だとEOF使う所がないんだが...

>また結果は4件以上出しなさい。
も意味不明。ある距離に対して複数(4件以上)の運賃があるのか?
517デフォルトの名無しさん:2005/10/18(火) 13:36:39
>>516
多分こういうことじゃないか?

int main(int argc, char **argv)
{
 int table[][2] = {{3,120},{5,150},{8,190},{13,240},{19,310},{30,450},{50,560},{0,670}};
 int i=0, distance, table_idx;

 while (i<4) {
  if(scanf("%d", &distance) == EOF || distance < 0) {
   printf("やりなおし。4件以上入力しる\n");
   scanf("%*[^\n]");
   continue;
  }

  for(table_idx = 0; table[table_idx][0]; table_idx++)
   if(distance < table[table_idx][0])
    break;

  printf("\\%d\n", table[table_idx][1]);
  i++;
 }
 return 0;
}
518517:2005/10/18(火) 13:41:29
4回までしか入力できなかった。おれも落第だな。

int main(int argc, char **argv)
{
 int table[][2] = {{3,120},{5,150},{8,190},{13,240},{19,310},{30,450},{50,560},{0,670}};
 int i=0, distance, table_idx;

 while (1) {
  if(scanf("%d", &distance) == EOF || distance < 0) {
   if(i<4) {
    printf("やりなおし。4件以上入力しる\n");
    scanf("%*[^\n]");
    continue;
   }
   break;
  }

  for(table_idx = 0; table[table_idx][0]; table_idx++)
   if(distance < table[table_idx][0])
    break;

  printf("\\%d\n", table[table_idx][1]);
  i++;
 }
 return 0;
}

519デフォルトの名無しさん:2005/10/18(火) 17:19:00
はっきりいってこれじゃあ動かないんです。エラーが出てしまうんですけど
どこが違うんですかね?

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy() のため

#define BUFFER_SIZE 100
#define TABLE_SIZE 10

int main(void)
{
int i, j;
char *buffer[BUFFER_SIZE];
char *table[TABLE_SIZE];

for (i = 0; i < TABLE_SIZE; i++) {
if (fgets(buffer, BUFFER_SIZE, stdin) == EOF) { break;}
table[i] = (char *)malloc(TABLE_SIZE*sizeof(char));
strcpy(*buffer, table[i]);
}
for (j = 0; j < i; j++) {
printf("table[%d]: %s", j, *buffer);
}
exit(0);
}
520デフォルトの名無しさん:2005/10/18(火) 17:21:21
標準入力 (キーボード) から入力された文字列を1行分読み込んで配列 buffer[] に一時的に保存し,その文字列をポインタ配列の各 table[i] (0≦i<TABLE_SIZE) が指すメモリ領域にコピーすることを繰り返す.
途中,EOF (End Of File) が入力されるか,i = TABLE_SIZE - 1 になったら,入力を終了し,ポインタ配列の各 table[i] (0≦i<TABLE_SIZE) が指す文字列を順に出力するプログラム
はっきりいってこれじゃあ動かないんです。エラーが出てしまうんですけど
どこが違うんですかね?
521デフォルトの名無しさん:2005/10/18(火) 17:21:40
なんとなく
strcpy(*buffer, table[i]);
が逆な気がする。
522デフォルトの名無しさん:2005/10/18(火) 17:22:42
519と520は同一人物です。パソコン慣れしてなくて間違えてしまいました。
523デフォルトの名無しさん:2005/10/18(火) 17:23:22
>>519
char *buffer[BUFFER_SIZE];

char buffer[BUFFER_SIZE];

strcpy(*buffer, table[i]);

strcpy(table[i], buffer);

printf("table[%d]: %s", j, *buffer);

printf("table[%d]: %s", j, table[j]);

あと一応freeもしとけ
524デフォルトの名無しさん:2005/10/18(火) 17:30:42
早い返事ありがとうございます。さらになんですが、
if (fgets(buffer, BUFFER_SIZE, stdin) == EOF) { break;}
の文に下のようなエラーが出てしまうんです。。。
2kadai04b.c:15: warning: comparison between pointer and integer
525デフォルトの名無しさん:2005/10/18(火) 17:33:27
>>524
fgetsは失敗するとEOFではなく空ポインタを返すから、
== NULL
にしないと
526デフォルトの名無しさん:2005/10/18(火) 17:34:33
>>519
fgets()の戻り値はEOFにはならない。
sizeof(char)は常に1だから書く必要がない。
exit()は使う必要がない。returnで充分。
527デフォルトの名無しさん:2005/10/18(火) 17:37:59
EOFの入力って0x1Aかどうかを比較するの?
528デフォルトの名無しさん:2005/10/18(火) 17:45:40
EOFと0x1aの間には最早何の関連もありません。
529デフォルトの名無しさん:2005/10/18(火) 17:52:06
へ?そうなの?
530499:2005/10/18(火) 18:05:57
>>516
問題はそっくりそのままです。
4件以上ってのは、ちゃんと作れているか、たしかめるために、
1, 6, 25, 50  などの数字を入力し、出てきた結果を
プログラムの後ろに貼り付けて提出しなさいとうことなので
そのためのものです。
>>517
どうもありがとうございます。助かりました。
531デフォルトの名無しさん:2005/10/18(火) 18:36:02
>>529
EOFやNULLといったマクロ定数の実際の数値は処理系依存
俺はC入門書とK&Rしか読んでないがどっちかに書いてあったぞ
532デフォルトの名無しさん:2005/10/18(火) 18:47:15
>>531
あぁ。そういう意味ですか。了解しました。
533デフォルトの名無しさん:2005/10/18(火) 18:48:04
>>531
そういう問題じゃないから。

>>527
0x1aのコードを持つ制御文字をファイル終端と見なすのはCP/Mだけ。
初期のMS-DOSでは互換性のためにファイル終端と見なすこともあったが、
今では単なる制御文字と見なすのが普通。
標準入力を閉じるのに^zを使うのはその名残だが、0x1aの文字が入力されるわけではない。
534デフォルトの名無しさん:2005/10/18(火) 19:04:31
懸賞プログラムをつくりたいです。

[前提条件]
・ユニークなIDが100個あります
・当選確率は30%

[期待する動作]
・任意のIDを入力すると、当選確率に応じて「当たり」か「外れ」か表示される


[自分で考えたこと]
IDを種とした 0-99 までの乱数を算出して、それが33以下だったら当たり、とか・・・
この程度しか思いつきませんでした。
えらい人教えてください。よろしくお願いします。
535デフォルトの名無しさん:2005/10/18(火) 19:05:38
あ、すみません。
[前提条件]のところを以下のように訂正させてください

×・ユニークなIDが100個あります
○・ユニークなIDがたくさんあります
536デフォルトの名無しさん:2005/10/18(火) 19:14:23
537デフォルトの名無しさん:2005/10/18(火) 19:23:57
>>531
NULLのソースコード上の値は(型は定められていないが)0と決まっている。
538デフォルトの名無しさん:2005/10/18(火) 20:20:34
>>534
ぜんぜん条件が足りない.というかそもそも何がしたいの?懸賞プログラムって何?
とりあえず,同じ ID に対して常に同じ結果が出る必要があるかとか,
入力された全 ID の中の 30% が必ず当選する必要があるかとかは規定してくれんと.
539デフォルトの名無しさん:2005/10/18(火) 21:04:26
VC++ で
#define AX 50000
とやってから
int i = AX;
とやるとAXレジスタの値が入ってしまうんですが、
何とかすることできないでしょうか?
540デフォルトの名無しさん:2005/10/18(火) 21:12:43
[1] 授業単元:プログラミング言語
[2] 問題文:@ 1からnまでの自然数の総和は、最初のn-1個の数を加算し、その合計を最後の数nを加えることによっても計算できる。
この方法を使って、1からnまでの総和を計算するアルゴリズムを再帰的に設計し、そのプログラムを書け。
A フィボナッチ数と呼ばれる数列の第n項は、第n-1項と第n-2を足して得られる。
したがって、第1項、第2項とも1の場合のフィボナッチ数は、1,1,2,3,5,8,13,21,34,・・・となる。
このとき、数Nをコマンドライン上から読み込み、第N項までのフィボナッチ数列を出力する再帰アルゴリズムと、そのプログラムを書け。
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: 不明
 [3.3] 言語: C
[4] 期限: [2005年10月28日15:00まで]

以上です。
541デフォルトの名無しさん:2005/10/18(火) 21:53:17
//\
>>540 適当
#include <stdio.h>
int sum(int n){
return (n > 1) ? sum(n - 1) + n : 1;
}
int main(){
int n;
printf("n?>");
scanf("%d", &n);
printf("sum(1:%d) = %d\n", n, sum(n));
return 0;
}

#include <stdio.h>
int fibonacci(int n){
//printf("%d ", n);
return (n > 2) ? fibonacci(n - 1) + fibonacci(n - 2) : 1;
}
int main(){
int i, n;
printf("n?>");
scanf("%d", &n);
for(i = 1; i <= n; i++){
printf("%d ", fibonacci(i));
}
printf("\n");
return 0;
}
542デフォルトの名無しさん:2005/10/18(火) 22:31:56
>>539
(´・ω・`)?
543デフォルトの名無しさん:2005/10/18(火) 23:06:19
>>539
BX レジスタの値とか、一通りレジスタの値の取得法をまとめれば
雑誌の記事とかになるんじゃないかな?
まああんまりお金になりそうにはないけど。
544デフォルトの名無しさん:2005/10/19(水) 00:00:21
>410〜415
お返事遅くなってすみません。
ありがとうございました、助かりました!
545539:2005/10/19(水) 00:30:58
>>543
本来であればdefineされた値になっていてほしいのに、
レジスタと同じ名前の識別子が
レジスタの値が入る変数のように振舞うので困っているのです。
コンパイルオプションとかで設定できるのでしょうか?
546デフォルトの名無しさん:2005/10/19(水) 00:48:06
547デフォルトの名無しさん:2005/10/19(水) 01:36:19


【質問テンプレ】
[1] 授業単元: すべてリンク先にありますです。。
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS: UNIX
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C

[5] その他の制限: http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/992.txt
548デフォルトの名無しさん:2005/10/19(水) 02:04:29
C++で作ったPGMですが、
\\netdrv\test\work\sample.txt

をReadさせようとすると、何故か作業フォルダ配下の
\netdrv\test\work\sample.txt
をReadしようとしてしまうんですが・・・

これは何故??
549デフォルトの名無しさん:2005/10/19(水) 02:12:11
エスケープシーケンスじゃねの?
550デフォルトの名無しさん:2005/10/19(水) 02:40:52
>それと@のソート結果が正しいかどうかチェックするプログラム
[昇順チェック]
for(先頭から今見ている香具師が、一つ前より大の間繰り返し)
 ;
最後まで逝ってれば正しい


降順の場合は一つ前より小か、で
551デフォルトの名無しさん:2005/10/19(水) 02:51:14
[1] 授業単元: プログラミング言語
[2] 問題文: XYZの三次元座標上でランダムに座標(0,0,0)からの距離が平均値1となる座標
を決定するプログラムを作成せよ。ただしX方向とYZ方向で2:1の楕円状の確率依存性を持つも
のとする。

[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン:
 [3.3] 言語: C 不明
[4] 期限: [2005年10月24日まで]
[5] その他の制限:乱数の生成には逆関数を使うらしい

お願いします
552デフォルトの名無しさん:2005/10/19(水) 02:57:38
>>547
>>132>>139からもらったものはとうしたの?
「まるっきり分りません」とか「よくわからない」とか言われても
聞いてる方はもっと分らない。
日本語も分らない奴として放置させてもらいますが、よろしいか?
553デフォルトの名無しさん:2005/10/19(水) 04:05:36
>>511のスルーはなぜ?
554デフォルトの名無しさん:2005/10/19(水) 07:27:14
正直、忘れてました
555491:2005/10/19(水) 10:33:26
>>491です。
>>495さんがイナイ間にヒントだけでも〜 ってかヒントならOKそうなので
最初にどこから手をつければよいのやら…
556デフォルトの名無しさん:2005/10/19(水) 11:00:05
[1] 授業単元:プログラミングU
[2] 問題文:
C言語でガウスの消去法で連立一次方程式を解くプログラム(LU分解・コレスキー分解なし)
を作成せよ。

[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:10/20まで
[5] その他の制限:特に無し

どなたかご教授お願いします。
557デフォルトの名無しさん:2005/10/19(水) 11:02:26
558491:2005/10/19(水) 11:19:32
ああっ すいません見落としてました!
メシアよ!これです これこれ 超これなんです!
559デフォルトの名無しさん:2005/10/19(水) 12:13:20
チョーコレ イト?
560デフォルトの名無しさん:2005/10/19(水) 13:04:11
561デフォルトの名無しさん:2005/10/19(水) 13:11:53
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
二問あります
@二つの整数を受け取って和をとる関数を定義し、main関数から
二つの整数データを渡し、結果を返してもらいmainで印刷するプログラムを書け。

A二つの整数の値をいれかえる関数swapを定義し、main関数から
二つの整数データを渡し、main関数のデータを入れ替えて印刷するプログラムを書け。
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 2005年10月21日
[5] その他の制限: プロっぽいソースプログラムじゃない物でお願いします。
562556:2005/10/19(水) 13:25:43
>560
すげー、ありがとうございます。
自分でも色々探してみたんですが、
これほどわかりやすいプログラムは見つかりませんでした。
563デフォルトの名無しさん:2005/10/19(水) 13:26:51
>>561
素人っぽさが足りなければ自分で変更して
@
#include <stdio.h>
int sum( int a, int b ){ return a+b; }
int main( int ac, char **av ){ printf( "%d", sum( 1, 2 ) ); return 0; }
A
#include <stdio.h>
void swap( int *a, int *b ){ int work; work = *a; *a = *b; *b = work; }
int main( int ac, char **av ){ int a = 3; int b=4; swap( &a, &b ); printf( "%d %d", a, b ); return 0; }
564デフォルトの名無しさん:2005/10/19(水) 13:48:52
>>563
この三行だけでいいんですか?
なんか結果が表示されないんです
565デフォルトの名無しさん:2005/10/19(水) 14:01:02
>>564
お前今までの授業でどうやって結果見てたんだよ
566デフォルトの名無しさん:2005/10/19(水) 14:03:43
頭の中で思い浮かべてました
567デフォルトの名無しさん:2005/10/19(水) 14:05:12
>>565
コンパイルして./a.outでやったけど見れなかったです
568デフォルトの名無しさん:2005/10/19(水) 14:05:38
>>566
じゃあ今回もそれでいいじゃん(*^ー゚)b
569568:2005/10/19(水) 14:06:21
しまったやってしまった
570デフォルトの名無しさん:2005/10/19(水) 14:08:09
>>567
a.out.exeなんてファイル名、ふつうつけるか?
571デフォルトの名無しさん:2005/10/19(水) 14:20:33
>>570
a.outはファイル名じゃなくて実行のコマンドです
いつもはできるのにやっぱりできませんでした
572デフォルトの名無しさん:2005/10/19(水) 14:47:13
a.outはlinux+gccの時のデフォだろ
573568:2005/10/19(水) 14:52:54
>>571
例えUNIXであろうとa.outはgccでコンパイルした結果出来上がるファイル名だ
>>570のは,今回の課題はWindowsでは実行ファイルは拡張子exeを付ける事になってることを踏まえての発言(だろう)
君にはプログラミング以前の基本的知識が欠如してる気がする
574デフォルトの名無しさん:2005/10/19(水) 14:55:22
名前消し忘れた
なんかもうボロボロ
575デフォルトの名無しさん:2005/10/19(水) 15:00:07
あああ、OS間違えましたUNIXです
もしかしてOSが違うと>>563のプログラムが実行できないんですか
576573:2005/10/19(水) 15:03:25
しかも途中で修正したから日本語もおかしくなってfだふぁががhgdq
577デフォルトの名無しさん:2005/10/19(水) 15:29:43
[1] 授業単元:プログラミング
[2] 問題文:
http://www.cda.ics.saitama-u.ac.jp/~ikuko/ProgIntro/14/meibo.txt
ここにあるNameFileのアルファベット氏名を使って,
一行分のデータ(ユーザーID、漢字氏名、アルファベッド氏名等)読み込み、
各個人データをメモリ内で二分木を一旦作成して,
それから,アルファベット順に名前データを表示するプログラムを作って下さい.
strcasesmp() を使用すること。
ヒントとしてscanfの使い方が与えられてます↓
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/994.txt
[3] 環境
 [3.1] Windows/Linux
 [3.2] gcc
 [3.3] 言語: C
[4] 期限: 3日以内
578デフォルトの名無しさん:2005/10/19(水) 15:39:05
NameFileの中身はソート済みのようだから、普通に二分木を作るとバランスされないような気がするのだが。
579デフォルトの名無しさん:2005/10/19(水) 15:51:41
>>575 563が動かなかったら、それはプログラムの問題ではないので、おまえの近くの人に聞くことをお勧め。
580デフォルトの名無しさん:2005/10/19(水) 15:52:19
>>577
ヒープソートでもやりたいのか?
ってかstrcasesmpって何よ?当然manでも何も出てこないし、ググってもそれらしいの無いが
581デフォルトの名無しさん:2005/10/19(水) 15:59:09
strcasecmp()だろ、それぐらい察してやれ
まあ非標準関数だがな
582デフォルトの名無しさん:2005/10/19(水) 16:57:47
大久保界隈の電子専門学校の生徒がうじゃうじゃいそうなスレだね。。。
心当たる人は手を挙げて。
583デフォルトの名無しさん:2005/10/19(水) 17:55:19
>>577
50音順に並んでるものをアルファベット順に出力でいいんだろ?
scanf()のところかなり適当だが、うpしといた。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/995.txt
584デフォルトの名無しさん:2005/10/19(水) 17:56:23
>>582 ノシ。30年前、そうでした
585577:2005/10/19(水) 17:57:03
スミマセンm(__;)m strcasecmpの間違いです

>>578
ファイルの中はあいうえお順なので、それをアルファベッド順に表示したいのです
03TI001 阿部 恒彦 j0301at Abe Tsunehiko
03TI002 荒牧 孝洋 j0302at Aramaki Takahiro
03TI011 江田 慎太郎 j0311es Eda Shintarou
という風に

586デフォルトの名無しさん:2005/10/19(水) 17:58:58
高田馬場も大久保界隈に入るのかな?もしそうならノシ
587デフォルトの名無しさん:2005/10/19(水) 18:04:16
しりとりゲームを作りたいです。

ルールは普通のしりとりと同じ。同じワードは使えない、最後に"ん"がついたらいけない
英単語は不可等。

まず最初は自分が入力をし、その後コンピュータ側が持っている
テキスト(辞書ファイル)の中からユーザーが入力した言葉に続く文字を見つけて出力、
その後またユーザーの入力→コンピュータ側がファイルを読み込んで出力の繰り返し。
ユーザーが入力した単語の中でファイルの中に無い単語の場合、学習(ファイルに登録)させる。
仮にファイルの中身が1Mあったとして、1M全て読み切ったらユーザーの勝ち。
勿論学習機能があるのでファイルの容量はいつまでも増え続ける。

がんばってくださーい
588デフォルトの名無しさん:2005/10/19(水) 18:06:02
>>587
その仕様じゃ、ユーザーはありもしない単語延々と並べるだけで絶対負けないじゃないか。
っていうかスレ違い。
589デフォルトの名無しさん:2005/10/19(水) 18:12:01
つーか、トリビアのネタだし。
590デフォルトの名無しさん:2005/10/19(水) 18:15:47
>>587
スレどころか板も違う気がする。

>>589
トリビアのネタって?
591デフォルトの名無しさん:2005/10/19(水) 18:19:40
>>590
タモリが出てるトリビアの泉ってTV番組、知らない?
592デフォルトの名無しさん:2005/10/19(水) 18:21:07
587の内容がトリビアとどう関係があるんだ?ってことだろ
593デフォルトの名無しさん:2005/10/19(水) 18:22:23
>>591
番組は知ってるけど>>587のしりとりプログラムがどうしてトリビアなのかな、と。
594デフォルトの名無しさん:2005/10/19(水) 18:28:22
595デフォルトの名無しさん:2005/10/19(水) 18:31:12
しりとりを解くのは実は高度な数学でしたって話
596デフォルトの名無しさん:2005/10/19(水) 18:35:11
コマンドラインから与えられた引数を文字列と見て,各引数の出現する順番はそのままで,文字の並びを左右逆にして
表示するプログラムを作りたいんですけど、2次元配列を使ってはいけないんです。strlen関数を使ったら
どうなりますか?説明つきで教えて下さい。m(_ _)m
597587:2005/10/19(水) 18:44:33
C言語でこういう宿題が出たけどいいアルゴリズム(COM)が思い浮かばないから
ヤッテクレと言った
宿題スレで聞いてはいけないならどのスレなんだ?
598デフォルトの名無しさん:2005/10/19(水) 18:49:12
>>597
>>1よめ
599デフォルトの名無しさん:2005/10/19(水) 18:53:58
>>597
そんな問題設定じゃアルゴリズムなんてねーだろ.どうせプレイヤー側が 588 の手順で 100% 勝つ.
600587:2005/10/19(水) 18:57:14
588の仕様でいいんでつ
601デフォルトの名無しさん:2005/10/19(水) 18:58:54
602デフォルトの名無しさん:2005/10/19(水) 18:59:58
ひらがな限定なら同音異語でもアウトだな。
603デフォルトの名無しさん:2005/10/19(水) 19:04:12
コマンドラインから与えられた引数を文字列と見て,各引数の出現する順番はそのままで,文字の並びを左右逆にして
表示するプログラムを作りたいんですけど、2次元配列を使ってはいけないんです。strlen関数を使ったら
どうなりますか?説明つきで教えて下さい。m(_ _)mお願いします。
604デフォルトの名無しさん:2005/10/19(水) 19:04:56
断る。
605デフォルトの名無しさん:2005/10/19(水) 19:05:28
>>596 コマンドライン引数が char の二次元配列に入る以上原理的に不可能のような
606デフォルトの名無しさん:2005/10/19(水) 19:05:33
コマンドラインから与えられた引数を文字列と見て,各引数の出現する順番はそのままで,文字の並びを左右逆にして
表示するプログラムを作りたいんですけど、2次元配列を使ってはいけないんです。strlen関数を使ったら
どうなりますか?説明つきで教えて下さい。m(_ _)mお願いします。
ちなみにこれが実行例です。
% ./kadai04c ← コマンドライン引数が 0 個の時の例
%
% ./kadai04c abc ← コマンドライン引数が 1 個の時の例
cba
% ./kadai04c abc 12345 QWERTY ← コマンドライン引数が 3 個の時の例
cba
54321
YTREWQ
%
607デフォルトの名無しさん:2005/10/19(水) 19:07:43
今日は馬鹿が集まる日なのか?
608デフォルトの名無しさん:2005/10/19(水) 19:12:09
>>606
int main(int argc, char* argv[]){
この時点で         ↑で二次元配列を使ってるんだけど(w

609デフォルトの名無しさん:2005/10/19(水) 19:13:10
>>606 そこだけ二次元配列使うのを許すならこんなもんか。
#include <stdio.h>
void moin(char *p) { if (*p != '\0') moin(p+1), putchar(*p); }
int main(int argc, char **argv) { if (argc > 0) main(argc-1, argv), moin(argv[argc-1]), putchar('\n'); }
610デフォルトの名無しさん:2005/10/19(水) 20:25:20
[1]授業単元:オブジェクト指向言語
[2]問題文:3人のテストの点数、合計値、平均点を2次元配列を利用して表示するプログラムを作成しなさい。
      実行結果
      A : 70 80 75 60 : sum = 285, ave = 71.25
B : 75 83 70 70 : sum = 298, ave = 74.50
      C : 60 76 70 55 : sum = 261, ave = 62.25
[3]環境
[3.1]OS:Linux
[3.2]コンパイラ名とバージョン:
[3.3]言語:C言語
[4]期限:10月20日午前9時まで
[5]その他の制限:なし

先月からC言語を学び始めたのですがいきずまってしまい、何卒よろしくおねがいします。
611デフォルトの名無しさん:2005/10/19(水) 20:41:09
オブジェクト指向言語の授業なのにCなのか
612デフォルトの名無しさん:2005/10/19(水) 20:45:43
>>611
Cでオブジェクト指向しなきゃいけないんじゃない?
613デフォルトの名無しさん:2005/10/19(水) 20:53:53
よしObjective-Cの出番だ
614デフォルトの名無しさん:2005/10/19(水) 21:01:11
C言語って、テキストファイル1行づつ読み込んで
全く同じようなかんじでテキストファイルってつくれたっけ?
ファイルのコピーじゃなくて。。

何がやりたいかって言うと、
テキストファイルの上15行が文字列で
16行目がブランク
17行目から300万行くらいが数字配列(300万行、3列)
なんだけど、ほしいのはその300万行の数列、
1〜16行を排除したい。
ただ、データが膨大で普通のエディタでは開けなくて、
そこだけ手動で消すことができない。
そこで、プログラムでなんとかしようかと思ってるのだけど。
ちなみにもとはCSVファイルだったんだけど、
テキストならと思ってコピペでテキストファイルSCV
両方用意しとります。

もし、できるなら100行づつの3つのファイルになってもかまいません。
よろしくお願いします。


615デフォルトの名無しさん:2005/10/19(水) 21:01:52
>>610
Cで書いてみたけど手続き指向になってしまった。
誰かオブジェクト指向版を頼む。

#include<stdio.h>
int main(void){
    int score[][4]={ {70,80,75,60,},{75,83,70,70,},{60,76,70,55,}, };
    char name[][2] = { "A","B","C", };
    int i,j,sum;
    double ave;
    for(i=0;i<3;++i){
        printf("%s :",name[i]);
        for(j=0,sum=0;j<4;sum+=score[i][j],++j) printf(" %d",score[i][j]);
        ave = sum / 4.0;
        printf(" : sum = %d, ave = %2.2f\n",sum,ave);
    }
    return 0;
}
616デフォルトの名無しさん:2005/10/19(水) 21:09:30
>>614 getline で1行読めるので
for (int i = 0; i < 16; ++i) { 1行読み込む; }
for (int i = 16; i < 300万; ++i) { 1行読み込む; 読んだ行を出力; }
これでわからんようなら >>1 参照
617デフォルトの名無しさん:2005/10/19(水) 22:38:22
>>614
悪いこと言わんから
http://pc8.2ch.net/test/read.cgi/tech/1023556171/
ここ行って聞きなさい。
618デフォルトの名無しさん:2005/10/19(水) 23:16:46
>>615
この問題、点数を二次元配列でもったら、オブジェクト指向のしようがない気がする。
619デフォルトの名無しさん:2005/10/19(水) 23:20:14
OOPとしてするなら得点を属性として持ち、合計・平均を派生属性として持つ
人クラスを作って、そのインスタンスの要素数3の配列作るのが妥当か・・・?
620デフォルトの名無しさん:2005/10/19(水) 23:27:11
んー、まずはオブジェクト指向を考えないプログラムを作成させて
その後そのコードをオブジェクト指向に書き換えさせるって方針なんじゃない?
だから多分後で>>615のプログラムをオブジェクト指向を用いて作成せよってのをやると思うよ。
まあ勝手な憶測でしかないんだけど。
うちの学校はオブジェクト指向の授業が無いから羨ましい。
621デフォルトの名無しさん:2005/10/19(水) 23:32:23
>>620
それ恐ろしく効率悪いというか意味無いだろ
あくまでOOPは分析・設計レベルから実装までの一貫した流れな訳で
一旦手続き指向で実装した物をオブジェクト指向で実装し直すとか意味ナサス

つ憂鬱なプログラマのためのオブジェクト指向
622デフォルトの名無しさん:2005/10/19(水) 23:39:55
とくにあんな単純なデータ処理をわざわざ OO 的に書きなおさせたら,OO 面倒としか思えなくなりそうだ.
623デフォルトの名無しさん:2005/10/19(水) 23:50:21
オブジェクト指向ってのがよくわからないが適当にやってみた
#include <stdio.h>
struct Student {
char name[2];
int score[4];
};

int Sum(struct Student s) {
return s.score[0] + s.score[1] + s.score[2] + s.score[3];
}

double Ave(struct Student s) {
return Sum(s) / 4.0;
}

void main() {
struct Student s[3] = {{"A", 70, 80, 75, 60}, {"B", 75, 83, 70, 70}, {"C", 60, 76, 70, 55}};
char* format = "%s : %d %d %d %d : sum = %d, ave = %.2f\n";
char dimArray[3][128]; // 二次元配列!
int i;

for (i = 0; i < 3; i++) {
sprintf(dimArray[i], format, s.name, s.score[0], s.score[1], s.score[2], s.score[3], Sum(s), Ave(s));
}

for (i = 0; i < 3; i++) {
printf("%s", dimArray[i]);
}
}
624デフォルトの名無しさん:2005/10/19(水) 23:55:43
>>623
題意を満たすために二次元配列を強引に入れてるのにワロタw
625デフォルトの名無しさん:2005/10/20(木) 00:06:07
>>491 見てる? 面白そうな問題だから、やってみたい。
問題文とか解説ってWeb上にあるなら、URL晒してくれ。
626デフォルトの名無しさん:2005/10/20(木) 00:12:50
>>625
491じゃないけど、梅谷センセから検索すると、
ttp://www.se.uec.ac.jp/lab/yura-lab/umetani/lecture.html
ttp://www.se.uec.ac.jp/lab/yura-lab/umetani/nanzan2005/report2005.txt
あたりでしょう。
627デフォルトの名無しさん:2005/10/20(木) 00:25:59
>>626 サンキュ。
締め切りから察するにこっちかな・・・
ttp://www.se.uec.ac.jp/lab/yura-lab/umetani/uec2005

ぼちぼち、アルゴリズムから理解していきます。
628デフォルトの名無しさん:2005/10/20(木) 02:22:16
[1] 授業単元: 卒研
[2] 問題文:0〜1の擬似乱数を30000個ずつ3行発生させ、その平均と分散を求めるプログラムを作成せよ。
[3] 環境
 [3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン: Fujitsu Fortran&C Academic Package V2.1
 [3.3] 言語: C言語
[4] 期限:2005年10月25日
[5] その他の制限:なし

別スレからの誘導で来ました。マルチと呼ばないでください…orz
629628:2005/10/20(木) 02:22:55
一応、「1〜100の擬似乱数を10個ずつ10行発生」というプログラムは作れたので、それを書き換えたらできるかな?と思ったんですが、
どうもうまくいかなくて、どこをどう書き換えたらいいのかわかりません…。
それとも、書き換えるのでは駄目なんでしょうか??

これがそのプログラムです…
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int main(void)
{
int i,j;

/* 乱数系列の変更 */
srand((unsigned) time(NULL));

/* 1〜100の擬似乱数を10個ずつ10行発生 */
for (i=1; i<=10; i++) {
for (j=0; j<10; j++) {
printf("%3d ",rand()%100+1);
}
printf("\n");
}
return 0;
}
すみませんが、卒業かかってるので本当によろしくお願いします…。
630デフォルトの名無しさん:2005/10/20(木) 02:27:21
おーい0〜1って、
(0,1)
[0,1]
(0,1]
[0,1)
のどれだ?
631デフォルトの名無しさん:2005/10/20(木) 02:45:06
だれかホントお願いします。アセンブラ?らしいんですけど・・・

[8050h] ← [8051h] + [8052h] を計算し、符号付2進数加算としてのオーバーフローを判定する。
(オーバーフローのとき Cy ← 1、オーバーフローでないとき Cy ← 0 とする)
オーバーフローの判定方法を付け加えること。
632デフォルトの名無しさん:2005/10/20(木) 02:56:05
>>631
できればスレタイを65535回ほど読んで欲しいかなー
633628:2005/10/20(木) 03:35:25
>>630様 すいません、
(0,1)
[0,1]
(0,1]
[0,1)
の違いがわかりません…。発生させたいのは、0.ナニナニの小数です…
634デフォルトの名無しさん:2005/10/20(木) 03:45:57
630じゃないけどさ、
上から順に
0.0 < x < 1.0
0.0 ≦ x ≦ 1.0
0.0 < x ≦ 1.0
0.0 ≦ x < 1.0
ようするに境界を含むかどうか

ところでそれが卒研なのか?
635628:2005/10/20(木) 03:57:18
>>634様 ありがとうございます!!えーと、(0,1)です!!

…はい、コレを卒研で使うんですけど、もう全然ムリポで…。
私、建設学科なのに…orz
636デフォルトの名無しさん:2005/10/20(木) 04:55:44
>>635
printf("%f ", (1.0 / (RAND_MAX + 1.0)) * (rand() + 0.5));

『C言語による最新アルゴリズム辞典』の乱数の項を参考にした。
この方法は0や1にならない。

637デフォルトの名無しさん:2005/10/20(木) 07:22:03 BE:222831465-#
argcとargv[]の使い方を教えてください!
いろんなサイト見てみたけどわけわかめです。
サイトに載ってたのには実行画面にC:\があるんですが、
実行してもこれが出ません。どうすれば出るんでしょうか?
ちなみにコマンドプロンプト起動したらC:\Documents and Settings\名前>
が出てこっちでもできません。
環境:OS:XP、コンパイラ:VCです。
期限:出来れば8:40までに・・・
638637:2005/10/20(木) 07:25:18 BE:401096669-#
訂正:コンパイラ:VC++6.0です
639628:2005/10/20(木) 07:29:03
>>636様 ありがとうございます!!遅くにありがとうございましたm(_ _)m゛
とりあえず学校行ってきます!!
640デフォルトの名無しさん:2005/10/20(木) 07:30:08
C:\Documents and Settings\名前>C:
641637:2005/10/20(木) 07:40:01 BE:415951878-#
>>640
すいません、くわしく教えてもらえないでしょうか(;^ω^)
コマンドプロンプト使ったことないもんで・・・
642デフォルトの名無しさん:2005/10/20(木) 07:42:35
643637:2005/10/20(木) 07:57:28 BE:200547893-#
何とかC:\>に直す方法は見つかりました
でも結局コマンドラインから入力できないorz
ちょっとコードのミスを探してきます。
644デフォルトの名無しさん:2005/10/20(木) 08:02:28
>>628
脳内コンパイルで妥当かどうかもチェックしてません。

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(void)
{
    int i,j;
    double v,sum,/*合計*/var,/*分散*/ave;/*平均*/
    /* 乱数系列の変更 */
    srand((unsigned) time(NULL));
    /* 0〜1の擬似乱数を30000個ずつ3行発生 */
    for (i=0; i<3; i++) {
        for (j=0,sum=0,var=0; j<30000; j++){
            v = (rand()+0.5)/(RAND_MAX+1.0);
            sum += v;
            var += v*v;
        }
        ave = sum / 30000;
        var = var / 30000 - ave*ave;
        
        printf("%f %f\n",ave,var);
    }
    return 0;
}
645デフォルトの名無しさん:2005/10/20(木) 09:26:02
>>547
@で作ったのを利用して他のをやっていきたいんですが、それにその都度乱数の量を指定できないので・・・
起動に./ファイル 1000 などのような感じでやっていきたいのですが・・・うまく説明できなくてごめんなさい。
646デフォルトの名無しさん:2005/10/20(木) 11:00:53
>>645
お前うちの大学だな。金曜の演習の課題か。

printf("データの個数を入力\n");
scanf("%d", &n);
を消して
n = atoi(argv[2]);
ってコードを追加してみろ。
./コマンド名 出力ファイル名 1000 とか入れればその数だけ乱数が生成される。
ちなみにatoiは引数の文字列をint型に変換する関数だ。あとは自分で調べろ。
647デフォルトの名無しさん:2005/10/20(木) 12:17:52
友達に聞いてもわからないと言っていたので
どなたか>>563のプログラムを完成させてください。
648デフォルトの名無しさん:2005/10/20(木) 12:25:15
>>563のプログラムは完成しているように見えるが
649デフォルトの名無しさん:2005/10/20(木) 12:29:06
どなたか>>577のプログラムコードお願いしますm(__)m
650デフォルトの名無しさん:2005/10/20(木) 12:53:19
>>583じゃ駄目なの?どんなコードか見てないけど
651デフォルトの名無しさん:2005/10/20(木) 13:10:38
あ、スイマセン、>>583に気づきませんでした
ところでコンパイルすると
警告 W8060 6k.c 29: おそらく不正な代入(関数 bin_tree_add )
こんなのが出るんですけど無視して良いんですかね? 実行はちゃんとできました
652デフォルトの名無しさん:2005/10/20(木) 13:35:08

○○社で大規模爆発事故
原因は面接に来た学生のイオナズン

3月1日午後、○○社(東京中央区)で大規模な爆発事故が発生し、
社員ら約300名が100以上のダメージの大怪我を負った。死者はいない模様。
原因は面接に来た学生が唱えたイオナズンと見られている。
「イオナズンを使うぞ」「使えるものなら使ってみろ」といった押し問答の後、
逆上した学生がイオナズンを唱えたという。
「どうせMPが足りないと思っていた。まさか本当に使うとは」
(面接を担当した○○社の社員)
「最近の若者はすぐにキレやすいし、MPも10年前に比べると
格段に増えている。マホカンタやマホトーンなど自分で自分を
守らないといけない」と関東学院大学牛島助教授(呪文心理学)は警告する。
関連記事 社会面
     経済面
653507:2005/10/20(木) 13:45:26
509さん早いレスありがとうございました。
助かりました。

ところで私のPCでそのプログラムを実行したところ、
結果が

bash-2.05b$ gcc src10-20.c
bash-2.05b$ ./a.out
3
kido
sato
ito


このようになったのですが、これはどこに問題があるのでしょうか?
654デフォルトの名無しさん:2005/10/20(木) 13:55:02
ハミング距離を求めるプログラムを作ってできあがったのですが。
タイマーつけました。
しかしさらにこれに何かオプション的なものをつけろと言われたのですが。
何かいい案ありませんか?

Windows C++ 特に制限はありません。
655デフォルトの名無しさん:2005/10/20(木) 13:58:13
自爆装置でもつけたらいい
656デフォルトの名無しさん:2005/10/20(木) 14:37:28
そんなプログラムしらんめぇ
657491:2005/10/20(木) 15:08:26
>>515のプログラムがない!ないない!図しかない!!うあぁぁ 破滅だ!
658デフォルトの名無しさん:2005/10/20(木) 15:34:21
[1] 授業単元: プログラミング演習
[2] 組み合わせの数nCmを求める関数を作成し,この関数が正しく計算できることを調べるmain関数も作成せよ.
   ここで,nとmは入力によって求めることとし,組み合わせの数nCmを求める関数は次のようだとする.
   int combi(int n, int m);
[3] 環境
 [3.1] OS: Redhat Linux
 [3.2] gcc ver?
 [3.3] C
[4] 21日(明日)の正午
[5] ポインタは未だ習っていません



659デフォルトの名無しさん:2005/10/20(木) 15:52:55
>>658
#include<stdio.h>

int combin(int n,int m){
if(n==m || m==0)return(1);
return(combin(n-1,m-1)+combin(n-1,m));
}

int main(void){
int i,j;
for(i=1;i<=10;i++){
for(j=0;j<=i;j++){
printf("%dC%d = %d\n",i,j,combin(i,j));
}
}
}
660デフォルトの名無しさん:2005/10/20(木) 16:54:57
#include<stdio.h>

int combi(int n, int m);

int combi(int n, int m)
{
int i,s;
if(n<m||n<1)
return 0;
else if((n>=1&&m==0)||n==m)
return 1;
else
{
for(i=0,s=1;i<m;i++)
s *= (n-i);
for(;m>1;m--)
s /= m;
return s;
}
}

int main(void)
{
int n,m;
printf("n=");
scanf("%d",&n);
printf("m=");
scanf("%d",&m);
printf("%dC%d = %d\n",n,m,combi(n,m));

return 0;
}
661デフォルトの名無しさん:2005/10/20(木) 17:00:39
if (m > 0)
return ((n/m)*combi(n-1, m-1));
else return 1;
ってやったらだめだったんだけど何でかね?
662デフォルトの名無しさん:2005/10/20(木) 17:35:05
>>661 n/m = 0 (m > n)
663デフォルトの名無しさん:2005/10/20(木) 17:40:46
>>660 毎回 gcd でも取ってやらんと十分計算できるはずの数が計算できなくなるぞ
664デフォルトの名無しさん:2005/10/20(木) 18:28:49
>>510はスルーだな、俺は作れるけどこの板の住人では無理なのか。
今から作るしちょっと待ってろ。
665デフォルトの名無しさん:2005/10/20(木) 18:49:10
666デフォルトの名無しさん:2005/10/20(木) 18:51:33
なんで誰も>>659を構ってあげないの?
667デフォルトの名無しさん:2005/10/20(木) 18:54:45
>>666 659? 指数オーダのアルゴリズムだけど簡単にメモ化できるので大して問題無いと思うが
668664:2005/10/20(木) 19:08:39
>>511だった、すまん。
669デフォルトの名無しさん:2005/10/20(木) 19:10:06
>>644
>  var += v*v;
ここって
vat += (v-ave)*(v-ave)
じゃなかったっけ。
結局2パス必要になると思う
670デフォルトの名無しさん:2005/10/20(木) 19:14:20
標準分散は(1/n)*Σ(x-x~)^2
671デフォルトの名無しさん:2005/10/20(木) 19:23:04
>>669-670
(1/n) (x - x~)^2
= (1/n) x^2 − (x~)^2

だから、
var += v * v;
した後に、
var = var / n - ave * ave;
で分散になる。
672デフォルトの名無しさん:2005/10/20(木) 19:44:10
1 2 3という数値で計算してみよう
データ数nは3、平均x~は2。

(1/n) (x - x~)^2
= (1/3) { (1 - 2) ^ 2 + (2 - 2) ^ 2 + (3 - 2) ^ 2) }
= (1/3) { 1 ^ 2 + 0 ^ 2 + 1 ^ 2 }
= (1/3) (1 + 1) = 2/3

(1/n) x^2 − (x~)^2
= (1/3) (1 ^ 2 + 2 ^ 2 + 3 ^ 2) - 2 ^ 2
= (1/3) (1 + 4 + 9) - 4
= (1/3) (14) - (12 / 3)
= 2/3

ありゃ。この計算では正しいな。
673デフォルトの名無しさん:2005/10/20(木) 19:49:52
標準入力から入力された文字列をポインタbufferが指すメモリ領域に保存し,その文字列中のアルファベット小文字を大文字に変換して、
ポインタresultが指すメモリ領域にコピーするプログラムをつっくたのですが、エラーが出てしまうのですがどこが間違ってるのか教えてください!!

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define BUFFER_SIZE 100
void capitalizeCopy(char*, char*);

int main(void)
{
char *buffer, *result;
  buffer = (*char)malloc(sizeof(char));
result = (*char)malloc(sizeof(char));
printf("input string: ");
fgets(buffer, BUFFER_SIZE, stdin);
capitalizeCopy(result, buffer);
printf("buffer: %s", buffer);
printf("result: %s", result);
exit(0);
}
void capitalizeCopy(char *dest, char *src)
{ while (src != '\0')
if (islower(*src)) { *dest = *src - 32; }
else { *dest = *src; }
src++;
}
}
674デフォルトの名無しさん:2005/10/20(木) 19:55:17
マルチするなボケ
675デフォルトの名無しさん:2005/10/20(木) 19:56:25
>>674
ネタだろ
676デフォルトの名無しさん:2005/10/20(木) 19:56:50
>>673
ソースコード張りなおし.お前が本当に書いたソースコードを手で写さずにコピーペーストしろ.
あと,エラーが出るならそのエラーメッセージも手で写さずにコピーペーストしろ.
677デフォルトの名無しさん:2005/10/20(木) 20:07:45
マジレスすると>>671でも問題ない
手持ちの統計学の教科書にも計算上便利な1/nΣx^2 - x~^2が使えるって書いてあるしな
ただし、場合によっては桁落ちが落ちるので気をつけろとも書いてあるが
678デフォルトの名無しさん:2005/10/20(木) 20:09:52
>>657 ネタだと思うが、他人の破滅は見てて楽しいので、後日談も希望。
679デフォルトの名無しさん:2005/10/20(木) 20:13:46
>>677 漏れも検証した。>>671の等式は正しい。
680669:2005/10/20(木) 20:24:51
ググって証明見つけた
ttp://www.kwansei.ac.jp/hs/z90010/sugakuc/toukei/avgvar/avgvar.htmの下の2
勉強になったよ
681デフォルトの名無しさん:2005/10/20(木) 21:17:51
1]コンピュータアプリケーション
[2]データの個数nとデータa1,a2...anの値をファイルにdate1.dから読み込みデータ
と平均値と標準偏差を計算し、結果をファイルdate2.dに出力するプログラムを作り
なさい。
 10個のデータは適当な数字でよい
[3.1]xp
[3.2]わからないでです
[3.3]C
[4]10月21日16時30分
[5]わからなくて困ってます。よろしくお願いします。


682デフォルトの名無しさん:2005/10/20(木) 21:32:15
>>681
データの個数はn個?10個?
data1.d、data1.dのフォーマットは?
683682:2005/10/20(木) 21:33:14
date1.d、date2.dだったか…
684デフォルトの名無しさん:2005/10/20(木) 21:51:58
藻前等、関数電卓の統計機能を使ったことないのか?
あれはnとΣxとΣx2だけ保存しておいてx~, σn, σn-1は押されたときに計算するだけだぞ。
#昔の関数電卓ではちゃんと取り説で解説されていたのだが……
685デフォルトの名無しさん:2005/10/20(木) 22:03:40
>>684
漏れの関数電卓は回帰直線・曲線も求めることができるんだが
これも全データは取っておいてないの?
686681のものです。:2005/10/20(木) 22:12:43
データの個数は10個ですね。

流れとしてはまずdate1.dに10個の数字を入れておいてそれを問題のプログラムに計算させてdate2.dに出力させるわけですが、プログラムの部分が全然わからずすすまないんですよ。
687デフォルトの名無しさん:2005/10/20(木) 22:16:21
>>685
1次回帰ならΣx, Σy, Σxy, Σx2, Σy2があれば計算できる。
2次回帰でも1次回帰のほかにΣx3, Σx2y, Σx4辺りがあればいい。
#式の詳細は「一次/二次回帰分析」で検索すると出てくる漏れのサイトにも書いてある。
688デフォルトの名無しさん:2005/10/20(木) 22:24:29
[1] C++入門
[2] string str;

str = "さんたすよん";が与えられたとする。
このとき,さんを数字の3に,よんを数字の4に,たすを演算子+になおし,その結果を表示するプログラムを考えよ
[3] 環境
 [3.1] OS: WindowsXP SP1
 [3.2] Borland C++ Compiler 5.5
 [3.3] C++
[4] 期限: [2005年10月27日09:00まで]
[5] その他の制限: 特にありません
689デフォルトの名無しさん:2005/10/21(金) 00:17:07
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●(´・д・`)●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
これを見た人は確実に【不合格】です。これをコピペでどこかに1回貼れば回避できます。
これは本当です。やらないと一年無駄になります
690625:2005/10/21(金) 00:19:13
チラシの裏

あり? 2つの方法で、実装2つ作ったけど・・・一致しねぇ。。。
まあいいか、俺の仕事じゃねぇし・・・
時間があったら3つ目の実装つくってみるべ・・・。

デバッグとか考えて作りましょう>わし
691デフォルトの名無しさん:2005/10/21(金) 00:58:52
>>681 コンパイラ通してない&セキュリティ甘い版
#include <stdio.h>
#include <math.h>
int main(void)
{ FILE* fp=fopen("data1.d", "r");
int n, i, data;
double ave, var;
fscanf(fp, "%d", &n);
ave = var = 0.0;
for( i = 0 ; i < n ; i++ ) {
fscanf(fp, "%d", &data); ave += data; var += data * data;
}
fclose(fp);
ave /= n; var = var / n - ave * ave;
fp = fopen("data2.d", "w");
fprintf(fp, "Ave:%f\nSig:%f\n", ave, sqrt(var));
fclose(fp);
return 0;
}
テキストの形は次の行から
10 // データ数 n (コメントはデータファイルに書かない。あくまで説明用。)
1234 // データ1個目
 :
8374 // データ最後
上の行まで、という感じで。
692デフォルトの名無しさん:2005/10/21(金) 01:02:32
>>673

ネタだと思うが敢えてマジレス。

なんでBUFFER_SIZEを1000に設定してるのにmallocで1バイトしか確保しとらんの? 
しかもBUFFER_SIZE分読み込もうとしてるし。
これじゃ下手したらSegmentation faultするぞ。
自分にバッファオーバーフロー攻撃してどうする?

あと小文字=>大文字変換用関数。ただし必要最小限の機能だけ。

void Capitalize(char *org,char *dest)
{
char *ptr;

for(ptr = org;*ptr != '\0';ptr++){
if(islower(*ptr))
*dest++ = toupper(*ptr);
}
}

あとはどうにでもなるだろ。
693デフォルトの名無しさん:2005/10/21(金) 01:08:58
islower()にただのcharを渡してはいかん
unsigned charにキャストしる
694デフォルトの名無しさん:2005/10/21(金) 01:10:50
OKなのって、EOFと0-255なん? って言語スレだね。失敬。
695628:2005/10/21(金) 02:53:38
>>644様 レス遅くなってすいません。どうもありがとうございました!!!
実行してみたところ、6つの乱数が出てきたのですが、それでいいのでしょうか??
696デフォルトの名無しさん:2005/10/21(金) 02:59:38
[1] 授業単元:プログラミング
[2] 問題文:
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/998.txt
ここにあるNameFileのアルファベット氏名を使って,
一行分の各データを読み込み、各個人データをメモリ内で二分木を一旦作成して,
それから,アルファベット順に名前データを表示するプログラムを作って下さい.
strcasecmp() を使用すること。
ヒントとしてscanfの使い方が与えられてます↓
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/994.txt
[3] 環境
 [3.1] Windows/Linux
 [3.2] gcc
 [3.3] 言語: C
[4] 期限: 2日以内
[補足]上記の問題は>>577と同じようですが、以下の点が違います
NameFileの中身が、[03TI001 阿部 恒彦 j0301at Abe Tsunehiko]から
[03TI001,阿部 恒彦,g2,Abe,Tsunehiko,0123450]と、コンマで区切られている
因みにそれぞれ[ユーザーID,漢字氏名,学年,e苗字,e名前,学籍番号]となっています。
>>577のに比べて人数が減っているのは気にしなくていいです
因みに>>577の解答コードは>>583です、これをうまく改造すればいいのでしょうが
どうもうまくいきません、コーディングをお願いしますm(__)m
697デフォルトの名無しさん:2005/10/21(金) 03:08:19
>>696
ファイル形式が違うだけなら、フォーマット文字列を"%[^,],%[^,],%[^,],%[^,],%[^,]\n"にでもして、
漢字名の部分を姓名二つのメンバから一つのメンバに換えればよろしかろ。
698デフォルトの名無しさん:2005/10/21(金) 04:20:25
>>696
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/999.c

NameFileの最後の1件に学年がないから、read errorで終了しちまうけどな。。
699698:2005/10/21(金) 04:35:23
scanf()の結果判定文まちがってた。何やってんだ俺はorz
× if(i != 6)
○ if(i == 6)
700696:2005/10/21(金) 04:43:44
>>698
NameFileをちゃんと書き直しても、read errorで終了してしまいます・・・。
何故なんでしょう・・・。
因みにコンパイルすると
警告 W8060 NF.c 29: おそらく不正な代入(関数 bin_tree_add )
ってのが出ます
701696:2005/10/21(金) 04:45:40
Oh!ちゃんとできました!
ありがとうございましたm(__)m
702644:2005/10/21(金) 08:00:56
>>695
……えーと、ソース読めばわかると思うけど表示してるのは平均と分散。

乱数部分は全部表示してたら鬱陶しいと思って表示を切ってある。
もし表示したいなら、君が最初に見せたソースと同じ要領で、
printf文で%fを指定してvを表示してくれ。
703デフォルトの名無しさん:2005/10/21(金) 09:51:13
[1] 授業単元:プログラミング演習U
[2] 問題文:
static double data[] = {1.23, 2.34, 3.45, 4.56, 0.98};

上記のように double 型の配列を宣言、初期化した場合、
各データはメモリ空間上のどのようなアドレスに格納されているか
数値と一緒に表示せよ。
次に、データ中の最大値を探して表示するプログラムを作成せよ。
なお、配列の各要素を参照する場合、ポインタ変数を使用すること。

※printf文におけるアドレス表示の変換指定子は %p を利用すること

[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:10/24まで
[5] その他の制限:ポインタを習い始めたばかりです。

どなたかご教授お願いします。
704デフォルトの名無しさん:2005/10/21(金) 10:35:32
>>703
#include <stdio.h>

static double data[] = {1.23, 2.34, 3.45, 4.56, 0.98};

int main(int argc, char **argv)
{
double *p = data, *max = data;
int i, num = sizeof(data)/sizeof(double);

for(i = 0; i < num; i++, p++) {
printf("data[%d]のアドレス = %p, data[%d]の値 = %lf\n", i, p, i, *p);
if(*max < *p) {
max = p;
}
}

printf("最大値 = %lf\n", *max);
return 0;
}
705デフォルトの名無しさん:2005/10/21(金) 11:05:56
[1] 授業単元:プログラミング演習
[2] 問題文(含コード&リンク):
累計
1 2 3 4 5 15
7 8 9 10 49
13 14 15 91
19 20 130
25 155

上の様に表示するプログラムを作る
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン:VS.net
 [3.3] 言語: C
[4] 期限:2005年10月23日0:00まで
[5] その他の制限:配列を使わないで作成
706705:2005/10/21(金) 11:10:04
累計
1 2 3 4 5 15
7 8 9 10 49
13 14 15 91
19 20 130
25 155


訂正です
よろしくお願いします
707705:2005/10/21(金) 11:17:19
問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1000.txt
上手くいかないのでアップローダーを使わせてもらいます
よろしくお願いします
708デフォルトの名無しさん:2005/10/21(金) 11:24:50
>706
#include <stdio.h>
int main(){
printf(
"累計\n"
"1 2 3 4 5 15\n"
"7 8 9 10 49\n"
"13 14 15 91\n"
"19 20 130\n"
"25 155\n"
);
return 0;
}

ほい

マジレスすると問題文に転載漏れあるだろ?
それを追加してから出直してきてください。たぶん入力された数字の和を求めよとかそういうのだと思うけど。

しかしCの演習でVisual Studioとはリッチな学校だな
709708:2005/10/21(金) 11:25:40
リロード忘れたので708は見なかったことにしてください。
710703:2005/10/21(金) 11:25:45
>>704
ありがとうございます。助かりました。
711デフォルトの名無しさん:2005/10/21(金) 11:53:12
>>709
(・∀・)ニヤニヤ
712デフォルトの名無しさん:2005/10/21(金) 12:17:34
>>705
対応しないといけない数はそれだけ?他の入力とかは考慮しなくていいの?しなきゃいけないならその個数は?
713712:2005/10/21(金) 12:18:40
個数ってのは、一行に入りうる数の個数な。それがわからないと配列を使わないで実装するのは難しいかもしれない。
714デフォルトの名無しさん:2005/10/21(金) 12:49:38
サンプルを示しても問題/仕様の定義にはならない。
>>707がサンプルでないなら、>>708が回答だろw
715デフォルトの名無しさん:2005/10/21(金) 13:09:58
何度もすみません、自分のパソコンだと実行できないので
どなたか>>563のプログラムを実行して結果を貼ってください、おねがいします。
716デフォルトの名無しさん:2005/10/21(金) 13:13:41
>>715 諦めろ
717デフォルトの名無しさん:2005/10/21(金) 13:18:49
>715
機種依存しそうなコードじゃないので715の行いに問題があると考えられる
718デフォルトの名無しさん:2005/10/21(金) 13:19:30
>>715
どうして実行できないのか書いたほうがいいよ。
例えばこんなエラーが出たとか。
719デフォルトの名無しさん:2005/10/21(金) 13:47:56
むしろ出題者の方を疑った方がいい気もしてきた。
問題文が本当にそれだけなら出題者がだいぶボンクラであるに違いない。

あと、配列がダメなら文字列もアウトか?
720デフォルトの名無しさん:2005/10/21(金) 14:02:34
>>719 文字列は char の linkedlist で
721デフォルトの名無しさん:2005/10/21(金) 14:46:03
[1] 授業単元:C言語プログラム
[2] 問題文:
データの個数nとデータa1,a2,・・・anの値をファイル(A.d)から読み込み、
データの平均値と標準偏差を計算して結果を別のファイル(B.d)に出力するプログラムを作り、
データの値が
90.4, 70.6, 29.3, 48.2, -12.8,
33.3, -21.8, 35.6, 99.9, 38.9,
の10個の場合について求めよ。
[3] 環境
[3.1] OS:Windows
[3.3] 言語: C
[4] 期限: [2005年10月22日まで]
[5] その他の制限:ありません

お願いします。
722デフォルトの名無しさん:2005/10/21(金) 16:12:22
>>721
#include <stdio.h>
#include <math.h>
int main() {
  double a[100]; /* データ数は高々 99 と仮定 */
  int n, i;
  double m = 0, sigma2 = 0;
  FILE *fin, *fout;
  fin = fopen("A.d", "r");
  for (n = 0; fscanf(fin, "%lf,", &a[n]) != EOF; ++n);
  fclose(fin);
  for (i = 0; i < n; ++i) m += a[i] / n; /* m = Σa[i]/n */
  for (i = 0; i < n; ++i) sigma2 += pow(a[i]-m, 2) / n; /* σ^2 = Σ(a[i]-m)^2/n */
  fout = fopen("B.d", "w");
  fprintf(fout, "m = %lf, sigma = %lf\n", m, sqrt(sigma2));
  fclose(fout);
}
723デフォルトの名無しさん:2005/10/21(金) 16:22:59
問題 キーボードから整数を入力したとき、その数が3の倍数かどうかを出力するプログラムをつくりなさい。ただし、等価演算子を使わずに条件を記述しなさい。←これで、7行目のif文を誰か解いてもらえますか?初歩的な問題かも知れませんがわかりません。お願いします。
724デフォルトの名無しさん:2005/10/21(金) 16:30:33
val % 3 ? _T("( ゚Д゚)ハァ?") : _T("( ・∀・)イイ!!");
725デフォルトの名無しさん:2005/10/21(金) 16:32:17
>>723
入力した整数が入っている変数を n とするとif (!(n % 3))。
726681:2005/10/21(金) 16:47:46
>>691
ありがとうございます。
727722:2005/10/21(金) 16:53:40
うげ >>721 って >>681 と同一か orz
728722:2005/10/21(金) 16:54:57
と思ったら微妙に提出日とか違ったスマソ……
729デフォルトの名無しさん:2005/10/21(金) 17:05:55
>>724-725わかりました!どうもありがとうございます。またよろしくお願いします
730デフォルトの名無しさん:2005/10/21(金) 17:49:34
>>722
ありがとうございます
731デフォルトの名無しさん:2005/10/21(金) 20:54:08
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
素数を求めるプログラムを作成せよ。素数を求める範囲(下限 上限)を標準入力から入力すること。
求めた素数はファイルout.txtに出力すること。main関数の他に引数として与えた数が素数なら1、素数でないなら
0を返す関数を作成すること。
[3] 環境
 [3.1] OS: WINxp
 [3.2] Borland BCC dev
 [3.3] 言語: C
[4] 期限: 今月中

おながいします!
732デフォルトの名無しさん:2005/10/21(金) 21:14:57
>>731
確か素数を見つけるアルゴリズムが有ったと思うが
俺はよく知らないので時間のかかる奴でもいいか?
733デフォルトの名無しさん:2005/10/21(金) 21:17:53
>>732
はい
734デフォルトの名無しさん:2005/10/21(金) 21:19:45
735デフォルトの名無しさん:2005/10/21(金) 21:32:25
知ってるが、ソースを書くのが面倒なので教えてやらない
736デフォルトの名無しさん:2005/10/21(金) 21:45:08
>>731
エラトステネスの篩使ってるのにめっちゃ無駄が多い(w

#include <stdio.h>
#include <stdlib.h>
int is_prime(int upper) {
    int i, notprime, *integers = (int*)malloc(sizeof(int) * (upper + 1)), ret;
    for (i = 2; i <= upper; i++) integers[i] = 1;
    integers[0] = integers[1] = 0;
    for (i = 2; i <= upper / 2; i++) {
        notprime = i;
        while ((notprime += i) <= upper) integers[notprime] = 0;
    }
    ret = integers[upper];
    free(integers);
    return ret;
}
int main(void) {
    int upper_num, lower_num, i;
    FILE* fp = fopen("data.txt", "w");
    scanf("%d%d", &lower_num, &upper_num);
    for (i = lower_num; i <= upper_num; i++)
        if (is_prime(i)) fprintf(fp, "%d\n", i);
    fclose(fp);
    return 0;
}
737デフォルトの名無しさん:2005/10/21(金) 22:00:10
>>736
・・・mallocの正否を確認していませんが。
いつもそうなのですか?
738デフォルトの名無しさん:2005/10/21(金) 22:05:54
>>736
やってもらったのにすいませんが、なんか割り算をして求める方法らいしです!
739628:2005/10/21(金) 22:06:34
>>644様 ありがとうございました!!!昨日慌ててたのでソースきれいに見てなかってすいませんでした(^_^;)
卒研もうまくいきそうです。本当に助かりました!!
あなたは ネ申!!!
740デフォルトの名無しさん:2005/10/21(金) 23:06:17
>>738
んじゃこれで。n % iがnをiで割った余りだから。
#include <stdio.h>
int is_prime(int n) {
    int i;
    for (i = 2; i <= n / 2; i++) if (n % i == 0) return 0;
    return 1;
}
int main(void) {
    int i, upper_num, lower_num;
    FILE* fp = fopen("data.txt", "w");
    scanf("%d%d", &lower_num, &upper_num);
    for (i = lower_num; i <= upper_num; i++)
        if (is_prime(i)) fprintf(fp, "%d\n", i);
    fclose(fp);
    return 0;
}

>>737
どゆこと?
741デフォルトの名無しさん:2005/10/21(金) 23:10:17
>>740
ありがとうございます。これをヒントに考えてみます
742デフォルトの名無しさん:2005/10/21(金) 23:14:11
>>740
下限や上限が整数でない場合はどうしたらいいですか?double型を使うとして
for文のところがわからないです
743デフォルトの名無しさん:2005/10/21(金) 23:23:28
>>742
釣りか?と思いつつも。
#include <stdio.h>
#include <math.h>
int is_prime(int n) {
    int i;
    for (i = 2; i <= n / 2; i++) if (n % i == 0) return 0;
    return 1;
}
int main(void) {
    int i, upper_num, lower_num;
    double upper, lower;
    FILE* fp = fopen("data.txt", "w");
    scanf("%lf%lf", &lower, &upper);
    upper_num = floor(upper);
    lower_num = ceil(lower);
    for (i = lower_num; i <= upper_num; i++)
        if (is_prime(i)) fprintf(fp, "%d\n", i);
    fclose(fp);
    return 0;
}
744デフォルトの名無しさん:2005/10/21(金) 23:27:23
>>743
例えば下限に6.5が入力されたとして、for文で1ずつ足していくと7とかが無視されないですか?
745デフォルトの名無しさん:2005/10/21(金) 23:27:33
>>743 O(n) と O(√n) は大違い
746デフォルトの名無しさん:2005/10/21(金) 23:28:43
>>744
おまえは floor と ceil という文字が見えんのか?
というか、なんで実際に動かして試してみろ馬鹿
747デフォルトの名無しさん:2005/10/21(金) 23:33:48
>>746
floorとceilは習ってません・・・
748デフォルトの名無しさん:2005/10/21(金) 23:35:34
>>747 じゃあ検索しろ。マニュアルくらい読め。わからなかったら少しは自分で調べろ。
749デフォルトの名無しさん:2005/10/21(金) 23:37:12
>>747 ここは、説明はあんまし期待しないよーに。
実行してみて不具合があったら報告すればよろし。
750デフォルトの名無しさん:2005/10/21(金) 23:43:39
[1] 授業単元:プログラミング入門
[2] 問題文(含コード&リンク): 30人のテストの得点データを読み込む。得点は0点以上10点以下。
 各点数の人数を求め、その人数を点数ごとに*の数で表しなさい。
 また、最も人数の多い得点と、最も人数の少ない得点を示しなさい。
[3] 環境
 [3.1] OS: WindowsXP
 [3.3] 言語: どちらでも可
[4] 期限: 日曜日までにお願いします。
[5] その他の制限: 配列を利用しなさいということ以外は特に指定はありませんでした。
          お願いします。
751デフォルトの名無しさん:2005/10/21(金) 23:51:18
言語:どちらでも可ってなんだ。マイナー言語でもよいと言うのか。
752デフォルトの名無しさん:2005/10/21(金) 23:53:50
WhiteSpaceでよろ
753デフォルトの名無しさん:2005/10/21(金) 23:57:26
言語はBrainfuckでひとつ。
754デフォルトの名無しさん:2005/10/21(金) 23:58:22
HSP!HSP!HSP!HSP!HSP!HSP!HSP!HSP!HSP!HSP!HSP!HSP!
755デフォルトの名無しさん:2005/10/22(土) 00:03:03
>>750 点数はファイルに改行とか空白で区切られて入ってるものとする。
#include <iostream>
#include <fstream>
#include <algorithm>

int main() {
  int scores[10+1];
  std::fill(scores, scores+11, 0);
  std::ifstream ifs("score.dat");
  for (int i = 0, x; i < 30; ++i) ifs >> x, scores[x]++;
  for (int i = 0; i <= 10; ++i) {
    for (int j = 0; j < scores[i]; ++j) std::cout << '*';
    std::cout << std::endl;
  }
  int minid = 0, maxid = 0;
  for (int i = 0; i <= 10; ++i) {
    if (scores[i] < scores[minid]) minid = i;
    if (scores[i] > scores[maxid]) maxid = i;
  }
  std::cout << minid << "," << maxid << std::endl;
}
756デフォルトの名無しさん:2005/10/22(土) 00:07:02
>>751
スマソ_| ̄|○
C++の間違いだった……。
757デフォルトの名無しさん:2005/10/22(土) 00:15:14
どちらでも可 はありだったと思ったが >>1
758705:2005/10/22(土) 01:10:16
返答遅れてスイマセン
整数の値は各行に5個ずつ
各行の終わりにはそれまでの累計を表示
逆階段の様に表示するプログラムです
 同時に出された問題2はは
1〜25までの好きな数字を入力して
入れた数字まで整数の値を各行に表示(6だったら5まで表示
行の累計だけではなく
列の累計も表示するプログラムです
おそらく最初の問題は2番目の問題の雛形だと思います
最初の問題だけ教えてもらって
後半は自力で解こうとした為
説明不足になってしまいました
改めてよろしくお願いします

759デフォルトの名無しさん:2005/10/22(土) 08:19:53
>>750
>最も人数の多い得点と、最も人数の少ない得点を示しなさい。
ここは自分でやってくれい

#include <iostream>
#include <vector>
using namespace std;

void input_result( vector<int> &v ){
    int i;
    for( i=0; i<30; i++ )
        v.push_back( rand()%11 );
}
760デフォルトの名無しさん:2005/10/22(土) 08:22:59

void show( vector<int> v ){
    int i;
    for( i=0; i<=10; i++ )
    {
        cout << i << ": ";
        vector<int>::iterator p = v.begin();
        while( p != v.end() )
        {
            if( i == *p )
                cout << "*";
            p++;
        }
        cout << endl;
    }
}

int main()
{
    vector<int> v;

    input_result(v);

    show(v);

    return 0;
}
761デフォルトの名無しさん:2005/10/22(土) 21:36:59
[1] 単元:情報プログラム
[2] 環境
 [2.1] OS: Linux
 [2.2] コンパイラバージョン: gcc
 [2.3] 言語: C
[3] 期限: 木曜16時
[4] 問題:任意の2自然数に関する最小公倍数計算のためのルールを見出し、それにもとづきアルゴリズムを考案し、
プログラムを作成・実行せよ。2数は使用者がプログラム実行時に打ち込めるものとする。
<出力例1> Please input first number:60 ←60を入力
Please input second number:84 ←84を入力
The least common multiple of 60 and 84 is 420
<入出力例2>Please input first number:84 ←84を入力
Please input second number:84 ←84を入力
The first number (84)is equal to the second(84).
Try again!
<ルール確率のためのヒント>
以下に60と84の最小公倍数の求め方を示す。
@60と80は2で割れる
A30と40は2で割れる
B15と21は3で割れる
C5と7を割れる数はない
D2*2*3*5*7=420が最小公倍数
上記手順は人間の勘に依存する部分があるので、そのままアルゴリズム化できない。
ルールを確立するためには、以下の点に着目。
「1」手順Cにおける2数(5と7)間に1以外の公約数はない。
「2」2*2*3は最大公約数である
「3」最大公約数に5を乗じると60になり、7を乗じると84になる

以上が課題ですよろしくお願いします・゚・(ノД`)・゚・


762デフォルトの名無しさん:2005/10/22(土) 21:42:20
???素因数分解してダブりを除いてかけるのが最小公倍数じゃん
60=2*30=2*2*15=2*2*3*5
84=2*42=2*2*21=2*2*3*7
最小公倍数 2*2*3*5*7
763デフォルトの名無しさん:2005/10/22(土) 21:51:06
>>761
#include <stdio.h>
#include <stdlib.h>

int gcd(int x, int y) { return y ? gcd(y, x % y) : x; }
int lcm(int x, int y) { return x / gcd(x, y) * y; }

int main(void)
{
  int x, y;
  do {
    while (printf("Please input first number:"), scanf("%d", &x) != 1 || x < 0) scanf("%*[^\n]");
    while (printf("Please input second number:"), scanf("%d", &y) != 1 || y < 0) scanf("%*[^\n]");
  } while (x == y && printf("The first number (%d)is equal to the second(%d)\nTry again!\n", x, y));

  printf("The least common multiple of %d and %d is %d\n", x, y, lcm(x, y));

  return 0;
}
764デフォルトの名無しさん:2005/10/22(土) 23:27:51
確か、小さい方で割った剰余を出して、それで今度は逆の事をしてって
繰り返していくのがなかったっけ?
765デフォルトの名無しさん:2005/10/22(土) 23:52:49
int gcd(int a, int b)
{
if(b) return gcd(b, a%b);
return a;
}
int lcm(int a, int b)
{
return (a/gcd(a,b))*b;
}
766デフォルトの名無しさん:2005/10/23(日) 01:03:21
前に住人たちにお世話になったものです
久しぶりに見たけど色々な人を助けてるようですね。
あの時はありがとう。なんか自分の人生は変わってしまったけど
ここは変わってなくて安心した
767デフォルトの名無しさん:2005/10/23(日) 02:45:58
>>696
かなり亀レスだが…
お前の使ってる緑色の教科書の、2分探索木を操作するプログラムを改良して作ったほうがシンプルで楽だぞ…
お前と同じ大学に通っている俺が言うんだから間違いない
768デフォルトの名無しさん:2005/10/23(日) 05:05:34
http://kjm.kir.jp/pc/?p=3535.jpg

宿題ってわけではないのですが・・・なぜこうなるのでしょうか。
詳しい解説をしてくれる方いらっしゃいますか?
769デフォルトの名無しさん:2005/10/23(日) 06:19:34
丁寧に追いかけるだけだよ.funcJ が呼ばれるまでで
a = [1, 2, 3, 4, 2, 3, 4, 5],d = [a, a+4]
になるのは明らか.funcJ の中で d[0] = a, d[1] = a+4 なので,
for 文の中身は (a+4)[j] += (a)[j].
ここで C 言語では a[k] は *(a+k) の構文糖衣なので,
(a+4)[j] = *(a+4+j) = a[4+j]
となって,for 文の中身は a[4+j] += a[j] と同値.
よって a = {1, 2, 3, 4, 3, 5, 7, 9}
770デフォルトの名無しさん:2005/10/23(日) 06:23:12
>>769
a【100】って領域が確保されている以外は図の通りと考えて問題ない。
771デフォルトの名無しさん:2005/10/23(日) 10:05:47
[1] 授業単元:C言語演習
[2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1002.txt
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: [2005年10月24日8:00まで]
よろしくお願いします
772デフォルトの名無しさん:2005/10/23(日) 10:17:45
[1] プログラム演習T
[2] スタックを用いて、後置式を前置式に変換するアルゴリズムを考える、あるいは調べよ。
プログラムにした場合加点対象とする。

例:54*1+なら、((5*4)+1)
[3] 環境
 C言語。WinXP、Borland C++ Compiler 5.5がコンパイラ。
[4] 期限: [2005/10/25]
[5] 半年C言語を習った程度。

アルゴリズムが分かりません。スタックって・・・木構造じゃないのかorz
773デフォルトの名無しさん:2005/10/23(日) 10:45:58
>>771 問題文と例が不一致.問題文は後置を中置にしてるが.
774デフォルトの名無しさん:2005/10/23(日) 10:59:15
>>771
問題のコードが変だなぁ
UINT_MAX行だけ出力するようになっているし、なぜかintを16ビットと見なしているし。
教科書と言うのは時代に即してないのね

元のコードが動くものであるなら、こんな変更でいいんじゃないかな(コンパイルもしてみてない)
int count_bits(unsigned x)

int count_bits(unsigned char x)

for(i=0;i<UINT_MAX;i++){
print_bits(i);
printf("%6o%5u%4x\n",i,i,i);
}
 ↓
i=CHAR_MAX;
print_bits(i);
printf("%5u%4x\n",i,i);
775デフォルトの名無しさん:2005/10/23(日) 11:18:53
>>772
アルゴリズムとしては,それが項か演算子かを区別して,式を最初から読んでいって
 1. 項だったらスタックに突っこむ
 2. 演算子だったら二つスタックから取ってきてそれを結合してスタックに突っこみなおす
 3. 式を全部読んだらスタックの先頭に結果が入ってる.
例えば 54*1+ だったら,
 ・5 だからスタックに突っこむ
 ・4 だからスタックに突っこむ
 ・* だからスタックから 5 と 4 を取ってきて * でつないで (5*4) を作ってスタックに突っこむ
 ・1 だからスタックに突っこむ
 ・+ だからスタックから (5*4) と 1 を取ってきて + でつないで ((5*4)+1) を作ってスタックに突っこむ
で読みきったとき,スタックの先頭には ((5*4)+1) が入ってるはず.

これを普通に書くと↓みたいになる.スタックに文字列を突っこむことになるので最初に語句解析しとくと楽.
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1003.c
776デフォルトの名無しさん:2005/10/23(日) 11:23:38
と思ったがどうせスタックに入るのは項だけなんだから語句解析なんていらんな……ああ無駄コード orz
777デフォルトの名無しさん:2005/10/23(日) 12:55:57
char *str[100];
char buf[256];
int ptr = 0;

中身が頻繁に変わるbufを strに順番に保存しておきたいのですが
strcpy( str[ptr++], buf);
これではだめなんでしょうか?うまくいきません。
778デフォルトの名無しさん:2005/10/23(日) 12:56:33
>>777
strに領域割り当ててるか?
779デフォルトの名無しさん:2005/10/23(日) 13:00:36
割り当ててません(;
やり方教えてもらえますか? 
ごく簡単でかまいません m(_ _)m
780デフォルトの名無しさん:2005/10/23(日) 13:02:07
>>779
char str[256][100]; で strcpy(str[ptr++], buf);
781デフォルトの名無しさん:2005/10/23(日) 13:10:02
>>780
恐らく添字が逆
782デフォルトの名無しさん:2005/10/23(日) 13:14:05
>>775
ありがとうございます。
文字列をスタックに入れる発想ができませんでした。
文字列を数値に変換するのとか習ってたのに・・・
参考になりました。
783780:2005/10/23(日) 13:16:35
>>781 スマソ
784デフォルトの名無しさん:2005/10/23(日) 16:39:37
【質問テンプレ】
[1] 授業単元:名前解決を実装するソケットプログラミング

[2] 問題文(含コード&リンク):ドメイン名をIPアドレスに変換するプログラムを作成せよ。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1004.txt

[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C

[4] 期限: [2005年10月28日まで]

[5] その他の制限:nslookupやdig等のようにローカルDNSに問合せに行って
ローカルDNSがルートDNSに問い合わせると言う形はNGです。
あくまで、このプログラムが直接ルートDNSに問合せに行き、
名前解決をする必要があります。
785デフォルトの名無しさん:2005/10/23(日) 16:47:55
質問したのにsageてしまった。
それと>784をコンパイルし./プログラム名 www.livedoor.co.jpと入力すると
-------------------------
データ送信:www.livedoor.co.jp
データ受信:4294967295
-------------------------
と表示されます。

データ受信の欄にjpドメイン全体を管理するネームサーバのアドレスを表示させ、
順次co全体を管理するネームサーバのアドレス、
livedoor全体を管理するネームサーバのアドレス、
と表示させたいのですが。
786デフォルトの名無しさん:2005/10/23(日) 20:14:42
>>785
そりゃぁ、全く間違ったものを表示させようとしているだろ。
787デフォルトの名無しさん:2005/10/23(日) 20:29:53
>786
ルートDNSの53番ポートにドメイン名を送ると、上記の4294967295が返ってきます。
送り方に問題がありそうなのですが、良く分からなくて・・・。
788デフォルトの名無しさん:2005/10/23(日) 20:31:50
0xffffffff
789デフォルトの名無しさん:2005/10/23(日) 20:40:47
だから-1を表示してどうしたいのかと。
790デフォルトの名無しさん:2005/10/23(日) 20:43:07
[1] 授業単元: 三次元プログラミング
[2] 問題文(含コード&リンク):

int yaw, pitch, rollに角度(0゚〜360゚=0〜65536)、float distに原点座標からの距離が代入されている。
これをfloat vecx, vecy, veczに原点座標からのベクトル値に変換しなさい。

[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: VC.net2003
 [3.3] 言語: C++
[4] 期限: [2005年10月24日08:00まで]
[5] その他の制限:特になし、C++に関してはほぼ習得出来ているつもり

宜しくお願いします。
791デフォルトの名無しさん:2005/10/23(日) 20:47:02
>>790
ヨーピッチロールとxyzの方向の関係を図示したまえ。
792質問です。:2005/10/23(日) 22:03:23
授業単元とか無いのですが、卒業研究の一環でJPEGを読み込んでRGBの値を
得るプログラムがどうしても欲しいのです。C++でもCでも良いのです。
注意点を守ってないのは承知の上なのですが、どうしても力を借りたいので
お願いします。
793デフォルトの名無しさん:2005/10/23(日) 22:04:57
>>792
libjpeg使え。
794デフォルトの名無しさん:2005/10/23(日) 22:06:02
>>278
あれ?自力で調べるんではないの?

http://pc8.2ch.net/test/read.cgi/tech/1129589500/278
795デフォルトの名無しさん:2005/10/23(日) 22:06:48
とと、間違えた。 794 は >>792宛てどす
796デフォルトの名無しさん:2005/10/23(日) 22:17:53
>788
>789
なんで、0xffffffffが送られてくるのか理解できてないです。
DNSパケットとかRFCとかをもう少し勉強してきます。
797デフォルトの名無しさん:2005/10/23(日) 22:19:31
>>796
そもそもDNS参照は生の文字列を送りつければ結果が返ってくるような単純なものじゃないよ。
798デフォルトの名無しさん:2005/10/23(日) 22:20:37
>>796
rootサーバに何してるんだ?
799デフォルトの名無しさん:2005/10/23(日) 23:27:12
>798
>797のおっしゃるとおり、ルートの53番ポートにドメイン名をそのまま送りつけているだけです。
そんな単純な話じゃないんですねorz
800デフォルトの名無しさん:2005/10/24(月) 11:01:20
>>799
俺も興味があったのでちょっと調べてるが、とりあえず@ITでも見てみれ
801デフォルトの名無しさん:2005/10/24(月) 12:27:05
>800
下記などをみて頑張ってみます。
http://www.atmarkit.co.jp/fnetwork/rensai/tcp20/03.html
http://www.atmarkit.co.jp/fnetwork/rensai/tcp07/01.html

まずは下記に記載されているDNSパケットの図を見ながらソースに組み込んでみます。
http://www.atmarkit.co.jp/fnetwork/rensai/tcp07/zu5.gif
http://www.atmarkit.co.jp/fnetwork/rensai/tcp20/tcp20_06(L).gif
http://www.atmarkit.co.jp/fnetwork/rensai/tcp20/tcp20_05(L).gif
802デフォルトの名無しさん:2005/10/24(月) 14:18:02
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1006.txt

このプログラムをwindowsで表示させたいんです。

ウインドウの左側にファイルから読み込んだデータを表示させ"ソート"というボタンを押したら右側に整列されたデータを表示させるという問題です。

どうかお願いします。
803デフォルトの名無しさん:2005/10/24(月) 17:02:40
>>801
ttp://x68000.q-e-d.net/~68user/net/sample/resolver-1.pl

Perlが読めること前提だが、これがまさにそれじゃねーの?
移植に挑戦してみれ
804デフォルトの名無しさん:2005/10/24(月) 17:43:05
>>802
そんなGUIの絡んだような宿題は基本的に手間ばかりで宿題の醍醐味に欠けるのでやりたがる人は少ない。
そもそも、>1を読んでくれ。
805デフォルトの名無しさん:2005/10/24(月) 19:32:59
>803
情報ありがとうございます。
実行させてみたところ、私の作りたいものにきわめて類似していることが分かりました。

./resolver-1.pl 198.41.0.4 www.livedoor.com(書式: DNSサーバ名 名前解決ホスト名)
とルートDNSを指定して実行したところ、
権威(1): リソースデータ: A.GTLD-SERVERS.NET
と返ってきて、次に

./resolver-1.pl A.GTLD-SERVERS.NET www.livedoor.com
と実行したところ、
権威(1): リソースデータ: zns05.data-hotel.net
と返ってきて、次に

./resolver-1.pl zns05.data-hotel.net www.livedoor.com
と実行したところ、
回答(1): リソースデータ: 203.131.197.197

と答えの203.131.197.197にたどり着くことが出来ました。
このソースをCに移植して、出来れば一回の入力で、
名前解決が完了できるプログラムを作れるよう今週頑張ってみます。

Perlは以前少し触ったことがありますし、頑張って解読してみようと思います。
806デフォルトの名無しさん:2005/10/24(月) 23:31:48
>>802 せめて MFC は使って良いとか SDK 直叩きだけで作れとか言ってくれないと困る
807デフォルトの名無しさん:2005/10/25(火) 00:41:32
[1] 授業単元: 画像処理プログラミング
[2] 問題文: 24bit BitmapのデータをYUV444,YUV422に変換し保存せよ。
また、YUV444,YUV422のデータを24bit Bitmapに変換し、保存せよ。
[3] 環境
 [3.1] OS: Windows2000
 [3.2] コンパイラ名とバージョン: VC 6.0
 [3.3] 言語: C
[4] 期限: [2005年10月26日11:00まで]
[5] その他の制限: 変換で外部ライブラリ等の使用は禁止

よろしくお願いします。
808デフォルトの名無しさん:2005/10/25(火) 02:07:58
>>807
BitmapとYUV444、YUV422の変換に関しての参考リンク、または説明を。
どうせ授業で何かしら資料提示されてるでしょ?それ出しな。
809デフォルトの名無しさん:2005/10/25(火) 10:55:24
C言語の問題です
Yamada、Yoshizaki、Suzuki、Kato、Kamata、Kuwata、Maeda
をポインタ配列へ登録し、イニシャルを入力するとそのイニシャルを持つ名前のみを表示するプログラムを作成しなさい
なお、イニシャルの入力はmain()関数にて行い、ユーザ関数は、判別表示のみで行なうようにすること。

どなたかオチカラをm(__)m
810デフォルトの名無しさん:2005/10/25(火) 10:57:05
>>809
お前、>>1も読めないのか?
811デフォルトの名無しさん:2005/10/25(火) 10:57:30
[1] 授業単元:プログラム入門
[2] 問題文(含コード&リンク):標準入力からよみこんだ2つの整数除算を行い
その解を小数点20桁まで表示させよ。このプログラムでは、ループを回し挌桁を
その都度計算し表示させよ。但し、途中で割り切れたら以後の小数点は求めず、割る数に
0が入力されたら計算はしない。

[3] 環境
 [3.1] OS: Unix
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: [2005年10月26日20:00まで]

長文すみませんがよろしくお願いします。
812デフォルトの名無しさん:2005/10/25(火) 11:06:35
>>809 >>1通りに書いてないが、折角作ったからやるよ。

#include <stdio.h>
#include <string.h>

void print(int s, char *str[], int n);

int main(void)
{
 char *str[] = {"Yamada", "Yoshizaki", "Suzuki", "Kato", "Kamata", "Kuwata", "Maeda"};
 char buf[128];

 while (1) {
  printf("イニシャルを入力して下さい(Enterで終了): ");
  fgets(buf, sizeof(buf), stdin);
  if (*buf == '\n') break;
  print(*buf, str, sizeof(str) / sizeof(char *));
 }

 return 0;
}

void print(int s, char *str[], int n)
{
 int i;

 for (i = 0; i < n; i++)
  if (s == str[i][0])
   puts(str[i]);
}
813809:2005/10/25(火) 11:11:50
すいません。携帯からだったので1を見る余裕が無くて‥
期限も12時までだったんで助かります。本当にありがとうございました!
いい一日になりそうです
814デフォルトの名無しさん:2005/10/25(火) 11:29:02
>>812
今見返したら、string.hいらないや。ま、いいか。
815809:2005/10/25(火) 11:41:11
ポインタ配列までしか習ってないのでstrやbuf[128]など初見です(汗
Call by Referenceを最近習った。
せっかく力を貸してくれたのにちゃんとデンプレ通りにやらない自分が悪いですね‥すいません。
816デフォルトの名無しさん:2005/10/25(火) 11:42:27
>>811
かなり適当。

#include <stdio.h>

int main(int argc, char **argv)
{
int a,b,c,i;

scanf("%d %d", &a, &b);
if(b == 0) {
fprintf(stderr, "error: divide by 0");
return -1;
}

for(i = 0; i <= 20; i++) {
c = a / b;
a = (a % b) * 10;
printf("%d", c);
if(a == 0) {
break;
}
if(i == 0) {
putchar('.');
}
}
return 0;
}
817809:2005/10/25(火) 11:46:16
実行例1:
イニシャルを入力してください? Z
該当者無し

実行例2:
イニシャルを入力してください? Y
Yamada
Yoshizaki

こういう風なプログラムらしいです。連カキやばいなぁ‥
818デフォルトの名無しさん:2005/10/25(火) 11:56:49
>>817
strはポインタ配列です。それから、bufは入力バッファ。
getchar()では不都合が起きる事があるので、fscanf()にした。

void print(int s, char *str[], int n)
{
 int i, f = 0;

 for (i = 0; i < n; i++)
  if (s == str[i][0]) {
   puts(str[i]);
   f = 1;
  }

 if (!f)
  puts("該当者無し");
}
819816:2005/10/25(火) 12:14:19
>>811
負の数のこと考慮してなかったので訂正。

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int a,b,i;

scanf("%d %d", &a, &b);
if(b == 0) {
fprintf(stderr, "error: divide by 0");
return -1;
}
if((a > 0 && b < 0) || (a < 0 && b > 0)) {
putchar('-');
}
a = abs(a);
b = abs(b);
printf("%d", a/b);
a = (a % b) * 10;
if(a > 0) {
putchar('.');
for(i = 0; i < 20 && a > 0; i++) {
printf("%d", a/b);
a = (a % b) * 10;
}
}
return 0;
}
820デフォルトの名無しさん:2005/10/25(火) 14:14:43
[1] 授業単元:データ構造とアルゴリズム
[2] 問題文(含コード&リンク):
0-1 1-2 2-0
0-3 3-1 1-0
0-2 2-3 3-0
3-2 2-1 1-3
のデータから
0-1 1-2 2-0 0-3 3-1 2-3
の順で抜き出せ。ただしstlの連想コンテナを用いること。

[3] 環境
 [3.1] OS: Win
 [3.2] コンパイラ名とバージョン: VC++
 [3.3] 言語: C++
[4] 期限: [2005年10月25日24:00まで]

長文すみませんがよろしくお願いします。
821デフォルトの名無しさん:2005/10/25(火) 16:05:12
>>820
連想コンテナと言えば、std::mapかstd::multimap(今回はstd::multimapだろう)
になるけど、その抜き出す順序ってのは、どういう規則があるの?
822デフォルトの名無しさん:2005/10/25(火) 16:35:03
>821
0-1と1-0は同じ
1-2と2-1は同じ
2-0と0-2は同じ
0-3と3-0は同じ
3-1と1-3は同じ
2-3と3-2は同じ

格納順は
0-1 1-2 2-0 0-3 3-1 1-0 0-2 2-3 3-0 3-2 2-1 1-3
↑  ↑ ↑  ↑ ↑ ↑ ↑  ↑ ↑  ↑ ↑  ↑
○  ○ ○  ○ ○ × ×  ○ ×  × ×  ×

0-1 1-2 2-0 0-3 3-1 2-3
823デフォルトの名無しさん:2005/10/25(火) 17:27:07
>>822
サンクス。

>>820
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1007.txt
こんなのでどうですか?
データはinput.txtというファイルに入れて読み取るようにしてあります。
824デフォルトの名無しさん:2005/10/25(火) 17:44:16
分数の計算をするプログラムを作ってるんですが約分のしかたがわかりません。
教えて下さい。
825デフォルトの名無しさん:2005/10/25(火) 17:52:49
n を分子、d を分母とすると、
x = gcd(n, d);
n /= x;
d /= x;
gcd は最大公約数。
最大公約数の求め方はぐぐればすぐ出てくると思われ。
826デフォルトの名無しさん:2005/10/25(火) 17:53:52
>>824
約分の定義を考えてみよう
それで得られた数値で分子・分母を割る
827デフォルトの名無しさん:2005/10/25(火) 17:57:08
別に関数を作るってことですか?最大公約数の求め方が分かんないんですけど;;
828デフォルトの名無しさん:2005/10/25(火) 17:59:34
>>827
ユークリッドの互除法を知らないのか。
829デフォルトの名無しさん:2005/10/25(火) 17:59:42
>>827
>最大公約数の求め方はぐぐればすぐ出てくると思われ。
830デフォルトの名無しさん:2005/10/25(火) 18:02:05
わかんないです(;;)
831デフォルトの名無しさん:2005/10/25(火) 18:03:01
832デフォルトの名無しさん:2005/10/25(火) 18:04:13
int gcd(int a, int b)
{
int t;
if(b > a)
{
t = a; a = b; b = a;
}
while (b > 0)
{
int r = a % b;
a = b; b = r;
}
return a;
}
833デフォルトの名無しさん:2005/10/25(火) 18:04:39
わかんないんですけど(;;)

834デフォルトの名無しさん:2005/10/25(火) 18:05:35
ミスった
int gcd(int a, int b)
{
  if(b > a)
  {
    int t = a; a = b; b = t;
  }
  while (b > 0)
  {
    int r = a % b; a = b; b = r;
  }
  return a;
}
835デフォルトの名無しさん:2005/10/25(火) 18:07:02
なんでreturnでaしか返さないのかわかんないんです(;;)
836デフォルトの名無しさん:2005/10/25(火) 18:08:04
だめだこりゃ
837デフォルトの名無しさん:2005/10/25(火) 18:09:07
>>834
最初のifは要らない。

>>835
aの値は途中で変わってるが。
838デフォルトの名無しさん:2005/10/25(火) 18:09:13
ごめんなさい(;;)このばあいaが最大公約数なんですか?
839デフォルトの名無しさん:2005/10/25(火) 18:11:08
このプログラムの説明をお願いしますm(__)m
840デフォルトの名無しさん:2005/10/25(火) 18:11:28
もはやエスパーが必要な領域になってると思われ
841デフォルトの名無しさん:2005/10/25(火) 18:11:37
>>837
if文が無いと収束が悪い
842デフォルトの名無しさん:2005/10/25(火) 18:13:07
>>841
一回余分な除算をするだけだが。
843デフォルトの名無しさん:2005/10/25(火) 18:26:34
>>840
もはやエスパーよりも、クマーのAAの方が適切かもな。

>>842
まあ、ちょこっと841を擁護するなら、除算と比べれば条件分岐の方が処理早い環境もあるわけで。
844デフォルトの名無しさん:2005/10/25(火) 19:02:19
>823
コンソールで動かしてみましたが、0-1としか表示されないです・・・
ソースを拝見したところ、一度データを全部格納してから、更に順に
ペア探索して、見つかったら削除って感じですかね???

自分なりに↑のを元に考えてみたのですが

insertするときに毎回格納したmultimap内でfirstとsecondと対になるペアを探索して
(例えば、最初のデータが0-1なら、multimap内でequal_range(1)で
1-*を検索して、その中からsecondが0のを探すという作業を全データに対して行う)
multimap内に、ペアが無い場合はinsertして、結果出力するなり別個にvectorに格納。
ペアがある場合は何もせずに次に進む。

ちょっとプログラム組んでみます
845デフォルトの名無しさん:2005/10/25(火) 19:08:29
エラーが出てしまうんですけど何が違うんでしょう?
int gcd(FRACTION v){
FRACTION j;
int t;
if(j.numerator >= j.denominator){
do{
t = j.numerator % j.denominator;
j.numerator = j.denominator;
j.denominator = t;
}while(t != 0);
}
j.numerator /= t;
j.denominator /= t;
return j;
}
846デフォルトの名無しさん:2005/10/25(火) 19:11:06
>>845
ク、クマー

まあ、素でやってるんだろうけど。
gcd 関数は最大公約数求めるだけにして、それとは別に
x = gcd(j.numerator, j.denominator);
j.numerator /= x;
j.denominator /= x;
847デフォルトの名無しさん:2005/10/25(火) 19:34:51
俺は先日エスパーの能力を手に入れたばかりだから力が足りないかもしれない。

・関数の引数を FRACTION vとしているのに、次の行からは jを使ってしまっている
  →jを全部vに書き換える。
・関数の戻り値が int型なのに、return jと書いている。
  →return tと書き換える。
あと根本的な問題として、main関数が存在して無いからどんなに頑張っても無理(他に存在してるなら別)
C言語の最初の授業でmain関数が無いと動きませんって習いませんでしたかい

main以外の関数の作り方を習ってないなら、>>834の上下二行づつを無視して書き換えればいい
 if (j.numerator > j.denominator)
 {
  t = j.numerator; j.numerator = j.denominator; j.denominator = t;
 }
 while (j.denominator > 0)
 {
  r = j.numerator % j.numerator; j.numerator = j.numerator; j.denominator = r;
 }
 これを途中に組み込んで、>>846(xをrに置き換えて)を実行。足りない所は補完しる
848844:2005/10/25(火) 20:09:25
>823
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1008.txt

出力結果
0 1
1 2
2 0
0 3
3 1
2 3

とりあえず雑ですが出来ました。ヒント有難う御座いました。
849教えて厨:2005/10/25(火) 21:27:56
[1] 授業単元: 画像処理関係
[2] 問題文(含コード&リンク):

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1009.zip

上のpgm形式サンプル画像ファイルに対して次の3つの処理を行ってください。

(1)画像のノイズをメディアンフィルタ等で取った上で、エッジ検出を行った後のエッジ画像を出力してね。
(2)画像内にちらばっている多角形に対してラベリング処理を行って境界線追跡をするか、
   あるいは図形を切り出すなどしてそれら図形の周囲長・面積・円形度・モーメント、その他自分で考案した特徴を計算してください。
(3)(2)で求めた特徴量から2〜3の特徴を選び、各図形が特徴空間のどこに位置するか表示してね。
   さらに、これらの図形において三角形と円を識別するにはどのような特徴が適当か考察してください。


[3] 環境
 [3.1] OS: Windows/Linux/どちらでも実行できること!
 [3.2] コンパイラ名とバージョン: gccかVC++6.0、bccどれでも動くのが望ましい
 [3.3] 言語: C/C++/どちらでも可
[4] 期限: [2005年10月27日まで]
[5] その他の制限: 制限無し。答えさえ正しければ、何でもOK。
850デフォルトの名無しさん:2005/10/25(火) 21:33:09
>>849
> 画像のノイズをメディアンフィルタ等で取った上で、エッジ検出を行った後のエッジ画像を出力してね。
は?それがお願いする態度か?
やり直せ。
851デフォルトの名無しさん:2005/10/25(火) 21:33:39
>>850
先生の配ったプリントにまんまそう書いてあるとか。
852デフォルトの名無しさん:2005/10/25(火) 21:51:23
YUVの人とかPGMバイナリの人とか、居たなそーいや。
853やり直しました:2005/10/25(火) 22:00:37

[1] 授業単元: 画像処理関係
[2] 問題文(含コード&リンク):

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1009.zip

上のpgm形式サンプル画像ファイルに対して次の3つの処理を行ってください。

(1)画像のノイズをメディアンフィルタ等で取った上で、エッジ検出を行った後のエッジ画像を出力してください。
(2)画像内にちらばっている多角形に対してラベリング処理を行って境界線追跡をするか、
   あるいは図形を切り出すなどして
   それら図形の周囲長・面積・円形度・モーメント、その他自分で考案した特徴を計算してください。
(3)(2)で求めた特徴量から2〜3の特徴を選び、各図形が特徴空間のどこに位置するか表示してください。
   さらに、これらの図形において三角形と円を識別するにはどのような特徴が適当か考察してください。


[3] 環境
 [3.1] OS: Windows/Linux/どちらでも実行できるのが望ましい
 [3.2] コンパイラ名とバージョン: gccかVC++6.0、bccどれでも動くのが望ましい
 [3.3] 言語: C/C++/どちらでも可
[4] 期限: [2005年10月27日まで]
[5] その他の制限: 制限無し。答えさえ正しければよい。
854デフォルトの名無しさん:2005/10/25(火) 22:01:20
>>850
スレは「解いてください」じゃなくて「解かせてください」だから。
勘違いしないように
855デフォルトの名無しさん:2005/10/25(火) 22:05:04
>>854
そういう態度とるんなら、解いてやる義理はないな。
もう来なくていいよ。
856デフォルトの名無しさん:2005/10/25(火) 22:07:33
>>855
折れは単なる閲覧者 >>853ではない
むしろ「解いてやってる」とか勘違いしてる喪前が来るなよ
857デフォルトの名無しさん:2005/10/25(火) 22:07:51
>>855
最初から「解いてやる義理」はないんだから
お前こそ来なくていいと思う。
858デフォルトの名無しさん:2005/10/25(火) 22:09:51
だが元々このスレの目的は「解かせてください」だぞ?「解いてやってる」
と勘違いするヤツは今直ぐこのスレから出てけ
859853:2005/10/25(火) 22:10:33
自己解決しました。
860デフォルトの名無しさん:2005/10/25(火) 22:11:09
まあ・・・気に入らんときはスルーな。
発注、受注、閲覧者ともに。

発注側は受注側の確認には答えたほーがいいとは思うが。
861デフォルトの名無しさん:2005/10/25(火) 22:13:59
>>858
えーと、どこにそんなこと書いてあるのかな。
テンプレの注意点の2番目には、解いてもらう方、になっているな。
862デフォルトの名無しさん:2005/10/25(火) 22:14:37
>>858
お前が勘違いしているんだよ。
恥ずかしいから出ていってくれない?
863デフォルトの名無しさん:2005/10/25(火) 22:16:48
>>861-862
最近移住してきた香具師か?
864デフォルトの名無しさん:2005/10/25(火) 22:21:15

  このスレは、スレ住人の良心によって、課題が解けない哀れな人を助ける目的でたてられたものです。
  質問者は解答者に対しては感謝の気持ちを忘れてはいけません。
  解答者は良心を忘れてはいけません。
865デフォルトの名無しさん:2005/10/25(火) 22:21:20
もともとCやC++スレに宿題を質問する奴がウザいので作られた隔離スレ
煽るのも答えるのもご自由に。
866デフォルトの名無しさん:2005/10/25(火) 22:21:40
あなたが解けないC/C++の宿題を片づけます

何度読んでも解いてあげますではないな。解かさせてくださいでもないが、
どっちかというと質問者の方が立場は上だナ
867デフォルトの名無しさん:2005/10/25(火) 22:22:56

  これはある種のボランティア活動です。
  2ちゃんねるとは素晴らしいボランティア団体なのです。
  感謝されることが私たちスレ住人の一番の宝物です。
868デフォルトの名無しさん:2005/10/25(火) 22:24:34
まあ、気が向いたら解いてやるよってスレだろ?
発注元は受注側の質問には真摯に答えろよ
869849&853です:2005/10/25(火) 22:29:47
よくわからない議論がはじまっていますが、
私は849と853しか書き込んでません。
そのほかの書き込みは私とは関係がございません。

859で勝手に自己解決したことにされていますが、
もちろん自己解決していませんし、
ふんぞりかえって「解きたまえ」という高圧的態度で
問題を提示しているつもりもありませんので、
ひきつづき皆様の好意のアドバイスを頂きたく思います。
どうぞよろしくお願いいたします。
870デフォルトの名無しさん:2005/10/25(火) 22:29:51
>>867
***白い腕輪でも買ってろ
871教えて厨:2005/10/25(火) 22:30:57
自己解決しました。
872デフォルトの名無しさん:2005/10/25(火) 22:31:40
教えて厨なんて名前にしておいてそんなつもりは無いだと?
頭の隅からすみまで腐ってやがる
873デフォルトの名無しさん:2005/10/25(火) 22:33:01
テンプレ案
あなたが解けないC/C++の宿題を片付けます

【重要】
気に入らない質問や発言はスルーしましょう

【質問者へ】
回答者の便宜のため、質問の際は以下を守ることを推奨します。

・質問は【質問テンプレ】に従ってください。
・問題文は、わかりやすいように全文を書きましょう。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
874デフォルトの名無しさん:2005/10/25(火) 22:35:49
質問者は全員トリップを付けるようにするのはどうだろうか。
875デフォルトの名無しさん:2005/10/25(火) 22:39:27
板がID表示制なら面倒がなくていいのだが
876デフォルトの名無しさん:2005/10/25(火) 22:40:05
>>874トリップは万能薬ではない。

>>868
そだね。気が向いたら解く。
資料が添付されてなかったり、態度が悪かったすると、気が向かないな。

まあ、気が向かんでも、ネタになるようだったら、無駄な努力はするか。
センセの名前だしてみたり、解答できてるのに画像しか出さんかったり。

かつてコピー!コピー! でいい味だしてたセンセも居るなぁ・・・。
877デフォルトの名無しさん:2005/10/25(火) 22:41:11
なんで教科書に載ってそうな内容を質問するんだよ。ていうか、教科書よめ。
878教えて厨 ◆AU/OjWxByc :2005/10/25(火) 22:45:33
なぜか荒らされていますが、
自己解決したと勝手に宣言しているのは私ではありません。
ひきつづき悩んでいます。助けを求む。
879教えて厨 ◆AU/OjWxByc :2005/10/25(火) 22:47:17

[1] 授業単元: 画像処理関係
[2] 問題文(含コード&リンク):

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1009.zip

上のpgm形式サンプル画像ファイルに対して次の3つの処理を行ってください。

(1)画像のノイズをメディアンフィルタ等で取った上で、エッジ検出を行った後のエッジ画像を出力してください。
(2)画像内にちらばっている多角形に対してラベリング処理を行って境界線追跡をするか、
   あるいは図形を切り出すなどして
   それら図形の周囲長・面積・円形度・モーメント、その他自分で考案した特徴を計算してください。
(3)(2)で求めた特徴量から2〜3の特徴を選び、各図形が特徴空間のどこに位置するか表示してください。
   さらに、これらの図形において三角形と円を識別するにはどのような特徴が適当か考察してください。


[3] 環境
 [3.1] OS: Windows/Linux/どちらでも実行できるのが望ましい
 [3.2] コンパイラ名とバージョン: gccかVC++6.0、bccどれでも動くのが望ましい
 [3.3] 言語: C/C++/どちらでも可
[4] 期限: [2005年10月27日まで]
[5] その他の制限: 制限無し。答えさえ正しければよい。
880デフォルトの名無しさん:2005/10/25(火) 22:52:35
tu-ka何処の学校の宿題?そんな問題出すセンセーいるのか?
ひょっとして画像関係を取り扱った会社の開発で必要だから宿題なのか?
問題見ると"学校の宿題"かどうかはかなり怪しく見えるんだけど
881デフォルトの名無しさん:2005/10/25(火) 22:59:14
>>879
質問者はどういう情報があれば回答を得られるか考えて欲しいもんだが。
以下のものに関する資料が足りないので、どうしようもない。

・メディアンフィルタ
・画像の読み書き
・エッジ検出、ラべリング処理、境界線追跡
・特徴量とはどういうものか
・図形の周囲長・面積・円形度・モーメント

ソースコードや、解説文をもらってるハズだから、提示するように。
882教えて厨 ◆AU/OjWxByc :2005/10/25(火) 23:00:28
>880

とある三流大学の画像関連の科目の宿題です。
C言語で学ぶ実践画像処理というオーム社の本に
よく似たサンプルがあるんですが、プログラミングが苦手で自力で組めません。
お願いだから力を貸して〜
883デフォルトの名無しさん:2005/10/25(火) 23:02:48
>>881
その他の制限は無いんだから、適当にすりゃいいんだよ。
お前はいちいち あーしろこーしろ と言われないとできないのか?
まぁ、会社人なら底辺の仕事しかしていないだろうし、学生なら本当に課題しかしないクズなんだろうな。
884デフォルトの名無しさん:2005/10/25(火) 23:04:39
先生が趣味で考えてぶち当たった問題を学生に解かしてみようって魂胆だろ。
885デフォルトの名無しさん:2005/10/25(火) 23:04:42
じゃあまずそのオーム社のサンプルをとりあえず書いてどっかにウプしてくれ とりあえずは
後は>>881の言う以下の資料
・メディアンフィルタ
・画像の読み書き
・エッジ検出、ラべリング処理、境界線追跡
・特徴量とはどういうものか
・図形の周囲長・面積・円形度・モーメント
886デフォルトの名無しさん:2005/10/25(火) 23:06:17
三流大学の宿題とは思えないわ(汗
887デフォルトの名無しさん:2005/10/25(火) 23:08:50
>>885
おいおい、上から3つまでは別段難しい事無いじゃないか
てか、そこまで判らん奴が手を出して終わる様な問題じゃないぞ
ここで聞くより、画像関係スレで相談してアイデアを出してもらう方が良い位の内容
888デフォルトの名無しさん:2005/10/25(火) 23:09:56
>>885
pgmの読み書きくらい、常識として知っておくといいよ。
889デフォルトの名無しさん:2005/10/25(火) 23:11:51
そういば、むか〜しにpgm読み書き含む、宿題用のライブラリ作ったなぁ。一回しか使ってないけど。
890デフォルトの名無しさん:2005/10/25(火) 23:12:32
メディアンフィルタって行列計算するだけじゃなかったっけ?
9マスでラスタスキャンしながら。
891教えて厨 ◆AU/OjWxByc :2005/10/25(火) 23:32:02
>881
・メディアンフィルタというのは注目画素の周囲8近傍の画素値を並べたときの中間値を
注目画素の新たな画素値に置き換えるというフィルタだと思います。
・画像はpgm形式です。pgm形式で開いて、pgm形式で出力画像を出力してください。

・エッジ検出については
http://www.f-kmr.com/dsp_edge.htm
↑ここか、
http://homepage2.nifty.com/gimpman/31.html
ここなんかが参考になるかも。エッジ検出とここで言っているけど、輪郭抽出という言い方のほうがポピュラーかもしれません。

・ラベリング処理ラベリングはここが詳しい?↓
http://www.microsoft.com/japan/msdn/academic/Articles/Algorithm/03/

・境界線追跡
ラベリングで得られた図形の輪郭を一筆書きのようにたどって一周するように追跡
するという意味だと思う。その間通った画素の数をカウントして周囲長とするのかも。

・特徴量とは
周囲長や画像の面積、円形度、ピクセル画像のモーメントなどなどの
画像の特徴の度合いを現すような、なんらかの計算で得た量。
図形の周囲長はたぶん、図形の輪郭の画素数をカウントしたものでいいとおもいます。
図形の面積は図形の輪郭の内側の画素数と輪郭の画素数の合計。
円形度とは
http://cutie.dip.jp/pc/image/13.php
↑こういうものです。画像のモーメントとかも↓このへんがあるけど、分かりにくいかな
http://mikilab.doshisha.ac.jp/dia/research/person/shuto/research/0605/tokutyo.html

ソースコードは貰っていません。C言語で学ぶ実践画像処理というオーム社の本が参考になりそうでした。
892教えて厨 ◆AU/OjWxByc :2005/10/25(火) 23:39:19
自分で考案した特長量も使えという風になっているのですが、
大したものじゃなくてもいいはずだと思います。
黒画素の比率を数えて黒濃度だとかそういうのでかまわないと思います。
893デフォルトの名無しさん:2005/10/25(火) 23:43:12
他人事モードだな
894デフォルトの名無しさん:2005/10/25(火) 23:48:18
単位はでないよ
895デフォルトの名無しさん:2005/10/26(水) 00:41:18
>C言語で学ぶ実践画像処理というオーム社の本が参考になりそうでした。

んー。参考になるかもしれんが、俺もってねぇし(笑)
・・・もうちっとアタマ使おうな。

896デフォルトの名無しさん:2005/10/26(水) 01:50:10
>>807
宿題を解く側は多分YUV形式からから24bitRGBに展開するところだけしか興味が持てない
897デフォルトの名無しさん:2005/10/26(水) 02:05:36
はじめから知っていることにはまったく興味が持てない。
898デフォルトの名無しさん:2005/10/26(水) 02:08:25
あとはただの作業…
899デフォルトの名無しさん:2005/10/26(水) 02:10:29
大学のC言語の授業でわからない問題があったんだが
誰か助けてくれ
1年だから相当簡単だと思われる
UNIX環境です。

getcharで入力された数字文字をカウントするってやつなんだが
例えば
112233
4455
って感じに途中で改行があった場合に
改行前の数字だけ読み込ませる、って感じ。
要するに上の2行の数字をうったあとCtrl+D押すと
1が2個、2が2個、3が2個、あとは0個って感じに認識させるわけです。
どうやっても2行分全部カウントしてしまう・・・。誰かお助けお願いします。
900デフォルトの名無しさん:2005/10/26(水) 02:16:02
901デフォルトの名無しさん:2005/10/26(水) 02:33:37
>>900
あ、ごめん
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):>>899
[3] 環境
 [3.1] OS: UNIX(UNIXの何てOSなのかは不明)
 [3.2] 不明(gcc?)
 [3.3] 言語: C
[4] 期限: 10月28日
[5] その他の制限: まだ全然習ってません。ポインタの手前って感じです。
902デフォルトの名無しさん:2005/10/26(水) 03:03:49
>>901
#include <stdio.h>
int main(void)
{
  int count[256], i;
  char c;
  for(i=0;i<256;i++)count[i]=0;
  while(c=getchar()) {
    if(c=='\n')break;
    count[c]++;
  }
  for(i=0;i<256;i++)
    if(count[i])
      printf("%cは%d個ありました。\n",(char)i,count[i]);
  return 0;
}
903デフォルトの名無しさん:2005/10/26(水) 03:04:56
未確認だけど、改行前の数字だけ認識させる方法ならこうかな

#include <stdio.h>
#include <ctype.h>

int main() {
    int c, hist[10] = {0};
    
    while(c = getchar(), c != EOF && c != '\n')
        if (isdigit(c))
            hist[c-'0']++;
    
    for(c = 0; c < 10; c++)
        printf("%dx%d\n", c, hist[c]);

    return 0;
}
904デフォルトの名無しさん:2005/10/26(水) 10:35:17
[1] 授業単元:プログラミング演習
[2] 環境
 [2.1] OS: LiNUX
 [2.2] コンパイラgcc
 [2.3] 言語: C
[3] 期限: 10月27日午後4時
[4] 問題文:
画面上で、出力時のファイル名を入力後、任意の長さの文章(半角英数字のみでも良い)を入力し、
最後にQUITを入力することで、入力した文章データを先に入力したファイル名(拡張子はtxtとする)のascii形式データファイルとして保存し終了するプログラムを作成し、実行しなさい。
ここでは、文字入力に応じてメモリ領域の確保を繰り返し、文字列データを可変長配列に格納すること、
その文字列を格納する構造体は、以下のように定義できる。また、メモリ領域の確保は、
標準関数であるmallocを使うこと。

struct Textdata
{
char textline[NN]; /* 記述する文章の1行分の文字列 NNは1行の最大文字数+1 */
struct Textdata*NextP /* NextPは次の要素へのポインタ */
}

職人さんお願いします<(_ _)>
905デフォルトの名無しさん:2005/10/26(水) 12:10:35
とりあえず教官を殴ってこい
言ってることが無茶苦茶だ
906デフォルトの名無しさん:2005/10/26(水) 12:11:58
>>905
殴ってきました。次にすべき事は何でしょうか?
907デフォルトの名無しさん:2005/10/26(水) 12:22:11
可変長配列を使うのか「以下の構造体」とやらを使うのかはっきりさせる
908デフォルトの名無しさん:2005/10/26(水) 13:27:25
終了にはわざわざ2バイト文字でQUITを入力するのかな?
909デフォルトの名無しさん:2005/10/26(水) 13:41:55
4バイト文字かもね
910デフォルトの名無しさん:2005/10/26(水) 13:45:00
UTF-8かもしれないな。これぞ本当の可変長文字ww
911デフォルトの名無しさん:2005/10/26(水) 15:31:23
>>902-903
まじありがと
明日大学でやってみます。
912デフォルトの名無しさん:2005/10/26(水) 16:57:04
2〜100までの数字で素数を表示するプログラムを授業の課題でC言語を作るように言われたんですが、
ヒントをベースにして次まで作って見たんですが…

#include<stdio.h>
#include<math.h>
main()
{
int a,i,flag;

for(a=2 ; a<=100 ;a++){


flag=0;
for(i=2 ;i<=a-1;i++){
if( (a%i) == 0 ){;
flag=1;
break;
}
}

}

if(flag){
printf("%d is a prime number.\n",a);

最後から二行目の if(flag〜)の〜に何か付け加えないと
うまくプログラムが働いてくれないのですが…
何を入れればよいか全く分かりません…。
教えてください。
913デフォルトの名無しさん:2005/10/26(水) 16:58:42
>>912
if (!flag) {
914デフォルトの名無しさん:2005/10/26(水) 17:00:25
913 して括弧対応させたら動いたよ
915デフォルトの名無しさん:2005/10/26(水) 17:01:20
int main(void){
int i;
double x,y,x0=0.5,y0=0.5;
double a=0.8,b=0.8;
double N=1000;
double ignore=N/10;
x=x0;y=y0;
for(i=1;i<N;i++){
printf("%f %f \n",x,y);
if(x>=0 && x<=0.5){
x=2*a*x;y=(1/2)*b*y;}else{
x=a*(2*x-1);y=(1/2)*b*(y+1);
}
}
return0;
}

0に収束してるわけでもないのに
なぜかYの値が0になってしまいます・・・なぜでしょうか
916デフォルトの名無しさん:2005/10/26(水) 17:03:48
質問する前に>>1を読め
917デフォルトの名無しさん:2005/10/26(水) 17:06:49
[1] 授業単元:プログラミング演習
[2] 環境
 [2.1] OS: WindowsXP
 [2.2] コンパイラ gcc
 [2.3] 言語: C
[3] 期限: 10月27日午後6時
[4] 問題文: >>915の計算プログラムを完成

です。失礼しました。
918デフォルトの名無しさん:2005/10/26(水) 17:10:49
>>904
それやとメンバーの順番がおかしいがな
struct line
{
  struct line *next;←普通はこれが先
  char text[1]; /* 可変長 */
};


それより、デスマ明けにプロジェクトが頓挫してしもた
10年やってるけどこんなアホなん初めてやわ
もっと早うに連絡してくるんが常識やんけ
ブ゙ツブツブツブツブ゙ツブツブツブツ
ブ゙ツブツブツブツブ゙ツブツブツブツ
ブ゙ツブツブツブツブ゙ツブツブツブツ
ブ゙ツブツブツブツブ゙ツブツブツブツ
・・・そや、勝手に帰ってしもたろ
919デフォルトの名無しさん:2005/10/26(水) 17:15:51
>>915
1/2 = 0 (int)
920デフォルトの名無しさん:2005/10/26(水) 17:20:12
>>919
intは i だけにしかしてませんから、それは違うと思います。i をdoubleにしても同じ結果でした。
実際に計算する値x,yはdoubleなのでそのようなことは無いかと・・・
921920:2005/10/26(水) 17:25:16
と思ったら、1/2を0.5に変えたらうまくいきました。そういうことだったんですね。

どうみても1/2 = 0 (int)です
本当にありがとうございました。
922名無し:2005/10/26(水) 17:41:06
[1] 授業単元:電卓
[2] 問題文:
  入力:二つの10進数(非負の整数、4桁以下で符号無し)を加算記号"+"、減算記号"-"、で連結し最後に等号を付け加えた式を文字列として入力。
  操作:入力された文字列から加算記号、減算記号、等号を区切り記号として二つの10進数を文字列として切り出す。
     切り出した文字列を数値に変換する。加減算を行って結果を計算。
  出力:計算結果を等号"="の後ろに出力。
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: [2005年10月29日9:00まで]
[5] その他の制限:特にはありません。
ちょっとわからないので、よろしくお願いします。

923デフォルトの名無しさん:2005/10/26(水) 20:12:43
>>922
ろくにエラーチェックもしてないし冗長だと思うから、まぁ参考程度にしてくれ
最近Pascalばっかやらされてて感覚が鈍ってた_| ̄|○

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main(void)
{
char expr[80];
int i, op1=0, op2=0, len, flag = 0;

fgets(expr, 80, stdin);
len = strlen(expr) - 1;
expr[len] = '\0';

for (i=0;i<len;i++) {
if (isdigit(expr[i])) {
if (!(flag & 1)) {
op1 = op1*10 + (expr[i] - '0');
} else {
op2 = op2*10 + (expr[i] - '0');
}
continue;
}

924デフォルトの名無しさん:2005/10/26(水) 20:14:26
>>923の続き

if (expr[i] == '+') {
flag |= 1;
flag |= (1<<1);
continue;
} else if (expr[i] == '-') {
flag |= 1;
flag |= (1<<2);
continue;
} else if (expr[i] == '=') {
if (flag & (1<<1)) {
printf("%s %d\n", expr, op1+op2);
} else {
printf("%s %d\n", expr, op1-op2);
}
break;
}
/* Error handling */
puts("Syntax Error!");
return -1;
}
return 0;
}
925デフォルトの名無しさん:2005/10/26(水) 20:16:04
>>922
ソース貼ってから気づいたが、わざわざ切り出さないとダメだったのか・・・
ちょっと問題有りだが配列2つ用意して、strtokで切り出すのが手っ取り早い希ガス

参考にもならんな・・・_| ̄|○
926904:2005/10/26(水) 20:25:38
あら、やっぱり言ってることむちゃくちゃなんですか。
ほんとにわけわからん教授でして、、、、

あぁこれはどうしよう・・・
927デフォルトの名無しさん:2005/10/26(水) 21:40:17
「可変長配列ってリスト構造のこと言ってます?」と聞いてこい。
928デフォルトの名無しさん:2005/10/26(水) 23:08:22
>>926
問題の言うことは判らんでもないんだが、プログラムの仕様にviかぶれだと思える頭の悪さがある。
また、文言の脳内置換や脈絡の補完が必要な部分もある。
少なくとも問題の文言通りに組める人はまず居ない。
929名無し:2005/10/26(水) 23:12:59
>>925
参考にさせてもらいます。ありがとうございました。
strtokで切り出すと簡単なプログラムになるのですか?
930904:2005/10/26(水) 23:14:45
ふーむ、なるほど・・・
おっしゃることは飲み込めました。

脳内置換とか想像でも構わないので
骨組みなど作れないでしょうか?(´Д⊂
931デフォルトの名無しさん:2005/10/26(水) 23:18:14
>>929
別にそんなことは無いと思うが
ただ、俺のソースだと演算子で分けて2つのオペランドを切り出すという行程を経ずに
直に2つのオペランドを数値として取り出してるから要件的にどうかね?と
932名無し:2005/10/26(水) 23:29:27
文字列を数値に変換する過程を省けるということでしょうか?
まだ、Cをはじめたばかりなのでこのような質問をしてすみません
933デフォルトの名無しさん:2005/10/26(水) 23:36:49
>>930
/*
 ・可変長配列=リスト構造と仮定
 ・1行あたり最大255文字(改行含む)と仮定
 ・行の入力が"QUIT"と完全一致した場合に入力終了するものと仮定
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#defineNN256
struct Textdata
{
char textline[NN]; /* 記述する文章の1行分の文字列 NNは1行の最大文字数+1 */
struct Textdata*NextP;/* NextPは次の要素へのポインタ */
};

void cleanup_textdata(struct Textdata *p)
{
struct Textdata *p_sav;
while(p) {
p_sav = p;
p = p->NextP;
free(p_sav);
}
}
934933:2005/10/26(水) 23:38:01
int main(int argc, char **argv)
{
struct Textdata *head = NULL, **p = &head;
FILE*fp;
charfilename[32+4];

scanf("%s\n", filename);
strcat(filename, ".txt");
while(1) {
if(!(*p = (struct Textdata *)malloc(sizeof(struct Textdata)))) {
cleanup_textdata(head);
return -1;
}
fgets((*p)->textline, NN, stdin);
if(!strcmp((*p)->textline, "QUIT\n")) {
free(*p);
*p = NULL;
break;
}
p = &((*p)->NextP);
}
if(!(fp = fopen(filename, "w"))) {
cleanup_textdata(head);
return -1;
}
for(p = &head; *p; p = &((*p)->NextP)) {
fputs((*p)->textline, fp);
}
fclose(fp);
cleanup_textdata(head);
return 0;
}
935default新規:2005/10/27(木) 00:08:11
すみません。。こんな課題なのですが出来ますでしょうか?
急に単元が進んで、結構ピンチです。。
性能比較というのは、どういうことなのでしょうか?
[1] 授業単元: 再帰と木
[2] 環境 Windows VC6.0
[3] 言語:C
[4] 期限: [2005年10月27日23:59提出期限なのですが、出来れば23時ぐらいまでに。。] または [無期限] のいずれか (「できるだけ早く」は不可)
[5] その他の制限:標準ライブラリ使用可
★課題★プログラム10 と プログラム11 の性能比較を行え。
【例】
[user@mypc ~] ./a.out 35
f(35)= 9227465
[user@mypc ~] time ./a.out 35
f(35)= 9227465
1.330u 0.032s 0:02.43 55.9% 0+0k 0+0io 0pf+0w

★再帰呼出し版 (プログラム10)
int F(int i){
if (i < 1) return 0;
if (i == 1) return 1;
return F(i-1) + F(i-2);}

★トップダウン動的計画法(プログラム11)
int F(int i){
int t;
if (knownF[i] != unknown) return knownF[i];
if (i == 0) t = 0;
if (i == 1) t = 1;
if (i > 1) t = F(i-1) + F(i-2);
return knownF[i] = t; }
宜しくお願いします(M_M)
936デフォルトの名無しさん:2005/10/27(木) 00:09:44
繧ィ繝ウ繧ウ繝シ繝峨☆繧九→隱ュ繧√∪縺吶°?シ?
937デフォルトの名無しさん:2005/10/27(木) 01:34:35
>>935
実際、どんな呼び出しが行われるか数える。プログラムをちょいと変更して
int F(int i){
static count=0;
printf("i = %d (%d 回目の呼び出し)\n", i, ++count);
 :
}
みたいにすれば分かる。で、両方のプログラムについて引数を少しずつ増やしながら
その増え方を見ればいいのでは?
あとは元のプログラムを使って、例にあるように time で実際にかかる時間の伸びを見るとか。
n を入力とした場合、プログラム10は O(2^n)、 プログラム11は O(n) くらいになると思う、多分。

あとはメモリ効率…っていっても、メモリが問題になるような環境だと時間が
洒落になってないだろうなぁ…ということで私は放置。
938default新規:2005/10/27(木) 06:17:20
有難うございます。実際に、実行すると、どの程度の差が出るものなのでしょうか。
もし、実行された方がいらっしゃいましたら、教えて頂けませんか?
939デフォルトの名無しさん:2005/10/27(木) 06:30:17
>>938 自分で試そうね
940POPP:2005/10/27(木) 10:27:16

[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
ファイルの先頭からテキストを1行ずつ読み込み、何行目の何文字目に検索文字列の先頭が存在するか出力する。
探索文字列中に同じ文字が含まれる場合について検索方法を改良する。

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm?
の投稿者POPPです。
[3] 環境
 [3.1] OS: Windows/UNIX
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C言語
[4] 期限: [2005年11月2日24:00まで]
[5] その他の制限: 特にないと思います。
わかりません。お願いします。
941名無し:2005/10/27(木) 12:44:21
>>931
文字列を読み込み、整数か記号であるかを判断(isalpha,isdegit等)、次に数字を数値変換(strtoi,strtol等)でその後、演算記号に従って計算と言われたので、strtolを使ったプログラムの方をのせていただけないでしょうか?
せっかく、作っていただいたのですが、お願いできないでしょうか?
942デフォルトの名無しさん:2005/10/27(木) 14:06:08
ある整数値を入力し、その値分の整数型データ用のメモリ領域を動的に確保せよ。
次に各領域に順に1、2、3、… の整数を代入した後、それらの値を逆順に表示するプログラムを作成せよ。
943デフォルトの名無しさん:2005/10/27(木) 14:53:38
>>942
これは何?
944デフォルトの名無しさん:2005/10/27(木) 15:05:43
セキュリティホール残しっぱの形で>>942をエスパーしてみる。
ちゃんと書いて欲しければ>>1見ろ。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i,length, *arrray;
scanf("%d",&length);
array=(int*)malloc(length * sizeof(int));
for(i=0;i<length;i++)array[i]=i+1;
for(i=length-1;i>=0;i--)printf("%d,"array[i];
return 0;
}
945デフォルトの名無しさん:2005/10/27(木) 17:23:23
兄貴すげー力だ・・・
それしかないよ('A`)
946デフォルトの名無しさん:2005/10/27(木) 18:33:19
>>942
感謝しろ作ってやったぞ

#include <vector>
#include <cstddef>
#include <iostream>
#include <algorithm>
#include <boost/lambda/lambda.hpp>

int main(){
 std::size_t length;
 std::cin >> length;
 int i = 0;
 std::vector<int> v;
 std::generate_n(std::back_inserter(v), length, boost::lambda::var(i)++);
 std::copy(v.rbegin(), v.rend(), std::ostream_iterator<int>(std::cout));
}

最後1行は↓でも
std::for_each(v.rbegin(), v.rend(), std::cout << boost::lambda::_1);
947デフォルトの名無しさん:2005/10/27(木) 19:31:22
>>940
#include <stdio.h>
#include <string.h>
#define BUF_SIZE 256
int main() {
  FILE *fp = fopen("in.txt", "r");
  char *key = "keyword";
  char buf[BUF_SIZE];
  int i, j, l, n, m = strlen(key);
  for (l = 1; fgets(buf, BUF_SIZE, fp); ++l) {
    int n = strlen(buf);
    for (i = 0; i + m < n ; ++i) {
      for (j = 0; j < m; ++j) 
        if (buf[i+j] != key[j]) break;
      if (j == m) 
        printf("%s found in %d.%d\n", key, l, i);
    }
  }
}
948島野:2005/10/27(木) 20:25:35
[1] 授業単元:卒研
[2] 問題文(含コード&リンク): RSA暗号の鍵の作成、暗号化、復号化
[3] 環境
 [3.1] OS: FreeBSD
 [3.2] コンパイラ名とバージョン: gcc 3.3.3らしい
 [3.3] 言語: c
[4] 期限: [2005年11月6日24:00まで]
[5] その他の制限: あまり知識が無いんで、量が多くてもできるだけ分かりやすくお願いします。
949デフォルトの名無しさん:2005/10/27(木) 20:31:04
>>948
ネタか?ほんとに卒研ならOpenSSLのソースでも読んで自力でどうにかしろよ
950デフォルトの名無しさん:2005/10/27(木) 20:34:21
>>948
RSA社によるリファレンス実装(rsarefという名前で出回っているはず)
を参考にするというか丸パクするしかないだろう。
全部で3000行強のソースだ。

ここでの回答は期待しないように。
951デフォルトの名無しさん:2005/10/27(木) 20:36:21
>>940
著カーニハンあたりの本読めば一発w
952デフォルトの名無しさん:2005/10/27(木) 20:43:50
>>948
参考に。JavaScriptによる1024-bit RSA実装
PigPGP 0.2.3
http://www.faireal.net/demo/PigPGP/
953デフォルトの名無しさん:2005/10/27(木) 21:01:57
[1] 授業単元:プログラミングU
[2] 問題文:
 ある整数値を入力し、その値分の整数型データ用のメモリ領域を動的に確保せよ。
次に各領域に順に1、2、3、… の整数を代入した後、それらの値を逆順に表示するプログラムを作成せよ。

[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:10/29まで
[5] その他の制限:
include <stdio.h>
int main (void)
{
で始めてください。

よろしくお願いします。

954デフォルトの名無しさん:2005/10/27(木) 21:18:13
[1] 授業単元:ネットワーク
[2] 問題文(含コード&リンク):
以下のようなウェブサーバーを作りなさい。
#ブラウザからHTTPのリクエスト1つのみを受け付ける。
#サーバーのファイルシステムからリクエストファイルを受け取る。
#そのリクエストファイルのヘッダーラインを表示するHTTP responseメッセージをつくる。
#クライアントに直接、それを送る。
[3] 環境
 [3.1] OS: Linuxが好ましいけどWindowsでも可。
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 明日。
[5] その他の制限: レベル等に制限はなし。
見よう見まねで途中までやったファイルがここにあります。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1013.txt
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1014.txt
どうかお願いします。
955953:2005/10/27(木) 21:19:48
ちなみに僕は942とは別人です。
956デフォルトの名無しさん:2005/10/27(木) 21:20:28
[1] 授業単元:プログラミング1
[2] 問題文:
  文字列strの中に、文字cが含まれている個数(含まれていなければ0とする)を返す
  関数 int str_chnum(const char str[],int c)
を作成せよ
 

[3] 環境
 [3.1] OS:UNIX
 [3.2] コンパイラ:cc
 [3.3] 言語:C
[4] 期限:30日
[5] その他の制限:

  市販のテキストの問題なのですが、
  文字cといっているのに仮引数がint c な意味がわかりません。

よろしくお願いします。
957デフォルトの名無しさん:2005/10/27(木) 21:24:22
>>956
細かい事を気にするな
958デフォルトの名無しさん:2005/10/27(木) 21:29:05
int str_chnum(const char str[],int c)
{
int count=0;
char *p=str;

for(;*p!='\0';p++){
if(*p==(char)c)count++;
}
return count;
}
959デフォルトの名無しさん:2005/10/27(木) 21:29:36
Σ(;゚Д゚)const!
960浩輔:2005/10/27(木) 21:32:14
[1] 授業単元:卒業研究です
[2] 問題文(含コード&リンク):フラクタル画像圧縮により生じた画像劣化の復元について。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:どちらでも可
[4] 期限:2005年10月28日12:00まで
[5] その他の制限:画像についてまったくの初心者です。画像の反転とA値化処理までは作ることができました。お願いします。
961デフォルトの名無しさん:2005/10/27(木) 21:32:21
>>956
文字処理関数はEOFを返すものがあったりするのでintで行われることが多い
962デフォルトの名無しさん:2005/10/27(木) 21:41:38
int str;

while ((str = getchar()) != EOF) {
putchar(str);
}
こういうやつだよ int を使うのは。char str でも通るけどね
EOF は -1 だから
963デフォルトの名無しさん:2005/10/27(木) 21:43:04
すごい変数名のつけ方だな
964デフォルトの名無しさん:2005/10/27(木) 21:44:40
>>956
俺もその本もってるよw
3日前くらいにその問題やったよ
○○○○の極意だろ?
965デフォルトの名無しさん:2005/10/27(木) 21:53:14
>>958
ありがとうございます。それを参考に
#include<stdio.h>
int str_chnum(const char str[],int c);

main(){
char s[30];
int ch;

printf("文字列を入力\n"); scanf("%s",s);
printf("検索する文字を入力\n"); scanf("%d",&ch);

printf("%d文字あります\n",str_chnum(s[30],ch));
}
int str_chnum(const char str[],int c)
{
       int count=0;
       char *p=str;

       for(;*p!='\0';p++){
           if(*p==(char)c)count++;
       } 
       return count;
}
このようにしたのですが、エラーが出ずにコンパイルは通っても、文字列を数えてはくれません。
考えてはいるのですが、なぜ通らないかわかりません。
よろしくお願いします。

>>961-962
ありがとうございます。

>>964 たぶん違うと思います。ナニナニの極意ではないです。
966デフォルトの名無しさん:2005/10/27(木) 22:04:33
>>965
> printf("%d文字あります\n",str_chnum(s[30],ch));
→printf("%d文字あります\n",str_chnum(s,ch));
967デフォルトの名無しさん:2005/10/27(木) 22:05:06
scanf("%d",&ch);

scanf("%c",&ch);
では?
968956:2005/10/27(木) 22:14:02
>>966
なんかwarningが出なくなりました。
ありがとうございます。

>>967
int ch
は関数int str_chnumの仮引数なのですが、問題文の文字cをint cで扱うために
int型で入力させています。
正直、問題文の意味がわからないのですが>>961-962さんの話のように
とりあえずintで扱ってからcharにキャストしています。
969デフォルトの名無しさん:2005/10/27(木) 22:22:09
>>965
Σ(´□`;) ハウ
違ったの!?
吊ってきます('A`)
970デフォルトの名無しさん:2005/10/27(木) 22:36:16
>>953
分かりにくい説明だな…。
取り敢えずこんな感じか?

#include<stdio.h>
int main(void) {
int size = 0;
int *buf;
printf("数値を入力:");
scanf("%d", &size);
if(0 >= size || (buf = (int*)malloc(sizeof(*buf))) == NULL) return 1;
for(i=1; i <= size; i++)
*buf++ = i;
while(*(--buf) != 1) printf("%d, ", *buf);
printf("%d\n", *buf);
return 0;
}

試して無い。
971名無し:2005/10/27(木) 22:48:14
[1] 授業単元:電卓
[2] 問題文:
  入力:二つの10進数(非負の整数、4桁以下で符号無し)を加算記号"+"、減算記号"-"、で連結し最後に等号を付け加えた式を文字列として入力。
  操作:入力された文字列から加算記号、減算記号、等号を区切り記号として二つの10進数を文字列として切り出す。
     切り出した文字列を数値に変換する。加減算を行って結果を計算。
  出力:計算結果を等号"="の後ろに出力。
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: [2005年10月29日9:00まで]
[5] その他の制限:文字列を読み込み、整数か記号であるかを判断(isalpha,isdegit等)、次に数字を数値変換(strtoi,strtol等)でその後、演算記号に従って計算
972教えて厨 ◆AU/OjWxByc :2005/10/27(木) 23:05:09
[1] 授業単元: 画像処理
[2] 問題文(含コード&リンク):

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1009.zip

上のpgm形式サンプル画像ファイルに対して


画像内にちらばっている多角形に対してラベリング処理を行って境界線追跡をするか、
あるいは図形を切り出すなどして
それら図形の周囲長・面積・円形度・モーメント、その他自分で考案した特徴を計算してください。

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1018.c

↑こんな感じでコードを作ってみたのですが、どうもうまく行きません。
どこが原因でしょうか・・・教えてすごい人


[3] 環境
 [3.1] OS: Windows/Linux/どちらでも実行できるのが望ましい
 [3.2] コンパイラ名とバージョン: gccかVC++6.0、bccどれでも動くのが望ましい
 [3.3] 言語: C/C++/どちらでも可
[4] 期限: [2005年10月27日まで]
[5] その他の制限: 制限無し。答えさえ正しければよい。



973デフォルトの名無しさん:2005/10/27(木) 23:06:46
またお前か
974教えて厨 ◆AU/OjWxByc :2005/10/27(木) 23:17:44
170行目にある、
ratio[i] = 4*PI*size[i]/(l*l);
この部分でl*lがlの中身がいつも0なためにゼロ除算になって止まってる
ような感じがするんですが、どうしてlの中身がいつも0になるの?
975教えて厨 ◆AU/OjWxByc :2005/10/27(木) 23:37:24
ぬおおお、自己解決したっぽい。
どうやらimage_label_inの中身が空っぽの奴をfeaturesに渡してたのが原因。
labelingで出来たimage_labelをちゃんと渡せば無事うごきました。
あとはsprintfでちゃんとデータを表示するようにput(buf)をいれたら
望みどおりに動いたっぽいんだけど・・・でもなぜかデータを吐いた後に
強制終了されて後味が悪いっス・・・なぜこうなるの??
976デフォルトの名無しさん:2005/10/27(木) 23:41:56
>>975
PCのスペック^−^
977デフォルトの名無しさん:2005/10/27(木) 23:44:50
>>974
labeling()ではimage_labelにラベルをセットしている。
features()ではimage_label_inからラベルを読もうとしている。
978977:2005/10/27(木) 23:46:37
あーなんだ、さすがに自己解決してたか。
で、強制終了はこれが原因。
char buf2;
979教えて厨 ◆AU/OjWxByc :2005/10/28(金) 00:09:33
buf2の何が原因??
980デフォルトの名無しさん:2005/10/28(金) 00:15:05
長さ1のchar*型にsprintfで文字列をぶち込んでる。
981デフォルトの名無しさん:2005/10/28(金) 00:20:14
VC7.1にも、BCB6のようなCodeGuardを添付すべきだな。
この手の失敗が目立つ。
982教えて厨 ◆AU/OjWxByc :2005/10/28(金) 00:26:19
むうう。buf2をbuf2[100]に変えてちょっと動かしてみたんだけど、
やっぱ強制終了されちゃうぜよ。buf2を配列にすりゃいいんじゃないの?
なにがいけないのよ
983デフォルトの名無しさん:2005/10/28(金) 00:36:59
>>982
buf2だけじゃなくてbufも配列にした?
984デフォルトの名無しさん:2005/10/28(金) 00:37:01
>>982
お前の態度
985教えて厨 ◆AU/OjWxByc :2005/10/28(金) 00:46:48
>983

featuresの中のbuf2とグローバルのbuf2だけ配列にしたんだけど。
これだけじゃ駄目?どこの箇所をどう直さないといけないかおしえてちょ
986デフォルトの名無しさん:2005/10/28(金) 00:47:51
>>985
ソースの前の方にあるchar buf; も char buf[100]; ぐらいにしてみな。
987教えて厨 ◆AU/OjWxByc :2005/10/28(金) 01:22:10
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1019.c

こんな風なんだけどうまくいかねーよ〜
988デフォルトの名無しさん:2005/10/28(金) 01:48:40
C/C++の宿題を片付けます 52代目@プログラム板
http://pc8.2ch.net/test/read.cgi/tech/1130431335/
989デフォルトの名無しさん:2005/10/28(金) 02:06:13
>>987
もっかい>>1読み直せ。何がどううまくいかないのか。エラーが出るならエラーメッセージをちゃんと書け。
ついでに、○○行目じゃ分からん。どの関数のどの辺とか言ってくれなきゃ、ブラウザには行ラベルが付いてないから。
990デフォルトの名無しさん:2005/10/28(金) 08:47:59
>>989
行番号のほうが一意特定できるから嬉しいが
991953:2005/10/28(金) 10:21:59
>>970
すいません、そのプログラムは以下のようなエラーが出ました。

:In function `main':
:8:error: `i' undeclared(first use in this function)
:8:error: (Each undeclared identifier is reported only once
:8:error: for each function it appears in.)

それとヒントがあったので、一応参考までに貼り付けておきます↓

入力された整数値を 50 とすると、50個分の整数型データの動的確保は、
int *ptr;

ptr = (int *)malloc(sizeof(int) * 50);

で行うことができる。このとき ptr はそのデータの先頭アドレスが代入されている。
992デフォルトの名無しさん:2005/10/28(金) 10:24:31
なあ、画像処理系の問題はめんどくさいからどっかまとめサイトに
ppmを読み込む所まで作っておいて、メインの処理のみ記述するって事にしないか?
ようするに画像処理のテンプレート作ろうぜって話
993デフォルトの名無しさん:2005/10/28(金) 10:26:45
>>991
めんどくさい奴だな。もう少し理解力つけろ。そんなんじゃ社会に出ても使えない奴だぞ
int i;
↑をint *buf;の行の後ろに追加しろ
994953:2005/10/28(金) 10:31:24
>>993
ありがとうございます。
995鈴木:2005/10/28(金) 10:33:21
PARCOR係数を使っての拡大縮小の仕方を教えてもらえませんか?
996デフォルトの名無しさん:2005/10/28(金) 10:40:21
黙れ鏑木
997鈴木:2005/10/28(金) 10:42:59
教えてくれないんですか?
998デフォルトの名無しさん:2005/10/28(金) 10:44:57

999デフォルトの名無しさん:2005/10/28(金) 10:45:45
1000デフォルトの名無しさん:2005/10/28(金) 10:46:53
拡大縮小
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。