1 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 01:16:00 ] 他人のソースを読むことは非常に勉強になります。 と言うわけで、初心者〜プロの方まで様々な人が書いたソースを見て、より良いプログラムを作れるようになろうと言う目論見です。 問題は未来アンカーで踏んだ人が空気を読んだ問題を出しましょう。 解答ソースを貼る人用テンプレ 【C言語歴】 (例)4年 【レベル】 (例)初心者、プロ、学校で習った程度 など 【コンセプト】 (例)処理速度重視、可読性重視、容量重視 など 【コメント】 (例)みっくみくにしてやんよ。など、有れば 長すぎるソースはこちらへ ttp://codepad.org/ 宿題は C/C++の宿題片付けます 130代目へ pc12.2ch.net/test/read.cgi/tech/1250204272/ 相談は C言語なら俺に聞け(入門篇)Part54などへ pc12.2ch.net/test/read.cgi/tech/1254829314/
35 名前:デフォルトの名無しさん mailto:sage [2009/10/19(月) 21:35:57 ] では少し早いですが問題を・・。 【問題】 100個の数字をランダムに並べ替えて出力するプログラムを作成してください。 ※同じ数は出力しない。毎回違った実行結果を表示する。 アルゴニズムと処理の違いが楽しみです。 次の問題は 一応50レス先の >>85 スレが停滞したらまたその時。。
36 名前:デフォルトの名無しさん mailto:sage [2009/10/19(月) 21:45:20 ] >>35 問題訂正・・。 【問題】 1〜100までの数字をランダムに並べ替えて出力するプログラムを作成してください。 ※同じ数は出力しない。毎回違った実行結果を表示する。
37 名前:デフォルトの名無しさん mailto:sage [2009/10/19(月) 21:53:52 ] $ cat a.cpp #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { time_t t; t = time(0); srandom(t); int a[100]; for (int i = 0; i < 100; ++i) a[i] = i; for (int i = 0; i < 100; ++i) { int k = i + random() % (100 - i); printf("%d\n", 1 + a[k]); a[k] = a[i]; } return 0; } C99ってことで
38 名前:37 mailto:sage [2009/10/19(月) 21:58:41 ] 乱数は考えるのがめんどくさかったので、 random() でごまかした。 random()の剰余で求める範囲の値を取り出すのは、ほんとはよい習慣ではない。 割り算を使うほうがいい。
39 名前:37 mailto:sage [2009/10/19(月) 22:00:23 ] いちおうテンプレ 【C言語歴】 かなり長い 【レベル】 プロ 【コンセプト】 KISS 【コメント】 たたき台ってことで、よろしく。
40 名前:デフォルトの名無しさん mailto:sage [2009/10/19(月) 22:27:31 ] #include<stdio.h> #include<stdlib.h> #include<time.h> #define MIN (1) #define MAX (100) #define LENGTH (MAX - MIN + 1) int main() { int data[LENGTH]; // データの初期化 for(int i = MIN; i <= MAX; i++) { data[i - MIN] = i; } // データの並べ替え srand(time(NULL)); for(int i = 0; i < LENGTH; i++) { int temp; temp = data[i]; int selected_index = rand() % (MAX - i) + i; data[i] = data[selected_index]; data[selected_index] = temp; } // 出力 for(int i = 0; i < LENGTH; i++) { printf("%d\n", data[i]); } return 0; }
41 名前:デフォルトの名無しさん mailto:sage [2009/10/19(月) 22:28:29 ] >>37 はえー・・・・ さすがプロ・・。 問題作った言い出しっぺが作れてません。 コンパイル通るのに動かないょ。
42 名前:40 mailto:sage [2009/10/19(月) 22:32:14 ] 【C言語歴】 ほとんど書いたことない 【レベル】 Cは初級 【コンセプト】 変化を考慮 【コメント】 書き方などご指摘がありましたらよろしくお願いします。
43 名前:デフォルトの名無しさん mailto:sage [2009/10/19(月) 23:20:43 ] 【C言語歴】 6年 【レベル】 仕事で使用 【コンセプト】 擬似乱数 【コメント】 PCは書き込み規制・・・ #include <stdio.h> #include <string.h> #include <time.h> void main(){ char map[100]; time_t timer; int a, b, p, q, i = 0; memset(map, 0x02, sizeof(map)); time(&timer); a=timer%100000; p=(timer/7)%1000; q=(timer/3)%1000; while(1){ a=(((a*p+q)/10)%100000); b=a/1000; if(0<map[b]){ printf("%3d ",b); map[b]--; i++; }else{ while(1){ if(b<99) b++; else b = 0; if(0<map[b]){ printf("%3d ", b); map[b]--; i++; break; } } } if(i>=200) break; } }
44 名前:デフォルトの名無しさん mailto:sage [2009/10/19(月) 23:23:36 ] 【C言語歴】 1ヶ月 【レベル】 超初心者 【コンセプト】 ちゃんと動くように書くのが精一杯 【コメント】 先月からC言語を勉強しはじめました。無限ループから抜け出せない。。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX_NUM (100) int main (void){ int rnd[MAX_NUM] = {0}; int i, j, temp; MORE: for(i = 0; i < MAX_NUM; ){ temp = 0; srand((unsigned)time(NULL)); temp = rand () % MAX_NUM; if (0 < temp && temp < MAX_NUM){ for (j = 0; j = i; j++){ if (rnd[j] != temp){ rnd[i] = temp; i++; }else goto MORE; } }else goto MORE; } for ( i = 0; i <= MAX_NUM - 1 ; i++){ printf ("%d\n", rnd[i]); } return (0); }
45 名前:43 mailto:sage [2009/10/19(月) 23:25:35 ] 100*2で出力になってる… memsetは1でi>=100でbreak これだと発生しにくい数が出るけど…
46 名前:デフォルトの名無しさん mailto:sage [2009/10/19(月) 23:36:03 ] >>37 氏 目から鱗が・・。 コンパイル通りませんでしたが。 コピペだからでしょうか。 そのアルゴいただきます。
47 名前: ◆yic3X9PxrE mailto:sage [2009/10/19(月) 23:49:20 ] >37 これは良いお手本。 >40 レベル考えりゃ上出来。叩き台にはむしろこちらが相応しい。 敢えてツッコミ入れるなら、 ・稀に「1と1を交換」のような、無駄な操作が発生する辺りは要改善かも。 ・並べ替えの部分は↓を先頭に持ってきて、swap処理を固めた方が好ましいかと。 int selected_index = rand() % (MAX - i) + i;
48 名前: ◆yic3X9PxrE mailto:sage [2009/10/20(火) 00:42:15 ] >43 ・if(i>=100) break; は while の条件に書けば良いような。(効率気にするならdo〜while) ・1で初期化し-1するより、0で初期化し、1代入の方が良い気が。 (「配列全体を0で初期化」なら char map[100] = {0}; のように書けるので。) ・アルゴリズムは中々凝ってるような。(一部良く分からないけど…) >44 ・まづはgoto使うのを止めれ。ループとかブロック脱出に使うのは絶対ダメ。 ・else ケースに括弧を付けるべき。括弧の対応が分かり辛く、フローも追い難い。 ちなみに無限ループに陥るのは、i がMOREにジャンプする度リセットされるから。 かつ内側のforループ内でほぼ確実にMOREにジャンプする。
49 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 05:29:42 ] この問題じゃ工夫の余地が無いよな。
50 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 06:10:06 ] >> // データの並べ替え >> srand(time(NULL)); >> for(int i = 0; i < LENGTH; i++) >> >40 >> ・稀に「1と1を交換」のような、無駄な操作が発生する辺りは要改善かも。 for(int i = 0; i < LENGTH-1; i++)
51 名前: ◆yic3X9PxrE mailto:sage [2009/10/21(水) 23:21:31 ] >50 それだけでは不足。 selected_index の範囲も要修正。 >46 >コンパイル通りませんでしたが。 c99対応のコンパイラ(gccなど)が必要。
52 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 00:59:05 ] 良う修正せん。どう修正する。
53 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 10:49:43 ] >>52 何を?
54 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 11:09:17 ] >>51
55 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 11:17:13 ] >>54 どっちを?
56 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 11:23:14 ] selected_index を修正する?
57 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 00:54:03 ] >40 >int selected_index = rand() % (MAX - i) + i; selected_index ⇒ i 〜 MAX-1
58 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 01:49:52 ] >40 int selected_index = rand() % (LENGTH - i) + i; kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9999.c
59 名前:58 mailto:sage [2009/10/24(土) 13:54:06 ] これをtemp省略前の状態にリバース! pc12.2ch.net/test/read.cgi/tech/1255709298/229 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int i, k, n, *p, temp; srand(time(0)); scanf("%d", &n); p = malloc(n * sizeof(int)); if(!p) return 1; for(i=0; i<n; i++) { p[i] = i; k = rand() % (i + 1); temp = p[i]; p[i] = p[k]; p[k] = temp; } printf("["); for(i=0; i<n; i++) printf(" %d", p[i]); printf(" ]\n"); free(p); return 0; }
60 名前:>>1 mailto:sage [2009/11/08(日) 09:10:38 ] C/C++/STL/MFC/CLI 共通問題 【問題】 10進数を入力して2進数を表示する。 ※入力は1回のみで、繰返しはしない。数字以外は入力しない。 ※正数は先頭の0は表示しない。負数は32ビットを表示する、間に空白などは埋めない。 ※入力にE又は小数点がある場合、浮動小数点数は32ビットで考える。 次の問題は 40 レス先の >>100
61 名前:デフォルトの名無しさん mailto:sage [2009/11/08(日) 10:47:38 ] 頭の0を取るのは正規表現でも使ってください #include <stdio.h> #include <stdlib.h> #include <string.h> void dmp(unsigned char *b, int len) { int i; for(i = len; --i >= 0; ){ int j; /* printf(" %02x ", b[i]); */ for(j = 256; (j >>= 1) > 0; ){ printf("%d", (b[i] & j) ? 1 : 0); } } printf("\n"); }
62 名前:デフォルトの名無しさん mailto:sage [2009/11/08(日) 10:49:27 ] int main(int ac, char **av) { char buf[4096]; int i, f; printf("input: (123, 0.5, 3.4e-6, etc...) > "); fgets(buf, sizeof(buf), stdin); printf(buf); f = 0; for(i = 0; i < strlen(buf); i++){ char c = buf[i]; if((c == '.') || (c == 'E') || (c == 'e')){ f = 1; break; } } if(f){ double d; sscanf(buf, "%lf", &d); printf("%.16f\n", d); dmp((unsigned char *)&d, sizeof(d) / sizeof(char)); }else{ sscanf(buf, "%d", &i); printf("%d\n", i); dmp((unsigned char *)&i, sizeof(i) / sizeof(char)); } return 0; }
63 名前:デフォルトの名無しさん mailto:sage [2009/11/08(日) 11:27:06 ] >>61 リトルエンディアンとビックリエンディアンの判別くらいしないといけないね >>60 ここの人か pc12.2ch.net/test/read.cgi/tech/1256818218/442
64 名前:60 mailto:sage [2009/11/08(日) 16:10:15 ] >>61 リトルエンディアンとビックリエンディアンの判別くらいしないといけないね C++ でコンパイルしてください。ビックリ→ビッグ。ワーニング→ウォーニング bool is_little_endian(unsigned char *b) { return b[0] ? true : false; } void dmp(unsigned char *b, int len, bool fill) { int i, j; bool zero = false; if(i=1, is_little_endian( (unsigned char *)&i )){ for(i = len; --i >= 0; ) for(j = 256; (j >>= 1) > 0; ) { if(b[i] & j) zero = true; if(fill || zero) printf("%d", (b[i] & j) ? 1 : 0); } } else { for(i = -1; ++i < len; ) for(j = 256; (j >>= 1) > 0; ) { if(b[i] & j) zero = true; if(fill || zero) printf("%d", (b[i] & j) ? 1 : 0); } } printf("\n"); }
65 名前:デフォルトの名無しさん mailto:sage [2009/11/09(月) 14:52:05 ] >>60 > ※入力にE又は小数点がある場合、浮動小数点数は32ビットで考える。 整数はなんとなくわかるが、浮動小数点数の仕様がわからない。 具体例をあげてくれ。 0.0 => 1.0 => 0.1 => 1E2 => 1E-1 => ところで、回答してるやつはちゃんとテストしている? 0 => 0 1 => 1 -1 => 11111111111111111111111111111111 (1が32個) 65535 => 11111111111111 (1が16個) -65536 => 111111111111110000000000000000 (1が16個と0が16個) 2147483647 => 1111111111111111111111111111111 (1が31個) -2147483648 => 10000000000000000000000000000000 (1が1個、0が31個) 特にエンディアンがどうこう言ってるやつは、リトルエンディアンとビッグエンディアンの両方でテストしている?
66 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 15:56:34 ] input: (123, 0.5, 3.4e-6, etc...) > 0.0 0 00000000000000000000000000000000 0 0000000000000000000000000000000000000000000000000000000000000000 input: (123, 0.5, 3.4e-6, etc...) > 1.0 1 00111111100000000000000000000000 1 0011111111110000000000000000000000000000000000000000000000000000 input: (123, 0.5, 3.4e-6, etc...) > 0.1 0.1000000014901161 00111101110011001100110011001101 0.1 0011111110111001100110011001100110011001100110011001100110011010 input: (123, 0.5, 3.4e-6, etc...) > 1E2 100 01000010110010000000000000000000 100 0100000001011001000000000000000000000000000000000000000000000000 input: (123, 0.5, 3.4e-6, etc...) > 1E-1 0.1000000014901161 00111101110011001100110011001101 0.1 0011111110111001100110011001100110011001100110011001100110011010
67 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 16:18:26 ] >>66 >【問題】 10進数を入力して2進数を表示する。 題意にそえば、10進数の0.5は2進数では0.1になるはずだが。 0.75(decimal)ならば0.11(binary)
68 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 20:00:57 ] IEEEの仕様があるのは知ってるか?
69 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 23:00:40 ] >>67 それはただの少数であって浮動小数点数ではないから題意に添わない
70 名前:デフォルトの名無しさん [2009/11/10(火) 23:25:18 ] 参考資料 ttp://ja.wikipedia.org/wiki/IEEE_754
71 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 23:31:45 ] >>67 しったか乙
72 名前:デフォルトの名無しさん mailto:sage [2009/11/11(水) 01:56:45 ] >>69 基の問題文は、浮動小数点数と明記していないから、67のような捉え方もできると思う。 もっとも、その後の※を読めば浮動小数点数なのだろうとは考えられるけど。
73 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 00:53:29 ] 捕手
74 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 07:57:49 ] 次のようなデータがテキストファイルで1ギガ程度あり、これを数値順にソートしたいです。 どのようにすればいいですか。 文字列 タブ文字1個 数値 ・・・・・・・・・・ ・・ ・・・・・ ・・ [参考]文字列は可変長です、文字列にタブは含みません。 数値範囲は32ビットunsigned intの整数です。 課題の要点ではないので、ソートはqsort等ライブラリを使用して下さい。 速度の為、malloc, newを使うなら、1024個を1回にとか、まとめてして下さい。
75 名前:74 mailto:sage [2009/12/06(日) 07:59:40 ] 次のレス番は>100くらい
76 名前:74 mailto:sage [2009/12/06(日) 12:08:24 ] > 文字列は可変長です、文字列にタブは含みません。 文字列の長さは固定長の間違いでした。
77 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 13:00:12 ] > 文字列の長さは固定長 そんなら OS で用意されている sort 使うよw ※"文字列は可変長"でも sort 使うが
78 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 13:53:38 ] sort -n +1
79 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 08:34:04 ] 題目:宝くじの「還元率計算」 入力:標準ストリーム(テキストファイル) 1行目 1枚の金額 "," 発売総枚数 2行目以降 順位 "," 当選金額 "," 当選本数 最終行 改行 出力:標準ストリーム タイトル行 入力データ、各行毎の期待値 合計期待値、還元率 ヒント:当選確率*当選金額=期待値(予想配当額) 期待値/1枚の金額=還元率 CUI/GUIどちらでも可 次スレは>>100 あたり
80 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 10:00:24 ] 宝くじって売り切れる訳じゃないんだろ 売れ残った部分に当りくじがあったら 還元率は大幅に下がるんじゃね?
81 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 10:13:23 ] >>80 あなた、いつ議員に「当選」したんだ?
82 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 15:50:26 ] [1] 授業単元: [2] 問題文(含コード&リンク): 一次方程式y=a*x+bにおいて、A[x1,y1]とB[x2,y2]が与えられた時、 方程式の係数a,bを求めよ。 x1 y1: 450 454.4 x2 y2: 452 454.8 y=0.2*x+364.4 [3] 環境 [3.1] OS: (Windows) [3.2] コンパイラ名とバージョン: (Visual C++) [3.3] 言語: (C++/CLI C/Win32API C++/MFC いづれか) [4] 期限: ( なし ) [5] その他の制限: ( GUIまたはgetc()で終わること)
83 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 15:41:01 ] >>82 宿題はスレ違い
84 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 08:23:12 ] #include <malloc.h> #define MAXSIZE 20 typedef double WORD; main(){ WORD (*b)[100]; WORD *a[2]; int i=1,j=1; b = malloc(sizeof(WORD)*MAXSIZE*2); a[0] = malloc(sizeof(WORD)*MAXSIZE); a[1] = malloc(sizeof(WORD)*MAXSIZE); b[i][j] = 0; a[i][j] = 0; /* [と]を使わない方法は?*/ b[i][j] = 0; a[i][j] = 0; }
85 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 17:47:41 ] >>84 b??(i??)??(j??) = 0; a??(i??)??(j??) = 0;
86 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 19:14:14 ] b<:i:><:j:> = 0; a<:i:><:j:> = 0;
87 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 03:08:44 ] >>86 すげー、ほんとにコンパイル通る。 それなんて名前なの?記号だけなのでググりようがない。
88 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 22:31:16 ] memset() すりゃいいんでないの?w
89 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 09:47:49 ] 0で初期化したいんならcalloc()でいいだろw *(*(b + i) + j) = 0; *(*(a + i) + j) = 0;
90 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:52:47 ] >>87 ダイグラフ
91 名前:84 mailto:sage [2010/03/04(木) 23:36:37 ] >>89 WORD (*b)[2]; // まちがえた
92 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 02:46:41 ] >>90 とんくす 日本語じゃ情報少ないのな。英語だとWikipediaにのってるが
93 名前:84 mailto:sage [2010/03/07(日) 08:18:53 ] Trigraph × トリグラフ ○ トライグラフ dic.yahoo.co.jp/dsearch?p=trigraph&dtype=1
94 名前:デフォルトの名無しさん mailto:sage [2010/03/22(月) 09:38:47 ] コンパイラ名とバージョン: (Visual C++) 作業用フォルダの所は空白、ソースと同じフォルダにショートカットは有ります。 ショートカット「Visual Studio 2005」 から cl xxx.cpp するのが面倒な場合はどのようにするのでしょうか。 PATHをずらっと並べるのは無しで.batのみで可能でしょうか?
95 名前:デフォルトの名無しさん mailto:sage [2010/03/23(火) 01:04:08 ] >>94 まず、ここは質問スレじゃない。 さらに、それはC/C++の問題ではない。
96 名前:デフォルトの名無しさん mailto:sage [2010/03/23(火) 10:09:52 ] C#, C♯, C#相談室 Part55 >>95 返信サンキュこちらで聞いてきます。
97 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 21:58:00 ] >>2 【C++言語歴】 15時間 【レベル】 超ド素人 【コンセプト】 えっ・・と・・・ 【コメント】 参照?ポインタ?構造体?クラス?イミフ #include <iostream> using namespace std; int main() { double a, b, c, d, e, sum; cout << "5つの数の合計と平均値を出力します。" << endl; cin >> a >> b >> c >> d >> e; sum = a + b + c + d + e; cout << "合計は" << sum << "で、平均は" << sum/5 << "です。" << endl; }
98 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 08:36:40 ] >>2 【レベル】 プロ #include <iostream> using namespace std; struct Average { int count; double total; Average() : count(0), total(0.0) {} }; int main(){ Average a; double data; for(int i=0; i<5; i++){ cout << "Input Number:"; cin >> data; a.total += data; a.count++; } cout << "total=" << a.total << endl; cout << "average=" << a.total/a.count << endl; }
99 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 17:21:22 ] 次の問題は>>100
100 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 10:53:12 ] 【問題】 点A、点B、点Cがあり、点Aと点C、点Cと点Bがそれぞれ線分ac、線分bcで結ばれている。 点A、点Bの座標(Pa(xa, ya), Pb(xb, yb))と線分の長さ(Lac, Lbc)が与えられたとき、点Cの座標を求めよ。 但し、解は一つとは限らない。 また、与えられた座標または長さが不適切で求められない場合はそれと判るようにすること。 # 作図的には点A、点Bからそれぞれ半径Lac、Lbcの円を書いて交点を求めればいいが……
101 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 15:59:04 ] もっとゆとりでも解けるような問題が欲しいよ
102 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 16:14:25 ] ユークリッド平面でいいの?
103 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 16:41:57 ] >>101 それじゃ、次の制約でどうぞ。 ・ya == yb, Lac == Lbc >>102 非ユークリッド平面だと私自身がついていけないからパスw
104 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 16:45:45 ] 要は三角不等式と2円の交点でしょ?
105 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 18:16:54 ] 2つの球の交線(円)かもしれん
106 名前:デフォルトの名無しさん mailto:sage [2010/03/30(火) 01:39:29 ] これってA点を (0,0) に移動して 計算するとわりと簡単?
107 名前:デフォルトの名無しさん mailto:sage [2010/03/30(火) 14:41:15 ] いや計算量は変わらん むしろ座標系を回転して >>103 が正解(ry
108 名前:デフォルトの名無しさん [2010/04/13(火) 22:08:11 ] >>26 のさ for(i=0; i<MAX_NUM; i++){ // printf("何かの数:"); if(scanf("%lf", &data ) != 1) break; ←この文 // printf("%g\n", data); sum += data; } ifの中身がよくわからんないんだけどどうなってんの?
109 名前:デフォルトの名無しさん mailto:sage [2010/04/14(水) 00:10:05 ] >>108 if(!(scanf("%lf", &data))) break; は if(!(scanf("%lf", &data))!=0) break; と変形した後に if(scanf("%lf", &data)==0) break; と変形するのが正しい ※論理否定は必ず否定が掛かっている方の真偽を逆にする と言っても、cinの定義なんか覚えてないから 単純に戻り値をscanf()に置き換えて良いかは知らんので そこら変は他の人にまかせる
110 名前:109 mailto:sage [2010/04/14(水) 00:15:40 ] ※論理否定は必ず否定が掛かっている方の真偽を逆にする って書いたけど、何か違うな… 正確には、偽で比較するって言うか、真で比較しては駄目っての言うのが正しいのか?
111 名前:デフォルトの名無しさん mailto:sage [2010/04/14(水) 00:20:39 ] そもそも>>108 が分からないのがifの何なのかが俺には分からない。
112 名前:デフォルトの名無しさん [2010/04/14(水) 00:27:56 ] >>109-110 ごめんよくわかんない >>111 if文の()の中身の scanf("%lf", &data ) != 1 ってどういうこと?って意味
113 名前:デフォルトの名無しさん mailto:sage [2010/04/14(水) 00:46:00 ] >>112 scanfの戻り値が1でない場合真 int scanf(const char* format, ...); scanfの戻り値は"formatで指定された型に従って代入に成功した要素数" scanf("%lf", &data ) ↑でdataに代入成功すれば1が返る 失敗すれば多分0(scanfなんて使わないから分からない)
114 名前:デフォルトの名無しさん mailto:sage [2010/04/14(水) 00:57:19 ] >>112 今回の要素数は1個なので>>118 のように変形しても大丈夫だが 2以上の数値が変える場合、変形には気をつけないとね NG例 !(2) != 0 両辺に論理否定をかけて !(!(2)) != !(0) 左辺の二回の論理否定を打ち消すと 2 != !(1) さらに変形すると 2 != 1 真になってしまう OK例 !(2) != 0 両辺に論理否定をかけて !(!(2)) != !(0) 変形すると !(0) != 1 さらに変形すると 1 != 1 よって偽になる(これが正解)
115 名前:114 mailto:sage [2010/04/14(水) 01:00:30 ] >>118 に期待しよう…orz まあ、こんな感じで、ミスを避けるために、 数値の真偽を問う場合は、必ずfalse(0)と比較するってのが良く使われる。
116 名前:デフォルトの名無しさん mailto:sage [2010/04/14(水) 01:17:26 ] >>100 答えの数までは簡単に出せるが、その先が思いつかん… 何か、結構単純な解き方になる気もするのだが… Lab = sqrt( fabs( pow( xa - xb, 2.0 ) + pow( ya - yb, 2.0 ) ) ) ans = 0; if( ( Lac + Lbc == Lab ) || ( Lab == fabs( Lac - Lbc ) ) ) ans = 1; if( ( Lac + Lbc < Lab ) && ( Lab < fabs( Lac - Lbc ) ) ) ans = 2;
117 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 00:11:52 ] Cが2コ存在する場合要するに三角形が出来る場合 正解かどうかも分からんし考えながら起こしたのでもの凄い汚い点に注意。 double Len_AB, Len_AC, Len_BC; double Pnt_XA, Pnt_XB, Pnt_XC1, Pnt_XC2, Pnt_YA, Pnt_YB, Pnt_YC1, Pnt_YC2; double angle; double Pnt_XB1, Pnt_YB1; /* 入力部分は面倒なんで省略 値が入力されるのはLen_AC, Len_BC, Pnt_XA, Pnt_YA, Pnt_XB, Pnt_YB Aを(0,0)に移動するとBの座標が変化する Bの新座標は元の座標からAの座標を引けば良いので */ Pnt_XB1 = Pnt_XB - Pnt_XA; Pnt_YB1 = Pnt_YB - Pnt_YA; /* (0,0)に移動後のAを中心にBを回転させ、Bの座標を(0,X)にする 回転させる角度は正接から出せる(tanX=Pnt_YB1/Pnt_XB1) ついでにABの長さ(Len_AB)も出しておく */ angle = atan(Pnt_YB1/Pnt_XB1); Len_AB = sqrt(pow(Pnt_XB1, 2) + pow(Pnt_YB1, 2)); /* 回転後のBのX座標は長さそのもの */ Pnt_XB1 = Len_AB;
118 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 00:15:16 ] つ*づ*き sqrt,pow,sin,cos,atan等使ったこと無いので何か使い方間違ってるかも /* Cの座標を(a,b)と仮定すると、三平方の定理から a^2 + b^2 = Len_AC^2 また、CからX軸に垂線を下ろして、交差したところをpとすると、 pの座標は(a,0)になり、更に (Len_AB - a)^2 + b^2 = Len_BC^2 になるので、この連立式を解く a^2 + b^2 = Len_AC^2 Len_AB^2 - ( 2 * Len_AB * a ) + a^2 + b^2 = Len_BC^2 上の式から下の式を引くと -Len_AB^2 + ( 2 * Len_AB * a ) = Len_AC^2 - Len_BC^2 2 * Len_AC * a = Len_AC^2 - Len_BC^2 + Len_AB^2 a = ( Len_AC^2 - Len_BC^2 + Len_AC^2 ) / 2 * Len_AC となる */ Pnt_XC = ( Len_AC^2 - Len_BC^2 + Len_AC^2 ) / 2 * Len_AC; /* CのX座標が分かったので、後は三平方の定理からCのY座標を出せる Len_AB^2 = Pnt_XC^2 + Pnt_YC^2 */ Pnt_YC1 = sqrt(pow(Len_AB, 2) - pow(Pnt_XC, 2));
119 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 00:17:42 ] お*わ*り 数学なんざやるの久々だから正しい保証はない /* CのY座標は負値もある */ Pnt_YC2 = Pnt_YC1 * -1; /* CのXY座標が分かったので、回転させて戻す */ Pnt_YC1 = Len_AB * sin(angle) + Len_BC * cos(angle) + Pnt_YA; Pnt_XC1 = Len_AB * cos(angle) - Len_BC * sin(angle) + Pnt_XA; Pnt_YC2 = Len_AB * sin(angle) - Len_BC * cos(angle) + Pnt_YA; Pnt_XC2 = Len_AB * cos(angle) + Len_BC * sin(angle) + Pnt_XA;
120 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 02:00:40 ] cからabを通る直線上に垂線を下ろしたときの交点をdとすると垂線の長さhの2乗は h*h = Lac*Lac - Xd*(Xd + 2*Xa) - Xa*Xa - Yd*(Yd + 2*Ya) - Ya*Ya かつ h*h = Lbc*Lbc - Xd*(Xd + 2*Xb) - Xb*Xb - Yd*(Yd + 2*Yb) - Yb*Yb ここでXn = Xa - Xb、Yn = Ya - Ybとすると a,b,dは同じ直線上にあるので、あるkに対して Xd = Xa + k*Xn、Yd = Ya + k*Xn が成立する 以上から変数k以外しか含まない2次方程式ができるから、解いたらkが求まる。 (kが求まらないときは三角形になっていない) kがわかれば、dの位置が確定するから、adとcdが直角(=内積が0)、bdとcdが直角 で連立して解けばいいじゃないって… どこがプログラミングの問題だよw
121 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 02:02:15 ] >>120 訂正 ×Yd = Ya + k*Xn ○Yd = Ya + k*Yn
122 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 02:09:26 ] あ、内積じゃなくて高さ求めるのかw ごめん。 でadと直角な単位ベクトルにhと-hをかけて二つ答えだしておしまいだ。
123 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 22:23:40 ] >>113-114 サンクス 数字だと1をかえしてそれ以外だと0かえして ブレイクしてやんお! ってことだよねと、わかったかんじだ
124 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 23:48:04 ] >>103 の条件(ya == ybのみでも可)であれば、三角形ABCの三辺の長さから ヘロンの公式で面積Sを求めて、底辺を辺Labとする高さh(座標yc)を求め その高さと、辺Lac、辺Lbcのどちらかと、三平方の定理で座標yxcを求めて終わり ただ>>100 の条件では、やっぱり分からんわ… double Lab, Lac, Lbc, xa, ya, xb, yb, xc, yc1, yc2, s, S, h, w; // xa = xxx, ya = xxx, xb = xxx, yb = xxx, Lac = xxx, Lbc = xxx; // → 解が2点となるような点であること Lab = fabs( xa - xb ); // ヘロンの公式から三角形ABCの面積Sを求める s = ( Lab + Lac + Lbc ) / 2; S = sqrt( s * ( s - Lab ) * ( s - Lac ) * ( s - Lbc ) ); // → Sの計算でエラーが発生した場合解なし // → 解が一つの場合の処理も省略しているので、解無しの処理も省略 // 面積Sから辺Labを底辺とした三角形の高さhを求める h = S / Lab * 2; // 三角形ABCの高さhから、座標 yc1, yc2 を求める yc1 = ya + h; yc2 = ya - h; // 三角形ABCの頂点Cから垂直に降ろした点をOとする(線分COは高さhに等しい) // 三角形ACOの垂辺CO(高さh)と斜辺Lacから底辺AOの長さwを求める w = sqrt( pow( Lac, 2.0 ) - pow( h, 2.0 ) ); // 三角形ACOの底辺AOの長さwから座標xcを求める // → 点A、点B、点Oの位置関係からxaに対して加算するのか減算するのかを決定 xc = xa + ( xa > xb ? 1 : - 1 ) * ( Lac < Lab ? 1 : -1 ) * w;
125 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 23:53:11 ] プログラマは数学出来ない人多いんだなと驚いた
126 名前:124 mailto:sage [2010/04/16(金) 00:04:59 ] > // → 点A、点B、点Oの位置関係からxaに対して加算するのか減算するのかを決定 > xc = xa + ( xa > xb ? 1 : - 1 ) * ( Lac < Lab ? 1 : -1 ) * w; 最後間違えてるな… // → 点A、点B、点Oの位置関係からxaに対して加算するのか減算するのかを決定 xc = xa + ( xa > xb ? 1 : - 1 ) * ( pow( Lac, 2.0 ) < ( pow( Lab, 2.0 ) + pow( h, 2.0 ) ) ? 1 : -1 ) * w;
127 名前:デフォルトの名無しさん [2010/04/24(土) 01:34:54 ] 100の出題者はそろそろ解答書くべきじゃないの。 それに問題複数あった方がつまらない問題無視できるからいいと思う。
128 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 01:38:20 ] 【問題1:時計】 現在時刻をアスキーアートで表示せよ 【表示例】 ●●○○○●○○○○○○●○●○○●● ○○●○●○●○○●○○●○●○●○○ ○●●○●○●○○○○○●●●○●●● ●○○○●○●○○●○○○○●○●○● ●●●○○●○○○○○○○○●○●●● 【難易度】 40分で初級
129 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 01:44:05 ] 適当に作ったので面白いかどうかはしらないけれど こんな感じの問題名、解答時間、難易度つきテンプレ希望
130 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 09:17:18 ] できたが、俺にはAA作りの才能がないことが分かったのと、codepadじゃ時間取得系関数動かねぇ。 codepad.org/E9sGRiit ローカルでの実行結果。 ○●○○●●●○○○○○○●○○○●● ●○●○●○●○○●○○●●○○●○○ ●○●○●●●○○○○○○●○○●●● ●○●○○○●○○●○○○●○○●○● ○●○○●●○○○○○○●●●○●●●
131 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 09:37:15 ] >>129 所要時間: 25分 感想: 文字盤を作るのが面倒…orz 問題の品質: △(文字盤を作るのがメインになってしまうので…) #include <stdio.h> #include <time.h> #define artrow 5 #define artcol 7 int main() { int i, j, idx[artrow]; time_t timer; struct tm *t_st; char art[][artrow][artcol] = { { "○●○", "●○●", "●○●", "●○●", "○●○", }, { "○○●", "○○●", "○○●", "○○●", "○○●", }, { "●●○", "○○●", "○●●", "●○○", "●●●", }, { "●●○", "○○●", "●●○", "○○●", "●●○", }, { "●○●", "●○●", "●●●", "○○●", "○○●", }, { "●●●", "●○○", "●●●", "○○●", "●●○", }, { "○●●", "●○○", "●●●", "●○●", "●●●", }, { "●●●", "○○●", "○○●", "○●○", "●○○", }, { "●●●", "●○●", "●●●", "●○●", "●●●", }, { "●●●", "●○●", "●●●", "○○●", "●●○", }, { "○○○", "○●○", "○○○", "○●○", "○○○", }, }; time(&timer); t_st = localtime(&timer); idx[0] = t_st->tm_hour / 10; idx[1] = t_st->tm_hour % 10; idx[2] = 10; idx[3] = t_st->tm_min /10 ; idx[4] = t_st->tm_min % 10; for( i=0; i<artrow; i++ ) for( j=0; j<5; j++ ) printf( "%s%s", art[idx[j]][i], j == 4 ? "\n" : "○" ); return 0; }
132 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 09:46:00 ] ○があると読みにくいので スペースに置き換えてください ずれないように注意出来たら二段
133 名前:130 mailto:sage [2010/04/24(土) 10:10:14 ] うげぇ、配列サイズ足りてねぇorz
134 名前:131 mailto:sage [2010/04/24(土) 11:20:02 ] 変数名等、全体の見通しを良くして、さらにAAを>>130 から借用。 #include <stdio.h> #include <time.h> #define FIELD_ROW_SIZE 5 #define FIELD_COL_SIZE 5 #define ART_KIND_COUNT 11 #define COLON_IDX 10 int main() { int row, idx, cols[FIELD_COL_SIZE]; time_t timer; struct tm *t_st; char *art_ptr[FIELD_ROW_SIZE][ART_KIND_COUNT] = { { "○●○", "○●○", "●●○", "●●○", "●○●", "●●●", "○●●", "●●●", "●●●", "●●●", "○○○" }, { "●○●", "●●○", "○○●", "○○●", "●○●", "●○○", "●○○", "●○●", "●○●", "●○●", "○●○" }, { "●○●", "○●○", "○●●", "●●○", "●●●", "●●○", "●●●", "○○●", "○●○", "●●●", "○○○" }, { "●○●", "○●○", "●○○", "○○●", "○○●", "○○●", "●○●", "○○●", "●○●", "○○●", "○●○" }, { "○●○", "●●●", "●●●", "●●○", "○○●", "●●○", "●●●", "○○●", "●●●", "●●○", "○○○" }, }, *field_sep[FIELD_COL_SIZE] = { "○", "○", "○", "○", "\n"} ; time(&timer); t_st = localtime(&timer); cols[0] = t_st->tm_hour / 10; cols[1] = t_st->tm_hour % 10; cols[2] = COLON_IDX; cols[3] = t_st->tm_min / 10; cols[4] = t_st->tm_min % 10; for( row=0; row<FIELD_ROW_SIZE; row++ ) for( idx=0; idx<FIELD_COL_SIZE; idx++ ) printf( "%s%s", art_ptr[row][cols[idx]], field_sep[idx] ); return 0; }
135 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 13:58:53 ] // UTF-8 SJIS EUC 対応してたらちょっと時間掛かった #include <stdio.h> #include <time.h> #define COLON_IDX 10 #define DOT "●" char *cout(char *b, unsigned int s, int n, int r){ unsigned short art[] = { 0x56d4, 0xe934, 0xe746, 0x71c6, 0x93da, 0x719e, 0xf79c, 0x925e, 0xf55e, 0x73de, 0x0820 }; unsigned short i, j, c, d; --s; for(i = 0, c = art[n]; i < r; ++i) c >>= 3; for(i = 0; i < 3 * s; i += s) for(j = 0, d = (c >>= 1); j < s; ++j) b[i + j] = d & 1 ? "●"[j] : "○"[j]; b[i] = 0; return b; } int main(int ac, char **av){ time_t timer; struct tm *t; char b[sizeof(DOT) * 3]; int i; time(&timer); t = localtime(&timer); for(i = 0; i < 5; ++i){ printf("%s○", cout(b, sizeof(DOT), t->tm_hour / 10, i)); printf("%s○", cout(b, sizeof(DOT), t->tm_hour % 10, i)); printf("%s○", cout(b, sizeof(DOT), COLON_IDX, i)); printf("%s○", cout(b, sizeof(DOT), t->tm_min / 10, i)); printf("%s\n", cout(b, sizeof(DOT), t->tm_min % 10, i)); } return 0; }