Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

プログラマ勉強会 第1回

Last updated at Posted at 2024-06-22

他の回の資料

C++とは?

C++は、C言語から派生した言語です。
C言語にいろいろ機能を追加したのがC++っていう認識で大丈夫だと思います。

C++の簡単なコード

#include <iostream>

int main() {
    std::cout << "hello world" << std::endl;
    
    return 0;
}

上のコードはコンソールにhello worldと表示するだけの簡単なコードです。
このコードを学内のPCで実際に実行する方法を説明します。

C++コードの実行の仕方

まず、ターミナルを起動して適当なフォルダを作成します。
以下の例ではpanddというフォルダを作っています。

mkdir pandd

次に、cdコマンドで作成したフォルダに移動します

cd pandd

そこで、code ディレクトリ名というコマンドでVSCodeというコードエディタを起動できます。
.は今いるディレクトリ(カレントディレクトリ)という意味です。

code .

VSCodeが起動したら新規ファイルを作成し、上記のC++のコードをコピペします。
この時拡張子は.cppにしてください。
以下の例ではmain.cppというファイルを作成しています。

vscode.gif

C++のソースファイルの作成ができたら、次にコンパイルという作業をします。
コンパイルとは、C++のコードから、コンピュータが実際に実行可能なファイルに変換する作業です。
以下のコマンドをターミナルで実行してください。

g++ ファイル名.cpp

すると、同じディレクトリにa.outというファイルが新しく作成されていると思います。
以下のようにすると実行できます。

./a.out

C++の入出力

入出力とは、コンソールに文字列を表示したり、コンソールでの入力を受け取ったりすることです。
入出力は英語でIOと呼ぶこともあります。

ターミナル、コンソールとは

この記事では、ターミナル=PCのTerminalというアプリ、コンソール=g++などのコマンドを受け付ける黒い画面のことを指しています。
どちらもだいたい同じ意味だと考えてもらって大丈夫です。

C++の出力

#include <iostream>

int main() {
    std::cout << "hello world" << std::endl;
    
    return 0;
}
std::cout << "hello world" << std::endl;

↑ の部分でコンソールに文字列を表示しています。

std::cout

↑ は文字列の出力先を意味しています。今回の場合だとコンソールです。

"hello world"

↑ はコンソールに表示する文字列です。
C++では、コード内で文字列を表現するときはダブルクォーテーションで囲う必要があります。

std::endl

↑ は改行を意味します。

std::cout << "hello world"

↑ で文字列を表示します。
std::coutという出力先に"hello world"という文字列を流し込んでいるイメージです。
<<という記号を使って、<<の左側に右側の要素を流し込む、という意味になります。
このような書き方を、C++ではストリーム(stream)といいます。

std::cout << "hello world" << std::endl;

std::cout << "hello world"の後に続けて<< std::endlと書くことで、同じ出力先に続けて改行も流し込んでいます。
末尾のセミコロン;は文の終わりに必ず書く必要があります。

std::cout
  << "hello world"
  << std::end;

Pythonなどの言語では、改行を文の区切りとして扱っていますが、C++では改行ではなく;を文の区切りとして扱います。
そのため、上記のように文の途中で改行を入れて自分が見やすいように書くことが出来ます。

#include <iostream>

int main() {
    std::cout 
      << "hello world" 
      << std::endl;
    
    return 0;
}

#include<iostream>の意味

#include <iostream>

int main() {
    std::cout << "hello world" << std::endl;
    
    return 0;
}

ここで、#include<iostream>の意味について説明します。
実は、最初の状態ではstd::coutstd::endlという機能は使用することが出来ません。

int main() {
    std::cout << "hello world" << std::endl;
    
    return 0;
}

試しに、↑のようなコードを実行してみようとすると、std::coutstd::endlのところでエラーが出ると思います。
そこで、もとから用意されているiostreamというライブラリを読み込むことで、std::coutstd::endlが使えるようになります。
C++では、他にも色々なライブラリが標準で用意されているので、それらを使うことで様々な機能を使うことが出来ます。
ちなみに、ライブラリは自分で作成することもでき、Siv3Dも有志によって作られたライブラリの一つです。

int main()の意味

int main() {}では、mainという名前の関数を定義しています。
C++ではプログラムを実行すると、最初にmain関数が呼ばれるようになっています。
main関数が呼ばれると、int main() {}{ }の中の内容が1行ずつ実行されていきます。
return 0でプログラムを終了します。
関数については後で詳しく説明するので、今は一旦{ }の中に実行したい処理を書けば良いとおぼえておいてください。

