[C++]スラスラわかるC++ stringをインクルードすればほかの言語並みに文字列は扱えるようにも見える。(print無いしウソ)

list5_3.cpp

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

void printStr(string a){
   cout << a << endl;
};

int main() {
  // 文字列オブジェクト
  string s1, s2, s3;

  // 文字列オブジェクトに文字列を格納する
  s1 = "apple";
  s2 = "banana";

  // 文字列を比較する
  if (s1 > s2) {
    cout << "大きい。" << endl;
  }
  else if (s1 < s2) {
    cout << "小さい。" << endl;
  }
  else {
    cout << "等しい。" << endl;
  }

  // 文字列を連結する
  s3 = s1 + s2;
  cout << s3 << endl;

  //printf  ではこう使いにくい。
  printf("%s\n",s3.c_str());
  //printf  ではこう使いやすい。
  printStr(s3);

  // 長さを求める
  cout << s3.length() << endl;

  // 5番目から3文字の部分文字列を取り出す
  cout << s3.substr(5, 3) << endl;

  // 5文字目だけを取り出す
  cout << s3[5] << endl;

  // "na" という文字列を見つける
  cout << s3.find("na") << endl;
  
  // 文字列を空にする
  s3.clear();

  // 文字列が空であることを確認する
  if (s3.empty()) {
    cout << "空です。" << endl;
  }
  else {
    cout << "空ではありません。" << endl;
  }

  return 0;
}

cd_samples5_3.cmd


C:\samples\chapter05>cd C:\samples\chapter05\

C:\samples\chapter05>g++ -o list5_3.exe list5_3.cpp

C:\samples\chapter05>list5_3.exe
小さい。
applebanana
applebanana
applebanana
11
ban
b
7
空です。

C:\samples\chapter05>cmd /k
C:\samples\chapter05>

[C++]スラスラわかるC++ 「C++の仕様で配列は必ずのポインタ渡しになる」を知るための実験プログラム 4_12 cpp *ptr &address

chapter4.h


// 配列の平均値を返す関数のプロトタイプ宣言
double getAverage(const int *a, int length);

getAverage.cpp

double getAverage(const int *a, int length) {
  double sum;		// 合計値
  double average;	// 平均値
  int i;		// 配列の要素番号(ループカウンタ)

  // 配列の合計値を求める
  sum = 0;
  for (i = 0; i < length; i++) {
    // ポインタが指し示している要素の値を読み出し集計する
    sum += *a;

    // ポインタを更新する(次の要素を指し示す)
    a++;
  }

  // 配列の平均値を求める
  average = (double)sum / length;

  // 配列の合計値を返す
  return average;
}

list4_12.cpp

#include <iostream>
using namespace std;
#include "chapter4.h"

int main() {
  const int DATA_NUM = 10;	// 配列の要素数

  // 10人の学生のテストの得点を格納した配列
  int point[DATA_NUM] = { 85, 72, 63, 45, 100, 98, 52, 88, 74, 65 };
  double average;		// 平均値

  // 平均点を求める
  average = getAverage(point, DATA_NUM);

  // 平均点を表示する
  cout << "平均点:" << average << endl;

  return 0;
}

cd_samples4_12_pointer_address.cmd  

 g++ list4_12.cpp getAverage.cpp -o list4_12.exe


C:\samples\chapter04\4_12>cd C:\samples\chapter04\4_12\

C:\samples\chapter04\4_12>g++ list4_12.cpp getAverage.cpp -o list4_12.exe

C:\samples\chapter04\4_12>list4_12.exe
平均点:74.2

C:\samples\chapter04\4_12>cmd /k
C:\samples\chapter04\4_12>

[C++]スラスラわかるC++ 引数のポインタ渡しを知るための実験プログラム 4_9 cpp *ptr &address

list4_9.cpp

#include <iostream>
using namespace std;

// 引数をポインタ渡しで受け取る関数
void sub(int *ptr) {
  // 引数に渡されたアドレスを表示する
  cout << "sub関数:引数ptrに渡されたアドレス = " << ptr << endl;

  // 引数に渡されたアドレスが指し示す変数の値を読み出して表示する
  cout << "sub関数:引数ptrが指し示す変数の値 = " << *ptr << endl;

  // 引数に渡されたアドレスが指し示す変数に値を書き込む
  *ptr = 456;
  cout << "sub関数:引数ptrが指し示す変数に書き込んだ値 = " << *ptr << endl;

  // 戻り値を返さずに関数を終了する
  return;
}

