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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/08/01(日) 18:01:51
あなたが解けない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++の宿題片付けます 138代目
http://pc12.2ch.net/test/read.cgi/tech/1279286575/
0153デフォルトの名無しさん2010/08/05(木) 12:53:40
wiki使ってくれよ

>>140-141
素数とかソートとかカレンダーとかすでにあるよ
無いのはぜひ追加してくれ
0154デフォルトの名無しさん2010/08/05(木) 13:26:40
>>152
統一するならこうだろ
int main(int argc, char **argv)
{
  〜
  return 0;
}
0155デフォルトの名無しさん2010/08/05(木) 13:35:16
君たち、今や海栗が標準なんですが....
0156デフォルトの名無しさん2010/08/05(木) 14:46:19
C++ならreturn 0;を省略しますのでそのつもりで
0157デフォルトの名無しさん2010/08/05(木) 17:01:47
こんなどうでもいいことでさえ統一できないことが欠陥言語の象徴だなw
0158デフォルトの名無しさん2010/08/05(木) 17:02:22
>>154
**argv > *argv[]
0159デフォルトの名無しさん2010/08/05(木) 17:26:29
えっ…
0160デフォルトの名無しさん2010/08/05(木) 18:19:25
[1]プログラミング演習
[2]ttp://www.comm.info.eng.osaka-cu.ac.jp/~sugi/C_lang2/C6.htmlの
[問題6-2]はこのページの本文の指示通りにやるとどうなるのでしょうか?
[3.1]Linux環境
[3.2] gcc
[3.3]C言語
[3.4]今日の午後9時

よろしくお願いします
0161デフォルトの名無しさん2010/08/05(木) 19:17:04
>>160
#include<stdio.h>
#include<stdlib.h>
struct TIME{
int day, hour, minute;
};
TIME time_add(TIME t1, TIME t2){
if( t2.day<0 || t2.hour<0 || t2.minute<0 ) exit(1);
t1.day += t2.day; t1.hour += t2.hour; t1.minute += t2.minute;
while( t1.minute > 60 ){
t1.hour++;
t1.minute -= 60;
}
while( t1.hour > 24 ){
t1.day++;
t1.hour -= 24;
}
return t1;
}
int main(void){
TIME t1 = {0} , t2;
while(1){
printf("(day, hour, minute)? ");
scanf("%d %d %d", &t2.day, &t2.hour, &t2.minute);
t1 = time_add(t1, t2);
printf("sum = %d %d %d\n", t1.day, t1.hour, t1.minute);
}
return 0;
}
0162デフォルトの名無しさん2010/08/05(木) 19:42:55
>>160
こうなるんじゃね?

