■掲示板に戻る■ 関連ページ 全部 1- 101- 201- 301- 401- 501- 601- 最新50 [PR] [PR]

お兄ちゃんの宿題、私が答えるよ

1 :麻衣 :2001/02/22(木) 23:50
お姉ちゃんのレスがいっぱいになったから新しいスレ作るね♪
これからは私がお兄ちゃんの宿題手伝ってあげる。
でもあんまり詳しくないから分からないこといっぱいあるから
みんも一緒に考えてね。
お願い。

↓ お姉ちゃんのスレ
http://piza.2ch.net/test/read.cgi?bbs=tech&key=972032579



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 という条件に反するように感じるのですが
いいのですか?

18 :横から補足 :2001/02/23(金) 02:06
>>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

ね。あとはこの繰り返し。

がんばってね、おにいちゃん♥

#ネカマってよくこれを持続できるなぁ・・・。

23 :21=22 :2001/02/23(金) 02:32
てか、このルールって衝突起こしてない?
・・・ちぇっきんぐ

$ 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
>>30
ls -l rmってUNIXコマンド?

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 だよ

37 :デフォルトの名無しさん :2001/02/25(日) 01:53
ありがとうございました。
またヨロシクね。

38 :麻衣をチンしました。 :2001/02/25(日) 06:50
いままで度胸がなくってできなかったんだけど遂に!遂にやりました!
想像以上の効きめです!
失禁脱糞対策にあらかじめ中のみえるビニール袋に閉じこめて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方向検索で再帰かければ
簡単な気がする。

思いつきだから あんまり突っ込まないでね。

43 :デフォルトの名無しさん :2001/02/27(火) 12:19
>>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
うわぁ長いね。
ひとつだけヒントあげるね。
一度通過したところは、フラグ立てるんじゃなくて、
移動コストを書き込んでおけばしあわせになれるよ。

49 :デフォルトの名無しさん :2001/02/28(水) 10:20
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
一緒に考えてくれた他の麻衣ちゃんズの皆さんにも感謝。またよろしくお願いします。

51 :デフォルトの名無しさん :2001/02/28(水) 12:54
49の最短経路の部分がおかしいと思うのは俺だけか?

52 :デフォルトの名無しさん :2001/02/28(水) 13:51
>>51
4方向のうち一番コストの少ないのを選ばないといけないと思われ

53 :49 :2001/02/28(水) 14:52
>>51 >>52
その通り!修正しといてね>40

procedure FuSiawasenoKatati


54 :デフォルトの名無しさん :2001/03/03(土) 16:12
1週間で一億円作って来いゴラァ!

55 :デフォルトの名無しさん :2001/03/03(土) 16:20
マネーゲームIIですら、1ヶ月で一億円だぞ。勘弁してくれ。

56 :父です :2001/03/04(日) 00:03
生まれた日から今日までの経過日数を出力するプログラムの
1〜6までを答えなさい。また間違った部分を訂正しなさい。
って問題がでたんだけど分かりません教えて下さい!

#include <studio.h>
int kikan(int y1,int m1,int d1,int y2,int m2,int d2);

int main(void)
{
int tyear, tmonth, tday, year , month, day;
printf("今日は?");
scanf("%d %d %d", &tyear, &tmonth, &tday);
printf("生年月日は?");
scanf("%d %d %d", &year, &month, &day);
printf("今日はあなたが生まれて%d日目です。\n",@);
return (0);
}

int kikan(int y1,int m1,int d1,int y2,int m2,int d2);
{
int tndays; /*西暦元年から今日までの経過日数 */
int ndays; /*西暦元年から誕生日までの経過日数 */
if(m1 = 1){
y1 = A ;
m1 = B ;
}
tndays = 365*y1 + y1/4 - y1 / 400 + 306 * (m1 + 1) / 10 + d1 - 428;
if(m2 = 2){
y2 = C ;
m2 = D ;
}
ndays = 365*y2 + y2/4 - y2 / 400 + 306 * (m2 + 1) / 10 + d2 - 428;


return (E);
}


57 :名無しさん :2001/03/04(日) 01:21
>>56
まず、何も見ずに自分で考えてプログラム書いてみたら?
それから問題見直すと、簡単に解けると思われ

