目次 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 53 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 解が虚数の場合 D0 解が異なる2つの場合( 2 74 jykim 2015/4/10 2次方程式の解 ax2+bx+c=0の解の判別式 } D0 ) D0 ) 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 ac 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 , ac 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
© Copyright 2024 ExpyDoc