C言語の基本

目次
C言語の基本
 変数
 式と演算
 C言語による実習

創造基礎実習
(情報)




金 帝演


1~100までの総和を求める
2次方程式の解を求める
2つの直線の交点を求める
2次関数、対数関数、指数関数のグラフを描く
三角関数等のグラフを描く
放物運動のグラフを書く
jykim
2015/4/10
2
C言語の基本

C言語の歴史
C言語のプログラム
コードの入力
プログラムの作成
プログラムの実行

参考書

創造基礎実習
(C言語の基本)
金 帝演




2015/4/10
やさしいC(ソフトバンククリエイティブ)
jykim
4
C言語歴史

ANSI Cとは
1972年、Dennis Ritchieにより、UNIXのための記述
言語として開発

ANSI(American National Standards Institute:米国規
格協会)
 唯一のCの定義書「The C programming Language」

UNIXはベル研究所で開発されたOSの一種
COBOL
PL/I
FORTRAN
ALGOL
BASIC
Pascal
BCPL - B - C
LOGO
LISP
Prolog
jykim
2015/4/10
5
C言語のプログラム

プログラムとは、コンピュータに対して何らかの「仕
事」を指示するためのもの

プログラミング言語C



6
jykim
2015/4/10
プログラムの作成流れ(Windows用)
ソースファイル作成
拡張子:◯◯.c
人間が分かる言語で
書いた指示書
コンパイル
ソースファイル
コンパイラ(Compiler)
機械語(Machine Code)
実行可能なファイル
拡張子:◯◯.exe
機械が理解できる
言語のファイル
実行
実行結果
2015/4/10
jykim
7
2015/4/10
jykim
8
コードの入力

基本的な約束事
プログラム作成


テキストファイルにC言語の文法に従ってプログラムを入力



原則として半角文字で記述
テキスト形式のプログラムがソースコード(ファイル)