58 :デフォルトの名無しさん :2001/03/04(日) 01:23
>if(m1 = 1){

写しまちがってねえ?

59 :デフォルトの名無しさん :2001/03/04(日) 03:37
チャタリングの効果的な除去を教えて?

60 :デフォルトの名無しさん :2001/03/04(日) 04:22
>>56
オレもif条件の中が二つとも間違ってるに1票。
しかし==にしたとしてもおかしい気が。<=2じゃないのか?

61 :デフォルトの名無しさん :2001/03/04(日) 04:26
studio.h?

62 :デフォルトの名無しさん :2001/03/04(日) 04:33
>>59
3接点スイッチにDフリップフロップ回路かますのが理論的には理想
でもたかがスイッチ一つにそこまでは普通しない。
CRで適当にごまかせ。

63 :59 :2001/03/04(日) 06:28
>>62
CRってなに?

64 :62ではないが :2001/03/04(日) 08:54
>>63

抵抗器とコンデンサじゃないの?


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で遅いと言われたことはないです。
とくに連打するようなスイッチはありませんので。
もしかすると、業界が違うのかな?
こちらは家電系です。

72 :デフォルトの名無しさん :2001/03/05(月) 12:05
>>71 松下?

73 :デフォルトの名無しさん :2001/03/05(月) 12:15
>>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
>>72
そうだったらいいのにね。

75 :69 :2001/03/05(月) 13:21
>>71
これ以上は書けません。
スマソ

76 :父です :2001/03/05(月) 13:23
57,58、60、73さん。ありがとうございます。
おかげで合格しました。

77 :麻衣 :2001/03/05(月) 13:50
>>68
ええとね、2回同じだったらでいいと思うよ
http://www.infoeddy.ne.jp/~tensyo/prog/ALGO.HTM#CHAR1

というか今まで2回同じだったらの方法でダメだったことないよ

78 :デフォルトの名無しさん :2001/03/06(火) 11:47
>>77
どんなスイッチで経験があります?
マイクロスイッチやシートキーとかでも大丈夫でしたか?

79 :デフォルトの名無しさん :2001/03/06(火) 18:55
>>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次微分による輪郭抽出をすると元の画像はどういうふうな画像になるのですか?

82 :デフォルトの名無しさん :2001/03/07(水) 16:35
元の画像は変わらないのでは?

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
回路と組み合わせるなら
スイッチキャパシタを使う
http://www.infoeddy.ne.jp/~tensyo/prog/TMP47.HTM
みたいな方法が一番シンプルで安全確実、調整容易
しかも壊れ難い

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
ガウスの消去法で二次方程式を解く方法は、俺は知らんな。
少なくとも、高校レヴェルではなかろう。

93 :デフォルトの名無しさん :2001/03/09(金) 07:29
>>91
それって、連立方程式?

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次方程式の問題と勘違いしちゃったのかな

96 :デフォルトの名無しさん :2001/03/09(金) 16:58
>>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のような発言をなさっているんでしょうか?
もしそうだとしたらごめんあそばせ。その場合は、できれば後学のためにも
その高尚なお考えをぜひとも御開陳願いたいものだわ。

99 :デフォルトの名無しさん :2001/03/11(日) 01:39
おれの妹をいぢめるな

100 :デフォルトの名無しさん :2001/03/11(日) 03:05
このネカマ野郎

101 :デフォルトの名無しさん :2001/03/11(日) 03:14
怒った麻衣ちゃんもかわいいから許してあげようよ〜

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
>>103
>>104
fgetcしながらバッファを増やしていけよ。


106 :麻衣 :2001/03/11(日) 12:46
そういう方法もあるよね。でも、fgetsが使えるならそっち優先しちゃおうよ

107 :お局 :2001/03/11(日) 13:40
アタシは単純に「サブルーチンを作ったら、その動作条件を明示するべきだ」という話題だと
思ってるんだけど、麻衣ちゃんのご高説では、ライブラリとか、複素数対応なんていう
要件拡張の話が突然でてきて、ちょっと理解に苦しむわ。もう少しアタシみたいなバカにも
わかるように説明していただけないかしら?

assertをたったひとつかふたつ書くことが、そんなに面倒なのかしら?
それともアタシには見えないけど、コードにはきちんとコメントが書いてあるのかしら?
プログラミングを始めたばかりの人に、プロの正しい習慣を示すことと、プロとしては
あまり適切でない応対を見せることの、どちらが宿題のアドバイザーとして求められる
姿なのかしら?

それに、複素数に対応することと、環境によってはプログラムがクラッシュすることを
避けることの二つに優先順位をつけるときに、前者が優先するっていうのも、アタクシ
のような古い人間には大変興味深い価値観だわ。

それとも、もしかして麻衣ちゃんは素人に毛が生えたレベルのプログラミングで満足で、それ
以上のレベルに行く気はないってことかしら。
それならそれでもいいんじゃないかしら。いつまでも半人前扱いで、ちゃん付けで呼ばれる
なんていう屈辱的な状況に耐えられそうにないから、アタシはゴメンだけど。

お目汚し失礼。お忙しいでしょうから、特に反論はいただかなくても結構よ。ごめんあそばせ。


108 :デフォルトの名無しさん :2001/03/11(日) 16:19
おれの妹をいぢめるな

109 :デフォルトの名無しさん :2001/03/11(日) 16:20
このネカマ野郎 

110 :>107 :2001/03/11(日) 16:55
なんか独り善がりなひとだなぁ。そんな大袈裟なもんかい?

>教育的配慮に欠ける
なんだそら?よくもそこまで邪推できるもんだ。
だれもそんなことで影響受けやしないし、技術者の姿勢云々なんて発想は
しやしない。洒落や愛嬌の範疇じゃん。

>それに、複素数に対応することと、環境によってはプログラムがクラッシュすることを
>避けることの二つに優先順位をつけるときに
この発想は変だよね。優先順位をつけるなんてありえないもの。
プログラムがクラッシュしないのは絶対条件であって、何かとトレード
オフなんてできるわけ無いじゃん。
ましてプログラムに要求された機能とクラッシュ云々は何の関係もない。

>前者が優先するっていうのも
そもそも誰もそんな事言ってないし。

こめけえヤツ(笑


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ハ~ ーノ)   \__
   / \`「


でも、将来再利用を考えるなら別の設計にするな麻衣は

116 :デフォルトの名無しさん :2001/03/11(日) 21:04
試合に勝って勝負に負ける頭でっかちなお局であった。


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();
}


118 :デフォルトの名無しさん :2001/03/11(日) 22:35
このネカマ野郎 

119 :お局 :2001/03/11(日) 23:20
>>115
ご理解いただけてうれしいわ。宿題回答がんばってちょうだい。

120 :デフォルトの名無しさん :2001/03/12(月) 01:31
んー、ネカマじゃなくて、本物のオカマさんたちですよ。
「お局」なんていうハンドルネームを、デブオタが考え付くとは思えない。
北島パヤ(マヤではない)なんていうキーワードに反応するはず(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;
}

130 :全員落第! :2001/03/12(月) 06:11
布団の中で、バグ発見。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次式の解を求めるルーチンを書くのは大仕事。詳しくは
数値計算の専門書をご覧になってね。
アタシだったら、恐くてそんな汎用化は考えられないわ。よっぽど自信がおありになるのね、
麻衣ちゃんは。若いって恐いもの知らずでいいわね。うらやましいわ。

ではみなさんごきげんよう。ババァは引っ込むので、麻衣ちゃんにご用のある次の方、どうぞ。ほほほ。

142 :>お局 :2001/03/12(月) 16:27
誰も望んでないのによくもまぁダラダラと…

このまま行ってもスレの趣旨とずれるのは目に見えてるし、やりたきゃ別スレ立ててやれば?
「もの知りお局の自己顕示スレッド」
なんてどう?

しかし負けず嫌いもそこまで行くと見苦しさを通り越して哀れだね。
下手くそなオカマキャラまで立てて、まったく情けないというかなんというか…


143 :デフォルトの名無しさん :2001/03/12(月) 16:36
2次式を今度はn次式に仕様拡張してる・・・・

144 :デフォルトの名無しさん :2001/03/12(月) 16:39
>>673
「こめけえヤツ」ってのも大人気無いよね。
\_ ____________________/
   |/
         ∧_∧
   Ψ     (∀・  )
   □     (∩∩  ) チョットネ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

145 :デフォルトの名無しさん :2001/03/12(月) 17:16
うざいのは長文だからじゃなくってS/N比が低いから。オカマノイズあっち逝け。

146 :デフォルトの名無しさん :2001/03/12(月) 17:41
ということで、まったりと始めますか(わら

147 :デフォルトの名無しさん :2001/03/12(月) 22:11
ちゃんと根拠をあげて主張しているので勉強になる。今後も
このスレで突っ込んでほしいのー>お局



148 :デフォルトの名無しさん :2001/03/12(月) 23:44
>> 147
それは嫌。お局の発言はうざいだけだし。
あの程度の主張・知識はそこらに腐るほどころがっているよ。

そのうえここでまで見たくないって感じ。お腹一杯だって。

現実世界の”粘着いちゃもん・解説男”を見ているようで気分悪いよ。



149 :デフォルトの名無しさん :2001/03/13(火) 00:44
「嫁VS姑!!」って感じでおもしろい。
麻衣ちゃん萌え〜

150 :147 :2001/03/13(火) 00:54
>>148
そうかなー。まあ各人の好みだから仕方がないけど、例えば
Kernighan & Pike の「プログラミング作法」を読んで学ぶのも
いいけど、キャラを演じつつ プライドをかけてやりあってるのを
見て、なおかつ勉強になる、ってのも俺は楽しいなー。


151 :デフォルトの名無しさん :2001/03/13(火) 01:11
スレタイトル見ろよ。
宿題解決スレだろ?

何でそこまで一般化にこだわるかね。

152 :デフォルトの名無しさん :2001/03/13(火) 01:12
>>151
暇だからでしょう。

153 :デフォルトの名無しさん :2001/03/13(火) 01:58
ま、脱線してるのは確かだね〜。
喧嘩しないで、マターリ逝きましょうや。
俺、お局ファンだから、別スレ立てよや。
ねくすと宿題かもん、ということで麻衣がむばれ。

154 :デフォルトの名無しさん :2001/03/13(火) 05:58
お局だがなにか聞きたいことある?スレか?

155 :age :2001/03/14(水) 18:30
なんか典型的オタクの一人しゃべり(悦に入る)みたいでイタイぞ>お局

156 :デフォルトの名無しさん :2001/03/15(木) 09:07
しかしそのキャラは好きなので時々かき回しに来てほしいぞよ。

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
図書館には使い方の本はあったのですが組み方の本は置いてませんでした
組むには本読まないと組めないでしょうか?(難しいかな)


167 :デフォルトの名無しさん :2001/03/21(水) 03:29
そしてスレ停止

168 :デフォルトの名無しさん :2001/03/22(木) 21:48
ごめそ、ちょっとtestね。
< > < >


169 :デフォルトの名無しさん :2001/03/22(木) 23:01
#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が定義されてないってでたよ

173 :169 :2001/03/23(金) 20:57
あ、endlはstd名前空間で宣言されてますんで、
使う前に、
using namespace std;
していただけるか、もしくは、endlに名前空間決定子(だっけ?)を付けて、
smp << "test" << std::endl;
としてください。

174 :169 :2001/03/25(日) 00:47
あげ〜♪

175 :169 :2001/03/25(日) 00:47
失敗失敗(^^;

176 :麻衣 :2001/03/25(日) 10:40
呼ばれるのは OStream 内の basic_ostream からだけど

 VC++は  flush() で pubsync()が呼ばれる

 BCBでは ちょっと複雑で追いかけるのはメンドクサイ

フリーのBCB55落として自分でおいかけてよね

177 :169 :2001/03/25(日) 15:52
あ、説明不足でした。

一応追ってみることはってみたんです。(人に聞く前に試してみないと某水野になっちゃう(藁))
でも私には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
>>177 フリーのBCB55にはちゃんと STLは入っているよ
http://www.borland.co.jp/cppbuilder/freecompiler/index.html

デバッカもあるから落として コンソールアプリででも試したらいいんじゃないの?

181 :デフォルトの名無しさん :2001/03/25(日) 21:26
でも、テンプレートの中までトレース出来ないでしょ

テンプレートを展開してくれるツールでもないと、デバッカ使えないんじゃないの?


182 :169 :2001/03/26(月) 16:11
なんとか出来ましたー。

183 :デフォルトの名無しさん :2001/03/27(火) 00:19
(1)「氏名をローマ字で入力し、アルファベット順に出力する。
なお、氏名は14文字以内、忍従は50人以内とする」
(2)この名簿の作成をリスト構造を用いた処理に変更せよ

っと言う問題が解けません・・・・
言語はCです
分かる方本当に答え教えて下さい お願いします



184 :デフォルトの名無しさん :2001/03/27(火) 01:44
にんじゅう・・・

185 :デフォルトの名無しさん :2001/03/27(火) 03:15
>>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;
}

ちょっとネムイ テストしてない ごめん おやすみ

187 :デフォルトの名無しさん :2001/03/27(火) 03:31
C++になれてると「newは演算子では?」と思っちゃうな(^^;

おいらもねよう・・・。

188 :183 :2001/03/27(火) 03:34
1番も分かりません・・・・
ライブラリ関数でやるのかなぁって思ってたんですが・・・・
リスト構造使う前の一番から分からなくて・・・・
初心者何で・・・
入力作業は、gets関数で一行全部を出すようにすればいいのかなぁって
思ってたんですよ 参考書にライブラリ関数でs1とs2のような二文字の
入れ替えのがあったんでそれも使うのかなぁって思って・・・・
>>186
これってC言語ですか?
僕じゃ読む事出来ないです・・・・

189 :185 :2001/03/27(火) 03:54
全部答えちゃうとアレだから、方針だけ。

最初に名前の配列と、名前へのポインタの配列を作るんだよ。
とりあえず、人数が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文字以上入れられたらバッファオーバーフローするなぁ(汗。ま、いいか。 )

196 :194 :2001/03/28(水) 00:21
なるほど・・・・難しいです・・・・
明日までにか完成したい・・・
>>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」をすればいいんですよね???
そうしたら終了する事出来ました 何か嬉しかったです 感謝です
やっとここまでこれた・・・後は最難関の交換・・・・


200 :191 :2001/03/28(水) 01:12
俺のプログラムは最悪だが(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」
ってのが現れてしまいます。 後一つ、終了条件でリターンキーで終了にしたい
場合はどうすればいいんでしょうか?


203 :191 :2001/03/28(水) 01:25
>>201
#includeきつい(w
達人ならqsort自前で7行いけるかも

204 :デフォルトの名無しさん :2001/03/28(水) 01:34
>>202
5がでるのは正しくない入力(0)のときもnが加算されてるから
じゃないでしょうか。リターンキーで終了するなら s == 0 で
だめかなぁ・・(たぶん)

#ちなみにソートするなら最後にかけたほうがいいですね

205 :202 :2001/03/28(水) 01:46
>>204
s==0で駄目でした・・・・
一つ入力してリターン押すだけで終了してしまいます・・・・


206 :202 :2001/03/28(水) 01:48
あっ s!=0で出来ました

207 :202 :2001/03/28(水) 01:50
今度は例えば5人入力したら、プラス二人分の数字が出てしまう・・・


208 : :2001/03/28(水) 10:41
>>207
最新版はコッチ?
http://piza.2ch.net/test/read.cgi?bbs=tech&key=979529893&st=475&to=475&nofirst=true

・qsortはループの外に
・リターンで終了の方は if( s==0 ) break; にして、
 while() の中身には50人で終了って方の条件を書いておく
・s>14 だったら i++ やら n++ はしない
・ループ後の謎の n++ は何?

かな。

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 --> ... こんな感じに.
あとはあなたの学習に期待します.

214 :191 :2001/03/28(水) 22:22
うざくてスマ>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
あっそうですかね・・・・
とりあえず、出来るだけ頑張ってみます・・・・
学生生活最後と言うか、社会人前の残りの時間に
遊べないのは少し憂鬱ですが、今までやってなかった自分が
悪いからしょうがないや・・・・

219 :デフォルトの名無しさん :2001/03/29(木) 01:02
210はそもそもポインタが判っていないに一票

220 :210 :2001/03/29(木) 01:10
ポインタですか・・・・
言っている意味は分かっているつもりなんですが・・・・
どうなんでしょうかね・・・・


221 :デフォルトの名無しさん :2001/03/30(金) 09:55
年度終了上げ

222 :デフォルトの名無しさん :2001/04/08(日) 13:29
麻衣たん‥‥ハァハァ

223 :デフォルトの名無しさん :2001/04/08(日) 16:17
ウハウハ

224 :デフォルトの名無しさん :2001/04/09(月) 02:23
仮想メソッドのオーバーライドをしている関数を「多態」の概念を使わずに説明する方法を教えてください。
30分以上悩んでるけど、うまい説明が思いつかない。

225 :デフォルトの名無しさん :2001/04/09(月) 02:38
>>224

「ここは処理をカスタマイズしているんだよ」とでもいえば?
あとは自分で考えよう。

っていうか多態抜きでそんなこと説明して意味あるの?

226 :デフォルトの名無しさん :2001/04/09(月) 02:41
バイトの仕様書でねー・・・。
難しい言葉使うなゴルァ!!とか言われたんだよ・・・。鬱。

227 :デフォルトの名無しさん :2001/04/09(月) 07:16
じゃあ、噛み砕いてあげればいいんじゃないの?
「言葉」と「概念」はレベルが違う

228 :デフォルトの名無しさん :2001/04/09(月) 11:16
>>224ではないけれど。
そのかみ砕きかた、私も知りたいなぁ♪

229 :デフォルトの名無しさん :2001/04/09(月) 12:38
行いたい動作を指定すると、いくつかある処理の中から適切なものが自動的に
選ばれて実行されます。
以前の手法では、どの処理が適切な処理なのか、プログラマがひとつひとつ
確認して指定する必要がありました。その確認処理が自動化されたので、
ミスが減少し、品質の高いプログラムが作成しやすくなりました。

とか

230 :デフォルトの名無しさん :2001/04/09(月) 13:35
すばらしい!>>229
でもそれでもまだ「難しい」と言われるかも。
噛み砕き方なんてどうでもいいんよ。
自分が「多態性」を使う時のイメージを使えば。

それにしても、224ってバイト君で、
会社でのチームリーダーかなんかにそういうこと言われたのかな?
だとしたら相当・・・

231 :デフォルトの名無しさん :2001/04/10(火) 12:08
なんとかだまくらかしてオーケーもらったよ・・・。
さんくすあろっと ふぉー おーる♪

232 :質問厨房 :2001/04/10(火) 19:40
コードの途中のアドレス知る方法ってあります?VC++で。
関数の先頭アドレスとかは普通に判るんで、そこからnバイト〜とかやっていても、
途中のコード変えたりコンパイルオプション変えたりするとズレますよね。
自己書き換えっつっても、AIとかじゃなくて、プログラムサイズ縮小狙ってます。

233 :232 :2001/04/10(火) 20:27
よー考えたら、アドレス知りたいとこで関数へのポインタ使えば
解決ですね。厨房カキコすみません。

234 :デフォルトの名無しさん :2001/04/10(火) 20:28
>>232
せいぜいデバッガで追うくらいしかないんでは?
最適化かけたら元のソースと一対一対応なんてつかないし。

235 :デフォルトの名無しさん :2001/04/14(土) 18:13
麻衣ちゃん元気?

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行目には激しく同位体。
そんなに「概念」が嫌いならプログラマ/ソフトハウスなんざ
たたんじまえって感じ。小難しいもん(大難しくはないが(笑))を
避けて通れる畑じゃないっしょ。

240 :デフォルトの名無しさん :2001/05/09(水) 09:24
わけのか分からんすれが上がってる

負けるな麻衣ちゃんage

241 :デフォルトの名無しさん :2001/05/09(水) 10:39
麻衣ちゃんにはお世話になったのでage

242 :デフォルトの名無しさん :2001/05/10(木) 16:26
さがってるのでage

243 :コロコロ :2001/06/04(月) 23:26
私の学校で出ている課題について教えてください。できれば、コード記述でお願いします。

 課題 文字列操作

 <処理概要>
入力ファイルに入っているランダムな文字列を読み込んで編集する。
 入力ファイル名  \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回


 以上が課題の内容です。ご託宣お願い致します。
いろんなスレに顔出してすみません。ただ、非常に切羽詰まってます。

244 :デフォルトの名無しさん :2001/06/04(月) 23:31
>>243
ここ参照
http://user.memberz.to/active/idol/

245 :ぐひひ :2001/06/04(月) 23:36
>>243
小一時間もあればできそうだな・・・
エコアイスのエッチな絵を30枚持ってきたら
作ってあげますよ。

246 :デフォルトの名無しさん :2001/06/04(月) 23:51
>>245
そんな、微妙にマイナーなキャラクタの絵を要求するなよ……。

247 :デフォルトの名無しさん :2001/06/04(月) 23:53
>>243
文字列操作はここ参照すべし
ttp://green.jbbs.net/shop/80/uramono.html

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よ、先生に聞いたほうがいいぞ。
女教師ならその写真はここに掲載しろ。
もっとも、一行づつ読んでもまとめて読んでも手間は
そんなに変わらないけどな。めんどくさくなるけど

254 :246 :2001/06/05(火) 01:05
>>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 で頼む。

255 :デフォルトの名無しさん :2001/06/05(火) 01:59
>>243
http://piza.2ch.net/test/read.cgi?bbs=tech&key=991155027&st=51&to=51&nofirst=true
書くべきスレを間違えたら、あやまりましょう。(^^;

256 :sageる :2001/06/05(火) 02:00
>>255

>>1
>これからは私がお兄ちゃんの宿題手伝ってあげる。

257 :デフォルトの名無しさん :2001/06/05(火) 02:28
>>256
このスレッドについての話じゃなくて、コロコロが「賢い勉強法は?」
スレッドで >>244 に対してコメントつけてることを指摘してると思われ

258 :コロコロ :2001/06/05(火) 22:52
>>254さん 大変ありがたいのですが、私のレベルを超えたプログラム
で、説明できず、パクリだと思われてしまいます。
私は、低レベルなのでそれに即したプログラムでお教え願えないでしょうか。
また、fgetsなんかを使うのでしょうか?

259 :デフォルトの名無しさん :2001/06/05(火) 23:08
いい加減にしとけよ>258

260 :デフォルトの名無しさん :2001/06/05(火) 23:21
この程度の問題も出来ないのなら、才能無いから学校なんかやめた方がいいぞ。

261 :デフォルトの名無しさん :2001/06/05(火) 23:24
>258
この問題は、
・文字列とポインタ
・ファイル入出力
の2つをマスターしてないと解けないし、解法を説明されても理解できない。
自分が低レベルなら基礎から勉強し直せ。

262 :デフォルトの名無しさん :2001/06/05(火) 23:28
>>243
プリンターに出力して、手動で置き換えた後、
カンピューターに入力する。

263 :デフォルトの名無しさん :2001/06/06(水) 00:02
コロコロ君。ハンドルはタコなのかい(w
サッカーばかり見てないで勉強しろよっ!

264 :ぐひひ :2001/06/06(水) 00:07
>>258
おい! エッチな絵はまだか?!

ファイルの読み込みと、文字列の変換とは別に考えろよ

265 :デフォルトの名無しさん :2001/06/06(水) 00:19
http://piza.2ch.net/test/read.cgi?bbs=tech&key=979529893&st=973&to=974&nofirst=true
既に答えでてるじゃん。

266 :デフォルトの名無しさん :2001/06/06(水) 00:41
それをそのまま出したら誉めてやるけどな

267 :デフォルトの名無しさん :2001/06/06(水) 00:49
誉めてくれるってよ! やったじゃん。

268 :デフォルトの名無しさん :2001/06/06(水) 00:55
>>264 ここ参照
http://www.ucatv.ne.jp/~spitznao/itimatu.htm

269 :ぐひひ :2001/06/06(水) 01:02
>>268
Σ(゚д゚lll) ショック !
そんな電波ページみせるなよ・・・

270 :>>コロコロ :2001/06/06(水) 01:19
汎用性が全くなく、変数名も適当ですが、サルでも、
分かるように書いたので、足りない所は自分で作って下さい。
尚、このようなマルチポストは、二度としないように。
#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 ) ; }

271 :デフォルトの名無しさん :2001/06/06(水) 01:21
>>269
もう遅いです。貴方は障られました。

272 :デフォルトの名無しさん :2001/06/06(水) 01:32
>>270
いや、それは・・・ハッ!
コロコロのレベルに合わせたってことか! 納得の出来栄えだぜ!

273 :270 :2001/06/06(水) 01:39
訂正。

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だったりする。(謎)

274 :254 :2001/06/06(水) 01:52
>>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

276 :デフォルトの名無しさん :2001/06/06(水) 01:57
>>275
とうぜんアリだろうな。要改造かな。

277 :デフォルトの名無しさん :2001/06/06(水) 02:55
ttp://fine-goal.virtualave.net/paimomi.jpg

278 :デフォルトの名無しさん :2001/06/06(水) 04:12
約束の報酬です。
http://cocoa.2ch.net/test/read.cgi?bbs=linux&key=989345217

279 :デフォルトの名無しさん :2001/06/06(水) 04:34
エココって、東北電力だかのマスコットでせう?

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
>>281
秒にしてから計算しろ

283 :デフォルトの名無しさん :2001/06/07(木) 23:50
分に換算

  分  円
〜0060 500
〜0360 (p /30) *250
〜3660 3000 + (( p-360 ) /30) *30
〜4320 6300
〜    6300 + (( p-4320 ) /720) *900

284 :デフォルトの名無しさん :2001/06/08(金) 00:38
>>280
……せめて、聞く前に絵を見つけてくる程度の誠意は見せろよ。

285 :デフォルトの名無しさん :2001/06/08(金) 00:39
>>280
本気で聞いてるのなら、そこら辺の入門書でも読みなさい。
ネタだったらウザイから、もうやめれ。

286 :デフォルトの名無しさん :2001/06/08(金) 01:08
>>265
のリンク先にワラタ。

287 :デフォルトの名無しさん :2001/06/08(金) 05:44
ところで>>270>>273は260文字目と261文字目にまたがる単語は検出できないのでは?

288 :デフォルトの名無しさん :2001/06/08(金) 06:23
>>287
コロコロネタは飽きた

289 :コロコロ :2001/06/08(金) 11:32
>>270さん

申し訳ないのですが、 mygets関数とmyputs関数がどういった処理をしているか
お教え願えないでしょうか。

290 :デフォルトの名無しさん :2001/06/08(金) 11:45
>>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 );
}

291 :デフォルトの名無しさん :2001/06/08(金) 11:45
>>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);
}

292 :デフォルトの名無しさん :2001/06/08(金) 11:48
>>281

>>291 つづき

使い方

park <駐車開始時間> <駐車終了時間>

時間の表記は 年年月月日日時時分分
2001年6月8日11時45分 は 0106081145

293 :デフォルトの名無しさん :2001/06/08(金) 11:51
>>281

>>291 つづき
エラーチェックは省いてある。
計算があっている保証も無い。
解説はしない。

理解し修正し自分を磨け。

294 :デフォルトの名無しさん :2001/06/08(金) 12:54
にせんねんもんだいは?

295 :デフォルトの名無しさん :2001/06/08(金) 14:07
>>294
んなもん考慮してないよ
てゆーか、2037年だか38年だかで狂う

296 :デフォルトの名無しさん :2001/06/08(金) 16:53
あるファイルがビットマップかテキストファイルか実行ファイルか
を拡張子以外で識別する方法をVC++を使って作れといわれたのですが
まったく方法が思い浮かびません。
よろしければ知恵を貸してください。

297 :デフォルトの名無しさん :2001/06/08(金) 17:16
>>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言語の課題です、失礼しました。
ご教授お願い致します・・・

301 :デフォルトの名無しさん :2001/06/08(金) 18:08
>>299=300
思い付いたのは思い付いたんだけど、めちゃくちゃ
泥臭くてダサイ、というわけではなくて、ほんとに
何も思い付かないの?

302 :299 :2001/06/08(金) 18:17
>>301
main(int argc, char *argv[])
を用いることは分かるんですが、本当にアルゴリズムが浮かんでこないです。
すいません、ポインタ習ったばかりの厨房です・・・

303 :デフォルトの名無しさん :2001/06/08(金) 18:45
>>299-300 >>302
http://piza.2ch.net/test/read.cgi?bbs=tech&key=991726421&nofirst=true&st=16&to=16

304 :まこ :2001/06/08(金) 18:55
298です。
調べたらちょっとわかったんですよね。
&(アンパサンド)で変数扱いできるんですね。

301,303読んでそーだなぁ、他人にお願いする前に
自分のできることしつくせっっっって反省しました。
まだちょっとわかんないとこあるんですが
自前で頑張ってみますぅ。

305 :デフォルトの名無しさん :2001/06/08(金) 19:17
このスレの存在意義まで否定すんなよ(w

306 :デフォルトの名無しさん :2001/06/08(金) 19:20
>>305
要は向学心の有無なのよ。
ハナからやる気無くて、それでも単位は欲しくて、「コード書いてください」
なんて言ってる奴は氏ねってこと。

自分で考えて考えて、どうしても引っかかってることがあって助けを求めて
くるなら差し伸べる手は惜しまないよ。

307 :デフォルトの名無しさん :2001/06/08(金) 19:57
>>304
稀に見る向学心溢れる若人よ。youはきっと伸びる

308 :デフォルトの名無しさん :2001/06/08(金) 19:57
>>299
ところで仕様の質問なんだけど、検索文字列で
a##a は書式として許される?
a#b は?
a# は?
#a は?
# は?
a は?

309 :299 :2001/06/08(金) 20:44
>>303,>>306
そうですね、考え抜かずに結論だけ得ようとする姿勢だったかも知れません。
失礼しました。
結構ギリギリまで粘ったつもりでしたが…今夜12時が提出期限なので
それまでもう少し考えてみます。

>>308
はい、全て許されます。順序や字数に制限はありません。

310 :299 :2001/06/08(金) 20:45
あげちゃった…申し訳ない

311 :デフォルトの名無しさん :2001/06/08(金) 20:53
perlみたいにメタ文字にするキャラクタを変更出来るようにすればいいかもね。
('#'自体を含めたい場合とか)
仕様をまず考えないと。
・#は0個以上の任意の文字
・連続する# -> 1つの#と等価
と見なすとか。

312 :デフォルトの名無しさん :2001/06/08(金) 20:59
あと、#が最長一致なのか最短一致なのかもわからんと。
最長一致 検索文字列 "b#d" 被検索文字列 "abcdefabcdef"
-> "bcdefabcd"
最短一致 検索文字列 "b#d" 被検索文字列 "abcdefabcdef"
-> "bcd"
他には、複数見つかった場合どうするのか、とか。

313 :ぐひひ :2001/06/08(金) 23:02
>>299
暇つぶしに作ったよ。
"AI止ま" または "ラブひな" のエッチなCGを20枚進呈してくれたら
あげるよ。

314 :299 :2001/06/08(金) 23:08
レスありがとうございます。
>>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);
}

315 :299 :2001/06/08(金) 23:11
>>313
ありゃ?作って下さったんですか!
けど当方モーコラ位しか持ってないんですよね…

316 :ぐひひ :2001/06/08(金) 23:31
>>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
ところで仕様についてさらに質問なんだけど、
検索結果は、個数を先に表示するの?それとも後で?
それによって面倒くささが違ってくるんだけど。

318 :299 :2001/06/08(金) 23:58
>>316-317
ありがとうございます。えっと、個数が先だったと思います。

2次元ですか…すいませんがあげ方も知らないし、
http://www.muvc.net/subeman/index4.htm
http://www2.tomato.ne.jp/~sugar/mangalink.htm
こっから探したほうがいいかと思います…
まあどっちにしろ期限に間に合いそうに無いので一晩じっくり考えてみます

319 :ぐひひ :2001/06/09(土) 00:21
全角スペースは半角スペース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);
}

320 :ぐひひ :2001/06/09(土) 00:25
>>318
ごめん。先走った。すまん。
別のスレに書いとくつもりでここに書いちゃった。

kとかlとか変なifとか捨てちゃったから
ばれそうだと思ったら適当に直してくれ。

でも、自分で最後まで考えてね。
あと、リンクありがと!これからじっくり ぐひひ

321 :299 :2001/06/09(土) 00:47
>>320
どうもありがとうございました。吟味させて頂きます。
講義ではmain(int argc, char *argv[])という引数を用いるらしいので
もしかしたら却下される恐れもありますが、その時は自分で考えます。

322 :ぐひひ :2001/06/09(土) 00:59
>>321
最後まで付き合ってあげよう。
main( int argc, char **argv)
{
 char *moji,*find;
 moji=argv[1];
 find=argv[2];
て感じかな。こっちの方が1000文字超えたらとか考えずに済んで気が楽だ。
あと、temp[]に詰めてるあたりは今回の要求仕様に特化したもので
' 'の代わりに'\0'をつめて、それぞれの先頭アドレスを別のポインタ配列に
入れて他のなんかに使うてのが普通なんでそこんとこもついでに吟味しよう。

323 :270 :2001/06/09(土) 01:02
>>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の出現回数

324 :299 :2001/06/09(土) 02:18
>>322
わざわざ済みません、感謝します。
コードがあれば何とか理解にこぎつけられそうです。

http://www.marimo.sakura.ne.jp/~rare/top.htm
特定のパロディのCGならこっから探して提供すればよかったかな…
でもどれがAI止ま・ラブひなのキャラとか分からないので
CG現物が提示できなくてすいません。

325 :デフォルトの名無しさん :2001/06/09(土) 15:39
麻衣を出せや、(゚д゚)ゴルァ!

326 :麻衣 2nd :2001/06/09(土) 15:47
呼んだ? 今日から私がお答えするわ♥
でも報酬が用意されてないと答える気にならないかも。
報酬はモチロン! エッチなCGよ♥

327 :バカプログラマ :2001/06/09(土) 21:04
ツリー表示を自作したいと思っています。
いまどき便利なツールが出てるからそんなの作らなくていいじゃん、
と周りからは言われましたが、
どういうアルゴリズムで作られているのか知ってみたいのです。
ネットで検索したところ、再帰を使うらしいところまではわかったのですが……。
麻衣ちゃん教えて♥
(麻衣ちゃんじゃなくても可)

328 :麻衣 2nd :2001/06/09(土) 21:06
>>327
まずは報酬を提示してね♥ ぐひひ♥
そもそも、なにをツリー表示させたいの?

329 :麻衣 2nd :2001/06/09(土) 21:06
環境も書いてね

330 :名無しさん :2001/06/09(土) 21:45
再帰の他に何か特別なアルゴリズムが必要だとは
思えんが・・・。

331 :328 :2001/06/09(土) 21:59
ファイルの大きさをツリー上に表示したいのですが
なにか参考になるプログラムを作ってもらえませんか

332 :バカプログラマ :2001/06/09(土) 22:16
>麻衣ちゃん
Windowsのエクスプローラー風のツリー表示です。
今Javaを勉強しているのでJavaです。
アプレットでやりたいので、
Swing使えやゴルァってのは出来ればなしでお願いします。
エクスプローラーツリー表示の考え方だけでもよいです。

報酬は
?ttp://www.18teens.com/haken001/index2.html
おまけ
?ttp://www.kai10.com/ksk/cgi-bin/img-box/img20010607021602.jpg

333 :デフォルトの名無しさん :2001/06/09(土) 23:46


334 :デフォルトの名無しさん :2001/06/09(土) 23:46
@@

335 :麻衣 2nd :2001/06/09(土) 23:56
>>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");
}

338 :ぐひひ :2001/06/10(日) 02:04
>>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");}}
報酬ちゃんと持ってきてよ。

339 :ぐひひ :2001/06/10(日) 02:08
>>337
むう・・・やはり、報酬が手に入るまではバグ入りで公開しといた方が
いいってことなのか・・・今度からそうします。

340 :デフォルトの名無しさん :2001/06/10(日) 02:38
>>339
というか、あなたウザイです。
教えるなら教える、放置するなら放置するで態度決めてください。
同じネタで長々とスレ使われるとテンポが悪くてかないません。

341 :ぐひひ :2001/06/10(日) 03:01
>>340
態度は決まってるんだけど・・・なんかまずかったか?

342 :デフォルトの名無しさん :2001/06/10(日) 03:31
>>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
てな具合にならんか?
俺わからんぞこれ…

344 :デフォルトの名無しさん :2001/06/10(日) 04:13
#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;
}

345 :sageる :2001/06/10(日) 04:22
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";
}


}

347 :デフォルトの名無しさん :2001/06/10(日) 12:03
>>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
となるように。

最後に表示させるにはどうしたらよいのですか?
すんませんこんな簡単な問題で

350 :sageる :2001/06/11(月) 04:57
10 result = 0;
20 input a;
30 if a = 0 then print "result : "; print a : goto 10
40 result = result + a;
50 goto 10

351 :sageる :2001/06/11(月) 04:58
訂正

10 result = 0;
20 input a;
30 if a = 0 then print "result : ";: print a : goto 10
40 result = result + a;
50 goto 20

352 :麻衣 2nd :2001/06/11(月) 05:12
>>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");
}

353 :麻衣 2nd :2001/06/11(月) 05:13
>>348
javacが壊れちゃったからもうちょっと待ってね。

354 :麻衣 2nd :2001/06/11(月) 05:21
>>352 の使い方例と出力例
$ ./a.out 124,0,234,-34,0,5,5,5,0,0,3
200 15 0
って感じ
でも、出題はCじゃなさそうだし、報酬のエッチな絵はいらないわ

355 :麻衣 2nd :2001/06/11(月) 05:29
うわ、ださ! はずかしいとこ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
サンプル数を変えながら何回もやれば、
サンプル数に比例とか二乗に比例とかわかるかもね。

360 :デフォルトの名無しさん :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);
}

これでファイルに書き込めてるでしょうか?
このあとに”開きたいファイルを入力せよ”として最初に作ったファイルと同じなら
インプットしたデータをだーっと出したいのですが、どうもうまくいきません。
お助けください。

362 :デフォルトの名無しさん :2001/06/12(火) 01:14
>>361
ポインタの勉強をイチからやり直せ。
scanfのリファレンスを良く見直せ。
そもそも「文字」と「文字列」の違いを理解しろ。

363 :麻衣 2nd :2001/06/12(火) 01:46
>>361
その1 ファイル名用バッファは十分な大きさのchar型の配列にすること
その2 fopenで書き込み属性でファイルを開くと、ファイルがない場合は
     自動生成するから、そのエラーメッセージ文は不適切
その3 ファイルに書き出すときも改行すること
その4 変数seiseki1ってなんだゴルァ♥
この4点を直せばファイルに書き出すところまではOKね

364 :デフォルトの名無しさん :2001/06/12(火) 02:47
>>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っていう関数ははじめてみました。まだ習ってません。

とりあえず、ファイル名を比べずファイルの内容を表示するプログラムまで作ってみます。

370 :デフォルトの名無しさん :2001/06/12(火) 20:29
stat()でいいじゃん。

371 :デフォルトの名無しさん :2001/06/12(火) 20:31
っと、課題からすると、書き込みと表示のプログラムは別でいいんじゃないの?

372 :デフォルトの名無しさん :2001/06/12(火) 20:35
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

376 :デフォルトの名無しさん :2001/06/13(水) 00:13
>>375
そこまで出来ているなら、作ったものを書き込んで、
何が間違っているかを聞いた方が吉。

377 :お兄ちゃんのアソコl、私が舐めるよ :2001/06/13(水) 02:44
これからは私がお兄ちゃんのアソコ舐めてあげる。
でもあんまり詳しくないから分からないこといっぱいあるから
みんも一緒に舐めてね。
お願い。

378 :デフォルトの名無しさん :2001/06/13(水) 03:03
嫌だ

379 :デフォルトの名無しさん :2001/06/13(水) 03:26
ま、ま、まッ、麻衣ちゃん、
ぼ、ぼ、ぼっ、ぼくと付合って欲しいんだな。

380 :麻衣 :2001/06/13(水) 04:00
嫌だ

381 :デフォルトの名無しさん :2001/06/13(水) 13:22
「ファイル中の単語を出現位置(行)をすべて表示するプログラムをつくる.
ファイル名は「java ... ファイル名」で実行する時に指 定できるようにする.
前提知識
AVL木
関数としての見方: AVL木ではなくMapを使っ てもよい.
StreamTokenizer
StreamTokenizerのnに対して, n.eolIsSignificant(true);を実行しておくと, 改行が来るたびに
n.ttype == StreamTokenizer.TT_EOL となるので,何行目かカウントできるようになる」

という宿題が出ました。
どうしたらいいのやら、全くわからず困っています。
メールでもレスでもいいのでどなたかどうか教えてください。

382 :デフォルトの名無しさん :2001/06/13(水) 14:34
全くっつってもナニが分からんのか全く分からん(?_?)
全部作れってか?
とりあえず、自分で作ってみて、ソースあぷして、それからだよ。

383 :デフォルトの名無しさん :2001/06/13(水) 14:48
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にどうやってもちこんんでいけばいいのかわかりません。

384 :デフォルトの名無しさん :2001/06/13(水) 22:46
>>383
>ファイル中の単語を出現位置(行)をすべて表示する
ってんだから、{"WORD", [1,4,5,10] } ちゅうふうに、単語と
出現位置(vector) を Mapする。
JAVAは詳しくないから、C++でいうと、map< string, vector<int> > mapsとして、
単語の出現によって、 maps[word].push_back( line ); する。
 あとは、最後にmapsを巡回して、表示すればいいだけ。

385 :デフォルトの名無しさん :2001/06/14(木) 00:35
>>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に書いてあります。

387 :デフォルトの名無しさん :2001/06/14(木) 01:06
マルチステートメントだらけで、見辛い。
まずはそこから直せ。

388 :デフォルトの名無しさん :2001/06/14(木) 01:11
>>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

390 :デフォルトの名無しさん :2001/06/15(金) 00:17
>>386
if(!memcmp(p+m,"chocolate",9))の後のブロックが
chocolateで終わってるのに、それでコンパイラを通ったの?
何か、違うものをコンパイラしてませんか?
ちなみに、chocolate++;で、m++;を入れて試してみらた、
Borland C++とLSI-Cでは、全部表示されましたよ。(^^;

追伸
まさかとは思いますが、自分の環境でも、同じような所まで、
画面からあふれていたので、それで、表示されていないと思ったとか…?

391 :388 :2001/06/15(金) 01:25
>>390
chocolate++は直したんを忘れてが、
ちょうど25行だから単にスクロールしただけだろう。
ファイルにリダイレクトしてエディタででも見れ。>>389

それより、いきなりcore吐いたんでよく見たら、
入力ファイル名決め打ちでおまけにエラーチェックもしてねーし。
ってどうでもいいか宿題程度に。

392 :コロコロ :2001/06/15(金) 13:33
>>391さん
リダイレクトとは何でしょうか。
エディタを見るとはどういうことでしょうか。
詳しく説明していただけないでしょうか。
よろしくお願いします。

393 :デフォルトの名無しさん :2001/06/15(金) 13:37
391じゃないけど。
普通にコマンドラインからプログラムを実行すると、
どんどん表示されていってそのうちスクロールして消えていったりしますが、
画面に表示させるかわりに、ファイルに保存するという方法があるんです。

foo

というコマンドの場合、

foo > bar

のように>に続けてファイル名を書くことによって、
結果をファイル(この場合はbar)に保存することができます。

394 :デフォルトの名無しさん :2001/06/15(金) 14:46
この子ヘルプが無い環境で作業してるのかしら?
参考までに、どんな環境で作業しているか聞いてみたいもんだわ。

395 :デフォルトの名無しさん :2001/06/15(金) 15:23
>>393
あのう、標準エラー出力はどうやってロギングするんですか?

396 :麻衣 2nd :2001/06/15(金) 15:25
>>395
2> よ

397 :麻衣 3rd :2001/06/15(金) 15:54
unixの場合、シェルによって変わる可能性あるよ。
cshなら>&だね。

398 :デフォルトの名無しさん :2001/06/15(金) 16:58
shell < con > con 2> con
かな?

399 :デフォルトの名無しさん :2001/06/15(金) 20:04
>>398
入力と出力を同じファイルにしてどうするよ。
それでうまくいくのはcmd.exeだけだ。

400 :マジレスさん :2001/06/15(金) 21:40
英文を書くのに便利なプログラムお願いします
頭文字は大文字(ピリオドの次が大文字)
当然最初は大文字
英語以外はダメ
ほかは小文字
単独のiは大文字(I)
連続のスペースは1つ分にする
などです
なんかflagをたてるそうです
Cでお願いします
できますかね?

401 :デフォルトの名無しさん :2001/06/15(金) 22:23
無理!!

402 :デフォルトの名無しさん :2001/06/15(金) 22:53
>>400
某大学の宿題に酷似してるんだけど気のせいか?
まぁ、そのガッコのやつはフィルタとして作れって感じだったが。

403 :>>400 :2001/06/15(金) 23:02
ispell

404 :デフォルトの名無しさん :2001/06/15(金) 23:03
フィルタじゃなくてCでってことは、エディタをつくんなきゃいけないの?
Unix? Win?

405 :デフォルトの名無しさん :2001/06/16(土) 09:04
400
Unixです。フィルタってよく分かりません(調査中)
>>402
スレタイトル「お兄ちゃんの宿題、私が答えるよ」だし(笑)
文字判定するところのヒントだけでいいです。

406 :デフォルトの名無しさん :2001/06/16(土) 09:17
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');
}
}
}

410 :デフォルトの名無しさん :2001/06/19(火) 21:25
もひかひて、カンマが化けるんかいな。
,,,,,

411 :デフォルトの名無しさん :2001/06/19(火) 21:34
>>408
そういう低脳な煽りはこの板の住人には逆効果だ。
俺は「プログラマ」なので「プログラマー」失格でも別にイイや。とか。

412 :デフォルトの名無しさん :2001/06/19(火) 21:42
失格で結構

413 :デフォルトの名無しさん :2001/06/19(火) 21:56
「プログラマー」なら喜んで失格になりたいヽ(´ー`)ノ