(day, hour, minute)? 3 12 44
sum = 3 12 44
(day, hour, minute)? 1 22 54
sum = 5 11 38
(day, hour, minute)? 8 21 0
sum = 14 8 38
(day, hour, minute)? -1 -1 -1
0163デフォルトの名無しさん2010/08/05(木) 19:53:15
>>162
結果は間違えてないよね。
何に疑問持ったのか分かんない。
0164デフォルトの名無しさん2010/08/05(木) 19:59:37
間を取って public static void Main (String[] args) で
0165デフォルトの名無しさん2010/08/05(木) 22:12:02
サンプルコード
0166デフォルトの名無しさん2010/08/06(金) 19:51:15
曜日を求める課題が出てたよな・・・ってことは、発展系で
閏年、カレンダーの課題もクルー!
0167デフォルトの名無しさん2010/08/06(金) 21:21:51
さぁこい、年収1千万円程度の貧乏人の俺でも多少は生活に余裕が持てるようになった。
今の俺は無敵ではないが、どんな課題でも解けそうな気がするぅ〜あると思います。
0168デフォルトの名無しさん2010/08/06(金) 21:54:06
年収1000万って、手取りに換算するとあんまり大したこと無いよね。
これが手取りで1000万だと結構すごいと思うけど。
0169デフォルトの名無しさん2010/08/06(金) 21:58:38
>>167
>>52-53をどうぞ
0170デフォルトの名無しさん2010/08/06(金) 22:33:31
>>168
いや手取りで。確かに大したことないからまだまだ貧乏人と言っているんです。
0171デフォルトの名無しさん2010/08/06(金) 22:54:42
>>167
コテ(トリ)つけて codepad にあげてごらんよ。
0172デフォルトの名無しさん2010/08/07(土) 06:07:14
【文化】インターネット掲示板『2ちゃんねる』で大人気のアスキーアート・キャラクター「麻呂」が大増殖中
http://kamome.2ch.net/test/read.cgi/newsplus/1281100346/
0173デフォルトの名無しさん2010/08/07(土) 16:57:09
>>167
どんな課題も解けないよ
0174デフォルトの名無しさん2010/08/07(土) 18:03:47
>>173
> 解けそうな気がするぅ〜あると思います。
日本語が読めない人って困りますねw
0175デフォルトの名無しさん2010/08/07(土) 20:26:53
スレチかもしれないのですが、
柴田さんの明解C言語の入門編と前橋さんのポインタ完全制覇を
一通りやったのですが、この後にオススメな本はなんでしょうか?
もしよろしかったら答えていただけると嬉しいです。
0176デフォルトの名無しさん2010/08/07(土) 20:28:12
まずは忘れる事だ
0177デフォルトの名無しさん2010/08/07(土) 20:28:43
>>175
・256倍シリーズ
・最新アルゴリズム辞典
0178デフォルトの名無しさん2010/08/07(土) 20:53:54
>>175
このスレで遊ぶのはどうでしょうか?楽しいですよ。
>>176
至言ですねえ。
>>177
アルゴリズム辞典は持っていて損はないのですが、あー、やっぱりいちからよむものですかやっぱりそうですか
0179デフォルトの名無しさん2010/08/07(土) 22:11:27
>>178
どんな本でもそうだけど、頭から尻まできっちり全部読んでおいて
詳細は忘れてもいいからなにが書いてあったかだけ覚えておけ。
0180デフォルトの名無しさん2010/08/08(日) 04:19:25
で?カレンダー、双方向リストまだー?
0181デフォルトの名無しさん2010/08/08(日) 10:01:33
この時期になっても出てこないならもう出ないだろ
0182デフォルトの名無しさん2010/08/08(日) 10:23:48
でてもとけないだろう。
0183デフォルトの名無しさん2010/08/08(日) 11:20:53
何でだよ、毎年解いているのに今さら解けない訳ねーだろw
0184デフォルトの名無しさん2010/08/08(日) 11:25:11
>>183
うらやましい。俺なんか過去にといた問題と同じものが出たとしてもとける気がしない。
毎日が新鮮でいいのかもしれないが。w
0185デフォルトの名無しさん2010/08/08(日) 21:12:21
[2] 問題文(含コード&リンク):2つの数列の相関係数を求めるプログラムを作成する。
[3] 環境
 [3.1] OS: Mac OSX 10.6
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限:[2010年8月9日まで]
[5] その他の制限:できるだけ簡単なプログラムでお願いします。
0186デフォルトの名無しさん2010/08/08(日) 21:15:47
>>184 日本語でおk。このスレに何しにきてんですか?
0187デフォルトの名無しさん2010/08/09(月) 01:17:24
>>185
http://codepad.org/W9xfYypJ
0188デフォルトの名無しさん2010/08/09(月) 10:16:34
[2] 問題文:任意のウェブページ(ここではイントラページ)を、既定設定されているブラウザで表示させる
[3] 環境
 [3.1] OS: Windows, Mac, Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語: どちらでも可
