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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/12/24(日) 23:17:00
あなたが解けない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
【過去ログ検索】
http://chomework.sakura.ne.jp/
【wiki】
http://www23.atwiki.jp/homework/
【前スレ】
C/C++の宿題を片付けます 79代目
http://pc8.2ch.net/test/read.cgi/tech/1165943509/
0153デフォルトの名無しさん2007/01/02(火) 11:56:42
143 名前:デフォルトの名無しさん 投稿日:2007/01/02(火) 11:38:30
>>142
さすがにgets()はどうかと。
↓ぐらいにしとけや。

void get_string(char *p_str, int size)
{
int c, i;
for (i = 0; i < size-1 && (c = getchar()) != EOF && c != '\n'; ++i)
p_str[i] = c;
p_str[i] = '\0';

↓ぐらいにしとけや。
↓ぐらいにしとけや。
(c = getchar()) != EOF && c != '\n'; ++i
(c = getchar()) != EOF && c != '\n'; ++i

>入力範囲外まで無駄にコピー
意味不明。ちゃんと10文字で処理されてますが?w
とにかくうぜぇからバカじゃないって証明したいなら
お前がmainから書き出せ、以上。これ以上お前との言い合いは無意味。
お前がソースを書けば良いだけ。他人の粗探ししているくらいならやれ。
粗探しのつもりが自分の無知を晒すとはなw どこの三流以下の大学生だ?w
あっ、専門学校程度か、わりぃわりぃ、お前じゃ話にならねーかw
0154デフォルトの名無しさん2007/01/02(火) 11:58:06
>>88-90
のURL行ける?
0155デフォルトの名無しさん2007/01/02(火) 11:58:08
>>151
http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%83%B3
ぐらい読んどけ。Cプログラマの常識だから。
0156デフォルトの名無しさん2007/01/02(火) 11:58:53
>>155
お前のソースを書け、プログラマの常識だからw
0157デフォルトの名無しさん2007/01/02(火) 11:59:04
>>152
swap() に与える引数
たぶんx,yの要素全部入れ替えたいんだろからアドレスちゃんと渡さないと
0158デフォルトの名無しさん2007/01/02(火) 12:00:07
>>152
> swap(&x, &y);
swap(&x[i], &y[i]);
01591522007/01/02(火) 12:01:04
ありがとうございます。
0160デフォルトの名無しさん2007/01/02(火) 12:01:34
>>155
ちゃんとそれを理解して言っているのか?
起こる場合の説明について
# ユーザが200文字以上のメールアドレスを入力する。
# プログラムがバッファの大きさをチェックせずに入力データを書き込む。
# バッファとして確保した領域をはみだしてデータが書き込まれてしまう。
比較するのに使う文字列を格納するs1、s2にはそれが起こらない措置をとっているが?
何のための char buf[256]を用意して文字列を10文字以内でコピーしているか理解しろよw
んじゃな、三流プログラマw
0161デフォルトの名無しさん2007/01/02(火) 12:02:34
>>155
>仮にはみ出した部分にプログラムの動作上意味を持つデータがあれば、
>これを上書きして破壊することにより、プログラムはユーザの意図しない挙動を示すであろう。
>>143で11文字以上入力するとおかしくなるんすけどぉ〜?
0162デフォルトの名無しさん2007/01/02(火) 12:04:12
>>160
えーとね。
試しに、256文字以上入力してみなよ。そうすりゃ分かるから。

君は256byteしかバッファを用意していないが、gets()はそんなことは
無関係にバファオーバーランを引き起こすのよ。
だから、危険な関数なの。
0163デフォルトの名無しさん2007/01/02(火) 12:06:53
>>161
何が「おかしく」なるのか言ってみそ?
少なくともバッファオーバーランは起きず、次回のget_string()で
続きの文字が読み取られるだけだろう?

「11文字以上入力された行については、残りの文字は全て破棄する」などという
仕様はどこにもないが、もしそうであれば、そのように書くのも簡単だ。
が、gets()だけはまずい。
0164デフォルトの名無しさん2007/01/02(火) 12:08:07
>>143が想像を絶する無能でFAなのになんでこじれるのよ
アホはアホでスルーしとけ
0165デフォルトの名無しさん2007/01/02(火) 12:09:48
つうかここまでファビョった奴は流石にはじめて見たわ
何を指摘されてるのか、何が問題なのかもさっぱり理解もしてないし……

小学生か?>>142
0166デフォルトの名無しさん2007/01/02(火) 12:14:24
>>165
いや、何が問題かの指摘を分かっているかどうかはともかく
>>143が偉そうにレスした割には、ソース全部を書いていない他人の批判で
なおかつそのソースが不完全どころか自分がバッファオーバーランをする
ソースを書いているのが笑えるw
お前が幼稚園以下の知能の低いサルだなw
悔しかったら自分で書いたソースを出せよ?プログラマの常識だろ?w
0167デフォルトの名無しさん2007/01/02(火) 12:15:45
>>166
えーと、君、バッファオーバーランの意味分かってるのか?
>>143のソースではバッファオーバーランは発生しないのだが。
0168デフォルトの名無しさん2007/01/02(火) 12:15:55
>>162
>試しに、256文字以上入力してみなよ
bufに問題が起こるのはわかっているが、それを指摘する前に
お前がちゃんとソースを書けよ?うざいんだよ、このスレの趣旨分かってねーだろ?
ここは他人のソースを批判しにくるスレじゃない。ごちゃごちゃ言うまえに
てめぇ正しいソースを書いてから一蹴しろ?
お前のやっていることは、他人の落ち度を 自分基準 で言う割には
自分の基準もぐだぐだで、指摘したつもりがそれも間違っていて
恥さらしをしただけだな。とにかくごちゃごちゃ言ってないでお前の書いたソースを出せ、でなきゃ黙ってろ。
0169デフォルトの名無しさん2007/01/02(火) 12:17:15
>>167
いや、余裕でしているよ。11文字以上入力してみろよ?
256文字も打つ気しないなぁ。人間って間違えるからさ
10文字入力したつもりでも1文字くらい多く入力しちゃうこともあるんだよねw
まさか100文字以上も入力する奴いるかよ?w
あのCUIで?w笑える、一生文字入力してろ、知ったかの墓穴堀バカw
0170デフォルトの名無しさん2007/01/02(火) 12:18:16
>142が見れないんだけど、消したの?
0171デフォルトの名無しさん2007/01/02(火) 12:18:36
>>169
大量の入力を与えるのはリダイレクトすれば簡単だけどな
0172デフォルトの名無しさん2007/01/02(火) 12:19:24
あ、ほんとだ。見えなくなってるね。
煽りまくってるのに、証拠は隠滅したのか>>142君はw
0173デフォルトの名無しさん2007/01/02(火) 12:19:38
>>143は間違ったソースしかかけないくせに、他人のソースの穴を指摘するだけの
バカです。自分が全部ソースを書けば良いだけじゃん。自分仕様のものを出せよ。
それはこれこれどういう問題があるから って話になってんだ?
現代において完璧なものがないから、何事も問題があることくらい分かってんだよ。
問題がなきゃ交通事故も犯罪も起こらない罠w
そこを人間の意志で問題を減らしていくことが必要なんじゃん。
お前みたいな問題を自分で起こす奴は社会に出てこないで檻の中に戻れよ、な?
0174デフォルトの名無しさん2007/01/02(火) 12:20:33
>>172
なんか必死ですね〜〜〜wwwww
お前のソースはここに残って、自分の間違い(バッファーオーバーラン)を
自分で指摘したのに自分が起こしていた証拠を残してしまうねw
とにかく必死だな、低学歴w
0175デフォルトの名無しさん2007/01/02(火) 12:22:24
ってかソースをもう一度アップしてもらえません?(自信あるなら)
それにオーバーランするなら、それをプリントスクリーンしてアップすればいいことじゃないの?
0176デフォルトの名無しさん2007/01/02(火) 12:22:30
さぁ〜〜〜〜みなさん!11文字以上を入力して試してみよう。↓これくらいにしとけや?
void get_string(char *p_str, int size)
{
int c, i;
for (i = 0; i < size-1 && (c = getchar()) != EOF && c != '\n'; ++i)
p_str[i] = c;
p_str[i] = '\0';
}

> c != '\n';
なんすかこれ?(プ
0177デフォルトの名無しさん2007/01/02(火) 12:23:41
今北産業

もとのソースが消失してるから訳和漢ね
0178デフォルトの名無しさん2007/01/02(火) 12:23:59
その前になぜfgetsを使わなかったの?
0179デフォルトの名無しさん2007/01/02(火) 12:24:32
>>175
gets()がLinuxではタブーだと分かった以上出す必要ないだろ。
入力処理のライブラリを>>142に書き換えて提出しなさいw
11文字以上入力した場合、不具合が起こるから。256文字以内なら
オーバーランしないソースは洋ナシってことで、以後放置よろ。
0180デフォルトの名無しさん2007/01/02(火) 12:25:37
入力処理のライブラリを>>143に書き換えて、だった、すまそw
んじゃ、後はバッファオーバーランを指摘したのに自分で起こした
>>143がここを仕切るってことで、がんばれよ、墓穴堀さんw
0181デフォルトの名無しさん2007/01/02(火) 12:29:27
>>143はデバッグで追えばすぐに気づくことなのに・・・
偉そうに言ってる割にはマジでカスだなww
0182デフォルトの名無しさん2007/01/02(火) 12:31:23
つーか>143がおかしくなるのは>142の中に入れたときなんじゃねーの?w
普通に使えばオーバーフローしないだろw
0183デフォルトの名無しさん2007/01/02(火) 12:32:41
今見たばかりでよく分からないけど、
どっちのソースも現状、mainから書いたのがすべて見れないのが
混乱させている気がする。レスだけ多くなる一方だいし。
01841432007/01/02(火) 12:38:15
#include <stdio.h>

void get_string(char *p_str, int size)
{
    int c, i;
again:
    for (i = 0; i < size-1 && (c = getchar()) != EOF && c != '\n'; ++i)
        p_str[i] = c;
    p_str[i] = '\0';
    if (c != EOF && c != '\n') {
        if (getchar() != '\n') {
            fprintf(stderr, "line too long. please input again\n");
            while ((c = getchar()) != EOF && c != '\n')
                ;
            goto again;
        }
    }
}

int main()
{
    char buff[2][11];
    get_string(buff[0], sizeof buff[0]);
    get_string(buff[1], sizeof buff[1]);
    printf("%s\n", strcmp(buff[0], buff[1]) ? "Not equal": "equal");
    return 0;
}
01851432007/01/02(火) 12:39:10
ぐだぐだうるさいから、11文字を超えた場合は再入力を促す
超親切仕様にしてやったぞ。
0186デフォルトの名無しさん2007/01/02(火) 12:42:09
142=143で荒らしたいためにわざと阿呆なコード書いてるんじゃないか。
0187デフォルトの名無しさん2007/01/02(火) 12:48:38
>>185
きめぇソース書くなよ、最後まで粘着、しつこいお前が一番うぜぇ
このスレの趣旨が分かってないなら二度とくるな
ここはお前の絶対評価の場じゃないし、そのソースもきめぇ
うるさいのはむしろお前だから。ソースも書いてないくせに偉そうにして、馬鹿だろ。
>>124
>C1年生の初心者なので入門書レベルのコードでお願いします
分かったか?お前は肝心なものも忘れているんだよw
0188デフォルトの名無しさん2007/01/02(火) 12:52:35
>>187
>>185はいまとなっては見れない>>142のコードと違って、

・バッファオーバーランは発生しない
・10文字を超過する入力には再入力を促す
・標準関数はstdio.hの非常に基本的なものしか使っていない
 (>>142はstring.hのものも使っていたな)

のだが。
>>185のどこが「入門書レベルのコード」を超過しているのかね?
0189デフォルトの名無しさん2007/01/02(火) 12:53:11
>>181 >>182
> >142の中に入れたときなんじゃねーの?w
だから最初っからmainも書いて出すべきだったろ?分かってないのはお前
0190デフォルトの名無しさん2007/01/02(火) 12:55:09
>>188
自分を自分で援護、擁護ですか?それが何か?
問題は>>184が間違っているってことじゃない。
最初っから書いていない奴が何批判を始めてんだと?
そこから間違っているから荒れたんだろ、お前もうぜぇ
0191デフォルトの名無しさん2007/01/02(火) 12:55:42
ていうかバッファオーバーランの意味も知らずにファビョってただけでしょ
アンタが……
gets()の危険性も知らないなんて恥ずかしいよ。
0192デフォルトの名無しさん2007/01/02(火) 12:56:24
>>188
> 標準関数はstdio.hの非常に基本的なものしか使っていない
すいません、モロに strcmp を使っていて string.hがないという
コンパイルエラーが起きたんすけど・・・
0193デフォルトの名無しさん2007/01/02(火) 12:57:14
>>192
んがぁ!
失礼。全くその通り。
0194デフォルトの名無しさん2007/01/02(火) 12:57:27
>>191
し  つ  こ  い  お前も起こしたバッファーオーバーランを持ち出して
まだ自爆、墓穴堀を晒したいのかハゲw
0195デフォルトの名無しさん2007/01/02(火) 12:58:28
>>194
いやだから、起こさないでしょ。
>>143のコードでどうやって起こすの?
size引数に実際より小さな値を渡さない限りは起きないでしょ。
0196結局最後までエラーを残す自己厨な冬厨哀れ2007/01/02(火) 12:58:47
>>184
> printf("%s\n", strcmp(buff[0], buff[1]) ? "Not equal": "equal");
Call to function 'strcmp' with no prototype in function main
0197デフォルトの名無しさん2007/01/02(火) 13:00:03
>>184がエラーになるコンパイラって、C99モードでコンパイルしてる?
C89なら、警告は出るかもしらんが、コンパイルは出来るはずだけど。
まぁ、俺が悪かったよ。
0198デフォルトの名無しさん2007/01/02(火) 13:03:46
これからは指摘でふぁびょる前に自分が書いたソースを出してから意見しましょうね。
もっとも、他人のソースの批判をする場所じゃないから、ここ。
ぐだぐだいちゃもんつける前に、自分がソースを書いて自分がとった手段を明確に
示せば良いだけ。出さない奴は卑怯者。そう、>>143みたいに結局mainを出さずに
その後、議論になった10文字より多かった場合のトラブルを他人に指摘されて
直しただけではだめってこと。
0199デフォルトの名無しさん2007/01/02(火) 13:13:25
なにこのくだらない言い争い
ネタでもつまんね
0200デフォルトの名無しさん2007/01/02(火) 13:14:47
ってかレスが増えてわからなくなった。
他にいままだ残っている宿題ってなんかあった?
0201デフォルトの名無しさん2007/01/02(火) 13:16:21
バッファオーバーランを知らないバカと標準入力のバッファがわかってないバカの喧嘩。
0202872007/01/02(火) 13:34:12
>>200
87お願い。
0203デフォルトの名無しさん2007/01/02(火) 13:36:52
[1] 授業単元:
[2] 問題文(含コード&リンク):

数列 a = [a_1, ..., a_n] が与えられる。ここから次の条件を
満たすような要素たちを効率よく選ぶプログラムを作れ。

条件 1. 隣り合う要素は選ばない。
条件 2.選んだ要素の総和が最大になる。

例: a = [1,3,3,2] のときは2つ目の3と4つ目の2を選ぶ(合計5)。

[3] 環境
 [3.1,3.2] OS、コンパイラ: 問わず
 [3.3] 言語: どちらでも可
[4] 期限: 1月4日
[5] その他の制限: 特になし
02041302007/01/02(火) 13:42:47
たくさんのレスいただいてありがとうございます。
142はもう消えているみたいだしどれを参考にすればよいのでしょうか?

書き忘れましたがコーディング規約でgetsとscanfは使わずに
fgetsとgetcharで作るように書かれてます。
0205デフォルトの名無しさん2007/01/02(火) 13:43:59
>>204
>>184にstring.hを追加して使えばおk
0206デフォルトの名無しさん2007/01/02(火) 14:09:33
>204
void get_string(char *p_str, int size){
fgets(p_str,size,stdin);
while(*p_str) p_str++;
p_str--;
if(*p_str=='\n') *p_str = '\0';
else fflush(stdin);}
0207デフォルトの名無しさん2007/01/02(火) 14:14:15
>>206
stdinに対するfflush()の挙動は処理系依存だというのに

なんでこうも使いたがる奴が多いのか
0208デフォルトの名無しさん2007/01/02(火) 14:29:45
>>207
だからうざいって、お前はひっこんでろ。
他人の批判をする前に自分のソースを出せつっただろ?
0209デフォルトの名無しさん2007/01/02(火) 14:40:40
どちらにせよstdinをフラッシュする
規定された方法が無いんだから仕方ないんじゃ。

rewind(stdin)もfseek(stdin,0,SEEK_SET)も出来る処理系はあるけど
動作が保障されてるやり方じゃない。
0210デフォルトの名無しさん2007/01/02(火) 14:40:58
>>208
だから、>>205でいいのでは?
0211デフォルトの名無しさん2007/01/02(火) 14:45:40
>>209
stdioのバッファを空にしたいというよりは、単に行末まで
読み飛ばしたいだけなんだから、いくらでも方法はあるはずだが。
scanf("%*[^\n]%*c");
でもいいし、
scanf()を使わないなら、>>205のやりかたでもいい。
0212デフォルトの名無しさん2007/01/02(火) 14:55:53
ありきたりな定石を載せたサイトでも作ればぁ〜?
文字の入力受付はこうとか、ありきたりなソートに比較回数、交換回数を数えるものとか
そういったところまでありきたりなものが書かれたやつとか
0213デフォルトの名無しさん2007/01/02(火) 15:04:17
>>212
ここは丸投げスレだし、必要無いんじゃないかな?
丸投げでない人へは、俺に聞けスレへの誘導だけで良いと思う。
0214デフォルトの名無しさん2007/01/02(火) 15:16:26
そうだね。とりあえず課題できればいいって人と職人のスレだからね。
0215デフォルトの名無しさん2007/01/02(火) 15:46:29
88却下。俺にはできん...
0216デフォルトの名無しさん2007/01/02(火) 17:04:56
>>87
難しいな。それなりに枝は刈ったつもりだけど、10x10 程度でも
下みたいに選択肢は多いのにクリア不能の盤面がきつい。
(ずれるので等幅フォントで見てください)

@......#.#
.......#..
....#####.
..........
..........
..........
..........
..........
..........
..........
0217デフォルトの名無しさん2007/01/02(火) 17:12:59
>>212
wikiがあるからぜひそこに書き記してくれ
0218デフォルトの名無しさん2007/01/02(火) 18:25:20
つか>>87てNP-hardじゃねえの?
0219デフォルトの名無しさん2007/01/02(火) 18:33:45
うむ。更に言うとNP-completeだな。
0220デフォルトの名無しさん2007/01/02(火) 18:56:50
>>219
完全って証明できるの?
0221デフォルトの名無しさん2007/01/02(火) 19:03:09
ハミルトン路問題って一般的にNP完全だっけか?
0222デフォルトの名無しさん2007/01/02(火) 19:22:00
一般的にという意味がよくわからないが、ハミルトン閉路問題は NP 完全。
これはグラフが相当制限されているが、それでも >>133 にあるように NP 完全。

証明は平面グラフのハミルトン閉路に帰着して行う。ただし、それほど簡単ではない。
0223デフォルトの名無しさん2007/01/02(火) 19:41:33
20x20なんて解けんだろ。
そんな宿題でるか普通?
0224デフォルトの名無しさん2007/01/02(火) 20:23:53
正直、この手の証明とか全く見たことなくて素人考えなのだけど
ハミルトン路の問題と、ハミルトン閉路の問題で違いが出たりはしないの?
0225デフォルトの名無しさん2007/01/02(火) 21:26:49
[1] 授業単元:c
[2] 問題文(含コード&リンク):

0〜255の整数を入力し、数値に変換してunsigned char型変数に格納。
この数値に対し1ビット左にシフトした結果と1ビット右にシフトした結果
全ビット反転した結果をそれぞれ2進、10進、16進で表示。

<出力例>255と入力した場合

整数を入力 (0−255): 255
処理前    255      ff      11111111
右シフト   254      fe      11111110 
左シフト   127      7f      01111111 
全ビット反転 0       00      00000000  


(エラー処理)
範囲外の整数、'0'〜'9'以外の入力   エラーメッセージ表示
改行のみ               エラーメッセージ表示

[3] 環境
 [3.1] OS: (Windows)
 [3.2] コンパイラ名とバージョン: (gcc )
 [3.3] 言語: (C)
[4] 期限: なし
[5] その他の制限:

よろしくお願いします
0226デフォルトの名無しさん2007/01/02(火) 21:34:36
一辺の長さを適当な刻み幅で増加させて
各ステップで立方体の体積を計算し、
その体積が初めて100を超えたときに
一辺の長さと体積を表示するプログラムを作成しなさい。
このプログラムでは一辺の長さの初期値と刻み幅を
キー入力で与えるようにすること。

結果表示の例)
刻み幅=0.01
辺の長さ=4.65 体積=100.545

この問題わかる方いますかぁ??
学校で始めたばかりなんですが、
全然わかりません。。。
よろしくお願いします。
0227デフォルトの名無しさん2007/01/02(火) 21:40:52
>>226
>>1読んで書き直し
0228デフォルトの名無しさん2007/01/02(火) 21:58:33
>>224
ハミルトン路問題とハミルトン閉路問題の変換は容易.
以下 G = (V, E) を固定する.

ハミルトン路問題をハミルトン閉路問題に帰着する:

新しい頂点 s を G に追加し,二頂点 u, v ∈ V を取って
辺 (u,s) と (s,v) を張る.G ∪ {s} にハミルトン閉路があれば
G に u-v 間を繋ぐハミルトン路がある.これを任意の u, v
について行えば, G にハミルトン路があるかどうか判定できる.


ハミルトン閉路をハミルトン路に帰着する:

新しい頂点 s, t を G に追加し,隣接する二頂点 u, v ∈ V を取って
辺 (s,u) と (v,t) を張る.G ∪ {s,t} にハミルトン路があれば
それは s を始点にし,t を終点にするものに限る.この路を用いると
u から出て v に行き,u に戻るようなハミルトン閉路が構成できる.
これを任意の u, v について行えば,ハミルトン閉路があるかどうか判定できる.


どっちの構成も図を描けばやりたいことは分かるとおもう.
0229デフォルトの名無しさん2007/01/02(火) 22:38:10
>>225
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3306.c
0230デフォルトの名無しさん2007/01/02(火) 22:47:41
>229
数字の後に数字以外を入力しても正しく入力されたことになっちゃうよ。
0231デフォルトの名無しさん2007/01/02(火) 22:50:22
>>230
そういう仕様でなんら問題ないよ。むしろそういう入力をする方がどうかと。
atoiも数字以外の英数文字があってもそれを無視して先頭の数字を
数値として認識するし、そういうもんだと割り切れば良いだけ。
0232デフォルトの名無しさん2007/01/02(火) 22:52:30
>>230 thx

>>225 >>229を修正版
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3307.c
0233デフォルトの名無しさん2007/01/02(火) 23:02:38
[1] 授業単元:
[2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3308.txt
[3] 環境
 [3.1] OS: (Windows)
 [3.2] コンパイラ名とバージョン: (Visuai Studio 2003)
 [3.3] 言語: (C)
[4] 期限: 1月9日
[5] その他の制限: よろしく願いします。
0234デフォルトの名無しさん2007/01/02(火) 23:12:44
>>228
あー、ちょっと点を加えると相互の問題に変換できるのか
図に描いてみて把握した。タメになった�dクス
02351122007/01/02(火) 23:35:19
遅ればせながら、ありがとうございました。
また何かありましたら、よろしくお願いします。。。
0236デフォルトの名無しさん2007/01/03(水) 00:28:05
[1] 授業単元:
[2] 問題文(含コード&リンク): 一辺の長さを適当な刻み幅で増加させて
各ステップで立方体の体積を計算し、
その体積が初めて100を超えたときに
一辺の長さと体積を表示するプログラムを作成しなさい。
このプログラムでは一辺の長さの初期値と刻み幅を
キー入力で与えるようにすること。

結果表示の例)
刻み幅=0.01
辺の長さ=4.65 体積=100.545

[3] 環境
 [3.1] OS: (Windows)
 [3.2] コンパイラ名とバージョン: (Visuai Studio 2003)
 [3.3] 言語: (C)
[4] 期限: ([2007年1月9日まで]
お願いします。
0237デフォルトの名無しさん2007/01/03(水) 00:47:42
>>236
#include<stdio.h>
#define THRESHOLD 100.0
int main(void)
{
 double length, step, volume;

 printf("辺の長さを入力して下さい :");
 scanf("%lf", &length);
 printf("刻み幅を入力して下さい :");
 scanf("%lf", &step);
 if(length<=0.0 || step<=0.0)
 {
  printf("Error: 正の数を入力して下さい\n");
  return 1;
 }
 while(1)
 {
  volume=length*length*length;
  if(volume>THRESHOLD)
   break;
  length+=step;
 }
 printf("刻み幅=%f\n辺の長さ=%f 体積=%f\n", step, length, volume);
 return 0;
}
0238デフォルトの名無しさん2007/01/03(水) 00:51:41
それじゃ誤差が酷くなりそうな気がするが
0239872007/01/03(水) 01:08:22
>>216
とりあえず、探索の方法だけでもヒントがいただければ…
10×10程度ができれば大丈夫みたいです…すいません。
0240デフォルトの名無しさん2007/01/03(水) 01:21:45
>>233
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3309.c
0241デフォルトの名無しさん2007/01/03(水) 02:00:41
>>240
本当にありがとうございます。助かりました。
0242デフォルトの名無しさん2007/01/03(水) 02:45:13
>>239
例えば今回の場合、各マスは上下左右4方向に繋がっていて、入ってきた
方向へは動けないので、各マスごとに最大3方向から1方向を決定することになる。

仮に全マス数100(N=10)、通過できるマスが半数の50個の場合を考えると、
答えがないかどうかをチェックするために大雑把に3の50乗個の道を調べないと
いけない。これでは、もし1秒間に平均1億個の道をチェックできたとしても、
解決までに約2億年もかかる計算になる。

だから論理上正しいだけのプログラムを作ったところで、よほどNを小さくするとか
よほど易しい特別なパターンでない限り、答えを出したり
>条件を満たすものがない場合、できませんでした。と表示
したりはできない。
0243デフォルトの名無しさん2007/01/03(水) 02:57:17
>>203
lengthはdata[], select[]の長さで,返り値は最大の合計値.また,その合計値に
data[i]が使われればselect[i] = 1,使われなければselect[i] = 0がセットされる.
処理はΘ(n).

int solve(int data[], int length, int select[]) {
int i, p1, p2, p3, w; p1 = p2 = p3 = 0;
for (i=0; i<length; i++) {
if (p2 <= p3)
{ w = data[i] + p3; select[i] = i-3; }
else
{ w = data[i] + p2; select[i] = i-2; }
p3 = p2; p2 = p1; p1 = w; }
i = length-1;
if (p1 < p2) select[i--] = 0;
while (i >= 0) {
w = select[i];
select[i--] = 1;
while (i > w) select[i--] = 0; }
return p1 < p2? p2 : p1; }
0244デフォルトの名無しさん2007/01/03(水) 07:00:58
>>239
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3310.c

10×10 でも解けない盤面があるので未完成だが.
現在やっていることは

1. ハッシュで既出盤面をチェック.
2. 白マスと黒マスの個数が違うとクリア不能.
3. 非連結のときはクリア不能.
4. 行き止まりが多すぎるとクリア不能.

今後の加速の方針としては,ハッシュ方法を見直すことと,
アドホックにクリア不能パターンを列挙して枝を刈ることがある.


*問題のサイズはプログラムに対して相当影響するので
 適当なことを言うと参考にしづらいものしか出てこないよ.
0245デフォルトの名無しさん2007/01/03(水) 09:17:17
>>203
243では数値の範囲を自然数に限定してしまったので,実数まで拡張したものを載せときます.
引数,返り値,効率に関しては上と同じ.main関数はおまけ.

double solve(double data[], int length, int select[]) {
int i, ix, w; double p1, px, v;
p1 = px = 0.0; ix = -1;
for (i=0; i<length; i++) {
v = p1; p1 = px + data[i]; select[i] = ix;
if (v > px) { px = v; ix = i-1; } }
i = length-1;
if (px > p1) while (i > ix) select[i--] = 0;
while (i >= 0) {
w = select[i]; select[i--] = 1;
while (i > w) select[i--] = 0; }
return px > p1? px : p1; }

#include <stdio.h>
#include <stdlib.h>
#define LENGTH 15
int main() {
srand(time(NULL));
int i, select[LENGTH];
double data[LENGTH];
printf("data :");
for (i=0; i<LENGTH; i++) {
data[i] = (double)rand()/RAND_MAX-0.3; printf("%5.2lf ", data[i]); }
printf("\nchoice:");
double max = solve(data, LENGTH, select);
for (i=0; i<LENGTH; i++) { printf("%5d ", select[i]); }
printf("\nmax: %3.2lf\n", max); }
0246デフォルトの名無しさん2007/01/03(水) 10:17:54
[1] 授業単元:アルゴリズム
[2] 問題文(含コード&リンク):時間をdouble型に??時??分??秒.??ミリ秒として格納しているとして
二つのdoubleの差をミリ秒で求めるには?
[3] 環境ウィンドウズ
言語C++
例90004.45と85958.40だと答えは6000.5
 9:00;04.45 8:59:58.40
なんですが1秒は1000ミリ秒でしたっけ?
100ミリ秒の気もするのですが、よろしくお願いします。
0247デフォルトの名無しさん2007/01/03(水) 10:34:53
ミリは1/1000
0248デフォルトの名無しさん2007/01/03(水) 11:01:18
>>154
>>>88-90
>のURL行ける?
見れませんでした?見れると思います。

>>215
>88却下。俺にはできん...
質問の仕方が悪かったですか?
(154さんと同じ方ですか?)
0249デフォルトの名無しさん2007/01/03(水) 11:29:42
>246
90004.45と85958.40だと6050ミリ秒じゃないの?
0250デフォルトの名無しさん2007/01/03(水) 12:27:08
C++の宿題です。お願いします。

【問】
キーと値のペアを扱う、二分木クラスを自作せよ。std::map を参考にせよ。
下記のメンバ関数を実装せよ。

// 追加 - return: true: OK, false: NG(重複)
bool mymap::insert(int key, int val);

// 検索 - return: 見つかった key の val, 見つからない場合は、今のところは -1 で良い。
int mymap::find(int key);

// 削除 - return: true: OK, false NG(not found)
bool mymap::remove(int key);

// 表示 - 昇順
void mymap::print();
0251デフォルトの名無しさん2007/01/03(水) 23:43:23
[1] 授業単元:Cによるプログラミング実習
[2] 問題文(含コード&リンク):
生年月日を入力させ、その人が何日生きたかを表示させるプログラムを書け。
(閏年も考慮すること)
[3] 環境
 [3.1] OS:Windows XP
 [3.2] コンパイラ名とバージョン: bcc32
 [3.3] 言語: C
[4] 期限: 2007/01/08
[5] その他の制限: なし
0252デフォルトの名無しさん2007/01/04(木) 00:58:42
>>251
#include<stdio.h>
#include<time.h>

int main(void){
 time_t birthday, current;
 struct tm birthday_str={0,0,0};
 int year, mon, mday;

 printf("\n生年月日を入力して下さい\n");
 printf("例. 2007 1 1 : ");
 scanf("%d %d %d", &year, &mon, &mday);
 year-=1900;
 mon-=1;

 birthday_str.tm_year=year;
 birthday_str.tm_mon=mon;
 birthday_str.tm_mday=mday;

 birthday=mktime(&birthday_str);
 time(¤t);

 printf("生まれてから %d 日経ちました\n", (int)(difftime(current, birthday)/(60*60*24)));

 return 0;
}
■ このスレッドは過去ログ倉庫に格納されています