• 締切済み

配列とポインタでの書き直し(c++)その1

2つのサイコロの合計と、回数、確率、エラーを配列を使って表示する課題に取り組んでいます。配列を使っては何とかできましたが、課題では配列とポインターの両方を使ってこれを書かなくてはいけません。ポインターに関しては本を読んでも実際応用できないので困っています。ポインターについてわかる方、ヒントください。  ちょっと長いので2つに分けて掲示します。(みにくくてごめんなさい!) #include<>....省略 int rollDice(void); double getError(double, int, double []); int main(void) { int sum[11]; double error[11]; int throws; double probability; error[0] = 1.0/36.0; error[1] = 2.0/36.0; error[2] = 3.0/36.0; error[3] = 4.0/36.0; error[4] = 5.0/36.0; error[5] = 6.0/36.0; error[6] = 5.0/36.0; error[7] = 4.0/36.0; error[8] = 3.0/36.0; error[9] = 2.0/36.0; error[10] = 1.0/36.0; srand((unsigned) time(NULL)); for (int i=0; i<11; i++) sum[i] = 0; cout << "\n何回サイコロを転がしますか?: "; cin >> throws; for (int j= 0; j<throws; j++) { int roll = rollDice(); switch(roll) { case 2: sum[0]++; break; case 3: sum[1]++; break; case 4: sum[2]++; break; case 5: sum[3]++; break; case 6: sum[4]++; break; case 7: sum[5]++; break; case 8: sum[6]++; break; case 9: sum[7]++; break; case 10: sum[8]++; break; case 11: sum[9]++; break; case 12: sum[10]++; break; } } 配列とポインタでの書き直し(c++)その2 につづく

  • lilno
  • お礼率22% (6/27)

みんなの回答

回答No.1

管理者より: 続きの質問があるのでそちらをご参照下さい

参考URL:
http://www.okweb.ne.jp/kotaeru.php3?q=243541