[4] 期限: 2010年8月11日15:00まで
[5] その他の制限: スパゲティックな感じでも構わないので、読みやすい感じでお願いします。後学の為にできるだけ理解したいので。
0189デフォルトの名無しさん2010/08/09(月) 12:25:27
読みやすいスパゲッティってあるのか
0190デフォルトの名無しさん2010/08/09(月) 12:51:00
>>188
問題文が、C言語の範疇を越えてるよ
0191デフォルトの名無しさん2010/08/09(月) 12:55:32
windows限定なら
system("open http://hogehoge.fugafuga");
だけで桶
0192デフォルトの名無しさん2010/08/09(月) 15:31:08
アリアリアリアリアリアリアリアリアリアリ
0193デフォルトの名無しさん2010/08/09(月) 15:35:30
(;゚;ж;゚; )ブッ
0194デフォルトの名無しさん2010/08/09(月) 19:51:11
[2] 問題文
実数 -1.0 ~ 1.0 の範囲をもつ任意の長さの数列を、下記の条件でヒストグラムとして
表示するプログラムを作成せよ。
~ -0.95 (x < -0.95)
-0.95 ~ -0.85 (-0.95 <= x && x < -0.85)
-0.85 ~ -0.75 (-0.85 <= x && x < -0.75)
-0.75 ~ -0.65 (-0.75 <= x && x < -0.65)
-0.65 ~ -0.55 (-0.65 <= x && x < -0.55)
-0.55 ~ -0.45 (-0.55 <= x && x < -0.45)
-0.45 ~ -0.35 (-0.45 <= x && x < -0.35)
-0.35 ~ -0.25 (-0.35 <= x && x < -0.25)
-0.25 ~ -0.15 (-0.25 <= x && x < -0.15)
-0.15 ~ -0.05 (-0.15 <= x && x < -0.05)
-0.05 ~ 0.05 (-0.05 <= x && x < 0.05)
0.05 ~ 0.15 (0.05 <= x && x < 0.15)
0.15 ~ 0.25 (0.15 <= x && x < 0.25)
0.25 ~ 0.35 (0.25 <= x && x < 0.35)
0.35 ~ 0.45 (0.35 <= x && x < 0.45)
0.45 ~ 0.55 (0.45 <= x && x < 0.55)
0.55 ~ 0.65 (0.55 <= x && x < 0.65)
0.65 ~ 0.75 (0.65 <= x && x < 0.75)
0.75 ~ 0.85 (0.75 <= x && x < 0.85)
0.85 ~ 0.95 (0.85 <= x && x < 0.95)
0.95 ~ (0.95 <= x )
数列の各値を、上記の範囲ごとに振り分けるようなプログラムをお願いします。
[3] 環境
 [3.1] OS: Mac
 [3.2] コンパイラ名:gcc
 [3.3] 言語:C
[4] 期限:[2010年8月10日まで]
[5] その他の制限:なるべく難易度の低いプログラムでお願いします。
0195デフォルトの名無しさん2010/08/09(月) 22:45:23
>>194
ttp://codepad.org/yJqUZTR6
0196デフォルトの名無しさん2010/08/10(火) 01:24:38
自分が解きたい問題を解く、何が悪い?俺が解きたいと思わない課題は
お前らにくれてやるから、俺が解きたい課題は俺より先に出すなよ、な!
0197デフォルトの名無しさん2010/08/10(火) 01:27:28
ああ、それでいいよ
だがおまえはコテハンつけて、といてる問題を宣言するんだ
そして少なくとも5分ごとにスレをチェックしろ
最低でもそれを守れ
0198デフォルトの名無しさん2010/08/10(火) 01:37:05
そして質問者は複数の回答の中から自分にとって良いものを選んで
提出すれば良い。その中に自分が習っていないものが入っていたり
題意に沿った回答で無い物を選んでも評価されない。
まぁここはそんな出題者の都合なんて知ったこっちゃ無い場所だがねw
0199デフォルトの名無しさん2010/08/10(火) 08:22:14
すみません、以下のプログラムを、C++ではなくC言語に直してほしいです。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10913.txt