414 :デフォルトの名無しさん :2001/06/19(火) 22:00
>>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は捨てていいよ♪

418 :デフォルトの名無しさん :2001/06/19(火) 23:46
>>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
プログラマー板はクッキーが必要になったね。
麻衣ちゃんはクッキー好き?

422 :デフォルトの名無しさん :2001/06/22(金) 03:05
a.length()

423 :400 :2001/06/22(金) 16:02
ピリオドの次の文字を大文字にするにはどうしたらいいですか?
ピリオドを判定するやり方は分かりますが,その次の文字を大文字にする
やり方が分かりません.

424 :デフォルトの名無しさん :2001/06/22(金) 16:03
>>423
アッパーカット

425 :デフォルトの名無しさん :2001/06/22(金) 16:07
>>423
if( ch == 'a' ) ch = 'A';
if( ch == 'b' ) ch = 'B';
if( ch == 'c' ) ch = 'C';
...

426 :デフォルトの名無しさん :2001/06/22(金) 16:08
tuupper()

427 :423 :2001/06/22(金) 16:31
>>425
普通に大文字にするのは分かります
配列を使って,for文で文字列をみています。

428 :デフォルトの名無しさん :2001/06/22(金) 16:35
>>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';
 ...
}

429 :デフォルトの名無しさん :2001/06/22(金) 16:39
>>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?

