C言語のキーポイント
5=xはNG, x=y=6はOK. (x=y)=6は? *ptr=7は? int x; printf(“%d”, x)は○、scanf (“%d”, x)は×
非0が真、0が偽 for文はwhile文で書き直せる、逆も真 配列は0-オリジン 関数呼び出しでは、仮引数が実引数で初期化される 式を評価するとき副作用を起こす演算子は、(複合)代入 演算子、増分演算子、減分演算子 ポインタはアドレス 配列名は先頭要素へのポインタ 配列とポインタは似ている
第1回講義
• >gcc test.c
実行ファイルa.exe生成
– ソースプログラム test.c より – 実行プログラム a.exe が作られる• >gcc -o test1 test.c
オプションoで、実行ファイルtest1.exe生成
– ソースプログラム test.c より – 実行プログラム test1.exe が作られる/* 画面に文字を出力するコード*/
#include <stdio.h>
int main(void)
{
printf(“ようこそC言語へ!¥n”);
printf(“C言語をはじめましょう!¥n”);
return (0);
}
#include <stdio.h>
int main(void)
{
return (0);
}
• はおまじない
• /* */はコメント
• printfを関数呼び出し
printf(“ようこそC言語へ!¥n”);
printf(“C言語をはじめましょう!¥n”);
/* 画面に文字を出力するコード*/
• プログラムはmainから実行される
int main(void) { 文 … 文 }が基本
文が上から順番に実行される
• 文
のおわりは原則として
セミコロン(;)
printf(“ようこそC言語へ!¥n”)
;
return (0)
;
int main(void) { ① printf(“ようこそC言語へ!¥n”); ② printf(“C言語をはじめましょう!¥n”); ③ return (0); }• ブロック(文):文を中カッコ{ }でまとめたもの
{ 文 … 文 } • ブロックは文 • ブロックが実行されるとき、内容の文が上から順番に実行さ れる • ブロック文の終わりはセミコロン(;)がつかない • ブロックの中の文がブロックであることも { { printf(“ようこそC言語へ!¥n”); printf(“C言語をはじめましょう!¥n”); } return (0); }• コメント:/* から*/までの文字は、コンパイル時に無視される • コメントを用いて、プログラムを分かりやすくするために説明を書く – 他人に分かりやすく – 未来の自分に分かりやすく • デバッグ時にコメントを用いることもある – プログラムの一部を消すかわりに、コメントアウトしておく – 後でその部分を復活させるのが楽 /* 画面に文字を出力するコード*/ #include <stdio.h> int main(void) { printf(“ようこそC言語へ!¥n”); /* printf(“C言語をはじめましょう!¥n”); */ return (0); } 無視される
• stdio.hファイルのインクルード: • 「stdio.hファイルを読み込め(includeしろ)」という命令 • stdio.hを読み込むことによりprintfを使うことができる(gccでは、なくても OKだが…) • .h拡張子をもつファイルをヘッダファイルという • #ではじまる命令は、コンパイルの前処理部分:プリプロセッサで実行され る。 /* 画面に文字を出力するコード*/ #include <stdio.h> int main(void) { printf(“ようこそC言語へ!¥n”); printf(“C言語をはじめましょう!¥n”); return (0); }
• printf 書式化して表示を行う関数
– 基本 画面に文字列を表示する
• #include <stdio.h>が必要 • printf(文字列リテラル) • 文字列リテラル: 2重引用符(“ ”)で囲まれた文字の 並び– printf(
“Hello,World.¥n”
)
• “Hello,World.¥n” 文字列リテラル • ¥n 改行を表す拡張表記(エスケープシーケンス) >Hello, World. > (改行される)• printf 書式化して表示を行う関数
– 挿入-書式化が行われる場合
– printf(“15と37の和は%dです。¥n”,
15+37);
• %d 挿入位置を指定 • d 書式(10進(decimal)表示)を指定– printf(“あ%dい%dう%d¥n”, 1, 2, 3)
>あ1い2う3 >• 文字列リテラル: 2重引用符(“ ”)で囲まれた
文字の並び
– "Hello,World.¥n"
• 文字定数:
1重引用符(’ ’)で囲まれた単独
の文字
– 'H'
'e'
– '¥x48' '¥x65' 文字コードでも表せる
• printf("
%c
は文字です。¥n"
,
'A'
);
– %c 挿入位置を指定
– c 書式(文字定数表示)を指定
• エスケープシーケンス:¥ではじまる特殊な文字
– 文字定数、文字列リテラルで用いられる – ¥n(改行) ¥t(水平タブ) 表示の指定 – ¥‟(1重引用符 ’ ) ¥”(2重引用符 “) 1重引用符、2重 引用符が、文字定数、文字列リテラルを定義するために 使われているため – ¥¥(円記号¥ ) 円記号が、エスケープシーケンスを定義 するために使われているため• printf(“円記号を表示します: %c¥n”,
„¥¥‟
);
>円記号を表示します: ¥ >• 整数定数
10 10進の「10」。10進の10を表す。
010 8進の「10」。10進の8を表す。
0x10 16進の「10」。10進の16を表す。
0xF 16進の「F]。10進の15を表す。
int x=10; printf("10進数%dを8進で表すと%o, 16進で表すと%xであ る。¥n",x,x,x); >10進数10を8進で表すと12, 16進で表すとaである。• printf(“%cは文字です。¥n”, „A‟);
– %c 挿入位置を指定
– c 書式(文字定数表示)を指定
• printf(“
%d
は整数です。¥n”
,
567
);
• printf(“
%f
は小数です。¥n”
,
53.14
);
• printf(“%d
は整数、
%cは文字です。¥n”,
567, „A‟
);
• 変数宣言
int num ;
char c;
double db;
– 型 変数名 セミコロン
– int型(整数型)の変数numを宣言
– int
vx
,
yx
; とまとめて宣言できる
• 変数には値を格納することができる
• 代入(演算子) =
– 基本 x = 3; /*変数xに3を代入*/
– 変数へ=を使って値を格納(代入)
– 方程式を作るためのものでは
ない
– int型変数には整数を格納できる num=234
– char型変数には文字、整数を c=„A‟ c=127
– double型変数には(浮動)小数点数を db=3.14
• 変数宣言
int num =234;
char c =„A‟;
double db=3.14;
– 変数宣言と同時に値を指定できる(
初期化
できる)
• int num; num = 234;の代わりに
– 初期化を行わない変数には、何が格納さ
れているかわからない
• 代入(演算子 )=
num = 3; /*変数numに3を代入*/
num=5; /*変数numに5を代入*/
– 代入により、格納される値を変更(上書き)
int num1,num2;
num1 = 3; /*変数num1に3を代入*/
num2=num1;
/*変数
num1の値
をnum2を代入*/
• 代入(演算子 )=
int num1,num2;
num1 =
3
; /*変数num1に
3
を代入*/
num2=
num1
; /*変数
num1の値
をnum2を代入*/
○右辺の
num1
が3に置き換わると考える
num2=
3
; と考える
• 代入(演算子 )=
num2=num1;
/*変数
num1の値
をnum2を代入*/
C言語(や、それ以後の言語)のよくないところ・・・
右辺:num1の値を 左辺:num2へ格納変数が場所(右辺or左辺)によって役割が
異なる
• printf 書式化して表示を行う関数
int num= 3; printf(“変数numの値は%dです。¥n”, num);/*変数
numの値
を表示*/
>変数numの値は3です。 >○numが3に置き換わると考える
printf(“変数numの値は%dです。¥n”, 3); と考える• 代入(演算子 )=
int num; /*numは整数変数だが…*/
num = 3.14; /*変数numに3.14を代入*/ printf(“変数numの値は%dです。¥n”, num);
/*変数
numの値
を表示*/
>変数numの値は3です。 > 3.14の小数部分を切り捨てた値3が格納されている 小数点数から整数への変換が行われている 型を自動的に変換している• scanf 読み込みを行う関数
– 基本 キーボードから数値などを読み込み、変数
に格納
• #include <stdio.h>が必要 • scanf(書式指定、&変数名) • 「&変数名」に注意、 – &はアドレス演算子という – 変数のメモリ上の場所「番地(アドレス)」を表す– scanf("%d",&no)
• キーボードからの入力を10進数としてみなして • 変数noへ格納 • 事前に変数noが宣言されている必要がある!• scanf 読み込みを行う関数
int no;
scanf(“%d”,&no);
• キーボードからの入力を10進数としてみなして • 変数noへ格納double num;
scanf(“%lf”,&num);
• キーボードからの入力を小数点数としてみなして • 変数numへ格納• getchar キーボードより文字を読み込む関数
– 基本 文字を読み込む関数
• #include <stdio.h>が必要 • getchar() 引数をとらない • 読み込んだ文字を返却するchar ch;
ch = getchar();
• chに読み込んだ文字が格納される• (もう一度)プログラムはmainから実行される int main(void) { 文 … 文 }
が基本
• 文のおわりは原則としてセミコロン(;)
– return (0); return文 – int vx; 宣言文 – printf(“%d”, 15+37); – vy = 10;今日のレポート課題
以下をレポートにまとめてください。次回講義中に回
収します。
• 自分の環境の各型(char, unsigned char, ... ,
long double)のサイズと記憶できる値の範囲を調
べよ。
• 2の補数(表現)について調べよ。それを用いて、
unsigned int変数の格納できる値の範囲とint変数
の格納できる値の範囲の違いについて説明せよ。
• 10進表示、2進表示、16進表示のそれぞれの間の
変換方法を調べよ。例も示せ。
今日のレポート課題
以下をレポートにまとめてください。次回講義中に回
収します。
• プログラム課題「文字(アルファベット)を入力させ、
その文字そのものとその文字コードを出力させる
プログラムを書け」
>1文字を入力してください:a > aの文字コードはx61です。• 自作問題と解答
– 2組の問題と解答○第1回大レポート課題
– 10月18日の講義中に回収
– 表紙をつける
– A4用紙、左上ホチキス(ステープラー)留め
• 内容
– 以下の書籍を読み、「自分用まとめメモ」をA4用
紙2枚程度で作成
– 箇条書きのメモ
• 戸田山 和久「論文の教室―レポートから卒論まで 」 (NHKブックス) – この本で、パラグラフ・ライティングを学んでください戸田山 和久「論文の教室―レポートから卒論
まで 」(NHKブックス)
○第2回大レポート課題
10月25日の講義中に大レポートの構成案を回収
• 大レポートのアウトライン(各セクションのタイトルと、サブセクショ ンの見出し)と各パラグラフに書く内容の概要(1行程度、トピック センテンス(の候補))を提出11月8日の講義中に大レポートを回収
• 表紙をつける、A4用紙、左上ホチキス(ステープラー)留め • マイクロソフトワードを使用、フォント12ポイント以下 • 5ページ以上 • パラグラフ・ライティングの手法に基づいている必要がある(トピッ クセンテンスにアンダーラインをすること) • その他の戸田山本の規則に従う • 参考文献、引用文献を明記 • 個人的な意見、感想、アイデアを書いてはいけない○第2回大レポート課題 課題内容 C 言語を使用して、方程式 を満たすx を求めるプログラムを作成しなさい。実数値a、b、 c がどのような値(0を含む)になっても正しい値が出るように しなさい。 入力(a,b,cの指定)はプログラム冒頭の代入で行い、様々 な入力に関しては全て再コンパイルで対応すること。 また、全ての条件分岐(if文)が正常に動作していることを確 かめるために、それぞれの条件に対応する入力例を作り、 実際に動作テストを行った結果も示すこと。 なお、解が実数の場合のみ考えれば十分である。
0
2
c
bx
ax
○第2回大レポート課題 技術的文章は、問い(解くべき課題)と答え(課題に対する解 答)を含む。 技術文章内のすべての文章は上記いずれかを説明するた めにある。 作成したアウトラインの基づき、全体を構成すること。 目次の例 解くべき課題 背景 課題の背景 解決法の背景 (課題へのアプローチ ) 解決法、提案方式 評価 (今後の課題 ) 参考文献リスト 付録:プログラム本体等