// main関数
int main() {
  // ローカル変数を宣言し、値を書き込む
  int val = 123;

  // ローカル変数のアドレスを表示する
  cout << "main関数:変数valのアドレス = " << &val << endl;

  // ローカル変数の値を表示する
  cout << "main関数:変数valの値 = " << val << endl;

  // 引数のポインタ渡しで、sub関数を呼び出す
  sub(&val);

  // ローカル変数の値を表示する
  cout << "main関数:変数valの値 = " << val << endl;

  return 0;
}

cd_samples4_9_pointer_address.cmd


C:\samples\chapter04>cd C:\samples\chapter04\

C:\samples\chapter04>g++ -o list4_9.exe list4_9.cpp

C:\samples\chapter04>list4_9.exe
main関数:変数valのアドレス = 0x61ff0c
main関数:変数valの値 = 123
sub関数:引数ptrに渡されたアドレス = 0x61ff0c
sub関数:引数ptrが指し示す変数の値 = 123
sub関数:引数ptrが指し示す変数に書き込んだ値 = 456
main関数:変数valの値 = 456

C:\samples\chapter04>cmd /k
C:\samples\chapter04>

[C++]スラスラわかるC++ テキストファイルを読み込むプログラム 9_5 cpp ifstream fin

list9_6.cpp

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
  string s;

  // 入力用のテキストファイルをオープンする
  ifstream fin("myFile.txt");

  // ファイルがオープンできたかどうかチェックする
  if (!fin.is_open()==true) {
    // エラー処理
    cout << "ファイルをオープンできません!";

    // プログラムをエラー終了する
    return 1;
  }

 // ファイルから1行ずつ読み出す
  while (getline(fin, s)) {
    // 読み出した1行を画面に表示する
    cout << s << endl;
  }
    
  // ファイルをクローズする
  fin.close();

  // プログラムを正常終了する
  return 0;
}

myFile.txt  エンコードは1 ANSI じゃなきゃだめだとおもう やってない

C++ hello, world
C++の皆さん、こんにちは

cd_samples9_5_ofstream_file_output.cmd


C:\samples\chapter09>cd C:\samples\chapter09\

C:\samples\chapter09>g++ -o list9_6.exe list9_6.cpp

C:\samples\chapter09>list9_6.exe
C++ hello, world
C++の皆さん、こんにちは

C:\samples\chapter09>cmd /k
C:\samples\chapter09>

[C++]スラスラわかるC++ テキストファイルへ書き込むプログラム 9_5 cpp ofstream fout

list9_5.cpp

#include <iostream>
#include <fstream>
using namespace std;

int main() {
  // 出力用のテキストファイルをオープンする
  ofstream fout("myFile.txt");

  // ファイルがオープンできたかどうかチェックする
  if (!fout.is_open()==true) {
    // エラー処理
    cout << "ファイルをオープンできません!";

    // プログラムをエラー終了する
    return 1;
  }

  // ファイルに文字列を書き込む
  fout << "C++ hello, world" << endl;
  fout << "C++の皆さん、こんにちは" << endl;
    
  // ファイルをクローズする
  fout.close();
  cout << "ファイルに書き込みました!";

  // プログラムを正常終了する
  return 0;
}

cd_samples9_5_ofstream.cmd


C:\samples\chapter09>cd C:\samples\chapter09\

C:\samples\chapter09>g++ -o list9_5.exe list9_5.cpp

C:\samples\chapter09>list9_5.exe
ファイルに書き込みました!
C:\samples\chapter09>cmd /k
C:\samples\chapter09>

myFile.txt

C++ hello, world
C++の皆さん、こんにちは

[C++]スラスラわかるC++ 関数テンプレート 10_2 cpp function Template Standard Template Library (STL)

■関数テンプレート(Tはプレースホルダ)
template <Class T>T 関数名(T 引数名,T 引数名){
        Tをデータ型とした変数を使った処理;
}

list10_2.cpp

#include <iostream>
using namespace std;

// 関数テンプレートで定義したgetMin関数
//template <Class T>T 関数名(T 引数名,T 引数名){
template <class T> T getMin(T a, T b) {
  //return a < b ? a : b;
    if (a < b) {
        return a;
    } else {
        return b;
    }
}

// main関数
int main() {
  // int型のgetMin関数を呼び出す
  int a, b, c;
  a = 123;
  b = 456;
  c = getMin(a, b);
  cout << c << endl;

  // double型のgetMin関数を呼び出す
  double x, y, z;
  x = 1.23;
  y = 4.56;
  z = getMin(x, y);
  cout << z << endl;

  return 0;
}

cd_samples10_2_template.cmd


C:\samples\chapter10>cd C:\samples\chapter10\

C:\samples\chapter10>g++ -o list10_3.exe list10_3.cpp