0200デフォルトの名無しさん2010/08/10(火) 09:09:54
コピペ乙
0201デフォルトの名無しさん2010/08/10(火) 09:10:41
ほとんどCで書かれてるじゃんwwww
甘え過ぎ。ただ書き直すだけの作業をやるほどお人好しはいないと思うw
楽しくないからな。
02021942010/08/10(火) 16:55:37
>>195
ありがとうございます。
しかし、実行してみたところ値を分ける条件は21個あるのに結果は20個しかありませんでした。
これを直すにはどうすればよいのでしょうか?
また、あとからになって申し訳ないのですが、条件の書き方を間違えていたので、
修正したものを以下に書いておきます。

~ -0.95 (x <= -0.95)
-0.95 ~ -0.85 (-0.95 < x && x <= -0.85)
-0.85 ~ -0.75 (-0.85 < x && x <= -0.75)
-0.75 ~ -0.65 (-0.75 < x && x <= -0.65)
-0.65 ~ -0.55 (-0.65 < x && x <= -0.55)
-0.55 ~ -0.45 (-0.55 < x && x <= -0.45)
-0.45 ~ -0.35 (-0.45 < x && x <= -0.35)
-0.35 ~ -0.25 (-0.35 < x && x <= -0.25)
-0.25 ~ -0.15 (-0.25 < x && x <= -0.15)
-0.15 ~ -0.05 (-0.15 < x && x <= -0.05)
-0.05 ~ 0.05 (-0.05 < x && x < 0.05)
0.05 ~ 0.15 (0.05 <= x && x < 0.15)
0.15 ~ 0.25 (0.15 <= x && x < 0.25)
0.25 ~ 0.35 (0.25 <= x && x < 0.35)
0.35 ~ 0.45 (0.35 <= x && x < 0.45)
0.45 ~ 0.55 (0.45 <= x && x < 0.55)
0.55 ~ 0.65 (0.55 <= x && x < 0.65)
0.65 ~ 0.75 (0.65 <= x && x < 0.75)
0.75 ~ 0.85 (0.75 <= x && x < 0.85)
0.85 ~ 0.95 (0.85 <= x && x < 0.95)
0.95 ~ (0.95 <= x )

(−領域の<,<=が逆になったのと-0.5~0.5の部分が両方とも<になりました。)
申し訳ないですが、以上の内容で再度お願いします。
0203デフォルトの名無しさん2010/08/10(火) 22:04:09
>>202
ttp://codepad.org/zG6XgLPj
0204デフォルトの名無しさん2010/08/10(火) 22:55:07
codepad落ちてるな
0205デフォルトの名無しさん2010/08/10(火) 23:40:30
天罰じゃ〜天狗の仕業じゃ〜〜
0206デフォルトの名無しさん2010/08/11(水) 01:39:20
>>202
http://codepad.org/8lMNCDEZ
0207デフォルトの名無しさん2010/08/11(水) 20:24:01
>>203
やっぱりひとつたりない。codepad の出力をみてください。
02082072010/08/11(水) 20:25:37
アンカーミス失礼 >>206
0209デフォルトの名無しさん2010/08/11(水) 20:32:29
>>207
具体的に、どこの範囲が足りていないのでしょうか。
こちらの環境では私の書いた>>203は足りています。
足りないのは>>206の方です。

それと、>>203はcodepadでは結果が出力されていません。
あなたの見間違いです。
02102062010/08/11(水) 22:13:31
>>207,209
すまん、clangでやっていた。

#include <stdio.h>
int main(int argc, char *argv[])
{
  double max = 1.05;
  double min = -1.05;
  double delta = 0.1;
  double x;

  printf("(max - min) / delta)             = %f\n", (max - min) / delta);
  printf("(int) ((max - min) / delta))     = %d\n", (int) ((max - min) / delta));
  printf("(int) (x=((max - min) / delta))) = %d\n", (int) (x = ((max - min) / delta)));

  return 0;
}

# gcc     : 21.00000    20   21
# g++    : 21.00000    20   21
# clang   : 21.00000    21   21


0211デフォルトの名無しさん2010/08/12(木) 04:26:21
俺は天才、ファンディアスだ!
0212デフォルトの名無しさん2010/08/12(木) 08:22:28
>>210
んー、コンパイラによって結果がかわるのはどうして?
bcc32
(max - min) / delta) = 21.000000
(int) ((max - min) / delta)) = 20
(int) (x=((max - min) / delta))) = 20

