University of Electro-Communications Human Interface section
基礎プログラミングおよび演習
第2回
復習 C言語の基本
#include <stdio.h>
int main(int argc, const char* argv[]){
// insert code here
printf (“Hello, World! ¥n”);
return 0;
}
C言語では、この部分に書いた プログラムが
上から順に実行されます。
// insert code here
printf (“Hello, World!¥n”);
return 0; //から行末までは、コメント コンパイラはコメントを読みません。 他の人がプログラムを読むときに助け なるようなことや、自分のためのメモを 書くために使います。 このコメントは、Xcodeが書いたコメント で、「ここにコードを挿入してください」と いうことです。
復習 C言語の書き方
// insert code here
printf (”Hello, World! ¥n”);
return 0; printf という関数 (function: 機能)を 呼び出しています。 printf( ”出力したい文字列” ) ; 関数の名前 関数の引数 文の終わりをあらわす セミコロン 関数 printf は文字列を出力します。 ¥n は表示すると、改行になります。 MacとPCでフォントが違うので、 Macでは、¥nの代わりに、 n=バックスラッシュn になります。
復習 上から順に実行される
上から順に実行されることを確かめるために、も
う1つだけ関数を覚えましょう。
#include <stdio.h>
int main(){
printf (”Plase hit ENTER key¥n”); getchar(); printf (”Thankyou¥n”); } 1文字入力 [ENTER]キーが押される まで、キーボードからの文 字入力を待ちます。 [ENTER]が押されたら、 最初に入力されたキーを 読み出します。 上から順に実行されます
University of Electro-Communications Human Interface section
式とprintf()
C言語は、式が計算できます。
printf() は式の計算結果を表示できます。
z printf(文字列 , 式) として、文字列の中に、 %d を書くと、 %dが、式の値で置き換えられて表示されます。 #include <stdio.h> int main(){ 10+20*3; } #include <stdio.h> int main(){ printf(”計算結果は %d です。 ¥n ”, 10 + 20*3); } 計算結果は70 です。 20を3倍して、10足す 計算をしてくれますが、これでは結果がわかりません 出力:式とprintf()
z
%dをいくつも書くと、printf(”文字列” , 式1, 式2, 式3
…) の式1、式2…が順番に%dに入ります。
#include <stdio.h> int main(){ printf(”式1: %d 式2:%d ¥n ”, 13, 10 + 20*3); } 式1:13 式2:70 出力:整数の式
C言語の計算では、自動で実数になりません。
z
計算結果が実数になる場合は、
小数点以下を切捨てます。
printf(” %d ¥n ”, 5 / 2 ); printf(” %d ¥n ”, 5 / 2 *2 ); 2 4出力:
5/2は、2.5だけれども、小数は切り捨て 5/2*2は、切り捨ててから2倍するので式の例と値
2
(9/2-3)*2
4
9/2
22
2*(2+8)+(5-3)
5
5
値
式の例
実数の式
実数を計算したいときは、 5.0/2 か、 5/2.0ように、最初から2つの 数のどちらかを実数にします。 実数を表示するためには、 %f を使います。 z %dと%fを間違えてもエラーメッセージは出ません z ですが出力は変になります。 printf(” %f ¥n ”, 5.0 / 2 ); printf(” %f ¥n ”, 5 / 2.0 *3 ); printf(” %f ¥n ”, 5 / 2*3.0 ); 5.0/2 は、2.5 5/2.0も2.5で、2.5 * 3 は7.5 5/2は、整数なので切り捨てで2 なので、2*3.0 は6.0 printf(” %d ¥n ”, 2.5 ); printf(” %f ¥n ”, 2 ); printf(” %f %d %d ¥n ”, 1, 2, 3, 4 ); 1074003968 0.000000 0.000000 3 4 出力: 整数2を%fで表示しようとしたので変に その後の%d にまで影響が… (0.000000 2 3 になりそうなものですよね) %fは整数を2個食べちゃいます。式の計算の順番
式の計算の順番は
z
数学と一緒
a+b*c なら、まず b*c をしてから aを足す。
z
左から右
a+b+cは、aとbを足してから、cを足す。
順番を変えたいときは()を使う
printf(” %f ¥n ”, 5 / (2*3.0) ); 2*3.0は、6.0。 5 /6.0 は、0.8333333…式の例と値
実数 10.0 1+9 + 0.0 実数 0.5 5.0/2-5/2 実数 5.0 1.0*5 実数 4.5 9.0/2 実数 2.0 4.0/2 実数 2.3 2.3 整数 整数 整数 整数 型 2 (9/2-3)*2 4 9/2 22 2*(2+8)+(5-3) 5 5 値 式の例 整数か実数かの 区別をC言語では 型と言います関数と式
式には、関数も使えます。
z
数学関数を使うには、#include が1行増えます
#include <stdio.h> #include <math.h>
int main(int argc, const char* argv[]){
// insert code here
printf (”sin 1.5 = %f¥n”, sin(1.5));
return 0; } 標準入出力を使うことを宣言 数学関数を使うことを宣言 無くても動きますが、ないと コンパイラは、printf()やsin() がどんな関数か知らない状態 になります。 その結果、エラーメッセージが 不親切になってしまいます。 sin(θ)のθ=1.5のときの値を計算してくれます 0.997495
関数いろいろ
C言語で使える数学の関数とその意味
z
上記は、どれも実数値をとります。
z 関数はとてもたくさんあります。自分で作ることもできます。 printf (”%f¥n”, sin(1.5)/2); printf (”%f¥n”, cos(1.5)/2); 0.498747 0.035369 1.5はπ /2よりちょっと小さいので、 sin(π /2)=1.0 /2 に近い値のはず cos(1.5)は0に近い値でしょう整数値をとる関数
乱数を返す関数 rand()
0~2147483647の間のランダムな整数値を取ります。
#include <stdio.h>#include <stdlib.h>
int main(int argc, const char* argv[]){
printf (”%d¥n”, rand()); printf (”%d¥n”, rand()); printf (”%d¥n”, rand()); return 0; } rand() を使うことを宣言 16807 282475249 1622650073 ランダムな整数を表示
整数値をとる関数
0.0~1.0を得るには
printf (”%d¥n”, rand() / 2147483647); printf (”%f¥n”, rand() / 2147483647.0); 0 0.131538 これだと、0ばっかり 1/2147483647の確率で 1が出る 0.0~1.0が出る式の例
実数 ランダム(0.0~1.0) rand() / 2147483647.0 整数 ランダム rand()*2 実数 3.141593 asin(1.0)*2 実数 1.994990 sin(1.5) * 2 実数 5.0 1.0*5 整数 整数 型 4 9/2 22 2*(2+8)+(5-3) 値 式の例課題3
次のことをプログラムで確かめてください
z
整数同士の計算で、小数点以下が切捨られること
z
実数と整数の計算では、結果が実数になること
z
printf()の%f, %d と引数の対応がおかしくてもコンパ
イルエラーにはならないことと、出力が変になること。
z
cos
-1(0)*2が、π = 大体3.14になること
z
sin(π/4) と、
の数値が等しいこと
プログラムができたら、デバッガで1行ずつ実行してみてください。課題4
実は,getchar() は、整数値をとる関数です。
getchar() が取る整数値を10回表示するプログラ
ムを作り、実行して様子を見てください。
ビルドがうまくいかない?
いろいろ書いていると、ビルドがうまくいかないこ
とが起こりえます。たとえば、次の例では、
なぞの machigai という文字列があります。
コンパイラ(gcc)がその旨を伝えるためにエラー
メッセージを出します。(xCodeが表示します)
#include <stdio.h>int main(int argc, const char* argv[]){
// insert code here machigai
printf (”Hello, World!¥n”);
return 0;
ビルド時のエラー
「プロジェクト」のエラーと警告を見るか、
main.c の 赤丸×印にマウスをあわせるとメッセー
エラーメッセージを読もう
先ほどの例では、
error: `machigai‘ undeclared (first use in this function)
エラー:machigai は宣言されていません(この関数の中
では、ここで初めて使われました)
と出ています。C言語には、まだお話していない文法が
たくさんあるので、意味が取りにくいと思います。ですが、
z
コンパイラ(gcc)が machigai をどう解釈してよいかわ
からず、なにか言っている。
z
この行の machigai のあたりに何か問題があるようだ
ということは判ると思います。メッセージはいろいろあり
ますが、必ずよく読んで、意味を考えてください。
エラーメッセージの例
error:parse error before ‘}’ token
エラー:語 ‘}’ の前で構文解析エラーが起きました
}の前に、何かが足りないために、コンパイラ(gcc)がC言
語の解析(解釈)ができなくなったと言っています。
この場合前の文の最後に足りない文字がありますね。
#include <stdio.h> int main(){printf (”Hello, World!¥n”); printf (”Hello, World!¥n”)
エラーメッセージの例
error: missing terminating “ character
エラー:終わりの文字 ” が必要です。
error:parse error before ‘}’ token
エラー:語 ‘}’ の前で構文解析エラーが起きました 文字列の終わりの”がないと言っています。 コンパイラは、 ); も表示する文字列(Hello World! ¥n)の続きだと思ったようで す。このため構文解析エラーも起きています。 このように、ひとつの原因で複数エラーが出ることもあります。 エラーメッセージは最初の方から見て行きましょう。 ひとつ直すと全部直ることもあります。こまめにビルドしましょう。 #include <stdio.h> int main(){
printf (”Hello, World!¥n”); printf (”Hello, World!¥n);