第五回レポート総評




動的メモリ管理を用いた配列サイズの決定

やや長いですが、プログラム本体の正解例を書いておきます。
#include <stdio.h>
#include <stdlib.h>

void swap_r(int &x, int &y);
void sort_func(int *x, int N);

int main(void){

  int SIZE;                  /********変更点********/
  int* x;                    /********変更点********/

  printf("SIZE=?");          /********変更点********/
  scanf("%d",&SIZE);         /********変更点********/

  x = new int[SIZE];         /********変更点********/

  srand(1);
  for(int i=0 ; i<SIZE ; i++){
    x[i] = rand()%SIZE;
  }

  printf("--------before--------\n");
  for(int i=0 ; i<SIZE ; i++){
    printf("%d\n",x[i]);
  }

  sort_func(x,SIZE);

  printf("--------after--------\n");
  for(int i=0 ; i<SIZE ; i++){
    printf("%d\n",x[i]);
  }

  printf("done.\n");

  delete[] x;                /********変更点********/
  return 0;
}

void swap_r(int &x, int &y){
  int tmp;

  tmp = y;
  y = x;
  x = tmp;
}

void sort_func(int *x,int N){
  for(int i=0;i<N-1;i++){
    for(int j=i+1;j<N;j++){
      if(x[i]>x[j]){
	swap_r(x[i],x[j]);
      }
    }
  }
}


ポイントは 「x = new int[SIZE];」および「delete[] x;」です。

「delete[] x;」が抜けている人が多かったようです。 今回のプログラムのように main 関数で new を実行する場合、
プログラム終了と同時に OS が x の指すメモリを 開放してくれますから実害はないのですが、
main 関数以外で new を実行するような場合、delete を忘れると 深刻な事態を引き起こすこともあります。
このようなバグを作らないためにも、 delete を常に意識しておく 癖をつけておくと良いと思います。

なお、delete 文が

	delete x;


になっている人がいました。本来は SIZE 個の int の領域を開放したいのに 対し、
上記の命令では一個しか開放されません。
よって間違いです。


cin/cout の利用

#include <iostream>                /********変更点********/
#include <stdlib.h>
using namespace std;               /********変更点********/

void swap_r(int &x, int &y);
void sort_func(int *x, int N);

int main(void){

  int SIZE;
  int* x;

  cout << "SIZE=?";          /********変更点********/
  cin >> SIZE;               /********変更点********/

  x = new int[SIZE];

  srand(1);
  for(int i=0 ; i<SIZE ; i++){
    x[i] = rand()%SIZE;
  }

  cout << "--------before--------" << endl;    /********変更点********/
  for(int i=0 ; i<SIZE ; i++){
    cout << x[i]  << "\n";                     /********変更点********/
  }

  sort_func(x,SIZE);

  cout << "--------after--------" << endl;     /********変更点********/
  for(int i=0 ; i<SIZE ; i++){
    cout << x[i]  << "\n";                     /********変更点********/
  }

  cout << "done." << endl;                     /********変更点********/

  delete[] x;
  return 0;
}

/* swap 関数と sort_func 関数は省略 */


良くできていましたが、scanf/printf と cin/cout が同時に使われている人がいました。
一つのプログラムの中ではどちらかに統一した方が自然だと思います。


C から入る C++ に戻る