431 :デフォルトの名無しさん :2001/06/22(金) 16:48
>>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だが俺間違ってる?

436 :初心者A :2001/06/22(金) 18:09
>>435
間違ってはいない。
ただ、このあとポインタ(i)をどれだけ増やす?
'.'を判定した時点でもう次にフォーカスを移すべき(i++すべき)で、
さらにa〜z内であることがわかった時点で次に移れる。
もしa〜z内でなければ、'.'であるかもしれないからi++はできない。
単純に処理後常にi++してもいいが、それじゃあ華が無い。

>>434
お題に沿ってない。

437 :デフォルトの名無しさん :2001/06/22(金) 18:12
>>435
小文字の判定がバグってないか?

438 :デフォルトの名無しさん :2001/06/22(金) 18:27
だれか>>419に答えてやれよ

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';
}
こうですよね?

440 :初心者A :2001/06/22(金) 18:36
>>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';
}

446 :初心者A :2001/06/22(金) 18:51
>>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
ピリオド∩小文字とは違うの?

450 :初心者A :2001/06/22(金) 19:11
>>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ステップ)早い。(最後だけ少し直した)

451 :初心者A :2001/06/22(金) 19:17
>>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
すまん。おおうそ。正しく動作します。

454 :初心者A :2001/06/22(金) 21:27
>>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();
}