lsi-c
(max - min) / delta) = 21.000000
(int) ((max - min) / delta)) = 20
(int) (x=((max - min) / delta))) = 20

msvc 2008
(max - min) / delta) = 21.000000
(int) ((max - min) / delta)) = 21
(int) (x=((max - min) / delta))) = 21
0213デフォルトの名無しさん2010/08/12(木) 09:24:48
>>212
そもそも 1.05 を double の変数に代入した時点で、
丸めが起きて 1.05 では無くなってるんだよ。

こういう誤差が演算の過程でどのように変化するかはC言語の規定外。
誤差の範囲で値が変わるのは問題ない。

こういうふらつきのある値を int に強制的にキャストして、
小数点以下を切り捨てるようなコードに問題がある。
はっきり言ってバグ。コードを修正すべき。
0214デフォルトの名無しさん2010/08/12(木) 10:08:06
>>213
ンな事言ってたらCで小数の比較なんてナンセンスじゃん
数値計算にC使うなってな話になんぞ?
0215デフォルトの名無しさん2010/08/12(木) 10:10:13
>>214
笑
0216デフォルトの名無しさん2010/08/12(木) 10:20:35
double d;
int intvalue;
d=(double) intvalue;
はおk
しかし
intvalue=(int)d;
という書き方する人一杯いるけど、このキャストは
しないほうが良い。上のように処理系依存性が増える。
だからといって処理系のライブラリ関数(round,floor,etc)を
使えというわけじゃないが、ライブラリは同一環境なら処理系間で使
い回せる可能性が若干ある。ソースがあれば完璧
0217デフォルトの名無しさん2010/08/12(木) 10:20:37
たとえば
a = 0.04999999 みたいな数字があって
0.5 が誤差のために実質 0.04999999 だったら
a < 0.5 が true にならないってことですよね?
0218デフォルトの名無しさん2010/08/12(木) 10:24:12
>>217
それは起こりえる。そしてFORTRANだろうがCだろうがJavaだろうが
言語によらず浮動小数点実数を使う限り宿命的に発生する。
BCD実数とか使うしかない。
0219デフォルトの名無しさん2010/08/12(木) 10:33:20
浮動小数点計算は有効数字分だけ合ってれば良いので
無効数字部分をどのように取り扱うかは確か定義され
ていない筈。これが丸め誤差とか桁落ちとかの原因
ライブラリ(処理系組み込みを含む)作成者の裁量が
大きく左右する。
0220デフォルトの名無しさん2010/08/12(木) 10:36:01
んじゃあグダグダいってねーで
ソースあげろよ
0221デフォルトの名無しさん2010/08/12(木) 10:56:56
なるべく難易度が低い
という条件からは浮動小数点誤差回避の技法はスレ違い
0222デフォルトの名無しさん2010/08/12(木) 11:02:24
>>221
× スレ違い
○ 私は無能です
0223デフォルトの名無しさん2010/08/12(木) 11:04:03
>>216
>ライブラリは同一環境なら処理系間で使
>い回せる可能性が若干ある。ソースがあれば完璧
ソースがあっても、そもそもからして浮動小数点実数
の内部型は処理系の裁量じゃね?別にIEEEに準拠する
必要まで強制されてるの?ライブラリのソースなど
そういった内部型の構造に強く依存してたり関連ライ
ブラリグローバル関数とか使ってたりして競合が発生
しやすいんであったところでそのまま使えるケースは
稀
0224デフォルトの名無しさん2010/08/12(木) 11:05:51
少数の計算はどこまでいっても不満と不安がつきまとう。
できるもんなら関わりたくないものだ。
0225デフォルトの名無しさん2010/08/12(木) 11:16:00
>>210

1 printf("(max - min) / delta) = %f\n", (max - min) / delta);
2 printf("(int) ((max - min) / delta)) = %d\n", (int) ((max - min) / delta));
3 printf("(int) (x=((max - min) / delta))) = %d\n", (int) (x = ((max - min) / delta)));

