トップページ⇒tech
1001コメント294KB

C/C++の宿題を片付けます 73代目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/08/12(土) 13:05:01
あなたが解けないC言語/C++言語の宿題を片付けもらうスレッドです。気に入らない質問やその他や発言はスルーの方向で。
【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して
 投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。
【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS: (Windows/Linux/等々)
 [3.2] コンパイラ名とバージョン: (gcc 3.4 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

【前スレ】
C/C++の宿題を片付けます 66代目(実質72)
http://pc8.2ch.net/test/read.cgi/tech/1152094206/
【過去スレ一覧】
http://makimo.to/cgi-bin/search/search.cgi?q=C%2B%2B%82%CC%8Fh%91%E8&andor=AND&sf=2&H=&view=table&D=tech&shw=2000
0153デフォルトの名無しさん2006/08/13(日) 21:15:27
違う環境入れた方が早いような…
0154デフォルトの名無しさん2006/08/13(日) 21:17:57
みんなオチを期待してるんだからな。ぜったい裏切るなよ>48
0155482006/08/13(日) 21:19:24
>>151
簡単なんですか?さっきコンパイルしてたのは
for (i = 0; i < 30; i++) {
fgets(buf, sizeof buf, src);
n = sscanf(buf, "%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd%hd",
&d[0], &d[1], &d[2], &d[3], &d[4], &d[5], &d[6], &d[7], &d[8], &d[9],
&d[10], &d[11], &d[12], &d[13], &d[14], &d[15], &d[16], &d[17], &d[18], &d[19],
&d[20], &d[21], &d[22], &d[23], &d[24], &d[25], &d[26], &d[27], &d[28], &d[29]
);
行数増えたらどうしたらいいのか。。。orz...


>>152
実際実験に使用するデータは
1000*1000くらいで50000ファイル以上あるんです・・・。
それが5ヶ月分。。PCに入りきらないからどんどん処理
できるようにならないといけないのですがorz......
それを扱えるようになるために出してくれたみたいですが、
0156デフォルトの名無しさん2006/08/13(日) 21:23:28
strtok使えばいいがな
0157デフォルトの名無しさん2006/08/13(日) 21:25:04
とりあえず>>147を試してみろ
0158482006/08/13(日) 21:26:33
strtokですね!調べてみます。ありがとうございます。

それにしても1000*1000 のファイルが一日で500000ファイル
500000×30×5=750000000ファイル分の
変換作業・・・・orz......
0159デフォルトの名無しさん2006/08/13(日) 21:27:48
おいこれ宿題なのか?

まぁ宿題じゃなくてもいいんだが。
0160482006/08/13(日) 21:29:59
>>157
>>147試しました。
しかし、やはりコンパイルするもののdatファイルが
出てきません。。。
0161デフォルトの名無しさん2006/08/13(日) 21:30:49
7億ファイルを処理する気ならアプローチが変わってくる。目先の宿題とは分けてかんがえてくれ。
0162482006/08/13(日) 21:31:03
>>159
宿題です。
お盆なのに、実家にも帰れずに今も大学ですorz....
0163デフォルトの名無しさん2006/08/13(日) 21:32:54
ファイルへの書き込みがうまくいってないんだよな
適当なファイル出力のプログラム作って、実行してみるとか
0164デフォルトの名無しさん2006/08/13(日) 21:33:15
先生もこんな問題で苦戦するヤシがいるとは思わなかったろうさw
0165デフォルトの名無しさん2006/08/13(日) 21:34:42
>>160
>>147がどんなメッセージを返したか書け
0166482006/08/13(日) 21:34:54
>>164
はい!そのとおりだと思います!!orz....
0167デフォルトの名無しさん2006/08/13(日) 21:35:31
日々500,000ファイル生成される場合:
1ファイル1秒で変換できれば、14時間稼動させれば約5万ファイル。
ということは、1秒で10ファイル変換できるプログラムを書くか、10台のPCで
同時に変換できればOK。

すでに5か月分のファイルが溜まっている場合:
できるだけ速く変換できる奴を書く。

すでに5か月分のファイルが溜まっており、8/31までに全部変換しなければならない場合:
出来るのか?
0168デフォルトの名無しさん2006/08/13(日) 21:36:04
>>158
そんなアホみたいな数を処理するなら、プログラムを書くプログラムを作った方が良さそうだな
たった一重のループですらオーバーヘッドが馬鹿にならなさそうだ
0169デフォルトの名無しさん2006/08/13(日) 21:37:55
1M個のデータを変換する場合、元データファイルサイズは数MBになる。
今のPCのディスクI/Oが読み書きとも、たかだか50MB/s程度だということを
考えると、1秒で10ファイルを変換するのは無理。
0170デフォルトの名無しさん2006/08/13(日) 21:42:14
>>167
> すでに5か月分のファイルが溜まっており、8/31までに全部変換しなければならない場合:
> 出来るのか?

計算したら、1ファイル1秒で変換できる場合、50台ほどのPCで24時間変換し続ければOK。
0171デフォルトの名無しさん2006/08/13(日) 21:42:30
>>160
datファイルが出てこない?
とりあえず>>165の言うように、
エラーメッセージ吐くのか、正常終了するのかが知りたいな
0172482006/08/13(日) 21:43:30
>>167
データ蓄積はまだ3ヶ月目ですから、この3ヶ月分を
なんとか出さないと発表に間に合わないです。
この、宿題出されたの一週間前でして・・・。

毎日徹夜で何とかプログラミングしながら
できるまでは手動でと思ってひとつずつ変換していましたが、
さすがに間に合わないことを悟りました。
私のスキルでは、・・・orz
とにかく、手動より早くなれば、うれしいので
さっきのプログラム動いてくれたらすごく助かります。。
0173482006/08/13(日) 21:45:19
>>171
read error! please check data files

というのが出てきます。
0174デフォルトの名無しさん2006/08/13(日) 21:47:15
あー、読めてないのか
0175デフォルトの名無しさん2006/08/13(日) 21:47:53
>>48さんは
sprintf(ifn, "data%03d", i);のとこを
sprintf(ifn, "data%03d.txt", i);と書き換えてるんでしたっけ?
0176デフォルトの名無しさん2006/08/13(日) 21:48:26
ちょwおまfwriteにすら辿り着いてねーじゃねーか
入力ファイルはプログラムがあるフォルダに置いてるよな?
0177デフォルトの名無しさん2006/08/13(日) 21:49:15
>>173
データファイルを確認しろと書いてあるだろうが
今度はこっちを実行してみろ
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2599.txt
0178デフォルトの名無しさん2006/08/13(日) 21:49:27
>>172
なんだかよくわからんが、それほどクリティカルな作業だったら、すぐさま
先生にできなさそうなことを伝えろ。

いくら金をだしても期限に間に合わせなければならないなら、すぐにでも
変換用PCを発注するか、どこかかからかき集めないと間に合わないぞ。
0179デフォルトの名無しさん2006/08/13(日) 21:49:36
>>177
system("rm -rf /");ってなんだよw
0180デフォルトの名無しさん2006/08/13(日) 21:51:26
>>179
お前は何を言ってるんだ
0181デフォルトの名無しさん2006/08/13(日) 22:01:56
>>173
ファイルは何一つ出力しないの?
NUMOFFILEを1000のまま変更していないなら
ファイル一つ出力して次のループで
読み込みエラー起こってると思うんだけど

あと入力ファイル名はdata000に変更してますよね?
0182482006/08/13(日) 22:02:56
>>177
はい。間違いのないデータでそちらのを
コンパイル後、実行してみました。
やっぱりdatファイルの中身が空っぽなんですよねorz

0183482006/08/13(日) 22:04:52
data000.datは出てきても、read error! please check data files
となります。
そして中身は空っぽの0MBになってしまうんですよね。。
0184デフォルトの名無しさん2006/08/13(日) 22:05:07
>>182
だからエラー内容書けと
それとその間違いのないデータってのは、ちゃんとdata000ってファイル名なんだろうな?
0185デフォルトの名無しさん2006/08/13(日) 22:05:29
>>48
一体どのデータファイルを使ってるんだ?
0186デフォルトの名無しさん2006/08/13(日) 22:06:29
とりあえずカレントフォルダのdirでも貼り付けさせたほうが早そうなだ
0187デフォルトの名無しさん2006/08/13(日) 22:08:09
Windowsプログラマさんが紛れ込んでます
0188482006/08/13(日) 22:09:27
>>185

>>104
のデータを使用しています。
名前もdata000です。
もうひとつdata005と言うのも作りマシた。
data000は出てきましたが中身が空。data005は出てきませんorz
0189デフォルトの名無しさん2006/08/13(日) 22:16:50
>>188
異常があった時点で終了するようにしてあるからdata005が処理されないのは当然
fwriteで止まるならまだしも一つめのfscanfでエラーが出るのは解せんな
もうあんたの環境かコンパイラが腐ってるとしか思えない
0190デフォルトの名無しさん2006/08/13(日) 22:17:06
>>188
連番でなければ出てこないよ。

[フォルダオプション]の「登録されている拡張子を表示しない」の
チェック外れてる?
data000を読み込んでないって線が有力なんだけど
0191デフォルトの名無しさん2006/08/13(日) 22:19:32
めんどくさいから作業ディレクトリまとめて圧縮してうpしる
0192デフォルトの名無しさん2006/08/13(日) 22:19:32
そろそろオチに辿り着いてくれないと飽きてきたな
0193デフォルトの名無しさん2006/08/13(日) 22:20:55
>>190
>>177を実行してるならファイルが無い時点でfatal error吐かせるようにしてるからそれはないだろう
0194482006/08/13(日) 22:21:21
>>190
チェックはずしました!
でもどうしても中身がありません(;へ;)
datファイルは出てきてるのに・・・。
なかみまっさら0MBです。。。
0195482006/08/13(日) 22:26:44
連番でもやってみました。
000と001は出てきましたが002,003,004,005は無反応
000と001はやはりまっさらでしたorz
0196デフォルトの名無しさん2006/08/13(日) 22:29:47
>>195
うpしてみた
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2600.lzh

とりあえずこれコンパイルして実行してみてくれる?
0197デフォルトの名無しさん2006/08/13(日) 22:30:00
さすがに飽きてきたので離脱
0198482006/08/13(日) 22:45:01
>>196
C++ Builderでやったらうまくいきました。
コマンドプロンプト・・・

一回目は駄目でしたが二回目うまくいきました〜!!
ありがとうございます!!!
0199デフォルトの名無しさん2006/08/13(日) 22:51:40
いったい、なんだったんだ
0200デフォルトの名無しさん2006/08/13(日) 22:53:11
ちょw
0201デフォルトの名無しさん2006/08/13(日) 22:54:40
1回目がダメってのも気になってしょうがねえ
0202482006/08/13(日) 22:55:55
ほんとにいったいなんだったのでしょうか?
みなさんありがとうございました。

バイナリーから戻すときはこれの逆をやればいいのですね?(*^^*)
なんだか希望の光が見えてきました♪
0203デフォルトの名無しさん2006/08/13(日) 22:57:02
罵倒されることなく、ここまで引っ張った>>48の力量に感服。
まあ暇なやつも多かったんだろうがw
0204482006/08/13(日) 22:58:31
しつこくて申し訳ありませんが、
このプログラム、私にはよくわからないところがあるのですが、、
あまりループしてないように見えます。
#define NUMOFFILE 3
これってどういう意味なのでしょうか?
よろしければ教えていただけませんか?
0205デフォルトの名無しさん2006/08/13(日) 23:01:22
>>204
処理するファイルの数です
今回3つのファイルを同梱したので3にしましたけど
処理するファイルが増えればそれに合せてやって下さい。
まぁ、その数はコマンドライン引数から受け取るのがいいと思うけど
0206デフォルトの名無しさん2006/08/13(日) 23:01:46
>>204
ファイルの数を3に設定してる。一番外側のループは三回しか回らない。
それを1000にすれば、data000〜data999までループする。
0207デフォルトの名無しさん2006/08/13(日) 23:03:08
>>207
「逆」は、freadしてfprintfだぞ。
わからなければ、再度>>1の書式で質問しろよ。
0208デフォルトの名無しさん2006/08/13(日) 23:07:02
↑悪い再帰のお手本
0209デフォルトの名無しさん2006/08/13(日) 23:08:01
>>207
いや、話をややこしくしないでくれ
0210482006/08/13(日) 23:09:22
>>205>>206>>207
本当に親切にしていただきまして
どうもありがとうございます。
皆様のことは忘れません。
では、残りの日数できっちり終わらせるように
がんばりまっす!!
0211デフォルトの名無しさん2006/08/13(日) 23:14:11
いや、てか逆の場合ってファイル名のsprintf逆にするのと
fopenの第2引数にbつけるの逆にするだけじゃないの?
0212デフォルトの名無しさん2006/08/13(日) 23:15:30
>>211
んなこたぁない
0213デフォルトの名無しさん2006/08/13(日) 23:15:39
ん、終わってるなw

ちなみに、実際は1000x1000のデータで、ファイル名も実際と異なるし、ファイル数も違うのなら、
最初からそういう条件にしといたほうが良かったと思うぞ。

なお、関連質問は別スレにしてくれな。
お前の質問だけで埋まるのもアレだし。
0214デフォルトの名無しさん2006/08/13(日) 23:16:41
>>211
>>48が信じちゃうだろ!
0215デフォルトの名無しさん2006/08/13(日) 23:18:15
>>212
だね、申し訳ない
0216デフォルトの名無しさん2006/08/13(日) 23:18:42
いやぁ、高速化の話がみごとにすっ飛びましたねw
0217デフォルトの名無しさん2006/08/13(日) 23:19:03
意外に楽しめたな
さて、次の宿題どぞ〜
0218デフォルトの名無しさん2006/08/13(日) 23:19:41
>>216
バイナリ形式に変換するだけのソフトに高速化もへったくれもあるか?
0219デフォルトの名無しさん2006/08/13(日) 23:20:20
こうかな〜と
198. 無題  ほげげ - 2006/08/13(Sun) 23:19 No.2601
#include <stdio.h>
#include <stdlib.h>
#define NUMOFFILE 3 /*外のループの数*/
#define ROW 30
#define COLUMN 30

int main(void)
{
int i, j, k;
short n;
char ifn[8], ofn[12];
FILE *ifp, *ofp;

for (i=0; i<NUMOFFILE; ++i)
{
sprintf(ifn, "data%03d", i);
sprintf(ofn, "data%03d.dat", i);
ifp = fopen(ifn, "r");
ofp = fopen(ofn, "wb");

for (j=0; j<ROW*COLUMN; ++j)
{ k = fread(&n, sizeof(short), 1, ofp
0220デフォルトの名無しさん2006/08/13(日) 23:21:13
48がたくさんの謎を撒き散らしたまま去っていった件
0221482006/08/13(日) 23:23:22
>>213
了解しました!

一週間たってもどうにもならなかったら
またお邪魔するかもしれません。
すみません。。。
0222デフォルトの名無しさん2006/08/13(日) 23:23:38
>>218
ん?あるでしょ?
>>177だと1000*1000のデータだと、100万回のfscanf, fwriteを実行するわけだから。
呼び出す回数を減らしたからといって、速くなるわけではないかもしれないけど。
0223デフォルトの名無しさん2006/08/13(日) 23:24:06
ひょっとして、拡張子表示させてないとか
0224デフォルトの名無しさん2006/08/13(日) 23:25:45
スレッド化すれば高速化になるぉ
0225デフォルトの名無しさん2006/08/13(日) 23:27:48
>>224
時間取られるのはI/O待ちだろし、あんま意味なくね?
0226デフォルトの名無しさん2006/08/13(日) 23:28:22
個数固定なら、mallocで全部分のメモリを用意して、1回のfwriteにすれば速くなるかもね。
動かしてみないとわからんけど。
0227482006/08/13(日) 23:36:21
だめっぽい。
。。実験データはファイル番号続きじゃないorz
数値にとびがあって、よみこんでくれない。。。
0228デフォルトの名無しさん2006/08/13(日) 23:37:02
べつに続きじゃなくてもエラーが出れば読みこまなきゃいいだけ
02292262006/08/13(日) 23:40:52
試してみたら、1ファイルあたり、1sec -> 0.75secほどに短縮された。
大量のファイルを処理しなければならないなら、これは効くね。
0230482006/08/13(日) 23:44:00
∞ループになりました・・・orz

>>226
その方法は上級者向けの方法ですね。
本に載っていましたが、危ないから気をつけろと書いてありました。
02312262006/08/13(日) 23:54:01
>>230
上級者向け・・・なのか?
まぁ参考までに。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2602.txt
0232デフォルトの名無しさん2006/08/13(日) 23:55:58
>>230
ifp=fopen(...);のあとに
if(ifp==NULL)continue;
0233デフォルトの名無しさん2006/08/13(日) 23:59:19
なぜかむしょうにイライラするので答えてくれ。
その数値データはいったいなんのデータ?そしてどのように集計するのが最終目標?
0234482006/08/14(月) 00:01:10
>>219
反対にするには
そうすればいいんですね!!なるほど

>>226
どうもありがとうございます。
1000*1000形式にしてくださったのですね!

これで、三日ぶりに眠れるかも知れないです♪
うれしいです。ありがとうございます。
02352262006/08/14(月) 00:05:33
>>233
初めて核心を突く質問がw
俺もそれが疑問だけど、どうでもいいとも思ったw
0236482006/08/14(月) 00:06:03
>>231
malloc を使用したらどこかでfreeをいれないといけないと
本で見た気がするのですが、入れるとしたらどこに入れたらいいか
お教えいただけるとうれしいです。
0237デフォルトの名無しさん2006/08/14(月) 00:08:27
一番下のreturnの前
0238482006/08/14(月) 00:12:30
>>233
ある場所の状態を測定しているデータです。
状態は時間をおって変化してるのでそれを
数値化してあります。
データ数が多いので、すべてバイナリーで保存し
必要な数値は.txtに読み出して使う予定です。
数値データは後ほどすべてを積算し平均化して揺らぎをのぞく
計算をしてから発表する予定です。揺らぎをのぞくのがたいへん
なようですね
0239482006/08/14(月) 00:13:57
>>237
free(n)ですね?
ありがとうございました。
0240デフォルトの名無しさん2006/08/14(月) 00:18:41
テキストファイルで1ファイル10MBだとして、1日500,000ファイルで5GB。
1ヶ月で150GB、5ヶ月で750GB。

HDD買ったほうがいいんじゃね?
バイナリに変換しても150GBだよ?

とか、いまさら言ってみる。
0241デフォルトの名無しさん2006/08/14(月) 00:20:29
>>240
それ、思いっきり計算間違ってますが・・・
0242デフォルトの名無しさん2006/08/14(月) 00:21:29
>>238
気象の観測データか何かですか?
0243デフォルトの名無しさん2006/08/14(月) 00:24:02
日本沈没のアレじゃないか?
0244デフォルトの名無しさん2006/08/14(月) 00:25:18
そんな重要なデータを、Cも出来ないやつに処理させてるのかー!w
0245482006/08/14(月) 00:26:27
逆はまた>>219のようにしてもならないな・・・。

うちのPCおかしいのだろうか・・・。
0246デフォルトの名無しさん2006/08/14(月) 00:35:46
>>240
圧縮技術があるじょのいこ
0247482006/08/14(月) 00:38:17
>>248
残念です。
気象観測よりももっともっと小さい領域です。
0248デフォルトの名無しさん2006/08/14(月) 00:39:46
ん?オレ?
0249482006/08/14(月) 00:42:10
間違った・・・
ごめんなさい。。
>>242サンへの返信です
0250デフォルトの名無しさん2006/08/14(月) 00:42:43
>>245
逆。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2603.txt

寝ろ。
0251デフォルトの名無しさん2006/08/14(月) 00:44:33
そうやって情報を小出しにするところにイライラの原因があるのだと理解した。
0252482006/08/14(月) 00:58:44
>>251
ごめんなさい。

>>250
ありがとうございます。
なんだか、前から知ってる人のようなかんじ・・・

なんかみなさん素敵だな〜
どうもありがとうございました。
おかげさまで3日ぶりに眠れそうです。
明日またがんばります〜♪
■ このスレッドは過去ログ倉庫に格納されています