459 :デフォルトの名無しさん :2001/06/26(火) 13:41
>>458
いったい何箇所書き込まれてるんだ?

460 :ヴァカ :2001/06/26(火) 21:25
sybaseの全データベースと全テーブルとストアドプロシジャーを
バックアップするスクリプト(Bシェル)書かなきゃいけないんですけど、まったくもって分かりません。
bcpを使うらしいのですが、bcpで全データや全テーブルを指定する方法があれば
なんとかなりそうなのですが、その方法が分かりません。
もしくは、変数か何かで指定するfor文とかなのでしょうか。
助けてください。帰れません…。

461 :デフォルトの名無しさん :2001/06/26(火) 22:51
>>460
cp -Rp xxx xxx

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言語で二次方程式の解(虚数・重解含む)を求めるプログラム
を教えていただきたいです。。

464 :デフォルトの名無しさん :2001/06/27(水) 21:57
>>463
リアル厨房?
公式に値放り込んで計算すれば?

465 :デフォルトの名無しさん :2001/06/28(木) 13:19
要素数が50の整数型配列bにおいて、b[k+1]をb[k]へ転送するプログラムを作成しなさい。
という問題があるんですがわかりません。何方か教えてください。

466 :いじわるな人 :2001/06/28(木) 14:12
>>465
for(k=50;k>=0;k--)b[k]=b[k+1];