プログラムは関数で構成
プログラムにはmain関数が1つ必要
関数は{で始まり、}で終わる
文には「;」が必要
コメントは/* と */で囲む(または // )
変数は宣言してから利用
予約語


jykim
2015/4/10
9
プログラムの実行
printfを用いて画面に表示する場合は、全角も可能
コンパイラが使用するキーワード
それぞれの持つ働き以外の目的で使用不可
10
jykim
2015/4/10
プログラムの作成・実行
sample1-1.c
/* 画面に文字を出力するコード */ // コメント文
#include <stdio.h>
// 標準ライブラリの情報を取り込む
// 画面出力に必要
クリック⇒コンパイルと実行を同時に行う
int main(void)
{
// main()関数の開始部分
// mainの文を大カッコで囲む
printf("ようこそC言語へ!¥n");
// 最初に実行
実行結果
return 0;
// main()関数の終了部分
}
実行結果
2015/4/10
jykim
11
2015/4/10
jykim
12
ソースコードの保存
ソースコードの保存
クリック
後でどんなプログラムか
分かるように名前をつける
(拡張子は.c)
最初の文字が日本語はだめ!
13
jykim
2015/4/10
/* 赤の部分は必ず暗記 */
#include <stdio.h>
新しいコードを追加
/* 画面に文字を出力するコード */
#include <stdio.h>
// コメント文
// 標準ライブラリの情報を取り込む
// 画面出力に必要
int main(void)
{
// main()関数の開始部分
// mainの文を大カッコで囲む
printf("ようこそC言語へ!¥n");
printf("C言語を始めましょう!¥n");
return 0;
int main(void)
{
文1;
・・・
return 0;

// main()関数の終了部分
C言語は



jykim
プログラムの本体(main()関数)
}
// 最初に実行
// 次に実行
}
2015/4/10
14
main()関数のしくみ
コードの基本

jykim
2015/4/10
15
2015/4/10
小さな処理(「仕事」)の単位を文(Statement)と呼ぶ
文の最後には「 ; 」という記号をつける
原則として先頭から順番に、1文ずつ処理される
jykim
16
コードを読みやすくする
/* 画面に文字を出力するコード */
#include <stdio.h>
コードを読みやすくする
/* 画面に文字を出力するコード */
#include <stdio.h>
sample1-1.c
int main(void)
{
printf("ようこそC言語へ!¥n");
return 0;
}
int main(void)
{
printf("ようこそC言語へ!¥n");
return 0;
}
// 最初に実行
インデント
/* 画面に文字を出力するコード */
#include <stdio.h>
int main(void){printf("ようこそC言語へ!¥n");/* 最初に実行 */return 0;}
// 一行コメントアウト(非推奨)
 /* 画面に文字を出力するコード */

この部分は無視して処理(コメントアウトという)

/* 画面に文字を
出力するコード */
どっちが読みやすい?
 C言語は「行の概念がない!」

複数行にわたることも無視

jykim
2015/4/10
/* 最初に実行 */
しかし、読みやすくするために行とインデントに注意すべき
17
2015/4/10
jykim
18
19
2015/4/10
jykim
20
改行のしくみ
#include <stdio.h>
sample1-2.c
int main(void)
{
printf("ようこそC言語へ!¥nC言語を始めましょう¥n");
ここで改行
return 0;
}

2015/4/10
画面に出力

C:¥Clang¥Sample
ようこそC言語へ!
C言語を始めましょう

¥nをいれないと?
出力確認!!!
jykim
変数


創造基礎実習
(変数)




変数
識別子
型
変数の宣言
変数の利用
キーボードからの入力
金 帝演
変数


変数


1byte(8bit)
アドレス
メモリを利用して値を記憶
4バイト
メモリ確保
1byte == 8bit
未知あるいは不定の数・対象を表す文字記号のこと
値が変化するもの
・・・


値が固定されて変化しない数
変数 (Variable)

コンピュータは、色々な値を記憶しておくために、内
部にメモリ(memory)という装置を利用
= ax + b
定数 (Constant)


・
・
・

変数のしくみ
数学
y
22
jykim
2015/4/10
メモリ空間
2015/4/10
jykim
23
2015/4/10
jykim
24
識別子

変数の種類
変数を使うために次の2つを決定



変数の名前
変数の型
char型


int型


識別子(identifier)


変数の名前
付け方



予約語である「キーワード」はだめ
大文字と小文字区別
25
jykim
型
26
jykim
2015/4/10
変数の宣言(declaration)
基本データ型
文字型

型名
char
unsigned char
short int
整数型
サイズ
値の範囲
1 byte -128 ~ 127
1 byte 0 ~ 255
2 byte -32768 ~ 32767
unsigned short
int
2 byte
0 ~ 65535
unsigned int
4 byte
-231 ~ 231-1
int
4 byte
-231 ~ 231-1
long int
4 byte
-231
浮動小数点型
(実数)
10-37 ~ 1038
double
8 byte
10-307~ 10308
0 ~
変数は型と名前を指定して宣言
メモリの中に変数が用意される
char c; // char型変数c
 int num; // int型変数num
 double x, y;
// 実数xとy

0 ~ 232-1
4 byte
jykim

231-1
float
unsigned double 8 byte

1バイト
メモリ確保
c
4バイト
メモリ確保
num
・・・
unsigned long int 4 byte
~
型名 識別子;
・
・
・
種類
2015/4/10
実数を格納
floatより精度が2倍
31文字または128文字
2015/4/10

実数を格納
double型

ただし、最初の文字は英語またはアンタースコア(_)のみ
環境によって名前の長さが定まっている



整数を格納
float型

英字、数字、アンタースコア(_)



ソースファイル名前の付け方
と同じ
一文字を格納
メモリ空間
10309
27
2015/4/10
jykim
28
変数のまとめ
変数の利用
・・・

変数に値を代入


変数名 = 式 ;
変数の型と名前を宣言し、メモリを確保し、変数に
値を代入して利用


int num;
num = 3;
4バイト
メモリ確保

num=3
・・
・





型名 識別子 = 式 ;
int num = 3;


29
jykim
2015/4/10
値を変数へ代入(例1)
#include <stdio.h>
int main(void)
{
int num;
num = 3;
jykim
printf 関数を利用
 char型
sample2-1.c


// 変数num宣言


// 3を変数numに代入

return 0;

変数numの値は 3 です。


31
2015/4/10
float f;
printf(" %f ", f );
double型

jykim
int a;
printf(" %d ", a );
float型

出力
char ch;
printf(" %c ", ch );
int型

}
2015/4/10
30
変数を画面に出力


char
int
float
double
2015/4/10
printf("変数numの値は %d です。¥n", num );

int a;
a = 10;
変数の種類

メモリ空間
変数の初期化
例
double d;
printf(" %f ", d );
jykim
32
変数の値を画面に出力する例
#include <stdio.h>
int main(void)
{
char ch;
int inum;
double fnum;
double dnum;
ch = ‘A’;
inum = 3;
fnum = 3.14;
dnum = 2.7;
変数の値を変更(定数を変数へ)
#include <stdio.h>
sample2-2.c
int main(void)
{
int num;
num = 3;
printf("変数numの値は %d です。¥n", num
);
num = 5;
printf("変数numの値を変更しました。¥n");
printf("変数numの値は %d です。¥n", num
);
// 一文字Aを変数cに代入
// 3を変数inumに代入
// 3.14を変数fnumに代入
// 2.7を変数dnumに代入
printf("変数numの値は
printf("変数numの値は
printf("変数numの値は
printf("変数numの値は

出力
}
33
jykim
変数numの値は3です。
変数numの値を変更しました。
変数numの値は5です。
34
jykim
2015/4/10
変数の値を変更(変数の値を変数へ)
値の代入についての注意
#include <stdio.h>
#include <stdio.h>
int main(void)
{
int num1, num2;
num1 = 3;
// 3をnum1に代入
printf("変数num1の値は%dです。¥n", num1 );
3
printf("変数numの値は %d です。¥n", num );
3
return 0;
return 0;
}
}
2015/4/10
3.1
num = 3.1; // 小数点以下は切り捨て
printf("変数num1の値をnum2に代入しました。¥n");
printf("変数num2の値は%dです。¥n", num2 );
出力

sample2-5.c
int main(void)
{
int num;
num2 = num1; // num1の値をnum2へ代入

5
}

sample2-4.c
3
return 0;
%c です。¥n", ch
);
%d です。¥n", inum );
%f です。¥n", fnum );
%lf です。¥n", dnum );
return 0;
2015/4/10
sample2-3.c

変数num1の値は3です。
変数num1の値をnum2に代入しました。
変数num2の値は3です。
jykim

35
2015/4/10
int型
出力
変数numの値は 3 です。
jykim
36
キーボードから整数の入力
#include <stdio.h>
int main(void)
{
int num;
キーボードから小数の入力
#include <stdio.h>
sample2-6.c
int main(void)
{
double num;
キーボードから入力された整数を変数numへ代入
scanf(" %lf ", &num );
printf("%dが入力されました。¥n", num);
printf("%lf が入力されました。¥n", num);
return 0;
}
}
プログラムを実行すると

整数を入力し、Enterをすると
37
キーボードから複数データ入力



int a, b;
scanf("%d
12 34 


詳細は2年生になってから
#include <stdio.h>
%d", &a, &b );
int main(void)
{
char str[10];
スペース
いろいろな入力の例

38
jykim
2015/4/10
キーボードから文字列の入力
複数の整数入力の例

プログラムを実行すると
小数を入力し、Enter
jykim
2015/4/10

キーボードから入力された小数を変数numへ代入
scanf("%d", &num );
return 0;

sample2-7.c
sample2-8.c
// char型配列をstr宣言
scanf("%s", str ); // strに9文字まで代入可能
// &がないことを注意
scanf("%f %c", &a, &b );
3.14 c 
printf("%sが入力されました。¥n", str );
return 0;
}
2015/4/10
jykim
39
2015/4/10
jykim
40
レポート

レポート提出
キーボードから文字(一文字)を入力し、画面に出力
するプログラムを作成せよ。

提出期限



キーボードから整数と浮動小数点数を入力し、画面
に出力するプログラムを作成せよ。


2015/4/10

int型とdouble型
来週授業開始前まで
定刻を過ぎた場合は未提出とみなす
レポートの形式

サンプルを参考
キーボードから自分の名前と住所を入力して、画面
に出力するプログラムを作成せよ。
jykim
41
2015/4/10
42
jykim
創造基礎実習
(式と演算)
金 帝演
2015/4/10
jykim
43
式と演算
式と演算子
式と演算子
 演算子の種類
 演算子の優先順位


式(expression)


1+2=3
C言語での式


演算子(演算するもの:operator): +, -, *, /, %
オペランド(演算の対象:operand)
オペランド

1 + 2
演算子
45
jykim
2015/4/10
式の値を出力

jykim
2015/4/10
値の代入
printf (" %◯ " , 式 );

#include <stdio.h>
値は変数へ代入可能

sample3-1.c

int main(void)
{
printf("1+2は%dです。¥n", 3
);
printf("1+2は%dです。¥n", 1+2 );



printf("3×4は%dです。¥n", 3*4 );

}


jykim
47
2015/4/10
int num1, num2;
num1=1;
num2=2;
num1 = num1 + num2; // num1+num2をnum1へ代入
値は定数へ代入不可

return 0;
2015/4/10
46
int num1, num2;
num1=1;
num2=2;
3 = num1 + num2;
// 代入不可
jykim
48
色々な演算
演算子の種類
sample3-2.c
#include <stdio.h>
int main(void)
{
int num1 = 2;
int num2 = 3;
表4.1 演算子の種類
+
*
/
%
加算
減算
乗算
除算
剰余
~
=
++
->>
補数
代入
インクリメント
デクリメント
右シフト
…
…
…
…
// num1を2で初期化
// num2を3で初期化
int sum = num1+num2;
// num1+num2の値を
// sumに代入し、初期化
printf("変数num1の値は%dです。¥n",
printf("変数num2の値は%dです。¥n",
printf("num1+num2の値は%dです。¥n",
printf("num1+num2の値は%dです。¥n",
num1 = num1+1;
num1
num2
num1+num2
sum
);
);
);
);
// num1+1をnum1へ代入
printf("変数num1の値に1をたすと%dです。¥n", num1 );
return 0;
}
49
jykim
2015/4/10
いろいろな演算子を利用
sample3-3.c

int main(void)
{
int num1 = 10;
int num2 = 5 ;
インクリメント(increment)



printf("num1とnum2にいろいろな演算を行います。¥n");
printf("num1+num2は%dです。¥n", num1 + num2 );
printf("num1-num2は%dです。¥n", num1 - num2 );
printf("num1*num2は%dです。¥n", num1 * num2 );
printf("num1/num2は%dです。¥n", num1 / num2 );
printf("num1%%num2は%dです。¥n", num1 % num2
50
インクリメント・デクリメント演算子
#include <stdio.h>
return 0;
jykim
2015/4/10

デクリメント(decrement)


);

%記号
a++;
// 前置演算子、代入後にインクリメント
++a;
// 後置演算子、代入前にインクリメント
a = a+1;
a--;
// 後置演算子、代入後にデクリメント
--a;
// 前置演算子、代入前にデクリメント
a = a-1;
}
出力は?
2015/4/10
jykim
51
2015/4/10
jykim
52
インクリメント・デクリメント演算子の例
sample3-4.c
#include <stdio.h>
int main(void)
{
int a = 0;
演算子の優先順位
int b = 0;
int c = 0;

int a=1, b=2, c=3, sum1, sum2;
sum1 = a+b*c;
 sum2 = (a+b)*c;

int d = 0;
b = a++;
printf("代入後にインクリメントするのでbの値は%dです。¥n", b );
d = ++c;

printf("代入前にインクリメントしたのでdの値は%dです。¥n", d );
違いは?
return 0;
}

出力は?

代入後にインクリメントするのでbの値は 0 です。
代入前にインクリメントしたのでdの値は 1 です。
53
jykim
2015/4/10
型変換(1)

型変換(2)
大きなサイズの型に代入

sample3-5.c
#include <stdio.h>
int main(void)
{
int inum;
int main(void)
{
int inum;
sample3-6.c
3.8
double dnum;
dnum = 160.5;
printf("身長は%fセンチです。¥n", dnum
);
printf("double型の変数に代入します。¥n");
小さなサイズの型に代入(切り捨て)
#include <stdio.h>
3
double dnum;
inum = 160;
printf("身長は%dセンチです。¥n", inum
);
3
printf("int型の変数に代入します。¥n");
3.0
dnum = inum;
inum = dnum;
printf("身長は%fセンチです。¥n", dnum
);
printf("身長は%dセンチです。¥n", inum
return 0;
);
return 0;
}
2015/4/10
54
jykim
2015/4/10
}
jykim
55
2015/4/10
jykim
56
キャスト演算子(cast operator)
同じ型の演算(1)
式の型を()中で指定した型に一時的に変換
 (型)式
#include <stdio.h>



inum = (int)dnum;
int main(void)
{
int num1, num2;
double div;
// dnumをint型に変換して
// inumへ代入
num1 = 5;
inum = dnum;との違い


// 整数/整数は?
printf("5/4は%fです。¥n", div
);
出力は?

57
jykim
同じ型の演算(2)
1.000000
なぜ?
58
jykim
2015/4/10
同じ型の演算(3)
sample3-7.c
#include <stdio.h>
sample3-7.c
#include <stdio.h>
int main(void)
{
int num1, num2;
double div;
num1 = 5;
div = num1/num2;
}
なぜ型変換が必要?
2015/4/10
num2 = 4;
return 0;
型変換を明示的に記述
ここでは違いがない


sample3-7.c
int main(void)
{
int num1, num2;
double div;
num2 = 4;
num1 = 5;
演算時にdouble型へ変換
num2 = 4;
div = (double) num1 / (double) num2;
div = (double) num1 / (double) num2;
printf("5/4は%fです。¥n", div
printf("5/4は%fです。¥n", div);
printf("num1は%dです。¥n", num1);
);
return 0;
}
return 0;
}

出力は?


1.250000
出力は?


2015/4/10
jykim
59
2015/4/10
1.250000
5
jykim
60
異なる型どうしで演算
合計と平均を求める
#include <stdio.h>
sample3-8.c
#include <stdio.h>
int main(void)
{
int a, b, c;
int sum;
double average;
int main(void)
{
int r = 2;
// 半径
double pi = 3.14;
printf("半径が%dセンチの円の¥n", r );
printf("円周は%fセンチです。¥n", 2*r*pi );
a = 10;
b = 12;
c = 13;
return 0;
出力は?


// 合計を格納
// 平均を格納
// ←値を変更してみてください。
// ←値を変更してみてください。
// ←値を変更してみてください。
sum = a + b + c ;
average = sum/3.0 ;
}

sample3-9.c
printf("合計は%dです。¥n", sum
);
printf("平均は%lfです。¥n", average );
12.48
なぜ:演算の際に大きなサイズの型に変換
return 0;
}
61
jykim
2015/4/10
型と演算のまとめ

int/intの場合

7
2
=
次の計算結果を出力するプログラムを作成せよ。

3



double/doubleの場合

7.0
2.0
=
3.5



二項数値昇格



小さい方の型のオペランドはより大きい方の型に変換
int/double
7
2.0
2.0
=




double/intも同様


2015/4/10
jykim
63
2015/4/10
正方形の高さを入力
3(Enter)
正方形の面積は9です。
次のように高さと底辺を入力して、三角形の面積を出力するプログ
ラムを作成せよ。

3.5
0-4
3.14  2
53
30  7の余り
(7 + 32)  5
次のように整数を入力して、正方形の面積を出力するプログラムを
作成せよ。

7.0

62
レポート(1)
同一型間の算術演算

jykim
2015/4/10
高さ
3
底辺
5
三角形の面積は7.500000です。
jykim
64
レポート(2)

次のように正負を反転して出力するプログラムを作成せ
よ。




キーボードから3科目のテストの点数を入力して、合計点
をと平均点を次のように出力するプログラムを作成せよ。








2015/4/10
整数入力
3
正負を反転すると-3です。
国語の点数
60 (←任意を入力)
数学の点数
70 (←任意を入力)
英語の点数
90 (←任意を入力)
合計点は220点です。
平均点は73.333333点です。
65
jykim
jykim
2015/4/10
66
C言語による実習
1~100までの総和を求める
 2次方程式の解を求める
 2つの直線の交点を求める

創造基礎実習
(C言語による実習)

2次関数、対数関数、指数関数のグラフを描く
三角関数等のグラフを描く
 放物運動のグラフを書く

金 帝演
2015/4/10
jykim
68
1~100までの総和を求める

総和を求めるプログラム作成
1~100まで総和を求める方法

1+2+3++100

公式:
フローチャート
 sum = 0;
for ( i=1 ; i<=100 ; i++ )
sum = sum + i;

100 * (100  1)
2
i = 1;
sum = 0 ;
i<=100
true
i = i + 1;
69
jykim
2015/4/10
Sample4-1.c


sum=0;
for ( i=1 ; i<=100 ; i++ )
{
sum = sum + i;
}
70
1~nまでの総和を求める方法
総和を求めるプログラムの例
#include <stdio.h>
int main(void)
{
int i;
int sum;
sum = sum+i;
jykim
2015/4/10
false
1+2+3++n
n * (n  1)
2
// sumの初期化
// 1~100まで繰り返す
// sum += i;
printf("総和は%d¥n", sum
);
printf("総和は%d¥n", 100*101/2 );
// sumを出力
// 総和を求める公式
return 0;
}
2015/4/10
jykim
71
2015/4/10
jykim
72
プログラムの例(2)
#include <stdio.h>
int main(void)
{
int i, n, sum;
n=100;
プログラムの例(3)
#include <stdio.h>
int main(void)
{
int i, n, sum;
printf("nを入力:¥n" );
scanf("%d", &n );
Sample4-2.c
// nに100を代入
sum=0;
// sumの初期化
for ( i=1 ; i<=n ; i++ )
{
sum = sum + i;
}
// 1~100まで繰り返す
printf("総和は%d¥n", sum );
printf("総和は%d¥n", n*(n+1)/2 );
// sumを出力
// 総和を求める公式
return 0;
}
// キーボードから入力
sum=0;
// sumの初期化
for ( i=1 ; i<=n ; i++ )
{
sum = sum + i;
}
// 1~nまで繰り返す
printf("総和は%d¥n", sum );
printf("総和は%d¥n", n*(n+1)/2 );
// sumを出力
// 総和を求める公式
return 0;
jykim
2015/4/10
73
2次方程式の解

Sample4-3.c

解が異なる2つの場合
ax2+bx+c=0の解

D(b  4ac)  0
x
解が重解の場合
D(b 2  4ac)  0


D(b 2  4ac)  0

)
 b  b 2  4ac
2a
解が重解の場合(
x
解が虚数の場合
D0
解が異なる2つの場合(
2

74
jykim
2015/4/10
2次方程式の解
ax2+bx+c=0の解の判別式

}
D0
)
D0
)
b
2a
解が虚数の場合(
 b  | b 2  4ac | i
x
2a
2015/4/10
jykim
75
2015/4/10
jykim
76
プログラム作成方法

2次方程式の解を求めるプログラムの例
#include <stdio.h>
#include<math.h>
フローチャート
int main(void)
{
double a, b, c;
double x1, x2;
double cx1, cx2;
false
D>0
true
D<0
true
2つの
解を求める
虚数の
解を求める
false
a=1.0;
b=2.0;
c=3.0;
重解を求める
else if ( b*b-4*a*c < 0 )
Sample4-4.c
{
x1 = (-b)/(2*a);
x2 = (-b)/(2*a);
cx1 = sqrt(fabs(b*b-4*a*c));
cx2 = -sqrt(fabs(b*b-4*a*c));
// 定数
// 解
// 虚数の解
printf("%6.3lf, %6.3lfi¥n", x1, cx1 );
printf("%6.3lf, %6.3lfi¥n", x2, cx2 );
// 値を代入
// 値を代入
// 値を代入
if ( b*b-4*a*c > 0 )
{
x1 = (-b+sqrt(b*b-4*a*c))/(2*a);
x2 = (-b-sqrt(b*b-4*a*c))/(2*a);
printf("%lf, %lf¥n", x1, x2 );
}else
// if ( b*b-4*a*c == 0 )
{
x1 = (-b)/(2*a);
x2 = (-b)/(2*a);
printf("%lf, %lf¥n", x1, x2 );
}
return 0;
}
}
77
jykim
2015/4/10
2つの直線の交点


y=ax+b、y=cx+d
y=ax+b
a=1.0;
ad  bc
y
ac
a == c, b == d
不能の場合

b=2.0;
Sample4-5.c
// y=ax+b, y=cx+d
// 交点x, y
c=5.0;
d=2.0;
if ( a==c && b==d ){
printf("不定¥n");
}else if ( a==c && b!=d ){
printf("不能¥n");
}else{
x = -( b - d )/( a-c );
y = (a*d - b*c)/( a-c );
printf("x=%f, y=%f¥n", x, y );
}
return 0;
不定の場合


#include <stdio.h>
int main(void)
{
double a, b, c, d;
double x, y;
y=cx+d
交点が存在
(b  d )
x
,
ac

2つの直線の交点を求めるプログラム
2つの直線の交点を求める公式

78
jykim
2015/4/10
a == c, b != d
}
2015/4/10
jykim
79
2015/4/10
jykim
80
グラフを描く

エクセルで開く


レポート

output.csvファイルをダブルクリック
名前をつけて保存



y = ax2 + bx + c
y = dx + f

ヒント

エクセルブック(*.xlsx)を選択
.csvファイルはグラフが保存できない

2次方程式と直線の交点を求める公式を導き、
交点を画面に出力するプログラムを作成せよ。
テキストファイルであるため、



2015/4/10
jykim
81
ax2 + bx + c = dx + f を用いてxを求める。
判別式で解が何個かを判断
解を求める
jykim
2015/4/10
82
C言語による実習
1~100までの総和を求める
 2次方程式の解を求める
 2つの直線の交点を求める


2次関数、対数関数、指数関数のグラフを描く
三角関数等のグラフを描く
 放物運動のグラフを書く

2015/4/10
jykim
83
2015/4/10
jykim
84
2次関数のグラフ(1)


2次関数のグラフ(2)
y=ax2+bx+c

b 

ax 2  bx  c  a x 2  x   c
a 

a>0

y = ax2+bx+c → y = a ( x – p )2 + q
下に凸
2
b
b 
b

x  ( )   a( ) 2  c
 a x 2  2
2a
2a 
2a

2

b  b 2  4ac

 a x   
2a 
4a

a<0

上に凸
 b
b 2  4ac 


,
 頂点は  
2
a
4
a


85
jykim
2015/4/10
86
jykim
2015/4/10
2次関数のグラフ
プログラムの例(1)
y = 2x2+4x-1=2(x+1)2-3
 頂点(-1, -3)
#include <stdio.h>
Sample4-6.c
void output( double x[], double y[]); // 結果をcsvファイルに出力関数
int main(void)
{
int a, b, c;
int i;
double x[100];
// xの値を保管
double y[100];
// yの値を保管


下に凸
5
a=1.0; b=2.0; c=3.0;
0
for ( i=0 ; i<100 ; i++ ){
x[i] = (double) i / 10 - 4;
y[i] = a*x[i]*x[i] + b*x[i] + c;
}
グラフ描く方法





2015/4/10
10
a>0の場合


15
x=-2の場合、y=?
x=-1の場合、y=?
x=0の場合、y=?
x=1の場合、y=?
…
-4
-3
-2
-1
0
1
2
-5
output( x, y);
return 0;
// 初期化
// y=ax2+bx+c
// csvファイルへ出力
}
jykim
87
2015/4/10
jykim
88
プログラムの例(2)
グラフを描く
void output( double x[], double y[])
{
FILE *fp;
int i;

output.csvファイルをダブルクリックすると
エクセルで開くことになる
 名前付け保存でエクセルブックで保存

fp = fopen("output.csv", "w");
fprintf( fp, " x, y¥n");
.csvファイルはテキストファイルであるため、
グラフの保存ができない
for ( i=0 ; i<100 ; i++ )
{
fprintf( fp, "%f, %f¥n", x[i], y[i]);
}
fclose(fp);
}
jykim
2015/4/10
89
エクセルの名前付け保存
jykim
2015/4/10
90
エクセルの名前付け保存
ここをクリック
ここをクリック
2015/4/10
jykim
91
2015/4/10
jykim
92
エクセルの名前付け保存
対数関数と指数関数

対数関数(log)





93
jykim
2015/4/10
Log関数のグラフ

loge 0 = -
 loge 1 = 0
 logee = 1
:自然指数
94
jykim
2015/4/10
#include <stdio.h>
#include <math.h>
void output( double x[], double y[]);
int main(void)
{
double x[100];
double y[100];
int i;
3
2
1
y
ab
eb
Log関数のグラフを描くプログラム
loge x

:自然対数
:常用対数
指数関数(e)

分かりやすい名前
logab
logeb
log10b
0
-1
0
2
4
6
8
// 関数のプロトタイプ宣言
// y = log x
// y
10
for ( i=1 ;i<100 ; i++ ){
x[i] = i / 10.0;
y[i] = log( x[i] );
}
-2
-3
Sample4-7.c
x
output( x, y);
// csvファイルへ出力
return 0;
}
2015/4/10
jykim
95
2015/4/10
jykim
96

指数関数
output.csvファイルをダブルクリックすると
エクセルで開くことになる

y=ex
x=-の場合、
 x=0の場合、
 x=+の場合、

3
10
8
6
4
2
0
y
グラフを描く
-3
-1.5
0
x
2
1.5
3
1
y
0
-1
0
2
4
6
8
10
-2
-3
x
97
jykim
2015/4/10
指数関数のグラフを描くプログラム
#include <stdio.h>
#include <math.h>
void output( double x[], double y[]);
int main(void)
{
double x[50];
double y[50];
int i;
グラフを描く
Sample4-8.c

output.csvファイルをダブルクリックすると
エクセルで開くことになる
// xの値を格納
// y=exp xの値を格納
10
8
6
4
2
0
y
for ( i=1 ;i<50 ; i++ )
{
x[i] = i/10.0 - 2.5 ;
y[i] = exp( x[i] );
}
output( x, y);
// csvファイルへ出力
-3
return 0;
}
2015/4/10
98
jykim
2015/4/10
jykim
99
2015/4/10
jykim
-1.5
0
x
1.5
3
100
レポート

3次関数のグラフを描くプログラムを作成し、グラフを
描きなさい



y=ax3+bx2+cx+d
ここで、a, b, c, d は任意
下記の対数関数のグラフを描きなさい。ただし、グラ
フは3つではなく、1つのグラフで描きなさい。
xの範囲は -5 <= x <= 5
 y=log2(x)
 y=loge(x)
 y=log10(x)

ヒント

log a b 
log b
log a
2015/4/10
jykim
101
C言語による実習
三角関数のグラフ
1~100までの総和を求める
 2次方程式の解を求める
 2つの直線の交点を求める





2次関数、対数関数、指数関数のグラフを描く

三角関数等のグラフを描く
 放物運動のグラフを書く
2015/4/10
jykim


103
2015/4/10
sin 30 = 1 / 2
sin 45 = 2 / 2
sin 60 = 3 / 2
0.5
0
-6.28
-3.14
0
3.14
6.28
-0.5
-1
cos x


1
sin x
y

102
jykim
2015/4/10
x
cos 30 = 3 / 2
cos 45 = 2 / 2
cos 60 = 1 / 2
jykim
104
プログラムの例(1)
Sample4-9.c

// 結果をcsvファイルに出力
// xとyの値を格納
for ( i=0 ; i<360 ; i++ )
// 360回繰り返す
{
// -2 ~ 2
x[i] = 2.0*M_PI*i/180.0 - 2*M_PI; // xの値を格納
y[i] = sin( x[i] );
// yの値を格納
}
output( x, y );
return 0;
初速(v0)で水平と角( )をなす方向に質量(m)の物
体を投げた時の運動
y方向
#include <stdio.h>
#include <math.h>
void output( double x[], double y[]);
int main(void)
{
int i;
double x[360]; double y[360];
放物運動
5
4
3
2
1
0
0
// csvファイルへ出力
2.5
5
x方向
}
105
jykim
2015/4/10
物体に作用する力F


自由落下の場合も
斜めに投げ上げた場合も
鉛直下向きの
重力mgのみ作用
a x  0,
v y  v0 sin   gt
v0
y方向
ma y  mg
初速(v0)で水平と角( )をなす方向に質量(m)の物
体を投げた時の運動
5
4
v y  v0 sin3
鉛直初速vy
2
1
0
運動方程式 F = maは
ma x  0,
ay  g
jykim
107
2015/4/10
v x  v0 cos 

v x  v0 cos 
0
2015/4/10
106
jykim
2015/4/10

F  ( Fx , Fy )  (0,  mg )

10
水平・鉛直運動
空気の抵抗を無視すると、

7.5
2.5
水平初速vx
5
x方向
jykim
7.5
10
108
水平・鉛直運動


水平方向の移動距離(x方向速度×時間)
 x  v t  v cos   t
x
0
#include <stdio.h>
#include <math.h>
鉛直方向の移動距離(y方向速度×時間)
int main(void)
{
double pi
double g


放物運動プログラム(1)
y  v y t  v0 sin   t 
1 2
gt
2
void output(double t[], double x[], double y[]);
gt
v  v0  gt
t
移動距離
// π
// 重力加速度(m/s^2)
// 初速
double v0
↓変更
= 10.0;
// 初速(m/s) (12行目)
// 角度
double theta
↓変更
= pi/3.0;
// 角度(rad) (15行目)
double intv
=0.0625;
// 刻み時間
時間[s]
109
jykim
放物運動プログラム(2)
110
jykim
2015/4/10
グラフ
Sample4-10.c

初速=10.0の場合
y方向
double t[100];
// 時間
double x[100];
// x位置
double y[100];
// y位置
int i;
t[0]=0.0;
for ( i=0 ; i<100 ; i++ )
{
// 時間tの時、x方向の位置
x[i] = v0*cos(theta)*t[i] ;
x  v0 cos   t
1
y  v0 sin   t  gt 2
2
// 時間tの時、y方向の位置
y[i] = v0*sin(theta)*t[i] - 1.0/2.0*g*t[i]*t[i] ;
// yの値が0以下の場合、終了
if ( y[i]<0 )
break;
t[i+1] = t[i] + intv;
= 3.14159;
= 9.8;
v
物体mの質量は無関係
2015/4/10
Sample4-10.c
5
4
3
2
1
0
pi/3
pi/6
pi/4
0
// 時間更新
3
6
x方向
9
12
}
2015/4/10
jykim
111
2015/4/10
jykim
112
レポート

提出
cos xのグラフを描くプログラムを作成し、グラフを描き
なさい。




cos x*cos xのグラフを描くプログラムを作成し、グラフ
を描きなさい。
cos( x  x)  cos( x  x) 1  cos 2 x
 cos x * cos x 

2
2

cos x*sin xのグラフを描くプログラムを作成し、グラフ
を描きなさい。
 cos x * sin x  ?
2015/4/10
jykim
提出締め切り
場所

113
2015/4/10
来週授業開始前まで
情報演習室
jykim
114