2と3が異なるgccが手元に無いんだが、どういう素姓のgccだ?
本当に2と3が異なるのか?
0226デフォルトの名無しさん2010/08/12(木) 13:13:04
>>216
sizeof float==sizeof intな環境で
float f=1.0;
int i;
i=(int)f;
while(i==1);

このコードを実行させたところ一瞬で終わる環境も
あり得るし、無限ループになる環境もあるってこと
ですね。勉強になりました。(皮肉)
0227デフォルトの名無しさん2010/08/12(木) 13:25:18
>>216は典型的なシッタカ。放置推奨。
0228デフォルトの名無しさん2010/08/12(木) 13:30:07
wktk
0229デフォルトの名無しさん2010/08/12(木) 13:34:17
(sizeof long long ==sizeof double)
とする。
long long l;
double d;

d=1.0;
l=(long long)d;
は
memcpy(&l,&d,sizeof(long long));
と等価じゃないんだ?
0230デフォルトの名無しさん2010/08/12(木) 13:38:33
>>226は何が言いたいのかわからん。
キャストにsize関係ないし、1.0に誤差が発生する環境なんてない。
0231デフォルトの名無しさん2010/08/12(木) 13:41:40
そういったトラブルの続出でC++ではReInterrupt castとか
Dynamic Castという概念が生まれ区別されるようになった
わけです。Cでもこれは真似したほうがいいかもしれません。
つまりキャストする場合はコメントにそう明示するわけです。
処理系を変えておかしくなる場合はこのあたりに原因がある
ことも少なく有りません。改修作業の苦痛が大幅に軽減され
ます。
0232デフォルトの名無しさん2010/08/12(木) 13:45:03
>>229
当たり前だろ。バカ。お前はバトルへの参加資格なし。
0233デフォルトの名無しさん2010/08/12(木) 13:47:20
>>229
処理系によって変わります。(但しその処理系の正統性は無視です。
正統な処理系だけが稼働しているわけではありません。)
0234デフォルトの名無しさん2010/08/12(木) 14:57:55
>>216
のようにバイト列レベルで見て単純な複製じゃなく
コンパイラが何らかの方法で変換ルーチン(ライブラリ関数
じゃない可能性のほうが大)を自動コールするといったレベ
ルのキャスト(これが正統)を禁止するのはちょっとね。

ただライブラリ関数のコンバート系関数でも同等のことが
出来るし、ライブラリ関数を多用する場合はむしろこちら
のほうが純正性が良いかもしれない
0235デフォルトの名無しさん2010/08/12(木) 16:23:25
バカが多いな。浮動小数点形式が同一なら、浮動小数点から整数へのキャストで
処理系依存性が出るはずが無い。

C99
6.3.1.4 Real floating and integer
When a finite value of real floating type is converted to an integer type
other than _Bool, the fractional part is discarded (i.e., the value is
truncated toward zero).
0236デフォルトの名無しさん2010/08/12(木) 17:04:10
>>225
Windowsでは cygwin / gcc 4.3.4.20090804
0237デフォルトの名無しさん2010/08/12(木) 18:06:54
クオリティ・パフォーマンス・エレガンス:純正>>>>正統
トータルな意味での信頼性:正統>>>>純正
ってところか どんな分野でもこれはある程度言えるんじゃ?
0238デフォルトの名無しさん2010/08/12(木) 18:15:19
>>235
お前が馬鹿だろ、整数へのキャストは小数部の切り捨てしか起こらん。
問題はその前の代入や演算での丸めによる誤差の取り扱いなんだよ。

要するに演算後 21.000... となる処理系と 20.999... となる処理系が存在しうる。
これを整数にキャストしたら前者では 21 となるし、後者では 20 となる。

