1 :
デフォルトの名無しさん :
01/10/23 20:55
>>1 女の身内と交代してください。( ● ´ ー ` ● )
3 :
デフォルトの名無しさん :01/10/23 21:35
Scilabでのニュートン法のアルゴリズム教えて
4 :
tiger book :01/10/23 21:37
以下 解答してください 問2 a = 5+(6+(7+b)); をコンパイルした結果はどうなるかを、自分の頭で考えて示せ。 a = 0+(1+(2+(3+(4+(5+(6+(7+b)))))))-(0+(1+(2+(3+(4+(5+(6+(7+b)))))))); は、どうなるだろうか? 自分が、どのように考えて、その結果を出したのか、そして、それをアルゴリズムにするにはどうすれば良いのかを考えよう。 ヒント まず式を木の形に書いて、構造を調べる push, pop を使ってスタックを使う方法もある 実際のコンパイラの出力と比較してみよう。 -------------------------------------------------------------------------------- 問2 上のプログラムをIntel CPU上で、gcc -O -S test.c を使ってコンパイルすると最適化がかかる。最適化した場合としない場合で、どのような違いが出るか? (ヒント diff を使うと簡単...) 問1で、これらの結果を実際のアセンブラで実行しテストするには、どうすれば良いか考えて実行せよ。 これらの命令が実際に生成されるCのソースコードを考えて、それをコンパイラに通し、実際に命令が生成されることを確認せよ。(ただし、データのアドレスは、変わっても良いとする)
5 :
デフォルトの名無しさん :01/10/23 21:52
お願いします。 問 3×3魔方陣の左上のマスに値を一つ入れたとき 他の値を入れてくれるプログラムを作成せよ。 総当り方式だと90行ぐらいになってしまうので、 エレガントに2~30行ぐらいで作りたいです。 ヒント下さい。
6 :
デフォルトの名無しさん :01/10/23 22:21
>5 3×3でしょ? 総当たりでも、90行にはならないと思うけど。 対角線の和も、行・列の和と等しくないといけないの? それとも、対角線の和はどんな値でもいいの?
7 :
デフォルトの名無しさん :01/10/23 22:40
魔法人に入れる値は1~9?
8 :
デフォルトの名無しさん :01/10/23 22:47
>>5 行って、ソースの行?
こういう問題ってシンプルに解いた方がソースは短くなるから、
総当り方式が一番ソースは短くなると思うけどね。
で、どうなんだろうと試しに書いてみたけど、読みやすく書いて
50行くらい。20~30行にするとかなり読みにくくなりそう。
あと、
>>6 で触れてくれてるけど左上を固定しちゃうと、入れる数
によっては解がないみたいね。
この程度の問題解けない厨房が ここで適当に答え書き写して単位もらって いずれ開発会社に入ってくるのかと思うと気が重いよ。
>いずれ開発会社に入ってくるのかと 入社前にテストでもやってはじけばいいじゃん。
>>4 これは、考え方を教えてと言われても非常に困るし、解答書いて
しまっても意味ないしなぁ。どの程度わかってるの?
問一については式木を作って、それから変換してみろとヒント程度
の事しかいえない。
問二に関しても同じだなぁ。
gcc -O -S test.c
gcc -S test.c
で出てくる、二つのtest.s を比較してみて、その違いがどういう意味を持つのか・・
考えてみろ・・としか。
いずれにしろ、ぱっとこういう問題張られても答えようが無い。どこがわからない
か書いてくれ。もしどこがわからないかわからないくらいわからないのなら、単位取
得あきらめろ。
ってことで。
12 :
デフォルトの名無しさん :01/10/23 23:09
>>6 >>7 1~9までの数で、全ての列の和が15になる一般的なやつです。
>>8 ソースです。
解がないときは「無し」と表示する感じです。
>>9 一応解けたんですが、もっといい解き方を学びたいので。
総当り方式と公式みたいのものを使う2通りがあるそうです。
適当に関数作ってif,for使いまくって総当りしたら、
100行近くなってしまって・・・。
1~9の値を重複判定するときになにかいい方法はありますか?
>5 対角線の和は考慮しない、なんちゃってなやつなら、こんな風に 作れるぞ。 なんちゃってだから、こんなん提出したら、おこられるかもな。 全角の空白使ってるから、半角の空白に変換してくれ。 #include <stdio.h> void main(void) { int i, j, n; int a[7][7] = {{0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 6, 1, 8, 0, 0}, {0, 0, 7, 5, 3, 0, 0}, {0, 0, 2, 9, 4, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}}; int x[10] = {0, 3, 2, 4, 4, 3, 2, 2, 4, 3}; int y[10] = {0, 2, 4, 3, 4, 3, 2, 3, 2, 4}; printf("input n: "); scanf("%d", &n); if (x[n] == 3) { for (i = 2; i < 5; i++) { a[i][5] = a[i][2]; } } if (x[n] == 4) { for (i = 2; i < 5; i++) { a[i][1] = a[i][4]; } x[n] = 1; } if (y[n] == 3) { for (i = 1; i < 6; i++) { a[5][i] = a[2][i]; } } if (y[n] == 4) { for (i = 1; i < 6; i++) { a[1][i] = a[4][i]; } y[n] = 1; } for (i = y[n]; i < y[n] + 3; i++) { for (j = x[n]; j < x[n] + 3; j++) { printf("%2d", a[i][j]); } putchar('\n'); } }
12=5です。
>12 あ、「解なし」って表示することもある、ってことは、対角線の 和も考慮するわけね。 はよーそれを言えっちゅうの。
>>13 あらかじめ答えを書いておいて、それを回転させるのか(汗)
それは・・いいのか? さすがにまずいだろう・・・
17 :
デフォルトの名無しさん :01/10/23 23:14
#include void main(void){ int you,i; srandom(time()); printf("===じゃんけんゲーム==="\n"); printf("1:グー 2:チョキ 3:パー\n"); i=random() % 3 +1; printf("ジャンケンポン:"); scanf("%d",&you); printf("あなた:%d,わたし%d\n",you,i); if((you==1&&i==2)|| (you==2&&i=3)|| (you==3&&i=1)) { printf("あなたの勝ちです。\n"); } else if(you==i) { printf("あいこです。\n"); } else{ printf("あなたの負けです。\n"); } } このプログラムを以下のようにしてください。 1:勝敗をカウントし、先に3勝した方が勝ちとします。 2:ジャンケンの手は整数に置き換えて入力する。例えば グーは1、チョキは2、パーは3、それ以外は入力エラー とし、再度入力するものとします。 誰か教えて~~~。。。
>16 そう。なんちゃってプログラムだからね(汗 13の方法はタテ・ヨコの和は保存されるけど、対角線の和は保存 されないから、12の要求を満たしてないらしい。
19 :
デフォルトの名無しさん :01/10/23 23:19
>>12 さすがに100行はかからないと思う。
1~9の重複判定は、サイズ9の配列作って、その数を使っているか使って
いないかを0か1かで記憶しておくのが素直だと思われます。
20 :
デフォルトの名無しさん :01/10/23 23:26
>>12 あと、総当りの1パターンを作るのはバックトラックをするのが素直
だと思われます。
>>13 回転・・・ですか。
でもある意味いい方法でしょうね。
3×3が結局1通りしかないとわかっていれば・・・。
>>19 その方法を最初に思いついて関数として使いました。
でも重複判定+総当りif,for羅列でなぜか100行・・・。
>>20 バックトラックですね、調べてみます。
皆様ありがとうございます。
まだC++始めて3週間ですので・・・。
22 :
デフォルトの名無しさん :01/10/23 23:48
ほらよ。完璧。 #include <stdio.h> #define SQ 3 //一辺 #define COUNT SQ*SQ int flag=0xFFFF,x[COUNT]; void foo(int d){ int i,j,a,b; if (d==COUNT){ for ( i=a=0; i<SQ; i++) a+=x[i]; for ( i=b=0; i<SQ; i++) b+=x[i*(SQ+1)]; if (b!=a)return; for ( i=b=0; i<SQ; i++) b+=x[(SQ-1)*(1+i)];if (b!=a)return; for ( j=0; j<SQ; j++){ for( i=b=0; i<SQ; i++) b+=x[i+SQ*j]; if(b!=a)return; for( i=b=0; i<SQ; i++) b+=x[i*SQ+j]; if(b!=a)return; } for (i=0;i<COUNT;i++) { printf("%d",x[i]); if (i%SQ==SQ-1) printf(" "); } printf("\n"); return; } for (i=0;i<COUNT;i++) if (flag & (1<<i) ){ flag &= ~( 1<<i ); x[d]=i; foo(d+1); flag |= (1<<i); } } void main(){ foo(0); }
こんなんは? 順列の生成方法を、奥村晴彦著、C言語による最新アルゴリズム事典、 ISBN 4-87408-414-1の119ページからぱちって来た。 #include <stdio.h> #define N 9 int check(int a[]) { if ((a[0] + a[1] + a[2] == 15) && (a[3] + a[4] + a[5] == 15) && (a[6] + a[7] + a[8] == 15) && (a[0] + a[3] + a[6] == 15) && (a[1] + a[4] + a[7] == 15) && (a[2] + a[5] + a[8] == 15) && (a[0] + a[4] + a[8] == 15) && (a[2] + a[4] + a[6] == 15)) { return 1; } else { return 0; } } void perm(int a[], int n, int i, int j) { int k; a[i] = j; if (j == N) { if (a[0] == n && check(a)) { putchar('\n'); printf ("%d %d %d\n", a[0], a[1], a[2]); printf ("%d %d %d\n", a[3], a[4], a[5]); printf ("%d %d %d\n", a[6], a[7], a[8]); } } else { for (k = 0; k < N; k++) { if (a[k] == 0) { perm(a, n, k, j + 1); } } } a[i] = 0; } void main(void) { int i, n; int a[N]; printf("input n: "); scanf("%d", &n); for (i = 0; i < N; i++) { a[i] = 0; } for (i = 0; i < N; i++) { perm(a, n, i, 1); } }
24 :
デフォルトの名無しさん :01/10/24 00:15
こんどこそOK #include <stdio.h> #define SQ 3 //一辺 #define COUNT SQ*SQ int flag[9]={1,1,1,1,1,1,1,1,1},x[COUNT]; void foo(int d){ int i,j,a,b; if (d==COUNT){ for ( i=a=0; i<SQ; i++) a+=x[i]; for ( i=b=0; i<SQ; i++) b+=x[i*(SQ+1)]; if (b!=a)return; for ( i=b=0; i<SQ; i++) b+=x[(SQ-1)*(1+i)];if (b!=a)return; for ( j=0; j<SQ; j++){ for( i=b=0; i<SQ; i++) b+=x[i+SQ*j]; if(b!=a)return; for( i=b=0; i<SQ; i++) b+=x[i*SQ+j]; if(b!=a)return; } for (i=0;i<COUNT;i++){ printf("%d",x[i]); if (i%SQ==SQ-1) printf(" "); } printf(" : (%2d)\n",a); return; } for (i=0;i<COUNT;i++) if (flag[i]){ flag[i]=0; x[d]=i+1; foo(d+1); flag[i]=1; } } void main(){ foo(0); }
俺、正直、22のプログラムが何やってるのか、ぱっと見じゃ全然わからねー。 逝ってきます…。
26 :
デフォルトの名無しさん :01/10/24 00:20
/* シンプルに。*/ #include <stdio.h> int flag[9]={1,1,1,1,1,1,1,1,1},x[9]; void foo(int d){ int i,j,a,b; if (d==9){ if (x[0]+x[1]+x[2]!=15)return; if (x[3]+x[4]+x[5]!=15)return; if (x[6]+x[7]+x[8]!=15)return; if (x[0]+x[4]+x[8]!=15)return; if (x[2]+x[4]+x[6]!=15)return; if (x[0]+x[3]+x[6]!=15)return; if (x[1]+x[4]+x[7]!=15)return; if (x[2]+x[5]+x[8]!=15)return; printf("%d%d%d,%d%d%d,%d%d%d\n",x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8]); return; } for (i=0;i<COUNT;i++) if (flag[i]){ flag[i]=0; x[d]=i+1; foo(d+1); flag[i]=1; } } void main(){ foo(0); }
27 :
デフォルトの名無しさん :01/10/24 00:21
>>17 何行目まで理解できてる?
どこでつまづいたか言ってみよ。
28 :
デフォルトの名無しさん :01/10/24 00:23
”C言語らしく”代入演算子やインクリメントを多用すると、 わかりにくいプログラムになるので注意しましょう。
29 :
デフォルトの名無しさん :01/10/24 00:28
>>17 ってゴルァ! その1行目は何だよ。やる気うせる~。
>>22 ,24,26
完璧ですね・・・。30行ぐらいしかないですね。すごいです。
これですっきりさせることができそうです。ありがとうございました。
関数の中でその関数を使う方法があるとは目からウロコでした。
そうすればforで関数を終わらせることなく計算できますね。
勉強になりました。
>>23 参考になりました。ありがとうございます。
>>22 ,24,26
気になった点が一つあるのですが・・・。
if(flag[i]){
flag[i]=0;
・
・
}
の部分のif(flag[i]){}
は何に対して条件分岐をしているんですか?
始めて見る書き方なので教えてください。
if(flag[i]!=0)と等価 Cのifには常に暗黙の!=0が付く。と考えておけばよい
>31 調べたらわかりました。 if(flag[i]==1)の略だったんですね。 くだらない質問してすみません。
>>33 ノータリン
flag[i]が2でも flag[i] は真じゃボケ
35 :
デフォルトの名無しさん :01/10/24 03:27
CでJavaとかのクラスの構造の真似をしようと思ってます。 で、そこそこある程度できたんだけど、 どうしてもtry節の模擬がうまくいきません。 マクロでうまく隠蔽したいんだけど、 どんな手法が考えつきますか?
#include <time.h> #include <stdlib.h> #define TIMES 1000000 int a[]={1,2,3,4,5,6,7,8,9}; void dump(int a[]); int check(int a[]) { if ((a[0] + a[1] + a[2] == 15) && (a[3] + a[4] + a[5] == 15) && (a[6] + a[7] + a[8] == 15) && (a[0] + a[3] + a[6] == 15) && (a[1] + a[4] + a[7] == 15) && (a[2] + a[5] + a[8] == 15) && (a[0] + a[4] + a[8] == 15) && (a[2] + a[4] + a[6] == 15)) { return 1; } else { return 0; } } void make_random(int a[]){ int i,j; int swap; for(i = 0;i < 9;i++){ j = rand()%9; swap = a[j]; a[j] = a[i]; a[i] = swap; } } void set_start(int a[],int index,int val){ int i; int temp; for(i = 0;i < 9;i++){ if(a[i] == val){ temp = a[index];a[index] = val;a[i] = temp;return; } } } void dump(int a[]){ int i; for(i=0;i < 9;i++){ printf("%d ",a[i]); } printf("\n"); } int main(){ int start_index,val,i; int j; val = 1; start_index =3; srand(time(NULL)); for(i=0;i < TIMES;i++){ make_random(a); set_start(a,start_index,val); if(check(a)){ dump(a); return 1; } } printf("may be error\n"); return 1; }
>>37 うひゃ。読みにくいけどためになるページですね!
でもtry~catchあたりがいまいち載ってないですね
ふつー longjmp
>>40 longjmpはよく分からなかったので最初から逃げてました。
googleだと引っかかりすぎて難しいです。
いいサイトがあったら教えてください。
なければ自分で勉強します。
>>37 いきなり
> クラスは、構造体の発展形です。
とか結構イタいがな。
>>42 でも、Java知らん人を3日で戦力にしろっていう
上司命令がきたら オレでもこう教えるよ。
面倒くさいし、局所的に見れば間違ってないし。
44 :
デフォルトの名無しさん :01/10/24 07:34
>>17 それって、以前ゲーム専門学校の宿題スレで俺が出した
仕様では…
まだやってたのか、それ。
>>34 うわー恥ずかしい・・・。
適当に自分でいじってみて1は通って0は通らなかったから
==1だと思ってしまった・・・。真だったんですね。
ノータリンです逝ってきます。
麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ 麻衣を出せ
麻衣は嫁に行きました。
麻衣タンの妹降臨キボンヌ
じゃあ、親戚の私でいいですか? CとJavaならお任せよ♥
とりあえず、ageます。 質問がなければこのまま下がります~
51 :
デフォルトの名無しさん :01/10/25 15:30
Cで「1秒ごとに処理をする」ってどうやりますか?
52 :
デフォルトの名無しさん :01/10/25 15:34
int count_sec; void initialize_timer(){ int t=time(); while (t==time()); for (count_sec=0; t==time(); count_sec++); } void wait(int sec){ for (int i = 0 ; i <= count_sec; i++); }
54 :
デフォルトの名無しさん :01/10/25 15:44
>>52 それだったら、
void wait(int sec){
for ( int t = time(); t + sec >= time(); ;
}
だけでよいのでわ。。。
busyループなんて使っちゃ駄目よ。 ライブラリ使うならsleepとか使わなきゃ。
58 :
デフォルトの名無しさん :01/10/25 16:59
>>56 プリエンティブなマルチタスク環境ならいいんじゃなーい?(無責任)
>>58 よくねーよプンスカ!
アプリのCPU使用率の制限かけられる立派なOS使える奴
ばっかりじゃねんだよ。
さすが宿題スレだ。 レベルが低いのがぞろぞろいる。
S={N 個の整数|それぞれ異なる整数}の中から 中央値に近い k個の整数 (k<=N)(k closests to the median)を探し出す プログラムを書きなさい。
63 :
デフォルトの名無しさん :01/10/25 21:25
>>62 1. ソートする。M=N/2番目(奇数なら切り上げ)が中央値。
2. {M - k/2番目...M + k/2番目}が求める整数の集合。
(kが奇数なら、M - k/2 - 1番目とM + k/2 +1番目のうち、
M番目に近い方を解に含める。)
中央値ってのは、最小値と最大値の中間?
まちがえた。 1. 昇順にソートする。M=N/2番目(Nが奇数なら切り上げ)が中央値。 中央値をmedとし、ソート結果をa[0]..a[N-1]とする。 for (low = high = M; high - low < k; ) { if (low == 0) { high++; } else if (high == N - 1) { low--; } else if (med - a[low - 1] < a[high + 1] - med) { low--; } else { high++; } } a[low], a[low + 1], ..., a[high]が解。
ありがとうございます。 が、、、ひとついい忘れました。 ソートを使わずにアルゴリズムが O(N)になるようにするには?
今日教授から出された宿題で、来週の月曜には提出しないといけません。 1.美衣の年齢 2.美衣の身長・体重 3.美衣の3サイズ 4.美衣の経歴 5.美衣の好きなもの・嫌いなもの よろしくお願いします。
68 :
デフォルトの名無しさん :01/10/25 21:44
宿題、教えてください。 加算、減算、乗算、除算を行う関数を定義し、それらを呼び出すmain関数を作成しなさい。関数の名前を決めるための参考として、加減乗除の英語名を示します。 加算 addition 減算 subtraction 乗算 multiplication 除算 devision
>>68 int a(int a, int b)
{
return a+b;
}
int s(int a, int b)
{
return a-b;
}
int m(int a, int b)
{
return a*b;
}
int d(int a, int b)
{
return a/b;
}
int main()
{
a(1,1);
s(1,1);
m(1,1);
d(1,1);
return 0;
}
70 :
デフォルトの名無しさん :01/10/25 21:50
>>62 ソートしなけりゃ無理な気がするが・・・・。
ビンソートならO(N)。
Sの最大値、最小値は分からないの?
71 :
デフォルトの名無しさん :01/10/25 21:51
72 :
デフォルトの名無しさん :01/10/25 22:00
int add(int a, int b) { return a + b; } int subtr(int a, int b) { return a - b; } int multi(int a, int b) { return a * b; } float dev(int a, int b) { return a / (float) b; } int main(int argc, char *argv[]) { printf("add(1, 2) = %d\n", add(1, 2)); printf("subtr(3, 4) = %d\n", subtr(3, 4)); printf("multi(5, 6) = %d\n", multi(5, 6)); printf("dev(7, 8) = %f\n", dev(7, 8)); return 0; }
73 :
デフォルトの名無しさん :01/10/25 22:03
ちょっとまてよ。だれもCなんてかいてないだろ。C++ かもしれないだろ。 class CInt{ int value; operator '+'; operator '-'; operator '*'; operator '/'; }
急いでるんで、誰かおながいします。
76 :
デフォルトの名無しさん :01/10/25 22:22
>>62 ≠
>>66 かも知れないけど面白そうなので。
Nが偶数なら、
配列の両端から順次2つの値を比較していって
上半分に値の大きい物を集める。
で、上半分の中で値が一番小さい物が中央値。
Nが奇数の場合は
「中央を除いた下半分の最大値」
「中央の値」
「中央を除いた上半分の最小値」
を使ってごちゃごちゃやってれば出来そうな気がする。
それから問題の後半はまだ分からないです。
BASICの例
200 ' 中央値を得る
210 for i=1 to int(N / 2)
220 if a(i) > a(N-i+1) then swap a(i), a(N-i+1)
230 next
240 '
250 med = a(int(N/2))
260 '
270 for i=int(N/2) to N
280 if med > a(i) then med = a(i)
290 next
あ、全然間違ってるかも。
78 :
デフォルトの名無しさん :01/10/25 22:37
>>62 void find_min_max(int *data, int count, int *min, int *max)
{
int i;
*max = *min = data[0];
for (i=1; i<count; i++){
if (*max < data[i]) *max = data[i];
if (*min > data[i]) *min = data[i];
}
}
int find_median(int *data, int count)
{
int i,median,max,min,delta,mean;
find_min_max(data, count, &min, &max);
mean = (max + min)/2;
delta = abs(data[0] - mean);
for (i=1; i<count; i++)
if ( delta > abs(data[i] - mean) ){
median = data[i];
delta = abs(data[i] - mean);
}
return median;
}
これを前提として…
median = find_median(data, count);
for (i=0; i<count; i++)
if ( data[i] < median )
printf("%d\n", data[i]);
とすればOK
79 :
デフォルトの名無しさん :01/10/25 22:46
>>72 >>73 ありがとうございました!
Javaだと、どうなるんでしょうか?
>>78 それだとmeanの値に一番近い数値を求めているだけの様な...
81 :
デフォルトの名無しさん :01/10/25 22:52
え、ちがうの? この問題って、 (データの最大+データの最小)÷2 よりも小さい値を 全て抜き出せって意味じゃないの?
82 :
デフォルトの名無しさん :01/10/25 22:54
>>81 ちゃうよ。
中央値っつったら、順に並べて真ん中に来る値のことだろ。
83 :
デフォルトの名無しさん :01/10/25 22:56
なんだ。メディアン値のことか…
84 :
デフォルトの名無しさん :01/10/25 23:03
>>67 他に言い忘れてることないだろな、コ゛ルァ!
O(N)って無理じゃないか?
O(NK)でも良いのか?
85 :
デフォルトの名無しさん :01/10/25 23:03
/* ソートしないアルゴリズム */ /* upper を超えない最大の値を返す */ int find_max(int *data, int count, int upper) { int i,max; max = data[0]; for (i=1; i<count; i++) if ( max < data[i] && data[i] <= upper) max = data[i]; return max; } /* lower を下回らない最小の値を返す */ int find_min(int *data, int count, int lower) { int i,min; min = data[0]; for (i=1; i<count; i++) if ( min > data[i] && data[i] >= lower) min = data[i]; return min; } int find_median(int *data, int count) { int i, upper, lower; upper = MAX_INT; lower = -MAX_INT; while ( upper > lower ){ upper = find_max(data, count, upper); lower = find_min(data, count, lower); } if ( upper == lower ) return upper; else return ???; }
86 :
81=83=85 :01/10/25 23:06
O(N)って何のこと? O(NK)とは?
訂正。 if ( max < data[i] && data[i] <= upper) は if ( max < data[i] && data[i] < upper) ね。それと if ( min > data[i] && data[i] >= lower) は if ( min > data[i] && data[i] > lower) ね。
88 :
デフォルトの名無しさん :01/10/25 23:11
>>86 計算量のオーダーも知らないやつがアルゴリズム語ろうとするなよヲイ(w
>>86 オーダ
O(N)だと処理速度はNに比例。
O(NK)だと処理速度はN*Kに比例。
91 :
デフォルトの名無しさん :01/10/25 23:14
てことは、Log N に比例するならば O(Log N) って書くのね。理解。
>>90 オーダ知らんかったらアルゴリズムの評価なんかできねえだろ。
93 :
デフォルトの名無しさん :01/10/25 23:36
オーダは知っているがO(N)という 書き方はしらなんだ。すまんな。
この職って会社のどんな事に役立ってるのですか? まだ社会人ではないのでまったく想像できません。 ソフトってものはどんなものなのか・・・・・? それが何の役に立つか何を作っているのか・・・・・? みなさん教えてください。
>>96 ごめん
宿題じゃありません_(._.)_
ちょっと質問したのですが
やっぱりいいです
98 :
デフォルトの名無しさん :01/10/26 00:45
この職?プログラマのこと? プログラマ=プログラムをする人、プログラム技術を持っている人 と定義するならば、そもそもパソコンなんぞ誰も 使えない気が…
>>95 どんな会社を想定してるのか。
SI会社におけるプログラマは稼ぎ頭というか戦闘部隊というか。
それ以外の会社では小間使いというか後方支援ちおうか。
>>84 o(NK)で、できる?
中央値ってO(N)で求められたっけ?
101 :
デフォルトの名無しさん :01/10/26 01:32
102 :
デフォルトの名無しさん :01/10/26 01:39
>>101 O(N^2)だ。「中央値に最も近いk個」というのも満たしてない。
103 :
デフォルトの名無しさん :01/10/26 02:02
うーん、結局ビンソートなのかな。
104 :
デフォルトの名無しさん :01/10/26 02:04
ビンソートってよく知らないんだけど、どういうの?
ビンラディンとなにがちがうの?
>105 ヒゲ
107 :
デフォルトの名無しさん :01/10/26 02:16
>>103 でも「ソートしない」が条件らしいぜ?
それに、「整数」というだけで、他に条件ないとしたらダメだろ。
>>104 ビンソート知らない人は、質問する側に回りなさい。
「ビンソートとは何か」という宿題なら教えてあげる。
108 :
デフォルトの名無しさん :01/10/26 02:19
>>107 すみません、書き込んだ後、検索して理解しました。
109 :
デフォルトの名無しさん :01/10/26 05:27
まずk=1のspecial caseから考えよう。 つまり中央値を求めるだけ。 キーの範囲が限定されてないとして、 これってO(N)でできる?
110 :
デフォルトの名無しさん :01/10/26 07:16
O(N * log N)かな。メジアンだけです。 100 N = 100: Nbox = 10 110 dim a(N), slot(Nbox) ..配列に値を入れる。 200 gosub getMinMax 210 max = max + 1 '念の為、1つずらしておく 220 midN = int((N +1)/ 2) 230 repeat 240 delta = (max - min ) / Nbox 250 gosub clearSlot 260 gosub fillSlot 270 gosub selectSlot 280 max = min + delta * (slotN + 1) 290 min = min + delta * SlotN 300 until memberN = 1 310 gosub getMedian 320 print "median " ; median 330 end 400 getMinMax: 410 min = a(1): max = a(1) 420 for i=1 to N 430 if min > a(i) then min = a(i) 440 if max < a(i) then max = a(i) 450 next 460 return 500 clearSlot: 510 for i=0 to Nbox 520 Slot(i) = 0 530 next 540 return 600 fillSlot: 610 for i=1 to N 620 j = int((a(i) - min) / delta) 630 if j >= 0 and j <= Nbox then Slot(j) = Slot(j) + 1 640 next 650 return 700 selectSlot: 710 sum = 0: i=-1 720 repeat 730 i = i + 1 740 sum = sum + Slot(i) 750 until sum > midN 760 SlotN = i 770 midN = midN - (sum - Slot(SlotN)) 780 memberN = Slot(SlotN) 790 return 800 getMedian: 810 for i=1 to N 820 if a(i) >= min and a(i) < max then median = a(i) 830 next 840 return
111 :
デフォルトの名無しさん :01/10/26 07:16
>>107 >「整数」というだけで
値は重複しないらしいです。
Permitation; 6P3 の全ての組み合わせの数字を表に出したいです。 それらの数字は小さい順になるように表にしたいです。[例:{1,2,3} {1,2,4}{1,2,5}{1,2,6}{1,3,2}] よろしくお願いします。
113 :
デフォルトの名無しさん :01/10/26 08:51
メディアン。 何度かリトライするのでオーダー不明。(テストでは3回リトライしていた。) -------- var median, midN, i, countS, countL: integer; -------- begin median := a[1]; midN := (N + 1) div 2; i := 1; repeat if a[i] < median then countS := countS + 1; if a[i] > median then countL := countL + 1; if countS >= midN then begin median := a[i]; countS := 0; countL := 0; i := 1; end; if countL >= midN then begin median := a[i]; countS := 0; countL := 0; i := 1; end; i := i + 1; until i > N; writeln('Median = ', median); end;
>>113 ごめん、読んでて頭痛くなってきた(汗
適当に一個決めて、上と下に何個あるか数えるのね。
えっとオーダーは、O(N^2)というべきか、それとも永遠に終わらない可能性も
あるから、O(+∞)というのがいいのか。
って、適当ってわけではないか。 だんだん近づいていくのか。・・・いくのかな?
間違ってますね。テストしたデータでたまたまうまく行っただけでした。 見つからない時は無限ループにはまってしまうし。
117 :
デフォルトの名無しさん :01/10/26 11:00
>>112 非再帰版
#include <stdio.h>
void main(){
int i1,i2,i3;
for (i1=1; i1<=6; i1++)
for (i2=i1+1; i2<=6; i2++)
for (i3=i2+1; i3<=6; i3++)
printf("%d %d %d\n",i1,i2,i3);
}
118 :
デフォルトの名無しさん :01/10/26 11:25
>>112 Del厨で失礼。
出力も手抜き
program Permitation;
{$APPTYPE CONSOLE}
uses
SysUtils;
procedure PrintResult(
var Result : array of integer;
const Length : integer
);
var
i : integer;
begin
for i := 1 to Length do begin
Write (Result[i],' ');
end;
Writeln;
end;
procedure PermitationSub(
const Items:integer ;
const Length:integer ;
const CurrentLength:integer ;
var Result : array of integer
);
var
i,j : integer;
used : boolean;
begin
for i := 1 to Items do begin
used := false;
for j:= 1 to CurrentLength do begin
if Result[j]=i then begin
used := true;
break;
end;
end;
if used then continue;
Result[CurrentLength+1] := i;
if CurrentLength+1 < Length then begin
PermitationSub(Items,Length,CurrentLength+1,Result);
end else begin
PrintResult(Result,Length);
end;
end;
end;
var
Result : array[0..6] of integer;
begin
PermitationSub(6,3,0,Result);
end.
失礼。コンビネーションでした。
>>66 少し考えてみたけど、O(N)でいきますね。
アルゴリズム示します。
(1)まずメディアンを求める。
(1-1)配列a[m]の中から小さい法からl個目を抜き出す関数f(a,m,l)を考える。
これに、m = N, l = N / 2を入れればいい。
(1-2)m個の数字を、その中のある数字を閾値にそれ以上(big)と以下(small)にわける。
(1-3)小さい方がs個だったとする。
(1-3-1) s < lなら、小さい方にメディアンがある。f(small,s-1,l)を呼び出す
(1-3-2) s > lなら、大きい方にメディアンがある。f(big, m-s, l-s)を呼び出す。
(2) 全ての数字について(1)で求まったメディアンとの差の絶対値を求める。
これで、この差の絶対値から小さい方からk個抜き出すという問題に置き換わった。
(3)(1)と同様に大きいほう、小さい方にわけていく。これは、小さい方からk個目を
求め、その呼び出し関数のsmallに入っている数字は全て、小さいほうからk個の中に
入っていることになる。
計算量を検証します。
(1)上手く1/2ずつ絞り込めていけば。
N + 2/N + 4/N + 8/N + ..... = 2N
で計算できますので、O(N)。
まあ、実際にそんな上手くはいかないでしょうが、クイックソートがO(nlog(n))
の計算量というのと一緒ですね。
(2)N個の絶対値求めるだけなので、O(N)
(3)(1)と同様にO(N)
>>112 問題がよくわからないんだけど、小さい順ってどういうこと?
左側の数字から順にkeyにして小さい順ってこと?
123 :
デフォルトの名無しさん :01/10/26 15:04
>>121 不等号の向きが違う気がするけど、おおむね合ってそう。
in-placeで入力配列を分割していけば、クイックソートと
2分探索を組み合わせたようなコードになるね。
124 :
デフォルトの名無しさん :01/10/26 15:07
>>66 の問題をヒープソートの応用でやる人はいないかな?
上位いくつかを求めるには効率的なんだけれど>ヒープ
#include <stdio.h> void main(void) { char c; int sa; sa='a'[-①-]'A'; printf("\n文字を入力してください"); scanf("%c",[-②-]); if(c>='A'[-③-]c<='Z'){ c+=[-④-]; printf("小文字 → %c\n",c); } else if(c>='a'[-⑤-]c<='z'){ c-=sa; printf("大文字 → %c\n",c); } } ----------- 大文字は小文字に小文字は大文字に変換するやつなんだけど ①~⑤には何が入るんだ?
やっぱいいやわかった。
127 :
デフォルトの名無しさん :01/10/26 15:30
>>124 121のやり方だと最悪O(N^2)だが、ヒープを使えば
最悪O(N log N)にできるね。最良でもO(N log N)だが。
128 :
デフォルトの名無しさん :01/10/27 11:58
>>122 その通りです。小さい順でした。言葉が足りず申し訳無いです。
129 :
デフォルトの名無しさん :01/10/27 15:50
>>129 i1, i2, i3を変数としますね。
i1を1~6の範囲でループさせます。その中で
i2を1~6の範囲でループさせます。さらにその中で
i3を1~6の範囲でループさせます。
そして、そのループの中で
i1, i2, i3が全て異るかどうか判定し、異なれば
i1, i2, i3の順に表示する。
というプログラムを書けば大丈夫です。
教育的配慮から、ソースは書きませんので、わからないことがあったら
きいてください。
130 :
デフォルトの名無しさん :01/10/28 02:01
ありがとうございます。やってます。
131 :
デフォルトの名無しさん :01/10/28 06:13
おしえてください!Cで、 たとえばint x = 1000;をストリングとして出したい場合(char*型として)、 どうしたらよいのですか??
132 :
デフォルトの名無しさん :01/10/28 06:16
itoa
sprintf
やった! なるほど、sprintfでできました。 ありがとうございました!
>>134 メモリに出力するときは確保した領域内に
収まるように注意して
気づかないうちに他の領域を壊したり
Segmentation fault の原因になるから
まだ>67の回答を頂いてないので、おながいします。
>>136 1.6ヶ月
2.52cm、4900g
3.25cm、27cm、27cm
4.実は麻衣の子
5.森永のミルクは口に合わないらしく明治のを飲ませると喜ぶ。
ありがとうございます。 これでゼミに逝けます。
139 :
デフォルトの名無しさん :01/10/28 19:31
おしえてください!Cで、 アドレスを指定してその領域の内容を表示するには どうしたらよいのですか?? short *p; p=12; printf("%d",*p); などではエラーが出てしまいます
>>139 値を入れる実体がないぞ。
short i;
short *p;
i = 12;
p = &i;
printf("%d", *p);
>>140 ありがとうございます!
ポインタもっとべんきょうします。
142 :
牡蠣フライ :01/10/28 19:40
JAVAです。 指定した元ファイルから 指定した先のファイルへの コピーの仕方教えてください。
144 :
牡蠣フライ :01/10/28 20:04
>>143 どうもです。
わざわざBuffereReaderとPrintWriterを
使ってコピーするにはどしたらいいでしょうか。
147 :
牡蠣フライ :01/10/28 23:37
>>145 >>146 どうもです。参考になりましたが、やっぱりわからないとこがあります。
private Vector readfile (String fileName vector lines)
provate boolen writefile(String fileName)この2つを使って
コピー元ファイルからコピー先ファイルをテキストファイルにコピー。
private Treefile readfile (String fileName)を使って
テキストファイルより任意の人数分の番号、名前、住所を読み込んで
コマンドオプションから受け取った番号に該当する情報を画面表示。
この2つを教えてください。
夜遅くですがなにとぞよろしくお願いします。
148 :
147 訂正 :01/10/28 23:40
問題間違えました。正しくはこちら。 private Vector readfile (String fileName vector lines) provate boolen writefile(String fileName)この2つを使って コピー元ファイルからコピー先ファイルをテキストファイルにコピー。 private Treemap readfile (String fileName)を使って テキストファイルより任意の人数分の番号、名前、住所を読み込んで コマンドオプションから受け取った番号に該当する情報を画面表示。 この2つを教えてください。 夜遅くですがなにとぞよろしくお願いします。
149 :
デフォルトの名無しさん :01/10/28 23:45
provateってなに? boolenってなに?
150 :
148 再訂正 :01/10/29 00:07
>>149 質問してるのにしっかり問題すらあけなくてスミマセン。
private Vector readfile (String fileName vector lines)
private boolean writefile(String fileName)この2つを使って
コピー元ファイルからコピー先ファイルをテキストファイルにコピー。
private Treemap readfile (String fileName)を使って
テキストファイルより任意の人数分の番号、名前、住所を読み込んで
コマンドオプションから受け取った番号に該当する情報を画面表示。
よろしくお願いします。
151 :
デフォルトの名無しさん :01/10/29 00:14
>>148 そのメソッドの定義がよくわからんが、
private Vector readfile (String fileName)
private boolean writefile (String fileName, Vector lines)
の間違いじゃないか?だってたぶん、
readfile=filenameを名前とするファイルの内容を読み込み、新しいVectorオブジェクトに格納して返す
writefile=filenameを名前とするファイルにlinesの内容を書き込む
だろ?
なんにもわかっとらんとみなす。1から勉強おし。
>>128 茨木俊秀、アルゴリズムとデータ構造、昭晃社、1989。P92
各列、各列の中央値による行のソートをされた
5*(n/5)行列に分解してn/4個を除去する方法を取るらしい。
正直ぜんぜん分からん・・・・鬱だ
すまん。なんか違うようだな。 それにしても writefile の引数がファイル名だけってのが謎だ。 一体どういうクラスなんだ?定義をぜんぶ出さんとわからんぞ。 …いやまて、手で打ち込んでタイプミスしてるってことは、 問題は印刷物でしか与えられてないのか?
154 :
スミマセン :01/10/29 00:34
>>151 そのとおりです。
甘えるつもりはないんですが、ほんとになんもわっかてないっす。
今、周りに追いつくので必死なので、
こんな単純な間違いにも気づかない厨房です。
どうかあきらめずに救いの手を。
>>154 >こんな単純な間違い
って結局どこがちがったんだ?それともちがわないのか?
ともかく、どういう問題かが伝わってくるまで手が出せんぞ。
156 :
スミマセン :01/10/29 00:48
>>153 こちらこそスミマセン。
テキストファイルの読み込み、書き込みの
資料を紙一枚いただいただけです。
問題に関しては2問合わせて4行程度です。
問1の問題は、その2つのメソッドの定義と
2つのファイル名をコマンドオプションから受け取る。
ぐらいしか、情報はありません。
問2の問題も、コマンドオプションからファイル名を
取得せよとのことです。
まだJAVAをはじめて一週間しかたっていなのですが、
よろしくお願いします。
>>155 単純な間違いとはタイプミスのことです。
すみません。
BufferedReaderとBufferedWriterを
問題の前に説明を受けました。
(2つ合わせて10分ぐらい)
あとtry catch を4回使うとも言ってました。
まず、メソッド writefile の定義が謎だってことをわかれ。 ファイルに書き込みをするってことは、 「<あるファイル>に<ある内容>を書き込む」 というふうに、投入口と品物がないと成立しない。 その引数リストでは、どうやって書き込むべき<内容>を指定するのか、 がわからん。 もし長くなければ、writefile の定義を書いてみれ。
まてよ?これまでの話をそーごーすると、 どうやら「readfile」「writefile」とかいうメソッドは、 呼び出し方だけ定義されていて、内容は自分で埋めなきゃいけないのか?
なんか見てておもろい。 がんばれ151と156。
>>158 言われていることは分かるのですが、
問題にはテキストファイルの内容
(ファイル名はコピー元txt(メモ帳に"あああ"と書いたもの)
とコピー先txt2)をコピーしろとしか書いてないので定義と
言われてもこんなことしか分かりません。
162 :
デフォルトの名無しさん :01/10/29 01:26
>>牡蠣フライ まず、問題を一字一句間違いなくこの掲示板にカキコしてみ。 答えてやるから。
>>159 はい。
呼び出し方しか決まっていません。
すみません。説明が小出し小出しに
なってしまっていて。
>>158 読み込んだテキストを String の Vector のインスタンス変数で持つんでないの?
>>161 なんか講義自体が雑だって言いたいのか?そりゃそうかもしれんが、
おまえの説明もちんぷんかんぷんだ。特に writefile/readfile以降、
不正確な言い回しが目立つ。
>問題にはテキストファイルの内容
>(ファイル名はコピー元txt(メモ帳に"あああ"と書いたもの)
>とコピー先txt2)をコピーしろとしか書いてないので
だから言っとくが、それだけならもうわかってるんだろ。
本当は「それだけしか書いてない」じゃなくて、
「writefileとreadfileを使え」とか「BufferedReaderとPrintWriterを使え」
とか、うるさい条件がついてんじゃなかったのか?
はっきりさせろよ、伝わってないんだから。
コマンドオプションよりコピー元ファイルとコピー先ファイルを受け取り テキストファイルの内容をコピーするプログラムを作成しなさい。 とにかく習ったものだけでプログラムをつくれとのことです。 BufferedReaderとPrintWriter writerを習いました。
>>166 じゃあ、writefileとかreadfileとかはなんだったわけ?
>>168 問題をやる前に
private Vector readfile (String fileName)
private boolean writefile (String fileName, Vector lines)
この2つを使ってやってみろ、という指示が出ました。
170 :
デフォルトの名無しさん :01/10/29 01:51
ほれ import java.io.*; public class FileCopy { public static void main(String[] args) { String from, to; BufferedReader reader = null; PrintWriter writer = null; if (args.length != 2) { System.err.println("usage: java FileCopy file_from file_to"); return; } from = args[0]; to = args[1]; try { String line; reader = new BufferedReader(new FileReader(from)); writer = new PrintWriter(new FileWriter(to)); while ((line = reader.readLine()) != null) { writer.println(line); } } catch (Exception e) { e.printStackTrace(); } finally { try { reader.close(); writer.close(); } catch (Exception e) { e.printStackTrace(); } } } }
171 :
デフォルトの名無しさん :01/10/29 01:51
インデントバージョン import java.io.*; public class FileCopy { public static void main(String[] args) { String from, to; BufferedReader reader = null; PrintWriter writer = null; if (args.length != 2) { System.err.println("usage: java FileCopy file_from file_to"); return; } from = args[0]; to = args[1]; try { String line; reader = new BufferedReader(new FileReader(from)); writer = new PrintWriter(new FileWriter(to)); while ((line = reader.readLine()) != null) { writer.println(line); } } catch (Exception e) { e.printStackTrace(); } finally { try { reader.close(); writer.close(); } catch (Exception e) { e.printStackTrace(); } } } }
>>169 それって
「本問題を解く<前>に、練習として~を使ってまずやってみろ」
なのか?わからんぞイヤマジデ
まあいいや、どのみち使うってことだな。
で、そのふたつを完成させてから、それを組み合わせてコピーするってわけな。
わかった。
じゃあまず。。
あ、終ってた(w
>>170-171 は Vector readfile (String)とか使ってないけどいいのか?
どうよ?>156
>>170-171 丁寧にありがとうございます。
>>151 本問題です。
使って頂きたいです。
よろしかったらお願いします。
private Treemap readfile (String fileName)を使って
テキストファイルより任意の人数分の番号、名前、住所を読み込んで
コマンドオプションから受け取った番号に該当する情報を画面表示。
もし、よろしければこちも希望。
コミュニケーション能力の重要性を改めて認識させてくれたエビフライ事件であった。
177 :
デフォルトの名無しさん :01/10/29 02:18
>>175 まず、その番号、住所などが書かれたテキストファイルの
フォーマットを示せよ。
178 :
デフォルトの名無しさん :01/10/29 02:20
>private boolean writefile (String fileName, Vector lines) こんなメソッドを作れって指示する教官はJavaのことを よくわかっていないので、習うのをやめれ。
>>175 引っ張っといて悪いが、そろそろ風呂入って寝たいので
ひとこと。
readfileについて:
writefileの「lines」っていう引数名から察するに、
一行を一要素としてファイル全体をVectorオブジェクトに格納していくんだよな。
それ想像できるか?できないならいえよ。
それには「BufferedReaderから一行ずつ読み込む」ってことと、
Vectorオブジェクトの扱い方がわかってればできるはずだよな。
で、どっちがわかんないのかは知らんが、とりあえず
とにかくそこんとこAPIドキュメントを読め。
Javaはじめて一週間ってことは、ひょっとして基本的な構文の理解から
すでにあやしいのか?そこまではちょっとな。。
180 :
151→風呂 :01/10/29 02:22
>>178 それはすでに暗黙の前提。たしかに156は不幸ではある。
>>177 すみません。
問題の意味もよく分かっていないので
テキストファイル自体にどのように番号、名前、住所を
書き込んだらよいのかも分かっていません。
メモ帳にそれらをずらずらっと書き込んだらよいのでしょうか。
ファイル名はTXT3にしようと考えています。
>>151 長い時間ありがとうございました。
"もうめんどうくせぇ"
と思いでしょうが、また次の機会もよろしくお願いします。
基本的な構文をきちんと復習します。
本当にありがとうございました。
183 :
デフォルトの名無しさん :01/10/29 03:06
ほれ import java.io.*; import java.util.*; public class Address { public static void main(String[] args) { String num; TreeMap map; String[] item; if (args.length != 1) { System.err.println("usage: java Address [number]"); return; } num = args[0]; try { map = readfile(addressFile); if (!map.containsKey(num)) { System.out.println("no such number"); return; } if ((item = (String[]) map.get(num)) != null) { System.out.println("number: " + num); System.out.println("name: " + item[0]); System.out.println("addr: " + item[1]); } else { System.err.println("no value defined"); } } catch (Exception e) { e.printStackTrace(); } } private static TreeMap readfile(String file) throws FileNotFoundException, IOException { BufferedReader reader; TreeMap map; StringTokenizer st; String line; reader = new BufferedReader(new FileReader(file)); map = new TreeMap(); while ((line = reader.readLine()) != null) { String num; String[] item = new String[2]; st = new StringTokenizer(line, ","); num = st.nextToken(); item[0] = st.nextToken(); item[1] = st.nextToken(); map.put(num, item); } return map; } private static String addressFile = "TXT3"; }
184 :
デフォルトの名無しさん :01/10/29 03:06
5,あいうえ太郎,東京都3 6,あいうえ花子,東京都3 1,山田太郎,東京都1 2,山田花子,東京都1 3,砂糖太郎,東京都2 4,砂糖花子,東京都2
185 :
デフォルトの名無しさん :01/10/29 03:07
インデントバージョン import java.io.*; import java.util.*; public class Address { public static void main(String[] args) { String num; TreeMap map; String[] item; if (args.length != 1) { System.err.println("usage: java Address [number]"); return; } num = args[0]; try { map = readfile(addressFile); if (!map.containsKey(num)) { System.out.println("no such number"); return; } if ((item = (String[]) map.get(num)) != null) { System.out.println("number: " + num); System.out.println("name: " + item[0]); System.out.println("addr: " + item[1]); } else { System.err.println("no value defined"); } } catch (Exception e) { e.printStackTrace(); } } private static TreeMap readfile(String file) throws FileNotFoundException, IOException { BufferedReader reader; TreeMap map; StringTokenizer st; String line; reader = new BufferedReader(new FileReader(file)); map = new TreeMap(); while ((line = reader.readLine()) != null) { String num; String[] item = new String[2]; st = new StringTokenizer(line, ","); num = st.nextToken(); item[0] = st.nextToken(); item[1] = st.nextToken(); map.put(num, item); } return map; } private static String addressFile = "TXT3"; }
>>183-185 ありがとうございました。
基本をまずはしっかり復習して
がんばりたいと思います。
本当にありがとうございます。
187 :
112です :01/10/31 00:51
どうも今いち、わからないです。どなたか、今一度お教えください。 よろしくお願いします。
>>187 とりあえず、自分で書いたコードみせてみ。
間違ってるところ教えてやるから。
189 :
デフォルトの名無しさん :01/10/31 01:16
C++で画面を100×100に分割し、指定されたブロックから指定された ブロックまでの経路の全通りを作るプログラムを作りたいのですけど 経路の全通りを作る部分がわかりません。教えてください。 ただし一度通過したブロックは通過できない、経路は最短距離 ではない、です。 こんな感じです ●○○○○○○ ○○○○○○○ ○○○○○○○ ○○○○○●○ ○○○○○○○ ○○○○○○○ ↓4回、→5回、↑一回って経路も必要なのです。
>>189 迷路をスネークパターンで生成する技術が応用できますね。
100×100で最短経路以外も含めると総数が膨大になりそうな予感。
>>191 あたりまえだろ?
これはその総数を計算で求めるんじゃないの?
>>192 総数でいいんだよね?
全通りを「作る」って書いてあるが・・
経路そのものがほしいのです。 総数は膨大になると思いますが・・・
>>194 というか、100×100での経路の全通りを求めるのが宿題なの?
もし、それが宿題の自分なりのアプローチの1プロセスだとしたら、
そのアプローチの仕方はまずいと思う。
100×100でなくてもよいのですが、 「こういうアルゴリズムで作っていく」 というのが教えてほしいのです。
>>197 そういうことだったら。って、言葉で上手くできる自信ないが一応試みてみます。
基本的には再帰。で、一度通ったところは配列作ってチェックしていく。
とりあえず、めんどくさいのでグローバルに定義されている二次元の配列aに、
x,yを通ったか通ってないかを、1か0かで保持しているとしましょう。
また、今までの経路を何か配列か何かにつめてとおきましょう。
地点x,yから、ゴールまでの全ての経路を求める関数f(x,y)を考えるとします。
f(x,y)では、次のような処理をします。
(1)そこがゴールならば、今までの経路が答えの一つなので、それを保持します。
で、一つ前に戻ります(return)。
(2)そこがゴールでないなら、
(2-1) 今居る地点を「通ったと記憶します」(a[x][y]=0)。また経路の配列にも
記憶します。
(2-2) 上、右、左、下、それぞれについて。
選んだ隣接ブロックが存在して、そこにはまだ行ったことがないなら
ax,ayにその隣接ブロックの場所を入れてf(ax,ay)を呼び出します。
(2-3) 一歩もどります。その前に、今いる地点を「通っていない」状態に戻し
ます(a[x][y]=0)、あと経路の配列も一つ戻します。で、return
これで、適当な初期化してfを呼び出せば大丈夫です。
補足。 高速化するために枝狩りした方がこの場合はいいと思います。 fを呼び出すたびに、「現在の地点からゴールまでたどり着く 可能性があるか」を判定し、それがなければreturnするのが いいかと思います。
>(2-1) 今居る地点を「通ったと記憶します」(a[x][y]=0)。また経路の配列にも 記憶します。 a[x][y]=1ですね、わかると思うけど。
しかしな、15x15でも、やってみたら4千万通り以上の経路があったぞ。 (40116600通り) 100x100の全ての経路を数えるだけでも一筋縄では行かない。 まして、全部プリントしたら、一生かかっても終わらない。
>>198-201 どうもありがとうございました。
15×15で4千万通り以上ですか・・・
ちょっと考え直してみます。
203 :
デフォルトの名無しさん :01/10/31 09:26
204 :
デフォルトの名無しさん :01/10/31 10:40
まずは終了判定部分、つまり石が5個並んだ事をチェックする部分を書いてみればいいんじゃないかな。 あとはおのずと道が開けていくと思うんたげど。
>>205 まあ、そうだねぇ。まず盤面を表すクラスを作って、その中で、3、4,5が何個あるか
を判定するメソッドを書いてみるあたりからはじめるのがよいかねぇ。
連珠の特殊なルールはストラテジパタンですか…。
208 :
デフォルトの名無しさん :01/10/31 19:32
PROLOGで、OX(まるぺけ)ゲーム作るんですが。 O-O XX- --- って状態で、Oが次の手をどう打つかっていうのを、 move([[o,-,o],[x,x,-],[-,-,-]], o, B) と与えると、Bに [[o,-,o],[x,x,o],[-,-,-]] を代入する みたいなのを作りたいんです。 「i 行目に x が2つ並んでなかったら」とか 「i 列目に x が2つ並んでたら」とかいうロジックを どうやって書いたらいいっすか。
>>208 いろんなやり方あるが
count([Item|Rest], Item, N):-!, count(Rest, Item, M), N is M + 1.
count([_|Rest], Item, N):-!, count(Rest, Item, N).
count(_, _, 0).
futatsu(List, Item):-count(List, Item, 2).
とか使うと簡単では?
3x3なら羅列してもできちゃうけど。
○の次の手は[[o,o,o],[x,x,-],[-,-,-]] ではないのか?
211 :
デフォルトの名無しさん :01/10/31 23:20
>>211 その、ソースちらっと眺めんですが、何してるのかよくわからんっす(^^;
誰かしっかり読んだ方解説お願いできませんか?
って、理解(^^;
>>121 のやり方で、基準とする要素を適当に選ぶのではなく、中間値
の中間値を採用するってこと・・ですよね、多分。
で、最悪でO(N^2)になるのをさけると。
214 :
デフォルトの名無しさん :01/11/01 00:56
>>152 Median のアルゴリズムは情報系の学生には常識だと思ってたけど,
結構知らない人が多いみたいだね.
ちなみに,茨木先生の本に書いてある5個ずつに分けるアルゴリズムよりも,
徳山先生が情処かどっかに解説書いてたサンプリングによる方法の方が平均的
には圧倒的に速くて実用的.こっちを勉強しなよ.
最悪の場合はO(n^2)になっちゃうが、
>>121 の考え方をHaskellで素直に書くとこんな感じだね。
すごく楽だ。
nearest_to_median :: Int->[Int]->[Int]
nearest_to_median k list =
map snd (nth_smaller k distance)
where distance = [(abs(x - median), x) | x <- list]
median = last (nth_smaller (length list)/2 list)
-- 小さい方からn個を求める。
nth_smaller n list :: Int->[Int]->[Int]
nth_smaller n (m:more)
| n == 0 = []
| otherwise = if (length left) < n then
left ++ m:(nth_smaller n - (length left) - 1 right)
else
nth_smaller n left
where left = [x | x <- more, x < m]
right = [x | x <- more, x >= m]
× nth_smaller n list :: Int->[Int]->[Int] ○ nth_smaller n list :: (Ord a) => a->[a]->[a]
>>214 サンプリングを取るっていうのは、適当に何個か抜き出して、そのMedianを採用
するってこと? この場合何個抜き出せばいいかっていうことに対して何か指針は
あります?
最悪値をo(n)に抑える為に、要素を定数で割った数だけサンプリングすることに
なるんでしょうか。
引数が現在の局面で返り値が次の局面という評価関数を作るのか。 面白いね。 手続き指向で考えると、盤面を配列に持って手が進むごとに代入によって変化 していく作りになりがちな気がする。っていうかそんな風に作った。 ちょっと工夫が足りなかったと反省。
>>216 再帰的なプログラムって関数型言語で書くと綺麗にかけるねぇ。
221 :
超初心者の名無しさん :01/11/01 19:10
>>1さんへ 弟ではなく、妹ですがどうぞ、力を貸してください。 3問あるのですが、この問題が試験に出るそうなので、どうかお願いします。 /* 演習課題1.配列と整数nを与えて、その配列の先頭からn個の要素の和を 求める関数テンプレートを定義しなさい。 ヒント:整数配列の和を求める関数 int arraySum(int a[], int n) { int s = 0; for (int i = 0; i < n; i++) s += a[i]; return s; } */ #include <iostream> #include <conio> using namespace std; //関数テンプレート int main(void) { int a[] = { 1, 2, 3}; //大きさ3の整数配列の例 double b[] = { 4.5, 6.7}; //大きさ2の実数配列の例 cout << arraySum(a, 3) << endl; // 出力は6。 arraySum<int>と書いても同じ。 cout << arraySum(b, 2) << endl; // 出力は11.2。arraySum<double> 〃 cout << "\Press any key to continue... "; getch(); return 0; }
222 :
超初心者の名無しさん :01/11/01 19:12
続きです。お願いします。 演習課題2.要素の型をクラスパラメータとした、2次元ベクトルクラステンプレート を定義しなさい。 参考:要素がdouble型の2次元ベクトルクラスの定義 class Vec { friend ostream &operator<<(ostream &os, const Vec &v); //フレンド関数の宣言 private: float x, y; public: Vec(double xx = 0, double yy = 0) //コンストラクタ { x = xx; y = yy; } Vec operator+(const Vec &b) const // メンバ関数として、+演算子を多重定義 { return Vec(x + b.x, y + b.y); } }; ostream &operator<<(ostream &os, const Vec &v) { os << "(" << v.x << ", " << v.y << ")"; // フレンド関数として<<を定義 return os; } */ #include <iostream> #include <conio> using namespace std; //クラステンプレートの定義 int main(void) { Vec<int> intVecA(1, 2), intVecB(3, 4), intVecS; //整数ベクトル Vec<double> doubleVecA(1.1, 2.2), doubleVecB(3.3, 4.4), doubleVecS; //実数ベクトル intVecS = intVecA + intVecB; doubleVecS = doubleVecA + doubleVecB; cout << intVecS << endl; //出力: (4, 6) cout << doubleVecS << endl; //出力:(4,4, 6,6) cout << "\Press any key to continue... "; getch(); return 0; }
223 :
デフォルトの名無しさん :01/11/01 19:14
てんぷれーと<たいぷねーむ てぃー> てぃー あれい_さむ(てぃー *あ、いんと ん) { てぃー さむ=0; ふぉー(いんと い=0;い<ん;い++) { さむ+=あ「い」; } りたーん さむ; }
224 :
超初心者の名無しさん :01/11/01 19:14
さらに続きです。 /* 問題3 スタックのデモプログラム 文字列を入力し、1文字ずつスタックに入れて、逆にスタックから1文字ずつ 取り出すことによって、逆順の文字列を出力するプログラムを作りなさい。 文字列型は使用しないこと。 ヒント:空白を含めて、行末まで1文字ずつ読む部分は次のように記述する for (;;) { //無限ループ char ch = cin.get(); if ( ch == '\n' ) break; // ここで、chをスタックに入れる; } */ #include <iostream> #include <conio> #include "stack_tp_l.h" using namespace std; int main(void) { cout << "\n\nPress any key to continue... "; getch(); } これから、私もできないなりに勉強をします。 お願いします。
template<class T> class Vec { private: T m_x, m_y; public: Vec(T x=0, T y=0) : m_x(x), m_y(y) { } Vec operator+(const Vec& rhs) const { return Vec(m_x + rhs.m_x, m_y + rhs.m_y); } friend ostream &operator<<(ostream& lhs, const Vec& rhs) { lhs << "(" << rhs.m_x << ", " << rhs.m_y << ")"; return lhs; } };
stack<char> stk; stk.clear(); for (;;) { //無限ループ char ch = cin.get(); if ( ch == '\n' ) { break; } // ここで、chをスタックに入れる; stk.push(ch); } while ( !stk.empty() ) { cout<<stk.pop(); } // 初めてSTL使ったんだけど、これで合ってる?
>>218 n 個の要素から K 番目に大きい要素を取り出すアルゴリズムは以下の通りです.
1. √n 個のサンプルをデータからランダムに選ぶ.
2. サンプルをソートして,K/√n - 2√√n 番目に大きいサンプル x と,
K/√n + 2√√n 番目に大きいサンプル y を求める.
3. n 個の要素から,y より小さなデータを全て破棄する.K 個未満になって
しまったら 1. からやり直し.
4. その中で x より小さなデータを全て選ぶ.K 個以上になってしまったら
1. からやり直し.
5. y 以上 x 以下のデータをソートして,大きい方からデータを選び,
全体で K 個目選ばれるまで続ける.
6. 終了
上記のアルゴリズム中,ステップ 3., 4. で失敗して 1. からやり直す確率は
4% 以下らしい(チェルノフの不等式より).だから,1.~4. を繰り返す回数は
平均すれば約 1.04 回.全体に対する処理は全て O(n) で,√n 個のサンプルに
対する処理は O(√n log n).全体に対する処理がさほど多くないので速いと
いうのがこのアルゴリズムの売り.
チェルノフの不等式の他の応用例としては,テレビの視聴率調査が分かりやすい
かな?たった数千軒のサンプルで数千万世帯の推測がかなり高い確率であっている
ということは,チェルノフの不等式が保証してくれます.
参考文献:
徳山豪, "ランダムアルゴリズムの話題から", 電子情報通信学会誌, vol.77,
no.9, pp.957-967, 1994. (いくつか細かいミスがあります.要注意.)
詳しい解説ありがとうございます。 細かいところで、5番の処理で残ったデータ数mに対しo(mlog m)になるのが 気になりましたが、可能性としてはこのmが√nより大きいオーダになってしまう ことがあるとしても、現実的には、4√nくらいを中心に散らばるから問題ない ということですね。 気になるなら再帰的にやればいいのかな。 勉強になりました。
230 :
デフォルトの名無しさん :01/11/05 13:30
sum=1/2~n-1 nの値を入力し答えを出力するプログラムを完成させなさい。 どのように考えればいいのでしょう?
>>230 問題文の意味不明。もう少しわかりやすく書け。
話はそれからだ。
232 :
デフォルトの名無しさん :01/11/05 14:25
えーと、 1 __ n-1 2 nに整数値を入力してこの式の答えを出力させなさい 但し 1 1 ___ __ 0 -3 2 , 2 などにも対応させること、ということです。
233 :
デフォルトの名無しさん :01/11/05 14:38
ずれまくり・・・欝 2のn-1乗ってしたかったんですが・・。
>>230 nの入力を促す
↓
2の(n-1)乗を計算する
↓
結果を表示する
↓
(゚Д゚)ウマー
235 :
デフォルトの名無しさん :01/11/05 15:22
>>230 double func(int n)
{
return pow(0.5, (double)n - 1.0);
}
236 :
名無しですけど :01/11/05 16:02
①自然対数の底eを求めるプログラムを作成する。 自然対数の底eは、無限級数eにより次のように定義される。 e≒1+1/1!+1/2!+1/3!+1/4!+…+1/n! ②ライプニッツの公式により、円周率の近似値を求めるプログラムを作成 しなさい。 ヒント…マイナスとプラスになる項を別々に考えると楽。 さっぱりわかりません。教えてもらえませんか?
#include <math.h> void main() { printf("①: %lf\n", M_E); printf("②: %lf\n", M_PI); }
>>236 とりあえず何がわからないか整理しろ。
以下の項目それぞれについて「わかる」か「わからない」か答えてみろ。
1.自然対数
2.底
3.無限級数
4.n!
5.自然対数の底eの求め方
6.ライプニッツの公式
7.円周率
8.近似値
9.マイナスになる項、プラスになる項
10.円周率の近似値の求め方
239 :
236ですけど :01/11/05 17:57
1~10まではわかるのですが、プログラムの仕方がわかりません。 いろいろ本とかで調べたのですが、どうしてもエラーがでて・・・ どこが間違ってるのかさえもわかりません。
241 :
236ですけど :01/11/05 18:20
上の②の問題ですが、 円周率=4(1/1-1/3+1/5-1/7+1/9-1/11+…-1/47+1/49)を使わなきゃみたいなんですよ。 それで main(){ int i,j,k,l,m,sum=0i for (i=1;i<=49;i=i+4) sum+=i; for (j=3;j<47;j=j+4) k=1/i; l=-(1/i); m=4*(k+1); printf("%d\n",m); } といれました。どこが間違ってるんでしょうか?
242 :
236ですけど :01/11/05 18:23
追加…結果円周率3.181とでなきゃいけないみたいです。
>>241 まず数学の勉強をやり直した方が…
これはプログラム以前の問題…
244 :
236ですけど :01/11/05 18:34
やっぱり・・・涙 もうちょっとがんばってみます。ありがとうございました。
245 :
236ですけど :01/11/05 18:40
やっぱ教えてください。初めてなのでC言語自体がよくわかりません。
246 :
236ですけど :01/11/05 18:47
2行目の0iは0;です。5行目の47の前に=を追加してください。 7行目のiはjです。8行目の1はlです。間違えまくってすみません。
247 :
デフォルトの名無しさん :01/11/05 18:50
>>241 int では、その計算はできません。float か double にしなさい。
249 :
デフォルトの名無しさん :01/11/05 19:07
>>241 for文は { } を使って範囲を明確にする方が良いです。そうしなさい。
↓こんな感じで
for( ; ; ){
}
250 :
236ですけど :01/11/05 19:14
>>248 sumはちょっと自分でもわけわからず使ってました。
>>249 わかりました。やってみます。
251 :
236ですけど :01/11/05 19:17
>>247 すいません。見落としてました。
floatでやってみます。
252 :
デフォルトの名無しさん :01/11/05 21:03
教えてもらえますか?
まず。 main関数の struct bodyStr *body; と、 do{ data[i]=readbody(num); }while(body[i++].a); を説明せよ。何をやってるのか自分で整理しろ。
あともう一度ソースアップして、ここで。
問題文もね
すいません、解決しました
ほんとかいな。ま、いいけどな。
パスカルで線形リスト来週までに書いて来い、だとよ… 当方、ポインタ、レコードわからんのですが
とりあえず考え方教えてほすぃ( ゚д゚) 今までクイックたらマージたらしか書いてないのに無理だ(;´Д`)
いみわからん
>>259 でも実際、ポインタとレコードが分からんかったら線形リストは無理じゃん?
>>262 今必死に理解しようとしているところ…
データを格納しようとするとき、新たに動的にレコード型の変数を作成する。
レコード型の最後だったやつのポインタの部分を新しく作ったレコード型の変数を指すようにする。
新しく作ったレコード型変数のポインタの指すところをnilにする。
適当なタイミングでデータを格納する。
…これでいい?
264 :
デフォルトの名無しさん :01/11/06 01:18
だが書けんっ (`□´)くわ~っ(`□´)くわ~っ
266 :
デフォルトの名無しさん :01/11/06 04:54
>>263 struct list_t {
void *data;
struct list *next;
};
> データを格納しようとするとき、新たに動的にレコード型の変数を作成する。
struct list_t list1; /* list1が最後のリストとする */
struct list_t list2;
> レコード型の最後だったやつのポインタの部分を新しく作ったレコード型の変数を指すようにする。
list1.next = &list2;
> 新しく作ったレコード型変数のポインタの指すところをnilにする。
list2.next = NULL;
> 適当なタイミングでデータを格納する。
list2.data = malloc(sizeof(data));
memcpy(list2.data, &data, sizeof(data));
# C言語だけどな...
type charString =packed array [1..20] of char; ptr =^item; item =record next:ptr; word:charString; end; こんなもんかな…
って半角スペースは続けては打ったら潰れるんだった…鬱
何度もスマソ… >267 Cわからん…すまん…馬鹿だから
271 :
デフォルトの名無しさん :01/11/06 16:41
>>259 お、すげー。出来てるじゃん。
そしたら線形につなげる事はとりあえず置いといて、
itemをひとつ確保した後、そこに何かデータを入れてみて。
varブロックも含めて書いてね。
var ch:char; word:charString; length:inetger; begin repeat read(ch) until (ch in ['A'..'Z','a'..'z','.']); word[1] := ch; while (ch in ['A'..'Z','a'..'z']) do begin length := length+1 if length <= 20 then word[length] := ch; read(ch) end end; >271 …一応…でも不安だ…
273 :
デフォルトの名無しさん :01/11/06 18:18
C言語の質問なんですが、fgetsで受け取った文字列を配列に一文字ずつ 入れるにはどうすればいいですか?
>>273 配列に入れる。
//MSDNからコピペ
FILE *stream;
char line[100];
if( (stream = fopen( "fgets.c", "r" )) != NULL )
{
if( fgets( line, 100, stream ) == NULL)
printf( "fgets error\n" );
else
printf( "%s", line);
fclose( stream );
}
つーか>273がなにを悩んでいるのか、マジ疑問。
278 :
デフォルトの名無しさん :01/11/06 19:46
質問する奴よぉ。 最低限、質問の意味がこちらにわかるように書いてくれよな。 お前らの質問の仕方を見てるとよぅ、こんなに日本語が不自由な奴ら じゃ、プログラムなんてできなくて当たり前、としか思えねえよ。 な、とにかく、質問の意味がこちらにわかるように書いてくれよな。 そこんとこ夜露死苦。
279 :
デフォルトの名無しさん :01/11/06 19:48
>宿題見てやるよ 見ていらねえよ! オマエに分かるのかボケ プ
>>278 質問する奴自身が
問題の意味を理解してない場合なんかは
仕方ないような気もする…。
> 見ていらねえよ! 日本語<以下略>
>>272 う、すまぬ、書き方が悪かったみたいだ。
由緒正しいPascalだと文字列の扱いがそんなに面倒になるのかな。
課題に「リストは文字列を保持すべし」という指定があるのかな。
もし無いなら、単純に整数値をひとつだけ保持する、という風に変えた方が
本筋を見失わないと思うんだけど。(後から直してもいいけど)
type
listPtr = ^item;
item = record
data: integer;
next: listPtr;
end;
という事にして
item型の領域をひとつ確保して、そのdataフィールドに値を設定する、
というのをやってみて欲しいんだけど。
ぐ…友達に騙された…まだ期限は先だ… >283 頑張りますわ…一応、リストの先頭を削除したり、見つかった文字列を先頭にもってきたり と、多彩な問題…(;´Д`)
大丈夫そうですね。んじゃ、がんばって。
>>284 (1)リストへのアイテム追加
(2)リストからアイテムを取り外す
(3)目的のアイテムがリストのどこにあるか探索
の3つの操作を作れば、あとはこの組み合わせでたいていのことはできるぞ。
例文 :This is a pen.->Uijt jt b qfo. 上の文はアルファベットを1文字後ろにずらしているんですが引数の文 字がアルファベットだったら1文字後ろにずらした文字を返し、そうで なかったら、そのまま返す関数を定義する。それを使ってキーボードか ら入力した英文テキストを暗号化するプログラムを誰か教えてくれーー。 あとデータの終りはEOF(ctrl-d)で判断するようにしたいんですが。
288 :
デフォルトの名無しさん :01/11/07 18:27
配列aを昇順にソートして表示したいのですが、何も表示されません。 よろしくたのみます。 #include<stdio.h> int main() { char a[5]; char b; int i,j; a[0]='9'; a[1]='3'; a[2]='2'; a[3]='1'; a[4]='8'; for(j=0;j<5;j++){ for(i=0;i<5;i++){ if(a[i]>a[i+1]){ b=a[i]; a[i]=a[i+1]; a[i+1]=b; } } } printf("%s\n",a); }
289 :
デフォルトの名無しさん :01/11/07 18:30
>>288 その1:i=4 のときに i+1 で a[5] にアクセスしてしまう。i のループは for(i=0;i<4;i++) にしとかないと。
その2:printf で表示するときに、文字列 a に終端を示す '\0' がない。最後に追加しとかないと。
290 :
デフォルトの名無しさん :01/11/07 18:32
>>287 はい、例によってどこが解かりませんか。
1.キーボードから例文テキストを入力する
2.アルファベットだったら1文字後ろにずらした文字を返し、そうで
なかったら、そのまま返す関数
3.2の関数を使ってテキストを暗号化する
4.暗号化したテキストを出力する
それから、EOFは Ctrl-D じゃないです。
291 :
デフォルトの名無しさん :01/11/07 18:35
>290 2.3ですね
>>290 EOFは
MS-DOSなら、ctrl-z
UNIXなら、ctrl+d
じゃないっけ?
>>291 じゃあとりあえず2から。
その関数は、引数は暗号化前の文字で、戻り値は暗号化後の文字だから、
char f(char c)
{
}
って感じだろうか。この中に
引数の文字がアルファベットだったら1文字後ろにずらした文字を返し、そうでなかったら、そのまま返す
という処理を、自力で書けない?やってみそ。
296 :
デフォルトの名無しさん :01/11/07 18:46
速攻試したら成功しました。 教えてくれてありがとう。
>>294 初心です。
char f(char c)
{ char cr
int cs=(int)c
if ((cs >= 65 && cs <= 90) ||(cs >= 97 && cs <= 122)){
if (cs=90||cs=122){
cs-=25
}else{
cs++
}
} else {
cs=0
}
if (cs=0){
cr=c
}else{
cr=(char)cs
}
return cr}
すいません。 } else { cs=0 } //←ここに括弧足りませんでした。 }
299 :
297(M) :01/11/07 19:32
ボコボコにして欲しいage.
>>297 > if ((cs >= 65 && cs <= 90) ||(cs >= 97 && cs <= 122)){
文字コードを直接書かない。マクロ使う。is~で始まるマクロを調べよ。
>if (cs=90||cs=122){
このままだとcsに代入してしまう。
あと、後ろにずらすなら%演算子を使った方が賢い。
使い方は自分で調べよ。
無駄な変数とかがあるのはマアイイヤ。
とりあえず、行末にはセミコロン付けような。 あと、関数の先頭で{の直後に変数宣言するのはやめような。 んでもって、数値で判定するのは見難いから'a'とか'Z'とかにしような。 if(cs=0){は常に真になるから==にしとこうな。 関数最後の}も改行してから書こうな。 上を直してからもう一回書いて下さい。見難くて解析する気も起きません。
302 :
297(M) :01/11/07 19:44
>>300 ありがとうございます。
興奮して"=="を忘れました。。。マクロも勉強します。
ここってこういう事をするスレなんですかね。(ワカラナイ・・)
そうだとありがたいです。また来たいです。それでは。
>>302 基本的に「わからないから答えクレ」というスレではないことは確か。
本来は麻衣ちゃんと戯れるスレでした。
305 :
デフォルトの名無しさん :01/11/07 19:56
#include <stdio.h> int hanbetu(int a,int b); main() { int a,b; printf("小さい数字は %d です",hanbetu(scanf("%d",&a),scanf("%d",&b))); } int hanbetu(int a,int b) { if(a<b) return a; else return b; } ↑このコードが期待したとおりに動きません。 #include <stdio.h> int hanbetu(int a,int b); main() { int a,b; printf("小さい数字は %d です",hanbetu(2,3)); } int hanbetu(int a,int b) { if(a<b) return a; else return b; } ↑これなら動きます。
306 :
297(M) :01/11/07 19:57
char f(char c)
{
char cr ;
int cs=(int)c ;
if ((cs >= 'A' && cs <= 'Z') ||(cs >= 'a' && cs <= 'z')){
if (cs==90||cs==122){
cs-=25 ;
}else{
cs++ ;
}
} else {
cs=0 ;
}
if (cs==0){
cr=c ;
}else{
cr=(char)cs ;
}
return cr;
}
すいませんでした。
>>301
307 :
デフォルトの名無しさん :01/11/07 19:57
自己レス。 ひょっとして、hanbetu 関数には引数としてscanf関数は入れられないのでしょうか? schemeならできるのに...
>307 scanfのプロトタイプを参照しよう
if (cs==90||cs==122){ が直ってないんじゃ、片手落ちだよ。
hanbetu()は (a>b)?a:bで済むな
311 :
デフォルトの名無しさん :01/11/07 20:08
C でwait かけるにはどうしたらいいの?
(a<b)?a:bだった。
>>309 ほんとにすいません。両手落ちです。
ところでint型の変数に'A'って数値で代入できるんですね!
御指摘ありがとうございました。
>311 sleep()
>313 う~ん、ホントは(int)'A'が正しいと思うよ。コンパイラに文句いわれないなら別にいいけど。
316 :
デフォルトの名無しさん :01/11/07 20:10
>>310 最初の内は ? : なんて無理に使う必要ないんじゃない?
ifで書けるんだから。
無理して使おうとすると
>>312 のようになる。
> scanfのプロトタイプを参照しよう プロトタイプでは無くて仕様だな。 scanf()の戻り値は格納に成功した入力フィールドの数を返し、 ファイルエンドを読み込んだ場合にはEOFを返す。 よって、scanf("%d",&a)は入力が数値だったら1, 数値でなかったら0を返す。
scanfは読み取った数字の個数を返すのじゃないのかい?
ごめん、かぶった
>>315 C言語の場合、'A' の型はintだからキャスト不要だよ。
322 :
デフォルトの名無しさん :01/11/07 20:15
>>318 なるほどぉ。
だから何を入力しても1しか返ってこなかったんだ。
ありがとう。
>>315 > ホントは(int)'A'が正しいと思うよ。
C++なら'A'はchar型、Cなら'A'はint型
324 :
デフォルトの名無しさん :01/11/07 20:16
>>316 Windows2000でやってます。
ところで、Cってコンソールレベルでの互換性があるってきいたけど、waitは違うの?
>>315 ありがとうございます。そうするようにします。
M欲求が満たされました。
326 :
デフォルトの名無しさん :01/11/07 21:50
>>324 少なくともCの標準関数にはwait()は無いです
それからコンソール入出力とwait()となんの関係がありますか?
タスク(スレッド?)関係の関数と思いますが。
328 :
デフォルトの名無しさん :01/11/07 22:05
エラー E2268 b.cpp 6: 未定義の関数 'sleep' を呼び出した(関数 main() ) ってなりますが。
>>324 C標準でウェイトかけるなら、clock関数で時間を計測しながら希望の時間が経過するまでループ待ち・・・かな。
>>327 少なくとも C の標準関数には sleep() は無いです。
>sleep() それは"windows.h"に毒されすぎですか?(w Cでやるなら329が普通
333 :
デフォルトの名無しさん :01/11/08 04:11
>>329 それはさすがにちょっと…。
この程度で許してもらえんかね。
#ifdef _WIN32
# include <windows.h>
# define sleep(sec) Sleep((sec)*1000)
#else
# include <unistd.h>
#endif
int main()
{
sleep(1);
}
335 :
デフォルトの名無しさん :01/11/08 12:53
ハッシュテーブルの最大サイズを素数にしたほうが良い、という理由を 論理的(数学的)に説明できる方はいますか? 最大サイズが多因数で構成されていると、余りを求めるときに偏りができる というのは「直感」として理解できるんですけど、うまく言葉で表せません。
>>335 ハッシュに変換する前の元データの偏りは
周期性というか特定の数の剰余に偏りがあるだろ?
例えばShiftJISコードとか。
そういう偏りはハッシュに変換するとどうなる?
337 :
デフォルトの名無しさん :01/11/08 16:05
>>236 もう遅いかもしれないけど、自然対数の底の方は1年の頃課題で
出たなあ。今見たら、まだ残ってたよ。
但し、1年の前期に作ったものをそのまま載せたので、
一部形式が変であまり良いプログラムじゃないけどね。
#include<stdio.h>
main()
{
double a,b,c;
a=1;
c=0;
for(b=1; b>=1e-15; b/=a) {
++a;
c+=b;
}
printf(" e=%.13f\n",c+1);
}
教えてください!abcと入力したらbcdと表示する プログラムなんですが #include<stdio.h> #define MAX 80 void main(void){ char in[MAX]; int i; scanf("%s",&(in[MAX])); for(i=0;in[i]!='\0';i++){ in[i]+=1; } printf("%s",in); } だと実行時にエラーになってしまいます
age
340 :
デフォルトの名無しさん :01/11/08 22:54
すみません。JAVAなんですけれども、自然数nに対し奇数なら3倍して1をたし、偶数なら 2で割る。これを繰り返し、(結果が1になるまで、)この数列を表示する。というプログラムを 書けという問題ですが、例えばn=5なら、 5,16,8,4,2,1 と表示されるようにしたいんですけど、実行すると 最後が"1,"となってしまいます。どのようにプログラムを書けば良いのでしょうか。
>>340 数と一緒に「,」を出さないで、次に進むときに「,」を出す
>>338 × scanf("%s",&(in[MAX]));
○ scanf("%s",&(in[0]));
>>338 sacnf のフォーマッタは %s でいいのか?
文字列と文字の違いはわかってるか?
非常に紛らわしいところではあるが、
その辺り解説書を読み直してこい。
344 :
デフォルトの名無しさん :01/11/08 23:02
>338 ×scanf("%s",&(in[MAX])); ○scanf("%s",in);
345 :
デフォルトの名無しさん :01/11/08 23:03
>338 scanf("%s",&(in[MAX])); が変。 scanf("%s", in); でよろし。 でも、scanfじゃなくて、fgetsとかを使う方がいいかと思う。
失礼。フォーマッタよりも受け皿の方が問題だったな。
>>342 が正しい。
入れ違いになった上にミスしていてスマソ
ただ、C言語の文字列の取り扱いを理解していないのは確かだと思われるので、
ちゃんと勉強するように。
怒涛の毎分レスだ(藁
みなさん有難うございます scanf("%s",&(in[MAX])); では80番目からいれていくことになってしまいますね あとinは&in[0]おんなじことを意味しているんですよね
350 :
たけちゃん :01/11/09 00:34
FORTRANで乱数を表示させて円周率を求める問題なんですけど、 なにぶん初心者が頭抱えてやってるもので、上手く動きません。 何がおかしいのかな?んんー dimention xcod(1000000), ycod(1000000) write(6,201) read(5,101)n if(n.gt.1000000.or.n.le.1) stop ix=n*9+9 call ranu2(ix,xcod,n,icon) write(6,202) icon ix=ix+9 call ranu2(ix,ycod,n,icon) write(6,203) icon icount=0 do 10 i=1,n r=sqrt(xcod(i)**2+ycod(i)**2) if(r.lt.1.0) icount=icount+1 10 continue pi=float(icount)*4.0/float(n) write(6,204) pi stop 201 format(' Input N, max=1000000 (i10)') 202 format(' ICON for X =',i5) 203 format(' ICON for Y =',i5) 204 format(' Simulated PI=',e15.7) 101 firmat(i10) end subroutine ranu2(ix,a,n,icon) real*4 a(n) real*8 x if(n.lt.1.or.ix.ilt.0) go to 8000 x=dfloat(ix)/2147483648.d0 do 10 i=1,n x=x*32771.d0+0.574890473391860723d0 x=x-dint(x) 10 continue ix=x*2147483648.d0 icon=0 return 8000 icon=30000 return end お願いします。
これ↓でなんで行数がカウントできるのか、わかりません。 /* linect.c */ #include <stdio.h> #include <stdlib.h> /* exit */ main() { FILE *fin; char buf[256]; char filename1[20]; int ct; /* 行数カウント用 */ printf("入力ファイル名="); gets(filename1); fin=fopen(filename1,"r"); if(fin == NULL){ printf("%sがオープンできません.\n",filename1); exit(1); } ct=0; while(fgets(buf,256,fin) != NULL){ ++ct; /* 行数カウントアップ */ } printf("%d lines\n",ct); /* 行数の表示 */ fclose(fin); }
353 :
デフォルトの名無しさん :01/11/09 15:15
fgets って1行読み込むって関数だよね? 「1行」って、バックスラッシュnまで、ってこと?
354 :
デフォルトの名無しさん :01/11/09 15:28
上のコードだと、fgetsが戻ってくるのは、 ・255文字まで読んだとき ・'\n'を読んだとき ・EOF のいずれか。'\n'はbuf内に書き込んで返される。 行の長さが255文字以下だとすれば、上のコードで行数を数えることができる。
p-codeとマシン語の見分け方は?
C っていろんな型あるよね。 メンドイから、ぜんぶ long doubleで宣言すればいいんでないの? 余計なこと考えずにすむし、バグも減る。
ポインタもlong doubleにするの? 演算誤差でアドレスが数バイトずれたりして(w
>340 ループ終了後に、"\b "を出力させるというインチキも有り。 リダイレクトされると厄介だが。
>>356 文字列は long double の配列か?
チト無理があると思われ。
>>356 実数型は丸め誤差で狂うから、余計なバグを生み出すかも。
名前82て間違え。スマソ
363 :
デフォルトの名無しさん :01/11/10 00:02
GAを用いた経路探索のプログラムを作りたいのですが、ダイクストラ法のプログラムにGAのプログラムを組み込むというか、入れてしまえばいいんでしょうか?? ダイクストラ法のプログラムは出来ているんです。あとは、どうやってGAを用いるかなんです。助言お願いします。
経路探索って、最短経路問題? ダイクストラ法で出来てるんなら、もうそれ以上何もする必要ないのでは。 この問題の意図は、収束が遅くてもいいからGAでやってみろってことでしょ、 多分。 とりあえず、なんらかの経路選択手法を遺伝子として持って、適応関数はかかる 距離みたいなので、やるのかな。うーむ。
GAを使ってなにをしたいのかをまず考えれ。 今動いているダイクストラ法のなにが問題で、GAによってどう解決したいのかを 明確にすれ。 そして、その問題点を解決するのにGA以外の有効な手段かないかどうかを検証すれ。 コーディングうんぬんはその後だ。
あっ そうですね。それをかかないと。 GAだと一回で複数の解候補が見つけられるじゃないですか! そうすれば、再検索の時間を短く出来ますよね。 ダイクストラ法だと再検索に時間がかかるということで、GAを使って、複数の最短経路候補を出したいのです。
>>366 GAは、一回で複数の解候補がみつかるとか、そういう話ではない。
解候補をたくさんつくって、その中からいいものを残して、そして
いいものに似たものを作る。で解の集合をだんだんしぼりこんでいく。
だから、解の候補が100個ある集団があるのなら、100個分の処
理をしないといけない。結局、ダイクストラ法で何回も再探索をかけ
るのと一緒。複数の最短経路を求めたいのだったら、二つの最短路を
選べる局面にきたら、その局面を記憶して、バックトラックかけた方
が絶対効率的。
GAっていうのは解探索の手法だが、できるだけ局所解に陥らないよ
うにして次善の解を探す手法。ダイクストラ法とは直行する考え方だと思
うし、アルゴリズミックに解けるならそっちの手法を取るのがよろし。
ってことで、課題の出題者の意図が今一つ、つかめなかったり。
確かに、1ついいものを残していくなんですけど、それに準ずる解候補も記憶というかしとけば、再検索をかけたときにすぐに次の候補がだせるじゃないですか。 複数の最短経路に準ずる解を一度にだせるように、GAを使いたいのですが・・・・・。
369 :
デフォルトの名無しさん :01/11/10 13:18
そういう研究は既に山ほどある.文献調べたまへ.GA 云々以前の問題だな.
>>368 そんな解候補残しておきたいだけなら、GA使う必要ないやん。
>>368 あと、もう一つ。
別にGAは一つだけ次世代にいいものを残しておくわけではないです。
とりあえず、まずGAの利点と欠点を勉強した方がいいと思われ。
class test { public static void main(String args[]) { // 配列の宣言,割り当て,初期化 int size = args.length; double data[] = new double[size]; for(int i = 0; i < size; i++) data[i] = Double.valueOf(args[i]).doubleValue(); // 配列のソート for(int i = 0; i < size - 1; i++) { for(int j = i; j < size; j++) { if(data[j] > data[i]) { double temp = data[j]; data[j] = data[i]; data[i] = temp; } } } // 配列を昇順に表示する for(int i = 0; i < size; i++) System.out.print(data[i] + " "); System.out.println(""); } } //配列のソート から //配列を昇順に表示する の間の部分が考え方わかりません。 お助け下さい。お願いします。
373 :
デフォルトの名無しさん :01/11/10 23:30
374 :
デフォルトの名無しさん :01/11/10 23:42
パールで聞きたい事があります。 他のCGIで作った変数の値を別のCGIの中に とりこむにはどうしたらよいのでしょうか。 REQUIREを使うと、そのCGIが実行されてしまいます。 欲しいのは、あくまで変数だけなんです。 よろしくお願いします。
なんとなくわかりました。
もうちょっと検索して調べて見ます。
>>373 さん、ご親切に有難う御座いました。
376 :
デフォルトの名無しさん :01/11/10 23:57
>>374 「作った」変数とは、具体的には?
ユーザにエディットさせるために、ソース内で変数に値を代入しているの?
それとも、二つのCGIを並列に動かして。。ってこと?
>>374 CGIパッケージの名前:変数名
で取り出せる
378 :
デフォルトの名無しさん :01/11/11 00:07
>>376 たとえば、複数のサイトのアクセスログをとりますよね。
それでその値をまとめて一つのCGIに出力したいんです。
それにはそれぞれのサイトのカウント数を
そのCGIに渡さないと出力できないですよね。
それでそのカウント数だけを使いたいんですが・・・
379 :
デフォルトの名無しさん :01/11/11 00:12
>>378 一度ファイルに吐き出して、そのファイルをマージするCGI書きなされ。
380 :
デフォルトの名無しさん :01/11/11 00:22
>>379 それはデータファイルにそれぞれのカウント数を書き込んで
まとめて出力するCGIからそのファイルを読み出すことですよね。
なんかそれでできそうな気がします。
やってみます。
ありがとうございます。
381 :
デフォルトの名無しさん :01/11/11 13:21
連立方程式の解を求めるプログラムなんですが アルゴリズムがさっぱり思いつきません 助けてー
382 :
デフォルトの名無しさん :01/11/11 15:47
383 :
デフォルトの名無しさん :01/11/11 21:01
さっぱりわからん
>>381 「アルゴリズムを思いつく」のは無理だろう。
>>382 ありがとう!
線形代数の教科書捨てて無くてよかった
386 :
デフォルトの名無しさん :01/11/11 21:35
Excel上でvbaを使って、 「2分探索法」のプログラムを組みたいのですが。 「2分探索法」のアルゴリズムは理解しているのですが、 それに合った、vbaのコードがさっぱり、わかりません。 どなたか、アドバイス頂けたら幸いなのですが。 当方、プログラム厨房です。 よろしく、お願いします。
>>386 さっぱりわからないと、アドバイスのしようが・・・。
とりあえず、どの辺までプログラムというかVBAわかってるの?
変数ってわかる?
If文の使い方ってわかる?
DO..LOOPステートメントの使い方とかわかる?
エクセルのセルの値の参照の仕方ってわかる?
388 :
デフォルトの名無しさん :01/11/11 23:29
↓このプログラムが期待した通りに動きません。 へぼいところをつっこんでください。 #include <stdio.h> #include <stdlib.h> #include <time.h> void main() { int i,n; n=-1; srand((unsigned)time(NULL)); i=rand(); while(n!=i){ printf("数字を入力すれ\n"); scanf("%d",n); if (n>i) printf("もっと小さい数だよ\n"); else if(n<i) printf("もっと大きい数だよ\n"); else printf("正解\n"); } }
389 :
デフォルトの名無しさん :01/11/11 23:33
scanf() 調べたまへ.使い方間違ってる.
390 :
デフォルトの名無しさん :01/11/11 23:38
ぐは。 &n だった。 ご指摘ありがとうございました。
391 :
デフォルトの名無しさん :01/11/11 23:40
>>390 ただ付ければいいと覚えないでくださいね。
ちゃんとポインタの勉強もしてくださいね。
393 :
デフォルトの名無しさん :01/11/11 23:48
>>387 さん
386です。レス遅くなり、すみません。
変数ってわかる?
>If文の使い方ってわかる?
>DO..LOOPステートメントの使い方とかわかる?
>エクセルのセルの値の参照の仕方ってわかる?
すべて、わかります。
今、自分で「2分探索」に必要なメソッドやプロパティ
の有無を調査中です。
が、どうやら、ないみたいです。
このような状態です。
394 :
デフォルトの名無しさん :01/11/12 00:05
>>393 えっと・・・
今一、目的がみえないんだけど。
2分探索を自分で実装するという宿題ではないの?
とりあえず、A1...Anに値が入っていて、昇順にソートされていると
しましょう。このとき、ある値xを2分探索で探したいと。
このとき、調べるべき範囲は、A1 - Anなので、二つの変数作って
min = 1
max = n
などとしておきましょう。
で、minとmaxの平均をtとします。
で、Atのセルの値と、xを比較します。
そうして、xの方が小さければ、max = t - 1として
xの方が大きければ min = t + 1として、
また同じことすればいいです。
で、xと一致したらそこで終了。
この処理は、
>>387 で書いた4つのことがわかっていれば書けますよね?
395 :
デフォルトの名無しさん :01/11/12 01:01
>>394 宿題ではなくて、卒論になります。
ちなみに当方、文系です。
頂いた指示をもとに、やってみます。
出来次第、報告します。
ありがとうございます。
卒論かあ。謝辞に「2ちゃんねる」とか書くのかな。それとも参考文献かな。 きみの大学の図書館で読める?
397 :
デフォルトの名無しさん :01/11/14 17:46
C言語の分割コンパイルの質問です #include<stdio.h> #include"test1.h" func1() { for(i=0;i<3;i++){ printf("%s\n",a[i]); } } /*test1-1.c終わり*/ #include<stdio.h> #include"test1.h" func2() { for(i=0;i<3;i++){ printf("%s\n",b[i]); } } /*test1-2.c終わり*/ #include<stdio.h> #include"test1.h" int main() { func1(); func2(); } /*test1-3.c終わり*/ char a[]={"a","b","c"}; char b[]={"d","e","f"}; int i; /*test1.h終わり*/ このファイルを分割コンパイルすると /usr/bin/ld: multiple definitions of symbol _a /var/tmp/ccgpaaaa.o definition of _a in section (__DATA,__data) /var/tmp/cciuaaaa.o definition of _a in section (__DATA,__data) /usr/bin/ld: multiple definitions of symbol _b /var/tmp/ccgpaaaa.o definition of _b in section (__DATA,__data) /var/tmp/cciuaaaa.o definition of _b in section (__DATA,__data) /var/tmp/cckzaaaa.o definition of _a in section (__DATA,__data) /var/tmp/cckzaaaa.o definition of _b in section (__DATA,__data) というエラーがでます。よろしくお願いします。
そのtest1.h、複数のファイルでincludeしてるでしょ。 そうすると多重に展開されて aとbが多重に実体を作ろうとする。 それでエラーがでる。 aとbの実体は、ヘッダじゃなく.cで作って、 test1.hには extern char a[]; extern char b[]; としておけばよい。 あと、インクルードガードもしといたほうがよいな。
あと、 int i; はグローバルで持たずに、各関数でローカルにもったほうがよい。 というかそれが普通。
よくよく見れば、いろいろおかしいところ多いね。 a[],b[]の配列はcharの配列だから char a[] = {'a','b','c'}; char b[] = {'d','e','f'}; じゃなきゃ、まずい。 それからfunc1と2でのprintf出力がおかしい。 文字と文字列、シングルクオートとダブルクオートの使い方、 ちゃんと理解してる?
>>400 /usr/bin/ld: Undefined symbols:
_a
_b
というエラーがでてまだできないです。
文字と文字列、シングルクオートとダブルクオート
の使いかたはわかっているのですが、ちょっとまちがえてしまいました。
いやーおはずかしい。
ところで、インクルードガードってなんですか?
401の書き方だと、たぶん誰もわからないと思うので 明日また全文のせようと思います。 その時はまたよろしく頼みます。失礼しました。
extern はしたけど、実体を確保したCファイル用意を忘れたに一票。 test.h: extern char a[]; test.c: char a[] = "abc";
stdio.h に printf の定義が書いてあると聞いたので、stdio.hの中をのぞいて見ましたが int printf(const char *, ...); これしか書いてありません。
>>404 宣言と定義の違いがわかるまでK&Rを復唱。
>>401 インクルードガードってのは、ヘッダファイルの先頭と末尾に
#ifndef _test1_h_
#define _test1_h_
.....(test1の内容)......
#endif /* _test1_h_ */
のように#ifndef~#endifを入れること。…のはず。(w
たぶんこれのことを言ってるんだと思ったんだけど、インクルードガードという言葉は初めて
聞いたもので。あってる?
>>398 これをやっとくと、ヘッダファイルの依存関係が複雑になってきて同じファイルを2回以上
インクルードすることになってしまった場合に、同じ宣言が二重に行われるのを防ぐことができる。
昨日の続きの分割コンパイルの質問です #include<stdio.h> #include"test1.h" void func1(i) { extern char a[],b[]; for(i=0;i<3;i++){ printf("%c\n",a[i]); } }/*test1-1.c終わり*/ #include<stdio.h> #include"test1.h" void func2(i) { extern char a[],b[]; for(i=0;i<3;i++){ printf("%c\n",b[i]); } }/*test1-2.c終わり*/ #include<stdio.h> #include"test1.h" int main() { char a[]={'a','b','c'}; char b[]={'d','e','f'}; int i; func1(); func2(); }/*test1-3.c終わり*/ extern char a[]; extern char b[]; /*test1.h終わり*/ これをコンパイルすると /usr/bin/ld: Undefined symbols: _a _b というエラーがでます。ではよろしくお願いします。
>>407 variables 'a' and 'b' should be defined as global variable in test1-3.c
>>408 なぜ英語なのかよくわからんが、まぁいいや。
例えばどういうふうにですか?
変数のスコープというのがよく分かっていないのでは? mainの中で定義したa, bは、mainの外からは見えないよ。
適当に直して動作確認したんだけど、ふと疑問が。 void func1(i) void func2(i) で i の型を書いてないが動作する。 そっちのほうが謎だ。
で、結局どうすればいいのですか?
413 :
デフォルトの名無しさん :01/11/15 20:14
>>397 a,bの定義をmainの外に出せ。
上手くいったtest1-3.oとエラーがでたtest1-3.oを
nm -gp test1-3.oで比べろ。
実行までは行くだろうが、func1,func2を直さんと及第点はとれんぞ。
414 :
デフォルトの名無しさん :01/11/15 20:56
javaアプレットを複数作ったのですがそれをチェックボックスとボタンで選択できるようにするには ドウすればいいのでしょうか?
415 :
デフォルトの名無しさん :01/11/15 21:05
>>414 いまいち、何をしたいかよくわからないが、チェックボックスの内容に
したがって表示するJavaアプレットを切り替えたいってこと?
だったら、Java Scriptあたりで、ボタン押したらチェックボックスに従い
対応するページにジャンプさせるようにするとか。
416 :
デフォルトの名無しさん :01/11/15 21:08
>>415 あ、ありがとうございます。
そういう方法もありますね。
ガーベッジこれ苦ションの実装のしかたおしえて
>>417 単純な、stop and mark&sweepでいい?
>>411 単に古いK&Rタイプの定義とみなされてintになってるだけ
>>417 とか、思いつつcopying GCが一番実装はしやすいか。
これは、同じサイズのヒープ領域を二つ作って交互に使う方式。
まず、処理をとめて。
それで、ルートセットから順にたどっていきます。
で、たどり着いたオブジェクトをその段階でもう一方のヒープ領域にコピーします。
コピーしたときは、今オブジェクトが置いてあった位置に次のコピー先書きます。
こうすることで、別のオブジェクトがそのオブジェクトを指していたときに、リンクを
張り替えることができます。
で、次にそのオブジェクトが指しているオブジェクトを読みに行きます。
ここで、どんなに深く読んでも、その呼び出し先をスタックに積んでいたりすると厄介
なので、子オブジェクトを読みにいくときに、現在のオブジェクトから子オブジェクトを
さしているポインタを、一時的にさらにその親オブジェクトを指すようにします。
こうすることで、たどっていって戻っていくとき用にスタックを用意しておく必要がなく
なります。
こうやって、深さ優先でどんどんもぐっていって(ローカリティを考慮すると、深さ優先
だとよくないという議論もありますが無視)、すでにコピーされたオブジェクトに辿りつ
いたら、コピー先のポインタに置き換えて、戻ります。戻ったときはポインタをコピー先
のポインタに書き換えるのをお忘れなく。
とか、書きつつ、これを読んでわかるわけないよな、とか思ったり。
421 :
デフォルトの名無しさん :01/11/15 21:51
- アルゴリズム - - アルゴリズム - 1つの平面上にn個の点があったとします。このとき、以下の条件を満たす多角形を求めたいのですが、 どのようにアプローチすればよいでしょうか。 条件1 凸型多角形である 条件2 多角形の内側に全ての点が存在する(「内側」には境界線上も含む) 条件3 多角形の頂点には、必ず点が存在する。 つまり、板にn個の釘が打ち付けられていて、 その釘を全て含むように輪ゴムを巻きつけたときにできる形です。 尚、多角形は頂点座標の配列で指定します。 条件1 凸型多角形である 条件2 多角形の内側に全ての点が存在する(「内側」には境界線上も含む) 条件3 多角形の頂点には、必ず点が存在する。 つまり、板にn個の釘が打ち付けられていて、 その釘を全て含むように輪ゴムを巻きつけたときにできる形です。
簡単に考えると 1 バウンディングボックスを考える 2 境界上の任意の点を始点とする 3 現在の点から内側に向かって最も右側の点を求める 4 その点を次の点として始点に戻るまで3を繰り返す これだとn個の点でm角形ができるときにO(nm)なんだが、 もっと効率いい方法あるかな。
全ての点で外積をチェック。内点が多いほど速い
>>422 全ての点を含む最小の矩形を考える。
上の辺(y座標の値が小さい方)に接する任意の点を選び、これを始点とする。
「基準の角度」をゼロにセットしておく。
「始点」を「基準点」とする。
基準点と任意の点の成す角度(始点から右に伸びる半直線を基準0度とし、
始点を中心に時計回りを正の角度、反時計回りを負の角度とする)
が最も「基準の角度に近く」、かつ「基準の角度よりも大きい」点を選び、これを次の基準点とする。
基準点が最初の点に戻るまでこれを繰り返す。
…という感じですか。
>>406 そう、そうれがインクルードガード。俗称だけどね。
ちなみにCの規格ではアンスコで始まる名前は予約語なので、
#ifndef TEST1_H_INCLUDE ~
とかにしたほうがいい。
結構違反しちゃうんだけどね。
>>397 はコンパイルできたのかな?
参考書があるなら「変数のスコープ」「グローバル変数」「ローカル変数」
っていうキーワードを調べて勉強するとよい。
>>423 よく分かんなかったんだが、全ての点からどことどこに向かう外積?
>>424 という感じ。
>>424 それだと、最初に最小矩形調べる必要ないんじゃない?
始点はY座標のもっとも小さいものを選べばいいと思うけど。
JAVAの質問です。助けてください。 ////////////////////////////////////////////// import java.io.*; class Sample{ : : public static void main(String[] args){ : keyboard1 r3=new keyboard1(); r3.show(); } } class keyboard1{ void show(){ BufferedReader input=new BufferedReader(new InputStreamReader(System.in)); try{ String up=input.readLine(); : : }catch(IOException e){ System.out.println(e); } } } //////////////////////////////////////////////// な感じに書いてコンパイルは通るんですけど、 Exception in thread "main" java.lang.NoClassDefFoundError: Sample って実行エラーがでます。何かヒント下さい。 直訳すると、メインでクラスが意義されていないエラー?
429 :
デフォルトの名無しさん :01/11/15 23:57
>>428 ソースはちゃんと、Sample.javaで保存した?
javac Sample.java
java Sample
と、最初のSはちゃんと大文字にした?
>429 してます。文字コードとかは関係ないですよねぇ~(win2k) class keyboardやってないプログラムで動いてたんで その辺の関連があやしいと睨んでるんですが。
ちなみに全文だしちゃうと //////////////////////////////////////////////// import java.io.*; class Sample14{ int upperHem,lowerHem,height; Sample14(){ setSize(10,5,8); } Sample14(int up,int low,int h){ setSize(up,low,h); } void setSize(int up,int low,int h){ upperHem=up; lowerHem=low; height=h; } float getArea(){ return (upperHem+lowerHem)*height/2; } public static void main(String[] args){ System.out.println("-----引数なし-----"); Sample14 r1=new Sample14(); System.out.println("r1.upperHem="+r1.upperHem); System.out.println("r1.lowerHem="+r1.lowerHem); System.out.println("r1.height="+r1.height); System.out.println("r1.getArea()="+r1.getArea()); System.out.println("-----引数あり-----"); Sample14 r2=new Sample14(4,10,7); System.out.println("r2.upperHem="+r2.upperHem); System.out.println("r2.lowerHem="+r2.lowerHem); System.out.println("r2.height="+r2.height); System.out.println("r2.getArea()="+r2.getArea()); System.out.println("-----キーボード入力-----"); keyboard1 r3=new keyboard1(); r3.show(); } } class keyboard1{ void show(){ BufferedReader input=new BufferedReader(new InputStreamReader(System.in)); try{ System.out.print("上辺の値(整数)を入力してください:"); String up=input.readLine(); int upperHem = Integer.parseInt(up); System.out.print("下辺の値(整数)を入力してください:"); String low=input.readLine(); int lowerHem = Integer.parseInt(low); System.out.print("高さの値(整数)を入力してください:"); String h=input.readLine(); int height = Integer.parseInt(h); float menseki=(upperHem+lowerHem)*height/2; System.out.println(menseki); }catch(IOException e){ System.out.println(e); } } }
です。インデント反映されてなくて読みにくいかも知れないですが お願いします。 ってか、外部クラス使うこんな感じでいいんでしょうか(汗
>>430 うーん、もう一度きくけど、
Sample14.java で保存して
javac Sample14.java
java Sample14
ってやったんだよね?
こっちだと、コンパイルできて実行できたからなぁ。
あとは・・・クラスライブラリへのパスはしっかり通ってる?
>>431 あと、どうでもいいけど
float menseki=(upperHem+lowerHem)*height/2;
だと、まず整数計算してからfloatにキャストするから、小数点以下は
切捨てられちゃう。
まじですか・・・当方JAVA1.3.1_01なんすけど・・・ クラスライブラリというとさすんでしょうか? Java.io.で・・・ java\binには通ってます。
>>426 >>427 すべての点同士で角度を調べるという事は、ひたすらアークタンジェント使う事になりますよね。
すごく時間のかかるような…
とりあえず、この方向で作ってみます。どうもありがとう。
438 :
デフォルトの名無しさん :01/11/16 01:00
Cでかけざん九九表を作る宿題が出ました。 forとか使ってなんとか数字の列は作れました しかし表がつくれなくて困ってしまいました Cでの表の作り方を教えて下さい
439 :
デフォルトの名無しさん :01/11/16 01:08
>>438 #include <stdio.h>
main()
{
int i,j;
printf(" 1 2 3 4 5 6 7 8 9\n");
for(i=1; i<=9; i++){
printf("\n%2d ",i);
for(j=1; j<=9; j++){
printf("%4d",i*j);
}
}
puts("\n");
}
>433 保存はSample14.javaでちゃんとしています。 実行時に作業ディレクトリ cd /d F:\My Products\JAVAで移動して... javac Sample14.java で、ワーキングディレクトリにSample14.classとkeyboard1.class が出来まして、、、 java Sample14でやはり... Exception in thread "main" java.lang.NoClassDefFoundError: Sample14 です(T_T) F:\My Products\JAVA>echo %classpath% D:\jdk1.3\bin; と通ってます。 文字コードはS-JISでもやってみましたが駄目でした。
配列を使って(ほとんど配列)コマンドオプションから任意に入力した 年月、一月分を表示するカレンダーを作成しなさい。 この問題のヒントをお願いします。二次元配列は禁止だそうです。 お願い君で申し訳ないです。どうかよろしく。
442 :
デフォルトの名無しさん :01/11/16 01:16
>>441 なんで禁止なのか。
その問題を出したやつはアホなので金玉を蹴っ飛ばしてやれ。
443 :
デフォルトの名無しさん :01/11/16 01:27
>>439 返信ありがとう御座います
その辺まではわかるのですが宿題では九九表なのでこんな感じの完成図なのです
技術ナシなので3×3表で
1 2 3
11 2 3
22 4 6
33 6 9
これにさらに表のセルも入れたいのです
頭痛いです。。。
私には無理なのでお願いします。
445 :
デフォルトの名無しさん :01/11/16 01:30
>429さん java -classpath . Sample14で解決しました。 Java VMって、クラスパスを自動的にカレントディレクトリに指定 するはずですし、java Sample14で動くと思っていたのですが・・・??? >Java VMは次のように、クラスを3段階に分けて検索します。 >1.ブートクラスパスを検索する >2.エクステンション(拡張)ディレクトリ中のJARファイルを検索する >3.“クラスパス”を検索する 何か関係あるのかなぁ・・・?同じような環境になったかた、解決 された方いますか?
447 :
デフォルトの名無しさん :01/11/16 01:36
>>455 ですよねExcel使ったほうが早いと思います
なんでCでやらせるんだろう…。
セル無しで出してみようかと思います
ありがとう御座いました。
>>441 俺なら「そんな創造性のない課題に答える意味はない」というレポートを
証明付きで提出するね。
自己レスですが >446 強引ですが、Classpathに.;とカレントディレクトリの指定を追加して 解決。 >436 は2.0fですね^^;まだ、Cの癖がぬけきれてません。 warnigじゃなくerrorとはさすが型変換厳しいにゃーっと。
>>449 1.3辺りでカレントディレクトリは明示的にクラスパスに記述しなきゃいけなくなった。
セキュリティの問題かね。
452 :
デフォルトの名無しさん :01/11/16 02:07
>450 そういうことなんですかー謎が解決してすっきりしました。 じゃあ、糞して寝ます。
ツェラーの公式で曜日を算出して表示するだけじゃないの?
>>454 ツェラーの公式って何ですかと聞かれるに 1Duke
456 :
デフォルトの名無しさん :01/11/16 02:29
>453 >441って 二次元配列禁止らしいじゃん(笑。 Cでしょ~?大変そうだね。 [3][6]でやるとかでないんでしょー 2001年12月 1 土 2 日 3 月 4 火 5 水 6 木 7 金 とかでいいんでねーの。 にしてもそれ、クラスでも参照しないとかなりめんどいね。 あとはその公式とやらネットで調べて、うるう年に対処して 終りでは~。
でも、カレンダーってこれ言わないか(w 月:1 火:2とかふって、公式から出た1日の曜日を考慮しつつ、 7つ表示したら改行とか? どこの大学何だろー。いかなくてよかったYO! 掛け算九九の問題が可愛くみえるねぇ~(笑
ツェラーの公式で一日の曜日求めて、空白でパディング。 ループで一日ずつ出力しながら(day % 7) == 6)のとき改行。
つか、>441 JAVAスレにマルチポスト・・・ あとは自分でやれやー
>>459 マルチポストっつーかJavaスレから移動してきたみたい。
//#include <string.h> #include <stdio.h> int cd[12]={31,28,31,30,31,30,31,31,30,31,30,31}; char wd[]="日月火水木金土"; int y=2001; int m=11; int vd; int gap; int gap1; int gap2; void main() { int i; //月のついたちの曜日を得るために標準との差をもとめる。曜日は0~6に対応 gap1=0; for(i=0;i<m-1;i++) { gap1+=cd[i]; } //1996.1.1と、y年.1.1の差を求める。 gap2=(y-1996)*365+((y-1993)/4)*1;//+1はうるう年の分 gap=gap1+gap2; vd=gap%7+1; //wd[vd*2];//月のついたちの曜日 printf("%4d年%2d月\r\n",y,m); printf("日月火水木金土\r\n"); for(i=0;i<vd;i++)printf(" "); for(i=0;i<cd[m-1];i++){ printf("%2d",i+1); if((i+1+vd)%7==0)printf("\r\n"); } }
ぉお、あとはとっととコマンドライン対応にしてくれ
うるう年の2月29をプリントすることも追加してくれ
いや、これはCOMつかって、excelに書き出せ、ってことだよ。 きっと(w あと、int index(x,y) 的関数を用意すれば、 配列は一次元でも二次元のアクセスができると思うけど。
>>441 int main(int argc, char **argv)
{
char cmd[256];
sprintf(cmd, "cal %s %s", argv[1], argv[2]);
return system(cmd);
}
charの一次元配列を使っているので出題の条件は満たしているはず。
なんちゃって。
>>437 いや、前の点から現在の点へ向かうベクトルと、現在の点から各点へのベクト
ルの外積を使えばatanはいらない。
>>423 はこう解釈してOK?
最初の点では外側に向かうベクトルを適当に与えておけば酔。
>>427 そだね。
>>466 うーん、外積をどのように利用するのでしょう...
468 :
デフォルトの名無しさん :01/11/16 16:48
>>421 それは「凸包」(convex hull,convex closure)を求める問題ですね。
さんざん研究されているアルゴリズムなので、検索すれば良いアルゴリズムが
見つかります。普通に組めば O(n logn)です。
研究されている分野は「計算幾何学」(computational geometry)です。
煽りがなくてうれぴーんだけど、俺はいまだに どうやったら2次配列を使えるのかがわからん。。 外周を求めるのは、まぁ、はじめにx座標なりy座標 なりの最小あるいは最大の点を選び出し、(それは ひとつの頂点ではあるはず)あと、x座標かy座標で ソートもしとけばあとあと便利だけど、そーしておいて 順次となりの頂点を、内積つーかコサインつかって 時計回りなり半時計回りなりにもとめるのが分かりやすい と思うYO.あとは区画を区切って区画の大きさに注意 しながらやる方法とかあるとおもう。めんどうけどな。
if(y=うるう年)cd[1]+=1;だ。(追加) うるう年のカレンダの時だけ2月以降ひとつずれるのじゃ
ちなみにcdはcounts of the month. wdはday of the week. vdは(assigned)value of the day ひまだったつーことでよろしく
counts of the days in the monthダ
473 :
デフォルトの名無しさん :01/11/17 00:44
argc ってなんですか?
>470 作ったんだけど、うるう年テストしてないや... 2000年、2月でいいんだっけ?
うるう年は4年に一回、それで充分。 どーせ2100年には俺は生きてない。
1996だった(笑。 ってことで・・・ >461のソースにネットに落ちてた関数足して 20分ぐらい、、、で、継ぎ接ぎしてみた。
#include <stdio.h> int GetDayOfWeek(int,int,int); int cd[12]={31,28,31,30,31,30,31,31,30,31,30,31}; void main() { int i,year,month,week; char szWeek[7][3]= {"日","月","火","水","木","金","土"}; printf("year,monthを入力しろや、ゴルァ!!\n例) 2001,10な感じだ(゚д゚)! \n"); printf("注) errorでたらCtrl+Cでもスレ or エラー処理書いとけ。\n"); scanf("%d,%d",&year,&month); week=GetDayOfWeek(year,month,1); printf("\n%4d年%2d月\n",year,month); printf("日月火水木金土\n"); for(i=0;i<week;i++){ printf(" "); } if((year%4==0 && year%100!=0)||year%400==0){ cd[1]+=1; } for(i=0;i<cd[month-1];i++){ printf("%2d",i+1); if((i+1+week)%7==0) printf("\n"); } } // ツェラーの公式より int GetDayOfWeek(int y, int m, int d) { // 1582 年 10 月 15 日以降でないと計算できない! if (y*366+m*31+d < 1582*366+10*31+15) return 7; // 1 月か 2 月のときは、去年の 13 月、14 月として計算 if (m==1 || m==2) { y--; m+=12; } return (y + y/4 - y/100 + y/400 + (13*m+8)/5 + d) % 7; }
あ、二次元配列使ってた(笑。 その行いらねーし。
480 :
デフォルトの名無しさん :01/11/17 02:42
すいません、お願いします、まったくの初心者です。 分割法の問題です。 /* quick sort */ void quicksort(int a[], int left, int right) { int i; if (right > left) { i = divide(a, left, right); /* 振り分け処理 */ a[left]..a[i-1] 部分の分類(quicksortの再帰呼び出し) a[i+1]..a[right] 部分の分類(quicksortの再帰呼び出し) } } 基準値(pivot)を使うみたいです。 分割を行なうとき、振り分け処理プログラム中のdivide関数を用意しなければ ならないみたいです このquicksort関数、及びdivide関数中の日本語部分をプログラムし作成せよ というのが問題です。 プログラミングを覚えるコツはあるのですか?
>>480 コツは、量書くことです。
とりあえず、人に聞いてもいいから、理解して書くこと。
本に載ってるソースで何をやってるか理解して、書き直すだけでも違う。
で、その問題だけど。どの程度わかっているか言ってくれないと。
配列はわかってる?
クイックソートってどういうものかはわかってる?
配列はなんとなく・・・ クイックソートとかはよくわからないんです。 分割法自体をまだ理解してません
>>482 クイックソートは・・・まあ検索して調べて。
簡単にいうと、ある敷居をきめて、それ以上のグループと、それ以下のグループ
を作って、それぞれのグループでまた二つにわけて・・って感じで順に並べていく。
分割法っていうのが何さしてるか、その辺の用語わからないんだけど。
多分、下のような事をやらせたいのかな。頑張って書いてみる。
この場合、例えば配列に
1638492750
と入っていると。で、これを、左側に例えば4以下、右側に5以上を
入れたいと思うわけです。
とりあえず、左から順に調べましょう。
1638492750
↑
まず、1を見ます。これは5以下だから、このままにしましょう。
1638492750
↑
次に6を見ます。これは5以上ですね。
このとき、一番右から順に見ていって、最初の4以下のものと入れ替えます。
このときは、0。ですので、0と5を入れ替えます。
1038492756
↑ ↑
まあ、また右側から全部チェックするのはバカらしいので、
6までは全部5以上だということを示すため、6をチェック
しときます。
さて、また0の右から順に4以下のものを探していきます。
8がみつかりました。では、こんどは6の左から順に左へ4以下の
ものを探していきます。2がみつかりますね
1038492756
↑ ↑
ここで、2と8を入れ替えます。
1032498756
↑ ↑
で、また、左から5以上のもの、右から4以下のものを探していきます。
つまり、左と右から順に矢印を真ん中にもっていくのですが、この矢印
が重なったら、その段階で終了です。
1032498756
↑↑
(順序が入れ替わってる)
で、この矢印の間がグループの区切りです。
これで、二つのグループに分割できました。
....って、わかりにくい説明でしたね。
意地悪してるわけでなく、こういうの文字で説明するの難しいってことで
許してください・・・。
ぐあ、ずれまくってる。 ブルーだ。
469にクイックソートを利用 すると速くなるよね つーか漏れはそゆこと考えてたのだ
487 :
デフォルトの名無しさん :01/11/18 02:39
C++を触り始めたばかりなのですが、 Cと構文は似たようなもんだと思って たんですが、ところどころ違うところ があって戸惑ってます。 最初にscanf使ってエラーが出て何で? と思ったぐらいの初心者です。 C++でのプログラムなんですが、モードが 2つあって1つはキーボードで打った文字を ファイルに書き込む。もう一つはそのファイルを 読み込んで表示させるです。 Cはある程度分かっています。 C++の考え方の触りの部分を勉強中です。 自分に興味の無い言語覚えるのって辛いです。 ASPとかVBは覚えやすいんですけど。 CとかJAVAって難しくないですか? 言語覚えるこつとかあるんですか? ひたすら組むしか無いですよね。 質問ばかりですみません。 よろしくお願いします。
僕ははっきり言ってCとC++なんてキニシナイけど プログラム結構かけてるよ ちなみに僕のバイブルはいまだにC(!=C++) のやつで、実習と応用の2冊しかないけど負けずに ばんばっているのサ
//////////////////////////////////////// //標準入力からファイルへ書き込み // argv[1] に出力ファイル名を渡す /////////////////////////////////////// #include <iostream> #include <fstream> #include <string> using namespace std; int main(int argc, char *argv[]) { if(argc<2) return -1; fstream fout; string str; fout.open(arg[1],ios::out); for(;;){ cout << "> "; cin >> str; if(str=="exit") break; fout << str <<endl; } fout.close(); return 0; } //////////////////////////////////////// //ファイルから標準入力へ出力 // argv[1] に入力ファイル名を渡す /////////////////////////////////////// #include <iostream> #include <fstream> #include <string> using namespace std; int main(int argc, char *argv[]) { if(argc<2) return -1; string str; fstream fin; fin.open(argv[1],ios::in); while(fin >> str){ cout << str <<endl; } fin.close(); return 0; }
入力と出力でプログラム分けちゃった。 1こめの方は、exitって入力すると終了です。 2こめのコメントの「標準入力」は「標準出力」のまちがい。
親切にありがとうございます。 しかもむちゃ早いレスで驚いてます。 やっぱ言語ってめげずにがんばるしか ないですね。 やれるだけやってみます。
493 :
デフォルトの名無しさん :01/11/18 03:54
IF EXIST calc.bas n88basic e:gpib | more IF EXIST calc.bas run"calc" って言うのをバッチファイルにしてcalc.basと同じフォルダに入れて バッチファイルをダブルクリックしたのですが、1行目しか実行されません。 何がいけないのでしょうか? DOSプロンプトで直接入力すれば実行できるのですが。
とりあえず、コンソールベースのアプリなら、 streamとstringを覚えると、なにかと楽です。 でも、この2つは結構、奥が深いので完全に理解しようとするとハマります。 最初は使い方のお約束だけ覚えて、使うのがよいね。
fstreamもstringも、この際構造体なの? どこにも宣言がないけどインクルードファイルに入ってるの?
よくよく見ればアレじゃだめです。修正版です。 //////////////////////////////////////// //ファイルから標準出力へ // argv[1] に入力ファイル名を渡す /////////////////////////////////////// #include<iostream> #include<fstream> using namespace std; const int BufferLength = 256; int main(int argc, char *argv[]) { if(argc<2){ cout << "you must input filename!!" << endl; return -1; } fstream fin; char buf[BufferLength]; fin.open(argv[1],ios::in); for(;;){ fin.getline(buf,BufferLength); cout << buf << endl; if(fin.eof() || fin.bad()) break; } fin.close(); return 0; }
しまった、いんちき英語メッセージ消し忘れた(藁 固定長配列はなんとなく美しくないのでstringクラスとかつかおうかと思ったけど、 結局こっちの方がシンプルにかけそう。 ちなみに490は何がダメだったかというと、fstreamの>>演算子はスペースやタブ を区切り文字として捨ててしまうので、出力結果がファイルの内容とは違ってしまう というところでした。
>>495 構造体ではないです。
fstreamクラスは、fstream.hとfstreamで定義されてる。
cin,coutはistream,ostream型のオブジェクト。これは確かtypedefされてる
んで実際に定義されてるclass名はまた違う。iostream.hとiostreamを見れば
わかるはず。
stringクラスは、stringファイルの中で定義されています。このファイルがは
さらにヘッダをインクルードしているんだけど、cygwinのg++とVC6では、
インクルードしているファイルが違ってた。
いずれにしても、stringクラスはバリバリのtempleteクラスなのでソースか
ら理解するのはかなりキビシイ。素直にマニュアル読むべし。
ところで
>>496 は strstreamを使うとスマートにかけるかもしれない。
うーん、実は漏れもstreamは使いこなしてないね。トホホ
487を読み直して気になったんだけど、 この程度のプログラムは、Cで書いてもC++で書いてもどっちがいいという ものでもない。 Cがある程度わかってて、C++は全然わかんないというならCの方がいいかも。 scanfのエラーなんてのはCレベルでの問題だし。 C++やるにしてもCの基礎は重要だから、Cの標準ライブラリでこの程度の ことはできるようにしといたほうがいいよ。 余計なお世話かもしれないけど・・・
つーわけど、今回はちょっと先走ってしまったカモ。 お騒がせしました。 500ゲット(藁
int って16bitの環境と32bitの環境があるけど、ソースを公開してる人は、 「これは32bitの環境用のソースです」 とかわざわざ書いてないような気がします。
>>501 動作確認したコンパイラなんかをドキュメントに書いたりするよな。
>>501 つーか、intの幅が違ったら動かなくなるようなコードを何の注釈もなく
配ってるような奴のソースを喜んで使わない。
一度自分で考えて作ってみたんですが、 C++にCの命令を混ぜて作りました。 fgetsとかfputsとか使って。 昨日教えて頂いたサンプルを一度 走らせてみたんですが、エラーが 出て自力では見たことのない命令 が多くて直しきれませんでした。 今はCとC++の違いを勉強しています。 coutとcitも慣れると便利です。
>>501 どっちかというと今の時代16ビットの方が珍しいので、
何も書いてなかったら32ビットで、16ビットの場合は明記する
と考えて良いのでは。
だれか縦型探索についてプログラムを交えながら わかりやすく説明してください。
>>506 プログラムと言われても、どんな問題を解きたいかわからないと
書きようがない。
まず、何がわからないかを明らかにしてくれ。
>>506 取りあえずデータ木でも示してやろうと思ったが2木か多木かも書いてない。
大学行くのやめなさい。
とりあえず3人の人食い人種と3人の宣教師が船で川を渡るやつ 教えてください。
>>509 大工生
左から宣教師、人喰い、船。
331 000
310 021
321 010
300 031
311 020
110 221
221 110
020 311
031 300
010 321
021 310
000 331
簡単。
縦形探索 : 隣接行列 adjacent[i][j],1<=i<=n,1<=j<=n が与えられたとき, グラフの連結成分(つながった部分)ごとに,番号の1番若い点から出発して縦型検索 でたどり,点の番号を書き並べる。隣接行列 a[i][j]は点i,jが線でつながっていれ ばa[i][j]=1,そうでなければ a[i][j]=0である。たとえば隣接行列が a[1][2]=a[2][1]=a[2][3]=a[3][2]=a[1][3]=a[3][1] =a[2][4]=a[4][2]=a[5][7]=a[7][5]=1 他=0 であったとすると,出力は 1: 1 2 3 4 2: 5 7 3: 6 となる
>>511 問題丸写しか。
「質問」の意味を取りあえず辞書で調べなさいな。
そこら辺にのってた解説のコピペ。
問題じゃない。
>>509 とりあえずいけるところまで行って、だめだったら引き返す。
この繰り返し。
今の問題だったら、ためしに一人宣教師船に載せるするとー
あーだめだー。じゃあ次はー、って感じで進めてくのかな。
無限ループに注意。
516 :
教えてください :01/11/20 13:21
numread = fread(&chr,sizeof(char),1,fp); プログラムがここにぶつかったとき(たぶん)に、 セグメント例外 (コアダンプしました) という表示がされて、止まってしまいます。 何ででしょう。たすけてください。
517 :
デフォルトの名無しさん :01/11/20 13:27
>>516 特におかしいようには見えないよ。
一応考えられるのは、
・chrがchar型でない
・fpが、正しくない(ファイルオープンに失敗してるとか)
numreadの実体がないとか。
chrが実はconst charだったとかいう可能性もあるかも。 でも多分、fopen()のエラーチェックをちゃんとやってなくて実はopenできて ないとかではないかな?
もしくは自分でfread()を作ったことを忘れてるか
>>517、518、519 レス本当にありがとうございます。 解決しました。 単に開くファイルの名前が間違っていただけでした。 ホントにすみません。 これからは、もう少し粘ってから質問します。
縦型探索についていろいろ教えてくださった方々。 助かりました。ありがとうございます。
たびたび申し訳ありません。 やっぱり、宣教師と人食い人種のやつの プログラムの作り方教えてください。 って言うか作ってください。 お願いします。
学校の宿題でVBAの問題が出たんですけど全然わかりません。教えてください。 問題1 3つの整数a,b,cを受取り、それをaⅹ2(2乗)+bx+c=0としてxの解を求める関数「二次方程式」を作れ。 2つの解のうち、いずれか一方を返せばよい ヒント 解の公式を適用する平方根は関数Sqrを使用する 問題2 セル範囲を2つ引数にし、対応するセルの値がすべて同じなら1を、一つでも違うなら0を返す関数「比較」を作れ。 ヒント Function 比較(c1, c2) ここで、セル1つずつを比較する End Function
526 :
デフォルトの名無しさん :01/11/20 17:30
>>523 Prologで作ったのならもっているぞ。
>>523 とりあえず、作った。でもここには載せません。
締め切りギリギリまで努力してください。
で、その努力の跡が見られ、それでも尚完成してなかればここに
ソース載せます。
(つまりは未完成でもいいから自分で書いて、載せてみろということ)
>>525 何がわからないのかくらい書いたらどうだ。
それすらわからないならおとなしく単位落とせ。
530 :
デフォルトの名無しさん :01/11/20 17:42
>>527 あなたが本当に作ったのなら頑張りますが
期限まで頑張らせといて最終的に無視とかいうのだけはやめて欲しいです。
本当に作ったのなら証拠を見せてください。
>>532 んなこといわれてもなぁ。。
どうすれば信じる?
>>532 あなたが本当に自分の力で宿題を解くのなら協力しますが、
模範解答を出させておいて最終的に丸写しとかいうのだけはやめて欲しいです。
本当に自分で考えるなら証拠を見せてください。
331 000 220 111 321 010 300 031 311 020 110 221 221 110 020 311 031 300 010 321 111 220 000 331 021 310 とりあえず、実行結果はこうだけど。
>>532 ワラタ(w
宿題丸投げして証拠を見せろと来たか(w
こういう奴を卒業させる必要ねえぞ。
別に、この人に限ったことじゃないけれど、 あくまで、宿題を手伝ってあげるスレであって、代わりにやって あげるスレでないことは理解して欲しいものです。
「宿題見てやるよ」だからねぇ 「宿題やってやるよ」スレッドでも建てるか?
>>539 教育的配慮上、やめた方がいいと思う。
丸写しじゃ本人の為にならんよ。
>>540 本人のためというか、そういう奴が卒業して近くに就職して来る可能性は
充分ある。卒業証書を持ってくる以上履修していて然るべき事をまた教え
直すのは無駄。あくまで自分へのフィードバックだと思って丸投げ厨を
無視すべし>プロ各位
実はこれが宿題というのは嘘です。 僕はただ単に人工知能に興味があって独学で勉強してる文芸学部の一年生です。 最近、将棋のAIを作りたくなっていろいろ本を読んで勉強していたんですが、 何から手をつけていいのかわからなくて とりあえず縦型探索とかいうのを実際に作ってみよう と言うふうに思いましてここに書き込んだ次第です。 今縦型探索という所でつまってますがそこは基本的な部分なので 多分ここがわかれば横型探索やヒューリスティック探索とか言うのも プログラムは組んでいけると思います。 なので、(忙しければ大体でいいので)プログラムの作り方を教えてください。 (できればわかりやすく・・・。)
>>543 まずは、プログラムの勉強からはじめてください。それが第一。
本読んで全く理解できないなら、ここで説明受けても理解できるはず
ありません。せめて、わからない部分書いてくれないと対処できません。
あと、横型探索は、縦型探索より遥かに(実装するのが)難しい(面倒)です。
将棋とかのプログラムについては結構知っていますが、総合的なプログラム
能力が必要となります。
いずれにしろ、地道にCの勉強からはじめることをお勧めします。
そうすれば、縦型探索くらい簡単に理解できると思います。
545 :
デフォルトの名無しさん :01/11/20 20:26
宿題の質の低さ、ってのも問題あると思うけど 実際の業務でそんな宿題以下のつまらない仕様とかも よくある話で、無茶な社内規定やコーディング規約に 縛られてプログラミングしてる人も多いと思う。 ヘンテコリンな宿題は、結構 頭の体操にもなるし 丸投げしてもらったのを解いて、答えを小出しにして もがく学生を眺めるのも それはそれで面白い。
546 :
デフォルトの名無しさん :01/11/20 20:41
趣味でやってるんなら言葉なんて後からついてくるもんだよね。 「あ、今まで俺がやってた事を縦型探索っていうのか」みたいな感じで。 何も分かってないうちから用語を振り回しているだけっていうのも...
>>545 たまに大嘘を混ぜておくとより効果的だね。
一見動いてるように見えて明らかなバグを仕込んでおくとか、口頭諮問で
絶対答えられないようなコードを書いてやるとか。
クソ大学の三年生程度なら解けてしかりの問題。 クソ大学の三年生が言ってるんだから間違いない。 もう一回やり直しな。
549 :
デフォルトの名無しさん :01/11/20 21:06
>543の言葉を信じるとして 趣味で将棋のプログラムが作りたいならとりあえず 合法的な手をピックアップする事からはじめて それらの中から初めは乱数で手を選ぶだけでも面白いと思うよ。 めちゃくちゃ弱いプログラムになるだろうけど、それはそれで面白いと思う。 あるいは選んだ手の中でコマの損得を計算して一番有利なものを選んでみるとか。 そうすると次は一手先を読んで同じ事をして... ほら、先が見えてきましたね。
550 :
デフォルトの名無しさん :01/11/20 22:22
【社会】考えるより、暗記する勉強が好き 中学生調査 11/20
http://news.2ch.net/test/read.cgi?bbs=newsplus&key=1006242655 1 名前:猫汁φ ★ 投稿日:01/11/20 16:50 ID:???
暗記する勉強が好きという生徒は、考える勉強が好きという生徒の2倍。
通信教育大手のベネッセコーポレーション(本社・岡山市)が全国の中学生を対象にした
アンケート結果で、こんな姿が見えてきた。公立中では来春から生徒の自主性を重視した
「総合的な学習の時間」が本格的に始まるが、長年続いてきた「勉強=暗記」という意識は
そう簡単に変わりそうにない?(16:33)
http://www.asahi.com/national/update/1120/020.html ソース続きは
>>2 2 名前:猫汁φ ★ 投稿日:01/11/20 16:51 ID:???
今年5~6月、全国の公立中学生約2500人を対象に調査した。
勉強方法を二分し、どちらに当てはまるかを尋ねると「暗記しようとする」との回答が67%で
「出来るだけ考えようとする」(30%)の2倍以上だった。
「分からないところはどうするか」には、「友達に聞く」が64%に上り「自分で考える」(34%)を
大きく引き離した。具体的な勉強方法では「分からない時には辞書を引く」は3人に1人。
「図鑑や辞典で調べる」は10人に1人だけだった。
公立小中学校で来年度から本格的に始まる「総合的な学習の時間」は
数字による成績評価もなく、従来の教科ではカバーしきれなかった
「自ら学び、考え、主体的に判断する能力」(文部科学省)を育てるのが目標だ。
多くの学校ではすでにカリキュラムに組み込み、実施している。
しかし、同社は「効率を追求する受験勉強の意識が根強く残っている」と分析。
「自分で考えようとする姿勢が子どもの間に根付くには、当分かかるのではないか」とみている。
(16:33)
http://www.asahi.com/national/update/1120/020.html だから教えて君が多いのか…
友達に聞くことはいいことだし、必要なことだと思う。 友達に聞いて「なるほど」と思うことは、考えることと同じ。 でもレポートの丸写しはいけない。為にならない。 暗記は、テストという要素のぞけば、語学以外はそんな重要じゃない気がする。 考えているうちに自然と覚えるのが理想。 暗記できなくても、「あー、昔こんなのやったっけな」って思うだけでも違う。 で、何を言いたいかというと、わからない事を人に聞くのはいい事だから、 別にこのスレで質問するのを遠慮することはないと思う、ということ。 でも、あくまで何がわからないか、ということがわかるレベルまでは、自分 で考えないと意味は無いし、誰も教えてくれない。
552 :
デフォルトの名無しさん :01/11/20 23:10
英語だって暗記なんかしないよ。 わからない単語がでてきたら、辞書で調べる。 昔だったら、紙の辞書。いまなら、電子辞書やオンライン辞書。 で、決して覚えようとしない。代わりに理解する。理解したら忘れる。 しばらくしてまたその単語に出会うと忘れているので、また辞書を引く。 これを14回繰り返すと、自然に覚える。わざわざ覚えようと努力する必要はない。 一番大事なのは、理解すること。理解できれば、いつか覚える。
英語の学習に電子辞書つかうのはお勧めできないよ。 紙の辞書引いてる時にはほかの項目も目に入るから、 なんとなく語彙が増えてくんだよ。
>>552 でも、単語が出てきたときに暗記するよう努力した方が上達早いと思うよ。
特にしゃべったり聞いたりするときには、パッとでてこないと辛い。
ボキャブラリーには理解も何もないでしょう。
言葉の意味を覚えてるか覚えてないか。
555 :
デフォルトの名無しさん :01/11/21 00:44
覚えるって、いったい何を覚えるのか。 例えば、Theを辞書で引けば意味や用法が30くらい載っている。それらを全部覚えるのか。 それとも、現在でてきたストーリーの中で使われている一部の意味だけ覚えるのか。 用法や意味がたくさんあっても、その語のイメージは一つしかない。そのイメージを把握するのが大切。 その元になる根本的なイメージからいろんな派生的な意味が出てくる。 何か長文を読んでいて、その中で、こういう意味でこの語が使われた。 こういうイメージをもつ、これが理解する、ということ。 英語デキナイ君は、ここを勘違いして暗記しようとしてしまう。だから就職しても height をハイトと発音したり width にいたっては「幅」とか逝ってごまかしたりする。 また、年中、「さっさとXXの日本語訳だせや!」 「●●英語版しかないんだ、、鬱」 とか泣き言いっとる。 だいたい、記憶とは、必要な情報は記憶し、必要ない情報は忘れる、というふうに寝てるあいだに海馬でフィルターかけて勝手に行う作業だよ。 「記憶しよう!」とがんばるのは 「心臓を動かそう!」 と一生懸命になってるのと同じ。 小学生の時期に、変な塾に通ってたやつに多い。子供なんてバカだから、恐怖心で煽れば怖くて必死になって覚える。 スパルタ式というやつだ。体育会系の講師が大声で怒鳴りまくる。こういう塾は最悪だ。
height はハイトでよかったね。スマソ。
>>553 同意。
例文がいっぱい載っている辞書がいい。
558 :
デフォルトの名無しさん :01/11/21 01:09
電子辞書の方が絶対いい。 例文を読んでいて、わからない単語があったら、jumpボタン一発で飛べる。 紙だといちいちメモしてひきなおさないといけない。 一度電子辞書を使ったら、二度と紙には戻れない。 政府は税金を使って、生徒一人に電子辞書一台与えるべきだ。
まー電子辞書で英語教育を受けた人間が出てこないとホントの とこはわかんないんだろうけどさー、 「頻出英単語○○○」みたいなの使ってる奴よりも、きちんと辞書を引いてた 奴の方が、確実に英語が読み書きできてたぞ。
>>555 趣味で英語の小説とか読んでるけどさ、辞書なしで読むんで
わからない単語とか読み飛ばしていっちゃうから、新たにボキャ
ブラリは付かない。たまに単語わからないと文章が意味わからない
時には辞書ひいたりするけど、それでもやっぱ全然身に付かない。
そこで、少し文章読むのとめて、「ああ、これってこういう意味
で、こういう使い方するんだ」と思い、覚えようと努力すること。
これが結構重要なんじゃないかな、と最近思ってるわけです。
561 :
デフォルトの名無しさん :01/11/21 01:23
>>560 あなたの言っている「覚える」という意味は、私の言っている「理解する」と同じことです。
あと、わかんない単語がでてきたら、絶対に見逃さないですぐに辞書引いてください。
紙ベースのときは、24時間辞書持ち歩くので重くて大変だった。
電子辞書は軽くていいね。ポケットに入る。
好きなことは覚えるの早いから、コンピュータに関するドキュメントを 読むに限る。
紙の辞書見た方がいいってのは同意。 ポルノ小説の原書読むのに俗語辞典とか引いて目的外の項目に目がとまって 予定外にハァハァしてしまったり(w
その点ではLinuxはハウツーの文書がまとまって存在するから、 英語の勉強になった。
>>561 ただ、語学と、数学やプログラムとの決定的な違いは、語学の場合は
覚えてないといけないことってのが多い。
数学で公式忘れたり、プログラムで命令忘れたりしても調べてればなん
とかなる。でも、読むときはともかく、しゃべってるときとか、聞いて
る時には、辞書なんて調べてられない。「何度も繰り返しやってれば、
そのうち覚えるさ」的ではダメで、いちいち覚えようと努力する貪欲さ
がないと、語学はダメだと思うのです。
その点他のものと区別しないといけないだろうってことで言いたかっ
たわけですが、板違いなのでsage。
566 :
デフォルトの名無しさん :01/11/21 02:26
表現力でカバーする
プログラムと直接関係無いけど、なんかいい感じ。
変に貧困なボキャブラリーで言いまわすより、ニュアンスが微妙に 違っても暗記した単語を使った方が通じやすいと思うよ。 もちろんイントネーションまで含めてしっかり暗記しないといけな いけどね。
なんだかんだ言っても、最後はボディーランゲージ。 日頃からコンパで、ジェスチャークイズやっとけ。
標準入力から50単語、3行以上の英文テキストを読み込み、 以下を標準出力に書き出すプログラムを作成して下さい。 ここで単語間の区切りは、スペース、タブ、コンマ、ピリオド改行のいずれかであるとし 、入力の終了はEOF(^d)とします。 (1)テキスト中のそう単語数、総文字数、単語あたりの平均文字数を求め、 出力する。 (2)テキスト中の各文字(A~Zの全26文字)の出現回数を求め、その一覧を 出力する。 (3)テキスト中の英字を出現回数の降順に並べ、出力する。 (4)テキスト中の1文字単語、2文字単語、3文字単語・・・ の出現回数を求め、その一覧を出力する。 (1),(2)はできました。(3)、(4)がわかりません
>>570 言語はなによ?
(3) (2)が出来たなら、その出力を文字順じゃなくて出現回数順にしてみろ。
(4) (1)で単語にわけるのは出来てるだろ。その単語の文字数をindexにして
(2)と同じようにやってみればいいんじゃないか?
Ruby房の出番ですよ
Ruby房向けの宿題だな
574 :
デフォルトの名無しさん :01/11/21 20:00
C++(Cでもいいのかも)でファイルの行数を出力するプログラムを教えてください 改行までが一行だそうです
575 :
デフォルトの名無しさん :01/11/21 20:08
>>574 main(int argc,char** argv){
int fd,c,num=0;
fd=open(argv[1],O_RDONLY);
while(read(fd,&c,1)>0)if(c=='\n')number++;
printf("%d\n",number);
}
動くかもしれないし動かないかもしれない
>>577 それ言ったら、openだって、標準じゃないし。
>>572-573 ほい。もっと短くできるかも。
---- wc.rb
#!/usr/bin/env ruby
words = ARGF.read.split(/[\s\t,\.]/)
#1
puts "1)"
h = Hash.new(0)
words.each{|w| h[w] += 1}
puts wc = h.keys.size
puts cc = h.keys.join.size
puts cc.to_f / wc
#2
puts "2)"
h2 = Hash.new(0)
words.join.each_byte{|c| h2[c.chr.downcase] += 1}
ary = h2.to_a.select{|l,c| /[a-z]/ =~ l}
ary.sort{|a,b| a[0] <=> b[0]}.each{|l,c| puts "#{l}:#{c}"}
#3
puts "3)"
ary.sort{|a,b| b[1]<=>a[1]}.each{|l,c| puts "#{c}:#{l}"}
#4
puts"4)"
h3 = Hash.new(0)
h.keys.collect{|w| w.size}.each{|s| h3[s]+=1}
h3.to_a.sort{|a,b| a[0]<=>b[0]}.each{|s,c| puts "#{s}:#{c}"}
>>579 rubyの動く環境なら、それこそwcくらい動くんじゃないかと
思うんですけど、外部コマンドを呼び出すのは美徳に反しますか?
Cでも1行。 int main(void) { int c, i=0; while((c=getchar()) != EOF) if (c=='\n') i++; printf("%i\n", i); return 0; }
#include <iostream.h> int main(){char c;int i=0;while(cin.get(c))if('\n'==c)i++;cout<<i<<endl;return 0;}
条件演算子って仕事で使っていいの? b=a>0 ? 1 : 0; みたいなやつ。
>>584 K&Rには仕事には使うなと書いてありましたが何か?
586 :
デフォルトの名無しさん :01/11/24 03:02
2chでの質問の仕方をマスターしました。 基本的に、ネタっぽい口調で質問すると、ネタっぽく答えてくれます。 この質問の仕方で有益な情報を得られる確率は実に80%を超える。 高圧的な態度や初心者(厨房)丸出しは晒されます。
587 :
デフォルトの名無しさん :01/11/24 09:46
>>582 と
>>583 を見ると、
if(c=='\n') と if('\n'==c) の違いがあるね。意味はおなじだが。
条件式からすると前者のほうが自然のような気がするのは折れだけ??
>>586 初心者でも、謙虚な姿勢で質問すれば晒されない。
ただ、板違いは晒される。
>>587 「==」を「=」とtypoした時、if (c='\n')だとエラーにならないけど
if ('\n'=c)ならエラーになるので、後者のスタイルで書く人もいるよ。
どっちのスタイルがいいかはC言語の初期から論争が繰り広げられているので
かかわらないのが吉。
590 :
デフォルトの名無しさん :01/11/24 10:41
>>589 ほとんど、決着のついた論争でしょう。
if (c=='\n') こう書くほうが、圧倒的に多数派。
いっそif(c - '\n' == 0)とか。 これもc - '\n' = 0はエラーだし。 可読性は消滅するが・・・。
592 :
デフォルトの名無しさん :01/11/24 11:52
演算子は利用禁止。 #define eq(a,b) ((a)==(b)) is ( eq(c, 'n') )
593 :
デフォルトの名無しさん :01/11/24 13:05
594 :
デフォルトの名無しさん :01/11/24 13:42
定数で宣言 const char c;
595 :
すきーまー :01/11/24 14:07
Cってequal関数ないの?
596 :
デフォルトの名無しさん :01/11/24 14:33
MOV AL,[c] CMP AL,'\n' JE xxxxxx MOV AL,'\n' CMP AL,[c] JE xxxxxx MOV AL,[c] SUB AL,'\n' JE xxxxxx 変わらん・・・
つか、=と==を間違えるか? 普通のプログラマなら、何年かに一回あるかどうかだろ。 こんなバグ。 仮に間違えたとしても、警告でるし。
598 :
デフォルトの名無しさん :01/11/24 16:17
マクロを組んで、 = を赤、 ==を青 で表示させるといいよ。
600 :
デフォルトの名無しさん :01/11/24 16:21
600ゲットオォォォォ!!  ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ (´´ ∧∧ ) (´⌒(´ ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡  ̄ ̄ (´⌒(´⌒;; ズザーーーーーッ
ビットフィールドのところを読んでいます。 「どんな小さなビット数で済むようなデーターも、それを表現するためには、8ビットを消費してしまうのが普通です。1ビットで済むデーターであっても8ビットを使ってしまいます。そこで、nビットで済むデーターなら、nビットを割り当てよう という機能が追加されました。」 と書いてますが、そんな細かいことまで気にする必要はあるのでしょうか? 私にマシンにはメモリー512MBのってますよ?
問「入力した10個の数値を大きい順に順位を表示するプログラムを作成しなさい。 その際、同じ数値が入力された場合は順位を同じにして同順処理を行うこと。 例 12,34,23,65,45,788,65,67,1,99 表示 No1=788 No2=99 No3=67 No4=65 No4=65 No6=45 No7=34 No8=23 No9=12 No10=1 入力部はできたんですが・・・
603 :
デフォルトの名無しさん :01/11/24 16:32
>>602 ようするに、ソートして出力する、ってこと?
a[0],a[1].a[2].a[3].a[4].a[5],a[6],a[7],a[8],a[9] にそれぞれ数値を格納する。
a[0] と a[1] の大きさを比べる。a[0]>=a[1]だったら、a[1]>=a[2] を比べる処理に移る。
a[0]<a[1]だったら、a[0]とa[1]の数値をスワップする。そしてまた a[0] と a[1] の大きさを比べる。
>>601 むかしむかし、あるところに、128KBしかメモリのないパソコンがありました。
606 :
デフォルトの名無しさん :01/11/24 17:04
VRAMとか。RGB 5bitずつ割り当てて16bit modeなんてあるし。
607 :
デフォルトの名無しさん :01/11/24 17:06
フルカラーモードと16bitカラーモードでは明らかにスピード違うし。(ゲームとか。)
608 :
デフォルトの名無しさん :01/11/24 17:59
>>603 要するに、となりあう2つを比較して、大きい方を左側に入れ替える
のを繰り返すということだね。
入れ替えが起こらなくなったら、終了
なんてバブリーな。
610 :
デフォルトの名無しさん :01/11/24 19:51
(1) n個の配列(data[0]~data[n-1])について、適当に基準となる添字 i(一般的にi=n/2)を定める。 (2) i より左側には data[i] より小さな値が、 (3) i より右側には data[i] より大きな値がくるように並び替える. i より左側(data[0]~data[i-1])について、(1)-(3)の処理を行う i より右側(data[n+1]~data[n-1])について、(1)-(3)の処理を行う
>>602 とりあえずアルゴリズムの入門書一冊買え。
一通り読んどくだけでも、問題にぶつかったときに、解決法を
思いつきやすく(というか思い出しやすく)なるぞ。
その前に情報科学の入門書だな
レジスタってなんで速いの?
614 :
デフォルトの名無しさん :01/11/24 21:35
レジスタだから
#include <stdio.h> int main(void) { int a; printf("%d",a); } このソースをコンパイルして実行したときに、何が表示されるか予想して当てることはできますか?
CPUと直結してるから。 メモリは余計な所をいろいろ通るから遅いの。
618 :
デフォルトの名無しさん :01/11/24 22:17
構文解析について解説しているいいサイト、知りませんか? Pascalで任意の入力式に対して真理値表を描くプログラムを 組んでいるのですが、その任意の入力式をどうプログラムで 処理できる形に変えるか悩んでいます。
4次元以上の配列tって仕事で使う?
>>619 なぜいきなり4次元なのか。
その質問には
>>619 の思い込みがたんまりと染み込んでる気がするの。
621 :
デフォルトの名無しさん :01/11/24 22:36
二次方程式の解を求めるプログラム教えてください
622 :
デフォルトの名無しさん :01/11/24 22:37
ちなみに、3,4,5次までやるのが宿題です でも2次でつっかえてます
continue; って、その回の処理をスキップする命令なのだから、 skip; と改名したほうがいいと思いますが?
#include <stdio.h> int main(void) { int a; + printf("%d",a); printf("%d",a); } これで予測可能
626 :
デフォルトの名無しさん :01/11/24 23:28
二次だろうが三児だろうが以下の方法で求められるだろバカ。
L = -2
>>15 U = +2
>>15 D = 10000
A = 0
do{
x の値を L から T まで D づつ変化させる
関数 f(x) がもっともゼロに近くなったときの X を A に記録
L = A - D
U = A + D
D /= 10
} ( D が 機会εを上回っている間 )
627 :
デフォルトの名無しさん :01/11/25 00:12
longの範囲に解が無い時ってどうするんだろうね
628 :
デフォルトの名無しさん :01/11/25 16:37
>>626 それじゃあ、解が一個しか求まらない気がするが。
3次以上の場合、解があるのに、求まらない場合もある。
>>621-622 二次方程式ときたいだけなら、解の公式使いなされ。
でも、これじゃあ3次以上は応用できない。
「ニュートン法」を使いなされ。
詳細については「ニュートン法」で検索しなされ。
ちょいフォロー。 ニュートン法もやっぱ一つしか解が求まらないから、 その求まった解を使って、次数を下げて再計算する。
って、別にニュートン法とかその辺が本質でないな(汗 えっと、前の二つのレス忘れてもらって。 まず、極大値・極小値を全部求める。つまり微分して解を求めるのだが。 この極値を求めるのは次数が一つ下がるから、再帰的にやればよい。 で、極値が全部もとまったら、そのときのf(x)の値を全部計算して、 +から-に変化しているところを探す。 そうすると、その間に解が一つだけあることがわかるから。 その区間を細かく区切っていって、+から-に変化してるところに 解があるんだから、だんだん範囲を絞り込んでいけばいい。
631 :
デフォルトの名無しさん :01/11/25 20:22
>>631 それくらい、Q&A読んでから書け。とにかく自分で調
べようとしないで脊髄反射で書くから「頭悪い」とか言われてしまうん
だよ。分からないことをできるだけ自分で調べることは、勉強の基
本だろ、勉強が嫌いな奴にはまともなゲームなど作れない!
これは楽譜も読めないのに曲が書けるというより厳しい事実だぞ。
再帰!
633 :
デフォルトの名無しさん :01/11/25 21:46
>>615 それってさ、環境にもよるけどさ、セキュリティーホールなんだよね
ハッカーと呼ばれるような人たちはこれを利用して解析したと聞く
↑セキュリティーホールっすか!?
なるほど初期化してなければ他人の研究を盗めるかも知れんな
マジで困っています。cに詳しい方、助けてください!! 6000個のデータが入ったテキストファイルを1000個のデータ(double)の入った6つのテキストファイルに分割したいのですが、やり方がわかりません。 元のファイル名はdata.txt、新たに作られるファイルはそれぞれdata1.txt,data2.txt,data3.txt....という名前をつけなければいけません。 どなたか達人の方、教えてください。 お願いします。
>>636 他スレで514と名乗るもんじゃないよ。
perl でも使え。
>636 data.txtをバッファに入れ、 1バイトづつ調べ、1000個目の","の位置までを、 data1.txtにコピーすればいい。 最後の","は削除しておこう。
640 :
デフォルトの名無しさん :01/11/27 02:06
>>639 ああそうか。なにも','を取り除いて書き込まなくてもいいのか。
みなさんありがとうございました。 問題解決しました!!
あってる? void write1000(FILE* src, char* filename) { FILE *dst; char c; int count; count = 0; dst = fopen(filename, "w"); for(;;) { c = getc(src); if (c == EOF) { fclose(dst); return; } if (c == ',') { count++; if (count == 1000) { fclose(dst); return; } } putc(c, dst); } } void main(void) { FILE *src; src = fopen("data.txt", "r"); write1000(src, "data1.txt"); write1000(src, "data2.txt"); write1000(src, "data3.txt"); write1000(src, "data4.txt"); write1000(src, "data5.txt"); write1000(src, "data6.txt"); fclose(src) }
>>636 for i in 1 2 3 4 5 6; do
head -${i}000 < data.txt | tail -1000 > data$i.txt
done
Cって関数のデフォルト引数って無いの?
こういうやつ? C99 にはあるよ。 void f(int i=0) { }
ごめん、訂正。なかった。
648 :
デフォルトの名無しさん :01/11/27 22:37
国家試験とかで使われる受験番号ってユニークなの? 今データベース設計してる段階なんだけど、そこら辺がよく分かんない。
649 :
デフォルトの名無しさん :01/11/27 22:39
相手(社団法人とか)もデータベース処理しているはずなので、 ユニークだと思うけどな。つーか、受験番号に重複があったら、 新聞沙汰だと思うが。
翌年同じ受験番号が振られるってことはあるかもよ。
BDOS って何の略?
どういうコンテキストで出てきたのか言わないと、 マイナーな略語は意味不明
Bogus Dirty Obsolete Shit
656 :
デフォルトの名無しさん :01/11/28 00:46
これです。 「システムコールはアセンブラで行うのが基本ですが、C言語からも呼ぶことができます。 C言語ではこれをBDOSコールと称しています。」
書いてることにいろいろ間違うがあるけど、推測するに、 BIOSの書き間違いみたいな感じかと。
658 :
デフォルトの名無しさん :01/11/28 00:58
Basic Disk Operation System call ...? Bridge to DOS かとも思ったけど...
かぶった(w
>>656 いったい何十年前の本を掘り起こして来た。
(15×8)-(11×7÷2)をCASL2でサブルーチン使ったときの プログラムを誰か出してください
>>662 まず、
>>1 をよく読みなされ。
それから、どう聞くべきか考えなされ。
とりあえず、何がわからないのかは、最低限書きなされ。
CASL2やったこと無いから全部わからんのです。
じゃあ、まずやってみなさい。
666 :
デフォルトの名無しさん :01/11/29 00:58
dspプログラムわかる人いますか?
>>662 CASL2で検索するといっぱい解説ページでてくるんで、適当に選んで
勉強しなされ。
で、読んでてわからない部分あったらここで質問すれば答えてくれ
る人はいると思う。
>668 ありがとです。 聞いてみました。
サブルーチン使うとSET ERRORと出て、15*8がすでにできないんですけど
>>670 : 662 wrote:
> サブルーチン使うとSET ERRORと出て、15*8がすでにできないんですけど
15*8 じゃなくて
15*8にすれば通ったりして:)
超難問です。 全加算回路をNANDゲートだけで作りなさい。しかしゲートの数は10個以下にすること。 そして、論理式を簡単化した式と途中の式も記せ。 注:2入力NANDゲートのみ いままでこの問題の最高記録、NANDゲート数8です。
全加算器はキャリー入出力付きの1ビット加算器
数学が苦手でもこの業界でやっていけますでしょうか? 高度な数学知識がなくても四則演算だけできればよいと 思いますが、どんなときに必要になるのでしょうか?
>>676 画像や音声などの信号処理系では数学の知識は必須。
プログラミング全般で言えば数学のセンスが必要。
ここでいうセンスとは、問題を適切な定理やアルゴリズムを使って論理的に証明する能力のこと。
ま、今それがなくても鍛えることは可能。
良い環境の会社に入ることだね。
>>677 こんな遅い時間にありがとうございます。 そんなに難しいアルゴリズムでなければ理解できますが、 画像や音声のなど処理は専門の知識が必要ということですね。 とりあえずは巷に出回っているようなフリーウェアのようなんを 作ってみようと考えていますので、難しい数学知識はいらない ですよね。いろいろ勉強してみたいと思います。
>>675 下位からのキャリーと二系統の入力、系3系統を入力として、
出力+キャリー出力の、3つの出力ってことになるのかな。
・・・最小必要数求めたいなら全探索するプログラム書いた方がはやいかもな。
・・・二つの出力ですね(汗
javaで π(パイ)の計算方法を教えてください。 注意;↓の方法 π=4- 4/3 + 4/5 + 4/7 +・・・・4/9999 和の方法がわかりません。わかる方?。
あちこちに書くんじゃねーよ、馬鹿。
pi=4.0 - 4.0/3.0 + /*中略*/ 4.0/9999.0;
∞ 2 Σ { 1/(2k-1) } k=1
乗算のチューリングマシン教えてください!おねがいします。
乗算のチューリングマシン教えてください!おねがいします。
誰か教えてください。 C言語でscanfを使うのはよくないって話を聞いたんですが、どうなんでしょう? 誰か説明してくれませんか?
C++をはじめたばっかなんで、くだらない質問なんですけど、 文字列の入れ替えを行うswap関数を作りたいのですが、 void swap(char *&x, char *&y) と、宣言して関数組んだら関数使うときは char a[len]="nanika"; char b[len]="doreka"; swap(a,b); でいいんですか?
宿題教えてください。 620年~680年に起こった出来事で、大化の改新以外に5つ上げろって言われてるんですが、 だれか教えてください。何かありませんか?
694 :
デフォルトの名無しさん :01/12/02 21:36
629 唐の玄奘がインド旅行へ出発 632 マホメット没 642 ササン朝ペルシャ滅亡 653 コーラン成立 661 ウマイヤ朝成立
696 :
デフォルトの名無しさん :01/12/02 21:55
>>692 ,
>>694 > void swap(char *&x, char *&y)
こういう定義は出来ますが、この関数に
> char a[len]="nanika";
> char b[len]="doreka";
> swap(a,b);
これは渡せません。
698 :
デフォルトの名無しさん :01/12/02 22:11
>>692 素直に
void swap(char *x,char *y)
としたら?
699 :
デフォルトの名無しさん :01/12/02 22:31
>>698 それって良く無くない?
オレなら文字数も一緒に渡したいかも
700 :
デフォルトの名無しさん :01/12/02 22:32
701 :
デフォルトの名無しさん :01/12/02 22:37
>>700 だってさー \0 が出てこなかったら怖いじゃん。
するなら void swap(char **x,char **y) としない?
703 :
デフォルトの名無しさん :01/12/02 22:41
>>701 それはその関数を使う奴が悪いよ。
例えば、strcpy()は文字数なんて渡さないよ。
C++ なら文字列に char じゃなくて string の方が
>>705 いや
void swap(char **a, char **b){
char *temp;
temp = *a;
*a = *b;
*b = temp;
}
こういうことしたいのかな、と。
問題をとり間違ってたらすまん。
あぼーん
void swap(string& x,string& y)
>>708 いろんなところで宣伝してるね。
うっとうしいからやめてね♪
711 :
情けない・・すみません :01/12/02 23:21
本当に困った。javaのバブルソートのプログラムが書けない。 昇順に並べ替えるだけなのに・・。困りました。
>>711 バブルソートってなんだっけ?
こういうのだっけ?
m[M]とかだと
for( i=0;i<M-2;i++)
{
for( j=i;j<M-1;j++)
{
if( m[j]>m[j+1] )swap(&m[j],&m[j+1]);
}
}
こんな感じ?
>>715 そりゃ、宿題スレならそうなんじゃないか?
うーむ。削除はやいな。
宿題スレだから合ってるのか・・・。逝ってきます・・・。
>>709 それだったらこうじゃない?
string x = "aaaaa";
string y = "bbbbb";
x.swap(y);
>714 > if( m[j]>m[j+1] )swap(&m[j],&m[j+1]); ここが違うような……。 m[j] -> m[i]
722 :
カオリネコ :01/12/03 02:35
ファイルを読み込んでその行数を数えよ。という問題です。なんとなくfgetsを用いる気もするのですが、わかりません。
723 :
デフォルトの名無しさん :01/12/03 02:38
>>722 ファイルの内容を全てバッファに入れて、'\n'の数を調べて1を引けばいいんじゃない?
1を引くんじゃなくて1を足す。
>>722 よっしゃ!日本語Cで書いてやる
main(引数)
{
int a=0;
ファイルオープン
while(cに一文字読み込み == 成功)
{
if(c=='\n')a++;
}
}
727 :
デフォルトの名無しさん :01/12/03 02:46
728 :
デフォルトの名無しさん :01/12/03 02:46
最後が改行だったら?
729 :
デフォルトの名無しさん :01/12/03 02:47
>>728 最後が改行でも、最後の行が空行になるだけでしょう?
730 :
デフォルトの名無しさん :01/12/03 02:49
改行 EOF<-これは行?
731 :
デフォルトの名無しさん :01/12/03 02:50
>>730 うん。
もし、行としないのなら、もっと処理を複雑にしないと。
732 :
デフォルトの名無しさん :01/12/03 02:52
ファイルの終端の前に必ず改行をいれる習慣があるから 最後の改行を行とは思わなかった。
733 :
デフォルトの名無しさん :01/12/03 03:01
便乗質問なんだけど、EOFって何? DOSの頃から使ってるのにいまいち意味がよく分からない。 EOFの後も読み込むソフトと読み込まないやつの両方が有るけど、 「ここまでがテキスト」っていう紳士協定みたいな物? ほんとのEnd of FileはEOFが無くても検出出来るでしょ?
>>733 そうです。紳士協定です。薬師丸弘子です。
つーか、基本的に無いものと考えといて、もしもあっても
パニックにならないように書けばいいのです。
>>731 ごめん。日本語C アップデートしました。
main(引数)
{
int a=0;
ファイルオープン
while(一行読み込み == 成功)
{
a++;
}
}
>>734 やっぱ、そうなんだ。サンクスコ
歴史的な理由でEOFが入ったテキストは存在するけど、
今では敢えて使わない物なんだよね?
便利だからよく使う。特に「普通」のファイルでないデバイスから の入力では。
>>736 733 wrote:
> 歴史的な理由でEOFが入ったテキストは存在するけど、
ないですよ:)
その昔CP/Mでは、「ファイルのサイズ」っていう属性がなかったので、
テキストファイルでは末尾に0x1aつけてたので、そういうファイルが
あっても対応できるようにしていた初期のMS-DOSのエディターなどでは
意識してたけど、それとEOFは別物です。
EOFってのはファイルに入っているわけじゃあないです。
>>738 やっとツッコミが入ったよ! 俺ひとりだけかと思った。
やーい年寄り!(お互い様です)
741 :
デフォルトの名無しさん :01/12/03 11:58
逃亡者を警察が捕まえようとしている、という設定で ものすごく広いボードの上で逃げ回ります。 逃亡者は自分を中心とした5×5マスの視界を持ちます。 そんで警察を視界内に見つけたら警察から遠ざかるように逃げます。 この「見つける」っていうのと「遠ざかる」っていう表現で 上手いのが思いつきません。 どなたかお願いします。
742 :
デフォルトの名無しさん :01/12/03 12:01
自分を中心とした、っていうのは (x,y)=(1,1)~(5,5)の(3,3)に自分がいるっちゅーこってす。 あるいは逆に、自分を中心として x=i-2~i+2 y=j-2~j+2 の視界を持つって事です。
>>741 見つける ってのは自分を中心とした5×5マスの中に警察がいるということ
遠ざかる ってのは 上のほうに見つけたら下へ、右に見つけたら
左へ、下に見つけたら上へ、右に見つけたら左へ移動するということ
744 :
デフォルトの名無しさん :01/12/03 12:34
言い忘れました。すいません。 逃亡者は1ターンで上下左右1歩ずつしか動けませんが 斜め方向も見れることになるわけです。 ・斜め右上に見つけた場合に左・下どちらかランダムに動く あるいは ・同時に警察2人(以上)を視界内に捉えた場合、 その2人(以上)から同時に遠ざかるような動きをさせたいのですが、 その表現のし方が…。 1人の場合は確かに警察がいる場所と逆の方向に (ランダム選択で)動かせばいいというのはわかるのですが。
>>744 ためしに4方向に動いてみて
警察がいなくなる方向を調べて
>>744 警察だって、斜めに動けないんだよね?
だったら、警察との街区距離(x軸方向の差とy軸方向の差の和)が大きくなる
方に逃げればいい。二つ以上いる場合は、街区距離の最小値が最大になる方向
に逃げればいい。
>>744 警官→自分ベクトルの和を求めてその角度の方向に逃げる
よく考えるとダメか。 警官→自分ベクトルを求めて、長さを逆数にして、 その和の方向に逃げる。でどうだ
749 :
デフォルトの名無しさん :01/12/03 12:55
ベクトルを算出するのは手間だと思うんですよ。
マス目で移動してるわけなので自分は
746さんのおっしゃるとおり街区距離(っていうんですか?)の
考え方でいいと思ってたんですが…上手く行かず…。
>>746 2人以上の場合はその全ての街区距離が最大になる方向へ
動くと言うことは、
警察が左右から同時に現れたとしても
それで大丈夫なんですか?
ちょっと考えてみます。
(いずれ犯人は捕まるので、そこ袋小路になった時に
どういう処理をすればいいのかが困っています)
>>749 遅レスですが、もう理解してもらえたでしょうか。
一応書いてみます。
左右同時に現れたときは、上か下へ行くことになりますよね?
上、左、右、下、それぞれ動いたときに各警察との街区距離(マンハッタン距離
という方が一般的かな)を求めます。そして、一番近い警察との距離が最大に
なるようなものの中から一つ選びます。もしも、一番近い警察との距離が最大に
なる逃げ方が複数あるときは、二番目に近い警察との距離が大きい方を選びましょう。
●○△○●
(●=警察、△=犯人)
としますと、左か右に逃げると、一番近い警察との距離は1になりますけど、
上かしたに逃げると3になりますよね?
751 :
デフォルトの名無しさん :01/12/03 23:58
お願いします。 任意の文字列を入力すると逆に表示するプログラムを作成(ABCと入力するとCBAと表示する)
752 :
デフォルトの名無しさん :01/12/04 00:08
お願いしますです… 上下4マスの十字型の視界範囲がある戦士(座標(x、y))がいて (斜めは見えません) 敵が視界内にいる、というのを判定したあとに フラグを立てる、というところまでのプログラムを教えていただけますか。
753 :
デフォルトの名無しさん :01/12/04 00:14
>>751 #include <stdio.h>
int main()
{
char s[256];
int i;
gets(s); //fgetsを使う方がよい
for(i = strlen(s)-1; i >= 0; i-- ) {
putchar(s[i]);
}
putchar('\n');
return 0;
}
#include <string.h> ↑これ、忘れてた。 動作確認はしてないので、バグがあったら、自分で直してね。
755 :
デフォルトの名無しさん :01/12/04 00:35
ポインタやってるのですがこれが宿題なのです ■文字列の中に特定の文字が含まれている数を出力するもの (reとeを入力すると2を返す)
とても早い返答ありがとうございます☆ とても助かります。
>755 意味がわかりまへん。
>>755 main(int argc,char** argv)
{
int a=0;
char *p;
p=argv[1];
while(*p!='\0')if(*p==argv[2][0])a++;
printf("%d\n",a);
}
こんな感じ? 何分だ?
4分もかかった・・・宇津田詩嚢
>>760 おっと。適当なところに入れてクレイ。
まー他人の宿題だしな。オレたちゃヒントだけ出して
あとは茶でもすすってりゃーいいと思うのよ。
それがこのスレの本来あるべき姿だと思うのよ。
なんかちがわない?
763 :
デフォルトの名無しさん :01/12/04 00:49
>■文字列の中に特定の文字が含まれている数を出力するもの >(reとeを入力すると2を返す) reとeを竜力すると1を返すんじゃないの? 題意からはそういう風にとれるんだが。 勘違いならスマソ。
>>763 入力はOS聞くの面倒だったから省いた
だって面倒くさいんだもん
だいだい
>>758 のプログラムも意味不明だよ。
argv[2]は一文字目しか見ないのか?
あ、勘違いしてた。スマソ。
main(int argc,char *argv[]) { int a=0,b=0,c=0,ans=0; char *p=argv,ap='特定文字'; for(a=0;a<argc;++a,p=argv[a]) while(*p) if(ap==*p++)ans++; printf("%d\n",ans); }
768 :
(- -) :01/12/04 03:13
main(int argc,char *argv[]) { int a=0,ans=0; char *p=argv,ap='特定文字'; for(a=0;a<argc;p=argv[++a]) while(*p) if(ap==*p++)ans++; printf("%d\n",ans); }
>char *p=argv なんだこりゃ
s に含まれる文字 c をカウント int ch_count(const char *s, int c) { int n; for (n = 0; *s; s++) n += *s == c; return n; }
std::count(s, s+strlen(s), c); //for C string std::count(s.begin(), s.end(), c); //for C++ std::string
772 :
デフォルトの名無しさん :01/12/05 00:11
>>770 あまり感心できないプログラム
BooleanのTrueが1であるという規定はC言語にはない。
↓改良
int ch_count(const char *s, int c)
{
int n = 0;
while (*s) {
if (*s++ == c) n++;
}
return n;
}
>>772 > BooleanのTrueが1であるという規定はC言語にはない
規格書読んだ?
初歩的なswap問題にお答えくださってありがとうございました。 お返事おそくなりましてすいませんでした。 とりあえず、色々とやってみた結果、変数をポインタで宣言して、 さらに参照渡しする前に、メモリの動的割り当てやったらあの形式でできました。 ただ、アホみたいなプログラムなんです。ダメだしよければしてください。 const int max = 64; void main() { char *a, *b; a = new char[max]; b = new char[max]; // aとbに文字を入れる処理 swap(a, b); } void swap(char *&x, char *&y) { char temp[max]; strcpy(temp, x); strcpy(x, y); strcpy(y, temp); }
>>773 どこに書いてある?しりたいです。
そういえば昔、MSXベーシックだと 真は-1だったね
776 :
デフォルトの名無しさん :01/12/05 01:08
Cでは、偽が0、真が0以外とされている。
例え真が1だとしても、
>>770 のプログラムは感心しない。
Booleanの1と数値の1をごっちゃにしている。
こんなプログラムは、業務では拒否される。
>>776 トリッキーなコード スレッドなら問題なし。
アーキテクチャ依存上等!コンパイラ依存上等!
つーのはおいといて
実務じゃ使わないが、それでも前任がヴァカだと
よくこうやって書かれてるからな・・・
保守の際、「このコードは多分こういう意図だろう」
ということを読み取るために必要な知識ではある。
拒否はされるが必要な知識ではあるわけだ。
778 :
デフォルトの名無しさん :01/12/05 01:14
>>774 折れなら、関数 swap の中身は
{
int i;
char tmp;
for (i=0; i<max; i++,x++,y++) {
c = *x;
*x = *y;
*y = c;
}
}
と書く。理由は、定数 max が 1000000 だったら困るから
779 :
デフォルトの名無しさん :01/12/05 01:16
>>778 char tmp ではなく、char c に訂正
>>782 >組み込みの演算子によってブー ル値が産み出されるときは、1か0であることが保証されている
まあマメ知識として覚えとこう
>>781 いまどきstrcpy()が使えて、stringが無いC++処理系なんてイヤ過ぎる。
>>784 今でもCとC++のライセンスが別々になってる処理系もあるって事で。
In article
>>778 , 778 デフォルトの名無しさん wrote:
>
>>774 > 折れなら、関数 swap の中身は
>
> {
> int i;
> char tmp;
>
> for (i=0; i<max; i++,x++,y++) {
> c = *x;
> *x = *y;
> *y = c;
> }
> }
>
> と書く。理由は、定数 max が 1000000 だったら困るから
数バイトの場合もmax回ループするのですね。
>>775 C99 の規格書でよければ 6.5.9 Equality operators の semantics に書いてある。
比較の結果は 0 or 1 で型は int まで決まってる。
>>776 > こんなプログラムは、業務では拒否される。
同意。知ってるのと実際に使うのは別問題。
>>787 > 比較の結果は 0 or 1 で型は int まで決まってる。
なんで比較の結果を_Boolにしなかったんだろうね。
rationale見ても書いてないし。
>>774 > void swap(char *&x, char *&y)
参照で渡す必要全然ないじゃん。
ポインタ交換したらいいってオチ?
C は文字列とバイト列が曖昧だからねえ
>>786 文字列と読めば変だけどバイト列かもしれないし
In article
>>791 , 791 デフォルトの名無しさん wrote:
> C は文字列とバイト列が曖昧だからねえ
>>786 文字列と読めば変だけどバイト列かもしれないし
べつに「あいまい」なわけじゃあなくって、
文字列はただのバイト列にすぎないっていうだけでしょ?
「\0」で終わりを識別するバイト列のための標準関数はそろってるし、
""をつかったリテラルにもつくとかそういうのがあるだけで。
>>792 > 文字列はただのバイト列にすぎないっていうだけでしょ?
この時点で、全然だめだね、君。本物のセンセイに教わってきなさい。
794 :
デフォルトの名無しさん :01/12/05 10:59
matlab教えてください
795 :
デフォルトの名無しさん :01/12/05 11:09
DB設計でテーブル1のA列をPRIMARY KEYに設定して、 テーブル2でA列にFOREIGN KEYを張るのは普通だろうけど、 このFOREIGN KEYを張った列自体をPRIMARY KEYに設定するのって 設計上おかしいですか? テーブル2の方で、FOREIGN KEYを張った列ともう一つの列を組み合わせて PRIMARY KEYを作りたいんです(2列でユニークに)
796 :
デフォルトの名無しさん :01/12/05 11:47
797 :
デフォルトの名無しさん :01/12/05 13:19
銀行の窓口で,US $ から日本円へ両替するとき (キーボードからは,ドルの金額を入力する)に, 銀行員が支払うのに適当な紙幣,硬貨の組み合わせを表示するプログラムを作成せよ. なお,最初に為替レート(例: 1 $ =120 *現在118~122) を入力し,その値を使って繰り返し窓口で計算できるものとする. という課題で /*課題4*/ #include<stdio.h> main() { int score1,score2; int a; printf("何$換算しますか?"); scanf("%d", &score1); printf("現在1$=何円ですか?"); scanf("%d", &score2); a=score1*score2; int y10000,y5000,y2000,y1000,y500,y100,y50,y10,y5,y1,y; y=a; y10000=y/10000; y=y%10000; y5000=y/5000; y=y%5000; y2000=y/2000; y=y%2000; y1000=y/1000; y=y%1000; y500=y/500; y=y%500; y100=y/100; y=y%100; y50=y/50; y=y%50; y10=y/10; y=y%10; y5=y/5; y=y%5; y1=y; printf("\n"); printf(" 一万円札 五千円札 二千円札 千円札\n"); printf("紙幣の枚数 %5%5%5%5\n",y10000,y5000,y2000,y1000); printf(" 五百円玉 百円玉 五十円玉 十円玉 一円玉\n"); printf("硬貨の枚数 %5%5%5%5%5\n",y500,y100,y50,y10,y1); } という風に作ったのですが,16行目がどうしてもうまくいきません, いい方法はないでしょうか?
16行目ってどこよ
799 :
デフォルトの名無しさん :01/12/05 13:23
798> 早速レスありがとうございます。 int y10000,y5000,y2000,y1000,y500,y100,y50,y10,y5,y1,y; です。
>>799 int a;
の次の行に移動させたら?
In article
>>797 , 797 デフォルトの名無しさん wrote:
> という風に作ったのですが,16行目がどうしてもうまくいきません,
> いい方法はないでしょうか?
ほんとうに「どうしても」うまくいかないんだったら、いい方法はないでしょうね。
じっさいには「どうしても」じゃないのでは?
「うまくいかない」とは具体的にどういう事なのかくらい書け。
800> int a;のあとに移動させたところ, 結果は,ここでは宣言できない(関数main) とエラーはかわりませんでした。 801>自分なりに熟考してみたのですが・・・。 802>すみません,言葉が足りませんでした。 上記のとおりです。
804 :
デフォルトの名無しさん :01/12/05 13:46
804> レス,ありがとうございます。 すみません,そのコンパイルは, 797のソースでやられたのでしょうか?
806 :
デフォルトの名無しさん :01/12/05 13:55
>>797 をコピペして、あと最後のprintfの%5が連発してるところは%5dに直してコンパイルして正常に実行された。
どうもありがとうございました。 無事コンパイルできました。 本当にお世話になりました。
ちゃんと動いてるから、printfの%5→%5dにして適当に\tで揃えとけ
ありゃ、お茶のんだだけなのに・・ 良かったね
810 :
名無しだゴルァ :01/12/05 18:21
#include <igraph.h> void main(void) { int x1=300,y1=100,x2=400,y2=200; SetBkMode(OPAQUE); SetLineStyle(PS_SOLID,2); SetLineColor(CL_BLACK); SetFillColor(RGB(0,0,255)); SetFillStyle(BS_HATCHED,HS_BDIAGONAL); Ellipse(x1,y1,x2,y2); printf(" Σ(゚д゚lll)") printf(" 逝ってよし") }
どこがダメ?
812 :
デフォルトの名無しさん :01/12/05 18:35
>>811 最後の二つの文の末尾に;がついていない。
サンクス。やっと逝ける・・・
814 :
デフォルトの名無しさん :01/12/05 21:29
C ってなんで、配列の境界をチェックしないのですか? int a[2]; a[0] = 0; a[1] = 1; a[2] = 2; エラー:a[2] は宣言されていません。 とかでてきてもいいと思う。
int a[2]; の場合は a[2] までは参照してもいいのよ。 でもね、値は保証されないの。 もちろん、書き込みはダメよ。 ナニが言いたいかというとね・・・どーでもいいじゃん、ってこと♥
参照できねぇって。 保証されてるのは&a[2]というポインタは有効だということまで。
In article
>>815 , デフォルトの名無しさん/815 wrote:
> int a[2]; の場合は a[2] までは参照してもいいのよ。
本気にする人がいそう...。
In article
>>814 , デフォルトの名無しさん/814 wrote:
> C ってなんで、配列の境界をチェックしないのですか?
> int a[2];
> a[0] = 0;
> a[1] = 1;
> a[2] = 2;
>
> エラー:a[2] は宣言されていません。
> とかでてきてもいいと思う。
思うだけなら自由です。
In article
>>816 , デフォルトの名無しさん/816 wrote:
> 参照できねぇって。
> 保証されてるのは&a[2]というポインタは有効だということまで。
え? 参照しなくても範囲外の「アドレスをとる」のさえ規格では保証されていないですよ。
たとえばa[-1]は、代入や参照しなくても、
それのアドレスとして何かにつかう(たとえば引数で渡す)ってのも
保証されないはず。
>>817 あらあら。
天下のvoidさんも勉強不足のご様子ね。
もう一度K&Rをよくご覧になってはいかが?
WindowsMediaPlayerでストリーミング放送を聞いているんですが、 たまにネットの環境によって接続が切断されてしまいます。 エラーがでて受信そのものが中断されてしまうんですが、 中断されたら再度、自動的に配信サーバにアクセスするようにさせたいのですが、 こういったことはWSHなどではできないのでしょうか? (エラー表示がでてきたら、それに反応して再接続するような形) *ちなみに32Kbpsで配信されている局です。 当方、ADSL。
In article
>>820 , デフォルトの名無しさん/820 wrote:
> あらあら。
> 天下のvoidさんも勉強不足のご様子ね。
> もう一度K&Rをよくご覧になってはいかが?
K&Rじゃなくて規格書のほうをみてますが?
>>820 ま、このことを知ってる人は少ないし、
コンパイラとかライブラリを書くようなことをしなければ
知らずにすむからね。
Nifty あたりの規格書マニアが見たら喜びそうな話だ。
>>823 確かに。fj.comp.lang.c あたりで熱く議論されていたような気がする(w
#しかし、この程度のことを知らないようだと今いる void タン は偽者かねぇ。
配列に関しては int n[2]; と定義したら &n[0], &n[1], &n[2] までは有効なポインタ値を
返すことが保証されている。ただし &n[2] に関してはポインタ値は使えるけど、n[2] を
読み書きするとアウト。
たぶん、この仕様は
int n[2];
register int *p;
for (p = &n[0]; p < &n[2]; ++p)
// do something with p
みたいなコードの動作を保証するためだろうね。積極的にこんなコードを書くことは少
ないと思うけど、頭の片隅に置いておくと役に立つかもね。
In article
>>824 , デフォルトの名無しさん/824 wrote:
>
>>823 > 確かに。fj.comp.lang.c あたりで熱く議論されていたような気がする(w
> #しかし、この程度のことを知らないようだと今いる void タン は偽者かねぇ。
っていうか「知らないことにしたい」わけですか? :)
>>825 ま
>>819 みれば、そう書いてあるからね(あれが本人かどうかは知ら
ん)。プログラマー板の隔離スレにコピペしておくから、続きはそっち
でね。
In article
>>827 , デフォルトの名無しさん/827 wrote:
>
>>825 > ま
>>819 みれば、そう書いてあるからね(あれが本人かどうかは知ら
> ん)。プログラマー板の隔離スレにコピペしておくから、続きはそっち
> でね。
じゃあついでに宿題を出しておきます。
&a[-1] + 1
はOKでしょうか? (1点)
>>829 なにをもって「OK」なのかわかりませんね:P
>>819 すり替えうまいですね。
int a[2];において、&a[-1]は保証されませんが、&a[2]は保証されてますよ。
ISO/IEC 9899:1999の6.5.6 Additive operatorsの8を見てください。
In article
>>830 , 推測で物を言う人/830 wrote:
>
>>829 > ダメだろ。
で、理由は? :)
In article
>>831 , デフォルトの名無しさん/831 wrote:
>
>>829 > なにをもって「OK」なのかわかりませんね
ああ、参照できるかどうか、
アドレスとれるかどうかです (規格で保証されているかどうかっていう点について)
In article
>>832 , デフォルトの名無しさん/832 wrote:
>
>>819 > すり替えうまいですね。
すり替えなどしてませんが?
> int a[2];において、&a[-1]は保証されませんが、&a[2]は保証されてますよ。
アドレスを取るはなしですよね?
で、「参照」のほうはどうなったの?
>え? 参照しなくても範囲外の「アドレスをとる」のさえ規格では保証されていないですよ。 で、「アドレスをとる」ほうはどうなったの?(w
>>835 819を見ると
> In article
>>816 , デフォルトの名無しさん/816 wrote:
>
> > 参照できねぇって。
> > 保証されてるのは&a[2]というポインタは有効だということまで。
>
> え? 参照しなくても範囲外の「アドレスをとる」のさえ規格では保証されていないですよ。
&a[2]の話なのに
> たとえばa[-1]は、代入や参照しなくても、
> それのアドレスとして何かにつかう(たとえば引数で渡す)ってのも
> 保証されないはず。
なぜか&a[-1]に変わってます。
832でも書いた通り、&a[2]は有効なポインタです。
| If both the pointer operand and the result point to elements of the
| same array object, or one past the last element of the array object,
| the evaluation shall not produce an overflow; otherwise, the behavior
| is undefined.
> で、「参照」のほうはどうなったの?
| If the result points one past the last element of the array object, it
| shall not be used as the operand of a unary * operator that is
| evaluated.
In article
>>836 , デフォルトの名無しさん/836 wrote:
> >え? 参照しなくても範囲外の「アドレスをとる」のさえ規格では保証されていないですよ。
>
> で、「アドレスをとる」ほうはどうなったの?
そっちは問題ないでしょ?
In article
>>837 , 832/837 wrote:
> > え? 参照しなくても範囲外の「アドレスをとる」のさえ規格では保証されていないですよ。
>
> &a[2]の話なのに
いえわたしは「範囲外」の話をしてますが
>
> なぜか&a[-1]に変わってます。
範囲外の例ででてきたのでは?
> 832でも書いた通り、&a[2]は有効なポインタです。
アドレスをとれる範囲には入ってますよね?
で、「参照」のほうはどうなったの?
Kusakabe ウイルス(w
In article
>>838 , デフォルトの名無しさん/838 wrote:
>
>>836 > 約一名が言い逃れしてる以外、もう結論は出てるんだから、
ということにしたいのですね? :)
>>840 > で、「参照」のほうはどうなったの?
| If the result points one past the last element of the array object, it
| shall not be used as the operand of a unary * operator that is
| evaluated.
これじゃ不満ですか?
| A postfix expression followed by an expression in square brackets []
| is a subscripted designation of an element of an array object. The
| definition of the subscript operator [] is that E1[E2] is identical to
| (*((E1)+(E2))).
こっちも引用すればOKかな。
>> >え? 参照しなくても範囲外の「アドレスをとる」のさえ規格では保証されていないですよ。 >> で、「アドレスをとる」ほうはどうなったの?(w >そっちは問題ないでしょ? なにが? 問題なんてはじめからありませんが?
>>843-844 かくて Kusakabe Youichi の煽りを無視できない人間によって、スレは荒れる
のであった。合掌。
(しばらくダメだな、このスレ)
>「アドレスをとる」のさえ規格では保証されていないですよ。 >アドレスをとれる範囲には入ってますよね? で、「アドレスをとる」話はどうなったの?
In article
>>843 , 832/843 wrote:
>
>>840 > > で、「参照」のほうはどうなったの?
> | If the result points one past the last element of the array object, it
> | shall not be used as the operand of a unary * operator that is
> | evaluated.
> これじゃ不満ですか?
いや、それじゃあなくて、参照についてコメントしていた件です。
>>842 >>約一名が言い逃れしてる以外、もう結論は出てるんだから、
(中略)
ということになりました。
>>832 もう相手にすんなよ。
> > 保証されてるのは&a[2]というポインタは有効だということまで。
>
> え? 参照しなくても範囲外の「アドレスをとる」のさえ規格では保証されていないですよ。
これを
> いえわたしは「範囲外」の話をしてますが
こう言い逃れしてるだけなんだから。
「ということにしたいのですね?」 ってキモすぎます。ヲタ用語?
>> いえわたしは「範囲外」の話をしてますが >こう言い逃れしてるだけなんだから。 もちろんわかってます(w
放置しないと延々つづくよ。 フランケンはしつこいから・・・
>>849 うぃす。不用意だったね、スマソ。
それだけじゃナニなのでまとめ。
Q: int a[N]; とした場合、a[-1]やa[N]は参照できますか。&a[-1]や&a[N]ならどう?
A: 参照するべきではありません。また、&a[-1]は有効なポインタとは定義されて
いませんが、&a[N]は有効なポインタです。
解説:
ISO/IEC 9899:1999では、配列オブジェクトにおいて有効な範囲はa[0]..a[1]
のみであり、それ以外の要素については未定義(undefined)とされています。
しかしながら、&a[i]のように配列要素へのポインタを得る場合については、特例と
して最後の要素の次の要素、つまり&a[N]は有効なポインタであるとされています。
(see ISO/IEC 9899:1999 Section 6.5.2.1, 6.5.3.2, 6.5.6)
ただし、規格では未定義(undefined)であり、するべきではない(shall not)
とされているだけなので、有効と定義されていない要素にアクセスしたりポインタを
得たりするこのできる処理系でも規格に準拠(conform)していると言えます。
(see ISO/IEC 9899:1999 Section 4)
854 :
名無しくん :01/12/06 00:57
CSV形式のファイル読み込み関数がなかなかうまくできません。 行末がカンマで終われば簡単なんですが、 正しくは行末は開業コードみたいで、 そうすると難しくなります。
>>584 改行コードならカンマと同じに処理できるが、
開業コードだと難しいな。
856 :
名無しくん :01/12/06 01:02
if (c == ',') みたいにしてるところを if (c == ',' || c == '\n') でどうよ?
っこれが宿題になってよいのか。 ってゆーか改行をスペースに置き換えれば良いだけだろ。
"こう,ゆうの",とか こん"なの,とか "これ なんか",ひどい マ板のCSVスレで出て来てたけど、ヤなフォーマットだねえ。
あ、わすれてた これ"と,"これ""と",は同じ意味
>>860 状態遷移機械を作った方が早いだろ、きっと。
>860 意味不明です(w
863 :
デフォルトの名無しさん :01/12/06 05:54
おながいします。 javaですが、 「A~Eの5つのカードがあります。 それをシャッフルし、任意のX枚を取り出します。 で、そのX枚のカードの中身を表示させます」 という宿題が出たのですが、全然わかりません。 シャッフルってどう表現すればいいんだろう…。
>>863 A~Eのカードが入った配列を用意して
ぐちゃぐちゃにかき回せばいいじゃん。
つーか、じゃばもくそもねーっつーかんじ? みたいな~
シャッフルのアニメーションでもさせんの?
しゃっほー。
In article
>>851 , デフォルトの名無しさん/851 wrote:
> > > いえわたしは「範囲外」の話をしてますが
> > こう言い逃れしてるだけなんだから。
>
> もちろんわかってます
ほほう。何か狙ってたけどうまくいかなかったので、「言い逃れ」だという
ことにしてしまうことにしたのですね:)
宿題スレなんだからまったりいこうよ。
規格うんぬんより、使ってる処理系でどう動くかが問題。動かしてみて試せばいいやん。
範囲外参照するとエラー出してくれると、デバッグするの楽なんだけどねー。
>>863 とりあえず、どこまでわかって、どこがわからないか、書きなされ。
In article
>>868 , デフォルトの名無しさん/868 wrote:
> 規格うんぬんより、使ってる処理系でどう動くかが問題。
そういう宿題のやり方はもんだいですね。
>>869 じゃあ、どうあがいても動く書き方で書くのが一番いいということで、ここは一つ。
良いか悪いか規格書みないとわからないような書き方で、宿題を解くのはどうかと
思いますし。
In article
>>870 , 869/870 wrote:
>
>>869 > じゃあ、どうあがいても動く書き方で書くのが一番いいということで、ここは一つ
ではよろしく。
872 :
デフォルトの名無しさん :01/12/07 00:08
>>863 カードのなかみってなによ。
カードAのなかに何が入ってるのさ。
873 :
デフォルトの名無しさん :01/12/07 04:35
どなたかいらっしゃいますか?
874 :
デフォルトの名無しさん :01/12/07 04:40
875 :
デフォルトの名無しさん :01/12/07 04:47
よかった、人がいらっしゃるんですね。 手伝ってもらえる所があると聞いてきてみたんですが…
876 :
デフォルトの名無しさん :01/12/07 04:49
ルーチンはなんとかわかっても それをプログラムにすることができないヘタレな学生です。 javaなんですが。
>>876 どのボタンを押すと、コンパイルされるかって事か?
いや、マジ宿題です… 途中まで自力でやって頭ポワポワ状態なんで… こっからどうすんだ?という感じです。 いろいろ見てもらいたいかなーと…。
この調子だと本題に入る頃には次スレか?
それと講義をサボっていたことを 今ひどく後悔している所です… 基本的なことが抜けてたりするので 人づてに手ほどき受けた方がいいかなと。
ハンターゲームのプログラム実装が宿題で、 それの獲物のクラス(を作って来いというヤツ)が自分の担当です。 簡単なルール n*n の正方格子の中で、3人のハンターと獲物が追いかけっこをする 獲物もハンターも上下左右1歩ずつorとどまるのみ動作可能 獲物からターンが始まってハンターが獲物を捕まえたら終了 獲物の特徴 縦横に特定の範囲の視野を持っていて(斜めは見えない) その視野の中にハンターをみつけた時には 自動的に逃げる(遠ざかる)ようプログラムすること
で、途中までしか組めなくてこっちに来てみたんです。
できたところまででイイから張りつけろ。 日が昇る前になんとかしたいんだろ?
じゃあ、文法がまるっきりなってないのを承知で貼ります。 自分も勉強しますんでお願いしますです。 import java.util.*; public class Game{ private int N; /* nxn の正方格子の定義 */ private int x,y; /* 正方格子のX座標 Y座標 */ private int see; /* 見える範囲のマス数 */ Random r = new Random(); /** Game クラスのコンストラクター @param i 獲物のx座標 @param j 獲物のy座標 */ public Game(int i,int j){ x = i; y = j; } /** nxn の正方格子数を設定します @param n nxn の正方格子数 */ public void setN(int n){ N = n; } /** 正方格子を設定します。 @param x 正方格子のX方向 @param y 正方格子のY方向 */ public void setXY(int i,int j){ x = i; y = j; } /** 見える範囲のマス数を設定します @param see 見える範囲のマス数 */ public void setSee(int s){ see = s; } /** X座標を取得します @return X座標 */ public int getX(){ return x; } /** Y座標を取得します @return Y座標 */ public int getY(){ return y; } (続く)
(続き) /** 獲物の行動を決定します @param h1,h2,h3 ハンターの位置情報 */ /* 1.初期条件設定 */ /* 1.1 5方向の箱を作ります */ int mode_dir[]; mode_dir = new int[5]; for(int e = 0;e <= 4;e++;){ mode_dir[e] = e ; } /* 1.2 ハンターを監視します */ /* 1.2-1 ハンターを監視するための箱を作ります */ int Hunt[][][]; Hunt = new int[n][n][3]; for(int a = 1;a <= n;a++;){ for(int b = 1;b <= n;b++;){ for(int c = 1;c <= 3;c++;){ Hunt[a][b][c]; /* (x,y)、h1~3の配列作成 */ } } } /* 1.2-2 ハンターの位置情報を箱に確保します */ /* 1.2-3 視界にハンターがいればフラグを立てます */ (続く)
(続き) public void escapeGame(Hunter h1,Hunter h2,Hunter h3){ for(int a = 1;a <= n;a++;){ for(int b = 1;b <= n;b++;){ for(int c = 1;c <= 3;c++;){ Hunt[a][b][c] = 0 /* ~フラグの初期化 */ if(0 << x - hc.getX() <= (s-1) / 2 && y == hc.getY()) Hunt[a][b][c] == hc.getX() - x; frag += 1; if(0 << y - hc.getY() <= (s-1) / 2 && x == hc.getX()) Hunt[a][b][c] == hc.getY() - y; frag += 1; if(0 << hc.getX() - x <= (s-1) / 2 && y == hc.getY()) Hunt[a][b][c] == hc.getX() - x; frag += 1; if(0 << hc.getY() - y <= (s-1) / 2 && x == hc.getX()) Hunt[a][b][c] == hc.getY() - y; frag += 1; /* ハンターが獲物の視界内にいればフラグを立てる */ } } } /* 1.3 壁があります */ /* 壁がない方向の箱を拾って壁がある方向の箱は控除します */ if(x = 1) mode_dir[0] = 5; /* これ以上上に行けません(上への進路無効化)*/ if(y = 1) mode_dir[1] = 5; /* これ以上左に行けません(左への進路無効化)*/ if(x = n) mode_dir[2] = 5; /* これ以上下に行けません(下への進路無効化)*/ if(y = n) mode_dir[3] = 5; /* これ以上右に行けません(右への進路無効化)*/
/* 2.ハンターの位置が視界内・視界外の判定をします */ /* 2-1 ハンターが視界内にいる場合 */ /* 2-1.1 そのハンターから遠ざかるように動きます */ if(frag >= 1){ for(f=1;f<=3;f++;){ if(0 != Hunt[hf.getX()][y][f] <= 1) mode_dir[0]= 5 ; if(0 != Hunt[x][hf.getY()][f] <= 1) mode_dir[1]= 5 ; if(0 != Hunt[hf.getX()][y][f] >= 1) mode_dir[2]= 5 ; if(0 != Hunt[x][hf.getY()][f] >= 1) mode_dir[3]= 5 ; } /* ~ハンターがいない方向をランダムに選びそちらへ進みます */
/* 2-1.2 視界にハンターがいますが 近いハンターから遠ざかる方に動きます */ /* ~①ハンターが近いほうを避けてハンターが遠い方に動きます */ }else if(frag >= 2 && mode_dir[0] = 5 && mode_dir[1] = 5 && mode_dir[2] = 5 && mode_dir[3] = 5){ for(f=1;f<=3;f++;){ if(0 != Hunt[hf.getX()][y][f] <= 2) mode_dir[0]= 0 ; if(0 != Hunt[x][hf.getY()][f] <= 2) mode_dir[1]= 1 ; if(0 != Hunt[hf.getX()][y][f] >= 2) mode_dir[2]= 2 ; if(0 != Hunt[x][hf.getY()][f] >= 2) mode_dir[3]= 3 ; } /* ~②ハンターが等距離ならば移動可能な方向に限定して ランダムに動きます */
/* ~③塞がれて動けなければその場にとどまります */ mode_dir[4] = 4; for(h = 0;h <= 100;h++;){ modeA = Math.floor(Math.random() * 5 ); modeB = Math.floor(Math.random() * 5 ); modeC = mode_dir[modeA]; mode_dir[modeA] = mode_dir[modeB]; mode_dir[modeB] = modeC; } /* 2-2 視界にハンターがいない場合 */ /* ~視界にハンターがいなければランダムに動くもしくは停止します */ }else if(frag = 0){ for(h = 0;h <= 100;h++;){ modeA = Math.floor(Math.random() * 5 ); modeB = Math.floor(Math.random() * 5 ); modeC = mode_dir[modeA]; mode_dir[modeA] = mode_dir[modeB]; mode_dir[modeB] = modeC; /* mode_dirの内容をシャッフルすることで入れ替えます */ } }
/* 3. 獲物の行動を決定します */ switch(mode_dir[0]){ case 0:/* 上に動く */ y -= 1; break; case 1:/* 左に動く */ x -= 1; break; case 2:/* 下に動く */ y += 1; break; case 3:/* 右に動く */ x += 1; break; case 4:/* その場にとどまる */ break; case 5:/* 抽選しなおす */ } } } (以上っす) 長くてホントすいません…見にくいし…
獲物想定ルーチン ・Hunt配列にハンターの情報を予め記しておく ↓ ・その配列と獲物の視野を重ね合わせ、視野の中にハンターがいれば フラグを立てる ↓ ・壁あるいはハンターが見えた方向へは行かない(削る) ↓ ・残った経路の中からシャッフルして1通り選ぶ
行動決定思考回路 ・mode_dir配列に0~4を予め決めておく ([0]=0~[4]~4、 0:上 1:左 2:下 3:右 4:その場にて動かない) ↓ ・壁の条件においては その配列に5を便宜上入れておく ↓ ・視野にハンターがいてもそちらに行かない、という意味で 5を入れておく ↓ ↓ ・四方塞がりになり全部が5で埋まってしまった場合 ↓ (壁で遮られハンターにも囲まれた) ↓ まだハンターとの距離の猶予がある場所を選びなおす ↓ ↓ ↓ ・視野の中にハンターがいなかった場合は そのまま何も変わってない0~4から選ぶ ↓ ・選んだ数字に従い行動決定
上記補足:やってないもの 1: 2.1-2の①以下は本来②としたい時の趣旨の場合であり ハンターとの距離が違えている時により遠い方を選ぶという 選択法を取ってない(上手い書き方がわからず) 2: mode_dir[5]は本来もう一度抽選しなおそうという意味合いで使ったが どうやれば回帰的な風に作れるのかわからない 3:その他に授業まともに出てないので文法メチャクチャ なにとぞ… 恥を忍んで晒しましたゆえ。
あとね、逃げるときに角を曲がると、ハンター見えなくなったり するよね。でも、戻ったりしちゃダメだよ。
>>895 言われて気づきました…どうしよう。
一旦角に追いこまれてそこから抜けたとしても
絶対に戻るなと言うことですよね?
根本的なデカイ間違いはあるでしょうか? 正直全く自信ないので…
898 :
デフォルトの名無しさん :01/12/07 11:50
放置?
899 :
デフォルトの名無しさん :01/12/07 12:02
このスレは、パックマンでも作ってるのかい?
>>898 今夜時間あるときにゆっくりみるからちょい待ってくれ、
>>885-891 えっとだ・・・、ソースかなりひどかったが、それでも自分で書いているとこと
コメントをしっかりつけている点は評価できるので、チェックいれました。
/** 獲物の行動を決定します
@param h1,h2,h3 ハンターの位置情報
*/
/* 1.初期条件設定 */
/* 1.1 5方向の箱を作ります */
/* 1.2 ハンターを監視します */
/* 1.2-1 ハンターを監視するための箱を作ります */
これは、メソッドの中にいれるべきものではないの?
で、
/* 1.2 ハンターを監視します */
/* 1.2-1 ハンターを監視するための箱を作ります */
for(int e = 0;e <= 4;e++;){
mode_dir[e] = e ;
}
int Hunt[][][];
Hunt = new int[n][n][3];
for(int a = 1;a <= n;a++;){
for(int b = 1;b <= n;b++;){
for(int c = 1;c <= 3;c++;){
Hunt[a][b][c];
/* (x,y)、h1~3の配列作成 */
}
}
}
これは、何をしたい? Huntに0をつけるとか?
いらないからforの部分は全部削除。
/* ~フラグの初期化 */ if(0 << x - hc.getX() <= (s-1) / 2 && y == hc.getY()) Hunt[a][b][c] == hc.getX() - x; frag += 1; これだと、ifは次の一行しかかからなくて、常にfragが+1される気がするけど 意図的にはそれでいいの? そもそも、fragどこでも宣言されてない気が。 int frag = 0;をメソッドの先頭にいれにゃ。それ以前にflagと書くべきでは。 あと、代入するときは== じゃなくて、=ね。 んで、hcって、cが変わるとh1,h2,h3となってくれるものと思って書いてる? それは無理です。このような場合は配列使いましょう。 Hunter h[3]; h[0] = h1; h[1] = h2; h[2] = h3; として、使うときは、 h[c].getX() みたいに。 if(x = 1) x == 1ね。 for(f=1;f<=3;f++;){ ↓ for(int f = 1; f <= 3; f++){ と書くべきでしょう。 /* 2.ハンターの位置が視界内・視界外の判定をします */ /* 2-1 ハンターが視界内にいる場合 */ /* 2-1.1 そのハンターから遠ざかるように動きます */
if(frag >= 1){ for(f=1;f<=3;f++;){ if(0 != Hunt[hf.getX()][y][f] <= 1) if(0 != Hunt[hf.getX()][y][f] <= 1) こういう書き方できないと思う。んで if(Hunt[hf.getX()][y][f] <= -1)? と書くべきじゃ? if(frag >= 1){ (中略) }else if(frag >= 2 && mode_dir[0] = 5 && mode_dir[1] = 5 && mode_dir[2] = 5 && mode_dir[3] = 5){ else ifっていうのは、ifが成立しなかったときに、次の条件が成り立つ場合 だから、frag >= 1が成り立たないときに、frag >= 2が成り立つわけはなし。 何かおかしい。 んで、これは上下左右どちらの方向にもハンターがいる、もしくは壁がある って認識でよい?
for(f=1;f<=3;f++;){ if(0 != Hunt[hf.getX()][y][f] <= 2) mode_dir[0]= 0 ; if(0 != Hunt[x][hf.getY()][f] <= 2) mode_dir[1]= 1 ; if(0 != Hunt[hf.getX()][y][f] >= 2) mode_dir[2]= 2 ; if(0 != Hunt[x][hf.getY()][f] >= 2) mode_dir[3]= 3 ; } これは、何をしたい? ちょっと意図がつかめない。(hfはh[f-1]にね) case 5:/* 抽選しなおす */ } これじゃ、抽選しなおしてない。 i = 0; boolean breakflag = true; while(breakflag){ switch(mode_dir[i]){ case 0:/* 上に動く */ y -= 1; breakflag = false; break; (略) case 5:/* 抽選しなおす */ i++; break; } } みたいに書きましょう。
見落としたところも多そうだが。 とりあえず、コンパイルエラーはなくすべくがんばってくれ。 アルゴリズム云々に関してはそれからだ。 んで、900超えたが、途中でスレかえると参照がめんどいので、 新スレ立てるの、これが解決するか950超えるまでまってくださ い。
これが宿題とは思えん!
>>906 宿題なんじゃない?
仕様にあわせてハンターと獲物を各人に作らせて、
授業の最後に対決させて遊ぶとか。
オブジェクト指向のいい勉強になるかもしれないしね。
908 :
デフォルトの名無しさん :01/12/07 20:13
ありがとうございます! こんなひどいソースを… 大学でも似たようなことを指摘されたので 手直ししてるとこっす。 書き直したやつを夜中にあぷしますです。 ちとお待ちください。 900さん本当感謝します。
命令されてゲーム作るなんて、 命令されてセクースするくらいつまらんな。 sage。
>>909 命令されてセクースするのは、普通にするよりもある意味興奮するかもしれん、
経験ないから知らんが
911 :
デフォルトの名無しさん :01/12/08 01:33
やばいっす、いくら直してもコンパイルにしかられまくってるんですけど…
>911 > やばいっす、いくら直してもコンパイルにしかられまくってるんですけど… いずれなくなるよ。根気よくやれ。
どうでもいいがフラグはflag
>>911 叱るのは「コンパイラ」だろ。
まぁなんにせよ、コンパイラがエラーを出してくれるうちが華。実行時エラーより、よほど
扱いやすい。
915 :
デフォルトの名無しさん :01/12/08 02:16
まだ手直し中ですが質問です。
>>902 if(0 << x - hc.getX() <= (s-1) / 2 && y == hc.getY())
Hunt[a][b][c] == hc.getX() - x;
frag += 1;
↓
if(0 << {x - h[c].getX()} <= {(see-1)/2} && y == h[c].getY()){
Hunt[a][b][c] = {h[c].getX() - x};
flag += 1;
}
という風に直してあります。
h[c]は初期化してあってh[0,1,2]=h1,2,3となるようになってます。
ところが int,int 型では && が使えないよと叱られます。
「ハンターのy軸が獲物のy軸と同じの時に
獲物の視界の中にハンターがいる
→ハンターとの相対距離(数字)、方向(上・左ならマイナス、下・右ならプラス)を
Hunt 配列に入れてフラグを立てる」
と表現したいのですが、&& の替わりに何を使えばいいのでしょうか。
if(0 << {x - h[c].getX()} <= {(see-1)/2} && y == h[c].getY( あ、これだね。 0 << {x - h[c].getX()} <= {(see-1)/2} 絶対値が、(see - 1) / 2より小さければいいんだよね? (ところで、普通視界3だったら、左右3マスずつにならない? 定義はこれであってる?) if(Math.abs( x - h[c].getX() ) <= {(see- 1 ) / 2} && y == h[c].getY() ){ ってすればいくと思う。
って if( Math.abs( x - h[c].getX() ) <= (see - 1 ) / 2 && y == h[c].getY() ){ に修正
こんな夜中遅くにしかもレス遅れてホントすいません。 一度全部見てもらえますか? どうも絶対値表示とかしてもエラーが減りません。 &&は本当に使っていいんですか? ※ちなみに獲物の視界は端から端まで、という取り決めになりました。なぜか。 see = 5 なら上下左右に2マスずつ(2+2+獲物の立ち位置)ってことになります。
あと int[] h = new int[3]; で初期化させたんですが ~ }else if(Hunt[x][h[d].getY()][d] >= 1){ などのように h[d] を使った場合、「int は間接参照できません」と出ます。 ※[]の2重括弧が原因?
(手直し版) import java.util.*; public class Game{ private int N; /* nxn の正方格子の定義 */ public void setN(int n){ N = n; } private int x,y; /* 正方格子のX座標 Y座標 */ private int see; /* 見える範囲のマス数 */ Random r = new Random(); /* 1.1 5方向の箱を作ります */ int[] mode_dir = new int[5]; /* 1.2 ハンターを監視するための箱を作ります */ int[][][] Hunt = new int[N+2][N+2][3]; int[] h = new int[3]; /** Game クラスのコンストラクター @param i 獲物のx座標 @param j 獲物のy座標 */ public Game(int i,int j){ x = i; y = j; }
/** nxn の正方格子数を設定します @param n nxn の正方格子数 */ /** 正方格子を設定します。 @param x 正方格子のX方向 @param y 正方格子のY方向 */ public void setXY(int i,int j){ x = i; y = j; } /** 見える範囲のマス数を設定します @param see 見える範囲のマス数 */ public void setSee(int s){ see = s; } /** X座標を取得します @return X座標 */ public int getX(){ return x; } /** Y座標を取得します @return Y座標 */ public int getY(){ return y; }
/* 方向を格納するオブジェクトを初期化 */ public void setMode(int e){ for(e = 0;e <= 4;e++){ mode_dir[e]=e; } } /* ハンターの場所をそれぞれ格納するオブジェクトを初期化 */ public void Hunt(){ for(int a = 0;a <= N+1;a++){ for(int b = 0;b <= N+1;b++){ for(int c = 0;c <= 2;c++){ Hunt[a][b][c]=0; } } } } /** 獲物の行動を決定します @param h1,h2,h3 ハンターの位置情報 */ /* 1.2-2 ハンターの位置情報を箱に確保します */ /* 1.2-3 視界の中にハンターがいればフラグを立てます */
public void escapeGame(Hunter h1,Hunter h2,Hunter h3){ h[0] = h1 ; h[1] = h2 ; h[2] = h3 ; int A = 0; /* フラグの有無 */ for(int a = 0;a <= N+1;a++){ for(int b = 0 ; b <= N + 1 ;b++){ for(int c = 0 ; c <= 2 ;c++){ if( Math.abs( x - h[c].getX() ) <= (see - 1 ) / 2 && y == h[c].getY() ){ Hunt[a][b][c] = { h[c].getX() - x }; flag += 1; } else if( Math.abs( y - h[c].getY() ) <= (see - 1 ) / 2 && x == h[c].getX() ){ Hunt[a][b][c] = { h[c].getY() - y}; flag += 1; }else if( Math.abs( h[c].getX() - x ) <= (see - 1 ) / 2 && y == h[c].getY() ){ Hunt[a][b][c] = { h[c].getX() - x}; flag += 1; }else if( Math.abs( h[c].getY() - y ) <= (see - 1 ) / 2 && x == h[c].getX()){ Hunt[a][b][c] = {h1.getY() - y}; flag += 1; }else{} } } } /* ハンターが獲物の視界内にいればフラグを立てる */ /* 1.3 壁があります */ /* 壁がない方向の箱を拾って壁がある方向の箱は控除します */ if(x == 1){ mode_dir[0] = 5; /* これ以上上に行けません(上への進路無効化)*/ }else if(y == 1){ mode_dir[1] = 5; /* これ以上左に行けません(左への進路無効化)*/ }else if(x == n){ mode_dir[2] = 5; /* これ以上下に行けません(下への進路無効化)*/ }else if(y == n){ mode_dir[3] = 5; /* これ以上右に行けません(右への進路無効化)*/ }else{}
/* 2.ハンターの位置が視界内・視界外の判定をします */ /* 2-1 ハンターが視界内にいる場合 */ /* 2-1.1 そのハンターから遠ざかるように動きます */ /* 2-2 視界にハンターがいない場合 */ /* ~視界にハンターがいなければランダムに動くもしくは停止します */ if(A == 0){ for(int g = 0;g <= 100;g++){ int modeA; int modeB; int modeC; modeA = (int)(Math.random() * 5 ); modeB = (int)(Math.random() * 5 ); modeC = mode_dir[modeA]; mode_dir[modeA] = mode_dir[modeB]; mode_dir[modeB] = modeC; /* mode_dirの内容をシャッフルすることで入れ替えます */ } } else if(A == 1){ for (int d = 0;d <= 2;d++){ if(Hunt[h[d].getX()][y][d] <= 1){ mode_dir[0]= 5; }else if(Hunt[x][h[d].getY()][d] <= 1){ mode_dir[1]= 5; }else if(Hunt[h[d].getX()][y][d] >= 1){ mode_dir[2]= 5; }else if(Hunt[x][h[d].getY()][d] >= 1){ mode_dir[3]= 5; }else{} }
/* ~ハンターがいない方向をランダムに選びそちらへ進みます*/ /* 2-1.2 視界にハンターがいますが近いハンターから遠ざかる方に動きます */ /* ~①ハンターが近いほうを避けてハンターが遠い方に動きます */ /* (現在保留) */ /* ~②ハンターが等距離ならば移動可能な方向に限定してランダムに動きます */ }else if(A >= 2 ){ for (int e = 0;e <= 2;e++){ if(Hunt[h[e].getX()][y][e] <= 2){ mode_dir[0] = 0; }else if(Hunt[x][h[e].getY()][e] <= 2){ mode_dir[1] = 1; }else if(Hunt[h[e].getX()][y][e] >= 2){ mode_dir[2] = 2; }else if(Hunt[x][h[e].getY()][e] >= 2){ mode_dir[3] = 3; }else { mode_dir[4] = 4; } } } /* ~③塞がれて動けなければその場にとどまります */ if(mode_dir[0] = 5 && mode_dir[1] = 5 && mode_dir[2] = 5 && mode_dir[3] = 5){ mode_dir[4] = 4; }
/* 3. 獲物の行動を決定します */ int p = 0; boolean breakflag = true; while(breakflag){ switch(mode_dir[p]){ case 0:/* 上に動く */ y -= 1; breakflag = false; break; case 1:/* 左に動く */ x -= 1; breakflag = false; break; case 2:/* 下に動く */ y += 1; breakflag = false; break; case 3:/* 右に動く */ x += 1; breakflag = false; break; case 4:/* その場にとどまる */ breakflag = false; break; case 5:/* 抽選しなおす */ p++; break; } } }
厳しいなぁこれは。 書いてるほうも大変だろうけど、 読むのもなかなか、厳しい。
928 :
デフォルトの名無しさん :01/12/08 13:34
escapeGame()にコードを詰め込みすぎだなぁ。 処理内容で分割して、関数化したほうが見通しがよくなるだろ。
929 :
デフォルトの名無しさん :01/12/08 13:37
ハンター情報をクラス化して欲しい・・・
int[] h = new int[5]ってこれはH >int[] h = new int[3]; >で初期化させたんですが >「int は間接参照できません」と出ます。 >※[]の2重括弧が原因? hはint型の配列じゃなくてHunter型の配列にしないと。 Hunter[] h = new Hunter[5] ね。
>>920-926 昨日はさすがにねてました。で
Hunt[a][b][c] = {h1.getY() - y};
みたいなときは、{}いらない。
Hunt[a][b][c] = h[c].getY() - y;
あと、今後の事考えるとここで、絶対値をとった方がいいと思う。
つまり、
Hunt[a][b][c] = Math.abs(h[c].getY() - y);
ね。
int A = 0; /* フラグの有無 */
このフラグはどこで書き換えることがあるの?
if(A == 0)
でかならずA = 0な気がするけど。
flag += 1;を
A += 1;
としたいってことでいいかな、そう思って読み進めます。
で、
else if(A == 1){
の中でやりたい事の意図がつかめない。
上下左右について、動いたときにハンターからみえなくなればいいと考えれば
if(Hunt[h[d].getX()][y][d] <= 1){
じゃなくて、
if(mode_dir[0] != 5 && Hunt[x][y - 1][d] != 0){
みたいに、つまり、「そちらの方向に動けて、その動いた先からハンターが見えるなら」
という条件に直すわけね。
/* 2-1.2 視界にハンターがいますが近いハンターから遠ざかる方に動きます */
は、だから、各方向に動いたとき、動いた先から見えるハンターのうち、一番近いやつ
との距離がもっともみじかくなるように動けばいいということで。書き直した方が
あと、このときにランダム要素をいれることも考えないと。
ということで、先は長いががんばってくれ(汗)
先は長いです… 考え方として、このクラスは 「獲物が1回逃げる時のためだけのプログラム」のつもりです。 これはハンターが1回動くためのプログラム、 そしてその2つを組み合わせてゲームとして動かすプログラムを合わせて動きます。 なので、ここでは1回の処理しか考えていません。 そしてそれらのデータは次の動作に対し生かすこととかはなく、 それを1回の動作(ターン)ごとに初期化させなければ行けないと思ってたんですよ。 そういう意味のフラグ初期化などでありハンターの位置情報クリアの意味の 1回ごとの A = 0 , Hunt[a][b][c]= 0 です。 で、1回ごとにハンターとの位置の相対関係を示した上で 自分の行動を決める、そういう指針です。 ですが、自分が全く講義に出なかったので…バカ学生してたツケが…
>>931 正方形の格子ブロックの中でフラグが1しかない、という時は
壁が2方向囲まれて(獲物が角に追い詰められてて)
ハンターが視界内において1人迫ってきたとしても
確実に「壁がない+ハンターがいない方向」が一つ存在して
そっち方向に逃げるのが一番合理的な逃げ方だと思うんですよ。
で、生き残ってる箱を選ぶというやり方にすりかえようとしたのが
自分が考えたやり方です。
そんで壁も方向も全て囲まれてる!という場合がA(フラグ)=2以上になる場合
だと思って作ったんですが…
少し煮詰める必要ありそうです。それよりもまずデバッグを取らないと…
※
Hunter[] h = new Hunter[3];
がシンボルを解釈処理できない、と怒られてしまいます。なぜでしょうか?
友達の Hunter h1 = (云々)というプログラムと組み合わせると
解決する問題なんでしょうか?
>>933 class Hunterが無いんじゃないの?
定義してないクラスを使うことはできないよ。
おれなら、まずこう考える メソッド 1.獲物のコンストラクション 2.フェーズ処理のための初期化 3.ハンターの位置チェック(相対位置) 4.獲物移動方向決定 5.移動可能or不可判定(不可ならば4からやり直し、移動方向がなくなったらアボーン) 6.獲物移動 盤面情報は別クラスにしたいところだけど、この課題程度なら獲物クラスに持たせ てもいいかなとおもう。
ちょっと飲んできたので、頭がほとんど回っていないけど、レスだけ。
>そんで壁も方向も全て囲まれてる!という場合がA(フラグ)=2以上になる場合
>だと思って作ったんですが…
壁がなくても、ハンターが二方向から来たら、A=2になるますよね?
>Hunter[] h = new Hunter[3];
>がシンボルを解釈処理できない、と怒られてしまいます。なぜでしょうか?
>友達の Hunter h1 = (云々)というプログラムと組み合わせると
>解決する問題なんでしょうか?
>>934 で書いてくれていますが、その通りです。
ダミーのHUNTERクラスを作ってデバッグするのがよいのかな。
>>935 おそらく、仕様を決められて獲物のクラスを作っていると思うから、
メソッドも指定されているんじゃないかな、と邪推してみる。
937 :
デフォルトの名無しさん :01/12/09 10:52
宿題の途中ですが業務連絡です。 このスレ住人は次のスレのためのイメージキャラクタのAAを吟味して ください。野郎は却下です。 あまり大きいとうざいので10行前後に収まるものをよろしくお願いします。 言ってることが解らない人は前スレの麻衣を参照してください。 以上、業務連絡でした。
>>935 はい、そのとおりです。
以下渡された仕様です
↓
import java.util.*;
public class Game{
private int N; /* nxn の正方格子の定義 */
private int x,y; /* 正方格子のX座標 Y座標 */
private int see; /* 見える範囲のマス数 */
Random r = new Random();
/** Game クラスのコンストラクター
@param i 獲物のx座標
@param j 獲物のy座標
*/
public Game(int i,int j){
x = i;
y = j;
}
/** nxn の正方格子数を設定します
@param n nxn の正方格子数
*/
public void setN(int n){
N = n;
}
/** 正方格子を設定します。
@param x 正方格子のX方向
@param y 正方格子のY方向
*/
public void setXY(int i,int j){
x = i;
y = j;
}
(続く)
(続き) /** 見える範囲のマス数を設定します @param see 見える範囲のマス数 */ public void setSee(int s){ see = s; } /** X座標を取得します @return X座標 */ public int getX(){ return x; } /** Y座標を取得します @return Y座標 */ public int getY(){ return y; } /** 獲物の行動を決定します @param h1,h2,h3 ハンターの位置情報 */ public void escapeGame(Hunter h1,Hunter h2,Hunter h3){ } }
>>934 >>936 ダミーのハンタークラスを作れ、ということで
いろいろやってみたんですが
書き方がまずいのかエラーがダラダラ出てきます…。
多分自分がクラスの考え方が間違っている所に原因があると
思われますです…。
941 :
デフォルトの名無しさん :01/12/09 13:36
そろそろ950を超えるくらいまでには新スレを用意せねば。 おれは立たないので(勃起障害ではないが)誰か。
942 :
デフォルトの名無しさん :01/12/09 13:42
お兄ちゃんの宿題ぼくが答えるよ♪
麻衣は嫁に行きました。
>>940 バグが取れなくて困ったときは、一度クラスをスケルトン状態(メソッド内からっぽ)
にしてビルド。
それでうまくいったら、少しづつコードを入れていって、どこでエラーが出るか調べ
てみる、というのも一つの手だ。
まず空っぽの、Hunter,Gameでビルドしてみたら?
>>935 じゃないがその課題、メソッド自分で追加しちゃダメなの?
それって激しくアホな課題だとおもうな。
つーかそんなわけ無いと思うがなぁ。
「解りやすいように構造化しました」
っていわれて怒る教官はいないだろ。
949 :
デフォルトの名無しさん :01/12/09 21:49
「お姉ちゃんの宿題、ペークが答えるよ」キボン。
>ほほう。何か狙ってたけどうまくいかなかったので、「言い逃れ」だという >ことにしてしまうことにしたのですね:) はぁ?(w 誰かに狙われてるのかね? それともただの被害妄想かね?
デバッグは一応終わりました… ダミークラスつくるのはちょっと方針上あきらめました。 コンパイルが通ったやつです。 ↓ import java.util.*; public class Game{ private int N; /* nxn の正方格子の定義 */ private int x,y; /* 正方格子のX座標 Y座標 */ private int see; /* 見える範囲のマス数 */ /* 5方向の箱を作ります */ int[] mode_dir=new int[5]; /* ハンターを監視するための箱を作ります */ int[][][] Hunt=new int[N+2][N+2][3]; Hunter[] h=new Hunter[3];
もうかれこれ2時間くらい迷ってます・・・ 問1. 0から100万までの自然数をrand関数を使って50万個作りファイルに保存せよ。 (これはできた) 問2. 問1で作ったファイルを、選択ソート、挿入ソート、バブルソートをそれぞれ使って ソートしてソート結果をファイルに出力せよ。 timeコマンドで実行時間を計測すること。 問2なんですが、ソートのやつは全部できたんですが、timeコマンドで実行時間を 計測する方法がわかりません。 使い方 time a.exe としか説明がありません。
↑ ちなみにC++を使ってます
955 :
デフォルトの名無しさん :01/12/11 16:43
>>953 言語名を書けよ。
Cなら、
/* CLOCK.C: プログラムの実行時間を入力するように要求してから、
* その時間の間、経過時間の表示を継続します。
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void sleep( clock_t wait );
void main( void )
{
long i = 600000L;
clock_t start, finish;
double duration;
/* 指定された時間の遅延を設ける */
printf( "3 秒の遅延\n" );
sleep( (clock_t)3 * CLOCKS_PER_SEC );
printf( "終了!\n" );
/* イベントの持続時間の計測 */
printf( "%ld 回のループの時間は ", i );
start = clock();
while( i-- )
;
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "%2.1f 秒です。\n", duration );
}
/* 指定されたミリ秒間だけ待機する */
void sleep( clock_t wait )
{
clock_t goal;
goal = wait + clock();
while( goal > clock() )
;
}
・・・・だそうだ。MSDNライブラリより抜粋。
>>953 timeで時間計測で悩むなよ・・・
やってみりゃわかるべ。
timeはa.exeの実行時間を測ってくれるだけだよ。
>>956 例えば僕のファイル名はkadai1.exeです。
time kadai1.exeと入力するんですよね?
それをどこに入力するのかわからないんですが・・・
>>957 kadai1.exe を実行してたところ
学校だと標準でtimeコマンドが用意されてたりして。
960 :
デフォルトの名無しさん :01/12/11 17:34
>>958 プログラムが終了してしまってPress any key to continueと出るので
ボタン押したら消えてしまいます。
scanfを使うのですか?
962 :
デフォルトの名無しさん :01/12/11 17:37
965 :
デフォルトの名無しさん :01/12/11 17:46
1000get
#include <stdio.h> #include <math.h> main() { int i,j,k,m,n,na; float a[10][10],b[10],x[10],e,eps,dd,gb,gg,gx,es; scanf("%d",&n); for(m=1;m<=n;m++){ for(k=1;k<=n;k++){ scanf("%f",&a[m][k]); } scanf("%f",&b[m]); } gb=1;gx=1;es=1; na=400;eps=1.0e-7; for(m=1;m<=n;m++){ if(a[m][m]!=0){ x[m]=b[m]/a[m][m]; } else{ gb=0; } } for(i=1;i<=n;i++){ dd=0; for(j=1;j<=n;j++){ if(j!=i){ dd=dd+fabs(a[i][j]); } else{ } } if(fabs(a[i][i])>dd){ } else{ gx=0; } } if((gb==0)||(gx==0)){ printf("条件を満たさない"); } else{ printf("収束状態\n"); k=0; printf("回数:%d\n",k); for(m=1;m<=n;m++){ printf("x[%d]=%f\n",m,x[m]); }
while(es>eps){ k=k+1; e=0; for(i=1;i<=n;i++){ gg=b[i]; for(j=1;j<=i-1;j++){ gg=gg-a[i][j]*x[j]; } for(j=j+1;j<=n;j++){ gg=gg-a[i][j]*x[j]; } gg=gg/a[i][i]; e=e+fabs(x[i]-gg); x[i]=gg; } printf("回数:%d\n",k); for(i=1;i<=n;i++){ printf("x[%d]=%f\n",i,x[i]); } printf("E=%g\n",e); if(k>=na){ es=0; } else{ es=e; } } if(e<eps){ printf("根\n"); for(m=1;m<=n;m++){ printf("x[%d]=%f\n",m,x[m]); } printf("回数:%d\n",k); printf("E=%g",e); } else{ printf("収束しない\n"); } } }
次の連立方程式の解をガウス・ザイデル法で解けという問題で
>>966-967 の
プログラムを作ったのですが〝条件を満たさない〟で終了してしまいます。
何がおかしいのでしょうか?
式
5*(x1)+7*(x2)+6*(x3)+5*(x4)=23
7*(x1)+10*(x2)+8*(x3)+7*(x4)=32
6*(x1)+8*(x2)+10*(x3)+9*(x4)=33
5*(x1)+7*(x2)+9*(x3)+10*(x4)=31
970 :
デフォルトの名無しさん :01/12/11 19:05
main関数の二つめのscanfでBusエラーがでます。 よろしくお願いします。 #include<stdio.h> int *key; int *array[10]; int linear_search(int key) { int i,n; n=sizeof(array)/sizeof(int); for(i=0;i<n;i++){ if(*array[i]==key){ return i; } } return -1; } main() { int i,n; for(i=0;i<10;i++){ printf("input data>"); scanf("%d",&array[i]); } printf("input key>"); scanf("%d",&key); printf("%d",*array[1]); n=linear_search(*key); printf("index=%d\n",n); }
>>970 int *key;
int *array[10];
を
int key;
int array[10];
に
で、
printf("%d",*array[1]);
n=linear_search(*key);
を
printf("%d",array[1]);
n=linear_search(key);
に
In article
>>970 , デフォルトの名無しさん/970 wrote:
> main関数の二つめのscanfでBusエラーがでます。
そんなもん使うからだ。
>>968 入力を間違えてるんじゃない?
if((gb==0)||(gx==0)){
の前で、printfでa[][]の内容を全て表示させてみたら?
じゃあ、mainのすぐあとに、 key = malloc( sizeof( int ) ); for(i=0; i<(sizeof( array)/sizeof(int*)); i++) array[i] = malloc( sizeof( int ) ); とか入れて、 scanf("%d",&array[i]); とかを scanf("%d",array[i]); とかにすれば~? #劣化したJAVAみたいな感じやな。
>>975 えーっとね、じゃあポインタとかの意味はわかってる?
だったら、まずポインタっていうのは場所を表しているのはわかる?
その指してる場所をintならint型のスペースとして保存しないと駄目。
これだと、ポインタ定義してるだけだから、そのポインタ自身はどこも
指してない。
だから、このプログラムは、scanfをする前に各ポインタ変数型ごとに
int型のスペースを作成して、その場所を指すようにする。で、その後、
scanf("%d",&array[i]);とかはscanf("%d",array[i]);みたいな形で読み
にいくわけ。
あえて正解書かないので、がんばってください。
ちょっと
こまってるんですけど・・ #include<stdio.h> main() { int a[100],i=0,x,s=0 ; while(scanf("%d",a)!=EOF){ i++; } for(x=0;x<i;x++){ scanf("%d",&a[x]); } for(x=0;x<i;x++){ printf("%d\n",a[x]); s+=a[x]; } printf("%d\n",s); } 配列要素の合計もとめたいんですけど 自分で作った上の奴では合計がでなくて困っています。 どなたか助けてもらえませんか。
>>979 うーん・・・、
どういう感じで入力を与えたいのかな?
何か入力で失敗している気するね、そのコード見てる限り。
でも、合計が出ないっていうことは、各要素についてはちゃんと出力
できてるのかな?
while(scanf("%d",a)!=EOF){ i++; } がおかしいんでない? while(scanf("%d",&a[i])!=EOF){ i++; } でいけるんかなあ。確認とれる状況じゃないのでごめん。
ああぁあできましたぁ!! そのとおりやれば合計でました。 レイサン、ななしさんありがとうございます。(^0_0^) ばかなんでi に気づきませんでした・・・。
>>982 解決したようなので、蛇足かもしれないけど
while (scanf("%d",&a[i])!=EOF){
i++;
}
と
for(x=0;x<i;x++){
scanf("%d",&a[x]);
}
は、どちらか一方書いときゃいいんじゃない?
while ... の方は配列のマックスを越える可能性が
ある一方、for の方は scanf の返り値をチェックし
てないので、どっちを残すかは迷うとこだけど(w
ああ、なんでループ二回も回してるのか分かった。 ひょっとして最初のループは要素数を数えてるの?
あぁ。そこなんですけど実は・・ そのあとにも課題があってその配列をソートする関数をつくらないと だめなんですよ。だから一応i で 要素数はわかるかなとおもって。 またそのへんが不安なんですが・・ どもありがとうございます。
つか、2個目のループの中のscanfは常に失敗するから意味なしだろ。 境界チェックを怠っていることと合わせて減点30
乗算のチューリングマシン教えてください。
>>987 なんか、ちょっと前にもマルチポストしてたね君。
わかんなくてさ。。。
In article
>>988 , デフォルトの名無しさん/sage/988 wrote:
>
>>987 > なんか、ちょっと前にもマルチポストしてたね君。
はつみみです。
992 :
デフォルトの名無しさん :01/12/12 00:56
ありがとうございます やっぱり2とか#使わないと無理ですかね?
>>990 加算はわかるので
それを繰り返すにはどうすればいいですか?
995 :
デフォルトの名無しさん :01/12/12 01:14
>やっぱり2とか#使わないと無理ですかね? そんなことか。区切り文字以外に 0-9もつかって十進掛け算にせよ。
なぜ、
>>988 の書きこみにクサカベがレスしてるんだ。
ちょっと考えればわかりますね:)
999
--------終了---------
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。