練習問題

問題1. "hello world"の部分を変えて、色々な文字列を表示させてみよう

#include <iostream>

int main() {
    std::cout << "hello world" << std::endl;
    
    return 0;
}

問題2. 以下の文字列を表示させてみよう

複数行を表示するにはどうすれば良いでしょうか?

begin
1+2=3
end
答え

書き方は何通りかあります。

#include <iostream>

int main() {
    std::cout << "begin" << std::endl;
    std::cout << "1+2=3" << std::endl;
    std::cout << "end" << std::endl;

    return 0;
}
#include <iostream>

int main() {
    std::cout << "begin" << std::endl << "1+2=3" << std::endl << "end" << std::endl;

    return 0;
}

↓文の途中で改行をすると見やすくなります

#include <iostream>

int main() {
    std::cout << "begin" << std::endl 
              << "1+2=3" << std::endl 
              << "end" << std::endl;

    return 0;
}

C++の入力

次に、コンソールからの入力を受け取ってみましょう。

#include <iostream>
#include <string>

int main() {
    std::string name;

    std::cout << "Enter your name: ";
    std::cin >> name;
    std::cout << "Hello, " << name << "!" << std::endl;

    return 0;
}

↑ のコードを実行すると、Enter your name; とコンソールに出力されたところで、プログラムが停止します。
ここでコンソールに名前を入力すると、Hello, 名前!と出力されてプログラムが終了します。

std::string name;

↑ の部分ではstd::stringという型のnameという変数を作成しています。
std::stringとは、文字列を表す型です。#include <string>することで使えるようになります。
変数については後で詳しく説明するので、今はnameという名前の、文字列を入れられる箱を作っていると考えてください。

std::cin >> name;

↑ でコンソールからの入力を受け取って、先程作ったnameという変数に入れています。

std::cinは入力元を意味しています。今回の場合だとコンソールからの入力です。

>> nameで、std::cinからの入力をname変数に流し込んでいます。

std::coutとは<<の向きが逆になっていることに注意してください。

std::cout << "Hello, " << name << "!" << std::endl;

↑ でname変数の中身をHello, !の間に表示しています。

文字列をダブルクォーテーション""で囲う必要があるのは、変数の中身を表示するか、文字列をそのまま表示するかを区別するためです。

std::cout << "Hello, " << "name" << "!" << std::endl;

試しに、↑のようにname""で囲うと、name変数の中身ではなく、nameという文字列がそのまま表示されます。

練習問題

以下のように、名前と年齢を受け取れるようにしてみましょう。

Enter your name: ぱんどど
Enter your age: 20
Hello ぱんどど!
You are 20 years old.
答え
#include <iostream>
#include <string>

int main() {
    std::string name;
    std::string age;

    std::cout << "Enter your name: ";
    std::cin >> name;
    std::cout << "Enter your age: ";
    std::cin >> age;
    
    std::cout << "Hello, " << name << "!" << std::endl;
    std::cout << "You are " << age << " years old." << std::endl;

    return 0;
}

演算子 +, -, *, /, %

+, -, *, /, %などの演算子を使うことで、四則演算を行うことが出来ます。

#include <iostream>

int main() {
    std::cout << "4 + 2 = " << 4 + 2 << std::endl;
    std::cout << "4 - 2 = " << 4 - 2 << std::endl;
    std::cout << "4 * 2 = " << 4 * 2 << std::endl;
    std::cout << "4 / 2 = " << 4 / 2 << std::endl;
    std::cout << "5 % 2 = " << 5 % 2 << std::endl;

    std::cout << std::endl;

    std::cout << "(2 + 3) * 4 = " << (2 + 3) * 4 << std::endl;
    std::cout << "(3 + 7) / 4.0 = " << (3 + 7) / 4.0 << std::endl;

    return 0;
}

実行結果

4 + 2 = 6
4 - 2 = 2
4 * 2 = 8
4 / 2 = 2
5 % 2 = 1

(2 + 3) * 4 = 20
(3 + 7) / 4.0 = 2.5

*は掛け算、/は割り算、%は剰余算です。
計算式をダブルクォーテーション""で囲わずに、そのまま書くことで、計算結果を表示できます。

型、変数

