をるふちゃんのブログ

めもっぽいやつ

文系の女の子にプログラミングを教える ①

いんとろだくしょん

話のなりゆきで「プログラミングやってみる?笑」と聞いてみたところ日頃私が何やってるのか興味あったのか、やぶさかでもない反応。
というわけでWandbox使ってとりあえず触ってもらいました。

通話はできない状況だったのでLINEとWandboxだけという制約で。

実行環境

Wandbox https://wandbox.org/

をパソコンで開いて、コードを上に書いて Run をクリックすればOK。
途中から標準入力(Stdin)も使います。

Stdinは隠れてるのでマウスでクリックすると入力できるようになったりする。

というわけで本編

とりあえず投げてみた

#include <iostream>

int main(){
    std::cout << "いやプログラミング簡単やで" << std::endl;
}

[実行結果]

いやプログラミング簡単やで

f:id:wolf_cpp:20170913104810p:plain

コメントの書き方

というわけで食いつきが良かったので続きを送ってみた。

#include <iostream>

int main(){
    std::cout << "できたようだね" << std::endl;
    //これがコメント。
    //プログラムとは関係無いことを書いても大丈夫
    
    //コメントが一行だけの場合はこうやってスラッシュを2本続けて書いて、そこから行末まで
    return 0;//←なのでこの return 0; は有効になるからね
    
    /*コメントがめっさ長いときはスラッシュの後にアスタリスクを続けて書いて始めるタイプの
    コメントをつかう。この場合は改行してもコメントは有効のまま
    終わるときは先にアスタリスク、その後にスラッシュ*/
}

f:id:wolf_cpp:20170913104941p:plain

何がすごいのかはわからないけど次。

std::cout を複数使う

#include <iostream>

int main(){
    std::cout << "ちなみに";
    std::cout << "何個書いても大丈夫。";
    // std::endl; は改行させる意味がある。
    std::cout << std::endl;//改行だけってのもできる。
    
    /* std::cout が文字を出力する意味を持ってて、
    「<<」の後に文字を書けばそれが出力されるし、改行専用のやつ( std::endl )も同様な扱いになるのね。*/    
}

[実行結果]

ちなみに何個書いても大丈夫。

f:id:wolf_cpp:20170913105100p:plain

ほいほい、次行きますよ。

<< で繋げて書く

#include <iostream>

int main(){
    std::cout << "また、実はなんどもstd::coutを書く必要はなくて、" << "これでも大丈夫。" << std::endl;
    //ちなみに、日本語で言う「。」に相当するものはC++では「;」セミコロン。
    //セミコロンがなければ改行してもその「文」は終わりにならない。
    std::cout << "だからこういうことも"
        << "できる。"
        << "全く問題はない。";
    //もちろんだけど文字の途中とかわけのわからんところで改行するのは無しね
}

[実行結果]

また、実はなんどもstd::coutを書く必要はなくて、これでも大丈夫。
だからこういうこともできる。全く問題はない。

f:id:wolf_cpp:20170913105350p:plain

初心を思い出してきたよ…。あの頃は良かった(何が)

はじめての、変数

#include <iostream>

int main(){
    //さてせっかくなのでもう少しプログラミングっぽいことをしてみると、
    
    int a;
    /* ↑ これは数字を保存できる「モノ」。intはその「モノ」が整数だよーっていう意味。
    aってのは適当につけた名前。数字から始まる名前はダメ。大文字と小文字は区別される。
    それ以外で使える記号は「_」アンダーバーだけ。
    そしてこれを「変数」と呼ぶよ。
    
    変数には「型」ってのがあって、例えば整数とか、小数とか英数記号文字とか、文字列とか、まあ色々あるわ。
    今は int だけ覚えとけばいいよ
       
    んで、変数を使うにはこれから使うよーっていう「宣言」をしなきゃいけないんだけど、つまりそれが、
    
    int a;
    
    ってやつ。
    int型の変数を新登場させますよ、名前は「a」だよ
    
    ってとこかな。日本語にすると。
    
    で、その 変数「a」に数字を覚えさせてみようか。*/
    
    a = 1;
    
    /*こうするとaは1っていうデータを覚えてていてくれる。
    なのでそれを出力してみると*/
    
    std::cout << "aの値は " //←出力結果がわかりやすいように日本語つけといた
        << a //ここに変数を置いてもいいの。その場合、出力に変数の中身が送られるのね。
        << std::endl; //あとは改行。つけたくなる。
        
}

