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
ね。あとはこの繰り返し。
がんばってね、おにいちゃん♥
#ネカマってよくこれを持続できるなぁ・・・。
てか、このルールって衝突起こしてない? ・・・ちぇっきんぐ $ 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という数字は何を表すのかな? そもそもリダイレクトってな~に?♥
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 = ② ; m1 = ③ ; } tndays = 365*y1 + y1/4 - y1 / 400 + 306 * (m1 + 1) / 10 + d1 - 428; if(m2 = 2){ y2 = ④ ; m2 = ⑤ ; } ndays = 365*y2 + y2/4 - y2 / 400 + 306 * (m2 + 1) / 10 + d2 - 428; return (⑥); }
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ね。 < > < >
#if !defined(_SAMPLE_STREAM_) #define _SAMPLE_STREAM_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include <Sstream> #include <windows.h> class sample_buf : public std::basic_stringbuf<char> { public: sample_buf() : std::basic_stringbuf<char>(std::ios_base::out) {} virtual ~sample_buf() {} protected: virtual int sync() { // 表示動作 return 0; } }; class sample_stream : public std::basic_ostream<char> { public: sample_stream() : std::basic_ostream<char> (&_db) {} virtual ~sample_stream() {} protected: sample_buf _db; }; #endif というコードを書いたんですけど、VCで { sample_stream smp; 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=⊤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=⊤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=⊤
↑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]-->[next,name]-->[next,name]--> ... ↑ 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 --> b --> c --> ... こんな感じに. あとはあなたの学習に期待します.
うざくてスマ>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 せいぜいデバッガで追うくらいしかないんでは?
最適化かけたら元のソースと一対一対応なんてつかないし。
麻衣ちゃん元気?
236 :
デフォルトの名無しさん :2001/05/07(月) 01:31
460・・・
237 :
麻衣 :2001/05/07(月) 06:37
>235 新学期がはじまってから、麻衣はクラブ活動が忙しくて。
238 :
デフォルトの名無しさん :2001/05/08(火) 04:08
NP-completeな問題がO(N^6)で解けるっていうウワサ、ほんと?
239 :
デフォルトの名無しさん :2001/05/08(火) 09:33
>>227 1行目はともかく2行目には激しく同位体。
そんなに「概念」が嫌いならプログラマ/ソフトハウスなんざ
たたんじまえって感じ。小難しいもん(大難しくはないが(笑))を
避けて通れる畑じゃないっしょ。
わけのか分からんすれが上がってる 負けるな麻衣ちゃんage
麻衣ちゃんにはお世話になったのでage
242 :
デフォルトの名無しさん :2001/05/10(木) 16:26
さがってるのでage
私の学校で出ている課題について教えてください。できれば、コード記述でお願いします。 課題 文字列操作 <処理概要> 入力ファイルに入っているランダムな文字列を読み込んで編集する。 入力ファイル名 \public\C言語応用\課題02\input.txt 入力ファイルの内容 io4@5ovgiq@w340 9tn@q0mikanb924 rwijra;o4 aestrawberryut@90 240strawberry9t animikanrja ddg fvbananaxjfringogqworiadf; amomolkjtcwieroutstrawberry34t7vv dsgfoiuto sdrgovq@4r q0awitflksjd;f laumikanwett errgt thhbcvbasf fitu@qo4rfachocolateaaarffvnxdkjfq23 sdfgi oq34itu aqeurgvksjd q9bananau4 tue ggsjdgoiumomoq349tifvk asrgmomoio uweringoorigporegf asdmomofg sjd;fmikanligurin@qa94it kwjegfr:bananaa ergtqaegr dfgi oeoitgu;fldkgj b9wu44tlgkjjlksvdjgfsmikanadfg oiupqoi34 ta;lkdf j;lakjdfg0987 bjlhbxcvblkj ;lkjchocolateroigeurrgssdmomoffkjahljhringoglar+ j;lkj4rti <詳細仕様> 入力ファイルの内容は、ランダムな小文字のアルファベット文字列からなり、 1行の文字数は揃っていない。これを1行ずつ読み取り、次の編集を加えて 1行を20文字に揃えて標準出力する。加える編集項目は、以下の通り。 1.文字列"ringo"を発見したら、"APPLE"に変換し、発見回数を数える。 2.文字列"mikan"を発見したら、"ORANGE"に変換し、発見回数を数える。 3.文字列"momo"を発見したら、"PEACH"に変換し、発見回数を数える。 4. 文字列"banana"を発見したら、後ろに"cake"を付ける。 5. 文字列"strawberry"を発見したら、後ろに"cake"を付ける。 6. 文字列"chocolate"を発見したら、後ろに"cake"を付ける。 7. 1~6以外の文字列の場合は、"."(ピリオド)を出力する。 例えば、入力ファイルの1行目にq0mikanb924という文字列があるが、 この"mikan"の部分が"ORANGE"に変わる。他の文字はピリオドになる。 【結果の表示例】 ・・・・・・・・・・・・・APPLE・・ ・・・・・ORANGE・・・・・・・PE ACH・・・・・・bananacake・ ・・・・・ ringoの出現回数は、1回 mikanの出現回数は、1回 momoの出現回数は、 1回 bananaの出現回数は、1回 以上が課題の内容です。ご託宣お願い致します。 いろんなスレに顔出してすみません。ただ、非常に切羽詰まってます。
245 :
ぐひひ :2001/06/04(月) 23:36
>>243 小一時間もあればできそうだな・・・
エコアイスのエッチな絵を30枚持ってきたら
作ってあげますよ。
>>245 そんな、微妙にマイナーなキャラクタの絵を要求するなよ……。
248 :
名無しさん@おなかいっぱい :2001/06/04(月) 23:58
>>243 c++でstringが使えるなら即できそうだね。
249 :
ぐひひ :2001/06/05(火) 00:13
>>246 すまないね。
メジャーどころで、ななかのエッチな絵なら20枚で作ってあげよう
文字列操作よりも文字列比較だな。
対象の文字列を編集するのでなく、次々とコピーしていくような
構成にするのがよかろう。
250 :
ぐひひ :2001/06/05(火) 00:24
ジョジョのえっちな絵でもいいぞ! 参照元をさすポインタを char *p; 出力先を指すポインタを char *q; とすると、 strcmp( 比較文字列 ,*p) == 0 なら strcpy( q, 入れ替え文字列 ); q=q+strlen(入れ替え文字列); そうでなければ *q++=*p++; これを繰り返す感じだな。
251 :
ぐひひ :2001/06/05(火) 00:34
とっととエッチなのモッテコイヨ! 超メジャーなところで、
ラブひな のならいくらでもあるだろ?それ30枚でいいよ。
>>250 で少し間違えてたな。
>そうでなければ *q++=*p++;
設問ではここは *q++='.'; にすべきだったね。
で、ここまでで十分作れると思うんだけど、
なんか質問ある?1質問につきエロ絵5枚要求するが。
252 :
デフォルトの名無しさん :2001/06/05(火) 00:41
>これを1行ずつ読み取り、次の編集を加えて 一行ずつでないと駄目なの? 全部読み込んで、改行を削除した方が簡単になるけど。
253 :
ぐひひ :2001/06/05(火) 00:47
>>252 それが課題の必須条件ならしょうがないな。
>>243 よ、先生に聞いたほうがいいぞ。
女教師ならその写真はここに掲載しろ。
もっとも、一行づつ読んでもまとめて読んでも手間は
そんなに変わらないけどな。めんどくさくなるけど
>>250 strcmp() だと、比較する文字数を指定できないのでダメだと思うが……ネタ?
でさ
>>243 はエコアイス、ななか(って誰?)、ラブひな、ジョジョか、どれで
も良いけど絵は用意できたのかい? 俺の手元には、動くコード用意できて
るけど。
一部分抜粋
struct trans_table {
const char *t_src;
const char *t_dst;
int t_srclen;
int t_count;
} table[] = {
{ "ringo", "APPLE", 0, 0 },
{ "mikan", "ORANGE", 0, 0 },
{ "momo", "PEACH", 0, 0 },
{ "banana", "bananacake", 0, 0 },
{ "strawberry", "strawberrycake", 0, 0 },
{ "chocolate", "chocolatecake", 0, 0 },
{ NULL, NULL, 0, 0 }
}, *transp;
char buf[BUFSIZ];
for (transp = &table[0]; transp->t_src != NULL; ++transp)
transp->t_srclen = strlen(transp->t_src);
/* ここは秘密 */
for (transp = &table[0]; transp->t_src != NULL; ++transp)
printf("%sの出現回数は%d回\n", transp->t_src, transp->t_count);
>>245 -253
ヴァカ学生相手には sage で頼む。
>>256 このスレッドについての話じゃなくて、コロコロが「賢い勉強法は?」
スレッドで
>>244 に対してコメントつけてることを指摘してると思われ
>>254 さん 大変ありがたいのですが、私のレベルを超えたプログラム
で、説明できず、パクリだと思われてしまいます。
私は、低レベルなのでそれに即したプログラムでお教え願えないでしょうか。
また、fgetsなんかを使うのでしょうか?
いい加減にしとけよ>258
この程度の問題も出来ないのなら、才能無いから学校なんかやめた方がいいぞ。
261 :
デフォルトの名無しさん :2001/06/05(火) 23:24
>258 この問題は、 ・文字列とポインタ ・ファイル入出力 の2つをマスターしてないと解けないし、解法を説明されても理解できない。 自分が低レベルなら基礎から勉強し直せ。
262 :
デフォルトの名無しさん :2001/06/05(火) 23:28
>>243 プリンターに出力して、手動で置き換えた後、
カンピューターに入力する。
コロコロ君。ハンドルはタコなのかい(w サッカーばかり見てないで勉強しろよっ!
>>258 おい! エッチな絵はまだか?!
ファイルの読み込みと、文字列の変換とは別に考えろよ
それをそのまま出したら誉めてやるけどな
誉めてくれるってよ! やったじゃん。
>>268 Σ(゚д゚lll) ショック !
そんな電波ページみせるなよ・・・
汎用性が全くなく、変数名も適当ですが、サルでも、 分かるように書いたので、足りない所は自分で作って下さい。 尚、このようなマルチポストは、二度としないように。 #include <stdio.h> #include <string.h> char *mygets ( FILE *fp ) { static char buf[260] ; size_t n ; memset ( buf , '\0' , sizeof(buf) ) ; if ( fgets ( buf , sizeof(buf) , fp ) ) { n = strlen ( buf ) ; if ( n && buf[n-1] == '\n' ) { buf[n-1] = '\0' ; } if ( n && buf[n-1] == '\r' ) { buf[n-1] = '\0' ; } return ( buf ) ; } return ( NULL ) ; } size_t myputs ( char *p , size_t n , size_t m ) { while ( n ) { if ( m < 20 ) { printf ( "%c" , *p ) ; p++ ; m++ ; n-- ; } else { printf ( "\n" ) ; m = 0 ; } } return ( m ) ; } int main ( int argc , char *argv[] ) { FILE *fp ; char *p ; size_t n ; size_t m ; size_t l ; int ringo ; ringo = 0 ; n = 0 ; fp = fopen ( "input.txt" , "r" ) ; while ( p = mygets ( fp ) ) { m = 0 ; l = strlen ( p ) ; while ( m < l ) { if ( !memcmp ( p+m , "ringo" , 5 ) ) { n = myputs ( "APPLE" , 5 , n ) ; m += 5 ; ringo++ ; } else if ( !memcmp ( p+m , "banana" , 6 ) ) { n = myputs ( "bananacake" , 10 , n ) ; m += 6 ; } else { n = myputs ( "." , 1 , n ) ; m++ ; } } } fclose ( fp ) ; printf ( "\n\n--------------------\n" ) ; printf ( "ringoの出現数は%d\n" , ringo ) ; }
>>270 いや、それは・・・ハッ!
コロコロのレベルに合わせたってことか! 納得の出来栄えだぜ!
訂正。 char *mygets ( FILE *fp ) { static char buf[260] ; size_t n ; memset ( buf , '\0' , sizeof(buf) ) ; if ( fgets ( buf , sizeof(buf) , fp ) ) { n = strlen ( buf ) ; if ( n && buf[n-1] == '\n' ) { buf[n-1] = '\0' ; n-- ; } if ( n && buf[n-1] == '\r' ) { buf[n-1] = '\0' ; } return ( buf ) ; } return ( NULL ) ; } ちなみに、この関数の最初の名前はsarugetsだったりする。(謎)
>>258 ほら、残りな。これが理解できないようだと話にならんので、気合入れて理解するか、
首を吊るか好きな方を選択してくれ。
それと
>>254 で指定した絵は、ちゃんと見つけて URL 報告するよう。
#include <stdio.h>
#include <string.h>
#define NELEM(x) (sizeof(x) / sizeof(x[0]))
void
translate(FILE *fp)
{
struct trans_table {
const char *t_src;
const char *t_dst;
int t_srclen;
int t_count;
} table[] = {
{ "ringo", "APPLE", 0, 0 },
{ "mikan", "ORANGE", 0, 0 },
{ "momo", "PEACH", 0, 0 },
{ "banana", "bananacake", 0, 0 },
{ "strawberry", "strawberrycake", 0, 0 },
{ "chocolate", "chocolatecake", 0, 0 },
{ NULL, NULL, 0, 0 }
}, *transp;
char buf[BUFSIZ];
for (transp = &table[0]; transp->t_src != NULL; ++transp)
transp->t_srclen = strlen(transp->t_src);
while (fgets(buf, NELEM(buf), fp) != NULL) {
const char *p = &buf[0];
while (*p != '\0') {
for (transp = &table[0]; transp->t_src != NULL; ++transp)
if (strncmp(p, transp->t_src, transp->t_srclen) == 0) {
++transp->t_count;
fputs(transp->t_dst, stdout);
p += transp->t_srclen;
goto done;
}
putchar(*p++ == '\n' ? '\n' : '.');
done:
;
}
}
putchar('\n');
for (transp = &table[0]; transp->t_src != NULL; ++transp)
printf("%sの出現回数は%d回\n", transp->t_src, transp->t_count);
}
275 :
デフォルトの名無しさん :2001/06/06(水) 01:55
2行にまたがる単語はありですか? 例えば、下のringoとか。 aljfnri ngoenad
278 :
デフォルトの名無しさん :2001/06/06(水) 04:12
エココって、東北電力だかのマスコットでせう?
280 :
コロコロ :2001/06/07(木) 22:51
>>270さん >>274さん すいません。よく理解できません。1行読み込みをどうすればいいかだけでも 教えてくれないでしょうか。
281 :
く :2001/06/07(木) 23:23
学校の課題です。誰か教えてください。 成田空港の駐車料金は以下のようになっています。最初の一時間は500円、一時間を 越えて6時間までは30分ごとに250円ずつ加算、6時間を越えて72時間までは30分ごと に30円ずつ加算、ただし、6300円が上限、72時間を越えると12時間ごとに900円ずつ 加算されます。たとえば11時間駐車すると500+2500+300円になります。年月日つき の入庫時刻と現在時刻を入力して駐車料金を表示するプログラムを書きなさい。 これって月や年が変わると以上に面倒なんですが、誰か教えてくれませんかね?
282 :
記憶でコピペ :2001/06/07(木) 23:32
分に換算 分 円 ~0060 500 ~0360 (p /30) *250 ~3660 3000 + (( p-360 ) /30) *30 ~4320 6300 ~ 6300 + (( p-4320 ) /720) *900
>>280 ……せめて、聞く前に絵を見つけてくる程度の誠意は見せろよ。
>>280 本気で聞いてるのなら、そこら辺の入門書でも読みなさい。
ネタだったらウザイから、もうやめれ。
287 :
デフォルトの名無しさん :2001/06/08(金) 05:44
289 :
コロコロ :2001/06/08(金) 11:32
>>270 さん
申し訳ないのですが、 mygets関数とmyputs関数がどういった処理をしているか
お教え願えないでしょうか。
>>281 #include <stdio.h>
#include <time.h>
int str2int( char *tmp )
{
char buf[3]={0};
strncpy(buf,tmp,2);
return atoi(buf);
}
int gettime( char *timestr )
{
struct tm tmtime={0};
tmtime.tm_min =str2int(timestr+8);
tmtime.tm_hour=str2int(timestr+6);
tmtime.tm_mday=str2int(timestr+4);
tmtime.tm_mon =str2int(timestr+2)-1;
tmtime.tm_year=str2int(timestr+0)+100;
return mktime( &tmtime );
}
>>281 >>290 つづき
main(int argc, char **argv)
{
int p;
int result = 0;
if( argc<3 ) {
printf("usage: $ park <start> <end>\n YYMMDDHHmm\n");
exit(0);
}
p = (gettime(argv[2])-gettime(argv[1])) /60;
result = (p< 60) ? 500 :
(p< 360) ? (p /30) *250 :
(p<3660) ? 3000 + (( p-360 ) /30) *30 :
(p<4320) ? 6300 :
6300 + (( p-4320 ) /720) *900 ;
printf("result= %d\n",result);
}
>>281 >>291 つづき
使い方
park <駐車開始時間> <駐車終了時間>
時間の表記は 年年月月日日時時分分
2001年6月8日11時45分 は 0106081145
293 :
デフォルトの名無しさん :2001/06/08(金) 11:51
>>281 >>291 つづき
エラーチェックは省いてある。
計算があっている保証も無い。
解説はしない。
理解し修正し自分を磨け。
にせんねんもんだいは?
295 :
デフォルトの名無しさん :2001/06/08(金) 14:07
>>294 んなもん考慮してないよ
てゆーか、2037年だか38年だかで狂う
あるファイルがビットマップかテキストファイルか実行ファイルか を拡張子以外で識別する方法をVC++を使って作れといわれたのですが まったく方法が思い浮かびません。 よろしければ知恵を貸してください。
>>296 先頭にヘッダがあるからそれをみればいいらしい
298 :
まこ :2001/06/08(金) 17:45
すみませんがどなたか教えてください。 oracleのSQL*PlusをCシェルに埋め込むとき、 sqlplus username/password @SQL文の書いてあるファイル ってやりますよね。 このときこのファイルのwhere文とかが変動性があって、 パラメータで渡したいときってどうしたらいいんですか? sqlplus username/password @SQL文の書いてあるファイル 引数 みたいなことして、 その引数をSQLファイルの中でARGVとかで 取り出す方法を探してるんですが。 なかなかマニュアルとかみてもわかんないんです。 新米プログラマのわたしに SEからされたいぢわる宿題・・・(;;)
299 :
デフォルトの名無しさん :2001/06/08(金) 17:50
checktermと(unix上で)入力して実行すると 文字列の中から特定の文字列を検索してヒット数とその文字列を 表示するプログラムが出題されたんですが・・・ 1.checkterm return 2.文字列を入力 例.abacabcada 3.検索する文字列を入力 例.a#a(#はワイルドカードで、任意の文字) 4.出力 3 aba aca ada ↑こんな感じです。文字列の字数に制限はありません。 初心者で恐縮ですが全く手順が思いつかないので どなたか力を貸してください、宜しくお願いします。
300 :
299 :2001/06/08(金) 17:52
↑あ、C言語の課題です、失礼しました。 ご教授お願い致します・・・
>>299 =300
思い付いたのは思い付いたんだけど、めちゃくちゃ
泥臭くてダサイ、というわけではなくて、ほんとに
何も思い付かないの?
302 :
299 :2001/06/08(金) 18:17
>>301 main(int argc, char *argv[])
を用いることは分かるんですが、本当にアルゴリズムが浮かんでこないです。
すいません、ポインタ習ったばかりの厨房です・・・
304 :
まこ :2001/06/08(金) 18:55
298です。 調べたらちょっとわかったんですよね。 &(アンパサンド)で変数扱いできるんですね。 301,303読んでそーだなぁ、他人にお願いする前に 自分のできることしつくせっっっって反省しました。 まだちょっとわかんないとこあるんですが 自前で頑張ってみますぅ。
このスレの存在意義まで否定すんなよ(w
>>305 要は向学心の有無なのよ。
ハナからやる気無くて、それでも単位は欲しくて、「コード書いてください」
なんて言ってる奴は氏ねってこと。
自分で考えて考えて、どうしても引っかかってることがあって助けを求めて
くるなら差し伸べる手は惜しまないよ。
>>304 稀に見る向学心溢れる若人よ。youはきっと伸びる
>>299 ところで仕様の質問なんだけど、検索文字列で
a##a は書式として許される?
a#b は?
a# は?
#a は?
# は?
a は?
309 :
299 :2001/06/08(金) 20:44
>>303 ,
>>306 そうですね、考え抜かずに結論だけ得ようとする姿勢だったかも知れません。
失礼しました。
結構ギリギリまで粘ったつもりでしたが…今夜12時が提出期限なので
それまでもう少し考えてみます。
>>308 はい、全て許されます。順序や字数に制限はありません。
あげちゃった…申し訳ない
perlみたいにメタ文字にするキャラクタを変更出来るようにすればいいかもね。 ('#'自体を含めたい場合とか) 仕様をまず考えないと。 ・#は0個以上の任意の文字 ・連続する# -> 1つの#と等価 と見なすとか。
あと、#が最長一致なのか最短一致なのかもわからんと。 最長一致 検索文字列 "b#d" 被検索文字列 "abcdefabcdef" -> "bcdefabcd" 最短一致 検索文字列 "b#d" 被検索文字列 "abcdefabcdef" -> "bcd" 他には、複数見つかった場合どうするのか、とか。
313 :
ぐひひ :2001/06/08(金) 23:02
>>299 暇つぶしに作ったよ。
"AI止ま" または "ラブひな" のエッチなCGを20枚進呈してくれたら
あげるよ。
レスありがとうございます。
>>311 -312
1つの#に任意の文字1つが入ります。#が連続する場合は連続する任意の文字が入ります。
この場合最短一致で、複数見つかったときは全て出力します。
先週の課題「文字列20文字(入力)の中から5文字の文字列(入力)を
検索し、ヒット数を出力」するプログラム(下記)が理解できていれば
出来るらしいですが、入力文字数無制限をどう表現するか?
ポインタ変数をどのように用いるか?まだ見えてこないです…
main()
{
char moji[20];
char find[5];
int answer=0;
int i,j,k,l=0;
gets(moji);
gets(find);
for(i=0;i<=15;i++){
if(moji[i]=find[0]){
for(j=1,k=i+1;j<=4;j++,k++){
if (moji[k]==find[j])l++;
if(l==4)answer++;
}
l=0;
}
}
printf("%d\n",answer);
}
>>313 ありゃ?作って下さったんですか!
けど当方モーコラ位しか持ってないんですよね…
>>314 なんだ、もうあるじゃん。じゃ、それをベースに話そう。
文字数の制限をとっぱらうか。とりあえずヒントの羅列~
char moji[1000]={0};
char find[1000]={0};
int mojimax,findmax;
入力
mojimax=strlen(moji);
findmax=strlen(find);
for(i=0;i<mojimax-findlen;i++){
こんな感じか。
それと、三次元の絵はだめだぞ。二次元の絵を持ってこなゃ。
317 :
ぐひひ :2001/06/08(金) 23:48
>>315 ところで仕様についてさらに質問なんだけど、
検索結果は、個数を先に表示するの?それとも後で?
それによって面倒くささが違ってくるんだけど。
全角スペースは半角スペース2個に置き換えてくれい main() { char moji[1000]={0}; char find[1000]={0}; char temp[1000]={0}; int answer; int i,j; int mojimax,findmax,tempmax; gets(moji); gets(find); mojimax=strlen(moji); findmax=strlen(find); tempmax=0; answer=0; for(i=0;i<mojimax-findmax+1;i++){ for(j=0;j<findmax;j++){ if(moji[i+j]!=find[j] && find[j]!='#')break; } if(j==findmax){ strncpy(&temp[tempmax],&moji[i],findmax); temp[tempmax+findmax]=' '; tempmax=tempmax+findmax+1; answer++; } } printf("%d %s\n",answer,temp); }
>>318 ごめん。先走った。すまん。
別のスレに書いとくつもりでここに書いちゃった。
kとかlとか変なifとか捨てちゃったから
ばれそうだと思ったら適当に直してくれ。
でも、自分で最後まで考えてね。
あと、リンクありがと!これからじっくり ぐひひ
>>320 どうもありがとうございました。吟味させて頂きます。
講義ではmain(int argc, char *argv[])という引数を用いるらしいので
もしかしたら却下される恐れもありますが、その時は自分で考えます。
>>321 最後まで付き合ってあげよう。
main( int argc, char **argv)
{
char *moji,*find;
moji=argv[1];
find=argv[2];
て感じかな。こっちの方が1000文字超えたらとか考えずに済んで気が楽だ。
あと、temp[]に詰めてるあたりは今回の要求仕様に特化したもので
' 'の代わりに'\0'をつめて、それぞれの先頭アドレスを別のポインタ配列に
入れて他のなんかに使うてのが普通なんでそこんとこもついでに吟味しよう。
>>ALL 板を汚してごめんなさい。 >>コロコロ これで分からなければ、あきらめて下さい。 char *mygets ( FILE *fp ) ; fp = 検索対象のFILE型へのポインタ buf = 検索対象のバッファ(260文字) n = fpから1行読み込んだ文字列の長さ fpから1行読み込んだ結果がNULLでなければ 行末の改行コードを削除しバッファへのポインタbufを返す 1行読み込んだ結果がNULLならばNULLを返す size_t myputs ( char *p , size_t n , size_t m ) ; p = 出力する文字列へのポインタ n = 出力する文字列の数 m = 現在表示している行の位置(出力を20字に成型) ポインタpからn文字を現在表示位置mから表示し終了位置mを返す int main ( int argc , char *argv[] ) ; fp = 検索対象ファイルのFILE型へのポインタ p = 検索対象のバッファへのポインタ n = 現在表示している行の位置 m = 検索対象の位置 l = 検索対象の長さ ringo = ringoの出現回数
麻衣を出せや、(゚д゚)ゴルァ!
呼んだ? 今日から私がお答えするわ♥ でも報酬が用意されてないと答える気にならないかも。 報酬はモチロン! エッチなCGよ♥
327 :
バカプログラマ :2001/06/09(土) 21:04
ツリー表示を自作したいと思っています。 いまどき便利なツールが出てるからそんなの作らなくていいじゃん、 と周りからは言われましたが、 どういうアルゴリズムで作られているのか知ってみたいのです。 ネットで検索したところ、再帰を使うらしいところまではわかったのですが……。 麻衣ちゃん教えて♥ (麻衣ちゃんじゃなくても可)
>>327 まずは報酬を提示してね♥ ぐひひ♥
そもそも、なにをツリー表示させたいの?
環境も書いてね
再帰の他に何か特別なアルゴリズムが必要だとは 思えんが・・・。
ファイルの大きさをツリー上に表示したいのですが なにか参考になるプログラムを作ってもらえませんか
332 :
バカプログラマ :2001/06/09(土) 22:16
@
334 :
デフォルトの名無しさん :2001/06/09(土) 23:46
@@
>>332 ごめん。アプレットはよくわからないから、それ以外で助言ね。
戻り値を適当なスタックか配列につめるようなクラスを作って、
ファイルを開いて一覧をにスタックに積みつつ
ディレクトリがあったら自分自身を呼び出す・・・
再帰ってやつね。 グーグルで調べられるかもね。
あと、これ以上の助言は二次元の絵を持ってきてからね。
三次元の絵はダメ、絶対ダメ。
336 :
muto :2001/06/10(日) 01:57
1行目に1,2行目に1 2,3行目に1 2 3,.....,n行目に1 2 ... nを表示するプロ グラム(下のような感じ)はどうやるんですか?スーパー初心者なもんで…。 1 1 2 1 2 3
337 :
デフォルトの名無しさん :2001/06/10(日) 02:03
宿題デスカ? int i,j; for(i = 0 ; i < 行数; i++){ for(j = 0 ; j<i ; j++){ printf("%d ",j+1); } printf("\n"); }
>>336 main(int argc,char **argv){ int i,j; for(i=0;i<atoi(argv[1]);i++){ for(j=0;j<=i;j++)printf("%d ",j+1); printf("\n");}}
報酬ちゃんと持ってきてよ。
>>337 むう・・・やはり、報酬が手に入るまではバグ入りで公開しといた方が
いいってことなのか・・・今度からそうします。
>>339 というか、あなたウザイです。
教えるなら教える、放置するなら放置するで態度決めてください。
同じネタで長々とスレ使われるとテンポが悪くてかないません。
>>340 態度は決まってるんだけど・・・なんかまずかったか?
>>341 名前がいけないのでしょう。
”由美子”あたりにすれば?
343 :
トルチョック :2001/06/10(日) 03:34
>>337 それだと例えば4行表示させるとすると実行結果は
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
てな具合にならんか?
俺わからんぞこれ…
#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) { int i,j; if(argc != 2){ printf("引数が足りません\n"); exit(1); } for(i = 0;i < atoi(argv[1]);i++){ for(j = 0;j < i+1;j++){ printf("%d",j+1); } printf("\n"); } return 0; }
10 i = 0 20 i = i + 1 30 for j = 1 to i : print j; : print " "; : next j 40 print : ' 改行 50 goto 20
346 :
デフォルトの名無しさん :2001/06/10(日) 05:13
#include <iostream.h> int main(int argc, char* argv[]) { for(int i=1;i<6;i++){ for(int j=0;j<i;j++){ cout<<j+1; } cout<<"\n"; } }
>>340 =337
じゃねぇの?
マジでミスッちゃったのを指摘されてキレたんでしょ
348 :
バカプログラマ :2001/06/10(日) 12:22
麻衣ちゃんありがとう。 残りの報酬はこれでどうですか? 結構癒し系 www.ssi-n.com/~spare/color-index1.html
349 :
わかりません :2001/06/11(月) 04:10
キーボードから順に数を入力し、0が入力されたら、前回の0からそれまでに入力 された数の合計を表示する、というプログラムを書きなさい。例えば 0,1,4,-1,0,3,2,0,5,-5,0という数が入力されたら、表示されるのは 4 5 0 となるように。 最後に表示させるにはどうしたらよいのですか? すんませんこんな簡単な問題で
10 result = 0; 20 input a; 30 if a = 0 then print "result : "; print a : goto 10 40 result = result + a; 50 goto 10
訂正 10 result = 0; 20 input a; 30 if a = 0 then print "result : ";: print a : goto 10 40 result = result + a; 50 goto 20
>>349 先生にこのまま提出したら往復ビンタを5回はされそうだけど・・・
#include <string.h>
main(int argc,char **argv)
{
char *p;
int r,t=0,f=0;
p=strtok(argv[1],",");
while(p){
if(0==(r=atoi(p)))if(f){printf("%d ",t);t=0;}else f++;else t+=r*!!f;
p=strtok(0,",");
}
printf("\n");
}
>>348 javacが壊れちゃったからもうちょっと待ってね。
>>352 の使い方例と出力例
$ ./a.out 124,0,234,-34,0,5,5,5,0,0,3
200 15 0
って感じ
でも、出題はCじゃなさそうだし、報酬のエッチな絵はいらないわ
うわ、ださ! はずかしいとこ3つも発見 ちょっと鬱かも・・・
356 :
nanasi :2001/06/11(月) 16:08
sort-marge アルゴリズムで名簿をアルファベット順に並べ帰る場合の 総計算時間(計算量)を求めよ。 って問題がわかりません。教えてください
357 :
デフォルトの名無しさん :2001/06/11(月) 16:18
君が実際に紙の上で並べ替えをやってみて、 その時間をストップウオッチで計ってみればいいんだよ。
358 :
nanasi :2001/06/11(月) 16:28
いやそういうことじゃないような... そういう問題なの?
359 :
デフォルトの名無しさん :2001/06/11(月) 16:32
サンプル数を変えながら何回もやれば、 サンプル数に比例とか二乗に比例とかわかるかもね。
本屋でアルゴリズムの本を立ち読みしなさい。 大抵の本には載ってます。
361 :
デフォルトの名無しさん :2001/06/12(火) 01:00
宿題です。誰か解いてください。 課題 seiseki1という名前のファイルにキーボードから入力した10人分の成績(整数) を格納するプログラムおよび格納した成績を読み出して画面に表示するこのプロ グラム 俺がやった分 main() { int record[11]; /*成績表*/ int count; /*数えるための変数*/ FILE *fp; char inp_fname,out_fname; /*書き込む際のファイルネームと開く際のファイルネーム*/ printf("ファイル名を入力せよ>>"); scanf("%s",inp_fname); fp = fopen(inp_fname,"w"); if(fp == NULL){ printf("そのファイルは存在しません。\n"); getch(); exit(0); } /*1人りずつ成績を入力、 ファイルに書き込んでいく*/ for( count=1; count<11; count=count+1){ printf("%d人目の成績を入力せよ >>",count); scanf("%d",&record[count]); fprintf(fp,"%d",record[count]); } fclose(fp); fp = fopen(seiseki1,"r"); fclose(fp); getch(); exit(0); } これでファイルに書き込めてるでしょうか? このあとに”開きたいファイルを入力せよ”として最初に作ったファイルと同じなら インプットしたデータをだーっと出したいのですが、どうもうまくいきません。 お助けください。
>>361 ポインタの勉強をイチからやり直せ。
scanfのリファレンスを良く見直せ。
そもそも「文字」と「文字列」の違いを理解しろ。
>>361 その1 ファイル名用バッファは十分な大きさのchar型の配列にすること
その2 fopenで書き込み属性でファイルを開くと、ファイルがない場合は
自動生成するから、そのエラーメッセージ文は不適切
その3 ファイルに書き出すときも改行すること
その4 変数seiseki1ってなんだゴルァ♥
この4点を直せばファイルに書き出すところまではOKね
>>361 書き込み
head -10 > seiseki1
表示
cat seiseki1
365 :
361 :2001/06/12(火) 12:11
>>362 ポインタはなぜか次の課題となってます。とりあえず意識しないでやれってことらしいです。
fgetcとfputcが文字でfscanfとfprintfが文字列と認識してますが違います?
>>363 1・何度か書き直してファイル名を入力しないタイプとかも試してたので忘れてました。
配列は理解してますので大丈夫です。
2・なる。了解しました。"r"の時につければよいのですね。
3・for内のfscanf分ですね。了解しました。
4・これは次のデータを読み出すをファイル名の入力無しバージョンを作ってたときの
ごみです。消し忘れました。
>>364 見たことないので勉強しなおします。
皆さんレスどもです。引き続きよろしく。
366 :
361 :2001/06/12(火) 13:28
ファイルの書き込みのみですが書き直しました。多分あってると思います。 main() { int record[11]; /*成績表*/ int count; /*数えるための変数*/ FILE *fp; /*ファイルポインタ*/ char inp_fname[50]; /*書き込むファイルネーム*/ printf("ファイル名を入力せよ>>"); scanf("%s",inp_fname); fp = fopen(inp_fname,"w");a /*1人りずつ成績を入力、 ファイルに書き込んでいく*/ for( count=1; count<11; count=count+1){ printf("%d人目の成績を入力せよ >>",count); scanf("%d",&record[count]); fprintf(fp,"%d",record[count]); } fclose(fp); getch(); exit(0); } 次は”開きたいファイル名を入力せよ”として、if分を使ってファイルがあれば ファイルの内容を表示して、ファイル名が違ったら”存在しません”としたいです。 if(inp_fname == out_fname)として条件に合うならinp_fnameを開ければよいのですが 実行までいって、内容を表示させるファイル名を入力すると強制終了がかかってしまいます。 char型を==で比べることがまずいと思うのですが,どうすればよいでしょうか?
367 :
デフォルトの名無しさん :2001/06/12(火) 13:50
文字列を比較するにはstrcmpって関数が必要なんだけど、 課題のレベルを考えるとそこまで求めていないと思います。 単にout_fnameのファイルを開いてみて、 エラーが出たら存在しませんってことではダメなのでしょうか。 久々に向上心のある宿題君が居て嬉しいです。 プログラムが面白くなるまで頑張ってください。
368 :
デフォルトの名無しさん :2001/06/12(火) 13:51
あ、でもforとか配列とかは習ってるのか。 じゃぁ比較もループで作れってことなのかな……?
369 :
361 :2001/06/12(火) 20:27
>>367 >>368 strcmpっていう関数ははじめてみました。まだ習ってません。
とりあえず、ファイル名を比べずファイルの内容を表示するプログラムまで作ってみます。
stat()でいいじゃん。
っと、課題からすると、書き込みと表示のプログラムは別でいいんじゃないの?
fopen()の後ろに余分なaがついてるよ。 あと、fprintfは改行なりなんなりのデリミタいれとかないと、読むとき大変。 もしくは、バイナリで書きだすとかさ。
373 :
361 :2001/06/12(火) 20:49
>>370 stat()も習ってないっす。
>>371 別にした場合、それを呼び出す知識とか必要っぽいので今回は無しで・・
>>372 ボソミスでした。改行も入れときます。
とりあえず、明日提出なのでファイル名を比べないバージョンで作りました。
ありがとうごいました。以下は参考までに。
main()
{
int inp_record[11],out_record[11]; /*成績表*/
int count; /*数えるための変数*/
FILE *fp; /*ファイルポインタ*/
char inp_fname[50]; /*書き込むファイルネーム*/
printf("ファイル名を入力せよ>>");
scanf("%s",inp_fname);
printf("\n");
fp = fopen(inp_fname,"w");
/*1人りずつ成績を入力、 ファイルに書き込んでいく*/
for( count=1; count<11; count=count+1){
printf("%d人目の成績を入力せよ >>",count);
scanf("%d",&inp_record[count]);
fprintf(fp,"%d\n",inp_record[count]);
}
fclose(fp);
printf("\n\n<<%sの内容>>\n",inp_fname);
fp = fopen(inp_fname,"r");
/*ファイル内容の表示*/
for( count=1; count<11; count=count+1){
fscanf(fp,"%d",&out_record[count]);
printf("%d人目の成績は>>%d\n",count,out_record[count]);
}
fclose(fp);
getch();
exit(0);
}
374 :
麻衣 :2001/06/12(火) 21:16
#include <stdio.h> #include <conio.h> #define NUMBERS (10) int main( int argc, char *argv[] ) { int inp_record[NUMBERS], out_record[NUMBERS]; /*成績表*/ int count; /*数えるための変数*/ FILE *fp; /*ファイルポインタ*/ char inp_fname[50]; /*書き込むファイルネーム*/ /*ファイルを開く*/ printf( "ファイル名を入力せよ>>" ); scanf( "%s", inp_fname ); fp = fopen( inp_fname, "wb" ); if( fp == NULL ){ printf( "ファイルが開けません[]\n", inp_fname ); return -1; } printf( "\n" ); /*1人りずつ成績を入力、 ファイルに書き込んでいく*/ for( count=0; count<NUMBERS; count++ ){ printf( "%d人目の成績を入力せよ >>", count+1 ); scanf( "%d", &inp_record[count] ); } fwrite( inp_record, sizeof(int), NUMBERS, fp ); fclose(fp); /*ファイルを開く*/ printf( "\n\n<<%sの内容>>\n", inp_fname ); fp = fopen( inp_fname,"rb" ); /*ファイル内容の表示*/ fread( inp_record, sizeof(int), NUMBERS, fp ); for( count=0; count<NUMBERS; count++ ){ printf( "%d人目の成績は>>%d\n", count+1, out_record[count] ); } fclose(fp); getch(); return 0; } えへへ、すっきりした? お兄ちゃん♥
375 :
コロコロ :2001/06/12(火) 23:08
>>270 さん 大変お久しぶりです。おかげさまで大部分ができました。
ただ、出力表示結果が記述のようになり、出現回数は合っているのですが、
表示は正しく出力されませんでした。例えばinput.txtの1行目にはmikanが
あるのですが、それが、表示されていません。いろいろ試してみたのですがうまく
いきませんでした。どうしたら、完璧な出力ができるのでしょうか。
お分かりの方はぜひ、アドバイスしていただけないでしょうか。
ちなみにこの問題は
>>243 にあります。
出力表示結果
....................
...bananacake.......
.........PEACH......
.......PEACH......AP
PLE.............PEAC
H........ORANGE.....
..................ba
nanacake............
....................
....................
...ORANGE...........
....................
....................
.chocolatecake......
......PEACH.........
APPLE...............
--------------------
ringoの出現数は3
mikanの出現数は5
momoの出現数は5
bananaの出現数は3
strawberryの出現数は3
chocolateの出現数は2
Press any key to continue
>>375 そこまで出来ているなら、作ったものを書き込んで、
何が間違っているかを聞いた方が吉。
これからは私がお兄ちゃんのアソコ舐めてあげる。 でもあんまり詳しくないから分からないこといっぱいあるから みんも一緒に舐めてね。 お願い。
嫌だ
ま、ま、まッ、麻衣ちゃん、 ぼ、ぼ、ぼっ、ぼくと付合って欲しいんだな。
380 :
麻衣 :2001/06/13(水) 04:00
嫌だ
「ファイル中の単語を出現位置(行)をすべて表示するプログラムをつくる. ファイル名は「java ... ファイル名」で実行する時に指 定できるようにする. 前提知識 AVL木 関数としての見方: AVL木ではなくMapを使っ てもよい. StreamTokenizer StreamTokenizerのnに対して, n.eolIsSignificant(true);を実行しておくと, 改行が来るたびに n.ttype == StreamTokenizer.TT_EOL となるので,何行目かカウントできるようになる」 という宿題が出ました。 どうしたらいいのやら、全くわからず困っています。 メールでもレスでもいいのでどなたかどうか教えてください。
全くっつってもナニが分からんのか全く分からん(?_?) 全部作れってか? とりあえず、自分で作ってみて、ソースあぷして、それからだよ。
class kadai_4 { public static void main() { int num = 1; Vector bar = new Vector(); Map x = new TreeMap(); try { FileInputStream inp = new FileInputStream(filename); InputStreamReader f = new InputStreamReader(inp); BufferedReader b = new BufferedReader(f); StreamTokenizer s = new StreamTokenizer(b); s.eolIsSignificant(true); while(s.nextToken() != StreamTokenizer.TT_EOF){ if(s.ttype == StreamTokenizer.TT_EOL) num++; if(s.ttype == StreamTokenizer.TT_WORD){ System.out.println(s.sval + " at " + num); if(m.containsKey(s.sval)){ bar = (Vector)(x.get(s.sval)); } else { bar = new Vector(); } bar.add(new Integer(num)); x.put(s.sval,v); } } }catch(Exception e){ System.out.println("Exception" + e); } } トークンの切り出しまではできたのですが、mapにどうやってもちこんんでいけばいいのかわかりません。
>>383 >ファイル中の単語を出現位置(行)をすべて表示する
ってんだから、{"WORD", [1,4,5,10] } ちゅうふうに、単語と
出現位置(vector) を Mapする。
JAVAは詳しくないから、C++でいうと、map< string, vector<int> > mapsとして、
単語の出現によって、 maps[word].push_back( line ); する。
あとは、最後にmapsを巡回して、表示すればいいだけ。
>>383 最初の bar = new Vector() はいらんだろ。そのあと必ず捨ててるし。
mとかvとかいきなり出て来てるのを除けばだいたいよさそうだが、
すでにputしてあるVectorを毎回putすることもないだろ。
if (x.containsKey(s.sval)) {
bar = (Vector)(x.get(s.sval));
}
else {
bar = new Vector();
x.put(s.sval, bar);
}
bar.add(new Integer(num));
386 :
コロコロ :2001/06/14(木) 00:42
何とか自分なりに変えてみて文字の変換はうまくいったのですが 改行ができませんでした。(20文字で改行)どうしたら改行できるのでしょうか。 出力結果とコードを載せますので適切なアドバイスをお願いします。 出力結果 ......................ORANGE.................strawberrycake........strawberrycak e......ORANGE..........bananacake...APPLE...........PEACH............strawberryc ake............................................ORANGE........................... ......chocolatecake............................................bananacake....... .........PEACH.............PEACH......APPLE.............PEACH........ORANGE..... ..................bananacake.................................................... ...ORANGE....................................................chocolatecake...... ......PEACH.........APPLE............... -------------------- ringoの出現数は3 mikanの出現数は5 momoの出現数は5 bananaの出現数は3 strawberryの出現数は3 chocolateの出現数は2 Press any key to continue コード #include <stdio.h> #include <string.h> char *mygets(FILE *fp ){ static char buf[260]; size_t n; memset( buf , '\0' , sizeof(buf) ); if(fgets(buf,sizeof(buf),fp)){ n=strlen(buf); if(n&&buf[n-1]=='\n'){ buf[n-1] = '\0';n--;} if(n&&buf[n-1] =='\r'){ buf[n-1] = '\0';} return(buf);} return(NULL);} size_t myputs(char *p,size_t n,size_t m){ while(n){ if(m<20){ printf("%c",*p);p++;n--;} else{ printf("\n");m=0;}} return(m); } void main(int argc,char *argv[]){ FILE *fp; char *p;size_t n;size_t m;size_t l; int ringo=0,mikan=0,momo=0,banana=0,strawberry=0,chocolate=0; n=0; fp=fopen("C:\\input.txt","r"); while(p=mygets(fp)){ m=0;l=strlen(p); while(m<l){ if(!memcmp(p+m,"ringo",5)){ n=myputs("APPLE",5,n);m= m + 5;ringo++;} else if(!memcmp(p+m,"mikan",5)){ n =myputs("ORANGE",6,n);m = m + 5;mikan++;} else if(!memcmp(p+m,"momo",4)){ n =myputs("PEACH",5,n);m = m + 4;momo++;} else if(!memcmp(p+m,"banana",6)){ n =myputs("bananacake",10,n);m = m + 6;banana++;} else if(!memcmp(p+m,"strawberry",10)){ n =myputs("strawberrycake",14,n);m = m + 10;strawberry++;} else if(!memcmp(p+m,"chocolate",9)){ n =myputs("chocolatecake",13,n);m = m + 9;chocolate} else{n=myputs(".",1,n);m++;} } } fclose(fp); printf("\n\n--------------------\n"); printf("ringoの出現数は%d\n",ringo); printf("mikanの出現数は%d\n",mikan); printf("momoの出現数は%d\n",momo); printf("bananaの出現数は%d\n",banana); printf("strawberryの出現数は%d\n",strawberry); printf("chocolateの出現数は%d\n",chocolate); } ちなみにinput.txtは243に書いてあります。
マルチステートメントだらけで、見辛い。 まずはそこから直せ。
>>386 myputs()のif (m < 20)のブロックに++mが抜けてる。
ていうか汚すぎ。indent通さなきゃ読めん、こんなの。
389 :
コロコロ :2001/06/14(木) 10:37
>>388さん m++ を入れるとこのような出力になります。 出力表示結果 .................... ...bananacake....... .........PEACH...... .......PEACH......AP PLE.............PEAC H........ORANGE..... ..................ba nanacake............ .................... .................... ...ORANGE........... .................... .................... .chocolatecake...... ......PEACH......... APPLE............... -------------------- ringoの出現数は3 mikanの出現数は5 momoの出現数は5 bananaの出現数は3 strawberryの出現数は3 chocolateの出現数は2 Press any key to continue
>>386 if(!memcmp(p+m,"chocolate",9))の後のブロックが
chocolateで終わってるのに、それでコンパイラを通ったの?
何か、違うものをコンパイラしてませんか?
ちなみに、chocolate++;で、m++;を入れて試してみらた、
Borland C++とLSI-Cでは、全部表示されましたよ。(^^;
追伸
まさかとは思いますが、自分の環境でも、同じような所まで、
画面からあふれていたので、それで、表示されていないと思ったとか…?
>>390 chocolate++は直したんを忘れてが、
ちょうど25行だから単にスクロールしただけだろう。
ファイルにリダイレクトしてエディタででも見れ。
>>389 それより、いきなりcore吐いたんでよく見たら、
入力ファイル名決め打ちでおまけにエラーチェックもしてねーし。
ってどうでもいいか宿題程度に。
392 :
コロコロ :2001/06/15(金) 13:33
>>391さん リダイレクトとは何でしょうか。 エディタを見るとはどういうことでしょうか。 詳しく説明していただけないでしょうか。 よろしくお願いします。
393 :
デフォルトの名無しさん :2001/06/15(金) 13:37
391じゃないけど。 普通にコマンドラインからプログラムを実行すると、 どんどん表示されていってそのうちスクロールして消えていったりしますが、 画面に表示させるかわりに、ファイルに保存するという方法があるんです。 foo というコマンドの場合、 foo > bar のように>に続けてファイル名を書くことによって、 結果をファイル(この場合はbar)に保存することができます。
この子ヘルプが無い環境で作業してるのかしら? 参考までに、どんな環境で作業しているか聞いてみたいもんだわ。
>>393 あのう、標準エラー出力はどうやってロギングするんですか?
unixの場合、シェルによって変わる可能性あるよ。 cshなら>&だね。
shell < con > con 2> con かな?
>>398 入力と出力を同じファイルにしてどうするよ。
それでうまくいくのはcmd.exeだけだ。
400 :
マジレスさん :2001/06/15(金) 21:40
英文を書くのに便利なプログラムお願いします 頭文字は大文字(ピリオドの次が大文字) 当然最初は大文字 英語以外はダメ ほかは小文字 単独のiは大文字(I) 連続のスペースは1つ分にする などです なんかflagをたてるそうです Cでお願いします できますかね?
無理!!
>>400 某大学の宿題に酷似してるんだけど気のせいか?
まぁ、そのガッコのやつはフィルタとして作れって感じだったが。
ispell
フィルタじゃなくてCでってことは、エディタをつくんなきゃいけないの? Unix? Win?
400
Unixです。フィルタってよく分かりません(調査中)
>>402 スレタイトル「お兄ちゃんの宿題、私が答えるよ」だし(笑)
文字判定するところのヒントだけでいいです。
flag = 0; while (ファイルの終わり) { 文字を読む; if (flag) { 大文字にして出力; flag = 0; } else { そのまま出力; } if (条件) { flag=1; } } 「条件」のとこは自分で色々考えれ。
407 :
デフォルトの名無しさん :2001/06/16(土) 09:19
age
408 :
デフォルトの名無しさん :2001/06/19(火) 21:23
次のプログラムは、プログラムの中でデータを作成し、棒グラフ・折れ線グラフを表示させたものである。データをあるファイル(sample)から読み込んでグラフを表示させるようにプログラムを変更してみよ。これができなかったら、プログラマー失格だよ?(藁 ソースはちゃんと貼ってね。import java.awt.Color; public class Ex71a{ public static void main(String[] args){ int MAX = 1000; int Y_MAX = 101; if(args.length!=0 && Integer.parseInt(args[0])!=0){ int num=Integer.parseInt(args[0]); int array[][]=new int[num][2]; for(int i = 0;i<num;i++){ array[i][0]=i; array[i][1]=(int)(MAX*Math.random())%Y_MAX; } DrawBar(array); DrawGraph(array); } } public static void DrawGraph(int[][] array){ int MAX=100; int FrameX = 600; int FrameY = 300; TurtleFrame f = new TurtleFrame(FrameX@`FrameY); Turtle m = new Turtle(); f.add(m); int AxisXO = FrameX*1/4; int AxisYO = FrameY*3/4; int AxisXL = FrameX/2; int AxisYL = FrameY/2; DrawAxis(m@`array.length@`AxisXO@`AxisYO@`AxisXL@`AxisYL); m.up();m.moveTo((int)(AxisXO)@`(int)(AxisYO)@`0); m.setColor(Color.black); m.down(); for(int i =0;i<array.length;i++){ m.moveTo((int)(AxisXO+(double)(array[i][0]*AxisXL)/array.length)@` (int)(AxisYO-(double)(array[i][1]*AxisYL)/MAX)@`0); } m.up();m.moveTo((int)(AxisXO)@`(int)(AxisYO)@`0); } public static void DrawAxis(Turtle m@`int xMax@`int AxisXO@`int AxisYO@`int AxisXL@`int AxisYL){ m.up();m.moveTo((int)(AxisXO)@`(int)(AxisYO)@`0); m.setColor(Color.red); m.up();m.moveTo((int)(AxisXO)@`(int)(AxisYO)@`90); m.down();m.fd(AxisXL); m.up();m.rt(180);m.fd(AxisXL); m.down();m.rt(90);m.fd((int)AxisYL); m.up();m.rt(180);m.fd((int)AxisYL); m.rt(180);
409 :
デフォルトの名無しさん :2001/06/19(火) 21:24
for(int i = 0;i<=xMax;i++){ m.up();m.moveTo((int)(AxisXO+(double)(i*AxisXL)/xMax)@`(int)(AxisYO)@`0); m.down();m.moveTo((int)(AxisXO+(double)(i*AxisXL)/xMax)@`(int)(AxisYO-AxisYL/20)@`0); } for(int j = 0;j<=10;j++){ m.up();m.moveTo((int)(AxisXO)@`(int)(AxisYO-(double)(j*AxisYL)/10)@`0); m.down();m.moveTo((int)(AxisXO + AxisYL/20)@`(int)(AxisYO-(double)(j*AxisYL)/10)@`0); } m.up();m.moveTo((int)(AxisXO)@`(int)(AxisYO)@`0); } public static void DrawBar(int[][] array){ System.out.println("データを表示します:#を10、*を1とします、"); System.out.println("データ番号、データ、図形による表示"); for(int i = 0;i < array.length;i++){ System.out.print(array[i][0] + " " + array[i][1] + " "); int countA = array[i][1]%10; int countB = (int)(array[i][1]/10); for(int j=0;j<countB;j++) System.out.print("#"); for(int j=0;j<countA;j++) System.out.print("*"); System.out.print('\n'); } } }
もひかひて、カンマが化けるんかいな。 ,,,,,
>>408 そういう低脳な煽りはこの板の住人には逆効果だ。
俺は「プログラマ」なので「プログラマー」失格でも別にイイや。とか。
失格で結構
「プログラマー」なら喜んで失格になりたいヽ(´ー`)ノ
415 :
デフォルトの名無しさん :2001/06/19(火) 22:08
マルチポスト宿題教えてクンの季節がまたきたか… 期末試験?
416 :
デフォルトの名無しさん :2001/06/19(火) 22:28
Javascriptで配列を使っているのですが、 表示された数の個数の求め方がよくわからないので、やりかた教えて下さい。 <html> <head> <script language="JavaScript"> <!-- Code hiding from here function sam01(){ a=new Array(); for(i=2;i<=25;i++){ a[i]=0; } for(k=2;k<=25;k=k+2){ a[k]=1; } for(i=2;i<=25;i++){ if(a[i]==0){ document.write(i+"<br>"); } } } // -->end of script </script> </head> <body> <script language="JavaScript"> <!-- Code hiding from here sam01(); // --> end of scirpt </script> </body> </html> ↑ これで表示される数(3~25)の個数(表現がよくわからないですが)を求める方法です。 よろしくお願いします。
417 :
麻衣 :2001/06/19(火) 23:07
>>416 レスが遅れてごめんね、お兄ちゃん。
お風呂入ってたの。
でね、JavaScriptは捨てていいよ♪
>>416 数えてみりゃいいじゃん。要するに3~25の奇数の数だろ。
419 :
デフォルトの名無しさん :2001/06/20(水) 23:30
FORTRAN77で8桁の10進数を2進数化して表示するプログラムで悩んでいます。 ずーと考えていましたが、全く分かりません。 誰か教えてください。お願いします。
420 :
麻衣 :2001/06/20(水) 23:52
>>416 a=new Array();
の後ろに
var c=0;
document.write(i+"<br>");
の後ろに
c++;
sam01()の閉じる直前に
document.write("display count:"+c );
でどうかな?
でもJavaScriptはネット関係の板に逝った方がイイよ
421 :
デフォルトの名無しさん :2001/06/21(木) 06:25
プログラマー板はクッキーが必要になったね。 麻衣ちゃんはクッキー好き?
a.length()
423 :
400 :2001/06/22(金) 16:02
ピリオドの次の文字を大文字にするにはどうしたらいいですか? ピリオドを判定するやり方は分かりますが,その次の文字を大文字にする やり方が分かりません.
424 :
デフォルトの名無しさん :2001/06/22(金) 16:03
>>423 if( ch == 'a' ) ch = 'A';
if( ch == 'b' ) ch = 'B';
if( ch == 'c' ) ch = 'C';
...
tuupper()
427 :
423 :2001/06/22(金) 16:31
>>425 普通に大文字にするのは分かります
配列を使って,for文で文字列をみています。
>>427 for(i = 0; str[i] != 0; ++i ) {
if( str[i] == 'a' ) str[i] = 'A';
if( str[i] == 'b' ) str[i] = 'B';
if( str[i] == 'c' ) str[i] = 'C';
...
}
>>428 for(i = 0; str[i] != 0; i++ ) {
switch(str[i]){
case 'a': str[i]='A'; break;
case 'b': str[i]='B'; break;
case 'c': str[i]='C'; break;
...
}
}
430 :
423 :2001/06/22(金) 16:43
>>428 ifでピリオドを判定してstr[i+1]とかやればOK?
>>430 なんだよ。結局全部きくつもりかい(^-^;
自分なりに考えたコードでもあげれば、やさしい人が添削してくれるかもよ。
432 :
430 :2001/06/22(金) 17:16
if(str[i]=='.' && str[i+1]>='a' && str[i+1]>='z' ){ str[i+1]-='a'-'A'; } こんなかんじ?
433 :
初心者A :2001/06/22(金) 17:53
>>432 void upperi(char *p)
{
while(*p)if(*p++=='.')if(*p>='a'&&*p<='z')*p++=*p+'A'-'a';
}
main( int argc,char** argv )
{
upperi(argv[1]);
printf("%s\n",argv[1]);
}
$ ./a.exe test.test.aaaaa.ZZZ.zza
test.Test.Aaaaa.ZZZ.Zza
434 :
デフォルトの名無しさん :2001/06/22(金) 17:54
>>432 こうかな。
if(s[i]=='.') {
s[i+1] = toupper(s[i+1]);
}
435 :
デフォルトの名無しさん :2001/06/22(金) 18:00
432だが俺間違ってる?
>>435 間違ってはいない。
ただ、このあとポインタ(i)をどれだけ増やす?
'.'を判定した時点でもう次にフォーカスを移すべき(i++すべき)で、
さらにa~z内であることがわかった時点で次に移れる。
もしa~z内でなければ、'.'であるかもしれないからi++はできない。
単純に処理後常にi++してもいいが、それじゃあ華が無い。
>>434 お題に沿ってない。
437 :
デフォルトの名無しさん :2001/06/22(金) 18:12
438 :
デフォルトの名無しさん :2001/06/22(金) 18:27
439 :
432 :2001/06/22(金) 18:34
>>438 未熟ものだから分かりません。暇があれば考えます
>>437 間違えです。
if(str[i]=='.' || str[i+1]>='a' && str[i+1]>='z' ){
str[i+1]-='a'-'A';
}
こうですよね?
>>439 if(str[i]=='.' && str[i+1]>='a' && str[i+1]<='z' ){
441 :
デフォルトの名無しさん :2001/06/22(金) 18:37
>>439 小文字の判定はこうなんじゃ?
if(str[i]=='.' && str[i+1]>='a' && str[i+1]<='z' ){
(こういう判定は標準関数を使うのが正解だと思うけど)
442 :
デフォルトの名無しさん :2001/06/22(金) 18:43
>>419 もーフォートラン忘れた。
I = 12345678
10 IF I.EQ.0 GOTO 999
IF (I MOD 2) 999,20,30
20 0を表示
GOTO 40
30 1を表示..FORMAT文忘れた。
40 I = I / 2
GOTO 10
999 END
で、下から上に読むと2進数
443 :
432 :2001/06/22(金) 18:45
if(str[i]=='.' && str[i+1]>='a' && str[i+1]<='z' ){ だとピリオド且つ小文字ってなってピリオド且つ小文字の文字なんてなくない?
444 :
デフォルトの名無しさん :2001/06/22(金) 18:47
>>443 もう一度コードをよく見直してください。
445 :
デフォルトの名無しさん :2001/06/22(金) 18:50
>>439 なんでみんな先にピリオドみるの?
void upperi(char *p){
while( *ptr ){
ptr++;
if( 'a' <= *ptr && *ptr <= 'z' && *(ptr-1) == '.' ){
*ptr += 'A'-'a';
}
}
}
while(*p)if(*p++=='.')if(*p>='a'&&*p<='z')*p++=*p+'A'-'a';
}
>>443 「対象文字がピリオド かつ 次の文字が'a'~'z'の範囲内」なので問題ない。
わかりやすく書くと
if(str[i]=='.' && (str[i+1]>='a' && str[i+1]<='z') ){
となるが、&&は論理積なので()は捨てても問題ない。
447 :
445 :2001/06/22(金) 18:51
あら、こぴぺのゴミが...:)
448 :
デフォルトの名無しさん :2001/06/22(金) 19:00
>>445 英文だとアルファベットは頻繁に出てくるがピリオドの出現頻度は低い。
if文は条件の成否がはっきりした段階で判定を打ち切るから、
ピリオドを先に調べれば、その段階で処理が切られて実行速度があがる。
449 :
432 :2001/06/22(金) 19:04
ピリオド∩小文字とは違うの?
>>448 >>445 さんのコードを借りるなら、評価順序が
while(*p++)if(*(p-1)=='.'&&'a'<=*p&&*p<='z')*p+='A'-'a';
なら問題ないってことね。でも、一度足してから引いてる分冗長か。
while(*p)if(*p++=='.')if(*p>='a'&&*p<='z')*p+++='A'-'a';
ならほんのちょっぴり(2,3ステップ)早い。(最後だけ少し直した)
>>450 最適化かけたら全然変わりませんでした。すみません。
452 :
デフォルトの名無しさん :2001/06/22(金) 21:22
つうか速度求める問題じゃないでしょ。速度だけなら テーブル使う。++使ってるとバグだすでしょ。 while(*p)if(*p++=='.')if(*p>='a'&&*p<='z')*p++=*p+'A'-'a'; これ、最後の文字が'.'だったらどうするの?って俺もバグってたけど。 もっと正しく、きれいに書くか。 void upperi(char *ptr){ for( ptr++ ; *ptr ; ptr++ ){ if( 'a' <= *ptr && *ptr <= 'z' && *(ptr-1) == '.' ){ *ptr += 'A'-'a'; } } } これで正しいかな?よさそうな気がする。
453 :
デフォルトの名無しさん :2001/06/22(金) 21:26
>>452 最後の文字が . でも大丈夫だよ。ぎりぎりで。
455 :
デフォルトの名無しさん :2001/06/23(土) 20:55
ちょっと質問。 n次のパスカル行列を出力するプログラムなんですけど。 行列の成分をA(x,y)と置いてA(x+1,y+1)=A(x+1,y)+A(x,y+1)で計算させるのが普通だと思うのですが・・・ 行列のカタチに出力させるのがいまいちわかりません。 printfにfor(x=0,x<=n,++x)とか使ってもいいんですかね?
456 :
学生 :2001/06/24(日) 20:43
KL展開のプログラムがわかりません。 固有値ベクトルのプログラムはできたのですが。KL展開のプログラムを使って 近似の次元をあげて、2乗誤差の変化をみることが目的です。だれか教えてください。
457 :
デフォルトの名無しさん :2001/06/24(日) 22:29
は?
458 :
デフォルトの名無しさん :2001/06/26(火) 13:35
、下のCプログラムを書き換えてpivot=0やとても小さい数でもちゃんと計算できる ように下のプログラムを完全なものに したいのですが・・・ どうやったらいいのですか? ここをこうかえる、というように具体的に教えて下さい。 マジでお願いします。 #include <stdio.h> #define IMAX 3 #define JMAX 4 double array[IMAX][JMAX]={ { 2, 1,-1, 5 }, {-3, 3, 2, 1 }, { 1,-2,-2,-1 }, }; void PrintMat(void){ int i,j; for(i=0;i<IMAX;i++){ for(j=0;j<JMAX;j++){ printf("%5.2f ",array[i][j]); } putchar('\n'); } putchar('\n'); } void SweepOut(void){ int i,j,axis; double pivot,aik; for(axis=0;axis<IMAX;axis++){ pivot=array[axis][axis]; for(j=axis;j<JMAX;j++){ array[axis][j]/=pivot; } for(i=0;i<IMAX;i++){ if(i!=axis){ aik=array[i][axis]; for(j=0;j<JMAX;j++){ array[i][j]-=array[axis][j]*aik; } } } } } main(){ PrintMat(); SweepOut(); PrintMat(); }
460 :
ヴァカ :2001/06/26(火) 21:25
sybaseの全データベースと全テーブルとストアドプロシジャーを バックアップするスクリプト(Bシェル)書かなきゃいけないんですけど、まったくもって分かりません。 bcpを使うらしいのですが、bcpで全データや全テーブルを指定する方法があれば なんとかなりそうなのですが、その方法が分かりません。 もしくは、変数か何かで指定するfor文とかなのでしょうか。 助けてください。帰れません…。
461 :
デフォルトの名無しさん :2001/06/26(火) 22:51
462 :
ヴァカ :2001/06/27(水) 20:33
Sybaseに関する質問です。 以下のテキストファイルを用意し +-- AAA ------------------------------------------+ use jpubs go select 'bcp '+name+' out '+name+'.txt -c -Uxx -Pxx' from sysobjects where type = 'U' go +-------------------------------------------------+ [sybase@hoge sybase]$ isql -Uxx -Pxx -i ./AAA -o ./BBB とした時の出力ファイルBBBが↓のようになります。 +-- BBB ------------------------------------------+ bcp 著者 out 著者.txt -c -Uxx Pxx bcp 出版者 out 出版者.txt -c -Uxx Pxx bcp 著作権料 out 著作権料.txt -c -Uxx Pxx bcp 販売 out 販売.txt -c -Uxx Pxx bcp 販売詳細 out 販売詳細.txt -c -Uxx Pxx bcp 著者タイトル out 著者タイトル.txt -c -Uxx Pxx bcp タイトル out タイトル.txt -c -Uxx Pxx bcp 店舗 out 店舗.txt -c -Uxx Pxx bcp 割引 out 割引.txt -c -Uxx Pxx bcp 著者肖像 out 著者肖像.txt -c -Uxx Pxx bcp 宣伝 out 宣伝.txt -c -Uxx Pxx (11 rows affected) +-------------------------------------------------+ AAAの3行目の部分(bcp '+name+' out '+name+'.txt -c -Uxx -Pxx)が 実行されていないので、これを実行させるのはどうしたら良いのでしょうか? '!!bcp~~ (bcp~~ (!!bcp~~ `bcp~~ `!!bcp~~ 等いろいろ試してみたのですが出来ません…。 どうかお助けください。お願いします。
463 :
デフォルトの名無しさん :2001/06/27(水) 21:04
PASCAL言語で二次方程式の解(虚数・重解含む)を求めるプログラム を教えていただきたいです。。
>>463 リアル厨房?
公式に値放り込んで計算すれば?
465 :
デフォルトの名無しさん :2001/06/28(木) 13:19
要素数が50の整数型配列bにおいて、b[k+1]をb[k]へ転送するプログラムを作成しなさい。 という問題があるんですがわかりません。何方か教えてください。
>>465 for(k=50;k>=0;k--)b[k]=b[k+1];
バグをふたつ盛り込んだので、自分で直せ
やっぱふたつだ
いや、ぜんぜんだめだ
memmove( &b[0], &b[1], sizeof(int)*(50-1) );
int* c = (int*)b - 1; c[0]は見ちゃイヤン。
逆ダッタ int* c = (int*)b + 1; c[49]は見ちゃダメヨ。
473 :
デフォルトの名無しさん :2001/06/29(金) 12:42
宿題ネタが氾濫してきたのであげとこう
474 :
C言語一週間目 :2001/07/02(月) 18:11
「1~50の任意の整数を元にする2つの集合に対して その和集合・積集合を求めるのをつくれ」 ってやつなんだけど、これやる考え方って配列と場合分けでいいですか? 図書館で調べたけどわからなくて。
場合分け入らないでしょ。 配列とループだけよ
476 :
デフォルトの名無しさん :2001/07/02(月) 18:20
場合分けは要るでしょ。
任意の正数の抽出で場合分けか? でも、それも書き方でイランような気が。 俺、問題を読み間違えてる?
#include <stdlib.h> #define N 100 int main() { int i; int array[2][N]; int sum[N]; int mul[N]; for (i = 0; i < N; i++) { array[0][i] = (rand() % 50) + 1; array[1][i] = (rand() % 50) + 1; sum[i] = array[0][i] + array[1][i]; mul[i] = array[0][i] * array[1][i]; } return 0; }
>>477 例えば
1つ目の集合 1,2,3,5
2つ目 1,3,4
とキーボードから入力させて、その和集合積集合を、です。
言葉が足らなくてすみませんでした。
public void printOr(int[] a, int[] b) { int[] temp = new int [ 50 ]; for ( int i = 0; i < temp.length; i++ ) { temp[i] = 0; } for ( int i = 0; i < a.length; i++ ) { temp[a[i]-1]++; } for ( int i = 0; i < b.length; i++ ) { temp[b[i]-1]++; } for ( int i = 0; i < temp.length; i++ ) { if ( temp[i] > 0 ) { // 積集合なら > 1 System.out.println(i); } } }
System.out.println(i+1); だ 鬱
482 :
デフォルトの名無しさん :2001/07/02(月) 20:11
キーボードから文字をCtrl-Dで終了するまで読み取り、 アルファベット、数字、その他に分類してそれぞれの数を数えて、 表示するプログラムを作る方法を教えてください。 改行文字も「その他」で数えます。
program setTest; type theSets = set of 1..50; var a, b, c, d: theSets; begin a := [1, 2, 3, 5]; b := [1, 3, 4]; c := a + b; d := a * b; end.
484 :
デフォルトの名無しさん :2001/07/02(月) 20:22
長くてすみません、質問です カレントディレクトリにある *.LOG ファイル全てを、終端から 8行だけ残して縮めたいんですが、 `ls -1 *.LOG | sed 's/\(.*\)/tail -8 \1 > tmp.LOG ;\\mv tmp.LOG \1/'` とやっても失敗します。 バッククウォートで囲まれた部分の変換は tail -8 aaa.LOG > tmp.LOG ;\mv tmp.LOG aaa.LOG tail -8 bbb.LOG > tmp.LOG ;\mv tmp.LOG bbb.LOG tail -8 ccc.LOG > tmp.LOG ;\mv tmp.LOG ccc.LOG みたいな感じになって、うまくいっているのですがバック クウォートで囲むとダメです。 結局、バッククウォートをはずしてリダイレクトでコマンド イメージをファイルにとって、それをシェル起動しています。 もっとスマートにやるにはどうしたらいいんでしょうか。 アドバイスお願いします。
xargv
#include<stdio.h> #include<ctype.h> int main(void) { int alpha = 0; int digit = 0; int etc = 0; char ch; while((ch = getchar()) != EOF){ if(isdigit(ch)){ digit++; } else if(isalpha(ch)){ alpha++; } else{ etc++; } } printf("alpha=%d\n",alpha); printf("digit=%d\n",digit); printf("else=%d\n",etc); return 0; }
487 :
>486 :2001/07/02(月) 22:41
返事嬉しいのですがなんか今、私がやってるプログラムは #include <stdio.h> void main(void) から始まるのなんですよ。
なんのこっちゃ
#!/bin/sh for i in *.LOG ; do tail -8 $i > tmp.LOG mv tmp.LOG $i done
#include<stdio.h> void main(void) { int alpha = 0; int digit = 0; int etc = 0; char ch; while((ch = getchar()) != EOF){ if('0' <= ch && ch <= '9'){ digit++; } else if('a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z'){ alpha++; } else{ etc++; } } printf("alpha=%d\n",alpha); printf("digit=%d\n",digit); printf("else=%d\n",etc); }
491 :
デフォルトの名無しさん :2001/07/02(月) 23:06
>>489 うはー、こうやるのですか。
なんか今まで、変なやり方ばっかりしてたような気がします。
基本がなってませんね、鬱。
ありがとうございました。
475以降の答えてくださった皆さんありがとうございました。
495 :
デフォルトの名無しさん :2001/07/03(火) 01:44
こんな課題が出たんですけどアドバイスお願いします。 次の処理をおこなうプログラムをポインタを用いて作成 1 キーボードから任意の文字数の半角英数字を読み込む。但し、20文字以内。 2 入力した文字列の中に" / " がある場合には" / "までも文字列とその先頭アドレス 及び、" / "を除く残りの文字列とその先頭アドレスを次の行に表示する。 3 " / "のない場合には前半と後半が同じ文字数または前半が1個だけ多くなるように 文字列を分割して同様に表示する。 で、いまのところテキスト等を参考にしてできたプログラムは main() { char inp_moji[20]; /*入力する文字列*/ char *a_p,*b_p; /*ポインタ変数*/ printf("分割したい文字列を入力せよ >> "); scanf("%s",inp_moji); a_p = inp_moji; b_p = inp_moji; while(*b_p != '/' && *b_p != '\0') b_p++; if(*b_p == '/'){ *b_p = '\0'; b_p++; } printf("前半の文字列は>>%s\t 文字列の先頭アドレスは>>%d\n",a_p,*a_p); printf("後半の文字列は>>%s\t 文字列の先頭アドレスは>>%d\n",b_p,*b_p); getch(); exit(0); } なんですが、文字列の先頭アドレスを表示する方法はこれであってるでしょうか? ためしに適当に実行してみて3桁の数字が出たのですが前半のアドレスより 後半のアドレスが低くなることがあり、違う気がします。アドバイスおねがいします。
printf("前半の文字列は>>%s\t 文字列の先頭アドレスは>>%ld\n",a_p,a_p); printf("後半の文字列は>>%s\t 文字列の先頭アドレスは>>%ld\n",b_p,b_p); か、 printf("前半の文字列は>>%s\t 文字列の先頭アドレスは>>%p\n",a_p,a_p); printf("後半の文字列は>>%s\t 文字列の先頭アドレスは>>%p\n",b_p,b_p); かな?
497 :
デフォルトの名無しさん :2001/07/03(火) 02:51
さげちった。
498 :
デフォルトの名無しさん :2001/07/03(火) 02:55
あーあと、char inp_moji[20];だと、'\0'入れると19文字しか入らないな。 char inp_moji[21];だね。 それと、 scanf("%20s",inp_moji); ってやっといたほーがよさげ。
char inp_moji[20+1]; のほうが意味わかりやすいな。 ほんとは#defineしとくといいんだけど。
っつか、文字列分割(3)のろじっくが入ってないな、これ。。。
こうやってPerlユーザが馬鹿にされて、コケにされて、侮辱されて、(当然のことだ) 顔を真っ赤にして耐えている姿を想像するだけで俺の気分は爽快になる。 Ruby万歳。俺にこんな快楽を与えてくれたRubyに幸いあれ。
お兄ちゃんのアソコl、私が舐めるよ
503 :
デフォルトの名無しさん :2001/07/03(火) 12:26
数の物品の買物をします。物品の単価(1個の値段)と個数の2つのデータの 組を Ctrl-D で終了するまで読み取り、最後に各々の物品の単価と個数、合計 金額を1行でわかりやすく表示せよ。また全ての総合計金額、消費税額、税込 み合計金額を表示しなさい。消費税の計算は最後に1回だけ行う。 表示例 入力データ 98 10 198 5 158 1 Ctrl-D 番号 単価 個数 合計 1 98 10 980 2 198 5 990 3 158 1 158 合計金額 2128 消費税 106 税込み合計 2234 このプログラム分かる人!!教えて!!!早急に!!!
504 :
訂正です :2001/07/03(火) 12:28
表示例 入力データ 98 10 198 5 158 1 Ctrl-D 番号 単価 個数 合計 1 98 10 980 2 198 5 990 3 158 1 158 合計金額 2128 消費税 106 税込み合計 2234
505 :
????? :2001/07/03(火) 12:30
できるだけ #include <stdio.h> void main(void) から始めてくれると嬉しいです。
506 :
?????? :2001/07/03(火) 12:59
できるだけ #include <stdio.h> #include <signal.h> #include <unistd.h> extern int main(int argc, char **argv, char **endp) から始めてくれると嬉しいです。
endpってなんじゃい。
>>503 クラスの友達に見せて貰うなりした方が良いと思うぞ
完璧なリストを提出したら逆にバレると思われ(藁
509 :
506 :2001/07/03(火) 13:50
510 :
>486 :2001/07/03(火) 13:53
>508 クラス全員違う問題だから。
>>510 できた!
エッチなCGを持ってきたらコピペしてあげる
>>510 そうなのか
#include <stdio.h>
void main(void){
int bangou=1,tanka,kosuu,goukei,soukei=0;
char buffer[10000]="番号\t単価\t個数\t合計\n";
while(scanf("%d %d",&tanka,&kosuu)==2){
goukei=tanka*kosuu;
sprintf(buffer,"%s%d\t%d\t%d\t%d\n",buffer,bangou,tanka,kosuu,goukei);
bangou++;
soukei+=goukei;
}
printf("%s総合計\t%d\n消費税\t%d\n税込\t%d\n",buffer,soukei,(int)(soukei*0.05),(int)(soukei*1.05));
}
まあこんなんで動くけど、まだ習ってない部分があったらスマソ
513 :
デフォルトの名無しさん :2001/07/03(火) 14:14
返事嬉しいです!! だけどsprintfとかchar buffer[10000]とか習ってないのがいっぱいです。
514 :
デフォルトの名無しさん :2001/07/03(火) 14:33
なんかプログラムには1次元配列を使わないといけないらしいんだけど。
構造体はやりましたか? 構造体の配列?
516 :
デフォルトの名無しさん :2001/07/03(火) 14:38
いや。まだやってませんね~
>>514 んじゃ、その課題の方針と思われる方法で
#include <stdio.h>
int main(void){
int bangou,saidai_bangou,goukei,soukei=0,tanka_hairetsu[10000],kosuu_hairetsu[10000];
for(bangou=1;bangou<10000;bangou++){
if(scanf("%d %d",&tanka_hairetsu[bangou],&kosuu_hairetsu[bangou])!=2)break;
}
saidai_bangou=bangou;
printf("番号\t単価\t個数\t合計\n");
for(bangou=1;bangou<saidai_bangou;bangou++){
goukei=tanka_hairetsu[bangou]*kosuu_hairetsu[bangou];
printf("%d\t%d\t%d\t%d\n",bangou,tanka_hairetsu[bangou],kosuu_hairetsu[bangou],goukei);
soukei+=goukei;
}
printf("総合計\t%d\n消費税\t%d\n税込額\t%d\n",soukei,(int)(soukei*0.05),(int)(soukei*1.05));
}
518 :
デフォルトの名無しさん :2001/07/03(火) 14:51
printf("総合計\t%d\n消費税\t%d\n税込額\t%d\n",soukei,(int)(soukei*0.05),(int)(soukei*1.05)); この部分をもっと初段な感じしてもらうと嬉しいんですが。 あと¥tも今だ習ったことありませんね~
んじゃ、最初の int に shouhizei,zeikomigaku, を加えて shouhizei=soukei*0.05; zeikomigaku=soukei+shouhizei; printf("総合計 %d\n消費税 %d\n税込額 %d\n",soukei,shouhizei,zeikomigaku); と表示すれば分かり易いかな \t は表示を見やすくするためのものなので、普通にスペースで置き換えて大丈夫です まあ正しく動くかどうかよりも、ちゃんと流れを追えるかどうかの方が重要だあね
520 :
デフォルトの名無しさん :2001/07/03(火) 15:12
#include <stdio.h> int main(void){ int bangou,saidai_bangou,goukei,soukei=0,tanka,kosuu,shouhizei,zeikomigaku; for(bangou=1;bangou<10000;bangou++){ if(scanf("%d %d",&tanka_hairetsu[bangou],&kosuu_hairetsu[bangou])!=2)break; } saidai_bangou=bangou; printf("番号 単価 個数 合計\n"); for(bangou=1;bangou<saidai_bangou;bangou++){ goukei=tanka*kosuu; printf("%d,%d,%d,%d\n",bangou,tanka,kosuu,goukei); soukei+=goukei; } shouhizei=soukei*0.05; zeikomigaku=soukei+shouhizei; printf("総合計 %d\n消費税 %d\n税込額 %d\n",soukei,shouhizei,zeikomigaku } これでやればできるんですよね?
521 :
訂正 :2001/07/03(火) 15:14
if(scanf("%d %d",&tanka,&kosuu)!=2)break;
1次元配列の課題なんだから配列使わにゃダメでしょ
変数配列を使わないんだったら
>>512 みたいにしないと
要するに 520(+521) だと全く動かないってことね 517 の表示部(printf 関数)だけを自分好みに変更すればヨロシ 時間があるなら一度コンパイルして試してみることをオススメ
524 :
デフォルトの名無しさん :2001/07/03(火) 15:34
>522 忠告ありがとう!!助かった~。
525 :
デフォルトの名無しさん :2001/07/04(水) 06:37
最近お姉さんを見ませんが、どうなさったのでしょう?
527 :
デフォルトの名無しさん :2001/07/04(水) 07:09
Σ(゚д゚lll)ガーン
528 :
デフォルトの名無しさん :2001/07/05(木) 12:47
#include <stdio.h> void main(void){ int bangou,saidai_bangou,goukei,soukei=0,tanka_hairetsu[10000],kosuu_hairetsu[10000],shouhizei,zeikomigaku; for(bangou=1;bangou<10000;bangou++){ if(scanf("%d %d",&tanka_hairetsu[bangou],&kosuu_hairetsu[bangou])!=2)break; } saidai_bangou=bangou; printf("番号\t単価\t個数\t合計\n"); for(bangou=1;bangou<saidai_bangou;bangou++){ goukei=tanka_hairetsu[bangou]*kosuu_hairetsu[bangou]; printf("%d\t%d\t%d\t%d\n",bangou,tanka_hairetsu[bangou],kosuu_hairetsu[bangou],goukei); soukei+=goukei; } shouhizei=soukei*0.05; zeikomigaku=soukei+shouhizei; printf("総合計 %d\n消費税 %d\n税込額 %d\n",soukei,shouhizei,zeikomigaku); } これでコンパイルしたんですが In function `main': 3: parse error before character 0241 5: `bangou' undeclared (first use this function) 5: (Each undeclared identifier is reported only once 5: for each function it appears in.) 5: parse error before `)' 11: `saidai_bangou' undeclared (first use this function) 11: parse error before `)' 17: `zeikomigaku' undeclared (first use this function) 17: `soukei' undeclared (first use this function) 17: `shouhizei' undeclared (first use this function) と表示されたんですがどうしましょう???
529 :
デフォルトの名無しさん :2001/07/05(木) 12:57
全角スペース消せ
530 :
デフォルトの名無しさん :2001/07/05(木) 22:28
全角スペースって_ここの部分ですよね? 消してもできないんですけど・・・
531 :
知りたがり矢 :2001/07/05(木) 22:31
「整数型の配列a[100]にキーボードから入力された整数を順に格納する。 ただし、0が入力されれば、そこで終わる。その後、配列aの内容を順に 出力するプログラムを作れ。」って問題教えてください。これできんと 単位が危ない・・・ どうぞ、よろしくお願いします。
>>530 #include <stdio.h>
void main(void){
int bangou,saidai_bangou,goukei,soukei=0,tanka_hairetsu[10000],kosuu_hairetsu[10000],shouhizei,zeikomigaku;
for(bangou=1;bangou<10000;bangou++){
if(scanf("%d %d",&tanka_hairetsu[bangou],&kosuu_hairetsu[bangou])!=2)break;
}
saidai_bangou=bangou;
printf("番号\t単価\t個数\t合計\n");
for(bangou=1;bangou<saidai_bangou;bangou++){
goukei=tanka_hairetsu[bangou]*kosuu_hairetsu[bangou];
printf("%d\t%d\t%d\t%d\n",bangou,tanka_hairetsu[bangou],kosuu_hairetsu[bangou],goukei);
soukei+=goukei;
}
shouhizei=soukei*0.05;
zeikomigaku=soukei+shouhizei;
printf("総合計 %d\n消費税 %d\n税込額 %d\n",soukei,shouhizei,zeikomigaku);
}
533 :
デフォルトの名無しさん :2001/07/05(木) 22:38
>>531 それができないとは・・・
そんなやつに単位はあげられないよ。
きちんと学んでくれ。
534 :
デフォルトの名無しさん :2001/07/05(木) 22:39
>>531 え?問題を教えればいいの?
「整数型の配列a[100]にキーボードから入力された整数を順に格納する。
ただし、0が入力されれば、そこで終わる。その後、配列aの内容を順に
出力するプログラムを作れ。」
これでいいかな?カンニングしてるみたいで気が引けるけど。
10 DIM a[100] 20 c = 0 30 if c = 100 goto *inputend 40 input "整数を入れてね", n 50 a[c] = n 60 if n = 0 goto *inputend 70 c = c + 1 : goto 30 80 *inputend 90 for a = 0 to c 100 print c, "番目の数 : ",a[c] 110 next 120 end goto のラベルの扱いはこれで良いんだっけか? あと、配列の要素番号の扱いも忘れたよ・・・。
536 :
知りたがり矢 :2001/07/05(木) 22:39
C言語でお願いします。「整数型の配列a[100]にキーボードから入力された整数を順に格納する。 ただし、0が入力されれば、そこで終わる。その後、配列aの内容を順に 出力するプログラムを作れ。」って問題教えてください。これできんと 単位が危ない・・・ どうぞ、よろしくお願いします。
537 :
知りたがり矢 :2001/07/05(木) 22:42
あえて言うと、for,while,do while 文でお願いします。
>>537 貴方のように自分で全く考えない人に単位を与えるという
ことは、それだけ社会に多大な迷惑をかけるということで
す。申し訳ありませんが、教える気には全くなりません。
539 :
先生 :2001/07/05(木) 22:49
>>536 特別サービス!
main()
{
int a[100],count;
count=input_dim(a);
output_dim(a,count);
}
input_dimは配列aにキーボードから入力された整数を順に格納する。
ただし、0が入力されれば、そこで終わる。戻り値は入力された要素数。
output_dimは配列aの内容をcount分だけ順に出力する。
for,while,do whileは自由に使ってくれ!
540 :
知りたがり矢 :2001/07/05(木) 22:49
あんたには聞いてへんわ。
541 :
知りたがり矢 :2001/07/05(木) 22:49
ナイスだ先生。面白かったよー。
親切なようでむごい539がスキ♥
ひょっとして奴はテストもしないで提出する気だろうか。。。
545 :
知りたがり矢 :2001/07/05(木) 22:59
いや、テストしたっすよ。全然でけへん
>>545 エラーの内容を書いてもらわないと答えようがないよ
547 :
ヴィジュアルC++ :2001/07/05(木) 23:04
--------------------構成: 2ch煽り - Win32 Release-------------------- コンパイル中... 2ch煽り.cpp C:\Documents and Settings\逝って良し\My Documents\cs\2ch煽り\2ch煽り.cpp(9) : error C2065: 'input_dim' : 定義されていない識別子です。 C:\Documents and Settings\逝って良し\My Documents\cs\2ch煽り\2ch煽り.cpp(10) : error C2065: 'output_dim' : 定義されていない識別子です。 C:\Documents and Settings\逝って良し\My Documents\cs\2ch煽り\2ch煽り.cpp(11) : warning C4508: 'main' : 関数に戻り値の型が指定されていません。戻り値を void 型と見なします。 cl.exe の実行エラー 2ch煽り.obj - エラー 2、警告 1
548 :
初必者 :2001/07/05(木) 23:05
今日一日Cの本と格闘しなさい。その上でどういう コードを書いて、どう上手くいかなかったのかを報 告してください。それならまだ教える気にもなるか もしれません。 #539をみておかしいとも思わないようならCの知識 #以前の問題ではあるが。なーんも考えてないって #ことだぞ。 あと、マジで殆どの皆は君のために言ってるってこ とを忘れずに。
550 :
知りたがり矢 :2001/07/05(木) 23:08
#include <stdio.h> void main(void); { int i; int a[100] for(i=0;i<100;i++){ printf("a[%d]",i); scanf("%d",&a[i]); } 自力ではここまでしかわかりません。0を入力したら、そこで終わり、 その後、配列aの内容を順に出力するプログラムがわかりません。
i=0;do{printf("a[%d]",i);scanf("%d",&a[i]);}while(a[i++]); for(i=0;i<100&&a[i]==0;i++)printf("%d ",a[i]);
i=0;do{printf("a[%d]",i);scanf("%d",&a[i]);}while(a[i++]); for(i=0;i<100&&a[i];i++)printf("%d ",a[i]); printf("\n");
>>553 a[100]に番人立てないと不味いんじゃ?
ゼロクリアされてれば良いけど。
i=0; do{ print~; scanf~; i++; }while(a[i-1]!=0&&i<99); a[i]=0; i=0; while(a[i]!=0){ print~; i++; } 漏れならこうだけど a[99]まで使う方法が思いつかんな
i=0;do{printf("a[%d]",i);scanf("%d",&a[i]);}while(a[i]&&99>i++); for(i=0;i<100&&a[i];i++)printf("%d ",a[i]); printf("\n");
>>556 i<100 にしたら減点対象
>>557 最初の while の a[i] と i++ の処理順は全ての処理系で一意なんだっけか
処理系により異なる可能性があるよ
560 と 561 は、どっちが正しいんだ? いや、どっちが正しいかはひとまず置いとくとして 採点する先生がどっちが正しいと思ってるか、だな
過剰なマルチステートメントはヤメロってことで ファイナルアンサー?
ごめん。 &&の前で式が一度完了するから、 つまり、処理順は一定。 561のいうとおりだった。
式が一度完了するって、経験則でなく言語仕様によって定められてるん?
だったら
>>555 は無視しておくんなまし
>>567 式が一度完了する、ってのは言語使用レベルでは定められてないかと。
(まあ一般的なコンパイラならそこで切ってくれるけど。多分)
どうころんでも、i++ が実行されるのはカッコ内の評価が完了してから
だから問題なし。
て優香、なんかこんなの真剣になってみんなで顔つき合わせるような話題じゃないと思うが。 いってみれば、隔離スレなんで、とっとと正解書いてお引取り願うというのはどうか?
>>564 つーか、アルゴリズムを示すのにマルチステートメントも何もねー
え、そう? 見づらい表記は机上デバグのミスに繋がると思うけど。
マルチステートメントって俺のこと? 面倒だったから適当に書いただけだぴょん つーか、仕様を満たしつつも、丸コピーはさせたくねーときって どうしてもわざとへんてこりんに書いちゃう癖があってね・・・
>>568 >i++ が実行されるのはカッコ内の評価が完了してから
は嘘じゃない? i=1; if(i++ && printf("%d",i)); で 2 が表示されるよ
左から順に評価され結果が得られたら完了、というのは K&R の 2.6 で納得
575 :
デフォルトの名無しさん :2001/07/07(土) 11:05
なんか書こうと思ったけど、そういう仕様の部分で悩む のは不毛なんで、やめた。評価順序とか使わなくて Basicでも正しく動作するように書けるんだから、 そうしたら?いろんな意味で正しくない? 冗長に書くのは悪くないと思うよ。
Basic でも、ってどういう意味?
難しく書くのはやめといた方がいいよね。 でも、人の書いたコードのバグを探るときとか こういう変なの読めないと出来ないことあるね。
578 :
デフォルトの名無しさん :2001/07/07(土) 13:25
Cで順列を表示するプログラムを作りたいのですが、 誰か教えて下さい。
>>578 意味不明
順列?
宿題なら自分でやれよ。
>>580 宿題だろうけどソートじゃないだろ。
int i;for(i=0;i<65565;i++)printf("%d,");
582 :
Pythonで・・・ :2001/07/07(土) 18:07
#!/usr/bin/python ''' このプログラムは 10,11,12,...20 までの数字について 10*10*10 + 11*11*11 + 12*12*12 + ...+ 20*20*20 を計算します。このプログラムを変更し1094から始まりその2倍に終る数字2188 について *1094*1094*1094 + 1095*1095*1095 + ...+ 2188*2188*2188 を計算してください。 ということをとある事情でしなければいけないのですがパイソンがよくわかりません。 どなたかよろしければ教えていただけませんでしょうか? よろしくお願いいたします。
1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536
584 :
デフォルトの名無しさん :2001/07/07(土) 21:14
>>575 Cの評価基準になれるとBasicでエラー起こすことあるよ。
Basicは(全部そうかはしらんけど)式は全部評価する。
あっあっだめだよお兄ちゃん。そこ関係ない。
586 :
デフォルトの名無しさん :2001/07/08(日) 00:27
>>584 ようするに言いたかったのは「ショートサーキット評価しない言語でも」
ということでBasicはその例として挙げたってだけ?
そうそう。それだけだけど、かなり移植に悩むことがあるよ。 無意味かな?
移植じゃなくて 簡単に分けて書いても って意味では?
589 :
デフォルトの名無しさん :2001/07/10(火) 20:58
,/^ヽ‐一^\ / __´_∀_`_) . | //ノ/ ノ ノ \) |ハ|( | ∩ ∩|)| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ヾ从ゝ_▽_从 < おにいちゃんおはよう!私が宿題をやっておいたよ☆ /丶 d V bノ ̄|⊃ \____________________ | ハ'\A/ ノ ̄ (___)_ 8 | ||^| |_ __ヽ 「 ̄ ̄ ̄|||_| L____」||_ |_ |___)_)
教えてくださいお願いします。 問題 学生の名前と一つの科目の試験の成績をメンバとする構造体を 作り、さらにライブラリ関数rand()を使ってそれを30個(学生 30人分)集めた配列として初期化する。(hint1.c を参照) 試験の成績の降順に整列して出力せよ。 hint1.c #include <stdio.h> #include <stdlib.h> #define SIZE 30 /* ここに何が入るか? */ void gen_str(char s[], int n); /* pro3-10-7.c を参照 */ void print_dat(struct student x[], int n); int main(void) { struct student group[SIZE], w; int i, j, max; for (i = 0; i < SIZE; i++) { gen_str(/* ここに何が入るか? */, rand() % 5 + 6); /* ここに何が入るか? */ = rand() % 101; } printf("整列前:\n"); print_dat(group, SIZE); /* ここに何が入るか? */ printf("整列後:\n"); print_dat(group, SIZE); return(0); } /* ここに何が入るか? */ void print_dat(struct student x[], int n) { int i; for (i = 0; i < n; i++) printf("%-15s%4d\n", x[i].name, x[i].point); }
591 :
デフォルトの名無しさん :2001/07/10(火) 21:18
>>590 ふざけんな!
~を参照 ってのを全部ここにもってこい!
無理矢理ヒストグラム作ってソートとかやろうと思ったけどやめた。
pro3-10-7です↓ #include <stdio.h> #include <string.h> #include <stdlib.h> void gen_str(char s[], int n); int main(void) { char x[11], y[11]; int z; gen_str(x, 10); gen_str(y, 10); printf("文字列1:%s\n", x); printf("文字列2:%s\n", y); z = strcmp(x, y); if (z < 0) printf("文字列1は文字列2より前。\n"); else if (z == 0) printf("文字列1と文字列2は等しい。\n"); else printf("文字列1は文字列2より後。\n"); return(0); } void gen_str(char s[], int n) { int i; for (i = 0; i < n; i++) s[i] = rand() % 26 + 'a'; s[i] = '\0'; }
594 :
デフォルトの名無しさん :2001/07/10(火) 22:45
,/^ヽ‐一^\ / __´_∀_`_) . | //ノ/ ノ ノ \) |ハ|( | ∩ ∩|)| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ヾ从ゝ_▽_从 < おにいちゃん、そんなのも分からないの?使い物にならねープログラマー。 /丶 d V bノ ̄|⊃ \____________________ | ハ'\A/ ノ ̄ (___)_ 8 | ||^| |_ __ヽ 「 ̄ ̄ ̄|||_| L____」||_ |_ |___)_)
596 :
デフォルトの名無しさん :2001/07/11(水) 00:25
だめかな・・・
>>590 最初のここに何か
studentという構造体の定義
要素は名前用バッファと得点
と、ソートする関数の宣言
次のここに何か
i番目の生徒構造体の名前
次の次のここに何か
i番目の生徒構造体の得点
次の次の次のここに何か
ソートする関数の呼び出し
次の次の次の次のここに何か
ソートする関数の実体
>>590 それ、うちの大学の期末課題…
こーゆーこというのもアレだけどさぁ、あの程度の授業解らないの
なら止めるか来年頑張った方がいいと思うよ。
600 :
デフォルトの名無しさん :2001/07/11(水) 02:44
>>599 どこの大学?都道府県名だけでいいから教えてくれへん?
>>599 あんたの言うとおりだよ。ちと目がさめたよ。
しかしなんだな、同じ大学の学生がいるかなと少しは思ってたけど
まさか本当にいるとはね(藁
602 :
デフォルトの名無しさん :2001/07/11(水) 02:59
大学の期末課題って.... 大学ってこのレベルなの?ちなみにどこ?
>>601 そか。基本さえ解っていればすぐ解る程度だから頑張れゃ。
>>599 ,603
まぁ文系のドキュソ大だから。
関西で、外見だけは異常に綺麗な大学、つーたらだいたい絞れるよ。
605 :
デフォルトの名無しさん :2001/07/15(日) 07:20
>>604 ,/^ヽ‐一^\
/ __´_∀_`_)
. | //ノ/ ノ ノ \)
|ハ|( | ∩ ∩|)| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ヾ从ゝ_▽_从 < もしかして、京都産業大学か?
/丶 d V bノ ̄|⊃ \____________________
| ハ'\A/ ノ ̄
(___)_ 8 |
||^| |_ __ヽ
「 ̄ ̄ ̄|||_|
L____」||_ |_
|___)_)
606 :
デフォルトの名無しさん :2001/07/15(日) 07:38
,/^ヽ‐一^\ / __´_∀_`_) . | //ノ/ ノ ノ \) |ハ|( | ● ●|)| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ヾ从ゝ_▽_从 < もしかして、京都産業大学か? /丶 d V bノ ̄|⊃ \____________________ | ハ'\A/ ノ ̄ (___)_ 8 | ||^| |_ __ヽ 「 ̄ ̄ ̄|||_| L____」||_ |_ |___)_)
京産ヨリモ ドキュソ ダヨ...
そういえばもうレポートの提出日は過ぎてるな。
>>590 は結局できたんだろうか。
609 :
デフォルトの名無しさん :2001/07/17(火) 18:31
宿題がさっぱりわかりません。助けてください。明日(水曜)提出日なんです。 課題 2個の整数を入れ替える関数を用いてバブルソートに基づいて10個の整数を昇順に並び替えるプログラミング。 フローチャートはわかってます。見にいくですが以下の通りです。ソートするexchという関数を作るってのがメインです。 strat ---------- | ----- ループ1 i=0から9 ---------- | ---------- 入力 hyo[i] ---------- | ---------- ループ1 ---- | ----- ループ2 i=8から0 ---------- | ----- ループ3 j=0からi ---------- |
610 :
デフォルトの名無しさん :2001/07/17(火) 18:32
| -------------- /分岐 /hyo[j] > hyo[i] /---------------- N------- |Y | ----------------------- | |exch(hyo[j],hyo[j+1]| | ----------------------- | | | |<-------------------------- ---------- ループ3 ---- | ---------- ループ2 ---- | ----- ループ4 j=0から9 ---------- | ---------- 入力 hyo[i] ---------- | ---------- ループ4 ---- | --------- END 改行が多いと出たので2つに分けさせてもらいました。よろしくおねがいします。
611 :
デフォルトの名無しさん :2001/07/17(火) 18:49
>>609 endで終わってるって事はpascalかい?
だったら交換はこう書くのが作法さ
procedure exch(var x,y:integer);
begin
x:=x+y;
y:=x-y; //x+y-yだからxになるよ
x:=x-y;//x+y-xだからyになるよ
end;
メインはフローチャートの通りならこうだろうね。 var i,j:integer; var hyo[0..9]:integer; begin for i:=0 to 9 do begin write(i,' ='); readln(hyo[i]); end; for i:=8 downto 0 do for j:=0 to i do begin if hyo[j]> hyo[i] then exch(hyo[j],hyo[j+1]); end; for i:=0 to 9 do write(hyo[i]); end. さあ、これが動くのかなあ・・・
613 :
609 :2001/07/17(火) 23:21
>>611 すんません。C言語です。このスレC限定じゃなかったのですね。申し訳ないです。
一応自分でやったとこまで。
main()
{
int hyo[10];
int i,j;
for(i=0; i<10; i=i+1){
printf("%d個目の数字を入力せよ>>",i+1);
scanf("%d",&hyo[i]);
}
for(i=8; i>0; i=i-1){
for(j=0; j<i; i=1+1){
if( hyo[j] > hyo[i]){
getch();
exit(0);
}
授業で習ったことで、メイン関数を先に書くと1つ制約?が出るらしいので、個人的にはexch関数を先に書きたいです。
614 :
デフォルトの名無しさん :2001/07/18(水) 03:08
どなたかこんな宿題解いてみてもらえませんか?? もうさっぱりです。明後日,提出日なんです。 pent minoのすべての可能な配置を数えて1,101,201・・・・ 番目の解を出力するプログラムを作れ。ただしfield(pent minoを 配置する盤のサイズは60マスで形は自由とする。) どーかお願いいたします。
pent minoって何?
616 :
デフォルトの名無しさん :2001/07/18(水) 04:18
ペントミノは5つの正方形からなる駒です。 これを60マスにすきまなく埋めていくプログラムをつくりたいんです。 バックトラックを使うらしいのです。。。
>>614 解くだけなら全数あたるのつくれ。
多分何年もかかると思われるが、正解は正解なはずだ。
それ以外はそれぞれの状態の状態空間を持っていて、
遷移せなあかんのだが、おそらく614さんには無理っぽい。
(ごめんね)
あとは、問題のスキをついて、超簡単な問題に変形しろ。
ペントミノの形を全部シンプルにするとかね。
つまり、60個のタイルからなる任意の形の図形を、5マスずつ12個に分割 するプログラムを書くということか。。。 んん、時間ないからプログラム書いてられないが 1.左上からスタート 2.ある一つの方向に進む。(もし駄目だったら再帰的にここに戻ってきて別の方向に進む) 動いたところをマークする 3、5マス動いたら 3.1 今まで動いたところで分割されている領域を調べ、そこで分割した領域のサイズが 5の倍数でないところがあったら、失敗。一つ前に動いたところに戻り、別の方向に 進む。この時一歩前が全ての方向に進んでいたら、もう一歩前に戻る。 3,2 まだ移動してないところに移動して2へ こういう風にやれば可能? あまり考えないで書いてるけど
追記 年のため、2の途中で進むところがなくなったら当然失敗ね。一歩前に戻りましょう。
あと、蛇足だけど 高速化したければ、今埋められてる部分をキーにして、残りの分割パターンが どういうのがあるか、というハッシュテーブルを使うのが吉。 まあ、一日でそこまでできないだろうけど。
621 :
デフォルトの名無しさん :2001/07/18(水) 13:05
60マスって形は自由ってのは長方形以外もあるという事? 長方形なら 60=2*2*3*5 だから 1x60,2x30,3x20,4x15,5x12,6x10 の6通り ペントミノは12通り 1x5 □□□□□ 2x3 □□ □ □ □□□ □□□ 2x4 □ □ □□ □□□□ □□□□ □□□ 3x3 □ □ □ □ □ □ □ □ □□□ □□□ □□□ □□ □□□ □□□ □ □ □ □□
622 :
デフォルトの名無しさん :2001/07/18(水) 13:09
たぶん問題は、この12個を全て1個づつ使って 3x20,4x15,5x12,6x10 の4通りの箱に詰めるというんじゃないの?
んー、だとすると100個以上も解のパターンあるかな? 60マスを12*5にわけるって解釈でいい気がするけど。
回転をどうするかにもよるけど数千通り解があるでしょ
だから、きちんと解こうとすると1日では無理っぽい。 スキル次第だけど、回答を出すという目的で最適化するなら、 出題の甘いところをつくしかないと思うのだが。 ちゃんと解くのはバックトラックっなんて考えないで、 縦型探索で、破綻したときにその枝探さないようにすればOK。 状態空間を差分で積んだりするテクはあると思うが力任せが 吉。あ、プログラム毎に100番目とか絶対試さないと思うから 手作業で2種類解を作って、全探索プログラム書いてもいいかも。
626 :
デフォルトの名無しさん :2001/07/18(水) 14:12
60マスというのは12*5とか1つだけに絞っていいみたいです。 やっぱりこのプログラムは長いんですかねー?60マスというのは12*5とか1つ
で 言語は何? C? C++ ? Pascal? Java?
628 :
デフォルトの名無しさん :2001/07/18(水) 14:45
Cです。
まずはデータの持ち方を考える事だね 2次元はややこしいから、1次元で考える事にしてみる 当然全部のペントミノに番号を振って 6*10に絞るなら □□□□□ A:0,1,2,3,4 □□ □ □ B:0,1,10,11,12 C:0,2,10,11,12 □□□ □□□ てな調子で配列にして、回転、反転も最初にリストしとく 0,1,2,10,11 の回転は ,0,1,10,11,20,1,10,11,12,1,10,11,20,21 てな感じね 全部リストしたら、 ソートして重複があったら消去しとく これを サイズ60の1次元配列にどう収めるという問題だから 左端には、先頭がゼロの要素しか持って来れない たとえば、C:0,2,10,11,12を持ってきたら 0,2,10,11,12番地にCと書く C空C空空・・・てな調子 空き番地の先頭1番地から見ると次の空きは2だから リストから先頭が0で2番目が2のもの、先頭が1で2番目が3のものを探す これは見つからないからバックトラックして・・・
置く場所を 6x12 ではなくて、(6+4+4)x(12+4+4) 個にしたら どうかな。んで外側はあらかじめ埋めとく。こうすりゃ 範囲チェックしなくていいと思うんだけど。
#include <stdio.h> const _YS=10; struct _ptm { char n ;char d[5]; int maxx(void){int x=d[0]%_YS; for(int i=1;i<5;i++)if(d[i]%_YS>x)x=d[i]%_YS;return x;}; int maxy(void){int y=d[0]/_YS; for(int i=1;i<5;i++)if(d[i]/_YS>y)y=d[i]/_YS;return y;}; void dbg_print() { char dd[60]={0,}; for(int i=0;i<5;i++)dd[d[i]]=n;int mx=maxx();int my=maxy(); for(int y=0 ;y<=my;y++) {for(int x=0;x<=mx;x++) if (dd[x+y*_YS] )putchar(n);else putchar(' ');puts(""); } } }; int ptn=12; //全部の回転と反転したパターンの個数 _ptm pt[12*4*2]={ {'I',{0,1,2,3,4}}, {'L',{0,1,2,3,10}}, {'F',{0,1,2,3,11}}, {'D',{0,1,2,10,11}}, {'C',{0,1,2,10,12}}, {'M',{0,1,11,12,13}}, {'N',{0,10,11,12,22}}, {'W',{0,10,11,21,22}}, {'V',{0,10,20,21,22}}, {'X',{1,10,11,12,21}}, {'G',{1,10,11,12,22}}, {'T',{1,11,20,21,22}}, } ; _ptm rot(_ptm &pt) { _ptm r;r.n=pt.n; int my=pt.maxy(); for(int i=0;i<5;i++) r.d[i]=(pt.d[i]%_YS)*_YS +(my - (pt.d[i]/_YS)); return r; } _ptm rev(_ptm &pt) { _ptm r;r.n=pt.n; int my=pt.maxy(); for(int i=0;i<5;i++) r.d[i]=(pt.d[i]%_YS) +(my - (pt.d[i]/_YS))*_YS; return r; } void add(_ptm p) {int i,j; for(i=0;i<ptn;i++) { for(j=0;j<5;j++) { if (p.d[j]>pt[i].d[j])goto next; if (p.d[j]<pt[i].d[j]) { for(j=i;j<ptn;j++){_ptm w=pt[j];pt[j]=p;p=w;}; pt[ptn++]=p; return; } } return; next:; } pt[ptn++]=p; }
んで、618,621どっちの解釈が正しいの?
void init(){ for(int i=0 ;i<12 ;i++) { _ptm r=pt[i]; add(rev(r)); r=rot(r);add(r);add(rev(r)); r=rot(r);add(r);add(rev(r)); r=rot(r);add(r);add(rev(r)); } }
634 :
デフォルトの名無しさん :2001/07/18(水) 16:37
なるほど!!分かります。 でも、具体的にはどうしよう。どうすれば。
いえ6*10の長方形ですみたいです。 さっき先生にきいてきました。 ほとんどの生徒が解けてないそうです。
636 :
デフォルトの名無しさん :2001/07/18(水) 16:43
ああっ 変な名前になってしまった。 すいません。みなさん。
>>635 いや、12種類のタイル使う必要があるかという話
638 :
デフォルトの名無しさん :2001/07/18(水) 17:13
はい。 12種類のペントミノを使って6*10のマスを 埋めるプログラムです。
639 :
デフォルトの名無しさん :2001/07/18(水) 17:15
あまりに分からないのでネット上で手本がないか 探してみたんですけどバックトラックを使ったプログラムは ありませんでした。
addの修正ね void add(_ptm p) {int i,j; for(j=0;j<4;j++) for(i=j;i<5;i++) {if(p.d[j]>p.d[i]){int w=p.d[i];p.d[i]=p.d[j];p.d[j]=w;}; }
bool check(_ptm p,int a,char *m) { if(p.maxx() + (a%_YS) >= _YS) return false; for(int i=0;i<5;i++) if( p.d[i]+a>=60|| m[p.d[i]+a]) return false; return true; } void poke(_ptm p,int a,char *m) { for(int i=0;i<5;i++) m[p.d[i]+a]=p.n; } struct base{ _ptm pt[64]; char m[60]; base::base (){for (int i=0;i<60;i++)m[i]=0;}; int zp(){int i;for(i=0;i<60;i++)if(m[i]==0) return i;return i;}; void dbg_print() { char *p=m; for(int x=0 ;x<60/_YS;x++) {for(int y=0 ;y<_YS;y++,p++) if(*p)putchar(*p);else putchar(' ');puts(""); } } } ; int n=0; void func(base b,int no,int st) { poke(b.pt[no] , st , b.m); char c= b.pt[no].n; for(int i=0;i<ptn ;i++)if (b.pt[i].n==c)b.pt[i].n=0; int zp=b.zp(); if(zp>=60) { b.dbg_print();printf("%5d\n",n++); return ; } int y0=zp%_YS; for(int i=0;i<ptn ;i++) if (b.pt[i].n) {int yc= b.pt[i].d[0]; if(y0>=yc) if(check(b.pt[i],zp-yc,b.m) ) func(b,i,zp-yc); } }
int main(int argc, char* argv[]) { base b; init(); for(int i=0;i<ptn ;i++)b.pt[i]=pt[i]; for(int i=0;i<ptn ;i++) { if(check(b.pt[i],0,b.m) ) func(b,i,0); else break; } puts("end"); getchar(); return 0; } これでおわり
643 :
デフォルトの名無しさん :2001/07/18(水) 18:16
どこからどこまでがしっかりした答え なのかよくわからないんです。 場所を丁寧におしえてもらえませんか? 馬鹿ですみません。
さあ? めんどくさいから 自分で探して 自分でバグも取ってね とりあえずサービス void init(){ for(int i=0 ;i<12 ;i++) { _ptm r=pt0[i]; add(r);add(rev(r)); r=rot(r);add(r);add(rev(r)); r=rot(r);add(r);add(rev(r)); r=rot(r);add(r);add(rev(r)); } printf(" ptn=%5d\n",ptn); }
ようするに、左上から、12個のピースを順に置きながら 全部の組み合わせを試して、いけばいい 再帰的に 次を調べる( 状態, ピース , 詰める場所) { ピースを嵌める(状態, に ピース 詰める場所) 左上に、残ったピース全てを置いてみて if(置けるなら) 次を調べる(状態,ピース,場所) } となる。 原理は総当りだから簡単だよ
次から618のやり方ね。make_field()とcomplete()を書き換えればどんなフィールドにも 対応できるかと。 バックトラックをきっちり使ってるが。
#include<stdio.h> int a[60][60]; /* フィールドを表す配列。1のとこのみ配置可能 */ int b[60][60]; int c[60][60]; int p,s; /* フィールドの形決定。形変えたければここを変える。今回は10*6 */ int make_field(){ int k,l; for(k=0;k<60;k++){ for(l=0;l<60;l++){ if(k<10 && l<6){ a[k][l] = 1; }else{ a[k][l] = 0; } } } } /* 初期化 */ int init_field(){ int k,l; for (k = 0; k < 60; k++) { for (l = 0; l < 60; l++) { b[k][l]=a[k][l]; } } }
int large_of_field(int x, int y){ int ans; ans = 1; if(x<0 || y<0 || x>=60 || y>=60) return 0; if(c[x][y] != 1) return 0; c[x][y]=0; ans = ans + large_of_field(x - 1, y); ans = ans + large_of_field(x + 1, y); ans = ans + large_of_field(x, y - 1); ans = ans + large_of_field(x, y + 1); return ans; } /* これからどうがんばっても不可能な形に分断されてないか */ int check_field() { int k, l, ks, ls, breakflag,cc; for(k=0;k<60;k++){ for(l=0;l<60;l++){ c[k][l] = a[k][l]; } } do{ breakflag = 1; for(k=0;k<60 && breakflag;k++){ for(l=0;l<60 && breakflag;l++){ if(c[k][l] == 1){ ks = k; ls = l; breakflag = 0; } } } if(breakflag) return 1; cc = large_of_field(ks, ls); if(cc % 5 != 0) return 0; }while(1); }
int backtrack(int x, int y, int d){ if(x<0 || y<0 || x>=60 || y>=60) return 0; if(b[x][y] != 1) return 0; b[x][y]=p; if(d==5){ start_piece(); b[x][y] = 1; return 1; } backtrack(x-1,y,d+1); backtrack(x,y-1,d+1); backtrack(x+1,y,d+1); backtrack(x,y+1,d+1); b[x][y] = 1; return 1; } int complete(){ int k, l; s++; if((s-1)%100 == 0){ for(k=0;k<10;k++){ for(l=0;l<6;l++){ if(b[k][l] == 0) { putchar('#'); }else{ putchar(95+b[k][l]); } } printf("\n"); } printf("\n"); } }
int start_piece(){ int k,l,ks,ls,breakflag; if(!check_field()) return 0; p++; for(k=0;k<60 && breakflag;k++){ for(l=0;l<60 && breakflag;l++){ if(b[k][l] == 1){ ks = k; ls = l; breakflag = 0; } } } if(breakflag){ complete(); p--; return 1; } backtrack(ks, ls, 1); p--; return 1; } main(){ make_field(); init_field(); p = 1; s = 0; start_piece(); }
まあ、がんばって解読してくれ
652 :
デフォルトの名無しさん :2001/07/18(水) 19:08
解読できません。どなたか助けてーください。
654 :
デフォルトの名無しさん :2001/07/18(水) 19:17
655 :
デフォルトの名無しさん :2001/07/18(水) 19:18
分かりました。こんなにお世話してもらってどうも すみませんでした。ありがとうございました。
上のプログラムを実行させてみて気づいたが、 あまりに答え多すぎるんで、やっぱ全てのパーツを一回ずつ使う んだろうなぁ。
#include <stdio.h> const _XS=12; //10,12,15,20 struct _ptm { char n ;int d[5]; int mx,my; int maxx(int XS){int x=d[0]%_XS; for(int i=0;i<5;i++)if(d[i]%XS>x)x=d[i]%XS;return mx=x;}; int maxy(int XS){int y=d[0]/_XS; for(int i=0;i<5;i++)if(d[i]/XS>y)y=d[i]/XS;return my=y;}; void dbg_print() { char dd[60]={0,}; for(int i=0;i<5;i++)dd[d[i]]=n;int mx=maxx(_XS);int my=maxy(_XS); for(int y=0 ;y<=my;y++) {for(int x=0;x<=mx;x++) if (dd[x+y*_XS] )putchar(n);else putchar(' ');puts(""); } } }; const _XS0=10; _ptm pt0[12]={ {'I',{0,1,2,3,4}}, {'L',{0,1,2,3,10}}, {'F',{0,1,2,3,11}}, {'D',{0,1,2,10,11}}, {'C',{0,1,2,10,12}}, {'M',{0,1,11,12,13}}, {'N',{0,10,11,12,22}}, {'W',{0,10,11,21,22}}, {'V',{0,10,20,21,22}}, {'X',{1,10,11,12,21}}, {'G',{1,10,11,12,22}}, {'T',{1,11,20,21,22}}, } ; _ptm rot(_ptm &pt) { _ptm r;r.n=pt.n; int my=pt.maxy(_XS0); for(int i=0;i<5;i++) r.d[i]=(pt.d[i]%_XS0)*_XS0 +(my - (pt.d[i]/_XS0)); return r; } _ptm rev(_ptm &pt) { _ptm r;r.n=pt.n; int my=pt.maxy(_XS0); for(int i=0;i<5;i++) r.d[i]=(pt.d[i]%_XS0) +(my - (pt.d[i]/_XS0))*_XS0; return r; } bool check(_ptm p,int a,char *m) { if(p.mx + (a%_XS) >= _XS) return false; for(int i=0;i<5;i++) if( p.d[i]+a>=60|| m[p.d[i]+a]) return false; return true; } void poke(_ptm p,int a,char *m) { for(int i=0;i<5;i++) m[p.d[i]+a]=p.n;}
struct base{ int ptn; _ptm pt[64]; char m[60]; base::base (){for (int i=0;i<60;i++)m[i]=0;}; int zp(){int i;for(i=0;i<60;i++)if(m[i]==0) return i;return i;}; void dbg_print() { char *p=m; for(int x=0 ;x<60/_XS;x++) {for(int y=0 ;y<_XS;y++,p++) if(*p)putchar(*p);else putchar(' ');puts(""); } } void del(char c) {int i,j; for(i=j=0;i<ptn;i++) if(pt[i].n!=c)pt[j++] = pt[i]; ptn=j; } void add(_ptm p) { for(int i=0;i<5;i++) { int x= (p.d[i]%_XS0); int y= (p.d[i]/_XS0); if (y>=60/_XS) return ; if (x>= _XS) return ; p.d[i]=y*_XS +x; } p.maxx(_XS); p.maxy(_XS); int i,j; for(j=0;j<4;j++) for(i=j;i<5;i++) {if(p.d[j]>p.d[i]){int w=p.d[i];p.d[i]=p.d[j];p.d[j]=w;}; } for(i=0;i<ptn;i++) { for(j=4;j>=0;j--) { if (p.d[j]>pt[i].d[j])goto next; if (p.d[j]<pt[i].d[j]) { for(j=i;j<ptn;j++){_ptm w=pt[j];pt[j]=p;p=w;}; pt[ptn++]=p; pt[i].dbg_print();puts(""); return; } } return; next:; } pt[ptn++]=p; p.dbg_print();puts(""); } void init(){ ptn=0; for(int i=0 ;i<12 ;i++) { _ptm r=pt0[i]; add(r);add(rev(r)); r=rot(r);add(r);add(rev(r)); r=rot(r);add(r);add(rev(r)); r=rot(r);add(r);add(rev(r)); } printf(" ptn=%5d\n",ptn); } } ;
void func(base b,int no,int st) { poke(b.pt[no] , st , b.m); b.del(b.pt[no].n); int zp=b.zp(); if(zp>=60) { b.dbg_print();printf("%5d\n",n++); return ; } int x0 = zp%_XS; for(int i=0;i<b.ptn ;i++) if (b.pt[i].n) { int xc= b.pt[i].d[0];int zp0=zp-xc; if(60 <= b.pt[i].d[5-1]+zp0) break; if(x0 >= xc) if(_XS > b.pt[i].mx+x0-xc) if(check(b.pt[i],zp0,b.m) ) func(b,i,zp0); } } //--------------------------------------------------------------------------- int main(int argc, char* argv[]) { base b; b.init(); for(int i=0;i<b.ptn ;i++) { if(b.pt[i].d[0]==0) if( check(b.pt[i] , 0 , b.m ) ) func(b,i,0); } return0; }
こりゃあC++じゃないのか? Cにしては違和感ありすぎのソースだが?
661 :
ダメ人間 :2001/07/19(木) 08:27
初めて書き込みします。 静的スライスのプログラムを作りたいんですがどのように作ったらいいでしょうか? 静的スライスはプログラムから(v(変数名)、s(文))に影響を与える文を 以下の2つの関係を使って抜き出すものです ・CD関係 ・文aが条件文である ・文bの実行は文aの結果に依存する 以上の2つの条件を満たしたとき文aから文bにCD関係があるという EX s: if(c<0) t: a=4; u: b=5; tからs,uからsにCD関係がある ・DD関係 ・文aで変数vを定義している ・文bで変数vを参照している ・文aから文bへ実行可能なパスが少なくともひとつは存在し、かつ そのパスにおいて文aから文bの間に変数vを定義している文が存在しない 以上の3つの条件が満たされたとき文aから文bへDD関係があるという ex 1: a=3; 2: if(c<0) 3: a=6; 4: printf("%d",a); 文3から文4へDD関係がある。文1もc>=0のとき文4に定義が到達するので 文1から文4へDD関係がある。 例えば下のプログラムの(a,11)に関するスライス 1: #include<stdio.h> 2: main(){ 3: int a,b,c; 4: scanf("%d",&a); 5: scanf("%d",&b); 6: scanf("%d",&c); 7: if(c<0) 8: a=5; 9: else 10: b=4; 11: printf("%d",a); 12: printf("%d",b);} 結果 1: #include<stdio.h> 2: main(){ 3: int a,b,c; 4: scanf("%d",&a); 5: 6: scanf("%d",&c); 7: if(c<0) 8: a=5; 9: 10: 11: printf("%d",a); 12: } プログラムの書いたファイルを読み込んで静的スライスを出力したいんですが どうしたらよいでしょうか?よろしくお願いします
662 :
ダメ人間 :2001/07/19(木) 08:49
少し書き足りなかったです。 DD関係のところなんですが「以上の3つの条件が満たされたとき 文aから文bへ変数vに関してDD関係がある」が正しいです。 例のところでも変数aに関してです。 あとCD関係の例なんですがif(c<0){ です。 { が抜けてました。 あと(v(変数名)、s(文))に関するスライスとは、(v(変数名)、s(文)) からCD,DD関係を逆にたどって到達できる文の集合です。 (a,11)の例だと 8から11に変数aについてDD関係がある。 7から8にCD関係がある 6から7に変数cについてDD関係がある あと 4もc>=0のとき11に定義が到達するので 変数aに関してDD関係がある よって結果のとおりになります よろしくおねがいします
マルチステートメントやgotoは無視でオケ?
664 :
ダメ人間 :2001/07/19(木) 14:57
goto文は無視でオッケーです。 マルチステートメントってなんですか? すいません、あんま詳しくないので。 よろしくお願いします
665 :
ダメ人間 :2001/07/19(木) 15:06
あとifのほかにもちろんwhile文も条件文になります。
666 :
ダメ人間 :2001/07/19(木) 15:52
> EX s: if(c<0) > t: a=4; > u: b=5; > tからs,uからsにCD関係がある if{ が正しいです。あとtからs,uからsではなくて, 「sからt,sからuにCD関係がある」が正しいです、すいません。 もしif{ の{ がなかったら「sからtにCD関係がある」になります
前処理として文法解析が必要だと思うが、 どの程度作ればいい? Cの文法を完全にこなす必要があるとすると、ちと面倒。 課題の前提として用意してあると助かるが、 そこまで出題者が考えているか…
たとえば
>>661 の例で
4行目のscanf("%d",&a); が変数aを定義していると言うことは、
簡単には分からないと思うが。
その判断処理はあらかじめ用意されているのなら、
手頃な課題だと思うので、そう期待したいところ。
669 :
ダメ人間 :2001/07/19(木) 23:08
スライスでは「変数aを定義する」とはa=・・となる文です。 結局scanf("%d",&a)もaに値を代入する、つまりa=・・となるので 定義している文となります。参照するとは・・=aという文章です。 printf("a",%d)も結局aを参照しているので参照している文になります。
670 :
ダメ人間 :2001/07/19(木) 23:18
>Cの文法を完全にこなす必要があるとすると、ちと面倒。 デフォルトの名無しさんレスありがとうございます。 完璧なのをつくっていただけるならうれしいです。 自分はどうやって手をつけていいかまったく分からないんです。 go to文、continue文、break文がないプログラムを読み込んで 静的スライスが出力されればいいです。 もう1例書いときます
671 :
ダメ人間 :2001/07/19(木) 23:28
1 #include<stdio.h> 2 int a,b,c,d; 3 int Square(int x) 4 { 5 return(x*x); 6 } 7 int Cube(int x) 8 { 9 return(x*x*x); 10 } 11 void main(){ 12 printf("Squared Value?"); 13 scanf("%d",&a); 14 printf("Cubed Value?"); 15 scanf("%d",&b); 16 printf("Select!! Square:0 Cube:1); 17 scanf("%d",&c); 18 if(c=0) 19 d=Square(a); 20 else 21 d=Cube(b); 22 if(d<0) 23 d=-1*d; 24 printf("%d",d); 25 }
672 :
ダメ人間 :2001/07/19(木) 23:29
(d、24)に関する静的スライス結果 1 #include<stdio.h> 2 int a,b,c,d; 3 int Square(int x) 4 { 5 return(x*x); 6 } 7 int Cube(int x) 8 { 9 return(x*x*x); 10 } 11 void main(){ 12 13 scanf("%d",&a); 14 15 scanf("%d",&b); 16 17 scanf("%d",&c); 18 if(c=0) 19 d=Square(a); 20 else 21 d=Cube(b); 22 if(d<0) 23 d=-1*d; 24 printf("%d",d); 25 }
673 :
ダメ人間 :2001/07/19(木) 23:50
23,21,19→24(DD関係) 19、21→23(DD関係) 22→23(CD関係) 19、21→22(DD関係) 18→19、21(CD関係) 17→18(DD関係) 13→19(DD関係) 15→21(DD関係) よってこの場合は実質プログラム全部です
674 :
ダメ人間 :2001/07/20(金) 00:03
あと条件文も参照ということになります。 下の例だと文2でcを参照している 1から2へ変数cに関してDD関係がある 1 scanf("%d",&c); 2 if(c=0) 3 d=3; while文も同様です 1 i=1; 2 while(i<10){ 3 i++; 4 a=a+1;} この場合は1から2、3から2へ変数iに関してDD関係があるとなります よろしくお願いします
675 :
デフォルトの名無しさん :2001/07/21(土) 12:23
ダメみたいだね
ぱっと聞いて「めんどくさそー」って印象が先に出ちゃう課題だからねぇ・・・
677 :
デフォルトの名無しさん :2001/07/21(土) 16:43
こういう問題は分解して単機能単位で聞くのがベストだよな。 問題まったく読んでないけど。
ペントミノ みたいに、単純に面白そうなら 多少めんどくさくても答えは出るんだけどねえ 単にめんどくさいだけじゃなあ
ペントミノ は
>>621 のレスが大きいよな 視覚的にさ
680 :
デフォルトの名無しさん :2001/07/22(日) 06:39
ファイル名を入力して ファイルの大きさ(バイト数)を出力するプログラムって どうやって作るんですか?
print -s $ARGV[0];
682 :
デフォルトの名無しさん :2001/07/22(日) 10:33
ありゃ、スレ間違いだ
685 :
ダメ人間 :2001/07/22(日) 13:20
>前処理として文法解析が必要だと思うが、 >どの程度作ればいい? go to 文などがない簡単なプログラムを読み込んで出力できるのでいいんでお願いします どうしても提出しなきゃならないので・・・・・・。
686 :
ダメ人間 :2001/07/22(日) 13:21
まずCD関係とDD関係をプログラムから解析するにはどうしたら いいんでしょうか?
>>686 そういうときはさ、
>>661 を参照、とか、せめて何かポインタ示さないと
誰もついてこないし解答もヒントもくれないぞ(大爆笑)
688 :
ダメ人間 :2001/07/22(日) 13:34
>>687 あんま書き方とか分かってないのですいません
>>686 CD関係は、普通にif文みつけて、括弧が及ぶ範囲調べればいいんでは?
DD関係については、まずフロー解析してフローのグラフを作らないといけ
ないと思う。
18行目からは19行目と21行目に飛ぶ可能性があるという感じで。
で、ある変数について調べていく。
このとき使われる部分から上で作ったグラフを再帰的に逆に辿っていき、
定義されている部分まで辿っていくことで、DD関係を見つける。
もちろんこれをやる前には字句・構文解析、はしないといけないが。
689の追記。 DD関係みたいな話は、コンパイラではレジスタの割り振りとかのためにしないと いけない話だから、コンパイラ関係の本を読んでみるのもいいかもしれない。 上で言ったやり方よりも、もうちょっとエレガントなやり方ものってる。
>>686 一度も使われていない変数を参照した場合とかは、どうするんだ?
692 :
デフォルトの名無しさん :2001/07/27(金) 17:09
再帰的下向き構文解析では、左再帰性をもつ生成規則を扱うことができない理由 とはなんでしょうか?
693 :
デフォルトの名無しさん :2001/07/27(金) 17:21
695 :
test :2001/07/31(火) 13:46
test
696 :
ダメ人間 :2001/07/31(火) 13:59
>>689 レスありがとうございます。
CD関係とDD関係をエッジ、文をノードとする有向グラフをつくり、スライシング基準
(v,s)(どの文{s}のどの変数{v}に関するスライスをもとめるか?)のノードから逆に
有向辺をたどって得られるノードの集合が求める静的スライスなんですが、
これをプログラムでどうやって書いたらいいかがさっぱりなんです。
697 :
ダメ人間 :2001/07/31(火) 14:03
>>689 「あるプログラムを読み込んでCD関係やDD関係を解析する」
ということをCまたはJAVAでどう書いたらいいんでしょうか?
相当長いプログラムになるんでしょうか?
698 :
ダメ人間 :2001/07/31(火) 14:10
追記 「あるCのプログラムを読み込んで・・・」 です。
699 :
デフォルトの名無しさん :2001/08/02(木) 04:29
C言語で二つの任意の集合を入力して和集合と積集合を表示させるプログラムを教えてください。 範囲は1から50までです。 例えば A=1,3,5,6,10,20 B=1,4,5,8,9,15, と入力すると 和集合:1,3,4,5,6,8,9,10,15,20 積集合:1,5,10,15 と表示されるようにしたいのです。 お願いします。
700 :
デフォルトの名無しさん :2001/08/02(木) 04:32
>>699 1 配列(a[],b[],flag1[51],flag2[51])を用意する。
2 入力された文字列を正しく配列(a,b)に格納する。
3 aとbの配列の要素に応じてflag1,flag2を変化させる。
4 flag1,flag2の結果を表示する。
5 その他。
プログラムの流れを簡単に区切ると、こんな感じになると思うので、
これで、分かる部分だけ作って、分からない部分は、
作った部分を全て明かしてから、改めて聞くと吉。
ファイルマージと同じで、双方をソートしておいて
それぞれのトップを比較しては小さい方を読む 方法で頑張れ
>>699
>>699 入力を格納するところが一番面倒そうな気がするけど、
入力はどうやって与えられるの?
標準入力から、A=1,3,5,6,10,20
という風に入力されるん?
>>699 入力はソートされていると考えて良いのか?
1,3,10,5,6
とかみたいな入力もあり?
>>696 >>697 相当長いです。
でてくる命令全てについて、プログラムを書かないといけないわけですから。
まず、ifやfor等の分岐となるものについての解析が必要です。
このとき、ifがtrueならばどこにとぶのか、elseならどこにとぶのか、
など、何行目→何行目へと飛ぶという流れをつかまなければいけません。
このとき、この行はif分だとか、そういう構文解析をしないといけないので、
その辺がやたらダルいです。
何行目→何行目というのは、エレガントではないですがm行のプログラムを
読むなら、m*mの配列を用意して、飛ぶかもしれない、飛ばないかもしれない、
という形で表現してもいいでしょう。逆に辿るときに簡単ですので。
また、各行について、その行で定義されてる変数、及びその行で使われている
変数というのを解析しないといけないと思います。これもめんどくさいので、
変数の種類をnとしたら、m*nの配列を用意して、無関係、定義、使用という
情報を記憶するのがいいかと。
ここまで下準備ができたら、あとは
>>699 に書いたように、バックトラック
しながら逆に辿るだけでいいとは思いますが・・・
とりあえず、構文解析が面倒ですよね。構文解析はコンパイラの本に色々
のっています。・・とてもじゃないけど、ここで説明できる内容ではないので・・
706 :
デフォルトの名無しさん :2001/08/02(木) 16:23
ネットでの音楽配信サービスなどで「視聴することはできるがコピーすることはできない技術」みたいなのがありますが本当にコピーできないんですか? デジタルデータをPCにダウンロードしているので簡単にコピーを作れそうな気もするんですが実際どうですか? 個人的にはコピーできないなんてあり得ないと思ふのですが・・・ 別にコピーしようなんて気はありません。 だってMP3派なんだもん(笑)
707 :
デフォルトの名無しさん :2001/08/02(木) 16:34
>>706 たとえばリアルプレーヤーなんかのストリーミングとかでせうか
>>706 がんばれば絶対できないというものはないと思います。
ただ、そういうツールを作って配布すると違法になるかも
>>706 707でも出てるリアルプレイヤーのストリーミングも、
技術的にはファイルに落とすことは可能だろう。というかそういうツールあったし。
あったけど訴えられて配布中止になったような気がする。
711 :
デフォルトの名無しさん :2001/08/02(木) 17:27
#include<stdio.h> main() { int a=25,b=14,c=16,d=11; a+=b; c*=d; b=c%a; d&=b; printf("%d %d %d %d\n",a,b,c,d); } 誰かこの問題でb=c%a;の出し方教えて・・・。 a,cは足し算と掛け算だから簡単に解けたけど bは意味が解からない。(なんでb=20になるの?) 誰か詳しい人教えて。
>>711 割り算が分からないところをみると小学生か?
c *= d の計算後の時点では、a = 39, b = 14, c = 176, d = 11
% は余りを求める演算子なので、
c / a = 176 / 39 = 5 ... 20
よって b = c % a = 20
713 :
デフォルトの名無しさん :2001/08/02(木) 17:50
>>712 ありがとう。本当に解からなかったんだ。
やば。割り算間違えてる。
176 / 39 = 4 ... 20 ね。
>>713 参考書読めば書いてあるでしょ。
715 :
699 :2001/08/03(金) 00:53
レスありがとう。
>>704 入力は1,3,5,10,6のような入力もありです。
とりあえず、a[51], b[51]って配列作って、最初全部に0いれておいて Aにnが含まれているか否かを、a[n]が1か0かで表すようにすると ソートしなくていいから楽だと思われ。
717 :
デフォルトの名無しさん :2001/08/03(金) 21:13
>>717 CGIとsendmailが使えるサーバを確保して、cgiをかじったことある
人間を見つけて頼む。
もしくは、どこかのcgi解説ページにいって少しperlのお勉強をした
後に、メール送信フォームのサンプルcgiを見ながら自分で改造する。
俺に仕事として出してくれ。 つーか、宿題か、それ?
sendmailまでいるかな?
麻衣を出せや(゚д゚)ゴルァ!
723 :
麻衣 :2001/08/04(土) 09:59
>>699 こんなかんじ?
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define N_ELEMENTS 50
#define ARYSIZE(x) (sizeof(x) / sizeof(x[0]))
typedef enum {
OutOfSet,
inA,
inB,
inAandB,
} ElementState;
void get_element(int set[], int size, ElementState state, char []);
int main(void)
{
int set[N_ELEMENTS + 1] = { OutOfSet };
int element;
char buf[BUFSIZ];
int i;
printf("Aの要素を入力してください。:");
gets(buf);
get_element(set, ARYSIZE(set), inA, buf);
printf("Bの要素を入力してください。:");
gets(buf);
get_element(set, ARYSIZE(set), inB, buf);
printf("AとBの積集合:");
for (i = 1 ; i <= N_ELEMENTS; i++)
if (set[i] == inAandB)
printf("%d ", i);
putchar('\n');
printf("AとBの和集合:");
for (i = 1; i <= N_ELEMENTS; i++)
if (set[i] != OutOfSet)
printf("%d ", i);
putchar('\n');
return 0;
}
724 :
麻衣 :2001/08/04(土) 10:00
つづき void get_element(int set[], int size, ElementState state, char buf[]) { int n; while (*buf) { while (isspace(*buf)) buf++; for (n = 0; isdigit(*buf); buf++) n = n * 10 + *buf -'0'; if (n >= size) { fprintf(stderr, "%d : 数字が大きすぎます。\n", n); exit(1); } set[n] += state; } } 入力ぶぶんがあんましよくないね。scanf つかおうと思ったけどうまくいかなくて こんなのにしちゃった。
725 :
デフォルトの名無しさん :2001/08/04(土) 10:20
アイ マイ ミー マイン?
アインス ツヴァイ ダァライ フィアー?
アー ミー マー
728 :
麻衣 :2001/08/04(土) 11:09
あれぇ、ひさしぶりにがんばったのに失敗しちゃった!
>>724 >>while (isspace(*buf))
これじゃ空白をよみとばすだけで','が来たらとまっちゃうね…。
while (!isdigit(+buf))
に変えといて…。 うつだしのー…
729 :
麻衣 :2001/08/04(土) 11:12
>>728 >>+buf
じゃなくて
*buf
ごめんね。
麻衣って倉本麻衣?
731 :
デフォルトの名無しさん :2001/08/04(土) 12:30
アー メー マー
732 :
デフォルトの名無しさん :2001/08/04(土) 12:32
733 :
麻衣 :2001/08/04(土) 13:50
はーい。
>>732 なぁに?
でも今お母さんとおやつのプリン作ってて手がはなせないの。
またあとでね。ごめんなさい。
734 :
デフォルトの名無しさん :2001/08/04(土) 21:02
#include<stdio.h> main() { int m=5, n=10, p=8, i; float x = 2.5, y=5.5, z=7.0, f; i = x+y+z; f = y*n + n/p; p += (float) m+n; x -= (int)y + (int)z; m += n/y; printf("%d %d %d %d %d \n",i, f, p, x, m); } この解き方が解からないよ~。 誰か救済措置を・・・。 i=15,f=0, p=107822560, x=23, m=0 どうしたらこんな値が出力されるの?
つっこみどころがありすぎ。とりあえずこんなところか? #include<stdio.h> main() { int m=5, n=10, p=8, i; float x = 2.5, y=5.5, z=7.0, f; i = x+y+z; f = y*n + (float)n/(float)p; p += m+n; x -= (int)y + (int)z; m += (float)n/y; printf("%d %f %d %f %d \n",i, f, p, x, m); }
それでなんでこの値になるの? i=15までは解けたがそれ以外の解き方が 全くわからんのだけど・・・。 f=0, p=107822560, x=23, m=0...ってどう計算すれば この値になるの? 答えの解き方が知りたいのだが・・・。
解き方ってなんだよ。 解いてるのはコンピュータであってあんたじゃないだろ。 printf の書式指定がおかしいから表示される値が狂ってるだけ。
738 :
デフォルトの名無しさん :2001/08/05(日) 03:26
麻衣ちゃん、ありがとう。
ネカマ人生まっしぐら!
741 :
デフォルトの名無しさん :2001/08/05(日) 09:40
答えはi=15,f=56,p=23,x=-9.5,m=6だったよ。 printの書式が%dじゃなく%fだったとは・・・。 だから答えが間違っていたのか。 m=6になんでなるの?
>>741 +=って記号の意味はわかってる?
float(10)/5.5 = 1.…となって、m += でmがintなので、intに
キャストされて、切り捨てられて1になるから、
m += 1で6。
743 :
デフォルトの名無しさん :2001/08/05(日) 11:34
>742 ありがとうです。 解けました。 まだまだヒヨッコなのでスマンです。
744 :
デフォルトの名無しさん :2001/08/05(日) 11:59
2001/06/30 00:05, 0 2001/06/30 00:20, 1 2001/06/30 00:35, 6 2001/06/30 00:50, 0 2001/06/30 01:05, 0 2001/06/30 01:20, 2 2001/06/30 01:35, 0 2001/06/30 01:50, 1 上記の記述があるファイル名をtmpall.logファイルとします。 ここからが質問です。 このファイルの1番右の数字だけをsortして、MaxとMinの値を調べるシェルを作りたいのですが、上記の結果ですと、Max=6 Min=0 です。 OSはAIX シェルはKシェルです。 ご教授よろしくお願いいたします。
環境限定しすぎじゃ UNIX板でも行け
746 :
デフォルトの名無しさん :2001/08/05(日) 15:23
>>744 Shell scriptをシェルと略す奴って
JavaScriptをJavaと略す奴よりタチ悪いよな
>>744 あら、あたくしC便器幼虫の夏厨でござ―ますし
Cしか存じ上げませんことよ♪
#include <stdio.h>
#include <limits.h>
#define FILENAME "tempall.log"
int main(void)
{
FILE *fp;
int max = 0, min = INT_MAX, n;
if ((fp = fopen(FILENAME, "r")) == NULL) {
fputs("failed to open file!", stderr); return 1;
}
while (fscanf(fp, " %*d/%*d/%*d %*d:%*d, %d ", &n) != EOF) {
max = n > max ? n : max; min = n < min ? n : min;
}
printf("max = %d\nmin = %d\n", max, min);
return 0;
}
こんなのいらないですって? おーほっほっほっほっ呆。
覚えたてでカキたくてたまらないのでございますのことよ♪
おーほっほっほっほっ呆。 では、御免あさ―せっ♪
>>744 #!/usr/bin/ksh
echo `awk '{print $3}' tmpall.log | sort | tail -1`
echo `awk '{print $3}' tmpall.log | sort | head -1`
ダメ?
もちっとまじめにやると NR==1{max=min=$3} max<$3{max=$3} min>$3{min=$3} END{print "min",min," max",max} だな
このプログラムで最大、最小値、中央値を求めたいのですが、 このプログラムにはなにが不足しているのでしょうか? #include <stdio.h> main() { int score, i, j, n=0, data[100], work; do{ printf("%d件目のデータを入力してください。(終了時は-99999)",n+1); scanf("%d", &score); if(score!=-99999){ data[n++]=score; } }while(score!=-99999); for(i=0; i<n-1 ;i++){ for(j=i+1; j<n; j++){ if(data[i]<data[j]){ work=data[i]; data[i]=data[j]; data[j]=work; } } } }
わらた。 >753のプログラムは昇順にソートするプログラムっぽいので(詳細は見てない) 処理の最後で 最小値=data[0] 最大値=data[n-1] 中間値=data[n/2] を出力すれオケー? ただし、n=0の例外と要素数が偶数の時の処理は別途考慮の必要がある。
あー、中間値って平均値じゃなくて所謂中間値のことだよね?
757 :
デフォルトの名無しさん :01/09/11 04:16
>>744 コマンドラインから一発で逝くぞ。Shellscript にしても構わんが。
$ sort +2 tmpall.log | sed -n "1p;$p"
麻衣はどこ逝った?
麻衣ちゃんは、Keyヲタな教師に拉致られてしまいました。
ヒロインが欲しかったのか
761 :
デフォルトの名無しさん :01/09/11 10:49
double型の数字列を標準関数を使わないで16進数の文字列に 変換する方法を教えて下さい。int型だとsprintfで変換 できるんですけど・・・
麻衣わかんな~い
>>761 ばいなりぃのいめーじのまま16進数にしたいの?
それとも値を整数部と少数点以下に別けたいの?
たとえば 1.5 を 0x0001.80000 のようにしたいって事?
, ―'
γ∞γ~ \
人w/ 从从) ) / ̄ ̄
ヽ | | l l |〃 < ちゃんと言語書いてね
>>761 `wハ~ ーノ) \__
/ \`「
少数点以下1桁を16進にしたいんだったら
16倍して、整数部を1桁分16進数にするのを繰り返せばいいよ
x=0.9なら
16*0.9=14.4 -> 'E'を出力 x=0.4
16*0.4= 6.4 -> '6'を出力 x=0.4
16*0.4= 6.4 -> '6'を出力 x=0.4
・・・くりかえし・・・
764 :
デフォルトの名無しさん :01/09/11 12:39
すいません。C言語です。double型の変数にint型で入りきらない 桁数の数値が入っていて、それを16進数の文字列に変換したいんで すよ。sprintfだと第3引数がint型だから変換できるんですけど・・・ 小数値は考慮しないでいいです。
, ―' γ∞γ~ \ 人w/ 从从) ) / ̄ ̄ ヽ | | l l |〃 < じゃ考え方だけ `wハ~ ーノ) \__ / \`「 Frexp を使うと 指数部と仮数部に別けられるからさ -> M*2^E 指数部 を E=E4*4+R4 と分解しちゃおう E4=E/4;R4=(E%4) すると、 M*2^E4*4+R4 = M*2^R4 * 16^E4 つまりE4桁の16進数になるから x=M*2^R4; for(i=0;i<=E4;i++) { int ix=x; //整数部をixに取り出す printf( "%1X",ix); //整数部を16進数で印刷 x-=ix; //xの少数点以下のみをxに x*=16.0; }
766 :
デフォルトの名無しさん :01/09/11 15:42
>>765 OSがDOS_IRMXなのか、算術関数が使えません。
自作の関数で求める方法を教えて下さい。お願いします。
, ――
γ∞γ~ \
人w/ 从从) ) / ̄ ̄ ̄
ヽ | |┬ イ |〃 < ホントにないの?
`wハ~ ^ ノ) \___
/ \`「
frexpは絶対内部で使ってる筈だよ。
includeとライブラリースあるならgrepしてみようよ
無いなら 1/16を繰り返して int幅に収まるまで小さくしてから
回数をE4にして
残りを
>>765 の方法でやればいいと思うよ
C言語で文字列をスペースごとに区切って、 それぞれをポインタの配列に入れる関数は どうやって作ったらいいですか?
>>768 そこに書いてあるとおりの関数を作ればいいと思うYO!
>769はあんまりだけど、何処が分からないのか書かないと麻衣ちゃんも答えてくれないだろう、きっと。
while(*p) { while(*p==' ') if(*p++ == 0 ) return ; ; arrayp[i++]=p; while(*p!=' ') if(*p++ == 0 ) return ; }
772 :
デフォルトの名無しさん :01/09/11 20:20
,. -─- 、 ,r‐v'6,. ヽ . /,r'`i ヲ,/ノノ}ノ、}ノ)) . ノノ. ! l(| ィfl fl |ノ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ヽ,ゝ、 lフノ < つぎのかたどうぞ /^レヽーヽ、 \_______ / .∧_〉 ゚ .〉,
774 :
デフォルトの名無しさん :01/09/11 22:14
VC++を使っている初心者ですが ヘッダをインクルードするにはどうすればいいのでしょう? test.c #include <test.h> main() { int a, b, c; a = b + c; . . . ―――――――――――――――――― test.h #define ABC 10 #define SIZE 100 ――――――――――――――――――― 実行… fatal error C1083: インクルード ファイルがオープンできません。'test.h': No such file or directory
>>774 <test.h> を "test.h" にしてみそ。
776 :
デフォルトの名無しさん :01/09/11 23:21
>>775 ありがとうございます。きちんと動作しました。
でも、どうしてなんでしょ?
>>776 コンパイラは <test.h> というのを見つけると、標準ヘッダの
ディレクトリを見に行く(include っていうディレクトリがあるハズ)。
"test.h" を見付けたときには、同じディレクトリの test.h を見に行く。
(同じディレクトリというのは、この場合 test.c が置いてある
ディレクトリという意味)
778 :
デフォルトの名無しさん :01/09/12 01:18
>>777 よく分かりました。
かさねて、ありがとうございます。
779 :
デフォルトの名無しさん :01/09/12 15:37
C言語ですが、コマンドラインって実際どうすれば使えるの? プログラム名、プログラムの起動ってなに? ――――――――――――――――――― 渡されたプログラム仮引数を順に表示するプログラムである。 プログラム名(ファイル名)はprintpとする。 【プログラム】 #include <stdio.h> main(int argc, char *argv[]) { int i; printf("argc = %d\n\n", argc); for (i = 1; i < argc; i++) printf("parameter%1d %s\n", i, argv[i]); } ――――――――――――――――――― 【プログラムの起動】 printp tokyo shinbashi shinagawa kawasaki yokohama
780 :
デフォルトの名無しさん :01/09/12 15:39
1 3 5 7 □ 10 □ 上の数列(?)はある規則によって並んでいます。 □の中に当てはまる数字を答えなさい。 また、その規則も答えなさい。 誰か教えて~??
781 :
デフォルトの名無しさん :01/09/12 15:42
月の30日の日じゃないの? 答えは左から8、12.
782 :
デフォルトの名無しさん :01/09/12 15:42
31日だった。
783 :
名無しさん :01/09/12 15:51
宿題ってわけじゃないんですが・・・・柴田望洋の本で |1 2 3| |4 5 6| と |1 5| |5 3| |8 1| の積を求めるのを書きなさいっていうのがあるんですが.どうやれば いいでしょう? i,j,k各々について3回の,3重ループで計算するのだと思うのですが 最後の詰めが良くないのか,手計算でやったのと違う結果になります.
>>783 手で計算するのと同じ手順をプログラムにやらせてはどうか?
785 :
デフォルトの名無しさん :01/09/12 16:15
786 :
名無しさん :01/09/12 16:26
>>784 いわれてみればその通りなんですけど・・・それをどうCで表現するか
っていうのが問題だったりします.
783の行列で前者,後者をmx,my
mz=mx*myとして
for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++){
for(k = 0; k < 3; k++){
mz[i][j] += mx[i][k]*my[k][j];
}
}
}
こんな風にしてみたんですが,これだとmxが2行3列,myが3行2列なので
一概にi,jを3回ループにしてしまうとmxで2行,myで2列しかない部分に
ついても3回目を怒ってしまっているような気がするのですが....
>>786 全くそのとおりです。
i,jどちらかを2回ループにしましょう。
どちらが2回かは自分で考えてね。
>>787 オイオイ… "どちらか" じゃないだろ…。
2行3列 の行列 と 3行2列 の行列の積は 何行何列 の行列 になる?
そこらへんからよく考えてみてちょ。
>>786
なんとか自分で分かりました(多分)。 VC++を使ってプログラムをビルド-実行してたので、何のことだか分からなかったのですが これはコマンドプロンプトから実行したときに意味を持つのですね(多分)。
790 :
デフォルトの名無しさん :01/09/13 13:40
C言語でchar型配列をatof関数でdouble型に変換すると演算誤差 が出てしまいます。小数値を丸めるにはどうしたらいいでしょうか。
>>790 数学の本の誤差丸めに関する項を読んで、その手順をプログラムに
やらせればいいよ。
>>761 double型でもsprintfで変換できない?
>>792 誤差丸めの話をしてるんだからsprintfは関係ないだろ。
794 :
トシ@矢田亜希子&水野美紀 :01/09/13 21:41
キーボードから順次入力された正の整数を、 0が入力されるまで、配列に順番に格納し、次に、ある1つの正の整数を与えると、それが何番目に入力された整数であるかを表示するプログラムを作成せよ。 例えば、次のような実行例となるようにせよ。 数字(1)を入力してください 43 数字(2)を入力してください 25 数字(3)を入力してください 7 数字(4)を入力してください 123 数字(5)を入力してください 0 見つけたい数字を入力してください 7 7は3番目に見つかりました 見つけたい数字を入力してください 55 55は見つかりませんでした 見つけたい数字を入力してください 0 それではプログラムを終了します 以上 お願いします。(ペコペコ) (出題:旧帝大1回生理系の課題の一部)
マルチすな
796 :
トシ@矢田亜希子&水野美紀 :01/09/13 21:43
C言語です。
797 :
デフォルトの名無しさん :01/09/14 02:36
>>794 わざと分かりにくく書いたりして...
/****** ここから ******/
#include <stdio.h>
#define NUMS 100 /* なんで100なんだろうね。理由はないね */
#define TRUE (1 == 1) /* まあ理屈っぽい */
#define FALSE (!TRUE)
int input(char* prompt, int arg) {
int x;
char buf[200]; /* ここの200にも深い意味は無い。 */
do {
printf(prompt, arg); /* こういうことをする奴は嫌われることもある*/
gets(buf);
} while (buf[0] == '\0'); /* 空の入力はやり直し;余計なお世話かもな */
x = atoi(buf); /* sscanf(buf, "%d", &in); が好きならそれで */
return x;
}
main() {
int nums[NUMS]; /* nums[0] は使わない */
int j, in;
for (j = 1; j < NUMS && (nums[j] = input("数字(%d)きぼーん", j)) != 0; j++)
;
while (in = input("どれじゃゴルァ", -1)) { /* 2番目の引数 -1 は意味無し*/
int k;
int found = FALSE;
for (k = 1; k < j; k++) { /* nums[j] まで探すが、ミソ? */
if (nums[k] == in) {
printf("%d は %d番目だな\n", in, k);
/* 一個見つけただけで安心していいならbreakしてもいいな */
found = TRUE;
}
}
if (!found) {
printf("%d なんてシラネーヨ\n", in);
}
}
printf("逝ってよし!...って逝くのは漏れか\n");
}
/****** ここまで ******/
>>797 おもしろい!コメント読むと何故かムカムカしてくる!
>>797 実際に会社でこういうコメント付ける奴いるよ
そのまま引き継ぐなや
うんざり。
ネタニマジレス、カコワルイ
802 :
デフォルトの名無しさん :01/09/20 22:41
ある高校の科と学年とクラスを入力したら、 そこの担任の先生の名前が出力されるプログラムを作りたいのですが・・・。 C言語でお願いします。
, ―'
γ∞γ~ \
人w/ 从从) ) / ̄ ̄
ヽ | | l l |〃 < 名前はだれが入力するの?
>>802 `wハ~ ーノ) \__
/ \`「
プログラムを作る人が入れるみたいです。 A B C D E 1 2 4 2 4 4 2 3 4 2 4 5 3 3 3 2 4 5 上が科で左が学年、中がクラスの数です。 説明不足&下手ですいません。
こういう事なんでしょ? クラス数一覧 学| 科 目 年| A B C D E --+--------------- 1 | 2 4 2 4 4 2 | 3 4 2 4 5 3 | 3 3 2 4 5 ユーザーインターフェースの希望は?
その通りです
>>805 ユーザーインターフェースの意味が良く分からないです。
すいません。
807 :
デフォルトの名無しさん :01/09/21 22:11
むちゃ長い…でもせっかく作ったんでうぷする。参考にして
>>802 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DEPARTMENTS 5
#define GRADES 3
#define CLASSES 5
void read_data(char * [][GRADES][CLASSES]);/* 担任名のデータを外部ファイルから読み込む */
int input_prompt(char *, int, int);
int main(void)
{
int department, grade, class_no, cont;
char *teachers[DEPARTMENTS][GRADES][CLASSES] = { NULL }, *res;
read_data(teachers);
do {
puts("検索条件を入力してください。");
department = input_prompt("学科(A=1 B=2 C=3 D=4 E=5):", 1, DEPARTMENTS);
grade = input_prompt( "学年(1 ~ 3) :", 1, GRADES);
class_no = input_prompt( "クラス(1 ~ 5) :", 1, CLASSES);
if ((res = teachers[--department][grade-1][class_no-1]) != NULL)
printf("%c科%d年%d組の担任は%s先生です。\n", department + 'A', grade, class_no, res);
else
puts("そのクラスのデータはありません。");
cont = input_prompt("続けますか? YES=1 / NO=0:", 0, 1);
} while (cont);
return 0;
}
/* つづき */ int input_prompt(char *prompt, int low, int high) { int res; do { printf("%s", prompt); scanf("%d", &res); } while (res < low || res > high); return res; } #define FILENAME "dat.txt"/* 担任名データの入った外部ファイル名 */ void read_data(char *teachers[][GRADES][CLASSES]) { FILE *fp; char department; int grade, class_no; char name_buf[BUFSIZ], *name; if ((fp = fopen(FILENAME, "r")) == NULL) puts("cannot open file!"), exit(1); while (fscanf(fp, "%c,%d,%d,%s", &department, &grade, &class_no, name_buf) != EOF) { department -= 'A'; if ((name = malloc(strlen(name_buf) + 1)) == NULL) puts("failed in malloc!"), exit(1); strcpy(name, name_buf); teachers[department][grade-1][class_no-1] = name; } fclose(fp); } /* dat.txt の書式 : 学科,学年,クラス,担任名 例 : C 科1年2組担任がしぃ先生で、D 科2年3組担当がギコ先生の場合、 C,1,2,しぃ D,2,3,ギコ というふうに記述する。*/
ちょっと難しかったですが、参考になりました。 本当にありがとうございました。
どなたかマージソートで重複を削除する プログラムを教えていただきませんでしょうか??
>>811 Rubyはクソです。ゴミ箱逝きです。
いじょ
この発言をコピペしていただければ幸いです。
>>811 マージソート自体は理解できてるの?
マージ(併合)するときに、
比較した2つの要素が同値なら一方を捨てる、
という風にしていけばいいんじゃないかな…?
自分でも作ってみたんだが、重複を削除した分、要素を前に詰めるという 部分で悩んで、結局、出来上がったのが以下の関数。 (ソート対象の説明がなかったんで、取り敢えず int 配列のソートにした) 機能:与えられたint の配列を、重複する値を削除しながら、昇順にソート。 引数:int src[]……ソートしたい配列の先頭要素へのポインタ。 int size ……その配列の要素数。 int dst[]……ソート後の要素の格納場所の先頭を示すポインタ (再帰呼出する際に、削除分のずれを修正するために 必要なパラメータ。最初の呼び出しでは、src[] と 同じ値を入れておけばよい。) 返値:重複削除後の要素数。 長くなるんでコードは次に。
#include <string.h> #define TEMPSIZE 1000 static int Temp[TEMPSIZE]; int distinct_msort(int src[], int size, int dst[]) { int half, border, former, latter, i; if (size < 2) return size; half = size / 2; border = distinct_msort(src, half, src); size = border + distinct_msort(src + half, size - half, src + border); memcpy(Temp, src, sizeof(int) * border); former = i = 0; latter = border; while (former < border && latter < size) if (Temp[former] < src[latter]) dst[i++] = Temp[former++]; else if (Temp[former] > src[latter]) dst[i++] = src[latter++]; else { dst[i++] = Temp[former++]; latter++; } while (former < border) dst[i++] = Temp[former++]; while (latter < size) dst[i++] = src[latter++]; return i; } 引数の dst[] がどうも不恰好なんで、 もっといいやり方知ってる人の意見キボーン。
816 :
デフォルトの名無しさん :01/09/23 20:50
今月のゲームラボにプレステ2の画像の吸い出し方が載ってたんでやってみようと思ったのですがさっぱり分かんないです。
>>808 や
>>815 の事をC言語って言うんですか?
これを何に打てば良いんですか?
ワードパッドでしょうか?
初心者ですいませんが教えて下さい。
819 :
デフォルトの名無しさん :01/09/24 09:39
ギャンブルの「KENO」 で どのBETが一番当たりやすいですか?
821 :
デフォルトの名無しさん :01/09/26 05:35
C言語でガウスの白色雑音を出力するの教えてください。 お願いします。
>>820 どうもありがとうございます。勉強になりました。 後は、どの数字(1-80)が出やすいか分かりますか? 8個掛けの場合でお願いします。
>>823 あのページ見ても理解できないならやめとけ。
そもそも出る数字に偏りがあるならあのページの解説は成り立たない。
>>822 本当にありがとうございます。バッチリわかりました。
これって知っていて当たり前の事なんですか?
>>825 ホワイトノイズは知っていても「乱数」という言葉は知らないのか?
その言葉さえ知っていれば調べるのは容易だと思うが。
ガウス分布にするなら rand だけのキーワードでは不足する人も多いというのに 821 はそれで足りるんだから イイ!
828 :
デフォルトの名無しさん :01/09/28 21:14
C++の問題です、なにぶん初心者でして 参考になる本などあれば教えて頂きたいです・・・。 1.二つの数をインプットしそれをx,yの読み込んで 和差積商を計算するプログラム 2.1つの数をインプットし読み込んで その数の二乗、三乗を計算するプログラム
830 :
デフォルトの名無しさん :01/09/28 21:44
>>828 コンパイラは何を使いますか?といってもわからないか・・・
大別してUnix上でよつ使うやつ、Windows上でよく使うやつ、
があるけど、どっちかな?
831 :
デフォルトの名無しさん :01/09/28 21:46
32
832 :
掛け算(C言語) :01/09/28 21:58
#include <stdio.h> main() { int i,j; for ( i=1 ; i<=9 ; i++ ) { for (j=1 ; j<=9 ; j++ ) { printf("%3d",i*j); } printf("\n"); } }
>>829 明日書店で探してみます、どうもです
>>830 OSはwindows2000なのですが...
834 :
デフォルトの名無しさん :01/09/29 11:57
>>833 OSはWindows2000なのですが...
cygwinを使ってます。エヘ
835 :
デフォルトの名無しさん :01/09/29 16:32
#include void main(void){ int you,i; srandom(time()); printf("===じゃんけんゲーム==="\n"); printf("1:グー 2:チョキ 3:パー\n"); i=random() % 3 +1; printf("ジャンケンポン:"); scanf("%d",&you); printf("あなた:%d,わたし%d\n",you,i); if((you==1&&i==2)|| (you==2&&i=3)|| (you==3&&i=1)) { printf("あなたの勝ちです。\n"); } else if(you==i) { printf("あいこです。\n"); } else{ printf("あなたの負けです。\n"); } } このなかにwhile文を入れたいんですがどこにどんなふうに入れればいいのか まったくわかりません!!だれか教えて下せ~!!
837 :
デフォルトの名無しさん :01/10/04 19:59
>>836 あのどうゆうふうにしたいの?
・3回戦
・3回負けたら終了
・1,2,3以外を入力したら終了
・その他
目的によってwhileはつかいかたが違うよね!
838 :
デフォルトの名無しさん :01/10/04 22:01
#include <stdio.h> main() { union longdata{ unsigned long ldata; unsigned long uchar[4]; }LongData; LongData.ldata = ('D' << 24) | ('C' << 16) | ('B' << 8) | ('A'); printf("0x%x\n", LongData.ldata); printf("%c ", LongData.uchar[0]); printf("%c ", LongData.uchar[1]); ←warning C4700: 値が割り当てられていないローカルな変数 'LongData' に対して参照が行われました。 printf("%c ", LongData.uchar[2]); printf("%c ", LongData.uchar[3]); printf("\n"); } 実行結果 0x44434241 A フ フ フ Press any key to continue
共有体の部分でつまずいた。 LongData.uchar[1] には B が入ってるはずなのですが…。
>>839 >LongData.uchar[1] には B が入ってるはずなのですが…。
uchar なんて名前をつけるから、「`unsigned long' uchar[4]」と
宣言しているのを見落とすんだろうね。
841 :
デフォルトの名無しさん :01/10/04 22:14
>>838 unsigned long uchar[4];
は
unsigned long ldata;
と同じメモリ空間を共有していないよ。
unsigned long uchar[4];
は4バイトのデータが格納されているメモリの先頭アドレスへのポインタです。
わかる?
すみません私間違ったこといっていたー。
>>840 の人が言っているのが正しいです。
型が間違っているということです。
私が
>>841 で言ったことは無かったことに。(鬱
サンクス 見落としてました。
>837 ごめんなさい。初心者なもんで。 3回負けて終了のほうがいいですね。
>>学生サン #include void main(void){ int you,i; int lost=0;/*追加*/ srandom(time()); printf("===じゃんけんゲーム==="\n"); while(lost<3)/*追加*/ { printf("1:グー 2:チョキ 3:パー\n"); i=random() % 3 +1; printf("ジャンケンポン:"); scanf("%d",&you); printf("あなた:%d,わたし%d\n",you,i); if((you==1&&i==2)|| (you==2&&i==3)|| /*比較では==を使おう*/ (you==3&&i==1)) /*比較では==を使おう*/ { printf("あなたの勝ちです。\n"); } else if(you==i) { printf("あいこです。\n"); } else{ printf("あなたの負けです。\n"); lost++;/*追加*/ } } }/*追加*/ こんな感じでどう?
あっ忘れてた。 #include <stdio.h> って感じにしてね。
848 :
デフォルトの名無しさん :01/10/05 20:04
教えてください。 あるカードの束(card)をある枚数(cut)ぶん上から取ります。 取ったカードの束をA,残ったカードの数をBとします。 A,Bのそれぞれ下から一枚カードを取り、重ねていきます。 重ねてできた山をCとします。card = 1001,cut = 100の時 Cがcardと同じならびになるのは何回シャッフルした時でしょう? シャッフルする時は必ずAの束から取る事にします。 答えを1秒以内に出せるプログラムを組みましょう。 という問題です。自分でやった時は5分もかかって答えが出ました。 なんせ初心者なもので・・・ 皆さん教えてください、お願いします。
「同じならび」とはどういうことですか? 「シャッフル」とはどういう操作ですか? 定義がよくわかりません。すみません。
850 :
デフォルトの名無しさん :01/10/05 20:15
>>849 えーと、同じならびとは、上から0~1000まで順番に
並んでるカードがcardで、トランプのカットを行った
時のように上からA枚分とって、そのまま横に
置いたのがA,残ったのがBです。んで、Aの一番下、Bの
一番下、またAの一番下・・・というふうに置いていき、
AかBの余ったほうをそのままCの一番上に重ねるって
ゆーのがシャッフルです。言葉足らずですみません。
>847 実行したんですけどなんかsrandomっていうのが駄目らしくてエラ-が出たんですけど どうしたらいいんでしょうか?
ん?わかりません。すみません。 問題の原文もしくは、あなたのプログラムを見せてください。
#include <stdio.h> void main(void){ int you,i; int lost=0;/*追加*/ srandom(time()); printf("===じゃんけんゲーム===\n"); while(lost<3)/*追加*/ { printf("1:グー 2:チョキ 3:パー\n"); i=random() % 3 +1; printf("ジャンケンポン:"); scanf("%d",&you); printf("あなた:%d,わたし%d\n",you,i); if((you==1&&i==2)|| (you==2&&i==3)|| /*比較では==を使おう*/ (you==3&&i==1)) /*比較では==を使おう*/ { printf("あなたの勝ちです。\n"); } else if(you==i) { printf("あいこです。\n"); } else{ printf("あなたの負けです。\n"); lost++;/*追加*/ } } }/*追加*/
>>851 srandomという関数がダメな理由は
・必要なライブラリがインクルードされていない。
・処理系によってはsrandだったりします(OS依存の処理系依存)
のうちのどちらかと思います。
OSは何ですか?
>>850 ん?わかりません。すみません。
問題の原文もしくは、あなたのプログラムを見せてください。
>>856 なに?3人も相手しなきゃなんないの?
日本語間違っている?
>>857 typoです。
>>854 srandはANSIで定義されてます。
OS依存なら処理系依存になるのでOS依存の処理系依存なんてありません
そもそも必要なライブラリもなにもありません。
>>858 そうですかsrandは無条件で使えるということですね。
srandomについては知っていますか?
またtimeについては知っていますか?
とりあえずsrandomはsrandと置き換えてください。 randomもrandと置き換えてください。 timeについては・・・・((OS依存の処理系)依存では?)
突っ込みどころが多すぎる。 ボケのスピードも速すぎる。
>>861 なんか知らんけど初心者に教えるよりも、
私のボロを叩くほうが好きみたいね。
処理系をC言語処理系と言い換えさせてもらいます。
>>851 Windows系OS上のC++Builderなどの場合
#include <stdlib.h>
#include <time.h>
をインクルードし
srandom(time()) をrandomize()と置き換えてください。
random()をrand()に置き換えてください。
UNIX系OS上のgccなど場合
srandom(time()) をsrand(time())と置き換えてください。
random()をrand()に置き換えてください。
ただしUNIX環境では動作テストはしていないので動かないかも(-_-;)
864 :
デフォルトの名無しさん :01/10/06 18:46
>>849 =
>>850 は、もう、解決したのだろうか?
自分もやってみたんだけど、単純にシュミレートするやり方では、
1秒で答えを出すのは、無理だった。(1分位で、12025860回という
答が出たんだけど、この答で合ってる?)
まず、数学的な巧い解法を見つけて、それをコーディングするという
風にしないといけないんだろうけど…一日考えたが、さっぱりわからん。(´Д`;)
もし解決したんだったら、考え方のヒントだけでも教えて…m(__)m
865 :
デフォルトの名無しさん :01/10/07 09:24
>>864 本人ではないが、考え方を。
この方法で試しに組んでみたけど、同じ答えが1秒以内にでたよ。
欲しければ、ソースみせます。
例えば、「0」というカードに着目してみる。
そうすると、0というカードは最初一番下にあって、次に下から2番目にあって・・・
と言うふうに一回シャッフルするごとに、移動していく。でn回シャッフルした
ときに初めて元の場所に戻ってきたとする。このときに、0というカードはnの周期
で動いていることになる。これからの動き方はずっと一緒。
だから、この段階で、k*n回シャッフルした後だけを見ればいいことがわかった。
で、最初の状態でl番の位置にあったカードが、n回シャッフルした状態にm番の
位置にあったとする。そうすると、当然n回シャッフルした状態でl番での位置に
あったカードは、2n回シャッフルしたときには、m番の位置にありますよね。
ですから、n回シャッフルしたときにカードの位置がどう変化するかというマップ
を作っておけば、n回シャッフルした結果がすぐわかります。
これを利用して、n回, 2n回・・・と調べていきます。
このとき0以外の別のカード、例えば1に注目して、これが元の位置に戻ってくる
かをチェックし続けます。これで、例えば n回のシャッフルをt回したときに元に
戻ってくるなら、0と1というカードの組み合わせの周期はk * n回だということ
がわかります。ですので、同様にk * n回のシャッフルのマップを作って・・・
と以下同様です。
>>865 おぉ、ありがとうございます!
周期性を発見して、無駄を省けばいい訳ですね…。理解できた…と、思います。
教えていただいたやり方で、これから組んでみます!
>>864-865 ありがとうございました。自分でもいろいろ考えたんですけど、
さっぱりわけわかりませんでした。865さんのやりかたで再度
考えてみます。
868 :
デフォルトの名無しさん :01/10/09 01:06
麻衣ちゃんの優しさで802を包んで下さい。
僕のちんこしゃぶっtれ
二次元配列の宿題が出されました。問題は十行十列の 二次元配列aをメモリ上の連続した領域へ行方向に格納するとき、 a(5,6)が格納される場所の番地はどれか。ここで番地は 十進数表示とする。ちなみにa(1,1)の時の番地は100、101です。 答えは200以下になるらしいのですが・・。
871 :
デフォルトの名無しさん :01/10/17 16:26
>>870 >答えは200以下になるらしいのですが・・。
は?なんで?番地、ってのの意味がわからんのだが。
バイト単位なの?
配列ってのが何の型なのか良くわからんのだが。
アドレス的にいけば、4バイトとして4*2^8程度ずつ
増えていく気がするんだが。
>ちなみにa(1,1)の時の番地は100、101です。
なんで番地が二つあるの?
よくわからんが、a(2,1)が101、って意味なのか?
(5-1)*10+(6-1)+100とかか?
これなら200以下だが。
874 :
デフォルトの名無しさん :01/10/18 00:16
Hotmailサーバーって今落ちてない?
875 :
デフォルトの名無しさん :01/10/18 13:33
vcで、ウィンドウがないプログラムについてのってるHPとかしりませんか? ウィンドウがないとはラジオみたいなかたちのウィンドウをつくりたいのです。
プログラマとしての表現力0だな(´д`;)
>875 ないのかあるのかどっちだ。まず国語の宿題をやれ。
878 :
デフォルトの名無しさん :01/10/18 16:46
遺伝的アルゴリズムを用いた複数経路探索のプログラムをC言語で書きたいのですが書けません。教えてください。書いてください。
880 :
デフォルトの名無しさん :01/10/21 00:47
総当たりで書いてゴマかせ
881 :
デフォルトの名無しさん :01/10/21 12:44
882 :
デフォルトの名無しさん :01/10/21 15:50
さすがにこれだけでは無理でわ。 素直に書店に行くのが吉。
>>879 問題をもうちょっと具体的にしたほうがいいよ
ああ、あっちから移動して来たんだね まず経路をどう表現したいのか? そして経路データはどう入力するのか? あたりからやってみたら?
ダイクストラ法では複数の解候補を一度に表示するのは無理なので、遺伝的アルゴリズムをつかって、一度に複数の解候補を検索しようというプログラムがほしいんですけど・・・・
887 :
デフォルトの名無しさん :01/10/22 01:02
J/n nが0のときはプログラムの実行を停止 アキュムレータの値が0以上のときはn番地に分岐 アキュムレータの値が0未満のときは何もしない A/n アキュムレータの値とn番地の内容とを加えて その結果をアキュムレータに格納 B/n アキュムレータの値からn番地の内容を引いて その結果をアキュムレータに格納 L/n n番地の内容をアキュムレータに格納 T/n アキュムレータの内容をn番地に格納 R/n 入力装置から入力した内容をn番地に格納 W/n n番地の内容を出力装置に出力 S/n アキュムレータの内容をnビット左にシフトする 最下位の桁には0を埋める 以上の命令で、2つの値を入力し、それらのビットごとの論理積をとった 値を出力するプログラムを書け、ってことなんですが。 御教授よろしくおねがいします。
値って整数型(4バイト)?
889 :
デフォルトの名無しさん :01/10/22 01:26
8ビットです。すみません
最初は R/1 R/2 だと思うです。
891 :
デフォルトの名無しさん :01/10/22 01:33
例) 0番地:R/8 1番地:L/8 2 :J/8 3 :B/8 4 :B/8 5 :T/8 6 :T/8 7 :W/8 8 :J/0 このプログラムを入力して実行すると、0番地値の入力待ちになります。 また、2進数8ビットで数値は表現されます。 このプログラムだと、入力された値の絶対値を出力するので、 11111111(-1のことです)を入力すると00000001が出力されます。 説明不足ですみませんでした。
892 :
デフォルトの名無しさん :01/10/22 01:35
訂正) 0番地:R/8 1番地:L/8 2 :J/8 3 :B/8 4 :B/8 5 :T/8 6 :W/8 7 :J/0 でした。 入力された値は8番地に記憶されます。
893 :
デフォルトの名無しさん :01/10/22 01:38
何度も書きこんですみません。 プログラムをそのまま教えてもらえなくても、論理積を上の命令の 動作で計算するにはどうすればいいのかのヒントだけでもいただけないでしょうか
894 :
デフォルトの名無しさん :01/10/22 01:48
>>892 これって0以上の値を入れたら、2番地の分岐で8番地に飛んじゃうと
思うんだけど、いいの?
895 :
デフォルトの名無しさん :01/10/22 01:57
また訂正) 0番地:R/8 1番地:L/8 2 :J/6 3 :B/8 4 :B/8 5 :T/8 6 :W/8 7 :J/0 でした。ほんとに何度もごめんなさい。
896 :
デフォルトの名無しさん :01/10/22 02:07
J/6ってW/8に飛んじゃうんじゃないの? よくわからん。
897 :
デフォルトの名無しさん :01/10/22 02:11
>>896 それはいいでしょ。
0以上なら8番地に格納されてる入力値を
そのまま6番地で出力。
絶対値出力プログラムなんだから、動作的にあってる。
898 :
デフォルトの名無しさん :01/10/22 02:13
>>896 絶対値を出すプログラムだからいいんじゃないの?
正の値だったらそのまま出力するだけだよね。
899 :
デフォルトの名無しさん :01/10/22 02:17
はい、その通りです。
私の説明不足でした、
>>896 さんごめんなさい
900 :
デフォルトの名無しさん :01/10/22 02:19
6ビット左シフトして、足す事により、 最下位ビットの論理積がが0か1か判断出来るけど。 01 11 10 00 01 11 10 00 -- -- -- -- 10 10 00 00
ああ、理解。右シフト無いの?
902 :
デフォルトの名無しさん :01/10/22 02:27
nビット目が1か0かは、8-nビットの左シフトで判定できるね。 条件分岐が0以上か負かだから、最上位までビットをシフトさせちまえば 判定はできる。 あとはこれをひたすら繰り返すのか? なんか、めんどくさいな。
903 :
デフォルトの名無しさん :01/10/22 02:29
あっ! そうか、 最上位ビットが1なら負なんだ。
904 :
デフォルトの名無しさん :01/10/22 02:29
はい、左シフトのみです
905 :
デフォルトの名無しさん :01/10/22 02:34
>>903 これもまた説明不足でした。
負の数は2の歩数形式で表現します。
(必要ないかと思いますが、正の数を反転させて1を足すと
その数の負になります。00000010(2)なら11111101+00000001
=11111110(-2)です)
906 :
デフォルトの名無しさん :01/10/22 02:38
足し算と引き算だけで論理積は求められないのでしょうか?
907 :
デフォルトの名無しさん :01/10/22 02:41
902の方法で原理的にはもう出来てるが、、、、 すげーめんどくないか?それ。 二つの数字全部についてやってくの? しかもほとんどnoop。 効率的な定石、みたいなのないの?こういうのって。
麻衣を出せ
909 :
デフォルトの名無しさん :01/10/22 02:42
>>906 単純にはいかなそう。
902の方法で、1ビットづつ判定はできるから、
それで2つの入力値の同じ桁が両方1ならその桁は1
ということを8ビット分ループさせれば一応答えは出そう。
めんどくさい。
910 :
デフォルトの名無しさん :01/10/22 02:45
>>900 >>902 でのレスで少し兆しが見えた気がします。
nビット目が1か0かを調べるには、8-nビット左シフトして、J/nを使えば
1なら負と判別するので、わかりそうですね
911 :
デフォルトの名無しさん :01/10/22 02:48
>>887 値1
値2
ループカウンタ:00000001(2進)
結果:00000000(2進)
を用意
1.値1、値2が両方負なら結果に+1
2.値1、値2ループカウンタ、結果、2倍(左シフト、n+n)する
1と2をループカウンタが0になるまで繰り返す。
ループカウンタはシフトでカウントする必要はないけどね。
912 :
デフォルトの名無しさん :01/10/22 02:50
俺馬鹿だからわかんないんだけど、この計算機って定数扱えないよね。 判定したあとの結果の保管ってどうやるの? 右シフトもないし...
(ごめん、途中でなげちゃった。) 記憶域の初期値は実行前に設定できる前提でいいのかな。
914 :
デフォルトの名無しさん :01/10/22 02:53
>>911 >2.値1、値2ループカウンタ、結果、2倍(左シフト、n+n)する
2.値1、値2、ループカウンタ、結果を、2倍(左シフト、n+n)する
915 :
デフォルトの名無しさん :01/10/22 02:55
とりあえずリテラルが使えないので、 B/8 B/8 とか駆使しないと駄目なんだね。面倒だ。 00000001 が必要だから、どうにかして作らんといけないんだろうな。 Jたくさん使って、入力から 10000000とか作って、 引き算駆使して 00000001作るのか?なんか終わってるな。
916 :
デフォルトの名無しさん :01/10/22 02:55
>>912 結果の保管はT/n命令でn番地にできるよ。
保管に右シフトは関係ないんじゃない?
いや、そういう意味じゃなくて、915のいうように1を作らなきゃいけないでしょ。 で、右シフトがあれば、判定終了時には最上位ビットがなにかはわかっているから 右シフトと引き算あたり使って1なり0を作れそうだよね。
918 :
デフォルトの名無しさん :01/10/22 03:04
左に7シフト、 もしマイナスなら、0から引いて0111111が作れる。 そうじゃなければ6シフト、以下同様で、結局01111111 は作れる(か全部0) これが出来れば11111110が作れて00000001が作れるかな? でもすごく面倒。 もっといい方法があるのかなぁ。
なんか舌足らずだなおれ。えーっと保管の前に保管する対象である0なり1を作る必要があるよね。ってことで。sage
>>917 なるほど理解した。
しかしそこまで求められる問題なのだろうか?
現実にこんな処理系があったら人間に入力させる前に
初期化させるよなぁ。
921 :
デフォルトの名無しさん :01/10/22 03:10
>>919 ビットマスクとして00000001さえ作れれば、
それを条件判定のたびにビットシフトしていって、
論理積条件が成立した桁のときだけ、ビットマスクの値を結果に足す
ってやればいいでしょ。
ごめん、このレスいらないかも(汗
923 :
デフォルトの名無しさん :01/10/22 03:15
レス、ありがとうございます。 ここをみながら私も考え中です。 また、説明不足です。 定数は扱えます。 左の番号はメモリの番地なので、00001111という定数が使いたいときは 適当な番地、たとえば10番地に00001111と入れておきます。 メモリに直接命令を組み込んでおいて、上から順にプログラムを読んでいきます。 たとえば、 0:w/5 1:L/5 2:A/5 3:T/5 4:W/5 5:00000001 とプログラムすれば 0番地を読んだときに5番地の内容である00000001を出力して 4番地まできたときには、それまでに5番地の内容が書きかえられているので 00000010が出力されます
924 :
デフォルトの名無しさん :01/10/22 03:17
>>923 なら、問題はすべて解決したぞ。
あとはがんばって、プログラムしてくれ。
925 :
915=918 :01/10/22 03:18
先にいってよ! 真面目に考えチャターヨ
926 :
デフォルトの名無しさん :01/10/22 03:21
ありがとうございます。いただいたヒントでがんばってみます!
927 :
デフォルトの名無しさん :01/10/22 03:27
>>925 ほんっとに、ごめんなさい。 反省しています。これからは、ちゃんと整理してから書きこむようにします。 すみませんでした。
そんな恐縮されても困る(藁
, ―' γ∞γ~ \ 人w/ 从从) ) / ̄ ̄ ヽ | | l l |〃 < 一件落着! `wハ~ ーノ) \__ / \`「
, ―' γ∞γ~ \ 人w/ 从从) ) / ̄ ̄ ヽ | | l l |〃 < 補足:ループカウンタの終了条件も負かどうかだよ。 `wハ~ ーノ) \__ / \`「
931 :
デフォルトの名無しさん :01/10/22 04:12
0:R/X 15:B/o1 Z:00000000 1:R/Y 16:T/ss X: 2:L/X 17:J/2 Y: 3:S/ss 18:J/0 4:J/19 19:L/aa 5:L/Y 20:S/o1 6:S/ss 21:T/aa 7:J/19 22:L/ss 8:L/Z 23:B/o1 9:A/aa 24:T/ss 10:T/Z 25:J/3 11:L/aa 26:J/0 12:S/o1 o1:00000001 13:T/aa aa:00000001 14:L/ss ss:00000111(7)
932 :
デフォルトの名無しさん :01/10/22 04:14
0:R/X 15:B/o1 Z:00000000 1:R/Y 16:T/ss X: 2:L/X 17:J/2 Y: 3:S/ss 18:J/0 4:J/19 19:L/aa 5:L/Y 20:S/o1 6:S/ss 21:T/aa 7:J/19 22:L/ss 8:L/Z 23:B/o1 9:A/aa 24:T/ss 10:T/Z 25:J/3 11:L/aa 26:J/0 12:S/o1 o1:00000001 13:T/aa aa:00000001 14:L/ss ss:00000111(7)
933 :
デフォルトの名無しさん :01/10/22 04:15
なんかみにくくてすみません。 出力命令入れるの忘れましたが、Zに論理積が入るようにしました。 (定数、変数は番地を書くとわかりにくいと思い、記号で書きました) 一番左のビットが1だと負と判断されるのを利用してみました。 (負の場合は分岐せずに次に進みます。) o1は1が入っていて、変化することはありません。 aaは論理積が1の場合にZに書きこむために使います。 ssにははじめ7が入っていて、左シフトさせるために使います。 aa,ssは一回処理が行われるたびに変化します。aaは一つ左にシフト ssは-1されます。 8~18番地まではX,Yのあるビットが共に1のときのみ通過します。 19~26番地はどちらか一方でも0の場合に通過します。
934 :
デフォルトの名無しさん :01/10/22 04:18
どうでしょうか。 いただいたアドバイスをもとに考えてみました。 おかしな所があった是非だめだしをよろしくお願いします。
これはRISCか?(藁
936 :
デフォルトの名無しさん :01/10/22 05:31
ssって変数ですよね? なら、 3:S/ss の様な使い方はできないと思うのですが。 S/n アキュムレータの内容をnビット左にシフトする 最下位の桁には0を埋める
937 :
デフォルトの名無しさん :01/10/22 05:40
000:R/900 001:R/901 002:L/900 // al := [900]; 003:J/100 // if al >= 0 then goto 100; 004:L/901 // al := [901]; 005:J/100 // if al >= 0 then goto 100; 006: // al := [904]; 007: // al := [801 + al]; // ←これが出来ない 008: // al := al + [902]; 009: // [902] := al; 100:L/900 // al := [900]; 101:S/1 // al := al shl 1; 102:T/900 // [900] := al; 103:L/901 // al := [901]; 104:S/1 // al := al shl 1; 105:T/901 // [901] := al; 110:L/904 // al := [904]; // カウンタ 111:B/801 // al := al - 1; 112 T/904 // [904] := al; 113:J/002 // if al >= 0 then 002; 700:W/902 701:J/0 // 終了 800:00000000 801:00000001 802:00000010 803:00000100 804:00001000 805:00010000 806:00100000 807:01000000 808:10000000 900:値A 901:値B 902:0d 903:801d 904:7d
>>879 が解決したら新スレたててね。 >麻衣
まず897は解決したい最短経路をはっきりさせなさい
巡回セールスマンも最短経路と呼ぶけど、ダイクストラ法の使える最短経路とは
難しさのレベルが違うんだから
939 :
デフォルトの名無しさん :01/10/22 16:49
こんなのどう? 00:R/X X番地に値1を代入 01:R/Y X番地に値2を代入 02:L/X 値1をアキュムレータに格納 03:J/09 論理積が0になるなら09番地に分岐 04:L/Y 値2をアキュムレータに格納 05:J/09 論理積が0になるなら09番地に分岐 06:L/Z 結果をアキュムレータに格納 07:A/aa 結果+1 08:T/Z 結果を更新 09:L/ss ループカウンタをアキュムレータに格納 0A:A/ss ループカウンタ+ループカウンタ 0B:J/18 ループ終了(ループカウント=0)なら18番地に分岐 0C:T/ss ループカウンタを更新 0D:L/X 値1をアキュムレータに格納 0E:A/X 値1+値1 0F:T/X 値1を更新 10:L/Y 値2をアキュムレータに格納 11:A/Y 値2+値2 12:T/Y 値2を更新 13:L/Z 結果をアキュムレータに格納 14:A/Z 結果+結果 15:T/Z 結果を更新 16:L/aa 1をアキュムレータに格納 17:J/02 02番地に分岐 18:W/Z 結果を出力装置に出力 19:J/00 実行停止 X番地 値1 Y番地 値2 Z番地 結果(初期値:00000000) aa番地 定数1(初期値:00000001) ss番地 ループカウンタ(初期値:11111111)
940 :
質問した本人 :01/10/22 17:37
>>936 そうだー!
できませんよね。ありがとうございます
941 :
デフォルトの名無しさん :01/10/22 19:30
以下 解答してください 問2 a = 5+(6+(7+b)); をコンパイルした結果はどうなるかを、自分の頭で考えて示せ。 a = 0+(1+(2+(3+(4+(5+(6+(7+b)))))))-(0+(1+(2+(3+(4+(5+(6+(7+b)))))))); は、どうなるだろうか? 自分が、どのように考えて、その結果を出したのか、そして、それをアルゴリズムにするにはどうすれば良いのかを考えよう。 ヒント まず式を木の形に書いて、構造を調べる push, pop を使ってスタックを使う方法もある 実際のコンパイラの出力と比較してみよう。 -------------------------------------------------------------------------------- 問2 上のプログラムをIntel CPU上で、gcc -O -S test.c を使ってコンパイルすると最適化がかかる。最適化した場合としない場合で、どのような違いが出るか? (ヒント diff を使うと簡単...) 問1で、これらの結果を実際のアセンブラで実行しテストするには、どうすれば良いか考えて実行せよ。 これらの命令が実際に生成されるCのソースコードを考えて、それをコンパイラに通し、実際に命令が生成されることを確認せよ。(ただし、データのアドレスは、変わっても良いとする)
以下 解答してください 問 HSPで 2 + 7 * 2 をコンパイルすると結果は18となる。 では、HSPがどのように考えて、その結果を出したのか、 そして、それをアルゴリズムにするにはどうすれば良いのかを 自分の頭で考えて示せ。
943 :
質問した本人 :01/10/23 03:12
0:R/X 1:R/Y 2:L/X 3:J/9(最上位ビットが0の場合JUMP) 4:L/Y 5:J/9 6:L/Z(6~8で共に1の場合そのビットに1を書きこむ) 7:A/o2 8:T/Z (9~17の操作ではo2を右に1ビットシフトさせるために、左に7ビットシフトさせています) (左に消えたら、右に出てくるようになっています) 9:L/o2 10:A/o2 11:J/13 12:A/o1 13:T/o2 14:L/o3 15:B/o1 16:T/o3 17:J/9 (18~23ではX、Yの値を左に1ビットシフトさせます) 18:L/X 19:S/1 20:T/X 21:L/Y 22:S/1 23:T/Y (24~25で右シフトのときに使ったループカウンタ(o3)を元に戻します) 24:L/o4 25:T/o3 (26~28で全体のループカウンタである(o5)を更新します) 26:L/o5 27:B/o1 28:T/o5 29:J/o5(o5が0以上ならJUMP、負なら出力して終了) 30:W/Z 31J/0 X: Y: Z:0000 0000 o1:0000 0001 o2:1000 0000 o3:0000 0110 o4:0000 0110 o5:0000 0111
944 :
質問した本人 :01/10/23 03:12
どうでしょうか?
945 :
デフォルトの名無しさん :01/10/23 03:18
Delphiで書くとこんなかんじ。 function GetAnd(A, B: ShortInt): ShortInt; var I, AddValue, ReversedResult: ShortInt; label AndLoop, ShiftA, ReverseLoop, ShiftB; begin ReversedResult := 0; AddValue := 1; I := 7; AndLoop: if A >= 0 then goto ShiftA; if B >= 0 then goto ShiftA; ReversedResult := ReversedResult + AddValue; ShiftA: A := A shl 1; B := B shl 1; AddValue := AddValue shl 1; I := I - 1; if I >= 0 then goto AndLoop; // ReversedResult には上位・下位ビットが逆の AND 値が入っているので、 // ビットを入れ替える。 Result := 0; AddValue := 1; I := 7; ReverseLoop: if ReversedResult >= 0 then goto ShiftB; Result := Result + AddValue; ShiftB: AddValue := AddValue shl 1; ReversedResult := ReversedResult shl 1; I := I - 1; if I >= 0 then goto ReverseLoop; end;
946 :
デフォルトの名無しさん :01/10/23 04:06
>>943 29:J/o5 は、不可能と思われ。
あと、結果を最上位ビットから順に入れようと
思わないで、
>>939 のようにするほうが楽。
>>939 は、くせがあるけど、間違ってはいないと
思うので、一度じっくり解析してみたら?
>>943 o2の初期値が 10000000なので、al は 0 のままで、12行目は実行されないほでは?
9:L/o2 al := o2 + o2; // al := 0
10:A/o2
11:J/13 if al >= 0 then goto 13;
12:A/o1 al := al + o1;
13:T/o2 o2 := al; // o2 := 0
14:L/o3
15:B/o1
16:T/o3 o3 := o3 - 1;
17:J/9 if o3 >= 0 then goto 9;
948 :
デフォルトの名無しさん :01/10/23 04:33
リアルタイムのストリーミング放送って、 送られるデータの全データ長はどの程度になってるんでしょう ある程度の時間で区切った大きなデータを何度も送ってやるのか、 それとも小さなデータを絶え間無く送りつづけてやるのか
>946 29:J/o5 は 29:J/2 の間違いと思われ。
2 + 7 * 2 が 18 になっていいのだろうか?
>>950 演算子の優先順位がないんだろきっと。(2+7)*2
誤爆だったことに今ごろ気付きました すみません・・・・・・
入社前研修が自主学習で勉強してその成果として何か作って来いでした。 何かアイデアください。
>953 何の会社かによる。
業務系PG採用です。 と言っても業務の知識なんかないから、 適当なアプリ作るくらいしか思いつきません。
>955 銀行とかそんなの?
>>953 その会社を舞台にした人生ゲーム。
その会社の経営シミュレーションゲーム。
その会社の社長の顔が流れるスクリーンセーバー。
その会社で起こった殺人事件に巻き込まれた新入社員が犯人を見つけるアドベンチャーゲーム。
>>957 本格推理アドベンチャー「新入社員殺人事件」プレイ希望
デフォルトの名無しさん :01/10/22 19:30 以下 解答してください 問2 a = 5+(6+(7+b)); をコンパイルした結果はどうなるかを、自分の頭で考えて示せ。 a = 0+(1+(2+(3+(4+(5+(6+(7+b)))))))-(0+(1+(2+(3+(4+(5+(6+(7+b)))))))); は、どうなるだろうか? 自分が、どのように考えて、その結果を出したのか、そして、それをアルゴリズムにするにはどうすれば良いのかを考えよう。 ヒント まず式を木の形に書いて、構造を調べる push, pop を使ってスタックを使う方法もある 実際のコンパイラの出力と比較してみよう。 -------------------------------------------------------------------------------- 問2 上のプログラムをIntel CPU上で、gcc -O -S test.c を使ってコンパイルすると最適化がかかる。最適化した場合としない場合で、どのような違いが出るか? (ヒント diff を使うと簡単...) 問1で、これらの結果を実際のアセンブラで実行しテストするには、どうすれば良いか考えて実行せよ。 これらの命令が実際に生成されるCのソースコードを考えて、それをコンパイラに通し、実際に命令が生成されることを確認せよ。(ただし、データのアドレスは、変わっても良いとする)
>>959 宿題ならなんでもって言ってもさあ、そいつはさあ
”自分の頭で考えて示せ” だしなあ・・・
正直、カッタルイ問題だしさあ、
せめてどれかアセンブラ出力出して、何か自分のコメント言ってみろよ
掲示板をアプリケーションウィザードだと勘違いしてる偽学生諸君、君らは 何のために親のスネをかじって学校に行ってるのか? 将来就きたい職業 に向けて職能を身につけるためではないのか? 課題を丸投げして「動くようにしてください」なんてやってると君らの頭には 何も残らない。職能なんか身に付かない。考える必要がないから。 それでは君らのためにならない。いや、この際君らのことはどうでもいい。 何も知らずに高い学費を払っている親御さんが不憫だし、なによりも そーやって単位を取得して「●●大学工学部情報工学科卒」なんて履歴書 もって 入ってこられると、俺達現場の人間が非常に困る。 頼むから向学心がないならさっさと単位をあきらめて別の道を選べ。 それでも課題をやって欲しかったら学校名と学籍番号を書いてくれ。 早急に人事に連絡しておくよ。「こいつが来ても追い返せ」とね。
>953 この板用の過去ログ検索システム作ってみたら? SQL使うDBでやると即戦力になるんじゃない?
#include void main(void){ int you,i; srandom(time()); printf("===じゃんけんゲーム==="\n"); printf("1:グー 2:チョキ 3:パー\n"); i=random() % 3 +1; printf("ジャンケンポン:"); scanf("%d",&you); printf("あなた:%d,わたし%d\n",you,i); if((you==1&&i==2)|| (you==2&&i=3)|| (you==3&&i=1)) { printf("あなたの勝ちです。\n"); } else if(you==i) { printf("あいこです。\n"); } else{ printf("あなたの負けです。\n"); } } このプログラムを以下のようにしてください。 1:勝敗をカウントし、先に3勝した方が勝ちとします。 2:ジャンケンの手は整数に置き換えて入力する。例えば グーは1、チョキは2、パーは3、それ以外は入力エラー とし、再度入力するものとします。 このような問題が出たんですけど、どうしたらいいんでしょうか? 誰か教えてください。
>>963 書いてあるとおりにすればいいと思います。
とりあえず2の第一条件は既に満たしてると思う。
そろそろ次スレか? >1:勝敗をカウントし、先に3勝した方が勝ちとします。 勝敗カウントする変数用意(ここではa,bとする。実際はまともな名前で)して、 それで while((a < 3 ) && ( b < 3)){ 処理 } という感じにする。 >それ以外は入力エラーとし、再度入力するものとします。 do{ scanf("%d",&you); もしyouが判定外ならエラーメッセージ }while(判定内じゃない限り); って感じでどう?
>966 それをどこの部分にいれればいいんですか?
すみません・・・。初心者なもんで。
>969 自らが習ってきたことに答えはあるはず。 与えられた教材や資料から己の頭で考えることを覚えろ。
もういいじゃない。 つまらない問題なんだしさ、さっさと終らせて次いこ #include <stdio.h> #include <stdlib.h> int main(void){ int c1=0,c2=0; int you,i; randomize(); printf("===じゃんけんゲーム===\n"); while(c1<3&&c2<3){ printf("あなた%d回と私%d回:1:グー 2:チョキ 3:パー\n",c1,c2); i=random(3) +1; you=0;while((unsigned)(you-1)>3){char buf[100];printf("ジャンケンポン:"); fgets(buf,80,stdin);sscanf(buf,"%d",&you);} printf("あなた:%d,わたし%d\n",you,i); if((you==1&&i==2)||(you==2&&i==3)|| (you==3&&i==1)) {printf("あなたの勝ちです。\n");c1++; }else if(you==i){printf("あいこです。\n"); }else{printf("あなたの負けです。\n");c2++;} } return 0; }
で、次も麻衣で行くの? 優しいお姉さんに戻るの? この麻衣はスレたてすぎたらしいから誰かお願いね
このスレで円満にまたーりするには、 (1)努力している姿勢(フリ)を見せる。 (2)丸投げしているように見せない。 ってのは重要だね。ちなみに単位を落として教授に泣きつきに行くときも これは大切。せめて、テストの解答をレポートとしてまとめ持参し、「俺は単位を 得るに値する学力をつけた」フリをすること。もちろん、先方はすべてお見通し だが、ただ「ごめんなさい、ごめんなさい」では教授としてもいかんともしがたい。 がんばれ、969
実行したんですけど失敗しました。 っていうかまだ習ってないのがいっぱい使われてる・・・。
そうそう、 乱数の部分は フリーのBCB55でコンパイル出来るように直してあげたからね
お兄ちゃんご苦労様 >> 976
age
980 :
初めてです :01/10/24 22:18
例えばtest.cというプログラムを実行したとき、その中で実行された文だけを, たとえばkakidasi.txtに書き出していくプログラムって どのように書いたらいいんでしょうか? よろしくお願いします
test.c を実行にあわせて動作した一行を書き出すって事か?
文が変だ。 1行ごと実行を追いたいなら printf で足りると思う。実行時に test.exe > kakidasi.txt ってやれば充分でしょ。
>>980 デバッグ目的なら、ブレークはってステップ実行してほしい。
985 :
デフォルトの名無しさん :01/10/25 22:14
この職って会社のどんな事に役立ってるのですか? まだ社会人ではないのでまったく想像できません。 ソフトってものはどんなものなのか・・・・・? それが何の役に立つか何を作っているのか・・・・・? みなさん教えてください。
>>985 旧スレ上げてるようなやつには死んでもわからない。
988 :
初めてです :01/10/26 16:17
レスたくさんありがとうございました。 書き方が変でした。実行を一行ごとに追っていって 実行された文を例えばkakidasi.txtに 書き出したかったんです。 それで「実行し、実行された文を書き出す」 ためにどれくらいの時間がかかったかを最終的に 知りたいんですが・・・・・。
989 :
キリ番ゲッター :01/10/26 18:48
1000間近スレッド発見
990 :
キリ番ゲッター :01/10/26 18:48
1000狙うからな かくごしろよ>ALL
991 :
キリ番ゲッター :01/10/26 18:49
いいかROMよ 俺様が1000取ったら ウラビデオ さしあげます
992 :
キリ番ゲッター :01/10/26 18:49
1000だ 1000を持って来い ははは
993 :
キリ番ゲッター :01/10/26 18:50
994 :
キリ番ゲッター :01/10/26 18:50
もちろん邪魔したら ウラビデオは 配布中止でーす hehehe
995 :
キリ番ゲッター :01/10/26 18:51
つーことで 1000狙う!!!!!! hahaha
996 :
キリ番ゲッター :01/10/26 18:51
もうすぐだ がんばるぞ
997 :
キリ番ゲッター :01/10/26 18:52
1000は美しい数字 俺様がもらう
998 :
キリ番ゲッター :01/10/26 18:52
伝説のスレッド age
999 :
キリ番ゲッター :01/10/26 18:53
やっとこさ リーーーーーーーーーーーーーーーーチ わおおおおおおおおおおおおお
1000 :
キリ番ゲッター :01/10/26 18:53
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。