変数とは、数値や文字列などの値をいれることができる箱のようなものです。

型名 変数名;

と書くことで変数を定義(作成)することが出来ます。

変数名はアルファベット、数字、アンダースコア_のみ使用できます。

  • 大文字と小文字は区別されるので、abcAbcは別の変数として扱われます。
  • 12abcなど数字から始まる変数名は使用できません。
  • intなど、すでにある名前と重複する変数名も使用できません。

型とは、変数の中のデータが何であるかを表すもので、以下のような種類があります。

型名 扱えるデータ 注釈
int 整数
long 整数 intより絶対値が大きな値を扱える
float 小数
double 小数 floatより精度が高い
bool 真理値 trueかfalse
void 型が無いことを意味する。関数の定義などで使います
char 単一の文字
std::string 文字列 #include <string>が必要

型が同じ場合、以下のように複数の変数を一度に定義できます

int a, b, c;

変数に値を代入するには=演算子を使用して↓のように書きます

変数名 = 値;

↓のように、変数の定義と同時に値をいれることも出来ます。

int age = 20;

↓でコンソールからの入力を格納することも出来ます。

std::cin >> 変数名;

↓のように、変数同士で四則演算をすることも出来ます。

#include <iostream>

int main() {
    int a = 4;
    int b = 2;
    int answer = a + b;
    
    std::cout << a << " + " << b << " = " << answer << std::endl;
}
#include <iostream>

int main() {
    int a, b, answer;
    a = 4;
    b = 2;
    answer = a * b;
    
    std::cout << a << " * " << b << " = " << answer << std::endl;
}

型の種類による四則演算の結果の違い

以下のコードを実行してみましょう

#include <iostream>

int main() {
    std::cout << 5 / 2 << std::endl;
    return 0;
}

実行結果は2.5となるでしょうか?
答えはNoです。実行結果は2となるはずです。
これは、5 / 252が整数、すなわちint型として解釈されているからです。
C++の仕様では、四則演算の結果は計算に使われる値の型と同じ型として扱われます。
つまり、5 / 2の答えは2.5ですが、その答えをint型として表すため、小数点以下が切り捨てされて2になります。

この問題は、以下のように計算に使われる値のいずれかを小数型(float, doubleなど)にすることで防げます。

#include <iostream>

int main() {
    std::cout << 5.0 / 2 << std::endl;
    return 0;
}

型の変換(キャスト)

別の型に変換したい、例えばint型の変数をdouble型に変換したい場合、以下のようにかけます。

(型名)変数名

int main() {
    int a = 3;    
    double b = (double)a;
}

(double)aの部分で、変数aの値をdouble型に変換しています。このことをキャストといいます。
この例のように、明示的にキャストをする以外にも、プログラムが勝手に(暗黙的に)キャストすることがあります。
それが以下の例です。

int main() {
    int a = 3;
    double b = a;
}

aをdouble型に変換せずそのままbに代入しようとしていますが、このコードはエラーになりません。
これは、プログラムが勝手に変数adouble型にキャストしてしまうためです。
このことを暗黙的なキャストといいます。

練習問題

コンソールから数値を受け取り、掛け算した結果を表示するプログラムを作ってみましょう。

入出力例

Enter a: 2.5
Enter b: 1.5
2.5 * 1.5 = 3.75
コンソールから数値の入力がうまくいかなかったら

小数値で計算できるように、変数の型に気をつける

答え
#include <iostream>

int main() {
    double a, b;

    std::cout << "Enter a: ";
    std::cin >> a;
    std::cout << "Enter b: ";
    std::cin >> b;

    std::cout << a << " * " << b << " = " << a * b << std::endl;
}

コメント

コードの中にコメントを残しておきたい場合、以下のように書きます

#include <iostream>

int main() { // main関数を定義する
    std::string name; // 変数nameをstd::string型で定義する
    int age; // 変数ageをint型で定義する

    /*
    コンソールからの名前と年齢の入力を
    name, age変数にそれぞれ格納する
    */
    std::cin >> name >> age;
    
    std::cout << a << " * " << b << " = " << answer << std::endl;
}

コメントの書き方は2種類あります。
//はそれ以降の行末までの文字をコメントアウトします。1行だけコメントを書きたいときに使います。
/* */は、囲われた範囲を全てコメントアウトします。複数行コメントを書きたいときに便利です。

コメントアウトされた部分はプログラムとして解釈されなくなります。

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?