# 講習220420.C ## プログラムを書いてみよう とりあえず書いてみよう(自分で写してね的なことを言う) ```c #include<stdio.h> int main() { printf("Hello World\n"); return 0; } ``` コンピュータはプログラムの文字列を直接理解することはできません. コンパイラという種類のソフトを用いることで, Cで書いたコードを機械に読ませるためのデータに変換します. ```shell $ cd 作業してる場所 $ gcc ./書いたファイルの名前 $ ./a.out ``` ### 解説(サラっと) ```c #include<stdio.h> ``` → プログラムの最初に書く「おまじない」 ```c int main(){ // hogehoge } ``` → C言語で書いたプログラムは最初に`main(){}`で挟まれた命令をやってくれる ```c printf("出したい文字\n"); ``` → 画面に文字を出してくれる(詳細は後述) ```c return 0; ``` → プログラムの最後に書く「おまじない」 (本当は数字にも意味がある) → セミコロン ## 値 1. 数は値です.文字は値です.文字列も値です. 2. 数字を書けばそれは整数として扱われます.(`123`とか`456`とか) 数字に1個点をつけたら小数として扱われます.(`12.3`とか`456.0`とか) 整数と小数は***全くの別物***です. 3. `'a'`のように`'`で囲まれたものは文字です. `'abc'`は不正です.こう書くと逮捕されます(ガチ).`'3'`は文字です. 4. `"hoge"`のように`"`で囲まれたものは文字列です. 文字列は文字が並んだものです.(今はprintfでしか使わないけど) `"3"`,`"123"`は文字列です. 5. `'`と`"`は別の文字なので`''`とやらないようにしましょう. 6. `'\n'`は改行文字といい,改行を表します. ![kaigyou.c](https://i.imgur.com/7ajdDCd.png) ## 練習問題1 hello worldのプログラムを改変し, 自分の名前を(ローマ字で)画面に出してみよう. ## 変数 数字や文字を入れておける「箱」のようなもの. ![](https://i.imgur.com/vprBuwY.png) 主人公のHPとかの数値を保存するための変数と, ゲームのマップを読み込むための変数では必要になる量が違う. そこまで極端な話ではないが, 箱(と値)の種類はサイズ・用途別にいくつか種類があって, それぞれ以下のような名前になっている. - int : 整数 - float : 小数 - char : 文字(細かくいうと半角英数字を1文字) - etc… 変数を宣言(=箱を用意)するには,以下のようにする. ```c 型名 変数名; ``` intのaという変数を宣言するときは以下のようになる. ```c int a; ``` ### 変数を使う 変数の中身を更新するには,`=`(代入演算子,名前は覚えなくていい)を使う. 例えば,intのaの中に12345を入れたい場合は以下のようにする. ```c int a; a = 12345; ``` また,変数の内容を知りたいときは,printfを使う. printfは文字列を出力するだけでなく, プログラム中の変数の中身を出力する用途でも使われる. ```c int a; a = 13579; printf("%d\n", a); ``` これにより`13579`と出力されるはずだ. ## 計算しましょう 試しに下のやつを打ってみましょう. ```c #include <stdio.h> int main(){ int x; x = 5; x = x + 3; printf("%d\n",x); x = x - 3; printf("%d\n",x); x = x * 3; printf("%d\n",x); x = x / 3; printf("%d\n",x); x = x % 3; printf("%d\n",x); return 0; } ``` ### 算術演算子 (計算の記号) * `+`は足し算です. * `-`は引き算です. * `*`は掛け算です. * `/`は割り算です. * `%`は割り算の余りです. #### 割り算はややこしい! - 整数で割ると答えは整数,余りは切り捨てられる. - 小数で割ると答えは小数.(普通の割り算) - 整数を小数で割ってさらに整数で割ると結果は整数. 検証してみる. ```c #include<stdio.h> int main() { int seisu; float syosu; seisu = 4 / 3; syosu = 4.0 / 3.0; // %dではなく%fなのに注意. printf("%f\n", seisu); printf("%f\n", syosu); return 0; } ``` 極度解が違う!! ### なんかへんなの `x = x + 1`のような場合は,特別に`x += 1`のように表わされる. 同様に,各演算子についてもこれがいえる. ```c #include<stdio.h> int main(){ int x; x = 5; x += 3; printf("%d\n", x); x -= 3; printf("%d\n", x); x *= 3; printf("%d\n", x); x /= 3; printf("%d\n", x); x %= 3; printf("%d\n", x); return 0; } ``` ## 条件式 条件/*(命題)*/というのは,それが正しいか正しくないかがはっきりわかるやつのこと. 真か偽か,正しいか正しくないか,良いか悪いか,生きるか死ぬか. この仕組みにより,プログラムの動作をプログラムの実行中に変更することができる. レールに敷かれたコードを歩むプログラムなんてクソだ. ### 条件式 : ズバリ 0が偽,それ以外は全部真. ## 演算子 : おかわり 演算子には条件式を表現するためのものがある. こういう系のやつは,条件が成立(つまり真)したときに`1`を,しなかった(=偽)ときに`0`を返しがち. こいつらは,ある条件が成立したときに真を返す <!---あー1ってそういう---> ### はぁい - `!` 真偽値をひっくり返す (真は偽になり,偽は真になる) - `==` 左右が等しいとき,`1`となる - `!=` 左右が等しくないとき,`1`となる - `<` (`<=`) 左辺が右辺より小さい(左辺が右辺以下)とき,`1`となる - `>` (`>=`) 左辺が右辺より大きい(左辺が右辺以上)とき,`1`となる ## 条件式の使いみち C言語には制御文というものがある. 条件式は主にそこで使われる. ////////////////////////////////////// WORKING ///////////////////////////////////////// ### if文 条件式の値によって,プログラム中で実行する内容を切り替える. ```c #include<stdio.h> int main() { int x; x = 16; if(x==256){ printf("That is good"); } return 0; } ``` #### 条件分岐(if文) ```c if(/*条件式*/){ //条件式がtrueの時に実行したい処理 } ``` まずtrueってなんや? <!-- #### 真偽値 真偽値は簡単に言うとそれが正しいかどうかを表します。数学的に言うと真か偽かを表します。 正しいなら**true**で間違っていたら**false**です。何も難しいことはありません。 じゃあ上のif文まで話を戻しましょう。 if文は条件式がtrueの時に{}の中の処理を実行します。 条件式には比較演算子というものを主に使います。 ではここで比較演算子の種類を確認しましょう!! --> <!-- #### 比較演算子の注意点 基本的には数学と同じですが絶対に気を付けてほしいことがあります。 じゃあこのコードを見てどこが間違っているか当ててみてください。 ```c= #include<stdio.h> int main(){ int a = 2; if(a = 1 + 1){ printf("aは%dです\n", a); } return 0; } ``` わかりましたか? 正解は```if(a = 1 + 1)```のところです。 プログラミングの世界では=は値を代入することを意味します。 等しいことを示したいときは必ず==を使うようにしましょう。 ↑のコードの正しい例はこんな感じです。 ```c= #include<stdio.h> int main(){ int a = 2; if(a == 1 + 1) //true { printf("aは%dです\n", a); } return 0; } ``` --> では条件式が偽のときはどうするの?? そんなときは**else**を使います。 さっきのコードを例に考えてみましょう。 ```c= #include<stdio.h> int main(){ int a = 2; int b = 0; if(a == b) //false { printf("aはbと等しい\n"); }else{ printf("aはbと等しくない\n"); } return 0; } ``` ```else```は基本的にif文とセットで使わなければなりません。 ```else```の中に書いた処理は上にある条件式が```false```の時だけ実行されます。 これだけで満足いく処理が書ければいいのですが現実はそうとは限りません。 さらに条件を追加したい人が多いはずです。 そんな人のために```else```は条件式も追加で書くことができます。 条件式をプラスして書くときは``` else if(/*条件式*/)```と書きます。 このコードを見てください。 ```c= #include<stdio.h> int main(){ int a = 8; if(a == 2) //false { printf("a = 2\n"); }else if(a == 8){ printf("a = 8\n"); } return 0; } ``` これを実行すると```a = 8```と出力されます。 このように```else if```を使うといくらでも条件分岐して処理を行うことができます。 --- おいこれじゃあ条件式は一つしか扱えねえじゃねえかC言語は欠陥か?? と思った人もいるかもしれません. でも大丈夫!そんなせっかちな人のための書き方もあります!! ここでは主に使われる2つの書き方について学んでいきましょう!! #### 1. and 条件式1が```true```かつ条件式2も```true```の時だけ処理を実行したいときは 記号```&```を使って```(条件式1 && 条件式2)```と書きます。 使い方はこんな感じです。 ```c= #include<stdio.h> int main(){ int a = 6; if(a % 2 == 0 && a % 3 == 0) //両方true { printf("aは2でも3でも割り切れる\n"); } return 0; } ``` 二つの条件式がともに```true```の時のみこのif文の中身は実行されます。 #### 2. or 条件式1と条件式2のどちらかが```true```の時に処理を実行したいときは記号```||```を使って```(条件式1 ||(条件式2)```と書きます. 使い方はこんな感じです. ```c= #include<stdio.h> int main(){ int a = 9; if(a % 2 == 0 || a % 3 == 0){ printf("aは2か3の倍数です\n"); } return 0; } ``` 条件式のどちらかが```true```なら中の処理が実行されます. aは3でしか割れませんが,```aは2か3の倍数です```と出力されます. ## 繰り返し文 ### while文 まずこのコードをみてください. ```c= #include<stdio.h> int main(){ printf("Hello World\n"); printf("Hello World\n"); printf("Hello World\n"); printf("Hello World\n"); printf("Hello World\n"); printf("Hello World\n"); printf("Hello World\n"); printf("Hello World\n"); printf("Hello World\n"); printf("Hello World\n"); return 0; } ``` ここまで来た人はわかると思いますが```Hello World```と10回出力するコードです. でも同じコードを10回も書くのは面倒だしとても見づらいですよね???? そんな人のために用意されている構文があります. それが**while文**です. 見てもらったほうが早いかもしれないのでまずこのコードを見てください. ```c= #include<stdio.h> int main(){ while(/*条件式*/){ //条件式がtrueの時に繰り返し実行したい処理 } return 0; } ``` これがwhile文です. それでは```Hello World```と10回出力するコードwhile文を使って書いてみましょう. ```c= #include<stdio.h> int main(){ int i = 0; while(i < 10){ printf("Hello World\n"); i++; } return 0; } ``` このようにwhile文は,()中の条件を満たす限り{}の中の処理を繰り返し実行します. ここではwhile文の最後に```i++```の処理を加えることで一回繰り返すごとにiの値を1ずつ増やし続けることで10回繰り返した後にループを抜けるようにしています. ちなみに条件式のところを```while(true)```と書くと無限ループに至ります. 無限ループなんていつ使うんだよと思うかもしれませんがこいつをうまく使う方法があります #### break文,continue文 ループ構文の中につっこむもの - `break` : ループから出るやつ - `continue` : その後の処理を全部スキップして次のループを始めるやつ --- // scanfはABCチャレンジ時にガチおまじないとして教える // ポインタ・複数returnのときに一緒に教える ```c scanf("%d",&x); ``` →画面に入力された数字をxにつっこむ %dは「画面に入力されるのは整数ですよ〜」と伝える意味を持ってる \ (xの前についてる '&' は? →scanfのときに使う,変数の「おまじない」)\ ~~えっ!?プログラミングって「おまじない」,多すぎ!?!?~~ ```c printf("%dなんちゃら",x); ``` →%dなんちゃらと画面に出す %dはprintfでは整数を出すのに使う どんな整数?→後ろにxって書いてあるからxを出すんやで これで入出力ができるようになりました!