C:\samples\chapter10>list10_3.exe
123
1.23
a
1.11

C:\samples\chapter10>cmd /k
C:\samples\chapter10>

[C++]スラスラわかるC++ 関数テンプレート 10_3 cpp function Template Standard Template Library (STL)

関数テンプレートとクラステンプレートの構文

■関数テンプレート(Tはプレースホルダ)
template <Class T>T 関数名(T 引数名){
        Tをデータ型とした変数を使った処理;
}
template <class T1,class T1> T1 関数名(T1 引数名,T2 引数名){
        T1,T2をデータ型とした変数を使った処理;
}


■クラステンプレート(Tはプレースホルダ)
template <class Ty class クラス名{
       private:
       T メンバ変数名;
       public:
       Tメンバ関数名(T 引数名){
               Tをデータ型とした変数を使った処理;
       }
}

list10_3.cpp

#include <iostream>
using namespace std;

// 関数テンプレートで定義したgetMin関数
//template <class T> T 関数名(T 引数名)
template <class T> T getMin(T a, T b) {	
  //return a < b ? a : b;
  if (a < b) {
    return a;
  } else {
    return b;
  }
}
//テンプレートをオーバーロード
// 関数テンプレートで定義したgetMin関数(配列の要素の最小値を返す)
//template <class T1,class T1> T1 関数名(T1 引数名,T2 引数名)
template <class T1, class T2> T1 getMin(T1 a[], T2 length) {
  T1 ans = a[0];
  for (T2 i = 1; i < length; i++) {
    if (ans > a[i]) {
      ans = a[i];
    }
  }
  return ans;
}

// main関数
int main() {
  // int型のgetMin関数を呼び出す
  int a, b, c;
  a = 123;
  b = 456;
  c = getMin(a, b);
  cout << c << endl;

  // double型のgetMin関数を呼び出す
  double x, y, z;
  x = 1.23;
  y = 4.56;
  z = getMin(x, y);
  cout << z << endl;

  // char型のgetMin関数(配列用)を呼び出す
  char cArray[] = { 'c', 'b', 'f', 'a', 'e' };
  int cLength = 5;
  char cAns = getMin(cArray, cLength);
  cout << cAns << endl;

  // float型のgetMin関数(配列用)を呼び出す
  float fArray[] = { 2.22F, 3.33F, 1.11F, 5.55F, 4.44F };
  int fLength = 5;
  float fAns = getMin(fArray, fLength);
  cout << fAns << endl;

  return 0;
}

cd_samples10_3_template.cmd


C:\samples\chapter10>cd C:\samples\chapter10\

C:\samples\chapter10>g++ -o list10_3.exe list10_3.cpp

C:\samples\chapter10>list10_3.exe
123
1.23
a
1.11

C:\samples\chapter10>cmd /k
C:\samples\chapter10>

[C++]スラスラわかるC++ クラステンプレート 10_4 cpp class Template Standard Template Library (STL)

■クラステンプレート(Tはプレースホルダ)
template <class Ty class クラス名{
       private:
       T メンバ変数名;
       public:
       Tメンバ関数名(T 引数名){
               Tをデータ型とした変数を使った処理;
       }
}

list10_4.cpp

#include <iostream>
using namespace std;

// MyTriangleクラスの定義と実装
template <class T> class MyTriangle {
  private:
    T bottom;	// 底辺
    T height;	// 高さ
  public:
    // コンストラクタ
    MyTriangle(T bottom, T height) {
      this->bottom = bottom;
      this->height = height;
    }

    // 面積を返すメンバ関数
    T getArea() {
      return this->bottom * this->height / 2;
    }
};

// main関数
int main() {
  // int型でMyTriangleクラスをインスタンス化する際にコンストラクタ引数として30、40渡す
  MyTriangle<int> iObj(10, 20);
  //クラスメソッドgetArea()を呼ぶ
  cout << "int型の三角形の面積:" << iObj.getArea() << endl;

  // double型でMyTriangleクラスををインスタンス化する際にコンストラクタ引数として30、40渡す
  MyTriangle<double> dObj(30.0, 40.0);
  //クラスメソッドgetArea()を呼ぶ
  cout << "double型の三角形の面積:" << dObj.getArea() << endl;

  return 0;
}

cd_samples10_4.cmd


C:\samples\chapter10>cd C:\samples\chapter10\

C:\samples\chapter10>g++ -o list10_4.exe list10_4.cpp

C:\samples\chapter10>list10_4.exe
int型の三角形の面積:100
double型の三角形の面積:600

C:\samples\chapter10>cmd /k
C:\samples\chapter10>