まともなプログラマなら演算後の double を int にキャストする場合は
i = (int)(d + .000000001) とか書くよ。
0239デフォルトの名無しさん2010/08/12(木) 18:30:49
一方、別のまともなプログラマは有理数クラスを使った
>>238こういうのはバッドノウハウだよな
速度が求められるとか特別な理由が無い限りやめたほうがいい
0240デフォルトの名無しさん2010/08/12(木) 18:33:52
正統でも純正でもない方法(でも場合に依っては有効かも)
0241デフォルトの名無しさん2010/08/12(木) 18:41:12
>>238
>i = (int)(d + .000000001) とか書くよ。

死ね
0242デフォルトの名無しさん2010/08/12(木) 18:43:24
利息計算の場合は、切り捨てて欲しくないなあ^^
0243デフォルトの名無しさん2010/08/12(木) 18:46:07
>>237
純正な有名ライブラリのソース(マルチプラットフォーム対応)を
沢山見てきたが、エレガントに記述されているものなど皆無。
むしろすんごく泥臭いことやってる。パッチだらけで作者じゃな
ければ読めたものじゃないってことも稀じゃない。

正統(某かの規格書に厳密に準拠した文法で書かれており、使うこと
だけでなく見せることも目的に入ってる)志向が強いコードのほうが
強烈にエレガントさを求めるんじゃねぇの?
0244デフォルトの名無しさん2010/08/12(木) 19:53:30
>>238
そんな話はしていない、文脈読めないバカは死んでしまえ。
キャストかライブラリかと言う話だ。
0245デフォルトの名無しさん2010/08/12(木) 20:25:04
>i = (int)(d + .000000001) とか書くよ。

こういうことしちゃう人がいるから嫌なんだよな。
あー少数のない世界へ行きたい。
0246デフォルトの名無しさん2010/08/12(木) 20:31:40
四捨六入っていうのがあってだなあ
0247デフォルトの名無しさん2010/08/12(木) 21:22:41
ライブラリはマルチプラットフォーム対応で作るのだろうから
コンパイラの解釈に依存するようなキャストを使わず
自前でコンバート関数とか用意するだろうし、それを
使って他のライブラリ関数とかテストしてるんだろうから
ライブラリ関数を中心的に使う場合は、可読性は低くなるかも
知れないけどあんましキャストはしないほうがいいと思います。
0248デフォルトの名無しさん2010/08/13(金) 01:17:21
アホか。キャストは四則演算と同じく作用が定義されている演算子だ。
キャストがコンパイラの解釈に依存するから使えないのならば、同じく、
四則演算子も使えねーな。
浮動小数点定数も変換が処理系に依存するから、使えねーな。ww
0249デフォルトの名無しさん2010/08/13(金) 01:36:15
別のCコンパイラでコンパイルしたライブラリコードを
平気でリンクできてしまうのがよくもわるくもC処理系
の特徴であり歴史的事実(それがC固有であり本源的とまで
は言わないが)

厳格に言えば整数演算、文字列演算以外のキャストや
四則演算はこういった性格から信頼性が落ちる場合が
あるってことか。
0250デフォルトの名無しさん2010/08/13(金) 02:48:29
Cじゃなくてアルゴリズムの話なんだけど、アルゴリズムのほうが超過疎なのでこちらで聞きます

[1]
[2]
グラフG(V,E)の各エッジに0〜1.0間の数値で確率がランダムで与えられている。
各ノードに到達するまでの確率の積が最大となるような木を作りたい。

別の表現をすると、一般的なダイクストラ法の条件1.リンクコストが非負、2.コストの和が最小の経路を求める
というのを、1'.リンクコストは0〜1の実数、2'.コストの積が最大の経路を求める
に変えて考えたいです。

ダイクストラのアルゴリズムをちょこっと変えるだけで、この問題を解くアルゴリズムは書けますか?
[3] 指定なし
[4] できるだけ早く
[5] コードじゃなくてアルゴリズムがほしいです
0251デフォルトの名無しさん2010/08/13(金) 02:57:55
スレチだろ
0252デフォルトの名無しさん2010/08/13(金) 04:12:50
鼬買い
数学遺体毛
■ このスレッドは過去ログ倉庫に格納されています