C言語超入門
2日目
2日目
• 簡単な計算プログラムを作る
• printfで数字を表示する
• データ型とは
簡単な計算プログラム
算数の計算問題
1+2=?
?を答える
計算プログラム
A=1+2
Aに1+2の答えを代入する
何が違うのか?
計算プログラム
コンピュータは、
「覚えておくこと」と
「四則演算(+とかx)」
しかできない
計算プログラムは、
A=1+2
のように、ある記号(変数)に計算(+とかx)した答えを覚えさせるこ
と。
C言語で書く計算プログラム
次のプログラムを作ってみる。
(プログラムの始め方は1日目のVISUAL STUDIOを起動するから)
void main(){
int A = 1+2;
printf( “1+2の答えは%d”, A );
}
C言語で書く計算プログラム
プログラムは新規作成>プロジェクトメニューからVisual C++>
Windowsデスクトップ>Windowsコンソールアプリケーション
を選択
プログラムの画面
例えばこんな感じ
プログラムを実行すると
こんな画面が出てくる(Visual Studio 2017 community)
1行目がプログラムの実行結果。
2行目以降はVisual Studioが用意したコメントなのでプログラム
とは関係なし
PRINTFって?
プログラムの2行目
printf( “1+2の答えは%d”, A );
printfは、最初の引数の文字列に2つ目以降の引数の値を使って画
面に文字を出力する関数
%dが、2つ目以降の引数の値を文字として出力するということ
たとえば
プログラム
printf( “2+2=%d”, 4 );
とかくと、出力は
2+2=4
ただし、””で囲まれた部分は、プログラムではなくて文字列ということ。
だから
プログラム
printf(“2+3=%d”, 4);
と書けば出力は
2+3=4
となる。
2つ計算結果を出したい
たとえば 4+2の計算結果と4-2の計算結果の両方を出したいとき
プログラム
int A = 4+2;
int B = 4-2;
printf( “4+2=%d, 4-2=%d”, A, B );
とかくと、出力は
4+2=6, 4-2=2
となり、2つの計算結果を1つの文字列として表示できる。
もちろん
printf( “4+2=%d”, A);
printf( “4-2=%d”, B );
とかいても良い。
ただ、出力結果は
4+2=64-2=2
となる。そこで改行もしたいので
2つ計算結果を出したい
printf( “4+2=%dn”, A);
printf( “4-2=%dn”, B );
と書くと出力結果は
4+2=6
4-2=2
となる。
nは改行の意味。
は日本語キーボードでは、一番右下の「ろ」を入力する
計算プログラムの分解
int A = 1 + 2;
C言語(大概のプログラミング言語)は、単語をスペースで区切って全部半
角で書く。
int□A□=□1□+□2;
これはOK
intA □=□1□+□2;
これは、intとAの間にスペースがないからintという単語がわからなくなって
しまいNG
int □A=1+2;
これはOK
=や+などの算数で使う記号はスペースなしでもOK
計算プログラム分解
セミコロン(;)は、一つの命令がそれでおしまいということ。
int□A =1+2;
Aに1+2の計算結果を入れるという命令でおしまい。
例えば
int A = 1+2;
int B = 2+3;
と書いたら、Aに1+2の結果を覚えておく(代入)が一つ目の命令
Bに2+3の結果を代入するのが2つ目の命令
だから
int A=1+2;int B = 2+3;
と書いてもOKだけど
int A=1+2
int B=2+3
と書いたらNG
1つ目の命令と2つ目の命令の区切りがわからない。
改行では、命令の区切りにはならない
間違えても
プログラムをコンパイルするときに
コンパイラが
よくわからない!
というので、間違っても大丈夫。
間違えたら、直す。
怖いのはコンパイラが間違いだとわからない間違い。
たとえば
1+2を計算したいのに
int A = 1+3;
と書いてしまうとか。
再び1+2
int□A =1+2;
intって?
integerのこと。
整数。
Aという名前の整数に1+2の結果を覚えとけ!ってこと。
このintをデータ型という。
データ型
int□A =1+2;
Aという名前の整数に1+2の結果を覚えとけ!
と言われたコンピュータは、結果を覚えておくために、
脳みそ(メモリ・記憶サイズ)
をどれくらい使えばいいのかがわからない。
コンピュータは、言われたこと(プログラムされたこと)しかできない。
どれくらいの脳みそを使うかも教える。
なぜ?
人間が覚えていられる数値が限られているように(円周率とか)、コン
ピュータも覚えていられる数値が限られている。
どのくらい覚えておけばいいかも、プログラムで教える。
どのくらい覚えてられる?
すごくたくさん。
コンピュータが覚えるというのは、いっぱいあるスイッチをONとOFFにして
おくこと。
例えばスイッチが2つしかないなら、
の4種類
コンピュータはこれを例えば0から3だと覚える。
00 01 10 11
スイッチが4個なら?
スイッチのON/OFFを0と1で表すと
0000 0001 0010 0011
0100 0101 0110 0111
1000 1001 1010 1011
1100 1101 1110 1111
の16種類。0から15
スイッチが8個以上なら?
スイッチ8個 → 256種類
スイッチ16個 → 65536種類
スイッチ32個 → 4294967296種類
スイッチ64個 → 9223372036854775808 x 2種類
・
・
このスイッチ1つをビットと呼ぶ。
intはスイッチ32個(32bit)
データ型の種類とスイッチの数
整数にはいくつかデータ型がある。
char → 8bit(256種類)
short → 16bit(65536種類)
int → 32bit(4294967296種類)
とりあえず、整数はこの3つを覚えておけば大丈夫
でも、コンピュータによってこの組み合わせは変わる。
intが16bitだったり。
けれど、パソコンと呼ばれるコンピュータは大概大丈夫。
データ型と符号
char → 8bit(256種類)
は256種類の値しかとれない。
整数に256種類しか使えないということは、0を基本に考えると
char → -128~127
正の整数のほうが1つ少ない。
負の整数が必要なければ
unsigned char → 0~255
符号なし
unsigned は符号なしを表す。
char -> 8bit(256種類) -128~127
unsigned char → 8bit(256種類) 0~255
組み合わせを整数のどの数値にあてるかをプログラムする必要がある。
整数のデータ型の種類と値の範囲
char -> 8bit(256種類)
char : -128~127
unsigned char : 0~255
short -> 16bit
short : -32768~32767
unsigned short : 0~65535
int → 32bit
int : -2147483648 ~ 2147483647
unsigned int : 0 ~ 4294967295
値の範囲はchar,shortくらいまでは覚えておきたいけど2進数がわかるようになれば、覚えて
なくても大丈夫。
もどって
void main(){
int A = 1+2;
}
これで、1+2の結果を安心してAに覚えておける。
void main(){
char A = 100 + 100;
}
としてしまうとAは200を覚えておけなくなるので注意。
Aって?
void main(){
int A = 1+2;
}
このAは覚えておく場所。「変数」と呼ぶ。
Aって?
たとえば
void main(){
int A = 1+2;
A = 2+3;
}
とすると、Aには5が記憶されている。3を覚えてからすぐ5を覚えな
おす。
すぐ変わる。
変数。
変数の名前がA
Aって?
Aは変数の名前
「変数名」と呼ぶ。
変数名
ちょっとだけ決まりがある。
1.数字で始まるのはダメ。
int 1a = 2+3;
とか
2. プログラムで使う文字はだめ。
int int = 2+3;
変数名がintとか
間違えたらコンパイラが教えてくれるから、そんなに気にしなくてもOK
変数再び
int A = 2+3;
A = 3+4;
変数Aに2+3の結果を覚えたあと、もう一度変数Aに別の計算結果を代
入するとき。
int Aと1行目ですでにAのデータ型(使う記憶領域の大きさ)を、プロ
グラムに指示してあるから、以降はAにデータ型をつける必要がない。
変数再び
int A = 2+3;
int A = 3+4;
これはNG
変数名Aという名前の記憶領域が2つできてしまうから。
でもコンパイラが教えてくれるから大丈夫。
変数再び
int A = 1+2;
int B = A + 1;
これはOK
一度覚えたAをそのあと、いろいろ使える。
上はAは3で、Bは4。
プログラムしてみる
void main(){
int A = 2+3;
printf( “2+3 = %dn”, A );
}
上のプログラムを実行すると計算した結果Aが
2+3 = 5
として表示される。
いろんな計算
使える計算
+
-
*
/
%
の5種類
*は掛け算
/は割り算
%は余りの計算
他にも
()
が使える。
int A = 1+2*3;
int B = (1+2)*3;
は
Aが7、Bが9となる。
別に意味もなく
int A = 1+(2*3);
と書いてもOK
関数
printfは、C言語で簡単に使える関数
(C言語標準ライブラリに含まれる)
自分でも作れる。
void func(){
int a = 1+2;
}
とか。
引数
void func(int a){
int b = a+2;
}
関数の()の部分に変数を
void func(int a)のように書くと、その関数を呼び出すときに、値を渡す
ことができる。
引数
void func(){
int b = 1+2;
}
だと、1+2しかできないが
引数
void func(int a){
int b = a+2;
}
という関数を
void main(){
int val1 = 3;
func( val1 );
int val2 = 5;
func ( val2);
}
のように使うと3+2も5+2も計算することができる。
引数
void func(int a, int b){
int c = a+b;
}
という関数を
void main(){
int val1 = 3;
int val2 = 5;
func( val1,val2 );
}
のように使うと3+5も計算することができる。
関数の戻り値
いままでは
void func(int a, int b){
int c = a+b;
}
次は
int func( int a , int b ){
int c= a+b;
return c;
}
関数の戻り値
int func( int a , int b ){
int c= a+b;
return c;
}
の最初のintは関数funcの戻り値のデータ型となる。こうすると関数を呼
び出した結果を戻すことができる。
たとえば
void main(){
int D = func( 1, 2 );
printf( “1+2=%d”, D );
}
関数の戻り値
void main(){
int D = func( 1, 2 );
printf( “1+2=%d”, D );
}
の出力結果は
1+2=3
となる。
関数を実行した結果を新しく値として使うことができる。
関数の戻り値
void main(){
int D = func( 1, 2 );
int E = func( D, 3 );
printf( “ %d + 3 = %d”, D, E );
}
の出力結果は?
関数の戻り値
void main(){
int D = func( 1, 2 );
int E = func( D, 3 );
printf( “ %d + 3 = %d”, D, E );
}
の出力結果は?
3 + 3 = 6
となる。
関数の戻り値
実際のプログラムはこんな感じ
演習問題
1.100+200を計算してその結果をprintfを使って出力する
2.足し算をして結果を戻り値とする関数を使って、100+200を計算し
てその結果をprintfを使って出力する

C day2