1 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 06:27:59 ] あなたが解けない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] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) 【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm 【C 関数検索 man on WWW】 www.linux.or.jp/JM/index.html 【過去ログ検索】 chomework.sakura.ne.jp/ 【wiki】 www23.atwiki.jp/homework/ 前スレ C/C++の宿題片付けます 136代目 pc12.2ch.net/test/read.cgi/tech/1274827528/
2 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 06:28:44 ] 前スレ最後で騒いでしまい、埋まってしまったので立てました。
3 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 06:45:53 ] #include <linux/kernel.h> #include <linux/syscalls.h> #include <linux/fs.h> #include <linux/mm.h> #include <linux/percpu.h> #include <linux/slab.h> #include <linux/capability.h> #include <linux/blkdev.h> #include <linux/file.h> #include <linux/quotaops.h> #include <linux/highmem.h> #include <linux/module.h>
4 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 06:52:42 ] > (解読可能であるかどうかの厳格な判定は知られていない) まれに複数の復号結果が生まれるかもしれないけど、一意になる可能性は結構高いのかもしれない。 復号化は昼休みにでも挑戦。
5 名前:デフォルトの名無しさん [2010/06/18(金) 07:08:03 ] 次の問題を解くプログラムを再帰を使って実装せよ。 問題 コインの種類として、1,5,8,10,15の5種類を与える。与えられた金額m に対して、最小枚数のコインでmを支払うときの枚数を求めよ。
6 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 07:36:59 ] >>5 #include <stdio.h> int coins[5] = {15,10,8,5,1}; int mod(int m, int coin) { int a, b; if(coins[coin]==1) { return m; } a = m / coins[coin]; b = m % coins[coin]; return (mod(b, ++coin) + a); } int main(int argc, char ** argv) { int m; printf("m=?\n"); scanf("%d", &m); printf("%d mai.\n", mod(m, 0)); return 0; }
7 名前:デフォルトの名無しさん [2010/06/18(金) 07:44:43 ] 解答ありがとうございます。 プログラムは、「再帰を使って」、 出力は、「最小枚数」でお願いします。 (例えば、m=33のときは、5枚ではなく3枚を出力)
8 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 07:58:09 ] 何年か前にそんな感じの問題見たなあ
9 名前:6 mailto:sage [2010/06/18(金) 08:09:01 ] 33円の時は15円が2枚、1円が3枚で、5枚が最小だと思うんだが、そう言う問題じゃなくて? 再帰はしてるよ
10 名前:デフォルトの名無しさん [2010/06/18(金) 08:16:13 ] 33円のときは、15円、10円、8円それぞれ1枚ずつで3枚。 こっちのほうが最小ですよね?
11 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 08:20:17 ] #include <stdio.h> int mincoin(int num, int n, int idx, int *coins, int maxidx); int main(){ int coins[] = {1,5,8,10,15}; int num=33; int n = mincoin(num, 0, 0, coins, sizeof(coins)/sizeof(coins[0])); printf("%d", n); return 0; } int mincoin(int num, int n, int idx, int *coins, int maxidx){ int i, min, res, rest; if(num == 0){ return n; } min = 10000000; for(i = idx;i < maxidx;i++){ rest = num-coins[i]; if(rest < 0) break; res = mincoin(rest, n+1, i, coins, maxidx); if(res < min){ min = res; } } return min; }
12 名前:デフォルトの名無しさん [2010/06/18(金) 08:27:19 ] >>11 エラーがでます
13 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 08:30:15 ] そりゃよかったね
14 名前:6 mailto:sage [2010/06/18(金) 08:42:01 ] >11 なるほど。。賢いやり方だ。
15 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 10:52:18 ] >>11 ,14 Dynamic Programming だね。
16 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 11:06:27 ] 数が大きくなるととんでもなく処理時間かかるし、賢いやり方とはいえないと思うが
17 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 11:25:37 ] >>5 #include <stdio.h> int min; void count(int n, int idx, int cnt, int *coin) { int i, temp = coin[idx]; if(n % temp == 0) { cnt += n / temp; if(cnt < min) min = cnt; return; } for(i = 0; i * temp < n; i++) count(n - i * temp, idx-1, cnt + i, coin); } int main(void) { int coin[] = {1, 5, 8, 10, 15}, n; scanf("%d", &n); min = n; count(n, sizeof coin / sizeof *coin - 1, 0, coin); printf("%d\n", min); return 0; }
18 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 11:27:18 ] >>16 もっといい方法が在るなら、コードか参考urlをどうぞ。
19 名前:17 mailto:sage [2010/06/18(金) 11:50:26 ] ちょっと改良 #include <stdio.h> int min; void count(int n, int idx, int cnt, int *coin) { int i, temp = coin[idx]; if(min <= cnt) return; if(n % temp == 0) { cnt += n / temp; if(cnt < min) min = cnt; return; } for(i = n / temp; i >= 0; i--) count(n - i * temp, idx - 1, cnt + i, coin); } int main(void) { int n, coin[] = {1, 5, 8, 10, 15}; scanf("%d", &n); min = n; count(n, sizeof coin / sizeof *coin - 1, 0, coin); printf("%d\n", min); return 0; }
20 名前:>>3-4 mailto:sage [2010/06/18(金) 12:03:12 ] 961 :デフォルトの名無しさん :2010/06/18(金) 01:29:00 [1]授業単元:暗号理論(大学専門コース) [2]問題文(含コード&リンク) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10714.lzh [3]環境 [3-1] OS:C/C++処理系があれば何でも可 [3-2] コンパイラ:gccに近い処理系が理想 [3-3] 言語:C/C++どちらでも可 [4] 9/15迄(夏休み終了まで) [5] 難しいそうです。無理しないほうがいいそうです。ただ出来たら テストの点に無関係に単位をくれるそうです
21 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 14:03:32 ] 解いた奴には天地の怒りの鉄槌と災厄が降り掛かるだろう系の 問題ぢゃね?
22 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 14:14:25 ] /がアルファベットに変換されるのってコメントとの関係なのかな
23 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 14:43:47 ] > (解読可能であるかどうかの厳格な判定は知られていない) デクリプトには答えが有るとは言ってない、に読める。 エンクリプトは何とか完成できたが、iii と iik, ijk, ijj の区別をつけるデクリプトは無理。 1番目の文字が、仮に、デクリプトするれば i と分かっても、 2通目の文字に j があれば ii と ij の2通り以上、46通り以下に可能性が分かれる。 なら、次文字から推測できる全候補をプログラムで表示するようにすればいいんではないだろうか。
24 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 15:22:00 ] 解読したら正解のコードになるんだったら面白かったのにそうでもないっぽいよね
25 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 15:43:05 ] >>24 まあ一週間くらい待ってて
26 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 15:49:55 ] >>25 作ってるなら途中のコードキボンヌ
27 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 16:43:46 ] >>26 動くのはエンコードだけだからいらんだろ
28 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 18:06:31 ] とりあえずここまで #include <linux/kernel.h> #include <linux/syscalls.h> #include <linux/fs.h> #include <linux/mm.h> #include <linux/percpu.h> #include <linux/slab.h> #include <linux/capability.h> #include <linux/blkdev.h> #include <linux/file.h> #include <linux/quotaops.h> #include <linux/highmem.h> #include <linux/module.h> #include <linux/writeback.h> #include <linux/hash.h> #include <linux/suspend.h> #include <linux/buffer_head.h> #include <linux/task_io_accounting_ops.h> #include <linux/bio.h> #include <linux/notifier.h> #include <linux/cpu.h> #include <linux/bitops.h> #include <linux/mpage.h> #include <linux/bit_spinlock.h> static int fsync_buffers_list(spinlock_t *lock, struct list_head *list); #define BH_ENTRY(list) list_entry((list), struct buffer_head
29 名前:デフォルトの名無しさん [2010/06/18(金) 18:14:16 ] >>23 解読できた単語を配列に保存していって、iiとijとかのように区別しにくいい単語に出あったら、保存した中にある単語を優先する、とかはどうだろう。
30 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 18:28:33 ] #include <stejo.h> kou malp(vpmf){ nqv qnborc_krrsd_lvgesftgp_mswt_iqghui; rvx sdjtwuekv_jywx_zjyzfAg; wxB xyCu_vowDEh_ztyyxnk; fyu(zplAvm_oAzAn_pzhowpBqB_qBFC_lChrCs=0; DqtDxu_rEDEv_sAiwyxFyE_tFGG_mFizGA<=11234; HrBGzC_uIHID_vBjEAFJGH_wJHK_nIjHKI++) gLB(JfoKLLgpM_kACD_BJIJiKj=5; NhqOMPirQ_lCEF_DKLMkNl<=223456; RjsSNTktU_mEGH_FLOPmQn++) hMC( VWRN_OsPSTo_XDIOQxM=6; YZUR_StTVWp_aEJPUyN<345677; bcXV_WuXYZq_dFKQYzO++) pGeRai("%d %d %d %d", fgbZ_avbcdr_hHLScAP, ijed_ewffgs_kIMTgBQ, llumUnmvo_nGNO_HRhitju,hxSpJT_CiVWU_DPkVKWXXq_Ejkk_wrkYYZ); LvlQMZ 7; }
31 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 18:31:32 ] >>29 全検索すると候補の数が一万を超えることも多いので 辞書使わないと厳しいです
32 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 18:49:55 ] これ見てよ↓ livedoor.blogimg.jp/tekepo/imgs/3/4/3414dfca.jpg ばらまこうぜ!
33 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 18:56:54 ] >>30 #include <stdio.h> int main(void){ int omaira_konna_kudaranai_koto_higana; int ichinichi_jyuu_yattete; int iito_omotte_irunoka; for(omaira_konna_kudaranai_koto_higana=0; omaira_konna_kudaranai_koto_higana<=10000; omaira_konna_kudaranai_koto_higana++) for(ichinichi_jyuu_yattete=0; ichinichi_jyuu_yattete<=123456; ichinichi_jyuu_yattete++) for( iito_omotte_irunoka=0; iito_omotte_irunoka<234567; iito_omotte_irunoka++) printf("%d %d %d %d", iito_omotte_irunoka, iito_omotte_irunoka, ichinichi_jyuu_yattete,omaira_konna_kudaranai_koto_higana); return 0; }
34 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 19:02:03 ] >>33 すげぇ。じゃデコーダーほぼ出来てるんだ ん?
35 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 19:13:22 ] C言語の構文からマクロを乱用してないとして void for return を手がかりに逆算したい
36 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 19:18:47 ] >>35 do と goto と continue も追加で
37 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 19:21:52 ] if もだ
38 名前:33 mailto:sage [2010/06/18(金) 20:06:02 ] >>34 全然できてないよ >>33 はかなりの部分人力で解いたものw
39 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 20:28:21 ] kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10717.txt とりあえず1行目だけのデコード結果をうpしたからエンコーダのデバッグにでも使ってくれ 2行目までもデコードしてみたがファイルが1G越えたから途中でやめた 効率的にデコードするには構文解析するといいかもしれない たとえば#w7 -> #include, w3( -> if(, w5( -> while( (w:文字、その後の数字は文字の個数) などのヒントをあらかじめ与えておき正しく変換できないときは枝狩する また、シンボルテーブルを作り、シンボルテーブルにない変数を使用しようとしたら枝狩するなど 構文解析によりかなりの枝狩ができると思われる(#define HOGE forとかされると死ぬが)
40 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 20:31:24 ] >>20 のlinuxのディストリビューション分かる人いませんか? 手元にある VineLinux3.2 kernel2.4 を見てみたけど違うみたいでした
41 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 20:57:47 ] 前にエラー文字列で検索したら、どうもこれに近い。 ttp://www.google.com/codesearch/p#8lz4Axekcxw/fs/buffer.c あと、prob.txtの引数の間のtabはなんなんだろう。 ソースコードを整形したのかな。
42 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 21:03:50 ] >>40 別にそれは関係ないと思うよ。 復号したコードをコンパイルするとかいう話でもないしね。
43 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 21:04:24 ] >>41 static void buffer_io_error(struct buffer_head *bh) までは手動で頑張ったのにw
44 名前:40 mailto:sage [2010/06/18(金) 21:07:55 ] >>42 識別子を辞書登録するのが大変なので include しているファイルの中身も読ませようと思っていたのです が、>>41 のおかげで対応が分かるので必要なくなりました
45 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 21:08:59 ] 復号したらそのままコンパイル出来るものを、添付書類無し で再頒布するのはGPLに抵触しかねないから、 コメントとか外したりいろいろ細工してる可能性もあるだろ
46 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 21:15:28 ] >>44 ああー、なるほど。そういう理由だったのか。スマソ。
47 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 21:57:17 ] この行より前は >>41 と一致する YCvXRg("クォートされた部分も暗号化対象外\n",wYkyL);
48 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 21:58:17 ] >>45 この場合頒布してるのは質問者?回答者?
49 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 22:12:23 ] 該当箇所に printf("", inode); を挿入したら完全に一致した
50 名前:デフォルトの名無しさん [2010/06/18(金) 22:38:46 ] [1] 授業単元:オブジェクトプログラミング [2] 問題文(含コード&リンク):図1のプログラムを参考に、文字配列とアドレスの関係、すなわち、 char str[ ] = “abc”とアドレスの関係を調べよ。特にアドレスが幾つずつ変化するかを理解すること。 尚、char型変数へのポインタ変数は、char *ptr;になることを注意すること。 [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:2010年6月19日[5] その他の制限:int main(void){から始まる 図1 #include<stdio.h> int main(void){ int a[4]; int *p; p = &a[0]; for(i=0;i<4;i++){ a[i] = i; } for(i=0;i<4;i++){ printf(“a[%d]=%d\n”i,a[i]); printf(“p = %p\n”,p); printf(“*p = $d\n\n”, *p); } }
51 名前:デフォルトの名無しさん [2010/06/18(金) 22:40:07 ] >>50 図1の実行例 a[0]=0 p = 0x22ccd0 *p = 0 a[1]=1 p = 0x22ccd4 *p = 2 a[2]=2 p = 0x22ccd8 *p = 2 a[3]=3 p = 0x22ccdc *p = 3 つまり、int型では4byteずつ変化する。これをchar型は1byteずつ変化するということを示しなさいということです。
52 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 22:43:49 ] >>51 charに変えるのが出来ないっていってますか?
53 名前:デフォルトの名無しさん [2010/06/18(金) 22:50:29 ] >>52 そうです。 それから、もうひとつ 図1をdouble型に変えるのもお願いします。
54 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 01:54:57 ] こういうこと? #include <stdio.h> int main(void) { char str[] = "abc", *ptr; int i; ptr = &str[0]; for(i = 0; str[i]; i++, ptr++) { printf("str[%d] = %c\n", i, str[i]); printf("ptr = %p\n", ptr); printf("*ptr = %c\n\n", *ptr); } return 0; }
55 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 02:49:18 ] [1] 授業単元: [2] 問題文(含コード&リンク):kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10719.zip [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: [3.3] 言語: C [4] 期限: ([2010年06月20日23:59まで] [5] その他の制限:
56 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 03:00:29 ] >>55 #include <stdlib.h> #include <time.h> void random_format(int num_data, int array[]) { int i; srand(time(NULL)); for(i = 0; i < num_data; i++) array[i] = (int)( (double)rand() / RAND_MAX * 100.0 ); }
57 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 05:15:59 ] >>55 0〜99の数値が全て1回ずつ必要なら、以下でok。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define NMAX 100 int main(void) { int i, a[NMAX], tmp, w; srand(time(NULL)); for (i = 0; i < NMAX; i++) a[i] = i; for (i = 0; i < NMAX; i++) { w = rand() % (NMAX - i) + i; tmp = a[w]; a[w] = a[i]; a[i] = tmp; } return 0; }
58 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 05:33:12 ] >11 >min = 10000000; 10000000って数字はどっから出てきたの?
59 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 06:19:17 ] >>58 有り得ないほどの大きい数字なら何でも良かったんじゃないかな? min = num/coins[0]; でいいと思う。
60 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 12:42:30 ] >>28 バージョンは分からんが、Linuxカーネルのfs/buffer.cをエンコードしてるのか?
61 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 12:43:06 ] for(i = 0; i < NMAX; i++) { w = rand() % (i + 1); a[i] = a[w]; a[w] = i; }
62 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 12:48:14 ] >>20 一応MFCでデコードしながら、分からなくなったらユーザに聞いてくるアプリにしてみた。 コメントとかリテラルとか、まだ一回も動いてないコードとか有るし、 デコードした文字列をエディットに出力して、ユーザが判断する材料にさせてるんだが、 うまくエディットコントロールスクロールさせられなくて面倒くさくなって放置してる。 (メインスレッドでループしながらエディットに出力して、且つスクロールさせようってのがダメなんだろうが。。) 需要があればうpします。 一旦入力した候補はhistファイルに取っておくので、これを使って地道にやってけばいずれデコード出来ると思う。
63 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 16:02:35 ] >>20 のエンコード部分 typedef unsigned char uchar; void encode_output(int moji) { static int is_first=1; static uchar next_table[256], table[256]; if(is_first) { int i; for(i=0;i<256;i++) next_table[i]=table[i]=i; for(i='A';i<'Z';i++) next_table[i]=i+1; next_table[i]='a'; for(i='a';i<'z';i++) next_table[i]=i+1; next_table[i]='A'; for(i='0';i<'9';i++) next_table[i]=i+1; next_table[i]='0'; is_first=0; } putchar(table[moji]); table[moji]=next_table[table[moji]]; }
64 名前:デフォルトの名無しさん [2010/06/19(土) 16:26:50 ] >>54 ありがとうございました。
65 名前:デフォルトの名無しさん [2010/06/19(土) 16:49:54 ] [1] 授業単元:オブジェクトプログラミング [2] 問題文(含コード&リンク):以下のプログラムをdouble型にせよ。 尚、double型変数へのポインタ変数は、double *ptr;になることに注意すること。 [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:2010年6月19日[5] その他の制限:int main(void){から始まる #include<stdio.h> int main(void){ int a[4]; int *p; p = &a[0]; for(i=0;i<4;i++){ a[i] = i; } for(i=0;i<4;i++){ printf(“a[%d]=%d\n”i,a[i]); printf(“p = %p\n”,p); printf(“*p = $d\n\n”, *p); } } 実行例は>>51 と同じです
66 名前:023 mailto:sage [2010/06/19(土) 17:08:52 ] #include <stdio.h> void encode_output(int moji); int main(void){ int c, slash = 0; while((c = getchar()) != EOF) { if(c>='a' && c<='z' || c>='A' && c<='Z' || c>='0' && c<='9'){ if(slash){ /* /X は、同じ文字で2回出力 */ encode_output(c); slash = 0; } encode_output(c); } else if(c == '*') { if(slash){ /* /*のコメントは読み飛ばす */ do { while(getchar() != '*'); } while(getchar() != '/'); slash = 0; } else putchar(c); } else if(c == '/') { if(slash) { /* // comment は、そのまま出力 */ putchar(c); do putchar(c); while((c = getchar()) != '\n'); putchar(c); slash = 0; } else slash = 1; } else if(c == '"') { /* "string" は、そのまま出力 */ if(slash) {slash = 0; putchar(c);} /* /X は、同じ文字で2回出力 */ do { if(c == '/') {slash = 1; continue;} if(slash) {slash = 0; putchar(c);} putchar(c); } while((c = getchar()) != '"'); putchar(c); } else { if(slash) {slash = 0; putchar(c);} /* /X は、同じ文字で2回出力 */ putchar(c); } }}
67 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 18:05:22 ] >>5 亀ですがこういうのはどうなんでしょう? #include <stdio.h> int coin(int m,int i,int sum) { int a[]={1,5,8,10,15}; sum=sum+m/a[i];m=m%a[i]; if (m==0)return sum; if (!i){sum+=m;return sum;} if ((m%a[i]==3||m%a[i]==4)&&(sum)){sum--;m=m+a[i];} return coin(m,i-1,sum);} int main(void){ int x; printf("金額を入力してください:"); scanf("%d",&x); printf("最小枚数は%d枚です。\n",coin(x,4,0)); return 0;}
68 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 21:15:54 ] >>62 見せて見せて
69 名前:62 mailto:sage [2010/06/19(土) 21:54:03 ] >>68 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10721.zip うpしました。 input.txtに暗号化された内容をおいておきます。 hist.txtは履歴の入力。実行するとhistout.txtができるので、それをhist.txtに書き換えればおk。 deb.txtにデバッグログ dec.txtに復号化したもの enc.txtは今のところ何も出ない。 です。 一応7行目くらいまでやって放置してます。 バグもいっぱいあると思うんで、実行しながら候補を入れていき、バグ取りしてけば・・というレベルです。
70 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 21:55:47 ] >>67 興味深いな。 > if ((m%a[i]==3||m%a[i]==4)&&(sum)){sum--;m=m+a[i];} 3,4になるプロセスが判らない。
71 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 22:22:38 ] 特定の組み合わせ限定だからだろ
72 名前:デフォルトの名無しさん [2010/06/19(土) 22:56:00 ] >>65 です 誰かよろしくお願いします。
73 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 23:02:49 ] >>70 最初の3,4以外の、8以上のm%5で3,4になる数字は最小枚数を求める時必ず8が入るので 15と10で割り過ぎないように先に8で割るようにしました。
74 名前:73 mailto:sage [2010/06/19(土) 23:07:36 ] ×先に8で割るように ○後で8で割れるように
75 名前:デフォルトの名無しさん mailto:sage [2010/06/19(土) 23:12:30 ] >>65 #include<stdio.h> int main(void){ int i; double a[4]; double *p; p = a; for(i = 0; i < 4; i++){ a[i] = i; } for(i = 0; i < 4; i++, p++){ printf("a[%d]=%f\n", i, a[i]); printf("p = %p\n", p); printf("*p = %f\n\n", *p); } return 0; }
76 名前:デフォルトの名無しさん mailto:sage [2010/06/20(日) 01:10:03 ] >>73 なるほど。 オーソドックスな解法は、>>17 のようなDPだろうけど、>>67 でも出来る、 という事は、条件付きで数学的に等価なのかもな。
77 名前:デフォルトの名無しさん [2010/06/20(日) 02:55:07 ] >>75 ありがとうございました
78 名前:デフォルトの名無しさん [2010/06/20(日) 02:57:10 ] [1] 授業単元:オブジェクトプログラミング [2] 問題文(含コード&リンク):以下のプログラムをdouble型について調べるプログラムを作成せよ。 尚、単純ポインタが指す値をprintf(“%p) =0x%x\n”, ptr_d, *ptr_d); を用いて表示すると図1のような実行結果を得るが、図2のように表示をするようにしなさい。 [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:2010年6月20日[5] その他の制限:int main(void){から始まる
79 名前:デフォルトの名無しさん [2010/06/20(日) 02:58:58 ] #include <stdio.h> int main(void){ char src[32], dst[32]; char *ptr_c; int *ptr_i, *ptr; double *ptr_d; int i; // src[i]配列にデータを格納 for(i=0; i<32; i++){ src[i] = i; } // dst[i]配列へのコピー for(i=0; i<32; i++){ dst[i] = src[i]; } //配列の出力 for(i=0; i<32; i++){ printf("dst[%d]=0x%x\n", i, dst[i]); } // ptr_cにsrcの先頭アドレスをコピー ptr_c = src; // ptrを使用してsrc[i]のデータを内容を出力する。 for(i=0; i<32; i++){ printf("%p) = 0x%x\n", ptr_c, *ptr_c); ptr_c++; } }
80 名前:デフォルトの名無しさん [2010/06/20(日) 03:00:45 ] 図1 0x22ccc0) = 0.3020100 0x22ccc8) = 0.b0a0306 0x22ccd0) = 0.13121110 0x22ccd8) = 0.1b1a1918 図2 ptc_d:0x22ccc0) = 0.3020100 0x22ccc4) = 0.7060504 ptr_d:0x22ccc8) = 0.b0a0306 0x22cccc) = 0.f0e0d0e ptr_d:0x22ccd0) = 0.13121110 0x22ccd4) = 0.17161514 ptr_d:0x22ccd8) = 0.1b1a1918 0x22ccdc) = 0.1f1e1d1c
81 名前:023 mailto:sage [2010/06/20(日) 13:34:27 ] >>069 VS2005で動かしてみました。 ゲームとしては7行くらいでゲームオーバーでもかまいません。 ただ、/を入れた後の文字選択が2回必要なのはなぜでしょうか。
82 名前:デフォルトの名無しさん [2010/06/20(日) 14:57:39 ] >>78 です どなたか、よろしくお願いします。
83 名前:デフォルトの名無しさん mailto:sage [2010/06/20(日) 15:06:53 ] 以前のヤツからそうなんだけど、書いてあるコード実行しても図の例と同じにはならないんだよな
84 名前:デフォルトの名無しさん [2010/06/20(日) 15:49:25 ] すみません。説明不足でした。 ソースコードは、int型で書かれています。これを、double型に書き換えていただきたいんです。 そして、double型に書き換えたものを実行すると、図2のように表示せよという問題です。 よろしくお願いします。
85 名前:デフォルトの名無しさん mailto:sage [2010/06/20(日) 16:16:30 ] >>78 #include<stdio.h> #define SIZE 4 int main(void){ int i; double src[SIZE], dst[SIZE]; double *ptr_d; // データ格納? for (i = 0; i < SIZE; i++) { src[i] = i; dst[i] = src[i]; } // 配列の内容を出力 for (i = 0; i < SIZE; i++) { printf("%p) = %f\n", &dst[i], dst[i]); } // ポインタと配列を使って内容を出力 for (ptr_d = src, i = 0; i < SIZE; ptr_d++, i++) { printf("ptr_d :%p) = %f\n", ptr_d, *ptr_d); printf("src[%d]:%p) = %f\n", i, &src[i], src[i]); } return 0; } すいません。 問題のゴールが明確には分からなかったので適当に書いてます。 大枠はこれでいいと思うので書き換えて使ってください。
86 名前:62 mailto:sage [2010/06/20(日) 16:49:11 ] >>81 入力しても時々無視されちゃってます。 バグですが、もう一度入れれば入るみたいなんで、無視しちゃってください。 (直して^^;)
87 名前:023 mailto:sage [2010/06/20(日) 17:16:35 ] int ch, ch2, ch3; bool slash = false; /****/ try{ /****/ while(1){ ch = skip(); if(ch == EOF) break; plane_put(ch); kouhosu = 0; bslash = 0; ch2 = fgetc(fp1); if(!kigou(ch2) && (ch2 == ch + 1)){ bslash=1;} ungetc(ch2, fp1); if(slash) { // add 2010.6.20 ch = ch3; slash = false; }else{ ch = fukugou(ch);} dec_put(ch); fputc(ch, fp3); if(ch=='/'){ ch3 = fukugou(ch2 - 1); angou(ch3); slash = true; // add 2010.6.20 }else{ deb("angou=%c\n",ch); angou(ch); } }}
88 名前:62 mailto:sage [2010/06/20(日) 18:08:56 ] >>87 ありがとうございます!! kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10722.zip に更新しました。 スクロール出来なくて今何をデコードしてるのか分からなくなってた問題は 別スレッドのポップアップウインドにしたので解消しました。 なんか'/'の扱いが難しいすね。よく考えると、'/'と見なしたら、その次の文字を-1して復号化するんだけど、 その復号化において、さらに、'/'と見なすべき場合は再帰でやらないと出来ないんじゃないだろうか。。という気がしてきた。
89 名前:62 mailto:sage [2010/06/20(日) 18:31:48 ] っていうか、ほぼ毎回、候補が複数出てくる。 これほとんど無理だよねw
90 名前:デフォルトの名無しさん mailto:sage [2010/06/20(日) 20:24:13 ] ?1から10までの積を計算するプログラムを書け。このとき,whileループを用いて、 画面に 1*2*3*・・・・*10 = という風に表示されるようにすること。 期限は6/22までです。お願いします。
91 名前:デフォルトの名無しさん [2010/06/20(日) 20:24:33 ] 与えられた零以上の実数(a,b,c,d)と正の実数(e,f)に対して つぎのロンバーグ表と積分値を求めるプログラムを作成せよ (分割数:n=2^k≧16,推定回数:m≧3) I=∫ 1/(a*x^3+b*x^2+c*x+d)dx (e≦x≦f) ただし、キーボードから(a,b,c,d,e,f)を入力すれば 上記の定積分のロンバーグ表の値と積分値が画面表示 されるようなプログラムを作ること。 この問題を解ける方教えていただけませんか?
92 名前:デフォルトの名無しさん mailto:sage [2010/06/20(日) 20:35:12 ] >>90 #include <stdio.h> int main(void) { int i=10,sum=1; while(i--)printf(i?"%d*":"%d=%d\n",i+1,sum*=(i+1)); return 0; }
93 名前:デフォルトの名無しさん mailto:sage [2010/06/20(日) 20:41:29 ] >>1 >>1 大事なことなので2回言いました。最近守らないやつが多すぎる。
94 名前:デフォルトの名無しさん mailto:sage [2010/06/20(日) 20:44:42 ] >>78 char src[32], dst[32]; int *ptr_i,*ptr; double *ptr_d; int i; // src[i]配列にデータを格納 for(i=0; i<32; i++){ src[i] = i; } // dst[i]配列へのコピー for(i=0; i<32; i++){ dst[i] = src[i]; } // ptr_cにsrcの先頭アドレスをコピー ptr_d = (double *)src; // ptrを使用してsrc[i]のデータを内容を出力する。 for(i=0; i<4; i++){ printf("ptc_d:%#6x) = 0.%x\n", ptr_d, *ptr_d); ptr_i = (int *)ptr_d; printf(" :%#6x) = 0.%x\n", (ptr_i+1), *(ptr_i+1)); ptr_d++; } 図2 ptr_d:0x22ccc8) = 0.b0a0306 は>>79 のソース内容から外れるので考慮していない
95 名前:91 [2010/06/20(日) 20:58:11 ] [1] 授業単元:数値計算法 [2] 問題文(含コード&リンク): 与えられた零以上の実数(a,b,c,d)と正の実数(e,f)に対して つぎのロンバーグ表と積分値を求めるプログラムを作成せよ (分割数:n=2^k≧16,推定回数:m≧3) I=∫ 1/(a*x^3+b*x^2+c*x+d)dx (e≦x≦f) ただし、キーボードから(a,b,c,d,e,f)を入力すれば 上記の定積分のロンバーグ表の値と積分値が画面表示 されるようなプログラムを作ること。 [3] 環境 [3.1] OS:vista [4] 期限: 無期限
96 名前:デフォルトの名無しさん mailto:sage [2010/06/21(月) 05:37:05 ] >>89 適当に選ぶと正解じゃない場合は常に行き詰まる模様
97 名前:デフォルトの名無しさん mailto:sage [2010/06/21(月) 07:33:49 ] エロゲの選択肢よりシビアだな
98 名前:023 mailto:sage [2010/06/21(月) 09:02:14 ] decrypt 窓が、文字の無いところを表示するから、常に横スクロールが必要。
99 名前:デフォルトの名無しさん mailto:sage [2010/06/21(月) 13:31:35 ] >>95 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10726.txt
100 名前:87 の修正を修正 mailto:sage [2010/06/21(月) 16:05:27 ] int ch, ch2, ch3; bool slash = false; /****/ try{ while(1){ ch = skip(); if(ch == EOF) break; plane_put(ch); scroll(IDC_EDIT3); // add 2010.6.21 他のscroll()呼び出しは削除 kouhosu = 0; bslash = 0; ch2 = fgetc(fp1); if(!kigou(ch2) && (ch2 == ch + 1)){ bslash=1;} ungetc(ch2, fp1); if(slash) { // add 2010.6.20 ch = ch3; slash = false; }else{ ch = fukugou(ch);} dec_put(ch); fputc(ch, fp3); if(ch=='/'){ kouhosu = 0; // add 2010.6.10 候補を消す ch3 = fukugou(ch2 - 1); angou(ch3); slash = true; // add 2010.6.20 }else{ deb("angou=%c\n",ch); angou(ch); } }}
101 名前:デフォルトの名無しさん mailto:sage [2010/06/21(月) 16:08:25 ] そろそろ別にスレでも作ってそっち行ってくんないかな