| 静岡理工科大学 | 総合情報学部 (by 菅沼) | 菅沼ホーム | 目次 | 演習解答例 | 付録 | 索引 |

この章では,配列とポインタについて説明します.Java にはポインタという言葉(概念)はありませんが,int や double などの基本形以外はすべてポインタで表現されていると考えた方が妥当です.したがって,Java を勉強する場合にも,ポインタという考え方は重要だと思います.以下,Java を例外扱いせずに述べていきますが,ポインタやアドレスといった言葉を明示的に使用しているような箇所は,Java に対しては適用できません.
double x[10];
const int n = 10; // n の値は変更できない double x[n];のように,宣言することは可能です.例えば,下の例のように,入力するデータの数に応じて配列を宣言したいことがしばしば起こりますが,不可能ですので注意してください( C/C++ のバージョンによっては可能ですが,現段階では使用しない方がよいと思います).以下のような処理を行いたい場合は,後に述べるように,特別な関数または new 演算子を使用する必要があります.
int n;
printf("データの数を入力してください ");
scanf("%d", &n);
double x[n]; // 誤り
double x[] = new double [10]; ・・・nの値を,入力等によって決める int y[] = new int [n];
x[5] = 3.0; y = x[3];
for (i1 = 1; i1 <= 14; i1++) // i1 の値に注意 y[i1-1] = x[i1];
char c = 'x';
char z[10];
scanf("%c", &z[2]); // z の 3 番目の要素に 1 文字入力する
scanf("%s", z); // 9 文字以下の文字列を入力する
// (文字列の最後に \0 が付加される)
printf("%c\n", z[2]); // z の 3 番目の要素を出力する
printf("%s\n", z); // 文字列を出力する
01 /********************************/
02 /* 平均値の計算と平均値以下の人 */
03 /* coded by Y.Suganuma */
04 /********************************/
05 #include <stdio.h>
06
07 int main()
08 {
09 double mean = 0.0;
10 double x[50];
11 int n, i1;
12 /*
13 データの数の読み込み
14 */
15 printf("人数は? ");
16 scanf("%d", &n);
17
18 if (n <= 0 || n > 50)
19 printf("人数が不適当です\n");
20 /*
21 データの読み込み
22 */
23 else {
24 for (i1 = 0; i1 < n; i1++) {
25 printf("%d 番目の人の点は? ", i1+1);
26 scanf("%lf", &(x[i1]));
27 mean += x[i1];
28 }
29 /*
30 平均値の計算と出力
31 */
32 mean /= n;
33 printf(" 平均値は=%f\n", mean);
34 /*
35 平均値以下の人を調べ,出力
36 */
37 for (i1 = 0; i1 < n; i1++) {
38 if (x[i1] <= mean)
39 printf(" %d番 %f点\n", i1+1, x[i1]);
40 }
41 }
42
43 return 0;
44 }
x[55] = 3.6;
01 /****************************/
02 /* 平方根の計算 */
03 /* coded by Y.Suganuma */
04 /****************************/
05 #include <stdio.h>
06 #include <math.h>
07
08 int main()
09 {
10 double data, x[100], y[100];
11 int i1;
12 char f_name[50];
13 FILE *out;
14 /*
15 ファイル名の入力
16 */
17 printf("出力ファイル名は? ");
18 scanf("%s", f_name);
19 /*
20 平方根の計算
21 */
22 data = 0.0;
23
24 for (i1 = 0; i1 < 100; i1++) {
25 data += 1.0;
26 x[i1] = data;
27 y[i1] = sqrt(data);
28 }
29 /*
30 出力
31 */
32 out = fopen(f_name, "w");
33
34 for (i1 = 0; i1 < 100; i1++)
35 fprintf(out, "%f %f\n", x[i1], y[i1]);
36
37 return 0;
38 }
/****************************/
/* 大文字から小文字への変換 */
/* coded by Y.Suganuma */
/****************************/
#include <stdio.h>
int main()
{
int k = 0;
char c[50];
/*
データ数の入力
*/
printf("大文字の文字列を入力してください(49字以内) ");
scanf("%s", c);
/*
小文字へ変換
*/
while (c[k] != '\0') {
c[k] += 32;
k++;
}
/*
出力
*/
printf("%s\n", c);
return 0;
}
int x[4] = {100, 200, 300, 400};
int *y;
char *c;
y = x; または y = &(x[0]);
y++; *y = ・・・;
*(y+1) = ・・・; a = *(y+2); ・・・
c = (char *)x; c++;
int x1[4] = {1, 2};
int x2[] = {1, 2}; // Java においても可能
int *x3 = {1, 2}; // 誤り
char c1[15] = {"test data"};
char c2[] = {"test data"};
char *c3 = {"test data"};
int x1[4] = {0}; // すべての要素が 0 で初期設定される
01 /****************************/
02 /* 配列とポインタ */
03 /* coded by Y.Suganuma */
04 /****************************/
05 #include <stdio.h>
06
07 int main()
08 {
09 int i1;
10 int *x1; /* intに対するポインタ */
11 int x2[6] = {1, 2, 3, 4, 5, 6}; /* 6つのデータ領域 */
12 int x3[] = {1, 2, 3, 4}; /* 4つのデータ領域 */
13 char c1[15] = {"test data"}; /* 15個のデータ領域 */
14 char c2[] = {"test data"}; /* 10個のデータ領域 */
15 char *c3 = {"test data"}; /* 文字列を指す1つのポインタ */
16 char *c4; /* 文字列を指す1つのポインタ */
17 /*
18 初期設定された値と確保された領域のサイズ
19 */
20 for (i1 = 0; i1 < 6; i1++)
21 printf("%d ", x2[i1]);
22 printf("(%dバイト)\n", sizeof(x2));
23 for (i1 = 0; i1 < 4; i1++)
24 printf("%d ", x3[i1]);
25 printf("(%dバイト)\n", sizeof(x3));
26 printf("%s (%dバイト)\n", c1, sizeof(c1));
27 printf("%s (%dバイト)\n", c2, sizeof(c2));
28 printf("%s (%dバイト)\n", c3, sizeof(c3));
29 /*
30 要素の参照と変更
31 */
32 x1 = x2; // x1 = &x2[0]の意味
33 x1[1] = -1;
34 *(x1+2) = -2;
35 x2[3] = -3;
36 *(x2+4) = -4;
37 for (i1 = 0; i1 < 6; i1++)
38 printf("%d ", x1[i1]);
39 printf("\n");
40 for (i1 = 0; i1 < 6; i1++)
41 printf("%d ", x2[i1]);
42 printf("\n");
43
44 c1 = "test1 data ";
45 // c2 = "test2 data";
46 c3 = "test3 data";
47 c4 = "test4 data";
48 printf("%s (%dバイト)\n", c1, sizeof(c1));
49 printf("%s (%dバイト)\n", c3, sizeof(c3));
50 printf("%s (%dバイト)\n", c4, sizeof(c4));
51
52 return 0;
53 }
c1 = "test1 data";
int x1[3] = {10, 20, 30}, x2[3];
char c1[5] = {"data"}, c2[5];
x2 = x1;
c2 = c1;
printf("%d %d\n", x1[1], x2[1]);
printf("%s %s\n", c1, c2);
1 2 3 4 5 6 (24バイト) 1 2 3 4 (16バイト) test data (15バイト) test data (10バイト) test data (4バイト) 1 -1 -2 -3 -4 6 1 -1 -2 -3 -4 6 test1 data (15バイト) test3 data (4バイト) test4 data (4バイト)
int a[3][2]; // int x[][] = new int [3][2]; Javaの場合
int x[3][2] = {{100, 200}, {300, 400}, {500, 600}}; // int x[][] = {{100, 200}, {300, 400}, {500, 600}}; Javaの場合
int **y, *z, *w[3];
y = &(w[0]); w[0] = x[0]; w[1] = x[1]; w[2] = x[2];
z = (int *)x; // z = &x[0][0]; でも良い
int x1[][] = {{1, 2}, {3, 4}, {5, 6}}; // 誤り.Javaはこの方法で初期化 int x1[3][2] = {{1, 2}, {3, 4}, {5, 6}}; // 3行2列 int x2[][2] = {{1, 2}, {3, 4}}; // 2行2列 int x3[3][] = {{1, 2}, {3, 4}}; // 誤り char c1[5][10] = {"zero", "one", "two", "three"}; // 5行10列 char c2[][10] = {"zero", "one", "two", "three"}; // 4行10列 char *c3[] = {"zero", "one", "two", "three"}; // 4つのポインタ char c4[5][] = {"zero", "one", "two", "three"}; // 誤り
/****************************/
/* 2次元配列とポインタ */
/* coded by Y.Suganuma */
/****************************/
#include <stdio.h>
int main()
{
int x1[3][2] = {{1, 2}, {3, 4}, {5, 6}}; /* 3行2列 */
int x2[][2] = {{1, 2}, {3, 4}}; /* 2行2列 */
char c1[5][10] = {"zero", "one", "two", "three"}; /* 5行10列 */
char c2[][10] = {"zero", "one", "two", "three"}; /* 4行10列 */
char *c3[] = {"zero", "one", "two", "three"}; /* 4つのポインタ */
int *px, *px1;
char *pc;
/*
初期設定された値と確保された領域のサイズ
*/
printf("%d (%dバイト)\n", x1[1][1], sizeof(x1));
printf("%d (%dバイト)\n", x2[1][1], sizeof(x2));
printf("%s (%dバイト)\n", c1[3], sizeof(c1));
printf("%s (%dバイト)\n", c2[3], sizeof(c2));
printf("%s (%dバイト)\n", c3[3], sizeof(c3));
/*
要素の参照
*/
px = (int *)x1;
px1 = x1[2];
pc = &(c1[2][0]);
printf("%d %d %d %d\n", x1[2][1], px[2*2+1], *(px+2*2+1), px1[1]);
printf("%c%c%c %s\n", c1[2][0], pc[1], *(pc+2), pc);
return 0;
}
4 (24バイト) 4 (16バイト) three (50バイト) three (40バイト) three (16バイト) 6 6 6 6 two two
int a[50][3];
/**********************************/
/* メモリの動的確保(1次元配列) */
/* coded by Y.Suganuma */
/**********************************/
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i1, n, sum = 0, *x;
/*
データの数
*/
printf("データの数は? ");
scanf("%d", &n);
/*
領域の確保
*/
x = (int *)malloc(n * sizeof(int));
/*
データの入力と和の計算
*/
for (i1 = 0; i1 < n; i1++) {
printf(" %d 番目のデータを入力してください ", i1+1);
scanf("%d", &x[i1]);
sum += x[i1];
}
printf("和 = %d\n", sum);
/*
領域の開放
*/
free(x);
return 0;
}
/**********************************/
/* メモリの動的確保(2次元配列) */
/* coded by Y.Suganuma */
/**********************************/
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i1, i2, m, n, *mean, **ten;
/*
データの数
*/
printf("クラスの人数は? ");
scanf("%d", &n);
printf("科目の数は? ");
scanf("%d", &m);
/*
領域の確保
*/
ten = (int **)malloc(n * sizeof(int *));
mean = (int *)calloc(m, sizeof(int));
/*
データの入力と和の計算
*/
for (i1 = 0; i1 < n; i1++) {
ten[i1] = (int *)calloc(m, sizeof(int));
printf(" %d 番目の学生\n", i1+1);
for (i2 = 0; i2 < m; i2++) {
printf(" %d 番目の科目の点数は? ", i2+1);
scanf("%d", &ten[i1][i2]);
mean[i2] += ten[i1][i2];
}
}
/*
平均の出力
*/
printf("各科目の平均点は以下の通りです\n ");
for (i1 = 0; i1 < m; i1++)
printf(" %d", mean[i1]/n);
printf("\n");
/*
領域の開放
*/
free(ten);
free(mean);
return 0;
}
int *pi = new int;
delete pi;
double *dp = new double [10]; // 「10」の部分は変数でも構わない ・・・・・ delete [] dp;
double** pd = new double* [2]; for (i1 = 0; i1 < 2; i1++) pd[i1] = new double [3];
for (i1 = 0; i1 < 2; i1++) delete [] pd[i1]; delete [] pd;
/**************************************/
/* メモリの動的確保(1次元配列,new) */
/* coded by Y.Suganuma */
/**************************************/
#include <stdio.h>
int main()
{
int i1, n, sum = 0, *x;
/*
データの数
*/
printf("データの数は? ");
scanf("%d", &n);
/*
領域の確保
*/
x = new int [n];
/*
データの入力と和の計算
*/
for (i1 = 0; i1 < n; i1++) {
printf(" %d 番目のデータを入力してください ", i1+1);
scanf("%d", &x[i1]);
sum += x[i1];
}
printf("和 = %d\n", sum);
/*
領域の開放
*/
delete [] x;
return 0;
}
/**************************************/
/* メモリの動的確保(2次元配列,new) */
/* coded by Y.Suganuma */
/**************************************/
#include <stdio.h>
int main()
{
int i1, i2, m, n, *mean, **ten;
/*
データの数
*/
printf("クラスの人数は? ");
scanf("%d", &n);
printf("科目の数は? ");
scanf("%d", &m);
/*
領域の確保
*/
ten = new int * [n];
mean = new int [m];
for (i1 = 0; i1 < m; i1++)
mean[i1] = 0;
/*
データの入力と和の計算
*/
for (i1 = 0; i1 < n; i1++) {
ten[i1] = new int [m]; // 学生毎に科目数を変えることも可能
printf(" %d 番目の学生\n", i1+1);
for (i2 = 0; i2 < m; i2++) {
printf(" %d 番目の科目の点数は? ", i2+1);
scanf("%d", &ten[i1][i2]);
mean[i2] += ten[i1][i2];
}
}
/*
平均の出力
*/
printf("各科目の平均点は以下の通りです\n ");
for (i1 = 0; i1 < m; i1++)
printf(" %d", mean[i1]/n);
printf("\n");
/*
領域の開放
*/
for (i1 = 0; i1 < n; i1++)
delete [] ten[i1];
delete [] ten;
delete [] mean;
return 0;
}
RANGE NUM
0- 10 2 **
11- 20 5 *****
・・・・
91-100 3 ***
*
* *
* * ・・・・・ * *
* * * * *
-------------- ・・・・・ ---------
1 2 3 ・・・・・ 11 12
| 静岡理工科大学 | 総合情報学部 (by 菅沼) | 菅沼ホーム | 目次 | 演習解答例 | 付録 | 索引 |