バグをふたつ盛り込んだので、自分で直せ

467 :いじわるな人 :2001/06/28(木) 14:13
>>466
ひとつだった

468 :いじわるな人 :2001/06/28(木) 14:13
やっぱふたつだ

469 :いじわるな人 :2001/06/28(木) 14:14
いや、ぜんぜんだめだ

470 :デフォルトの名無しさん :2001/06/28(木) 15:09
memmove( &b[0], &b[1], sizeof(int)*(50-1) );

471 :デフォルトの名無しさん :2001/06/28(木) 23:05
int* c = (int*)b - 1;

c[0]は見ちゃイヤン。

472 :471 :2001/06/28(木) 23:11
逆ダッタ
int* c = (int*)b + 1;

c[49]は見ちゃダメヨ。

473 :デフォルトの名無しさん :2001/06/29(金) 12:42
宿題ネタが氾濫してきたのであげとこう

474 :C言語一週間目 :2001/07/02(月) 18:11
「1〜50の任意の整数を元にする2つの集合に対して
その和集合・積集合を求めるのをつくれ」

ってやつなんだけど、これやる考え方って配列と場合分けでいいですか?
図書館で調べたけどわからなくて。

475 :デフォルトの名無しさん :2001/07/02(月) 18:13
場合分け入らないでしょ。

配列とループだけよ

476 :デフォルトの名無しさん :2001/07/02(月) 18:20
場合分けは要るでしょ。

477 :デフォルトの名無しさん :2001/07/02(月) 18:37
任意の正数の抽出で場合分けか?
でも、それも書き方でイランような気が。

俺、問題を読み間違えてる?

478 :デフォルトの名無しさん :2001/07/02(月) 18:46
#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;
}

479 :C言語一週間目 :2001/07/02(月) 19:24
>>477
例えば
1つ目の集合 1,2,3,5
2つ目 1,3,4
とキーボードから入力させて、その和集合積集合を、です。

言葉が足らなくてすみませんでした。

480 :Java :2001/07/02(月) 19:33
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);
    }
  }

}

481 :Java :2001/07/02(月) 19:37
System.out.println(i+1); だ


482 :デフォルトの名無しさん :2001/07/02(月) 20:11
キーボードから文字をCtrl-Dで終了するまで読み取り、
アルファベット、数字、その他に分類してそれぞれの数を数えて、
表示するプログラムを作る方法を教えてください。
改行文字も「その他」で数えます。

483 :Pascal :2001/07/02(月) 20:19
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
みたいな感じになって、うまくいっているのですがバック
クウォートで囲むとダメです。
結局、バッククウォートをはずしてリダイレクトでコマンド
イメージをファイルにとって、それをシェル起動しています。
もっとスマートにやるにはどうしたらいいんでしょうか。
アドバイスお願いします。

485 :デフォルトの名無しさん :2001/07/02(月) 20:25
xargv

486 :デフォルトの名無しさん :2001/07/02(月) 22:10
#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)
から始まるのなんですよ。

488 :デフォルトの名無しさん :2001/07/02(月) 22:43
なんのこっちゃ

489 :デフォルトの名無しさん :2001/07/02(月) 22:55
#!/bin/sh
for i in *.LOG ; do
tail -8 $i > tmp.LOG
mv tmp.LOG $i
done

490 :デフォルトの名無しさん :2001/07/02(月) 23:05
#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
うはー、こうやるのですか。
なんか今まで、変なやり方ばっかりしてたような気がします。
基本がなってませんね、鬱。
ありがとうございました。

492 :デフォルトの名無しさん :2001/07/02(月) 23:13
>>490

int ch ;

493 :デフォルトの名無しさん :2001/07/02(月) 23:15
>>492
thanks!

494 :C言語一週間目 :2001/07/03(火) 01:37
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桁の数字が出たのですが前半のアドレスより
後半のアドレスが低くなることがあり、違う気がします。アドバイスおねがいします。

496 :デフォルトの名無しさん :2001/07/03(火) 02:50
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);
ってやっといたほーがよさげ。

499 :デフォルトの名無しさん :2001/07/03(火) 02:59
char inp_moji[20+1];
のほうが意味わかりやすいな。
ほんとは#defineしとくといいんだけど。

500 :デフォルトの名無しさん :2001/07/03(火) 03:02
っつか、文字列分割(3)のろじっくが入ってないな、これ。。。

501 :shige :2001/07/03(火) 04:29
こうやってPerlユーザが馬鹿にされて、コケにされて、侮辱されて、(当然のことだ)
顔を真っ赤にして耐えている姿を想像するだけで俺の気分は爽快になる。

Ruby万歳。俺にこんな快楽を与えてくれたRubyに幸いあれ。

502 :デフォルトの名無しさん :2001/07/03(火) 09:08
お兄ちゃんのアソコ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)
から始めてくれると嬉しいです。

507 :デフォルトの名無しさん :2001/07/03(火) 13:07
endpってなんじゃい。

508 :デフォルトの名無しさん :2001/07/03(火) 13:33
>>503
クラスの友達に見せて貰うなりした方が良いと思うぞ
完璧なリストを提出したら逆にバレると思われ(藁

509 :506 :2001/07/03(火) 13:50
>>507
envpの間違い(笑

510 :>486 :2001/07/03(火) 13:53
>508
クラス全員違う問題だから。

511 :デフォルトの名無しさん :2001/07/03(火) 13:56
>>510
できた!
エッチなCGを持ってきたらコピペしてあげる

512 :デフォルトの名無しさん :2001/07/03(火) 14:08
>>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次元配列を使わないといけないらしいんだけど。

515 :デフォルトの名無しさん :2001/07/03(火) 14:36
構造体はやりましたか?

構造体の配列?

516 :デフォルトの名無しさん :2001/07/03(火) 14:38
いや。まだやってませんね〜

517 :デフォルトの名無しさん :2001/07/03(火) 14:40
>>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も今だ習ったことありませんね〜

519 :デフォルトの名無しさん :2001/07/03(火) 15:04
んじゃ、最初の 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;

522 :デフォルトの名無しさん :2001/07/03(火) 15:21
1次元配列の課題なんだから配列使わにゃダメでしょ
変数配列を使わないんだったら >>512 みたいにしないと

523 :デフォルトの名無しさん :2001/07/03(火) 15:34
要するに 520(+521) だと全く動かないってことね

517 の表示部(printf 関数)だけを自分好みに変更すればヨロシ
時間があるなら一度コンパイルして試してみることをオススメ

524 :デフォルトの名無しさん :2001/07/03(火) 15:34
>522
忠告ありがとう!!助かった〜。

525 :デフォルトの名無しさん :2001/07/04(水) 06:37
最近お姉さんを見ませんが、どうなさったのでしょう?

526 :デフォルトの名無しさん :2001/07/04(水) 06:50
>>525
嫁に行きました。

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の内容を順に
出力するプログラムを作れ。」って問題教えてください。これできんと
単位が危ない・・・

どうぞ、よろしくお願いします。

532 :デフォルトの名無しさん :2001/07/05(木) 22:35
>>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の内容を順に
出力するプログラムを作れ。」

これでいいかな?カンニングしてるみたいで気が引けるけど。

535 :デフォルトの名無しさん :2001/07/05(木) 22:39
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 文でお願いします。

538 :デフォルトの名無しさん :2001/07/05(木) 22:44
>>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

542 :初必者 :2001/07/05(木) 22:51
ナイスだ先生。面白かったよー。

543 :デフォルトの名無しさん :2001/07/05(木) 22:52
親切なようでむごい539がスキ♥

544 :デフォルトの名無しさん :2001/07/05(木) 22:55
ひょっとして奴はテストもしないで提出する気だろうか。。。

545 :知りたがり矢 :2001/07/05(木) 22:59
いや、テストしたっすよ。全然でけへん

546 :デフォルトの名無しさん :2001/07/05(木) 23:01
>>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の知識
#以前の問題ではあるが。なーんも考えてないって
#ことだぞ。

あと、マジで殆どの皆は君のために言ってるってこ
とを忘れずに。

549 :デフォルトの名無しさん :2001/07/05(木) 23:06
>>547
ユーザー名 逝って良し ってのがベネ

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の内容を順に出力するプログラムがわかりません。

551 :デフォルトの名無しさん :2001/07/05(木) 23:12
>>550
もし入力が0ならばループ抜ける

552 :デフォルトの名無しさん :2001/07/05(木) 23:25
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]);

553 :まちがった :2001/07/05(木) 23:26
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");

554 :初必者 :2001/07/05(木) 23:31
>>553
a[100]に番人立てないと不味いんじゃ?
ゼロクリアされてれば良いけど。

555 :デフォルトの名無しさん :2001/07/05(木) 23:39
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]まで使う方法が思いつかんな

556 :デフォルトの名無しさん :2001/07/05(木) 23:43
>>555

i<99 ?

557 :まちがった :2001/07/05(木) 23:47
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");

558 :デフォルトの名無しさん :2001/07/05(木) 23:47
>>556
教育的配慮

559 :デフォルトの名無しさん :2001/07/06(金) 00:43
>>556
i<100 にしたら減点対象

>>557
最初の while の a[i] と i++ の処理順は全ての処理系で一意なんだっけか

560 :sage :2001/07/06(金) 00:45
処理系により異なる可能性があるよ

561 :デフォルトの名無しさん :2001/07/06(金) 00:49
>>559
言語仕様として、問題ないよ。

562 :デフォルトの名無しさん :2001/07/06(金) 01:15
どっちだよ。まぁ>>561っぽいけど。

563 :デフォルトの名無しさん :2001/07/06(金) 01:19
560 と 561 は、どっちが正しいんだ?

いや、どっちが正しいかはひとまず置いとくとして
採点する先生がどっちが正しいと思ってるか、だな

564 :デフォルトの名無しさん :2001/07/06(金) 01:29
過剰なマルチステートメントはヤメロってことで
ファイナルアンサー?

565 :デフォルトの名無しさん :2001/07/06(金) 01:36
>>564
今回のは笑えたからベネ

566 :sage :2001/07/06(金) 01:42
ごめん。
&&の前で式が一度完了するから、
つまり、処理順は一定。
561のいうとおりだった。

