情報学部 | 菅沼ホーム | 全体目次 | 演習解答例 | 付録 | 索引 |
double x[10]; // 初期設定する場合(いずれの方法でも可) double x[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; double x[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 初期化子リスト(C++11) double x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; double x[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 初期化子リスト(C++11)
const int n = 10; // n の値は変更できない double x[n];
int n;
printf("データの数を入力してください ");
scanf("%d", &n);
double x[n]; // 最近の C では可能
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); // 文字列を出力する
---------------------(C++11)範囲 for 文-------------------------
for (変数宣言 : 範囲) { 文(複数の文も可) }
void sub(int x[]) { for (auto a : x) printf("%d ", a); printf("\n"); } int main() { int x[] = {4, 5, 6}; for (auto a : x) printf("%d ", a); printf("\n"); return 0; }
01 /****************************/ 02 /* 範囲 for 文 */ 03 /* coded by Y.Suganuma */ 04 /****************************/ 05 #include <iostream> 06 #include <vector> 07 #include <map> 08 09 using namespace std; 10 11 int main() 12 { 13 // 配列 14 cout << "*** array ***\n"; 15 int k = 0, a[5]; 16 // for (int& x : a) { 17 for (auto& x : a) { 18 cout << (k+1) << " 番目のデータ? "; 19 cin >> x; 20 k++; 21 } 22 // 従来の for 文 23 /* 24 for (int i1 = 0; i1 < 5; i1++) { 25 cout << (i1+1) << " 番目のデータ? "; 26 cin >> a[i1]; 27 } 28 */ 29 // for (int x : a) 30 for (auto x : a) 31 cout << " " << x; 32 cout << endl; 33 // 従来の for 文 34 /* 35 for (int i1 = 0; i1 < 5; i1++) 36 cout << " " << a[i1]; 37 cout << endl; 38 */ 39 // vector* 40 cout << "*** vector ***\n"; 41 vector<int> v {10, 20, 30, 40, 50}; 42 // for (int x : v) 43 for (auto x : v) 44 cout << " " << x; 45 cout << endl; 46 // 従来の for 文 47 /* 48 for (unsigned int i1 = 0; i1 < v.size(); i1++) 49 cout << " " << v[i1]; 50 cout << endl; 51 */ 52 // map 53 cout << "*** map ***\n"; 54 map<string, int> mp {{"tanaka", 90}, {"suzuki", 100}, {"sato", 70}}; 55 // for (pair<string, int> x : mp) 56 for (auto x : mp) 57 cout << " (" << x.first << ", " << x.second << ")"; 58 cout << endl; 59 // 従来の for 文 60 /* 61 map<string, int>::iterator it; 62 for (it = mp.begin(); it != mp.end(); it++) 63 cout << " (" << (*it).first << ", " << (*it).second << ")"; 64 cout << endl; 65 */ 66 67 return 0; 68 }
1 番目のデータ? 1 2 番目のデータ? 2 3 番目のデータ? 3 4 番目のデータ? 4 5 番目のデータ? 5 1 2 3 4 5 *** vector *** 10 20 30 40 50 *** map *** (sato, 70) (suzuki, 100) (tanaka, 90)
----------------------(C++11)範囲 for 文終わり--------------------
/********************************/ /* 平均値の計算と平均値以下の人 */ /* coded by Y.Suganuma */ /********************************/ #include <stdio.h> int main() { /* データの数の読み込み */ int n; printf("人数は? "); scanf("%d", &n); if (n <= 0 || n > 50) printf("人数が不適当です\n"); /* データの読み込み */ else { int i1; double mean = 0.0; double x[50]; for (i1 = 0; i1 < n; i1++) { printf("%d 番目の人の点は? ", i1+1); scanf("%lf", &(x[i1])); mean += x[i1]; } /* 平均値の計算と出力 */ mean /= n; printf(" 平均値は=%f\n", mean); /* 平均値以下の人を調べ,出力 */ for (i1 = 0; i1 < n; i1++) { if (x[i1] <= mean) printf(" %d番 %f点\n", i1+1, x[i1]); } } return 0; }
printf("%f\n", x[51]); x[55] = 3.6;
/****************************/ /* 平方根の計算 */ /* coded by Y.Suganuma */ /****************************/ #include <stdio.h> #include <math.h> int main() { /* ファイル名の入力 */ char f_name[50]; printf("出力ファイル名は? "); scanf("%s", f_name); /* 平方根の計算 */ double data = 0.0; double x[100], y[100]; int i1; for (i1 = 0; i1 < 100; i1++) { data += 1.0; x[i1] = data; y[i1] = sqrt(data); } /* 出力 */ FILE *out = fopen(f_name, "w"); for (i1 = 0; i1 < 100; i1++) fprintf(out, "%f %f\n", x[i1], y[i1]); return 0; }
/****************************/ /* 大文字から小文字への変換 */ /* coded by Y.Suganuma */ /****************************/ #include <stdio.h> int main() { /* データ数の入力 */ char c[50]; printf("大文字の文字列を入力してください(49字以内) "); scanf("%s", c); /* 小文字へ変換 */ int k = 0; while (c[k] != '\0') { c[k] += 32; k++; } /* 出力 */ printf("%s\n", c); return 0; }
int x[4] = {100, 200, 300, 400}; // 各要素の初期設定も行っている int *y; // int y[4]; と宣言した場合は,y = x; は実行できない char *c;
y = x; または y = &(x[0]);
int *x = new int [4]; for (int i1 = 0; i1 < 4; i1++) x[i1] = 100 * (i1 + 1); // C++11 以降であれば,上 3 行の代わりに下の 1 行で可能 //int *x = new int [4] {100, 200, 300, 400}; // 初期化子リスト,C++11 int *y; char *c;
y++; *y = ・・・;
*y = ・・・; *(y+1) = ・・・; a = *(y+2); ・・・
c = (char *)x; c++;
01 int x1[4] = {1, 2};
02 int x2[] = {1, 2};
03 int *x3 = {1, 2}; // 誤り
04 char c1[15] = {"test data"}; // char c1[15] = "test data"; でも可
05 char c2[] = {"test data"}; // char c2[] = "test data"; でも可
06 int x4[4] = {0}; // すべての要素が 0 で初期設定される
07 int x5[4] = {}; // 上と同様
08 int x6[4] {1, 2}; // C++11 以降では可能(初期化子リスト)
09 int x7[] {1, 2}; // C++11 以降では可能(初期化子リスト)
/****************************/ /* 配列とポインタ */ /* coded by Y.Suganuma */ /****************************/ #include <stdio.h> int main() { /* 初期設定された値と確保された領域のサイズ */ int i1; int x2[6] = {1, 2, 3, 4, 5, 6}; /* 6つのデータ領域 */ for (i1 = 0; i1 < 6; i1++) printf("%d ", x2[i1]); printf("(%dバイト)\n", sizeof(x2)); int x3[] = {1, 2, 3, 4}; /* 4つのデータ領域 */ for (i1 = 0; i1 < 4; i1++) printf("%d ", x3[i1]); printf("(%dバイト)\n", sizeof(x3)); char c1[15] = {"test data"}; /* 15個のデータ領域 */ char c2[] = {"test data"}; /* 10個のデータ領域 */ printf("%s (%dバイト)\n", c1, sizeof(c1)); printf("%s (%dバイト)\n", c2, sizeof(c2)); /* 要素の参照と変更 */ int *x1 = x2; // x1 = &x2[0]の意味 x1[1] = -1; *(x1+2) = -2; x2[3] = -3; *(x2+4) = -4; for (i1 = 0; i1 < 6; i1++) printf("%d ", x1[i1]); printf("\n"); for (i1 = 0; i1 < 6; i1++) printf("%d ", x2[i1]); printf("\n"); char *c3 = c2; c3[6] = '\0'; printf("%s (%dバイト)\n", c2, sizeof(c2)); printf("%s (%dバイト)\n", c3, sizeof(c3)); return 0; }
1 2 3 4 5 6 (24バイト) 1 2 3 4 (16バイト) test data (15バイト) test data (10バイト) 1 -1 -2 -3 -4 6 1 -1 -2 -3 -4 6 test d (10バイト) test d (4バイト)
int a[3][2]; // 初期設定を行わない場合 int x[3][2] = {{100, 200}, {300, 400}, {500, 600}}; // 以下のいずれの方法でも可 //int x[][2] = {{100, 200}, {300, 400}, {500, 600}}; //int x[3][2] {{100, 200}, {300, 400}, {500, 600}}; // C++11 //int x[][2] {{100, 200}, {300, 400}, {500, 600}}; // C++11
int **y = x;
int *w[3]; // w は,int に対するポインタの配列 int **y = &(w[0]); // int **y = w; でも良い w[0] = x[0]; w[1] = x[1]; w[2] = x[2];
int **x = new int *[3]; for (int i1 = 0; i1 < 3; i1++) x[i1] = new int[2]; // 以下のようにすれば,上と同じ値で初期設置も可能 int **x = new int *[3]; x[0] = new int[2] {100, 200}; x[1] = new int[2] {300, 400}; x[2] = new int[2] {500, 600};
int **y = x;
int *z = (int *)x; // int *z = &x[0][0]; でも良い
int *z = x[1]; //int *z = &x[1][0]; でも OK
int x1[][] = {{1, 2}, {3, 4}, {5, 6}}; // 誤り int x1[3][2] = {{1, 2}, {3, 4}, {5, 6}}; // 3行2列 int x1[3][2] {{1, 2}, {3, 4}, {5, 6}}; // 3行2列,C++11 int x2[][2] = {{1, 2}, {3, 4}}; // 2行2列 int x2[][2] {{1, 2}, {3, 4}}; // 2行2列,C++11 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 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[5], *(px+5), 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バイト) 6 6 6 6 two two
int x[4][3][2]; // 初期設定等で省略できるのは 4 という値だけ
int ***y;
int *z = (int *)x; // int *z = &x[0][0][0];
int ***x = new int **[4]; for (int i1 = 0; i1 < 4; i1++) { x[i1] = new int *[3]; for (int i2 = 0; i2 < 3; i2++) x[i1][i2] = new int[2]; }
int ***y = x; // x と同じ 3 次元配列 int **z = x[1]; // x[1][][] に対応する 2 次元配列 int *w = x[1][0]; // x[1][0][] に対応する 1 次元配列
/****************************/ /* 3次元配列とポインタ */ /* coded by Y.Suganuma */ /****************************/ #include <stdio.h> int main() { int i1, x[4][3][2], *x1[4][3], **x2[4]; for (i1 = 0; i1 < 4; i1++) { int i2; for (i2 = 0; i2 < 3; i2++) x1[i1][i2] = x[i1][i2]; } for (i1 = 0; i1 < 4; i1++) x2[i1] = x1[i1]; int **x3 = x2[2]; // x[2][][] を 2 次元配列として処理 int ***y = &x2[0]; // int ***y = x2;,x と同じ 3 次元配列 x[2][1][0] = 100; printf("%d %d %d\n", x[2][1][0], y[2][1][0], x3[1][0]); // 全て100 int *z = (int *)x; // int *z = &x[0][0][0]; z[((2*3)+1)*2+0] = 1000; // 1 次元配列として処理 printf("%d %d %d %d\n", x[2][1][0], y[2][1][0], x3[1][0], z[((2*3)+1)*2+0]); // 全て1000 return 0; } /* 以下,new 演算子を使用した場合 #include <stdio.h> int main() { int ***x = new int **[4]; for (int i1 = 0; i1 < 4; i1++) { x[i1] = new int *[3]; for (int i2 = 0; i2 < 3; i2++) x[i1][i2] = new int [2]; } int **x3 = x[2]; // x[2][][] を 2 次元配列として処理 int ***y = x; // x と同じ 3 次元配列 x[2][1][0] = 100; printf("%d %d %d\n", x[2][1][0], y[2][1][0], x3[1][0]); // 全て100 int *z = x[2][1]; // x[2][1][] を 1 次元配列として処理 z[0] = 1000; printf("%d %d %d %d\n", x[2][1][0], y[2][1][0], x3[1][0], z[0]); // 全て1000 return 0; } */
// int x[5000000]; // 実行できない // int *x = (int *)malloc(5000000 * sizeof(int)); // 実行可 int *x = new int [5000000]; // 実行可 x[4999999] = 100; printf("%d\n", x[4999999]);
int a[50][3];
/**********************************/ /* メモリの動的確保(1次元配列) */ /* coded by Y.Suganuma */ /**********************************/ #include <stdio.h> #include <stdlib.h> int main() { /* データの数 */ int n; printf("データの数は? "); scanf("%d", &n); /* 領域の確保 */ int *x = (int *)malloc(n * sizeof(int)); /* データの入力と和の計算 */ int i1, sum = 0; 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 m, n; printf("クラスの人数は? "); scanf("%d", &n); printf("科目の数は? "); scanf("%d", &m); /* 領域の確保 */ int **ten = (int **)malloc(n * sizeof(int *)); int *mean = (int *)calloc(m, sizeof(int)); /* データの入力と和の計算 */ int i1; for (i1 = 0; i1 < n; i1++) { ten[i1] = (int *)calloc(m, sizeof(int)); printf("%d 番目の学生\n", i1+1); int i2; 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; // 2 で初期設定したい場合は,new int (2);
delete pi;
double *dp = new double [10]; // 10個のdouble型データを記憶 // 10の部分は変数でも構わない ・・・・・ delete [] dp; int *x = new int [5] {1, 2, 3, 4, 5}; // 初期設定も可能C++11 int *x = new int [5] = {1, 2, 3, 4, 5}; // error int *x = new int [] {1, 2, 3, 4, 5}; // error
double** pd = new double* [2]; for (i1 = 0; i1 < 2; i1++) pd[i1] = new double [3]; // 初期設定を行う場合C++11 double** pd = new double* [2]; pd[0] = new double [3] {1, 2, 3}; pd[1] = new double [3] {4, 5, 6};
for (i1 = 0; i1 < 2; i1++) delete [] pd[i1]; delete [] pd;
/**************************************/ /* メモリの動的確保(1次元配列,new) */ /* coded by Y.Suganuma */ /**************************************/ #include <stdio.h> int main() { /* データの数 */ int n; printf("データの数は? "); scanf("%d", &n); /* 領域の確保 */ int *x = new int [n]; /* データの入力と和の計算 */ int sum = 0; for (int 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 m, n; printf("クラスの人数は? "); scanf("%d", &n); printf("科目の数は? "); scanf("%d", &m); /* 領域の確保 */ int **ten = new int * [n]; int *mean = new int [m]; for (int i1 = 0; i1 < m; i1++) mean[i1] = 0; /* データの入力と和の計算 */ for (int i1 = 0; i1 < n; i1++) { ten[i1] = new int [m]; // 学生毎に科目数を変えることも可 printf("%d 番目の学生\n", i1+1); for (int i2 = 0; i2 < m; i2++) { printf(" %d 番目の科目の点数は? ", i2+1); scanf("%d", &ten[i1][i2]); mean[i2] += ten[i1][i2]; } } /* 平均の出力 */ printf("各科目の平均点は以下の通りです\n"); for (int i1 = 0; i1 < m; i1++) printf(" %d", mean[i1]/n); printf("\n"); /* 領域の開放 */ for (int i1 = 0; i1 < n; i1++) delete [] ten[i1]; delete [] ten; delete [] mean; return 0; }
001 /****************************/ 002 /* new 演算子と代入・初期化 */ 003 /* coded by Y.Suganuma */ 004 /****************************/ 005 #include <stdio.h> 006 #include <vector> 007 008 using namespace std; 009 010 /*****************/ 011 /* クラスComplex */ 012 /*****************/ 013 class Complex 014 { 015 public: 016 int x, y[1], *z; 017 Complex () 018 { 019 x = 0; 020 y[0] = 0; 021 z = new int [1]; 022 z[0] = 0; 023 } 024 }; 025 026 /********/ 027 /* main */ 028 /********/ 029 int main() 030 { 031 // 単純変数 032 printf("***単純変数***\n"); 033 int a1 = 0; 034 int a2 = a1; 035 a2 = 1234; 036 printf(" a1 %d\n", a1); 037 printf(" a2 %d\n", a2); 038 printf("***単純変数(new)***\n"); 039 int *p1 = new int(0); 040 int *p4 = p1; 041 *p4 = 1234; // p1 が示す値も 1234 になる 042 printf(" p1 %d\n", *p1); 043 printf(" p4 %d\n", *p4); 044 // 複数データ(配列と同等) 045 printf("***配列***\n"); 046 int b1[4] = {1, 2, 3, 4}; 047 int b2[4]; 048 for (int i1 = 0; i1 < 4; i1++) 049 b2[i1] = b1[i1]; 050 b2[2] = 200; 051 printf(" b1"); 052 for (int i1 = 0; i1 < 4; i1++) 053 printf(" %d", b1[i1]); 054 printf("\n b2"); 055 for (int i1 = 0; i1 < 4; i1++) 056 printf(" %d", b2[i1]); 057 printf("\n***配列(new)***\n"); 058 int *p2 = new int [4]; 059 for (int i1 = 0; i1 < 4; i1++) 060 p2[i1] = i1 + 1; 061 int *p5 = p2; // p5 = &p2[0] と同じ 062 p5[2] = 200; // *(p5+2) = 200; と同じ 063 printf(" p2"); 064 for (int i1 = 0; i1 < 4; i1++) 065 printf(" %d", p2[i1]); 066 printf("\n p5"); 067 for (int i1 = 0; i1 < 4; i1++) 068 printf(" %d", p5[i1]); 069 // クラスのオブジェクト 070 printf("\n***クラスのオブジェクト***\n"); 071 Complex c1; 072 Complex c2 = c1; 073 c2.x = 10; 074 c2.y[0] = 20; 075 c2.z[0] = 30; 076 printf(" c1 x %d y[0] %d z[0] %d\n", c1.x, c1.y[0], c1.z[0]); 077 printf(" c2 x %d y[0] %d z[0] %d\n", c2.x, c2.y[0], c2.z[0]); 078 printf("***クラスのオブジェクト(new)***\n"); 079 Complex *p3 = new Complex(); 080 Complex *p6 = p3; 081 p6->x = 10; 082 p6->y[0] = 20; 083 p6->z[0] = 30; 084 printf(" p3 x %d y[0] %d z[0] %d\n", p3->x, p3->y[0], p3->z[0]); // (*p3).x,・・・ でも可 085 printf(" p6 x %d y[0] %d z[0] %d\n", p6->x, p6->y[0], p6->z[0]); // (*p6).x,・・・ でも可 086 // STL の vector 087 printf("***STL の vector***\n"); 088 vector <int> d1(4, 0); 089 vector <int> d2 = d1; 090 d2[1] = 10; 091 printf(" d1"); 092 for (int i1 = 0; i1 < 4; i1++) 093 printf(" %d", d1[i1]); 094 printf("\n d2"); 095 for (int i1 = 0; i1 < 4; i1++) 096 printf(" %d", d2[i1]); 097 printf("\n***STL の vector(new)***\n"); 098 vector <int> *p7 = new vector <int> (4, 0); 099 vector <int> *p8 = p7; 100 (*p7)[1] = 10; 101 printf(" p7"); 102 for (int i1 = 0; i1 < 4; i1++) 103 printf(" %d", (*p7)[i1]); 104 printf("\n p8"); 105 for (int i1 = 0; i1 < 4; i1++) 106 printf(" %d", (*p8)[i1]); 107 printf("\n"); 108 // 領域の開放 109 delete p1; 110 delete [] p2; 111 delete p3; 112 delete p7; 113 114 return 0; 115 }
***単純変数*** a1 0 a2 1234
***単純変数(new)*** p1 1234 p4 1234
***配列*** b1 1 2 3 4 b2 1 2 200 4
***配列(new)*** p2 1 2 200 4 p5 1 2 200 4
***クラスのオブジェクト*** c1 x 0 y[0] 0 z[0] 30 c2 x 10 y[0] 20 z[0] 30
***クラスのオブジェクト(new)*** p3 x 10 y[0] 20 z[0] 30 p6 x 10 y[0] 20 z[0] 30
***STL の vector*** d1 0 0 0 0 d2 0 10 0 0 ***STL の vector(new)*** p7 1 10 1 1 p8 1 10 1 1
RANGE NUM 0- 10 2 ** 11- 20 5 ***** ・・・・ 91-100 3 ***
* * * * * ・・・・・ * * * * * * * -------------- ・・・・・ --------- 1 2 3 ・・・・・ 11 12
情報学部 | 菅沼ホーム | 全体目次 | 演習解答例 | 付録 | 索引 |