C/C++の宿題を片付けます 97代目

このエントリーをはてなブックマークに追加
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);}
ここまでやってみましたが二箇所にエラーが発生しました、間違えたところ教えてください。




954デフォルトの名無しさん:2007/10/23(火) 20:41:36
#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);}
955デフォルトの名無しさん:2007/10/23(火) 20:54:08
956デフォルトの名無しさん:2007/10/23(火) 20:56:09
>>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;
}
957デフォルトの名無しさん:2007/10/23(火) 20:59:02
>>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;
}
958デフォルトの名無しさん:2007/10/23(火) 21:06:13
>>953
最近のコンパイラならエラーメッセージと行が出るからそれ晒せ。
あと、いくら行が多いって怒られたからって無理にツメツメで書くぐらいならうpロダにtxtファイルで上げろ。
959955:2007/10/23(火) 21:08:26
>>944
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5123.txt

>>955は題意を満たしていなかった(各クラスのメンバ変数の入出力関数が
おかしな事になっていた)ので作り直した。
960952: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さんありがとうございました。

961デフォルトの名無しさん:2007/10/23(火) 21:26:20
>>953
Win98SE PenV1G BCC32 5.5.1で動作確認した。
自分で間違い探し…。ほんと基本的なとこだよ

訂正前:整形のみ
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5125.txt
訂正後
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5126.txt
962デフォルトの名無しさん:2007/10/23(火) 21:32:54
>>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;
}
963デフォルトの名無しさん:2007/10/23(火) 21:38:52
964952:2007/10/23(火) 21:49:29
962&963さん助かりました。

自分が作ったのと比べて見てみます。

ありがとうございました。
965961:2007/10/23(火) 21:58:55
>>953
そういやエラー2つって書いてあったが、エラー1警告1なんじゃ?
もしエラーが2つなら全角スペースがあったはず…
自分は整形時に置換しちゃったから…
966956: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;
に修正しといて
967デフォルトの名無しさん:2007/10/23(火) 22:09:19
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);
968デフォルトの名無しさん:2007/10/23(火) 22:09:50
 }
 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);
969デフォルトの名無しさん:2007/10/23(火) 22:11:31
擬似的にネットワークを作って
ある条件のネットワークに沿ったら
do〜whileから抜け出すようにしたいのですが、
うまくループから抜け出してくれません

xcntってやつの条件なら上手く抜けることは確認できました
&&dcntってやつを付けたら、さっさと抜けてしまいます

なにか修正点があるなら御願いします
970デフォルトの名無しさん:2007/10/23(火) 22:15:07
>>969
プログラム長いんだったら 1 のアップローダー使おうよ
971デフォルトの名無しさん:2007/10/23(火) 22:23:48
dcntの値を表示させればいいだけじゃね?
972sage: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] なし
973デフォルトの名無しさん:2007/10/23(火) 22:32:02
>>969
dcnt++でしか弄ってないためforが何回まわるかで値が決まりますが
i<jの条件からおおよそn回まわるとn*n/2回インクリメントされます。
dcnt>=3800 && dcnt<=4200 から n の範囲を逆算すると
おおよそ 88<=n<=91 …明らかにきnの範囲厳しくないか?
結論 dcnt++ の場所間違えてるか dcnt のチェック値がおかしい と思う
974デフォルトの名無しさん:2007/10/23(火) 22:42:32
>>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?
エラーはでないか…ハハハ……
975デフォルトの名無しさん:2007/10/23(火) 22:44:48
>>972
問題文が意味不明。
976 ◆tbYrCgujzM :2007/10/23(火) 22:51:28
[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;
}

行数制限にかかるので、環境以下は次に…
977デフォルトの名無しさん:2007/10/23(火) 22:55:33
[3] 環境
 [3.1] OS: Windows Vista
 [3.2] コンパイラ名とバージョン: bcc
 [3.3] 言語: C++ …のはずです…
