952 :
デフォルトの名無しさん :2007/10/23(火) 20:25:38
[1] 授業単元:プログラミング2 [2] 問題文(含コード&リンク): (1)モンテカルロ法を用いて、y=x^2,y=0,x=1で囲まれる領域の面積を求めよ。 (2)モンテカルロ法で、ある進行方向に人が1歩ずつ前進するとき、右、または左に それぞれ1/2の確率でよろけるものとする。 10歩前進した後、中央にいる確率を10回、100回、1000回…100000回の時、 それぞれ表示させる。 [3] 環境 [3.1] OS Windows XP [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限:10/24の12時 [5] その他の制限:(1)(2)において発生させる乱数の数を10、100、1000…100000 と増やし、それぞれの場合における結果を画面に表示させること。 よろしくお願いします
953 :
さとみ :2007/10/23(火) 20:32:45
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): Struct を使い、何か変数を定義して、そのメンバーにアクセスする簡単なプログラムを作ってください [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: [3.3] 言語: C言語 [4] 期限: 10/24[5] その他の制限:なし #include <stdio.h>#include <stdlib.h> struct node{ int data; struct node *next;}; struct node *head; void add_head(int x) { struct node *p; p = (struct node *)malloc(sizeof(struct node)); p->data = x; p->next = head; head = p;} void print_list(struct node *q) { struct node *p; printf("list\n"); for(p = q;p != NULL;p = p->next){ printf("%d\n"p->data); }} main(int argc, char *argv[]) { int i, val, n; head = NULL; n = atoi(argv[1]); for(i = 0;i < n; i++){ scanf("%d",&val); add_head(val); } print_list(head); return(0);} ここまでやってみましたが二箇所にエラーが発生しました、間違えたところ教えてください。
#include <stdio.h> #include <stdlib.h> #include <string.h> struct node{ int data; struct node *next;}; struct node *head; void add_head(int x) { struct node *p; p = (struct node *)malloc(sizeof(struct node)); p->data = x; p->next = head; head = p;} void print_list(struct node *q) { struct node *p; printf("list\n"); for(p = q;p != NULL;p = p->next){ printf("%d\n",p->data); }} main(int argc, char *argv[]) { int i, val, n; head = NULL; n = atoi(argv[1]); for(i = 0;i < n; i++){ scanf("%d",&val); add_head(val); } print_list(head); return(0);}
>>952 (2)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int i, j, k;
srand(time(NULL));
for(i=10; i<=100000; i*=10) {
int cnt = 0;
for(j=0; j<i; j++) {
int pos = 0;
for(k=0; k<10; k++) pos += rand() % 2 ? 1 : -1;
if(pos==0) cnt++;
}
printf("%6d回の試行で中央にいる確率は%f\n", i, (double)cnt / i);
}
return 0;
}
>>952 (1)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
double f(double x)
{ return x*x; };
int main(void){
double sum; unsigned long i;
srand((unsigned int)time(0));
for(i = 0;i<1000000;++i) sum += f((double)rand()/RAND_MAX);
printf("Answer:%f",sum/1000000);
return 0;
}
>>953 最近のコンパイラならエラーメッセージと行が出るからそれ晒せ。
あと、いくら行が多いって怒られたからって無理にツメツメで書くぐらいならうpロダにtxtファイルで上げろ。
959 :
955 :2007/10/23(火) 21:08:26
960 :
952 :2007/10/23(火) 21:17:07
追加問題がメールで届いてましたorz [1] 授業単元:プログラミング2 [2] 問題文(含コード&リンク): (追)モンテカルロ法を用いて、半径1の球の体積を求めよ。 [3] 環境 [3.1] OS Windows XP [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限:10/24の12時 [5] その他の制限;発生させる乱数の数を10、100、1000…100000 と増やし、それぞれの場合における結果を画面に表示させること。 度々すいませんがよろしくお願いします 956&957さんありがとうございました。
>>960 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10000000
int main(void)
{
double x, y, z;
int i, cnt = 0;
srand(time(NULL));
for(i=0; i<N; i++) {
x = (double)rand() / RAND_MAX;
y = (double)rand() / RAND_MAX;
z = (double)rand() / RAND_MAX;
if(x * x + y * y + z * z <= 1) cnt++;
}
printf("%f\n", (double)cnt / N * 8);
return 0;
}
964 :
952 :2007/10/23(火) 21:49:29
962&963さん助かりました。 自分が作ったのと比べて見てみます。 ありがとうございました。
965 :
961 :2007/10/23(火) 21:58:55
>>953 そういやエラー2つって書いてあったが、エラー1警告1なんじゃ?
もしエラーが2つなら全角スペースがあったはず…
自分は整形時に置換しちゃったから…
966 :
956 :2007/10/23(火) 22:02:38
>>952 for(k=0; k<10; k++) pos += rand() % 2 ? 1 : -1;
だと、環境にもよるだろうけど、予想以上に実際の確率よりずれるな。
for(k=0; k<10; k++) pos += (int)(rand() / (RAND_MAX + 1.0) * 2) ? 1 : -1;
に修正しといて
do{ for(i=0;i<n;i++){ do{ ran=rand(); ranm=RAND_MAX; x=ran/ranm; }while(x==1.0); node1[i]=(double)(-log(1.0-x)/lambda1); } for(i=0;i<n;i++){ do{ ran=rand(); ranm=RAND_MAX; x=ran/ranm; }while(x==1.0); node2[i]=(double)(-log(1.0-x)/lambda2);
} xcnt=0; dcnt=0; for(i=0;i<n;i++){ cnt[i]=0; for(j=0;j<n;j++){ if(i!=j){ if((node1[i]+node2[j]>=theta && node1[j]+node2[i]>=theta) && i<j){ cnt[i]++; dcnt++; } } } if(cnt[i]==0){ xcnt++; } } }while(xcnt>10 && dcnt>=3800 && dcnt<=4200);
擬似的にネットワークを作って ある条件のネットワークに沿ったら do〜whileから抜け出すようにしたいのですが、 うまくループから抜け出してくれません xcntってやつの条件なら上手く抜けることは確認できました &&dcntってやつを付けたら、さっさと抜けてしまいます なにか修正点があるなら御願いします
>>969 プログラム長いんだったら 1 のアップローダー使おうよ
dcntの値を表示させればいいだけじゃね?
972 :
sage :2007/10/23(火) 22:27:23
お願いします。。 [1] 授業単元:C++プログラミング [2] 問題文(含コード&リンク): 文字列配列クラスと int 型配列クラスを定義し、2 つのクラスを基本クラスとして新たなクラスを定義してください。 定義したクラスに実装すべきメンバー関数は以下のとおりです。 文字列と数値をペアで登録できる。 数値 n (n>=0) を添字として、int 型配列の n 番目の要素を返す。 文字列 s を添字として、int 型配列の n 番目の要素を返す。 n は文字列配列で s に等しい要素のインデックスとする。 ただし、配列のサイズは 10 固定とし、それ以上の要素は登録できないものとします。 また、文字列の比較に strcmp()、文字列の複製に strdup()、文字列の解放に free() を使って構いません。 エラー処理は特に規定しません。 [3] 環境 [3.1] OS Windows XP [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C++ [4] 期限:10/24の12時 [5] なし
>>969 dcnt++でしか弄ってないためforが何回まわるかで値が決まりますが
i<jの条件からおおよそn回まわるとn*n/2回インクリメントされます。
dcnt>=3800 && dcnt<=4200 から n の範囲を逆算すると
おおよそ 88<=n<=91 …明らかにきnの範囲厳しくないか?
結論 dcnt++ の場所間違えてるか dcnt のチェック値がおかしい と思う
>>969 …あれこのソース、コンパイラ通るの?
>do{
> ran=rand();
> ranm=RAND_MAX;
> x=ran/ranm;
> }while(x==1.0);
>node1[i]=(double)(-log(1.0-x)/lambda1);
x==1.0だからnode1[i]、node2[i]って全部NaN?
エラーはでないか…ハハハ……
[1]授業単元:プログラミング1 [2]問題文:以下のプログラムをのフローチャートを書け。 また、動作を説明し、変数i, j, kの値をトレースせよ。 #include <stdio.h> int problem3(void) { int i,j,k; int a[3][4]={{1,2,3,4}, {5,6,7,8}, {9,0,1,2}}; int b[4][3]={{1,2,3}, {4,5,6}, {7,8,9}, {0,1,2}}; int c[3][3]; for(i=0;i<3;i++){ for(j=0;j<3;j++){ c[i][j]=0; for(k=0;k<4;k++){ c[i][j]+=a[i][k]*b[k][j]; } } } /* output array */ for(i=0;i<3;i++){ printf("c[%d][0,1,2]:(",i); for(j=0;j<3;j++){ printf("%d,", c[i][j]); } printf(")\n"); } return 0; } 行数制限にかかるので、環境以下は次に…
[3] 環境 [3.1] OS: Windows Vista [3.2] コンパイラ名とバージョン: bcc [3.3] 言語: C++ …のはずです… [4] 期限: 07年10月24日03:00まで [5] その他の制限: 特になし
担当教授がC++とばかり言っていたもので… すいませんorz
>>976 (i=0〜2まで繰り返す)
(j=0〜2まで繰り返す)
c[i][j] = 0.0 で 初期化
(k=0〜3まで繰り返す)
c[i][j]+=a[i][k] * b[k][j]
(kのループ終了)
(jのループ終了)
(iのループ終了)
(i=0〜3まで繰り返す)
(j=0〜3まで繰り返す)
c[i][j]を表示
(jのループ終了)
(iのループ終了)
図はさすがにかけないが
______________
/i=0〜2 \
| ________________| ループはこうやって書く。んだっけ?
そういや…ループのマークあったか…
>>982 まあ、授業でやってない可能性もあるわけだがw
んで、このプログラムは要するに行列の掛け算をしている。
i j k c[i][j]
0 0 0 +1*1
0 0 1 +2*4
0 0 2 +3*7
0 0 3 +4*0 # c[0][0] = 1+8+21+0 = 30
0 1 0 +5*2
0 1 1 +6*5
0 1 2 +7*8
0 1 3 +8*1 # c[0][1] = 10+30+57+8 = 105
あとは自分で頑張れ。
>>922 時間過ぎたけど。#includeの改行は自分で展開してちょうだい。
#include <algorithm> #include <cctype> #include <fstream> #include <iostream> #include <iterator> #include <set> #include <string>
std::set<std::string> words;
int in_length(const std::string& x, const std::string& y) {return x.length() < y.length();}
int findword(const std::string& fname, char top, std::string& longest) {
std::ifstream input(fname.c_str());
const char delimiters[] = " \t,.;:\"?!()[]-";
std::string line;
while (getline(input, line)) {
std::string::size_type start_index = line.find_first_not_of(delimiters);
while (start_index != std::string::npos) {
std::string::size_type end_index = line.find_first_of(delimiters, start_index);
if (end_index == std::string::npos) end_index = line.length();
if (end_index - start_index != 0 && std::tolower(line[start_index]) == std::tolower(top)) words.insert(line.substr(start_index, end_index - start_index));
start_index = line.find_first_not_of(delimiters, end_index);
}
}
longest = *std::max_element(words.begin(), words.end(), in_length);
return words.size();
}
int main() {
std::string fname, longest; int count; char top;
std::cout << "Input file-->"; std::cin >> fname; std::cout << "first letter-->"; std::cin >> top;
count = findword(fname, top, longest);
std::copy(words.begin(), words.end(), std::ostream_iterator<std::string>(std::cout, " "));
std::cout<< "\n" << count << " words found and longest word --> " << longest << std::endl;
}
989 :
987 :2007/10/23(火) 23:52:05
ばかした…orz 立て直したほうがいい
>>972 3回読み直したが理解できない
多分、文章で書いてくれても分からないので動作例を書いて下さい
#超解釈すると劣化 map を実装せよってことかな
class homework{
private:
int number[10];
string key[10];
int membernum;
public:
int add(string key, int number);
int get(int number);
int get(string key);
};
>>991 忘れてました・・・
どうかよろしくお願いします。
993 :
デフォルトの名無しさん :2007/10/24(水) 00:14:04
>>990 しかもキーと値は別々の配列に格納。
その配列クラスも手作りで、何故か継承して使うように
書いてあるように見える…。
普通はprivateメンバじゃないかと自分は思う…
どうなの?
>>972
C++しばらくやってないから適当コードだけど、こんなんじゃないの? class StringArray {} class IntArray {} class Map : public StringArray, IntArray { void append(string, int); int operator [] (int n); int operator [] (string&); } stringじゃなくてcharかな?
>>991 たびたびすいません
[4] 期限: 2007年10月24日22:00まで
でした。
996 :
デフォルトの名無しさん :2007/10/24(水) 00:17:31
>>994 課題文にでてくる関数名を見る限り
stringじゃなくてchar*を使って欲しそうに見える…。
標準C関数…C++なのに…まぁchar*で文字列扱う時はstlのalgorithmより楽だが
埋めっか
埋め
ume
だが断る
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。