567 :デフォルトの名無しさん :2001/07/06(金) 01:56
式が一度完了するって、経験則でなく言語仕様によって定められてるん?
だったら >>555 は無視しておくんなまし

568 :デフォルトの名無しさん :2001/07/06(金) 02:02
>>567
式が一度完了する、ってのは言語使用レベルでは定められてないかと。
(まあ一般的なコンパイラならそこで切ってくれるけど。多分)

どうころんでも、i++ が実行されるのはカッコ内の評価が完了してから
だから問題なし。

569 :デフォルトの名無しさん :2001/07/06(金) 02:03
て優香、なんかこんなの真剣になってみんなで顔つき合わせるような話題じゃないと思うが。
いってみれば、隔離スレなんで、とっとと正解書いてお引取り願うというのはどうか?

570 :sage :2001/07/06(金) 02:06
http://www.catnet.ne.jp/kouno/c_faq/c3.html#5
http://www.catnet.ne.jp/kouno/c_faq/c3.html#8
あたりが論拠。

ISOなんかのホントの仕様については調べてない

571 :デフォルトの名無しさん :2001/07/06(金) 02:06
>>564
つーか、アルゴリズムを示すのにマルチステートメントも何もねー

572 :デフォルトの名無しさん :2001/07/06(金) 02:11
え、そう? 見づらい表記は机上デバグのミスに繋がると思うけど。

573 :557 :2001/07/06(金) 02:18
マルチステートメントって俺のこと?
面倒だったから適当に書いただけだぴょん

つーか、仕様を満たしつつも、丸コピーはさせたくねーときって
どうしてもわざとへんてこりんに書いちゃう癖があってね・・・

574 :デフォルトの名無しさん :2001/07/06(金) 03:02
>>568
>i++ が実行されるのはカッコ内の評価が完了してから
は嘘じゃない? i=1; if(i++ && printf("%d",i)); で 2 が表示されるよ

左から順に評価され結果が得られたら完了、というのは K&R の 2.6 で納得

575 :デフォルトの名無しさん :2001/07/07(土) 11:05
なんか書こうと思ったけど、そういう仕様の部分で悩む
のは不毛なんで、やめた。評価順序とか使わなくて
Basicでも正しく動作するように書けるんだから、
そうしたら?いろんな意味で正しくない?
冗長に書くのは悪くないと思うよ。

576 :デフォルトの名無しさん :2001/07/07(土) 11:21
Basic でも、ってどういう意味?

577 :sage :2001/07/07(土) 11:40
難しく書くのはやめといた方がいいよね。

でも、人の書いたコードのバグを探るときとか
こういう変なの読めないと出来ないことあるね。

578 :デフォルトの名無しさん :2001/07/07(土) 13:25
Cで順列を表示するプログラムを作りたいのですが、
誰か教えて下さい。

579 :デフォルトの名無しさん :2001/07/07(土) 13:34
>>578
意味不明
順列?

宿題なら自分でやれよ。

580 :デフォルトの名無しさん :2001/07/07(土) 14:01
>>579
ソートしたいんじゃないの?

581 :sage :2001/07/07(土) 17:59
>>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

を計算してください。


ということをとある事情でしなければいけないのですがパイソンがよくわかりません。
どなたかよろしければ教えていただけませんでしょうか?
よろしくお願いいたします。

583 :デフォルトの名無しさん :2001/07/07(土) 18:10
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は(全部そうかはしらんけど)式は全部評価する。

585 :デフォルトの名無しさん :2001/07/08(日) 00:18
あっあっだめだよお兄ちゃん。そこ関係ない。

586 :デフォルトの名無しさん :2001/07/08(日) 00:27
>>584
ようするに言いたかったのは「ショートサーキット評価しない言語でも」
ということでBasicはその例として挙げたってだけ?

587 :デフォルトの名無しさん :2001/07/08(日) 09:52
そうそう。それだけだけど、かなり移植に悩むことがあるよ。
無意味かな?

588 :sage :2001/07/08(日) 15:16
移植じゃなくて
簡単に分けて書いても
って意味では?

589 :デフォルトの名無しさん :2001/07/10(火) 20:58
   ,/^ヽ‐一^\
   / __´_∀_`_)
 . | //ノ/ ノ ノ \)
  |ハ|( | ∩  ∩|)|   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ヾ从ゝ_▽_从  < おにいちゃんおはよう!私が宿題をやっておいたよ☆
   /丶 d V bノ ̄|⊃ \____________________
   | ハ'\A/ ノ ̄
   (___)_  8   |
  ||^| |_ __ヽ
 「 ̄ ̄ ̄|||_|
 L____」||_ |_
     |___)_)

590 :デフォルトの名無しさん :2001/07/10(火) 21:06
教えてくださいお願いします。

問題
学生の名前と一つの科目の試験の成績をメンバとする構造体を
作り、さらにライブラリ関数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
ふざけんな!
〜を参照 ってのを全部ここにもってこい!

592 :デフォルトの名無しさん :2001/07/10(火) 21:30
無理矢理ヒストグラム作ってソートとかやろうと思ったけどやめた。

593 :590 :2001/07/10(火) 21:56
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____」||_ |_
     |___)_)

595 :590 :2001/07/10(火) 23:07
>>594
おにいちゃんじゃないですよ

596 :デフォルトの名無しさん :2001/07/11(水) 00:25
>>595
お兄ちゃんじゃん

597 :デフォルトの名無しさん :2001/07/11(水) 01:31
だめかな・・・

598 :中途半端くん :2001/07/11(水) 01:42
>>590
最初のここに何か
studentという構造体の定義
要素は名前用バッファと得点
と、ソートする関数の宣言

次のここに何か
i番目の生徒構造体の名前

次の次のここに何か
i番目の生徒構造体の得点

次の次の次のここに何か
ソートする関数の呼び出し

次の次の次の次のここに何か
ソートする関数の実体

599 :デフォルトの名無しさん :2001/07/11(水) 01:52
>>590
それ、うちの大学の期末課題…

こーゆーこというのもアレだけどさぁ、あの程度の授業解らないの
なら止めるか来年頑張った方がいいと思うよ。

600 :デフォルトの名無しさん :2001/07/11(水) 02:44
>>599
どこの大学?都道府県名だけでいいから教えてくれへん?

601 :デフォルトの名無しさん :2001/07/11(水) 02:51
>>599
あんたの言うとおりだよ。ちと目がさめたよ。
しかしなんだな、同じ大学の学生がいるかなと少しは思ってたけど
まさか本当にいるとはね(藁

602 :デフォルトの名無しさん :2001/07/11(水) 02:59
>>590
見にくいデス

603 :デフォルトの名無しさん :2001/07/11(水) 03:41
大学の期末課題って....
大学ってこのレベルなの?ちなみにどこ?

604 :デフォルトの名無しさん :2001/07/11(水) 07:22
>>601
そか。基本さえ解っていればすぐ解る程度だから頑張れゃ。

>>599,603
まぁ文系のドキュソ大だから。
関西で、外見だけは異常に綺麗な大学、つーたらだいたい絞れるよ。

605 :デフォルトの名無しさん :2001/07/15(日) 07:20
>>604
   ,/^ヽ‐一^\
   / __´_∀_`_)
 . | //ノ/ ノ ノ \)
  |ハ|( | ∩  ∩|)|   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ヾ从ゝ_▽_从  < もしかして、京都産業大学か?
   /丶 d V bノ ̄|⊃ \____________________
   | ハ'\A/ ノ ̄
   (___)_  8   |
  ||^| |_ __ヽ
 「 ̄ ̄ ̄|||_|
 L____」||_ |_
     |___)_)

606 :デフォルトの名無しさん :2001/07/15(日) 07:38
http://www.traffimagic.com/WIP15MMKOQA/B000147/comein/WIP

http://www.traffimagic.com/WIP15MMKOQA/B000213/comein/WJH

http://www.traffimagic.com/WIP15MMKOPA/B000191/comein/WJF

http://www.traffimagic.com/WIP15MMKOPA/B000073/comein/WJT

http://www.traffimagic.com/WIP15MMKOCA/B000143/comein/WIP

http://www.traffimagic.com/WIP15MMKOCA/B000103/comein/WJT

http://www.traffimagic.com/WIP15MMKOSA/B000125/comein/WIP

http://www.traffimagic.com/WIP15MMKOSA/B000209/comein/WJT

