- 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/
- 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; }
- 136 名前:デフォルトの名無しさん [2010/04/24(土) 14:12:24 ]
- www2.ezbbs.net/24/techside/img/1266584278_1.jpg
このパズルを解くプログラム
- 137 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 14:19:04 ]
- >>136
すまんがシラミツブシは興味ないんよ それより論理的にさ ここに1を置いたら絶対全部の合計は等しく出来ないから 1はこっちかこっちにしか置けない っていう風に考えたい訳
- 138 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 16:38:16 ]
- >>136程度だと総当たりでも十分速いだろなぁ。
それ書くくらいならナンプレの答え探すプログラムの方がいいんじゃね?
- 139 名前:デフォルトの名無しさん [2010/04/24(土) 18:04:37 ]
- >>136がわからない
なにこれどうすんの?
- 140 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 18:33:55 ]
- 総和が5の倍数であることを利用するとあまる数字の組み合わせを何個かに限定できるかな
- 141 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 18:49:23 ]
- 1~10の総和は55
和がすべて等しいので 和の値は55/5=11 4個の和で11になる組み合わせを選ぶ
- 142 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 18:59:23 ]
- え?
- 143 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 19:04:15 ]
- >>141
それで解けたら1億やるよw
- 144 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 19:09:01 ]
- >>141でやるとかむずいな
- 145 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 19:10:17 ]
- むずいとかじゃなくて、解がない
- 146 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 19:18:42 ]
- 4個の和が11じゃねーだろw
全ての位置は2回数えられるから2倍にして4個の和が22になる組み合わせを選ぶ。 まあ、それでも解はないんだけどねw
- 147 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 19:22:28 ]
- >>136
7-11いい気分
- 148 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 19:26:21 ]
- >>147
プログラムお願いします
- 149 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 19:27:16 ]
- 宿題スレのでも見とけ
- 150 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 19:55:56 ]
- 数学の問題にも著作権はあるんだからパクリはいくない
- 151 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 23:22:00 ]
- 問題
ジョーカーを除いたトランプ1組(52枚)で下記のルールで神経衰弱を行った場合、 最大何手必要なのかを求めるプログラム。 ※但しコンピュータは最善の手を実行するものとする。 1. 52枚を適当にシャッフルしカードを伏せる(ことにする) 2. カードを2枚めくる(この行為を1手と数える) 2-1. 同じ数字であれば表にする(ことにする) 2-2. 異なる数字であれば、それらの数字を覚えて裏に戻す(ことにする) 3. 全てのカードが表になった(ことになった)ら終了
- 152 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 23:51:13 ]
- >>151
それも数学の問題。プログラミングできないなら無理に出題しないでいいよ。 答えは全てのカードを覚えるのにかかる回数26回と 全てのカードを取るのにかかる回数26回の合わせて52回。
- 153 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:02:36 ]
- >>152
不正解 覚えるのは25回で十分
- 154 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:16:41 ]
- いや26回だ
- 155 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:21:08 ]
- >>154
指摘してやってるのに分からんいなんてアホなのか? 25回覚えて、取り始めは、残った2枚のうちの1枚から始めれば良い。 (1枚取った時点で全てのカードが把握できる)
- 156 名前:152 mailto:sage [2010/04/25(日) 00:31:34 ]
- >>155
言われみればそうだね。でも154はおれじゃねえ。
- 157 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:44:56 ]
- いや合わせて50回だ
- 158 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:50:12 ]
- そうだorz
- 159 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:51:41 ]
- >>157
>いや合わせて50回だ 何を合わせるんだ?
- 160 名前:157 mailto:sage [2010/04/25(日) 01:23:37 ]
- 最大40手 50回は間違い
- 161 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 01:24:10 ]
- 最大52回
|

|