関連するQ&A

  • 配列とポインタでの書き直しその2

    配列とポインタでの書き直し(c++)その1 のつづき cout << endl; cout << setw(5) << "Sum" << setw(12) << "Number" << setw(14) << "Probability" << setw(10) << "Error" << endl; cout << "-----------------------------------------" << endl << endl; cout << setiosflags(ios::fixed | ios::showpoint); for (int k = 0; k <= 10; k++) { probability = static_cast<double>(sum[k])/throws; cout << setw(4) << k+2 << setw(12) << sum[k] << setprecision(6) << setw(14) << probability << setprecision(2) << setw(11) << getError(probability, k, error) << endl; } return 0; } // Roll two dice. int rollDice() { int dice1, dice2; dice1 = rand()%6 +1; dice2 = rand()%6 +1; return (dice1 + dice2); } // Example: for error dice 12 // // prob = sum[10] / throws, // // // |prob - e[10]| // error = ----------------- x 100 // e[10] // double getError(double p, int i, double e[]) { return ((fabs(p - e[i])/e[i])*100); } 関連URL: http://www.okweb.ne.jp/kotaeru.php3?q=243537

  • 2次元配列のポインタ

    整数型行2列2の2次元配列の[1][0]は、ポインタでは3になるとおもっているのですが、ちがったでしょうか? 下記のソースでエラーが出ていて困っています。 void main() { int array[2][2] = { { 9, 9 }, { 9, 9 } }; int num=2, j,i; *(array + 3) = 0; for (i = 0; i < num; i++) { for (j = 0; j < num; j++) { printf("%d", array[i][j]); } puts(""); } } 99 09 と表示させたいのですが、どこに間違いがあるのでしょうか?

  • c言語 配列

    関数の中で複数の値を配列で返したいのですが,どうすればいいでしょう? 配列を関数に渡す時にはアドレスが渡されるので,ポインタと同様関数内で値を変えればmain関数の値も変わるのではないかと思ったのですが,上手くいきません. 知りたいのは,main関数の中の配列(できれば2次元配列)の値を他の関数から値を変更する方法です.下のプログラムはためしに書いてみたものです.質問を理解するうえで役立てば幸いです. #include<stdio.h> void func(double aaa[][3] ,double bbb[]); void main(void){ double array_a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; double array_b[3]={0}; func(array_a,array_b); } void func(double aaa[][3] ,double bbb[]) { int i,j; for (i=0;i<3;i++) { for (j=0;j<3;j++) { bbb[i]=bbb[i]+aaa[i][j]; } } }

  • // c のポインタと配列について質問です。

    // c のポインタと配列について質問です。 //次のようなプログラムがあります。 /* main.c */ #include <stdio.h> int main(void) { int array[5] = { 0, 1, 2, 3, 4 }; int i; int* p = &array[0]; for( i = 0; i < 5; ++i ){ printf( "%d ", p[i] ); } puts(""); return 0; } /* これをデバッグすると、定義されていないアドレスの配列 p[i] のため、エラーになるような気がしますが、実際には 1 2 3 4 5 と出力されます。 ここで質問ですが、 p[i] とは何を指しているのですか? できればc初心者の中学生でも分かるように教えてください。 p.s. 余計な御世話かもしれませんが、これをこのままコピペすれば、デバッグできます。 */

  • C言語のポインタ配列について

    ポインタ配列を使って、各組(横一列が1組)の最高点と平均点、学年平均を表示するプログラムを考え中です。 各組の最高点を求める部分をどのように書けばいいのか迷ってます。 下記のプログラムでマズイ部分などありましたら教えていだたきたいです。 #include <stdio.h> int main(void) {   int ten1[] = { 52, 38, 79, 89, 57, 71, 90, -999};   int ten2[] = { 67, 89, 56, 45, 91, -999};   int ten3[] = { 89, 34, 67, 65, 67, 55, -999};   int* p[3];   int k;   int i;   int sum;   int total;   float ave;   int nin = 18;      p[0] = ten1;   p[1] = ten2;   p[2] = ten3;      total = 0;   for (k = 0; k < 3; k++)   {     i = 0;     sum = 0;     while (p[k][i] != -1)     {       sum += p[k][i];       i++;     }     ave = ave = (float)total / 3;     total += sum;     printf("平均点%3.1f\n", ave);   }   ave = (float)total / nin;   printf("学年平均点:%3.1f\n",ave);      return 0; }

  • ポインタ配列

    配列をポインタでとって、配列要素を足していこうと思ったのですが、 #include <stdio.h> int main (void) { int p[11]={11,23,43,66,54,67,51,88,22,43,-1}; int *e=p; int x=0; int i=0; while( *e!=-1 ) { x + = ( * (e+i) ); i++; } printf("%d\n",x); return 0; } x = ( * ( e+i ) ); ↑この部分がなぜだめなのか理解できません どなたか教えてくださるとありがたいです

  • できているとは、思うのですが。ポインタの配列を

    コンパイラではちゃんと動いてます。 1 2 3 0 1 2 3 という具合です。 気になるのは、printarrayの部分が正しいのか、ちょっと悩んでいます 問題としては main関数では0の値を読み込むまで最大99(MAX-1)個の値を配列 xに読み込んでいる。引数のポインタからの値を、値が0になるまで すべて1行に1つづつ画面に出力する関数printarray()を作成し、 プログラムを完成せよ。 引数はアドレスとして受け取る事。(配列としてでなく) フォーマットは、 "%d¥n" とする。(余計な出力はしない事。) (0は出力しない。) main内部を変更してはならない。 以下がソースです。 ご指摘よろしくお願いします。 #include <stdio.h> #define MAX 5 void printarray(int *); int main() { int x[MAX], i; int *p; x[MAX-1] = 0; for (i = 0, p = x; i < MAX-1; ++i, ++p) { scanf("%d", p); if (*p == 0) { break; } } printarray(x); return 0; } void printarray(int *a) { int i,*p; for(i = 0, p = a; i < MAX-1; ++i,++p) { if(*p == 0){ // continue; break; }else{ printf("%d\n", *(a+i)); } } }

  • C++で,配列に計算した値を入れたいです.

    C++で疑似乱数を発生させてサイコロをつくったのですが, サイコロを5回転がしたときのそれぞれの値をソートしたいと思い,配列に入れれば簡単だと考えてとりあえず配列に入れるプログラムを書いてみました. しかし,int array[i] = Dice(); のところでエラーが出てしまいます. ローベルのC++入門講座という本を使って独学で勉強している初心者なため,配列の使い方がいまいちよくわかりません. ご教授よろしくお願いします. 以下ソースコード #include <iostream> #include <cstdlib> #include <ctime> using namespace std; void InitRand(){ srand((unsigned int) time (NULL)); } int Dice(){ return rand() % 6 + 1; } int main(void){ int n = 0; //nはサイコロを転がす回数 cout <<"サイコロを何回転がしますか?" << flush; cin >> n; cout << "回転がします" << endl; InitRand(); for(int i = 0; i < n; ++i){ cout << Dice() << endl; int array[i] = Dice(); //エラーが発生する.i回目のサイコロの値をi番目の配列に入れたい. } }

  • 配列ポインタの関数中のメモリ領域

    C初心者です。 関数中で配列ポインタを宣言する場合についての質問です。 たとえばDouble型の2次元のローカルな配列ポインタを用いる場合、 その配列要素数が100である場合は void 関数名(引数1,引数2,...){ int i; double *a[2]; for(i=0;i<2;i++){ a[i] = (double*)malloc(100*sizeof(double)); } for(i=0;i<2;i++){ free(a[i]); } } またこの値を引数1とする場合、引数1をoutとすると void 関数名(double *out,....) とし、 for(i=0;i<2;i++){ out[i] = a[i]; } とすればよいのでしょうか? もしこれがあっているとすると、つぎのような現象で困っています。 配列要素数を50000個ぐらいとし、複数の関数で、同様に mallocを用いて、配列ポインタのローカルでメモリ領域を確保しようとした場合、コンパイルは成功するのですが、その後実行すると、エラーが発生したというメッセージとともにコマンドウィンドが強制終了します。 コンパイラはVisual C++ EXpress Edition 2008です。 データサイズを小さくすると、エラーは起きません。 malloc関数で確保するメモリサイズは、関数の入力引数で定義された変数を用いて計算しており、データサイズに応じて変更されます。 よろしくお願いいたします。

  • C言語の配列とポインタについて

    C言語の配列とポインタについてわからないことがあります。 以下のソース例は、10個の値の平均値を求めるプログラムです。 コメントを挟んだ部分が疑問点です。 【ソース例】 #include <stdio.h> int getaverage(int *data); int main(void) { int average,array[10] = {15,78,98,15,98,85,17,35,42,15}; average = getaverage(array); printf("%d\n",average); return 0; } int getaverage(int *data) { int i,average = 0; for (i = 0;i < 10;i++) { average += data[i]; /*ポインタ変数なのに? */ } return average / 10; } 【実行例】 49 このdata[i]はポインタ変数であり、 配列arrayの i 番目の要素であるarray[i]の"アドレス" が代入されているはずだと思うのですが、 なぜ通常の整数変数であるaverageと数値計算が出来、正しい結果が出たのでしょうか? あたかもdata[i]には、 array[i]の"アドレス"ではなく、 array[i]の"メモリの中身"が代入されているようです。 どういうことでしょうか? 回答よろしくお願いします。

専門家に質問してみよう