第7講 ポインタ
第6話 ポインタによる成績一覧表プログラム
ポインタによるプログラム例
#include<iostream> //入出力のために組み込む
#include <ctime> //time()を使用できるようにインクルード
#include <iomanip> //setprecisionを使えるように組み込む
using namespace std; //coutを使えるようにするために必要
void f();
int main() {
  f();
  return(0);
}
void f() {
  float h[3][10]; //平均点を収納する箱
  int ***a = (int ***)malloc(sizeof(int **) * 3); //配列と制御変数の定義
  int i, j, k; //for文の制御変数
  for (i = 0; i < 3; i++)a[i] = (int **)malloc(sizeof(int *) * 10);
  for (i = 0; i < 3; i++) {
    for (j = 0; j < 10; j++)a[i][j] = (int *)malloc(sizeof(int *) * 6);
  }
  srand((unsigned)time(NULL)); //乱数の系列決定するシード値を現在時刻から取得
  //ランダムデータ発生
  for (i = 0; i < 3; i++) {
    for (j = 0; j < 10; j++) {
      for (k = 0; k < 5; k++) {
        a[i][j][k] = rand() % 100 + 1;
      }
    }
  }
  //合計点と平均点の算出
  for (i = 0; i < 3; i++) {
    for (j = 0; j < 10; j++) {
      a[i][j][5] = 0; //0に初期化
      for (k = 0; k < 5; k++) {
        a[i][j][5] += a[i][j][k]; //合計点の算出
      }
      h[i][j] = (float)a[i][j][5] / 5; //平均点の算出
    }
  }
  //結果表示
  for (i = 0; i < 3; i++) {
    cout << i + 1 << "学期" << endl;
    cout << "出席番号 国語 社会 数学 理科 英語 合計 平均" << endl;
    for (j = 0; j < 10; j++) {
      if (j + 1<10)cout << "  " << j + 1 << "   "; else cout << " " << j + 1 << "   ";
      for (k = 0; k < 6; k++) {
        if (a[i][j][k]<10)cout << " " << a[i][j][k] << " ";
        if (a[i][j][k] >= 10 && a[i][j][k]<100)cout << " " << a[i][j][k] << " ";
        if (a[i][j][k] >= 100)cout << a[i][j][k] << " ";
      }
      cout<< fixed << setprecision(1) << h[i][j];
      cout << endl; //改行
    }
    cout << endl; //改行
  }
}


本当は、配列のところで触れるべき話題でしたが、
配列とポインタは、本質的に変わらないですから、
2次元配列と1次元配列の関係をここで考えてみることにしましょう。
2次元配列のイメージは
a[0][0],a[0][1],a[0][2],
a[1][0],a[1][1],a[1][2],
a[2][0],a[2][1],a[2][2],
a[3][0],a[3][1],a[3][2]
ですが、メモリの番地は1次元で並んでいますから、
実際上は
a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2],a[2][0],a[2][1],a[2][2],a[3][0],a[3][1],a[3][2]
と並んでいます。
つまり1次元です。
だとすれば、2次元や3次元でやれることは1次元でも出来るはずです。

そこで課題です。
コード
#include<iostream> //入出力のために組み込む
using namespace std; //coutを使えるようにするために必要
void f(); //2次元配列による処理
int main() {
  f();
  return(0);
}
void f() {
  int i, j;
  //2次元配列の用意
  int **a = (int **)malloc(sizeof(int *) * 7);
  for (i = 0; i < 7; i++)a[i] = (int *)malloc(sizeof(int) * 6);
  //データ作成
  for (i = 0; i < 7; i++) {
    for (j = 0; j < 6; j++) {
      a[i][j] = 6 * i + j + 1;
    }
  }
  //データの表示
  for (i = 0; i < 7; i++) {
    for (j = 0; j < 6; j++) {
      if(a[i][j]<10)cout<<" "<< a[i][j] <<" ";
      if (a[i][j]>=10)cout<< a[i][j] <<" ";
    }
    cout << endl; //改行
  }
}
の実行結果は
001
ですが、社員g()を採用して、
社員g()には、1次元配列で同じ処理をさせて、
002
を実現して下さい。
前半が関数f()による仕事で、後半が関数g()による仕事です。

第5話へ   第7話へ

002

初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