[実行結果]

aの値は 1

f:id:wolf_cpp:20170913105701p:plain

数学……なのかうん。

代入とか、加算とか

#include <iostream>

int main(){
    //int a = 0;
    /* 宣言するそばから代入することもできるよん。
    あ、そうそう、 = でデータをぶちこむことを代入って言うよ。
    イコールの左側に変数名、右側にデータ書いとけばうまくいく。
    
    さてさて、今度はもう少し有効活用してみようか。*/
    
    int x = 5;
    int y = 4;
    /* 5 + 4 はいくつかな? 9 だよね笑。
    これをパソコンにやらせよう*/
    int answer = x + y;
    /* 一度宣言したら変数は基本的に「}」のところまで有効なので、こういうこともできるのね
    あとはanswerはどうやって表示したらいいかな?
    自分で続き書いて提出してみて! */
    
    //----------------
  
    
    
}

f:id:wolf_cpp:20170913105858p:plain

しばらく詰まりましたね。
まず送られてきたのがこちら。

    std::cout << "answer = x + y"
              << std::endl;

そうじゃない。

std::cout の出力について

[補足説明]

説明はしなくていいから answer だけ出力してみ
何も考えず answer を std::cout に突っ込んで見れば良いのさ

f:id:wolf_cpp:20170913110110p:plain

そして送られてきたのがこちら。

    std::cout << "answer"
              << std::endl;

あーーーーー。。。という気分。
これは私が悪い。

[補足説明]

いい忘れてたわ。
" "で囲っちゃうと、文字列扱いになるの。
囲わないと変数名として解釈されるっていうね。

f:id:wolf_cpp:20170913110317p:plain

ごめんて。

f:id:wolf_cpp:20170913110427p:plain

    std::cout << answer
              << std::endl;

その通りですお疲れ様です

四則演算など

#include <iostream>

int main(){
    /*
    C++の整数同士の演算では以下の記号が使えるよん
    
    + たす
    - ひく
    * かける
    / わる(ただしあまりは切り捨て)
    % 剰余(わっった時のあまりだけが結果になる)
    
    この5個を使って計算してみよ!!
    
    変数名、出力の方法はおまかせっ。
    
    */
    
}

f:id:wolf_cpp:20170913110615p:plain

f:id:wolf_cpp:20170913110642p:plain

f:id:wolf_cpp:20170913110712p:plain

f:id:wolf_cpp:20170913110817p:plain

そして飛んできたのがこちら。

#include <iostream>

int main(){
    int a = 7;
    int b = 2;
    int c = 8;
    
    int d = a + b;
    
    int e = b - c;
    
    int f = c * a;
    
    int g = c / b;
    
    int h = a % b;
    
    std::cout << d
              << std::endl
              << e
              << std::endl
              << f
              << std::endl
              << g
              << std::endl
              << h
              << std::endl;
    
}

[出力結果]

9
-6
56
4
1

そこで改変して模範解答として送り返したのがこちら。

#include <iostream>

int main(){
    int a = 7;
    int b = 2;
    int c = 8;
    
    int d = a + b;
    
  int e = b - c;
    
    int f = c * a;
    
    int g = c / b;
    
    int h = a % b;
    
    std::cout << "a = " << a
              << "\nb = " << b
              << "\nc = " << c
              << "\n\na + b = " << d
              << "\nb - c = " << e
              << "\nc * a = " << f
              << "\nc / b = " << g
              << "\na % b = " << h << std::endl;
    
}

[出力結果]

a = 7
b = 2
c = 8

a + b = 9
b - c = -6
c * a = 56
c / b = 4
a % b = 1

f:id:wolf_cpp:20170913111206p:plain

f:id:wolf_cpp:20170913111335p:plain

うん知ってた。

std::endl と \n について

ここで補足説明。

std::endlはバッファフラッシュという働きもあって、つまりぶっこんだのが溜まってきたところでそれを反映させる効果もあるのね
だから毎回 endl を使わないで \n で済ませてしまったほうがいい、ということ。