[4] 期限: 07年10月24日03:00まで
[5] その他の制限: 特になし
978デフォルトの名無しさん:2007/10/23(火) 22:58:35
>>976-977
明らかにC言語だよね

いや明らかでもないか
979デフォルトの名無しさん:2007/10/23(火) 23:00:25
担当教授がC++とばかり言っていたもので…
すいませんorz
980デフォルトの名無しさん:2007/10/23(火) 23:11:47
>>976
フローチャートもどき作成…てかtextでフローチャートかけるかメンドイ。
ソース横に流れを罫線で書いてprintfとかの処理あるところには□置いたから
これ見ながらWordなりExcelなりで書いてくれ

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5128.txt
981デフォルトの名無しさん:2007/10/23(火) 23:13:31
>>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デフォルトの名無しさん:2007/10/23(火) 23:14:35
そういや…ループのマークあったか…
983誰か次スレ立てて:2007/10/23(火) 23:21:10
あなたが解けないC言語/C++言語の宿題を片付けもらうスレッドです。気に入らない質問やその他や発言はスルーの方向で。

【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。

【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS: (Windows/Linux/等々)
 [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
 [3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)

【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
【C 関数検索 man on WWW】 http://www.linux.or.jp/JM/index.html
【過去ログ検索】        http://chomework.sakura.ne.jp/
【wiki】               http://www23.atwiki.jp/homework/

【前スレ】
C/C++の宿題を片付けます 97代目
http://pc11.2ch.net/test/read.cgi/tech/1191937213/
984デフォルトの名無しさん:2007/10/23(火) 23:21:34
>>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

あとは自分で頑張れ。

985デフォルトの名無しさん:2007/10/23(火) 23:22:46
>>984
7*8=57 orz
986デフォルトの名無しさん:2007/10/23(火) 23:41:48
>>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;
}
987デフォルトの名無しさん:2007/10/23(火) 23:49:29
988デフォルトの名無しさん:2007/10/23(火) 23:52:00
>>987
このスレタイは…
989987:2007/10/23(火) 23:52:05
ばかした…orz
立て直したほうがいい
990デフォルトの名無しさん:2007/10/24(水) 00:01:41
>>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デフォルトの名無しさん:2007/10/24(水) 00:05:34
[1] 授業単元:プログラミング実験
[2] 問題文(含コード&リンク):
  http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5129.txt
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 2007年10月14日22:00まで
[5] その他の制限: なし
992デフォルトの名無しさん:2007/10/24(水) 00:06:21
>>991
忘れてました・・・
どうかよろしくお願いします。
993デフォルトの名無しさん:2007/10/24(水) 00:14:04
>>990

しかもキーと値は別々の配列に格納。
その配列クラスも手作りで、何故か継承して使うように
書いてあるように見える…。
普通はprivateメンバじゃないかと自分は思う…
どうなの?>>972
994デフォルトの名無しさん:2007/10/24(水) 00:14:11
C++しばらくやってないから適当コードだけど、こんなんじゃないの?
class StringArray {}
class IntArray {}
class Map : public StringArray, IntArray {
 void append(string, int);
 int operator [] (int n);
 int operator [] (string&);
}
stringじゃなくてcharかな?
995デフォルトの名無しさん:2007/10/24(水) 00:16:19
>>991
たびたびすいません
[4] 期限: 2007年10月24日22:00まで
でした。
996デフォルトの名無しさん:2007/10/24(水) 00:17:31
>>994

課題文にでてくる関数名を見る限り
stringじゃなくてchar*を使って欲しそうに見える…。
標準C関数…C++なのに…まぁchar*で文字列扱う時はstlのalgorithmより楽だが
997デフォルトの名無しさん:2007/10/24(水) 00:29:20
埋めっか
998デフォルトの名無しさん:2007/10/24(水) 00:30:30
埋め
999デフォルトの名無しさん:2007/10/24(水) 00:31:30
ume
1000デフォルトの名無しさん:2007/10/24(水) 00:31:58
だが断る
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。