607 :デフォルトの名無しさん :2001/07/15(日) 10:39
   ,/^ヽ‐一^\
   / __´_∀_`_)
 . | //ノ/ ノ ノ \)
  |ハ|( | ●  ●|)|   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ヾ从ゝ_▽_从  < もしかして、京都産業大学か?
   /丶 d V bノ ̄|⊃ \____________________
   | ハ'\A/ ノ ̄
   (___)_  8   |
  ||^| |_ __ヽ
 「 ̄ ̄ ̄|||_|
 L____」||_ |_
     |___)_)

608 :デフォルトの名無しさん :2001/07/15(日) 12:56
京産ヨリモ ドキュソ ダヨ...

そういえばもうレポートの提出日は過ぎてるな。
>>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;

612 :デフォルトの名無しさん :2001/07/17(火) 18:58
メインはフローチャートの通りならこうだろうね。

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マスで形は自由とする。)
どーかお願いいたします。

615 :デフォルトの名無しさん :2001/07/18(水) 03:54
pent minoって何?

616 :デフォルトの名無しさん :2001/07/18(水) 04:18
ペントミノは5つの正方形からなる駒です。
これを60マスにすきまなく埋めていくプログラムをつくりたいんです。
バックトラックを使うらしいのです。。。

617 :デフォルトの名無しさん :2001/07/18(水) 12:00
>>614
解くだけなら全数あたるのつくれ。
多分何年もかかると思われるが、正解は正解なはずだ。
それ以外はそれぞれの状態の状態空間を持っていて、
遷移せなあかんのだが、おそらく614さんには無理っぽい。
(ごめんね)
あとは、問題のスキをついて、超簡単な問題に変形しろ。
ペントミノの形を全部シンプルにするとかね。

618 :デフォルトの名無しさん :2001/07/18(水) 12:42
 つまり、60個のタイルからなる任意の形の図形を、5マスずつ12個に分割
するプログラムを書くということか。。。

んん、時間ないからプログラム書いてられないが
1.左上からスタート
2.ある一つの方向に進む。(もし駄目だったら再帰的にここに戻ってきて別の方向に進む)
  動いたところをマークする
3、5マス動いたら
 3.1 今まで動いたところで分割されている領域を調べ、そこで分割した領域のサイズが
    5の倍数でないところがあったら、失敗。一つ前に動いたところに戻り、別の方向に
    進む。この時一歩前が全ての方向に進んでいたら、もう一歩前に戻る。
 3,2 まだ移動してないところに移動して2へ

こういう風にやれば可能?
あまり考えないで書いてるけど

619 :デフォルトの名無しさん :2001/07/18(水) 12:43
追記
 年のため、2の途中で進むところがなくなったら当然失敗ね。一歩前に戻りましょう。

620 :デフォルトの名無しさん :2001/07/18(水) 13:01
あと、蛇足だけど
高速化したければ、今埋められてる部分をキーにして、残りの分割パターンが
どういうのがあるか、というハッシュテーブルを使うのが吉。
 まあ、一日でそこまでできないだろうけど。

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通りの箱に詰めるというんじゃないの?

623 :デフォルトの名無しさん :2001/07/18(水) 13:14
んー、だとすると100個以上も解のパターンあるかな?
60マスを12*5にわけるって解釈でいい気がするけど。

624 :デフォルトの名無しさん :2001/07/18(水) 13:46
回転をどうするかにもよるけど数千通り解があるでしょ

625 :617 :2001/07/18(水) 13:55
だから、きちんと解こうとすると1日では無理っぽい。
スキル次第だけど、回答を出すという目的で最適化するなら、
出題の甘いところをつくしかないと思うのだが。
ちゃんと解くのはバックトラックっなんて考えないで、
縦型探索で、破綻したときにその枝探さないようにすればOK。
状態空間を差分で積んだりするテクはあると思うが力任せが
吉。あ、プログラム毎に100番目とか絶対試さないと思うから
手作業で2種類解を作って、全探索プログラム書いてもいいかも。

626 :デフォルトの名無しさん :2001/07/18(水) 14:12
60マスというのは12*5とか1つだけに絞っていいみたいです。
やっぱりこのプログラムは長いんですかねー?60マスというのは12*5とか1つ

627 :デフォルトの名無しさん :2001/07/18(水) 14:20
で 言語は何? C? C++ ? Pascal? Java?

628 :デフォルトの名無しさん :2001/07/18(水) 14:45
Cです。

629 :デフォルトの名無しさん :2001/07/18(水) 15:02
まずはデータの持ち方を考える事だね
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のものを探す
これは見つからないからバックトラックして・・・

630 :デフォルトの名無しさん :2001/07/18(水) 16:18
置く場所を 6x12 ではなくて、(6+4+4)x(12+4+4) 個にしたら
どうかな。んで外側はあらかじめ埋めとく。こうすりゃ
範囲チェックしなくていいと思うんだけど。

631 :デフォルトの名無しさん :2001/07/18(水) 16:26
#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;
}

632 :デフォルトの名無しさん :2001/07/18(水) 16:26
んで、618,621どっちの解釈が正しいの?

633 :デフォルトの名無しさん :2001/07/18(水) 16:28
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
なるほど!!分かります。
でも、具体的にはどうしよう。どうすれば。

635 :?f?t?H???g??????? :2001/07/18(水) 16:41
いえ6*10の長方形ですみたいです。
さっき先生にきいてきました。
ほとんどの生徒が解けてないそうです。

636 :デフォルトの名無しさん :2001/07/18(水) 16:43
ああっ 変な名前になってしまった。
すいません。みなさん。

637 :デフォルトの名無しさん :2001/07/18(水) 16:46
>>635
いや、12種類のタイル使う必要があるかという話

638 :デフォルトの名無しさん :2001/07/18(水) 17:13
はい。
12種類のペントミノを使って6*10のマスを
埋めるプログラムです。

639 :デフォルトの名無しさん :2001/07/18(水) 17:15
あまりに分からないのでネット上で手本がないか
探してみたんですけどバックトラックを使ったプログラムは
ありませんでした。

640 :デフォルトの名無しさん :2001/07/18(水) 18:03
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;};
}

641 :デフォルトの名無しさん :2001/07/18(水) 18:04
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);
}
}

642 :デフォルトの名無しさん :2001/07/18(水) 18:05
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
どこからどこまでがしっかりした答え
なのかよくわからないんです。
場所を丁寧におしえてもらえませんか?
馬鹿ですみません。

644 :デフォルトの名無しさん :2001/07/18(水) 18:18
さあ? めんどくさいから 自分で探して 自分でバグも取ってね

とりあえずサービス

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);
}

645 :デフォルトの名無しさん :2001/07/18(水) 18:49
ようするに、左上から、12個のピースを順に置きながら
全部の組み合わせを試して、いけばいい 再帰的に

次を調べる( 状態, ピース , 詰める場所)
{
 ピースを嵌める(状態, に ピース 詰める場所)
左上に、残ったピース全てを置いてみて
if(置けるなら)
  次を調べる(状態,ピース,場所)
}
となる。 原理は総当りだから簡単だよ

646 :デフォルトの名無しさん :2001/07/18(水) 18:58
次から618のやり方ね。make_field()とcomplete()を書き換えればどんなフィールドにも
対応できるかと。
バックトラックをきっちり使ってるが。

647 :デフォルトの名無しさん :2001/07/18(水) 18:59
#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];
}
}
}

648 :デフォルトの名無しさん :2001/07/18(水) 18:59

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);
}

649 :デフォルトの名無しさん :2001/07/18(水) 19:00

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");
}
}

650 :デフォルトの名無しさん :2001/07/18(水) 19:00
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();
}

651 :デフォルトの名無しさん :2001/07/18(水) 19:01
まあ、がんばって解読してくれ

652 :デフォルトの名無しさん :2001/07/18(水) 19:08
解読できません。どなたか助けてーください。

653 :デフォルトの名無しさん :2001/07/18(水) 19:14
>>652
それ以上言うと死ぬほど叩かれるよ。

654 :デフォルトの名無しさん :2001/07/18(水) 19:17
http://www2.to/05F

http://www2.to/03F

http://www2.to/01F

655 :デフォルトの名無しさん :2001/07/18(水) 19:18
分かりました。こんなにお世話してもらってどうも
すみませんでした。ありがとうございました。

656 :デフォルトの名無しさん :2001/07/18(水) 19:21
上のプログラムを実行させてみて気づいたが、
あまりに答え多すぎるんで、やっぱ全てのパーツを一回ずつ使う
んだろうなぁ。

657 :デフォルトの名無しさん :2001/07/18(水) 21:25
#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;}

658 :デフォルトの名無しさん :2001/07/18(水) 21:26
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);
 }
} ;

659 :デフォルトの名無しさん :2001/07/18(水) 21:27
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;
}

660 :デフォルトの名無しさん :2001/07/19(木) 08:14
こりゃあ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関係がある
よって結果のとおりになります
よろしくおねがいします

663 :デフォルトの名無しさん :2001/07/19(木) 09:10
マルチステートメントや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関係がある」になります

667 :デフォルトの名無しさん :2001/07/19(木) 22:21
前処理として文法解析が必要だと思うが、
どの程度作ればいい?
Cの文法を完全にこなす必要があるとすると、ちと面倒。
課題の前提として用意してあると助かるが、
そこまで出題者が考えているか…

668 :デフォルトの名無しさん :2001/07/19(木) 22:26
たとえば>>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
ダメみたいだね

676 :デフォルトの名無しさん :2001/07/21(土) 16:37
ぱっと聞いて「めんどくさそー」って印象が先に出ちゃう課題だからねぇ・・・

677 :デフォルトの名無しさん :2001/07/21(土) 16:43
こういう問題は分解して単機能単位で聞くのがベストだよな。
問題まったく読んでないけど。

678 :デフォルトの名無しさん :2001/07/21(土) 17:41
ペントミノ みたいに、単純に面白そうなら 多少めんどくさくても答えは出るんだけどねえ

単にめんどくさいだけじゃなあ

679 :デフォルトの名無しさん :2001/07/21(土) 17:45
ペントミノ は >>621 のレスが大きいよな 視覚的にさ

680 :デフォルトの名無しさん :2001/07/22(日) 06:39
ファイル名を入力して
ファイルの大きさ(バイト数)を出力するプログラムって
どうやって作るんですか?

681 :デフォルトの名無しさん :2001/07/22(日) 06:52
print -s $ARGV[0];

682 :デフォルトの名無しさん :2001/07/22(日) 10:33
チョット話をかえていい?

最近出た入門用 and 1品物 組込みに便利な奴

OAKS16 \5,400
http://www.oaks-ele.com
http://www.rakuten.co.jp/tsukumo/435956/444341/
 制限有だけどCコンパイラ・デバッカも付属
 RAM10KB、フラッシュ128KB

AKI-H8/3664タイニーマイコンキット 1キット \2,800.
http://www.akizuki.ne.jp/new.html
フラッシュ32KB  RAM2KB

どちらも1チップマイコンだから超小型、ADCも内臓

683 :682 :2001/07/22(日) 10:34
ありゃ、スレ間違いだ

684 :デフォルトの名無しさん :2001/07/22(日) 10:42
>>681
shigeに荒らされるぞ!!

685 :ダメ人間 :2001/07/22(日) 13:20
>前処理として文法解析が必要だと思うが、
>どの程度作ればいい?
go to 文などがない簡単なプログラムを読み込んで出力できるのでいいんでお願いします
どうしても提出しなきゃならないので・・・・・・。

686 :ダメ人間 :2001/07/22(日) 13:21
まずCD関係とDD関係をプログラムから解析するにはどうしたら
いいんでしょうか?

687 :デフォルトの名無しさん :2001/07/22(日) 13:25
>>686
そういうときはさ、>>661を参照、とか、せめて何かポインタ示さないと
誰もついてこないし解答もヒントもくれないぞ(大爆笑)

688 :ダメ人間 :2001/07/22(日) 13:34
>>687
あんま書き方とか分かってないのですいません

689 :デフォルトの名無しさん :2001/07/22(日) 19:13
>>686
 CD関係は、普通にif文みつけて、括弧が及ぶ範囲調べればいいんでは?
 DD関係については、まずフロー解析してフローのグラフを作らないといけ
ないと思う。
18行目からは19行目と21行目に飛ぶ可能性があるという感じで。
で、ある変数について調べていく。
このとき使われる部分から上で作ったグラフを再帰的に逆に辿っていき、
定義されている部分まで辿っていくことで、DD関係を見つける。

もちろんこれをやる前には字句・構文解析、はしないといけないが。

690 :デフォルトの名無しさん :2001/07/22(日) 19:15
689の追記。
 DD関係みたいな話は、コンパイラではレジスタの割り振りとかのためにしないと
いけない話だから、コンパイラ関係の本を読んでみるのもいいかもしれない。
 上で言ったやり方よりも、もうちょっとエレガントなやり方ものってる。

691 :デフォルトの名無しさん :2001/07/23(月) 10:22
>>686
一度も使われていない変数を参照した場合とかは、どうするんだ?

246 KB  [ 2ちゃんねるも使っている 完全帯域保証 専用サーバ Big-Server.com ] 30,000円/月
転送量無制限タイプも新登場。
新着レスの表示

掲示板に戻る 関連ページ 全部 次100 最新50
名前: E-mail (省略可) :

read.cgi ver7.36p (04/12/10)