ちなみにstd::endlを使ってもパフォーマンスに影響はほとんど出ないよっと。

あれ、影響出るのかな?少なくとも初学者レベルでは出てこないけど。
あとで計測してみますか。

[2017_9-13_15-34 追記] 計測したところ明らかにパフォーマンスに影響は出たが、初学者レベルで気にするものでもないと判断。

\ という記号について

日本語環境ではバックスラッシュ「\」は「¥」という記号で表されることが多いです。
現時点ではどちらも同じ意味と思って大丈夫。

using について軽く。

さて続き。
f:id:wolf_cpp:20170913111706p:plain

#include <iostream>

int main(){
    using std::cout;
    int a = 7;
    int b = 2;
    int c = 8;
    
    int d = a + b;
    
    int e = b - c;
    
    int f = c * a;
    
    int g = c / b;
    
    int h = a % b;
    
    cout << "a = " << a
              << "\nb = " << b
              << "\nc = " << c
              << "\n\na + b = " << d
              << "\nb - c = " << e
              << "\nc * a = " << f
              << "\nc / b = " << g
              << "\na % b = " << h << std::endl;//ここはつけないといけない。
                                                //もし外したければ別途、 using std::endl;が必要
    
}

ちなみにまだ名前空間については触れていない。混乱しそうだったので。

f:id:wolf_cpp:20170913111758p:plain

標準入力を使う

#include <iostream>

int main(){
    int i;
    std::cin >> i;
    //これでStdinに入力した内容が読み込まれる
    std::cout << i;
}

[実行結果] 15 をStdinに入力した場合

15

f:id:wolf_cpp:20170913114356p:plain

WandboxではStdinの欄があってインタラクティブには動かないのが難点ですが。
この辺はGCC入れたときにでも改めて扱うかなー。

f:id:wolf_cpp:20170913112001p:plain

はいはい、じゃあ次。

if文による条件分岐

#include <iostream>

int main(){
    using std::cout;
    using std::endl;
    int i;
    std::cin >> i;
    
    if( i > 10 ){
        cout << "10よりでかいぞ" << endl;
    }
    
}

[実行結果①] 15 をStdinに入力

10よりでかいぞ

[実行結果②] 5 をStdinに入力




[実行結果③] 10 をStdinに入力




10から下では何も出力されない。

f:id:wolf_cpp:20170913112125p:plain

良さげなのでさくさく行ってみよう。

if-elseを使ってみる

#include <iostream>

int main(){
    using std::cout;
    using std::endl;
    int i;
    std::cin >> i;
    
    if( i > 10 ){
        cout << "10よりでかいぞ" << endl;
    }else{
        cout << "10よりでかく……ない。つまり10から下ってことになるね" << std::endl;
             //                                                              ↑
             //いい忘れてたけど using したとしても、あえてstd::をつけて問題はないからね
    }
    
}

[実行結果①] 15 をStdinに入力

10よりでかいぞ

[実行結果②] 5 をStdinに入力

10よりでかく……ない。つまり10から下ってことになるね

f:id:wolf_cpp:20170913112711p:plain

んじゃ次ー。

if-else ifの流れを知る

#include <iostream>

int main(){
    using std::cout;
    using std::endl;
    int i;
    std::cin >> i;
    
    if( i > 10 ){
        cout << "10よりでかいぞ" << endl;
    }else if( i < 9 ){
        cout << "10よりでかく……ない。そして9より下。" << endl;
    }else {
        cout << "ということは10か9だな?" << endl;
    }
    
}

[実行結果①] 15 をStdinに入力

10よりでかいぞ

[実行結果②] 5 をStdinに入力

10よりでかく……ない。そして9より下。

[実行結果③] 10 をStdinに入力

ということは10か9だな?

[実行結果④] 9 をStdinに入力

ということは10か9だな?

ここで終わりにした。

f:id:wolf_cpp:20170913115600p:plain

おわりに

意外となんとかなるもんですね。
興味も持ってもらえたようなので次は for とか教えたいところ。

f:id:wolf_cpp:20170913114717p:plain

書き終えましたよー。