1 :
麻衣 :
2001/02/22(木) 23:50
2 :
デフォルトの名無しさん :2001/02/22(木) 23:52
がんばれよ。
3 :
デフォルトの名無しさん :2001/02/23(金) 00:08
「麻衣」って名前は倉木麻衣を想像させられるから 萎えるなぁ。
4 :
デフォルトの名無しさん :2001/02/23(金) 00:20
まいちゃんはいくちゅでちゅかぁ? などと書く自分の馬鹿さ加減に鬱....
5 :
研究中? :2001/02/23(金) 00:45
コンパイルすると「予期せぬEOFが検出されました。」という エラーメッセージが出ます。 これはどういう意味なんでしょうか?
6 :
麻衣ちゃんじゃないけど :2001/02/23(金) 00:49
1.{}がつじつまあってないから。 2.ファイルフォーマットがプラットホームと あってない(<CR><LF>とか)から。 のどっちかだとおもいます。
7 :
名無しさん。 :2001/02/23(金) 00:49
>5 まんまじゃん。 てのじゃ駄目?
8 :
デフォルトの名無しさん :2001/02/23(金) 00:53
#if 0とか やって #endif が無い場合とかもあるね。 まいちゃんもよくやるよ。
9 :
研究中? :2001/02/23(金) 00:58
どうやら閉じカッコ"}"がひとつ少なかったみたいです。 ありがとうございました。
10 :
人生にもif文を・・・ :2001/02/23(金) 01:03
if(){ } else{ } を使う場合、ifの処理の中身は少なくて、elseに 主な処理がくるって邪道かな?
11 :
デフォルトの名無しさん :2001/02/23(金) 01:05
Sを開始記号とする文法を以下のように定める. S→aB|bA A→a|aS|bAA B→b|bS|aBB このとき,列aaabbabbbaの最左導出を求めよ. っていう課題なんだけど,全然わかりません.
12 :
デフォルトの名無しさん :2001/02/23(金) 01:07
>11 普通にソートじゃん?
13 :
デフォルトの名無しさん :2001/02/23(金) 01:30
整数nを0,1,2,3〜10と変化させたとき、 どれかひとつでもx<n<yを満たすならループから抜け、 全てのnについて満たさないときはxとyを表示させるという サブルーチンを作りたいです。 for,if,goto等をいろいろ組み合わせたのですが、望む結果が得られません。 どのような構造にすればいいのかアドバイスをお願いします。
14 :
デフォルトの名無しさん :2001/02/23(金) 01:39
for(n=0 ; n<=10 ; n++) { if(n>x && n<y) { break; } } if(n==11) { printf("x=%d y=%d" , x , y); }
15 :
13 :2001/02/23(金) 01:49
レスありがとうございます。 質問なんですが、n=0ではじめのif文の条件を満たして いないと、次の処理の流れはどこに行くのでしょうか? (二つ目のif文か、それともn=1での比較か) それにしてもすごくスッキリしているんですね。 自分の書いたソースは見にくくって・・・。
16 :
デフォルトの名無しさん :2001/02/23(金) 01:55
if を満たしたときは for のループを抜ける。 for を抜けるのは for が n<=10 を満たさなくなったとき または始めの if を満たし break で for を抜けたとき for を抜けたときは n は11になってる。 if の break で抜けたときは n は if を満たしたとき(10以下)になってる 2番目の if で n を調べ for で抜けたか if(break) で抜けたかを判定
17 :
13 :2001/02/23(金) 01:59
>forを抜けたときはnは11になってる n<=10 という条件に反するように感じるのですが いいのですか?
>>15 n==0のままnが<=10かをチェックし、n++
nは1になりもう一度if(n>x && n<y)チェック
19 :
デフォルトの名無しさん :2001/02/23(金) 02:08
>>forを抜けたときはnは11になってる >n<=10 という条件に反するように感じるのですが >いいのですか? ちょっと表現が変だった。 for は n<=10 の間ループしてる。 つまりループを抜けたときは n は 11 になってる。ってこと。 break で抜けたときは n は 10以下。 分かる?
20 :
13 :2001/02/23(金) 02:15
やっと意味が分かりました。ループを抜けた際の nの値が重要なんですね。少し勘違いしていました。 14さん、補足してくださった方、どうもありがとうございました。
21 :
麻衣 :2001/02/23(金) 02:20
おねぇちゃんのスレッドに答える人はお姉ちゃんじゃないといけないみたいなルールがあったから、準じるね♪
>>11 文脈自由言語とかだよね。ここだとスペースが省略して表示されちゃうんで木がかけないんだけど、文字列を左から見ていくと最初に来るのはaだよね。
初期状態はSで最初にaが来るのは
S->aB
のルールだから、Sは左の子にa、右の娘にBを持つノードになるのね。
で、次の文字を見ると、やっぱりaなの。
Bの状態で一番左にaが来るのは、
B->aBB
のルールだから、このBは左の娘にa、真ん中の娘にB、右の娘にBを持つノードになるの。
仮に真ん中の娘をBB1、右の娘をBB2と名前を付けてあげると、
今の状態をディレクトリで表してあげるとこんな感じ。
S\a 終端記号なのでここまで
S\B\a 〃
S\B\BB1
S\B\BB2
で、BB1は終端記号じゃないからBB1の本来の状態、Bで次の文字を見てあげるの。そうするとやっぱりaだから、
S\a
S\B\a
S\B\BB1\a
S\B\BB1\BBB1
S\B\BB1\BBB2
S\B\BB2
になるの。 区切るね。
22 :
麻衣 :2001/02/23(金) 02:25
>>21 の続きね
で、次にBBB1を処理してあげるの次の文字はbだから、BBB1は
B->b
B->bS
のどっちか。ここで、bの次の文字からSを構成できるかどうかを考えるの。
構成することが出来なかったら、BBB1は
B->b
のルールを適用、できたら、
B->bS
ね。あとはこの繰り返し。
がんばってね、おにいちゃん&hearts;
#ネカマってよくこれを持続できるなぁ・・・。
てか、このルールって衝突起こしてない? ・・・ちぇっきんぐ $ bison test.y test.y contains 4 shift/reduce confilicts. $
24 :
お姉さん :2001/02/23(金) 02:51
麻衣ちゃん、新スレつくってくれてさんきゅ@hearts; これからもよろしくね!
25 :
デフォルトの名無しさん :2001/02/23(金) 04:56
データをprintfで出力せずに、なんとか.datみたいなファイルに 出力するにはどうすればいいの?
26 :
デフォルトの名無しさん :2001/02/23(金) 04:58
>>25 ちなみに言語はCね。
C++では教えてもらったんだけど。
27 :
麻衣 :2001/02/23(金) 05:17
>>25 FILE *fp;
char fname[32], str[32];
fp = fopen( fname, "wt" );
fprintf( fp, "%s", str );
fclose(fp);
fname,strにはなにか文字列を入れてね♪
でも、リダイレクトじゃダメなのかな?
28 :
デフォルトの名無しさん :2001/02/23(金) 05:38
32という数字は何を表すのかな? そもそもリダイレクトってな〜に?&hearts;
29 :
麻衣 :2001/02/23(金) 05:52
>>28 32に深い意味はないの。
2,4,8,16,32,64のような倍々してしまうコンピュータ病なの。
リダイレクトとは、DOSで
dir > ファイル名
をしたらdirだけしたら画面に表示されるのがファイルに出力されるの。
おわかりになられて?
30 :
麻衣 :2001/02/23(金) 05:55
>>28 32は適当なバッファサイズだよ♪
足りなければ大きくしてねっ☆ ていうか、多分足りないかな?
必要なバッファサイズを決めるのも設計の一部だから頑張ってね♯
あと、上の例では入ってないけどfpの結果がNULL(エラー)の場合の対処も必要だよっ∬
リダイレクトはプロセスの出力結果を他のプロセスやファイルに渡すことかなぁ
ex1)
ls -l > ls.log
"ls -l"の結果を"ls.log"というファイルに格納する
ex2)
rm * < yes
"rm *"に"yes"から入力を渡しつづける
31 :
デフォルトの名無しさん :2001/02/23(金) 06:17
32 :
麻衣 :2001/02/23(金) 06:31
うん ていうか、この麻衣はDOS知らない☆
33 :
デフォルトの名無しさん :2001/02/24(土) 15:13
計算結果(double型)の値をprintfとfprintfで表示&ファイルに出力 するのですが、桁数がばらばらでとっても見づらいです。 十の位から、小数点以下9桁まで表示させたいのですが どうすればいいのでしょうか?
34 :
デフォルトの名無しさん :2001/02/24(土) 15:16
>>33 ヘルプでprintfのフォーマット調べろや。%sは文字列、とかそういうやつな。
35 :
麻衣 :2001/02/24(土) 19:36
%02.9lf
36 :
麻衣 :2001/02/24(土) 20:18
ごめん てへっ まちがっちゃったぁ %12.9f だよ
ありがとうございました。 またヨロシクね。
いままで度胸がなくってできなかったんだけど遂に!遂にやりました! 想像以上の効きめです! 失禁脱糞対策にあらかじめ中のみえるビニール袋に閉じこめて500Wでまずは30秒にTRY! 小娘とはいえコンビニ弁当より重いんだし余裕かなと思ったんだけど・・・ たった12秒で袋を蹴破りでてきました。目が逝っちゃってたのでとりあえず出してあげました。 犬みたいにハアハア出し入れしている舌は真っ赤です。顔を近づけてみたら吐く息が すっごく熱くてビックリ!耳もすっごく熱くなってて真っ赤でした。やっぱ肉の薄い部分だからかな。 案の定、中で失禁しちゃってました。失禁は日課なのですっかり慣れて手袋もせず処理しました。 いつもなら罰として更に厳しい愛の鞭を与えるんだけど、今日は頑張ったのでご褒美に 乾燥エサを10粒もあげました。3日間なにも与えてなかったので腹が減っていたのか ガツガツ喰ってました。まだ手や足の末端の肉の薄い部分は熱くなってます。 だいぶ回復してきたので手足耳をカーテンに糸で縫いつけて大の字型に宙づりにしてます。 また失禁しやがりました。むかついたのでエアガンを乱射してます。 ヘ(^^ヘ)(ノ^^)ノ
39 :
麻衣 :2001/02/26(月) 03:17
あぁっ、もう学期が終わって宿題が出てなかったりして? しくしく(涙)
40 :
デフォルトの名無しさん :2001/02/27(火) 08:53
6角形のマス目(ヘクス)を使った戦争もののシミュレーションゲームとかで、 盤上の駒をクリックすると、その駒が移動できる範囲が示されますよね。 あれって、どういうアルゴリズムなんでしょうか? 障害物を考慮しないなら、その駒の移動能力の最大値を到達距離として、 その内側を全部カバーすればいい、っていうのはわかるんですが。 途中に障害物があると、それを迂回させないといけないわけで、 うーん、どうすりゃいいのかな。どなたかわかる方います? スレ違いかもしれませんが、よろしくお願いします>麻衣ちゃんズの皆さん
41 :
デフォルトの名無しさん :2001/02/27(火) 09:32
>>40 動的計画法という手法のいい練習問題でしょう。
ちょっと大げさだけれど、グラフを使うといいかもしれません。
説明は面倒なので、グラフの場合はアルゴリズムとデータ構造スレで、
動的計画法の場合は「ナップザック問題」で検索をかけてみてください。
42 :
デフォルトの名無しさん :2001/02/27(火) 11:38
>>40 & >> 41
思いつきだけど、再帰使うような感じになるのかな?
自分に移動できる量を持たせて6方向検索で再帰かければ
簡単な気がする。
思いつきだから あんまり突っ込まないでね。
>>42 それでいいいんじゃない
4方向で考えてみた
/* 移動範囲(x,y:座標 move:移動力)
void movement(int x, int y, int move)
{
int mp; /* 移動力 */
if(getMoveFlag(x,y)) return; /* 既にチェックされていたら終了 */
mp = getCost(x,y); /* 移動コスト取得 */
mp = move - mp;
if(move < 0) return; /* 移動力がなくなれば終了 */
setMoveFlag(x,y); /* 移動可能フラグ?をON */
movement(x - 1, y, move); /* 上方向のチェック */
movement(x + 1, y, move); /* 下方向のチェック */
movement(x, y - 1, move); /* 左方向のチェック */
movement(x, y + 1, move); /* 右方向のチェック */
}
こいつを6方向に拡張すればいい
44 :
麻衣 :2001/02/27(火) 18:17
ちなみにヘクスって普通の四角マスマップに変換できるんだよ☆ 上下左右、右斜め上、右斜め下の六方向に移動できる四角マスマップを表示上で奇数列をずらしてるだけと思えばわかるよね。
45 :
42 :2001/02/27(火) 23:45
>麻衣 ヘクス1つが6方向への参照をもつオブジェクトとして 作るってのはあんまり意味無いかな? 平面っていう制限がとれたりとか・・・・ これも思いつきだからキツいつっこみはかんべんしてね。
46 :
麻衣 :2001/02/28(水) 04:28
>>45 内部でどう作るかは自由だと思うよ。麻衣は表示上の話をしただけのつもりなの。
たしかに、その方が作らなくて良い部分のヘクスは作らないですむもんね。
47 :
40 :2001/02/28(水) 06:59
ナップザックは知っていましたが、動的計画法というのは知りませんでした。調べてみます。ありがとう>41 >43 実は、似たようなアルゴリズムは自分でも考えたんです。それで、結論としては >if(getMoveFlag(x,y)) return; /* 既にチェックされていたら終了 */ これがマズいってことになりまして。 例えば、以下のようなマップがあるとします。左上のSからスタートして、9でできた島を迂回し、洞窟の 奥のG(ゴール)を目指します。数字は、そのマスに移動するのに必要なコストをあらわし、最初の時点で 持っている移動力13から引き算していき、0になったら動けなくなります。簡単にするために、 4方向移動だけで斜め移動はなしです。 S551999 199211G 1991999 1111999 時計回りで島を迂回するコースを先に検索させてしまうと、洞窟の入り口の2で力尽きます。ここでこのマス にフラグが立ってしまうので、その後、反時計回りで迂回するコースを検索させてもだめなんです。もちろん、 先に左回りを検索させればそんなことにはなりませんけど、どちらを先に検索したらいいかなんて、 コンピューターには期待できません。全体が見えてないと判断できないですから。 しかも、たいていの場合、ゴールまでに複数のルートがあるときは一番移動コストが少ないのをユーザーに 提示したいわけです。結局、まともに解こうとすると、 1) 移動コストを無視したときの最大移動距離範囲内にある全てのマスを選ぶ。 2) それぞれのマスについて、考え得る全ての組み合わせの経路を調べる。 3) その中で、最も移動コストが少ないルートを記憶させておく。 これを、(1)の全てのマスについてやる必要があるんです。 ここで41さんが紹介してくれた「ナップザック問題」の解き方が応用できるんですが、 それは要するに「総当たり」です。あるマスを使うか使わないかを判断して全ての組み合わせを 考慮するわけで、移動できる最大範囲内に10個マスがあれば2^10ですから1024通り。20個マスが あれば百万通りです。とてもゲームに使えるアルゴリズムではないです。 でも、わりにショボいマシンのゲームでもこの手の機能ってインプリされてますよね。きっとなんかうまい手が ありそうな気がするんで、それで質問してみたんです。うーん、麻衣ちゃんの手には余る質問だったかな?
48 :
麻衣 :2001/02/28(水) 09:05
うわぁ長いね。 ひとつだけヒントあげるね。 一度通過したところは、フラグ立てるんじゃなくて、 移動コストを書き込んでおけばしあわせになれるよ。
procedure SiawasenoKatati const SX = 1; SY = 1; GX = 7; GY = 2; Map: array[0..5,0..8] of Integer = ( (-1,-1,-1,-1,-1,-1,-1,-1,-1), (-1, 1, 5, 5, 1, 9, 9, 9,-1), (-1, 1, 9, 9, 2, 1, 1, 1,-1), (-1, 1, 9, 9, 1, 9, 9, 9,-1), (-1, 1, 1, 1, 1, 9, 9, 9,-1), (-1,-1,-1,-1,-1,-1,-1,-1,-1) ); var Cost: array[0..5,0..8] of Integer; x, y, RootCount: Integer; Root: array[0..99] of TPoint; procedure sub(x,y: Integer; tcost: Integer); begin if Map[y,x] >= 0 then begin if Cost[y,x] > Map[y,x] + tcost then begin if Map[y,x] + tcost > 13 then Exit;//移動力超えたらヤメ Cost[y,x] := Map[y,x] + tcost; if (GX = x) and (GY = y) then Exit;//ゴール着ならヤメ sub(x,y-1,Cost[y,x]); sub(x+1,y,Cost[y,x]); sub(x,y+1,Cost[y,x]); sub(x-1,y,Cost[y,x]); end; end; end; begin //コストクリア for y := 0 to 5 do for x := 0 to 8 do Cost[y,x] := 999; //コスト書き込み Cost[SY,SX] := Map[SY,SX]; Sub(SX,SY-1, Cost[SY,SX]); Sub(SX+1,SY, Cost[SY,SX]); Sub(SX,SY+1, Cost[SY,SX]); Sub(SX-1,SY, Cost[SY,SX]); //移動力13の範囲 for y := 0 to 5 do for x := 0 to 8 do if Cost[y,x] >= 1 and Cost[y,x] <= 13 then FillRect(...); //ゴール→スタートの最短経路 x := GX; y := GY; Root[0].x := x; Root[0].y := y; RootCount := 1; while (Cost[y,x] > Map[SY,SX]) do begin if Cost[y,x-1] < Cost[y,x] then Dec(x) else if Cost[y+1,x] < Cost[y,x] then Inc(y) else if Cost[y,x+1] < Cost[y,x] then Inc(x) else if Cost[y-1,x] < Cost[y,x] then Dec(y) else break;//到達不可能 Root[RootCount].x := x; Root[RootCount].y := y; Inc(RootCount); end; end;
50 :
40 :2001/02/28(水) 12:20
ああっ、わかりました。目からウロコが滝のように!! 単なるフラグではなく移動コストを書き込んでおいて、再度そのマスにたどりついたら 現在までの移動コストと比較して、もし小さければ上書きしてしまえばいいのか。 麻衣ちゃん48が言ってるのは、サブ手続きの3行目と5行目のことですね! 最短経路を求めるのも、スタートからではなく、逆にゴールからたどることで、たった ひとつの最適解を簡単に求められますね。これもスマート、お見事です。 すごい、すごいよ。ぼくはしあわせになったよ! ありがとう、みんな! ありがとう麻衣ちゃん49!!・・・って、自分までネタキャラになりきってどうする。つーか、本当にありがとうございます>49 一緒に考えてくれた他の麻衣ちゃんズの皆さんにも感謝。またよろしくお願いします。
49の最短経路の部分がおかしいと思うのは俺だけか?
>>51 4方向のうち一番コストの少ないのを選ばないといけないと思われ
53 :
49 :2001/02/28(水) 14:52
>>51 >>52 その通り!修正しといてね>40
procedure FuSiawasenoKatati
54 :
デフォルトの名無しさん :2001/03/03(土) 16:12
1週間で一億円作って来いゴラァ!
マネーゲームIIですら、1ヶ月で一億円だぞ。勘弁してくれ。
56 :
父です :2001/03/04(日) 00:03
生まれた日から今日までの経過日数を出力するプログラムの 1〜6までを答えなさい。また間違った部分を訂正しなさい。 って問題がでたんだけど分かりません教えて下さい! #include <studio.h> int kikan(int y1,int m1,int d1,int y2,int m2,int d2); int main(void) { int tyear, tmonth, tday, year , month, day; printf("今日は?"); scanf("%d %d %d", &tyear, &tmonth, &tday); printf("生年月日は?"); scanf("%d %d %d", &year, &month, &day); printf("今日はあなたが生まれて%d日目です。\n",@); return (0); } int kikan(int y1,int m1,int d1,int y2,int m2,int d2); { int tndays; /*西暦元年から今日までの経過日数 */ int ndays; /*西暦元年から誕生日までの経過日数 */ if(m1 = 1){ y1 = A ; m1 = B ; } tndays = 365*y1 + y1/4 - y1 / 400 + 306 * (m1 + 1) / 10 + d1 - 428; if(m2 = 2){ y2 = C ; m2 = D ; } ndays = 365*y2 + y2/4 - y2 / 400 + 306 * (m2 + 1) / 10 + d2 - 428; return (E); }
57 :
名無しさん :2001/03/04(日) 01:21
>>56 まず、何も見ずに自分で考えてプログラム書いてみたら?
それから問題見直すと、簡単に解けると思われ
58 :
デフォルトの名無しさん :2001/03/04(日) 01:23
>if(m1 = 1){ 写しまちがってねえ?
チャタリングの効果的な除去を教えて?
60 :
デフォルトの名無しさん :2001/03/04(日) 04:22
>>56 オレもif条件の中が二つとも間違ってるに1票。
しかし==にしたとしてもおかしい気が。<=2じゃないのか?
studio.h?
>>59 3接点スイッチにDフリップフロップ回路かますのが理論的には理想
でもたかがスイッチ一つにそこまでは普通しない。
CRで適当にごまかせ。
63 :
59 :2001/03/04(日) 06:28
64 :
62ではないが :2001/03/04(日) 08:54
65 :
59 :2001/03/04(日) 13:53
>>64 あーそういうこと
ハードの改造は技術部にイヤだといわれたので、無しです。
66 :
59 :2001/03/04(日) 22:58
あれこれ考えるのが面倒だったのでサンプリングしてandを取った。 てゆうかだ、ハード部の連中いつかぶっとばしてやる
67 :
制御屋さん :2001/03/04(日) 23:35
真の制御屋さんは図面から求められる仕様を理解できる。
68 :
デフォルトの名無しさん :2001/03/05(月) 07:28
>>59 スイッチなら規定時間の間、条件を満たしていればOKにすればいいんじゃない?
おいらは、10msec毎にサンプリングして、6回同じ条件ならOKにしている。
もしA/D入力だったら、フィルター処理を追加してみれば。
int dAd[2]; // dAd[0] = 前回値, dAd[1] = 今回値
dAd[0] = ( dAd[0]*15 + dAd[1] ) / 16;
フィルターの乗数は追随速度やカッティング周波数にあわせて調整してくれ。
69 :
デフォルトの名無しさん :2001/03/05(月) 10:23
60msってユーザに反応が遅いと思われないですか? 押された時は早く反応し、離された時はゆっくり 反応するようにすべきです。
70 :
デフォルトの名無しさん :2001/03/05(月) 10:55
>>61 スタジオ じゃないだろ
stdio.h のことかい?
71 :
68 :2001/03/05(月) 11:59
>>69 60msecで遅いと言われたことはないです。
とくに連打するようなスイッチはありませんので。
もしかすると、業界が違うのかな?
こちらは家電系です。
>>56 #include <stdio.h>
int kikan(int y1,int m1,int d1,int y2,int m2,int d2);
int main(void)
{
int tyear, tmonth, tday, year , month, day;
printf("今日は?");
scanf("%d %d %d", &tyear, &tmonth, &tday);
printf("生年月日は?");
scanf("%d %d %d", &year, &month, &day);
printf("今日はあなたが生まれて%d日目です。\n",
kikan(tyear, tmonth, tday, year, month, day));
return (0);
}
int kikan(int y1, int m1, int d1, int y2, int m2, int d2)
{
int tndays; /*西暦元年から今日までの経過日数*/
int ndays; /*西暦元年から誕生日までの経過日数*/
if(m1 <= 2){
y1 = y1 - 1;
m1 = m1 + 12;
}
tndays = 365*y1 + y1/4 - y1 / 400 + 306 * (m1 + 1) / 10 + d1 - 428;
if(m2 <= 2){
y2 = y2 - 1;
m2 = m2 + 12;
}
ndays = 365*y2 + y2/4 - y2 / 400 + 306 * (m2 + 1) / 10 + d2 - 428;
return(tndays - ndays);
}
74 :
68 :2001/03/05(月) 12:19
75 :
69 :2001/03/05(月) 13:21
76 :
父です :2001/03/05(月) 13:23
57,58、60、73さん。ありがとうございます。 おかげで合格しました。
77 :
麻衣 :2001/03/05(月) 13:50
>>77 どんなスイッチで経験があります?
マイクロスイッチやシートキーとかでも大丈夫でしたか?
>>77 バネ付でびよんびよん のスィッチだったので2回ッくらいじゃ
全然駄目でした。つーわけで10ms間隔8回くらいのandです。
80 :
麻衣 :2001/03/07(水) 15:44
うん。シートキーやマイクロスイッチでもOK でも10mS毎じゃダメ メカスイッチのチャタリングは70msはあるから25〜40mS毎に見て2回ね ようはさ、2度押しにならない事と 火花パチパチノイズで間違わない事がうまくいったらいいの
81 :
デフォルトの名無しさん :2001/03/07(水) 16:03
2次微分による輪郭抽出をすると元の画像はどういうふうな画像になるのですか?
元の画像は変わらないのでは?
83 :
68 :2001/03/07(水) 19:27
集計
>>68 10msec 6回 タクタイルスイッチ、カーボンと基盤パターンを接触させるスイッチ
>>80 25〜40msec 2回 マイクロスイッチ、シートスイッチ
>>79 10msec 8回 バネ付でびよんびよんのスィッチ
タクタイルスイッチとマイクロスイッチはあまり変わらないので、
おれのやり方(
>>68 )が一番効率悪い模様。
50〜80msecの一致時間を必要とすることでは意見が一致。
84 :
79 :2001/03/08(木) 02:03
>>80 >メカスイッチのチャタリングは70msはあるから
そんなにあったのね。10ms×8回でよかったというのは
はだか戦隊ぎりぎりセーフだったってとこですか・・・
何はともあれ、ありがとう!
ほんとに女の子なら今度結婚しよう!
85 :
麻衣 :2001/03/08(木) 09:52
ええとね、バウンドって100mSでもホントはあるの 片方しか複数確認しないと100mS連続で見てもきびしいのよホント OnOn とOfOffでチェックするから オーケって感じ お兄ちゃんと結婚なんて考えくない
86 :
デフォルトの名無しさん :2001/03/08(木) 10:00
ゴム接点式の抵抗値が不安定な信号に対しては 双方向ポートに抵抗1本(100KΩ)付けて、 ・前回の入力値を常時は出力 ・入力する直前に入力ポートにして直後に読み込む という方法も1チップでは良く使われる。 抵抗値と、入力ポートの寄生容量とでCRを構成 ハイインピータンスにしてから実際の入力迄の時間でシュミット特性 を出すという手法だ。
87 :
デフォルトの名無しさん :2001/03/08(木) 10:11
88 :
デフォルトの名無しさん :2001/03/08(木) 11:18
>>81 一次元で説明すると、1次微分(-1,1)は傾き、
2次微分(1,-2,1)は傾きの変化だよ。
元の輝度 0 0 0 1 5 9 10 10 10
1次微分 0 0 1 4 4 1 0 0 0
2次微分 * 0 1 3 0 -3 -1 0 *
89 :
コロ助子ちゃん :2001/03/08(木) 17:24
スイマセン…アホゥなC++歴一ヶ月の初心者です が、宿題でどうしてもとけないのがあるんです。 ax^2+bx+c=0 ケース1(a=3,b=12,c=39)、 ケース2(a=3,b=0,c=-28.83)、 ケース3(a=2,b=10.6,c=13.44)、 3のケースについての解を求めよ これをifを使って if (b*b-4*a*c > 0) { } if (b*b-4*a*c == 0) { } if (b*b-4*a*c < 0) { } ってな感じで解きたいんです…後、3っつの ケースの答えを同時に出すにはループを使う しかないと思うんですが…よく詳しい使い方 が解りません(泣)。誰か助けて〜!
90 :
デフォルトの名無しさん :2001/03/08(木) 17:36
a = 3; b = 12; c = 39; if (..) {... } a = 3; b = 0; c = -28.83; if (..) {.. } って感じで、バカ正直に3回書いておけ。 人には自分にあったレベルというものがある。 変に背伸びして、格好つけようとするんじゃない。
91 :
デフォルトの名無しさん :2001/03/09(金) 01:18
>>89 高校の問題でしょうか。
普通はガウス(ジョルダン)の消去法を使うと思うのだが。
92 :
デフォルトの名無しさん :2001/03/09(金) 01:33
ガウスの消去法で二次方程式を解く方法は、俺は知らんな。 少なくとも、高校レヴェルではなかろう。
94 :
麻衣 :2001/03/09(金) 16:20
そういう時は関数を使おう。 ただ、返したい値が二つになるよね? おにいちゃんは複素数は知ってる? 知らないかな? 知らないとすると、この場合、答えの他に、答えが何個あるかどうも返したいんだとするね? どこでBOOLが定義されてるかどうかは調べてね int answer(double a , double a, double a, double *x1,double *x2) { double D=b*b-4*a*c ; if(D>0){ *x1= ここは自分で埋めてね; *x2= ここは自分で埋めてね; return 2; }else if(D==0){ *x2=*x1= ここは自分で埋めてね; return 1; }else return 0;//解が無い } このanswerをどう使うかは宿題だあ
95 :
麻衣 :2001/03/09(金) 16:40
あちゃぁ てへっ失敗だあ
×int answer(double a , double a, double a, double *x1,double *x2)
○int answer(double a , double b, double c, double *x1,double *x2)
ついでだから答え書く
void printAns((double a , double b, double c)
{ double x1,x2;
switch(answer(a,b,c,&x1,&x2))
{
case 0: printf("%s\n","答えがありません");break;
case 1: printf("%s %15.3f\n","答えがひとつあります",x1);break;
case 2: printf("%s %15.3f %15.3f\n","どちらかが答えです->",x1,x2);break;
}
}
int main()
{
printf("%s","最初の問題は "); printAns( 3 , 12 , 39);
printf("%s","2番目の問題は "); printAns( 3 , 0 , -28.83);
printf("%s","最後の問題は "); printAns( 2 , 10.6 , 13.44);
return 0;
}
それから、
>>91 さんは無視してもOK
あまり読まずに連立1次方程式の問題と勘違いしちゃったのかな
>>94 a = 0の場合、 a = b = 0の場合は?
# そこまで要求されてるかどーかは知らないが
97 :
麻衣 :2001/03/10(土) 21:47
, ――
γ∞γ~ \
人w/ 从从) ) / ̄ ̄ ̄
ヽ | |┬ イ |〃 <
>>96 こめけえヤツ
`wハ~ ^ ノ) \___
/ \`「
98 :
お局 :2001/03/11(日) 01:00
>>97 あら、その細かいことが実際にプログラミングするときに大きな問題になることを
ご存じのうえでおっしゃってるのかしら?
確かに宿題の回答としては96さんのおっしゃる指摘は細かすぎるかもしれないわ。
アタシも94のコードは学校の宿題の回答レベルとしては十分だと思うしね。
でも、プログラムを組む上で重要な考え方を提示してくださっている96さんの
発言に対して「こめけえヤツ」とは、ずいぶんなおっしゃいようじゃなくって?
少なくとも教育的配慮には欠けるといわざるを得ないし、技術者としてミスを
指摘されたときの模範的な応対とは言えないと思うんだけど、いかが?
それともアタクシなんかには想像もつかないような高尚なお考えをお持ちで、
わざと97のような発言をなさっているんでしょうか?
もしそうだとしたらごめんあそばせ。その場合は、できれば後学のためにも
その高尚なお考えをぜひとも御開陳願いたいものだわ。
おれの妹をいぢめるな
このネカマ野郎
怒った麻衣ちゃんもかわいいから許してあげようよ〜
102 :
麻衣 :2001/03/11(日) 07:57
もっち、2次方程式の解を求めろ! って問題ならべつじゃん。 んでも、課題はa,b,cが与えられてるのよ。 で、中間的に関数を使った方が簡単だよって話だよ。 ライブラリにしとけば後から使えるとかの話ならさあ、 複素数に対応してから後じゃない?
103 :
デフォルトの名無しさん :2001/03/11(日) 08:53
標準入力から任意の文字数の行を入力する、完璧なルー チンを作りたいんだけど、どうすればいいの? fgets を使うんだろうけど、これは文字数をあらかじめ 指定しないといけないよね。最終的には一続きの文字列 として取り出したいの。 ああ、でもこのルーチンを使うと呼び出した先で malloc しちゃうのかあ。それも気持ち悪いなあ。 というわけで、みんなこの辺りをどうやって解決してる の?答えてくれたらお兄ちゃんがいっしょにお風呂に入っ てあげるよ。
104 :
麻衣 :2001/03/11(日) 09:02
お風呂はおにいちゃんとは嫌! パパと入るもん ☆fgetsして\nがないならmalloc/realloc ☆コルーチンにして順次処理し1行分のバッファを不要にする ☆メモリマップファイルにしてメモリから読む
105 :
デフォルトの名無しさん :2001/03/11(日) 11:21
106 :
麻衣 :2001/03/11(日) 12:46
そういう方法もあるよね。でも、fgetsが使えるならそっち優先しちゃおうよ
107 :
お局 :2001/03/11(日) 13:40
アタシは単純に「サブルーチンを作ったら、その動作条件を明示するべきだ」という話題だと 思ってるんだけど、麻衣ちゃんのご高説では、ライブラリとか、複素数対応なんていう 要件拡張の話が突然でてきて、ちょっと理解に苦しむわ。もう少しアタシみたいなバカにも わかるように説明していただけないかしら? assertをたったひとつかふたつ書くことが、そんなに面倒なのかしら? それともアタシには見えないけど、コードにはきちんとコメントが書いてあるのかしら? プログラミングを始めたばかりの人に、プロの正しい習慣を示すことと、プロとしては あまり適切でない応対を見せることの、どちらが宿題のアドバイザーとして求められる 姿なのかしら? それに、複素数に対応することと、環境によってはプログラムがクラッシュすることを 避けることの二つに優先順位をつけるときに、前者が優先するっていうのも、アタクシ のような古い人間には大変興味深い価値観だわ。 それとも、もしかして麻衣ちゃんは素人に毛が生えたレベルのプログラミングで満足で、それ 以上のレベルに行く気はないってことかしら。 それならそれでもいいんじゃないかしら。いつまでも半人前扱いで、ちゃん付けで呼ばれる なんていう屈辱的な状況に耐えられそうにないから、アタシはゴメンだけど。 お目汚し失礼。お忙しいでしょうから、特に反論はいただかなくても結構よ。ごめんあそばせ。
おれの妹をいぢめるな
このネカマ野郎
なんか独り善がりなひとだなぁ。そんな大袈裟なもんかい? >教育的配慮に欠ける なんだそら?よくもそこまで邪推できるもんだ。 だれもそんなことで影響受けやしないし、技術者の姿勢云々なんて発想は しやしない。洒落や愛嬌の範疇じゃん。 >それに、複素数に対応することと、環境によってはプログラムがクラッシュすることを >避けることの二つに優先順位をつけるときに この発想は変だよね。優先順位をつけるなんてありえないもの。 プログラムがクラッシュしないのは絶対条件であって、何かとトレード オフなんてできるわけ無いじゃん。 ましてプログラムに要求された機能とクラッシュ云々は何の関係もない。 >前者が優先するっていうのも そもそも誰もそんな事言ってないし。 こめけえヤツ(笑
111 :
麻衣 :2001/03/11(日) 17:13
えとね、麻衣にしたら a=0なんて方が要件拡張にみえちゃうっていってるの!
だって要件は
>>89 だよ。
それにさあ、ここでなんでassertの話が出るの?
assertで止まるのと除算エラーで止まるのとそんなにちがうの? みかけいっしょじゃん!
だいいち除算エラーでクラッシュするような環境って何?
そんなばかちんなマシンって宿題につかうの?
a=0で x1=-c/bを返したら多少汎用に近くなるのはたしかだけど、
中途半端な汎用性は麻衣キライ!
112 :
お局 :2001/03/11(日) 19:54
あら、楽しくなってきたわね。本題からは関係ないからsageね。
>>110 書き込みを拝見すると新人さんではないとおもうので、独り善がりにそう仮定させていただくわ。
新人がプログラムを書いたとするわね。で、アナタがそのプログラムをレビューして不適切に思える
箇所があったとするわ。そのミスを指摘して、新人に「こめけえヤツ」という旨のことを言われた
とするわね。そういう新人さんをアナタはどう思う?
そしてもしその新人さんは「学校の先生はミスを指摘されたときに、そういう対応をしていました」
と弁明したとするわね。そういう先生をアナタはどう思う?
アタシだったら、その先生の応対は教育的配慮に欠くと思うわ。
>だれもそんなことで影響受けやしないし、技術者の姿勢云々なんて発想は
>しやしない。洒落や愛嬌の範疇じゃん。
アナタはそう思ったのね。アタシはそう思わなかったのよ。
アナタはアタシのことを独り善がりひとと評してくださったけど、もしその評が当たっているとするなら、
アナタも独り善がりなひとになるわけね。もちろん相手にわざわざ指摘するくらいなので、自覚はお有りだと
思うけど。
>プログラムがクラッシュしないのは絶対条件であって、何かとトレード
>オフなんてできるわけ無いじゃん。
>ましてプログラムに要求された機能とクラッシュ云々は何の関係もない。
あら、まったくその通りよ。アタシの主張を繰り返していただいてありがとう。
ご存じの通り、引用してくださっている部分の書き込みは、102の麻衣ちゃんの書き込みに対する反論の
つもりなのよ。
アタシは102の麻衣ちゃんは「クラッシュするのを避けるより先に、複素数に対応するべきだ」という旨の
発言をしていると解釈したのよ。読解力のないアタシが勘違いしていたらごめんあそばせ。
というわけで
>そもそも誰もそんな事言ってないし。
アタシは102で麻衣ちゃんがそうおっしゃっていると解釈しているわ。
>こめけえヤツ(笑
お褒めにあずかり光栄だわ。今後もよろしくお願いいたします。
113 :
お局 :2001/03/11(日) 19:56
>>111 お忙しいでしょうにわざわざご回答くださってありがとう。
>えとね、麻衣にしたら a=0なんて方が要件拡張にみえちゃうっていってるの!
繰り返しになるけど、学校の宿題の回答としては、a=0の場合を考慮しなくても充分だと思うわ。
麻衣ちゃんももちろんご存じだとは思うんだけど、長い間いろいろなプログラムを組んでいると、
過去に再利用するとは思っていなかったようなサブルーチンを使うことって結構あるのよ。
だからその時に備えておくことはプログラマとしては良い習慣だと思うのね。
それに96のような指摘は仕事上でコードをレビューしてもらっていればわかってくださると思うけど、
非常にありがたい指摘なのよ。問題が発生する前に、バグを指摘してくれたわけでしょ?
その指摘に対して、97のような応対をするのはプログラマとしては望ましいものとは、アタシは
思わないのよ。
掲示板に書いたコードに対するバグ指摘に対して97のような応対をするだけなら、わざわざ指摘する
必要もないと思うわ。だけど初心者向けの教えてあげるスレで、講師役の方がああいう応対をするの
には、ちょっと苦言を呈したくなったのよ。
>それにさあ、ここでなんでassertの話が出るの?
>assertで止まるのと除算エラーで止まるのとそんなにちがうの? みかけいっしょじゃん!
あら、こんなに明らかなことをバカのふりをして質問するってことは、アタシのことを試してくださって
いるのね。
サブルーチンの引数をチェックするassertを入れることで、サブルーチンの動作条件、責任範囲が明確に
なるわ。もしassertがなくて除算エラーで止まった場合には、呼び出し側に問題があるのか、サブルーチン側に
問題があるのかがすぐにはわからないわ。
114 :
お局 :2001/03/11(日) 19:56
続きを書かせていただくわ。 具体的にはアタシだったら94のコードは、96の指摘を受けた後には、以下のように修正すると思うの (本当は数値誤差も考慮するべきだけど、そこはちょっと違う話だから置いておくわ)。 int answer(double a, double b, double c, double *x1,double *x2) { assert( a!=0.0 ); (以下そのまま) こうやって記述してあれば、この answerが将来再利用されて、a=0で呼び出されたときにはassertで停止する、 つまりa=0を入れて呼び出した側が悪いことがすぐにわかるわ。 除算エラーで止まった場合には、answerのバグなのか、呼び出す側の使い方が悪いのかは明確じゃないわよね。 ずいぶんちがわないかしら? assertで止まることと除算エラーで止まることは。 >中途半端な汎用性は麻衣キライ! あら、アタシも中途半端な汎用性はキライよ。気が合うわね。 そういう中途半端な汎用性を要求されないためにも、サブルーチンの動作条件を明確にするassertを使用する べきなんじゃないかしら。
115 :
麻衣 :2001/03/11(日) 20:23
, ―' γ∞γ~ \ 人w/ 从从) ) / ̄ ̄ ヽ | | l l |〃 < ん〜わかった ごめん `wハ~ ーノ) \__ / \`「 でも、将来再利用を考えるなら別の設計にするな麻衣は
試合に勝って勝負に負ける頭でっかちなお局であった。
117 :
舞 :2001/03/11(日) 21:24
みんなダメ よぉっく
>>89 を見て! 課題は C++なんだから
class SecondCurve {
double a,b,c; //y=a*x*x+b*x+c
public:
double getD(void){return b*b-4*a*c; };
double getX1(void){double d=getD(); return (-b+sqrt(d))/a/2.0; };
double getX2(void){double d=getD(); return (-b-sqrt(d))/a/2.0; };
SecondCurve(double aa,double bb,double cc){ a=aa;b=bb;c=cc;};
};
class err{};
int _matherr(struct _exception *e){ throw err();}
int main()
{
struct pclass:SecondCurve {
pclass(double a,double b,double c):SecondCurve(a,b,c){};
void print()
{
try{ cout << getX1() <<" ";}catch(...){};
try{ cout << getX2() <<" ";}catch(...){};
cout << endl;
}
} d1( 3 , 12 , 39)
,d2( 3 , 0 , -28.83)
,d3( 2 , 10.6 , 13.44);
d1.print();
d2.print();
d3.print();
}
このネカマ野郎
119 :
お局 :2001/03/11(日) 23:20
>>115 ご理解いただけてうれしいわ。宿題回答がんばってちょうだい。
んー、ネカマじゃなくて、本物のオカマさんたちですよ。 「お局」なんていうハンドルネームを、デブオタが考え付くとは思えない。 北島パヤ(マヤではない)なんていうキーワードに反応するはず(w
121 :
デフォルトの名無しさん :2001/03/12(月) 01:44
>120 オカマ発見!
122 :
全員落第! :2001/03/12(月) 01:54
// ちゃんと判別式が負のときを考慮しろよ!! #include <complex> #include <math.h> #include <iostream.h> // 二次方程式 "A*x*x + B*x + C = 0" を解く。戻り値は解の個数。 int quadratic_equation(double A, double B, double C, double_complex &x1, double_complex &x2) { if (A != 0) { // A が非ゼロなら、通常の二次方程式。 // 方程式を "x*x - 2*b*x + c = 0" の形式に変換する。 double b = -B / 2 / A, c = C / A; double d = b*b - c; // 判別式 D / 4 if (d >= 0) { // 計算誤差を避けるため、絶対値の大きい解を先に求める。 x1 = (b > 0) ? b + sqrt(d) : b - sqrt(d); // もう一方の解は、解と係数の関係で求める。 x2 = c / x1; } else { // 判別式が負の場合、複素解。 double imag = sqrt(-d); x1 = double_complex(b, imag); x2 = double_complex(b, -imag); } return 1 + (d != 0); } else if (B != 0) { // AがゼロでBが非ゼロの場合は、通常の一次方程式。 x1 = -C / B; return 1; } return 0; // 不定または不能。 } int main() { double coef[3][3] = { {3, 12, 39}, {3, 0, -28.83}, {2, 10, 13.44} }; for (int i = 0; i < 3; i++) { double a = coef[i][0], b = coef[i][1], c = coef[i][2]; double_complex x[2]; int nx = quadratic_equation(a, b, c, x[0], x[1]); cout << "方程式: " << a << "*x*x + " << b << "*x + " << c << " = 0" << " の解は、" << nx << "個。" << endl; for (int j = 0; j < nx; j++) cout << j << "個目の解: " << x[j] << endl; } return 0; }
123 :
麻衣 :2001/03/12(月) 02:36
さて、次いってみよー♪
124 :
デフォルトの名無しさん :2001/03/12(月) 02:40
>>98 そんなに怒るこたぁないと思うが同意だね。
「2次方程式の解を求める」関数を作り、
その関数を使って目的を達成させるのであれば、
関数は、どんな引数を与えても、
それに対応した答えを返すべき。
96の言う通り、あらゆる可能性で動作するように、
int answer() を変えるべきでしょ。
細かいどころか、このくらい普通だと思うね。
でもさ、他人のコードをコピーして
課題を済まそうとする奴に
そこまで教える必要ないでしょ。
90は極論過ぎると思うけど(^^;
125 :
全員落第! :2001/03/12(月) 03:07
>>124 すべての可能な引数に対し考慮しろって言うのは、素人の発言。
動作を保証する前提条件というのが、通常はある。たとえば、NULLポインタは不可とかな。
あと、assertを入れればいいというのは、大嘘、または素人の発言だ。
assertは、デバッグ用にコンパイルしたときだけが有効なので、
ライブラリ用にコンパイルされたオブジェクトには、assertは入らないと思っていい。
いずれにせよ、この程度の宿題で問題にするほどの事ではないな。
それより、例題には明らかに複素数の解を持つ例が含まれているので、
それをサポートするのは、宿題であっても必須だ。
126 :
デフォルトの名無しさん :2001/03/12(月) 03:10
>>107 〜
assert はどうだろう?
assert 使うよりは、122のように
a=0で、明確に処理を分けた方がいいと思うんだけど。
エラー出るの分かってるのに、その中で処理しないのはどうかと。
>> 89
ま、とにかく、C++ やる前に、C 勉強してください(藁
127 :
デフォルトの名無しさん :2001/03/12(月) 03:40
124=126っすよ。
>>125 >すべての可能な引数に対し考慮しろって言うのは、素人の発言。
うーん。書き方がまずかったか。
俺は、係数のことに対して言いたかっただけなんだが。
つまり「どんな係数であっても、答えを返す」
べきだってことを言いたかったのよ。
もちろん、動作保証は引数が
double A, double B, double C
である場合で問題無しです。だから
「NULLポインタは不可」。当然でしょ。
>それより、例題には明らかに複素数の解を持つ例が含まれているので、
>それをサポートするのは、宿題であっても必須だ。
同意。あと「不定・不能」の判別もね。
128 :
全員落第! :2001/03/12(月) 04:47
つーかですな。関数化とか、ライブラリ化とか、
ウザい事ぬかすから、
>>122 みたいに面倒なコードになるのよ。
これだって、不定と不能の区別とか、A=0と重根の区別ができない。
プログラムなんて、与えられた条件で動けばいいのだから、
今回の条件ならば、
>>90 のやり方でいいと思って、俺は90に書き込みしたんだがな。
129 :
全員落第! :2001/03/12(月) 04:53
>>103 こんな感じかな。動くかどうかは知らない。っていうか、もう寝る。
#include <stdio.h>
/*
* 指定入力から、一行読みこむ。バッファは必要なだけ内部で確保する。
* 返り値は読みこんだ文字数。改行文字も(あれば)読みこむ。
* 1文字も読まずにファイル終端となったときは、0を返しバッファは確保しない。
* エラー時には-1を返す
*/
int fgetline(FILE *fp, char **line) {
int sz = 80, cc = 0, c;
char *lp = malloc(sz);
*line = lp;
if (lp == NULL) return -1;
while ((c = fgetc(fp)) != EOF) {
if (sz <= cc) {
lp = realloc(lp, sz += 80);
if (lp == NULL) free(*line);
*line = lp;
if (lp == NULL) return -1;
}
lp[cc++] = c;
if (c == '\n') break;
}
lp[cc] = 0;
if (cc == 0) {
free(lp);
*line = NULL;
} else {
lp = realloc(cc + 1);
if (lp != NULL) *line = lp;
}
return cc;
}
布団の中で、バグ発見。0の重根を持つときに問題ありでした。 というわけで、修正版↓。 > // 計算誤差を避けるため、絶対値の大きい解を先に求める。 > x1 = (b >= 0) ? b + sqrt(d) : b - sqrt(d); > // もう一方の解は、解と係数の関係で求める。 > x2 = (x1.real() != 0) ? c / x1.real() : x1;
131 :
デフォルトの名無しさん :2001/03/12(月) 07:48
麻衣 VS お局 について 麻衣に1票
1、 a=0なら2次方程式じゃない
2、a=0はゼロ除算例外が出る。
>>94 の関数スタイルなら
assertで確認すべきは x1,x2のポインタの方
3、assertはプログラムを異常終了させる。 3つ答えを求めようと
して最初にassertを踏んだら3つとも答えは出ない。 それより
例外を出すべき
4、算術的にはa=0以外にも aが小さくbが極端に大きい時には
オーバーフローエラーが出る場合もある。それだけを言うの
は片手落ち
5、そもそも、教育を言うなら まず誉めるべし。
頭の回る子供は特に誉めるべし。
誉めれば勝手に次の課題でそれくらいはやってくる
132 :
麻衣 :2001/03/12(月) 09:40
それはもう オナカいっぱ〜い だよ
133 :
お局 :2001/03/12(月) 11:06
あらあら、一晩たったら違う方向に育っているわね。楽しいわ。 まず論点の確認ね。 アタシの元の主張は「ミスを指摘されたら素直に認めて修正しましょう」ってこと。98を ご覧になってね。この点については麻衣ちゃんとはある程度意見の一致をみたから(111,113,115)、 特にもう言うことはないわ。 で、いまみなさんが盛り上がっているのは、2次方程式の解を求める関数の望ましい書き方は どうあるべきか? という話題よね。 だからアタシの認識では、131の「麻衣 VS お局」という書き方はあまり適当ではないと思うわ。 アタシがassertを入れるべきだ、という主張をしたのは、ミスを指摘された場合に最低限するべきこと の一例として示しただけだからよ。 うーん、たしかに107の書き方を見ると「assertを入れろ」という指摘に見えるかもしれないけど、 いちおう他の選択肢も挙げてあるわよね。オカマったらしいイヤミのオブラートに包んであるけどね。 みなさんの読解力を信頼していてよ。ほほほ。
134 :
お局 :2001/03/12(月) 11:07
続いてるのよ。 で、アタシたちの話題から派生した別の話題であるところの、2次方程式の解を求める関数の 望ましい書き方はどうあるべきか? という話題にも厚かましく加わらせて頂くわ。 この話題はサブルーチンの望ましい書き方はどうあるべきか、というより大きな問題でもあるわね。 アタシは元の話題ではこっちの問題を論じているつもりだったので、まずこれについて意見を述べさせて いただくわ。 極端なひとつの考え方としては、どんな状況でも適切に動作するようにサブルーチンを記述すべきだ、 というものがあるわね。どんな計数の組み合わせでも、double変数にstd::numeric_limits<double>::max() が渡されても、返り値を返すためのポインタが無効なアドレスを指していたときにも動くサブルーチン。 ステキ、うっとりしちゃうわね。 でも、この要求は一般には非現実的に高すぎるわ。設計実装に時間はかかるし、まずテストケースが膨大に なるでしょうし、コードサイズも実行速度も各種のチェックに費やされて大きくなるでしょうね。 逆の極端の考え方としては、いま要求されているギリギリ最低限の状況で動作するサブルーチンを記述 すべきだ、というものがあるわね。移植性なんて考えない、いま動けばそれで良し。包括的なテスト ケースなんて必要なし。男らしいわね。 でも、このやり方では高い品質と生産性は望めないわね。仕様は必ず変わるし、プログラムは必ず 修正されるんだから、モジュールが増えてゆくにしたがってとれにくいバグに汚染されてゆくでしょう。 アタシも若い頃はよくやったわ。 もちろろんみなさんもご存じのとおり、現実には上のふたつの中間をとることになるわね。 どっちよりの中間をとるかは、その時々で判断することだから、ここでは論じないわ。 でも、記述したサブルーチンが、どっちよりの中間をとったかは、記録しておかなくちゃいけないと 思うの。そうしないと、本来ならしなくて良いチェックを呼び出し側でしちゃったり(この場合は単に実行時間の ロスが発生するわね)、本来ならしなくてはならないチェックを呼び出し側でしなかったり(この場合は クラッシュするかもしれないわ)、ということが発生するからよ。 そして、その責任範囲の記録方法としては、assertは優れた方法だと思うわけ。根拠は113-114に書いたとおりよ。
135 :
お局 :2001/03/12(月) 11:08
続いてるのよ。 2次方程式サブルーチンでは、最初に提示された解はa=0に対応していなかったわ。そして状況から判断して a=0の場合にも正しい答えを返す必要はないと思ったの。だから、このサブルーチンはa=0に対応していない ということを明示するためのassertを追加するのが、この場合は適切な対応だと思って提案したのよ。 ご理解いただけたかしら? ただ、2次方程式の解を求めるくらいなら、122さんなどが示して下さったように、全ての(正確にはほとんどの) 係数の組み合わせで適切に動作するコードを書くのは難しくないかもしれないわ(ほとんどというのは、 たとえばaが非常に0に近く、b,cが非常に大きな数の場合はオーバーフローを起こすかもしれないわよね)。 だからウダウダ言わずに、122さんのようなコードを書くのも良いと思うわ。
136 :
お局 :2001/03/12(月) 11:10
ついでに偉そうにみなさんの意見への所感を書かせていただくわ。
>>124 =126
ご賛同いただいてありがとう。
おっしゃるように、2次方程式では122さんのようなコードを書いちゃって良いと思うの。
エラーでるのはわかってるけど、対応するのはものすごくたいへん、かつ、いまは必要ないときにはassertする
のがいいんじゃないかしら、というのがアタシの意見よ。いかが?
>>125 ずいぶんと自信がおありね。うらやましいわ。
アタシが実務で触れてきたライブラリには、デバッグモードで、つまりassertを含めてコンパイルした開発時に
使うライブラリコードと、リリースモードで、つまりassertを含めずコンパイルしたライブラリコードがついてきた
ものだけど、錯覚だったのかしら。分野によっても違うのかしらね。
アタシのまわりとは大きく異なる常識をご丁寧にご教授下さって、どうもありがとう。
>>128 =90
潔くて好きよ。
>>131 1.そのとおり。問題はその確認をサブルーチンと呼び出し側のどちらでやるかでしょ?
assertを入れるのはそれを明示するひとつの方法だと思うって話なのよ。
2.ポインタの非NULL確認はやってもいいと思うわ。
3.例外を出すというのは、つまりa=0の場合に対応するのは呼び出し側の責任にしよう、ということね?
それなら、呼び出し側がサブルーチンコールの前にa=0のチェックをして、このルーチンを呼ばないように
するべきじゃないかしら。
4.おっしゃるとおり。その点については114で触れているわよね? 論点がぼやけるので明示しなかったのよ。
5.アタシは教わる側のことを論じた覚えはないので、これはアナタがここで新たに提案なさっていることね?
「それくらい」ってなんのことかよくわからないので、所感は述べられないわ。ごめんあそばせ。
アタシの意見に賛成しないことはわかったけど、麻衣ちゃんの意見に賛成する根拠を教えて下されば幸いですわ。
137 :
お局 :2001/03/12(月) 11:13
長々とごめんなさいね。年寄りは話が長くなるもんだと思って勘弁してやってちょうだい。 はい、次のかたどうぞ。
138 :
麻衣 :2001/03/12(月) 13:11
はっきり言って ウザイ!
どうして要件ではない a=0について書かなかった事がミスなの?
麻衣がごめんってあやまったのはそのことじゃないよ。
>>97 でチャカした書き方した事についてあやまったの!
それは別にして、
麻衣はa=0についてassert入れるようなのは大嫌いなの!
実行結果で例外投げればいいじゃん!
それに、汎用にするならテンプレート使うべぇし!
ベクトルや行列渡せるようにね
139 :
デフォルトの名無しさん :2001/03/12(月) 13:14
お局さん、ごめん長すぎて読む気になれない.
140 :
>麻衣 :2001/03/12(月) 13:25
判ってると思うけど、 テンプレート使う場合は解の公式は使わないで ニュートン法とか直接数値解法使うようにね〜 まあsqrtを定義してもいいけどさ
141 :
お局 :2001/03/12(月) 16:12
あらあらまぁまぁ、この程度でウザイだなんて、近頃の若い子は忍耐力が足りないわね。 カルシウムが足りないのかしら。小魚や牛乳をちゃんと採ってちょうだいね。 >どうして要件ではない a=0について書かなかった事がミスなの? アタシは、そのことについて糾弾する気はもう無いわ。アタシが不適切だと思った97の 書き込みについては謝っても頂いているので、解決ずみよ。他のみなさんはどうか知らないけど。 みなさんがassertがキライかどうかはどうでもいいわ。お好きになさい。例外投げたければ、 それもいいんじゃないかしら。なんども言うように宿題レベルではどっちでもいいと思うしね。 assertはアタシのスタイルを述べたまでよ。 それから「お局」ってハンドルからわかるように、若いオンナに見られる「ちゃん付けでわざと 自らを半人前扱いさせる」っている態度が鼻につくの。だから半分は難癖つけただけよ。 簡単にいえばイビリね。 アタシはオンナノコが大嫌いなオカマなの。ちなみにオトコノコは好き、オトコとオンナはふつうよ。 クソオカマの嫌みったらしい書き方も、細かいことにこだわってるのも、そういうこと。138で その目的も達したみたいだから、アタシの当初の目的は全て達成されたわ。みなさまご協力 ありがとうございました。 ああ、140にさらに補足させていただくと、ニュートン法なんかを使うときには、解の推定初期値を 与えないとうまく動かないわよ。n次式の解を求めるルーチンを書くのは大仕事。詳しくは 数値計算の専門書をご覧になってね。 アタシだったら、恐くてそんな汎用化は考えられないわ。よっぽど自信がおありになるのね、 麻衣ちゃんは。若いって恐いもの知らずでいいわね。うらやましいわ。 ではみなさんごきげんよう。ババァは引っ込むので、麻衣ちゃんにご用のある次の方、どうぞ。ほほほ。
誰も望んでないのによくもまぁダラダラと… このまま行ってもスレの趣旨とずれるのは目に見えてるし、やりたきゃ別スレ立ててやれば? 「もの知りお局の自己顕示スレッド」 なんてどう? しかし負けず嫌いもそこまで行くと見苦しさを通り越して哀れだね。 下手くそなオカマキャラまで立てて、まったく情けないというかなんというか…
2次式を今度はn次式に仕様拡張してる・・・・
144 :
デフォルトの名無しさん :2001/03/12(月) 16:39
>>673 「こめけえヤツ」ってのも大人気無いよね。
\_ ____________________/
|/
∧_∧
Ψ (∀・ )
□ (∩∩ ) チョットネ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
うざいのは長文だからじゃなくってS/N比が低いから。オカマノイズあっち逝け。
146 :
デフォルトの名無しさん :2001/03/12(月) 17:41
ということで、まったりと始めますか(わら
147 :
デフォルトの名無しさん :2001/03/12(月) 22:11
ちゃんと根拠をあげて主張しているので勉強になる。今後も このスレで突っ込んでほしいのー>お局
>> 147 それは嫌。お局の発言はうざいだけだし。 あの程度の主張・知識はそこらに腐るほどころがっているよ。 そのうえここでまで見たくないって感じ。お腹一杯だって。 現実世界の”粘着いちゃもん・解説男”を見ているようで気分悪いよ。
「嫁VS姑!!」って感じでおもしろい。 麻衣ちゃん萌え〜
150 :
147 :2001/03/13(火) 00:54
>>148 そうかなー。まあ各人の好みだから仕方がないけど、例えば
Kernighan & Pike の「プログラミング作法」を読んで学ぶのも
いいけど、キャラを演じつつ プライドをかけてやりあってるのを
見て、なおかつ勉強になる、ってのも俺は楽しいなー。
スレタイトル見ろよ。 宿題解決スレだろ? 何でそこまで一般化にこだわるかね。
153 :
デフォルトの名無しさん :2001/03/13(火) 01:58
ま、脱線してるのは確かだね〜。 喧嘩しないで、マターリ逝きましょうや。 俺、お局ファンだから、別スレ立てよや。 ねくすと宿題かもん、ということで麻衣がむばれ。
お局だがなにか聞きたいことある?スレか?
なんか典型的オタクの一人しゃべり(悦に入る)みたいでイタイぞ>お局
しかしそのキャラは好きなので時々かき回しに来てほしいぞよ。
157 :
デフォルトの名無しさん :2001/03/15(木) 12:16
>>154 お局の「ちょっとひとこといいかしら?」
ってのはどう?なかなかナイスなキャラだとおもいます。両方がんばって欲しい。
158 :
麻衣 :2001/03/17(土) 23:48
ageちゃうよ♪
159 :
デフォルトの名無しさん :2001/03/17(土) 23:56
regex のユニコードバージョンを自作しろという宿題がでました 麻衣ちゃんどうか作り方を教えてくだちぃ
160 :
>159 :2001/03/18(日) 01:35
charの所を全部wchar_tとかにすればおしまいってわけにはいかんの? んで、モジコード変換部は入り口と出口に書くってカンジで。
161 :
麻衣 :2001/03/18(日) 05:26
>160 宿題でそんなコード提出したら怒られちゃうと思うの。 厨房は向こう行っててね(はぁと
162 :
159 :2001/03/18(日) 06:11
>>160 rxのソース眺めてみたんですが
英語のコメントで理論もよくわからないんです
すみませんがよろしければ理論レベルから教えて下さい (涙)
163 :
麻衣 :2001/03/18(日) 10:50
内部表件にコンパイルするのが条件なのかなぁ?
164 :
160>161 :2001/03/18(日) 14:26
つーかこの方法、よく仕事で使ってますが。 文字列処理でガイジンの作ったライブラリを使う事ってあんまりないけどね。 修正に要する工数や問題は少なかったよ。 まあ、おれはまいちゃんじゃないしね。 他にどんな方法があるっちゅうのよ、いもうとよ・・
165 :
160>162 :2001/03/18(日) 14:40
大学や専門生なら正規表現関係の本、図書館や購買で手に入らん? 日本人が書いたやつも2、3冊あると思うが。 あと、こういったライブラリは、まず使ってみて動作を把握する事からしないと移植なんて無理だよ。
166 :
159=162 :2001/03/19(月) 02:01
>>163 構造が理解できるようなれば良いらしいです
NFAと最適化は組むように言われています
>>165 図書館には使い方の本はあったのですが組み方の本は置いてませんでした
組むには本読まないと組めないでしょうか?(難しいかな)
そしてスレ停止
ごめそ、ちょっとtestね。 < > &lt; &gt;
#if&nbsp;!defined(_SAMPLE_STREAM_) #define&nbsp;_SAMPLE_STREAM_ #if&nbsp;_MSC_VER&nbsp;&gt;&nbsp;1000 #pragma&nbsp;once #endif&nbsp;//&nbsp;_MSC_VER&nbsp;&gt;&nbsp;1000 #include&nbsp;&lt;Sstream&gt; #include&nbsp;&lt;windows.h&gt; class&nbsp;sample_buf&nbsp;:&nbsp;public&nbsp;std::basic_stringbuf&lt;char&gt; { public: &nbsp;&nbsp;&nbsp;&nbsp;sample_buf()&nbsp;:&nbsp;std::basic_stringbuf&lt;char&gt;(std::ios_base::out) &nbsp;&nbsp;&nbsp;&nbsp;{} &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;virtual&nbsp;~sample_buf()&nbsp;{} protected: &nbsp;&nbsp;&nbsp;&nbsp;virtual&nbsp;int&nbsp;sync() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;表示動作 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp; }; class&nbsp;sample_stream&nbsp;:&nbsp;public&nbsp;std::basic_ostream&lt;char&gt; { public: &nbsp;&nbsp;&nbsp;&nbsp;sample_stream()&nbsp;:&nbsp;std::basic_ostream&lt;char&gt;&nbsp;(&amp;_db)&nbsp;{} &nbsp;&nbsp;&nbsp;&nbsp;virtual&nbsp;~sample_stream()&nbsp;{} &nbsp;&nbsp;&nbsp;&nbsp; protected: &nbsp;&nbsp;&nbsp;&nbsp;sample_buf&nbsp;_db; }; #endif というコードを書いたんですけど、VCで { &nbsp;&nbsp;sample_stream smp; &nbsp;&nbsp;smp << "test" << endl; } でsample_buffer::sync()を通過するのに、何故か友人のBCBだと通過しないそうです。 家にBCBが無いので、なんで通過しないのかわかりません。 どうか教えてください。
170 :
169 :2001/03/22(木) 23:02
おもわずsageちゃったので、age!!
171 :
デフォルトの名無しさん :2001/03/23(金) 14:52
麻衣ちゃんage
172 :
麻衣 :2001/03/23(金) 17:49
やってみたよ。 単に、endlが定義されてないってでたよ
あ、endlはstd名前空間で宣言されてますんで、 使う前に、 using namespace std; していただけるか、もしくは、endlに名前空間決定子(だっけ?)を付けて、 smp << "test" << std::endl; としてください。
あげ〜♪
175 :
169 :2001/03/25(日) 00:47
失敗失敗(^^;
176 :
麻衣 :2001/03/25(日) 10:40
呼ばれるのは OStream 内の basic_ostream からだけど VC++は flush() で pubsync()が呼ばれる BCBでは ちょっと複雑で追いかけるのはメンドクサイ フリーのBCB55落として自分でおいかけてよね
あ、説明不足でした。 一応追ってみることはってみたんです。(人に聞く前に試してみないと某水野になっちゃう(藁)) でも私にはVCのHP版とBCBのRougeWave版の、動作の相違点を見つけられなかったんです。 とりあえず、stringstreamではオブジェクトを作ったときに、stringstream用のstreambuffer、basic_stringbufferを自分に登録します。 この状態でstringstream >> std::endlを実行すると、 stringstream.flush() が実行されて、最終的にbasic_stringbuffer.syncが実行されるみたい。 というわけでsample_streamもこの方式に従って作ったんですけど、残念ながらBCBでは sample_stream >> std::endlをしても sample_buffer.sync()をカスリもしなかったんです。 自宅にBCBは持っていませんし、まさか人のBCB環境に「これテストしてくれる〜?」って改造したSTLを渡すわけにも逝かないので、麻衣ちゃんに聞いてみようかな?と思った次第です。
178 :
デフォルトの名無しさん :2001/03/25(日) 19:04
ハノイの塔を再帰処理で作るには作ったのですが なんでこれでハノイの塔ができるのか理解できません そもそもどのような処理を行っているんでしょうか? 厨房な質問で申し訳ありませんが宜しくお願いします
179 :
埋 :2001/03/25(日) 19:55
>>178 なんで自分で理解できてないプログラムを組めるのだ〜?ま、いっか。
n枚のハノイの塔だったら、やってる処理はこれだけ。
・小さい n-1 枚を別の棒に移す <-- ☆
・一番下のデカいヤツを空いてる棒に移す
・さっき動かした n-1 枚をデカいのの上に全部移す <-- ☆
☆印の部分は今度は n-1枚のハノイの塔問題なので、再帰で行けるのサ。
180 :
デフォルトの名無しさん :2001/03/25(日) 20:46
181 :
デフォルトの名無しさん :2001/03/25(日) 21:26
でも、テンプレートの中までトレース出来ないでしょ テンプレートを展開してくれるツールでもないと、デバッカ使えないんじゃないの?
なんとか出来ましたー。
183 :
デフォルトの名無しさん :2001/03/27(火) 00:19
(1)「氏名をローマ字で入力し、アルファベット順に出力する。 なお、氏名は14文字以内、忍従は50人以内とする」 (2)この名簿の作成をリスト構造を用いた処理に変更せよ っと言う問題が解けません・・・・ 言語はCです 分かる方本当に答え教えて下さい お願いします
にんじゅう・・・
>>183 どこがわからないんだ?
うっ、こう書くと煽りだな(^^;;;
つまりー、わからない理由は何よ?
「リスト構造がわからない」とか「入力作業がわからない」とかあるだろ?
そこら辺をきちんと整理しないで言われると凄く答える気をなくすんだよ。
186 :
麻衣 :2001/03/27(火) 03:17
1番は配列を使えって事だよね? 1番は大丈夫だよね? 2番だけなら struct nameList:; struct nameList { nameList *next; char name[15];} * Top=NULL; void Input(char *name) [ struct nameList *q=NULL; struct nameList *p=Top; struct nameList *new=malloc(sizeof *p); while(p!=NULL){ if( comp(p->name,name) ) brealk; q=p; p=p->next; } new->next=p; if(p==NULL)p=Top; else p->next=new; } ちょっとネムイ テストしてない ごめん おやすみ
C++になれてると「newは演算子では?」と思っちゃうな(^^; おいらもねよう・・・。
188 :
183 :2001/03/27(火) 03:34
1番も分かりません・・・・
ライブラリ関数でやるのかなぁって思ってたんですが・・・・
リスト構造使う前の一番から分からなくて・・・・
初心者何で・・・
入力作業は、gets関数で一行全部を出すようにすればいいのかなぁって
思ってたんですよ 参考書にライブラリ関数でs1とs2のような二文字の
入れ替えのがあったんでそれも使うのかなぁって思って・・・・
>>186 これってC言語ですか?
僕じゃ読む事出来ないです・・・・
全部答えちゃうとアレだから、方針だけ。 最初に名前の配列と、名前へのポインタの配列を作るんだよ。 とりあえず、人数が50人以内ってあるから、要素数は50で良いだろ。 最初にすることは名前の読み込み。 これは50回、getsを繰り返せばオッケー。 入力が""だったらその時点で名前の読み込みを終える。 でもって、名前のポインタの配列を初期化。 ポインタの配列の1番目のポインタは、名前の配列の1番をさして、 ポインタの配列の2番目のポインタは、名前の配列の2番をさして、 ・・・っていう風にしてやる。 つぎに、ポインタの指し示している名前を比較するようにしてクイックソート。 クイックソートは省略。 最後にポインタの配列を1番から終わりまで表示して終わり。
190 :
183 :2001/03/27(火) 04:07
ありがとうです 今日結構考えたんですけど、どうも思い描けなくて 明日起きたらもう一回考えてみます 分からなかったらまた来ます・・・・・
191 :
模範解答(藁 :2001/03/27(火) 07:50
>>183 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct member_tag{struct member_tag *next;char name[15];} member;
int main(void){member m[50],*top=0;char buf[256];{int i;for(i=0;(i<50)&&
gets(buf);++i){member *p=top,*q=&m[i],**r=&top;q->next=0;sscanf(buf,"%14s",
q->name);while(p&&(strcmp(p->name,q->name)<=0?1:(q->next=p,0)))p=*(r=&(p->next));*r=q;}}
{member *p=top;while(p){printf("%s\n",p->name);p=p->next;}}return EXIT_SUCCESS;}
192 :
191 :2001/03/27(火) 07:58
MacOS X のソースコードを読んでみたいです。 ダウンロードできる所教えて下さい。
193 :
麻衣 :2001/03/27(火) 09:46
いや〜ぁ〜ぁ 186 は無かった事にして! 恥ちぃ
194 :
188 :2001/03/27(火) 23:55
違うスレでも書いたのですが・・・・・ データの入れ替えの仕方がやっぱり分かりません・・・・ 僕の書いたプログラムを一度見て下さい 見難いかも知れませんがお許しを #include <stdio.h> #include <string.h> main() { char name[50]; int i=0,s,n=0; do{ printf("氏名を入力して下さい\n"); gets(name); s=strlen(name); if(s>14) printf("14字以内の名前を入力して下さい\n"); i++; }while(i<50&&*name!='0' ); return(0); }
195 :
埋 :2001/03/28(水) 00:14
>>194 まだ全然入れ替え云々まで達してないよぉ…
キミの書いたソースの変数 name は何を表す変数のつもり?
name[0] が一個目の名前、name[1] は二個目…ってする予定なんだろうけど、
それなら char name[50][15]; だね。
で、gets するたびに違う場所に名前を保存しなきゃいけないわけだから、
gets( name[i] );
ってやる。(…てゆーかこのままじゃ、15文字以上入れられたらバッファオーバーフローするなぁ(汗。ま、いいか。 )
なるほど・・・・難しいです・・・・
明日までにか完成したい・・・
>>195 さんありがとうございます
交換法か・・・・
197 :
194 :2001/03/28(水) 00:32
>>195 さんが言ってたように直したのですが
while文の終了条件の「0」を実行中に入れても
終わりません・・・・何が間違っているのか教えて下さい お願いします
198 :
埋 :2001/03/28(水) 00:55
>>197 終了条件って *name!='0' ←コレ?
とーぜんこのままじゃダメだからね。
ようするにやりたいのは、「直前に入れた名前が 0 だったら終了」でしょ。
そうなる用に考えてみ?
# あと、この流れのままだと14文字より長いの入力されたときの対処が面倒そうだから、
# とりあえず完成するまではそーゆー事態は気にしないことにしちゃえば?ダメ?(^^;
199 :
197 :2001/03/28(水) 01:01
はい 今考えていたのですが、上手くいかなかったので それを気にしない事にしようかと・・・・(^^; 後、終了条件「−1」をすればいいんですよね??? そうしたら終了する事出来ました 何か嬉しかったです 感謝です やっとここまでこれた・・・後は最難関の交換・・・・
俺のプログラムは最悪だが(w、動くぞ。ためしてみ。 何かアルゴリズムの本持ってるかな。なれないうちは 図を丁寧に書いて(できればメモリ図まで書く)理解したほうがいいよ。 ソートは標準関数を使うほうが一番楽だけど バブル、インサート、シェル、クイックいろいろあるから そこから頭に入れよう。
201 :
埋 :2001/03/28(水) 01:14
>>191 どーせなら7行に納めろや(w
…ナンチテ
202 :
199 :2001/03/28(水) 01:23
>>200 はい ありがとうございます これはリスト構造使ってますよね?
僕その前でつまずいていまして・・・・ 今軽く動いたのでミスチェックお願いします
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main()
{
char name[50][15];
int i=0,j,s,n=0;
printf("氏名を入力して下さい\n");
do{
gets(name[i]);
s=strlen(name[i]);
if(s>14)
printf("14字以内の名前を入力して下さい\n");
qsort( name, n, 15, strcmp );
i++;n++;
}while(*name[i-1]!='0');
for( j=0; j<n; j++ )
printf( "%d %s\n", j+1, name[j] );
return(0);
}
実行すると、左側の数字で「0」と後、四人の名前を入力すると次の番号の「5」
ってのが現れてしまいます。 後一つ、終了条件でリターンキーで終了にしたい
場合はどうすればいいんでしょうか?
>>201 #includeきつい(w
達人ならqsort自前で7行いけるかも
>>202 5がでるのは正しくない入力(0)のときもnが加算されてるから
じゃないでしょうか。リターンキーで終了するなら s == 0 で
だめかなぁ・・(たぶん)
#ちなみにソートするなら最後にかけたほうがいいですね
>>204 s==0で駄目でした・・・・
一つ入力してリターン押すだけで終了してしまいます・・・・
あっ s!=0で出来ました
今度は例えば5人入力したら、プラス二人分の数字が出てしまう・・・
208 :
埋 :2001/03/28(水) 10:41
209 :
207 :2001/03/28(水) 14:09
>>208 指摘された部分を直して、一応は完成する事が出来ました
ありがとうございます
次はこれをリスト構造を使って書き直さないと・・・・
うぅ・・・・・
210 :
202 :2001/03/28(水) 18:09
>>191 さんのプログラム何ですが、僕には少し難しいんですね
q->next=0;sscanf(buf,"%14s",q->name);
{member *p=top,*q=&m[i],**r=&top;q->next=0;sscanf(buf,"%14s",
q->name);while(p&&(strcmp(p->name,q->name)<=0?1:(q->next=p,0)))p=*(r=&(p->next));*r=q;}}
{member *p=top;while(p){printf("%s\n",p->name);p=p->next;}}return EXIT_SUCCESS;}
この辺りなんですが、ほとんど理解出来ません
リスト構造と言うのを理解していないんですが・・・・
大変申し訳ないのですが、もう少し僕のプログラムに沿って簡単になりませんか・・・
ホント厚かましいですね・・・・
211 :
191 :2001/03/28(水) 22:18
>>210 説明だけね. (qsortでリストっていうのはなんだか違うような気が少しするので)
麻衣ちゃんすれなので.
多分、読むの嫌になると思うので麻衣が少しゆっくり解説するね.
大枠は、データ入力しながら昇順のリストをつくって、リスト順に出力してます.
構造体 member_tag (typedef as member) はリストとなるポインタと名前をいれる
器です. ポインタ next は、次の名前を入れた member_tag を指します.
そして先頭を指すために top があります.
top->[nextが次を指す,name]->[nextが次を指す,name]->...
終端の next は null です. リストが空のときは top が null . (初期状態)
次はコード.
while((n<50)&&gets(buf)) { ... }
↑n が今取り込む行の番号を指していて, 入力は行単位で 0 .. 49 行まで(n<50).
50 行以上になればループを終了. 一行に何文字入力されるかわからないけど
とりあえず 256 文字までとして、行バッファ buf(行データ入れる場所)に
いれます. もし処理する行がないなら gets(buf) は null になりループ抜けます.
p=top;q=&m[n];r=&top;
↑p はリストの先頭を指します. null なら空ですね. q は今入れる行番号 n に
対応する member を指します. r は今指してる q をどこに入れようかっていう
場所.
q->next=0;sscanf(buf,"%14s",q->name);
↑q の next を null にして(これが終端になるかもしれないから) q の name に
buf から 14 文字分まで取り込んで入れます. これで一行が 14 文字より多くても
大丈夫です.
212 :
191麻衣 :2001/03/28(水) 22:19
while(p&&(strcmp(p->name,q->name)<=0?1:(q->next=p,0))) p=*(r=&(p->next)); *r=q; ↑まず p を見ます. これは今注目してるリスト上での行になります. (先頭から 辿っています) もし、今見てるところが無いなら p は null なのでループを抜けます. 最初はリストができていないので null です, そのまま抜けますが, r は top を指しているのでここに q が書き込まれて top の内容は q を指すように なります. q の next は 0 なのでリストができています. p が null じゃないなら, 次に p の名前と q の名前を比べます. これは, q の入る場所を探しているんです. もし p のほうがアルファベット順に 小さいか、等しいなら 0 以下の値になるので, p にリストの次を指してもらって リストの最後になるまで ( p = p->next が 0 ) 繰り返します. ここで, 繰り返すときに r が p->next を指すように変更してるところに注目して 下さい. ループを抜けたとき, r は最後に見た p の next に変更されているので *r = q; で p の next が q を指すようになるんです. ↓これは q よりアルファベット順で大きい(strcmp>0) [next,name]--&gt;[next,name]--&gt;[next,name]--&gt; ... ↑ r は前に見た member, ここの next を指す ↑ q をここに入れるときは *r = q になればいい. strcmp>0 のときにすることがあとひとつ残っています. q の next が次の member を指すようにすること. すでに p は q より大きいので これは q->next=p したら良いです. あとは続ける必要ないのでループを抜けます. (strcmp(p->name,q->name)<=0?1:(q->next=p,0)) この繰り返しでリストが出来ていきます.
213 :
191麻衣 :2001/03/28(水) 22:21
p=top;while(p){printf("%s\n",p->name);p=p->next; あとは, top が先頭の member を指し、その next が順に次を指していく (next が null になったら終わり)リストができているので, p に先頭を指すようにして(p=top) p が null でない間、名前の表示し (printf("%s\n",p->name);)、次を見る(p=p->next;)を繰り返して 終わりです. ごちゃごちゃしてますが、リスト構造の基本はつなげていくことです. a --&gt; b --&gt; c --&gt; ... こんな感じに. あとはあなたの学習に期待します.
うざくてスマ>all
215 :
デフォルトの名無しさん :2001/03/28(水) 23:14
,一-、 / ̄ l | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ■■-っ < んなーこたーない ´∀`/ \__________ __/|Y/\. Ё|__ | / | | У.. |
216 :
210 :2001/03/28(水) 23:34
ありがとうございます 今一度読んだのですが、何度も読まないと僕の頭では 理解できないみたいなので、何度も読んで理解してみます。 残り三日でどこまでやれるか分からないのですが とりあえず、出来る所までやって会社に提出しようと思ってます 全部で10問あるのですが、上のは9番で、それまでの奴の フローチャートもこれから書かないといけないので出来るかどうかは 僕の努力次第って事ですね。
217 :
埋 :2001/03/28(水) 23:55
>>216 フローチャート書く方を先にやっとくべきなんじゃないかなぁ、と、ふと思ってみたり。
ま、頑張ってね☆
218 :
210 :2001/03/29(木) 00:00
あっそうですかね・・・・ とりあえず、出来るだけ頑張ってみます・・・・ 学生生活最後と言うか、社会人前の残りの時間に 遊べないのは少し憂鬱ですが、今までやってなかった自分が 悪いからしょうがないや・・・・
210はそもそもポインタが判っていないに一票
ポインタですか・・・・ 言っている意味は分かっているつもりなんですが・・・・ どうなんでしょうかね・・・・
221 :
デフォルトの名無しさん :2001/03/30(金) 09:55
年度終了上げ
麻衣たん‥‥ハァハァ
ウハウハ
仮想メソッドのオーバーライドをしている関数を「多態」の概念を使わずに説明する方法を教えてください。 30分以上悩んでるけど、うまい説明が思いつかない。
225 :
デフォルトの名無しさん :2001/04/09(月) 02:38
>>224 「ここは処理をカスタマイズしているんだよ」とでもいえば?
あとは自分で考えよう。
っていうか多態抜きでそんなこと説明して意味あるの?
バイトの仕様書でねー・・・。 難しい言葉使うなゴルァ!!とか言われたんだよ・・・。鬱。
じゃあ、噛み砕いてあげればいいんじゃないの? 「言葉」と「概念」はレベルが違う
>>224 ではないけれど。
そのかみ砕きかた、私も知りたいなぁ♪
行いたい動作を指定すると、いくつかある処理の中から適切なものが自動的に 選ばれて実行されます。 以前の手法では、どの処理が適切な処理なのか、プログラマがひとつひとつ 確認して指定する必要がありました。その確認処理が自動化されたので、 ミスが減少し、品質の高いプログラムが作成しやすくなりました。 とか
すばらしい!
>>229 でもそれでもまだ「難しい」と言われるかも。
噛み砕き方なんてどうでもいいんよ。
自分が「多態性」を使う時のイメージを使えば。
それにしても、224ってバイト君で、
会社でのチームリーダーかなんかにそういうこと言われたのかな?
だとしたら相当・・・
なんとかだまくらかしてオーケーもらったよ・・・。 さんくすあろっと ふぉー おーる♪
232 :
質問厨房 :2001/04/10(火) 19:40
コードの途中のアドレス知る方法ってあります?VC++で。 関数の先頭アドレスとかは普通に判るんで、そこからnバイト〜とかやっていても、 途中のコード変えたりコンパイルオプション変えたりするとズレますよね。 自己書き換えっつっても、AIとかじゃなくて、プログラムサイズ縮小狙ってます。
よー考えたら、アドレス知りたいとこで関数へのポインタ使えば 解決ですね。厨房カキコすみません。
>>232 せいぜいデバッガで追うくらいしかないんでは?
最適化かけたら元のソースと一対一対応なんてつかないし。
麻衣ちゃん元気?