Cの実行モデル
1
自由落下距離
前回の授業の「例題1」の復習と重要
事項の確認
地上で物を落とし始めた後の自由落下距離
を求める
重力加速度 g 9.8 とする
自由落下距離を求めるために,プログラム
中に,計算式 y = ( 9.8 / 2.0 ) *
x * x を書く
2
Microsoft Visual Studio C++ の画面構成
ファイルなど
が表示される
C++ソースファイル
の編集はここで行う
ビルド結果が現れる
3
#include "stdafx.h"
#include <math.h>
#pragma warning(disable:4996)
int _tmain()
{
double x;
double y;
char buf[256];
int i;
double start_x;
double step_x;
FILE* fp;
printf( "start_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &start_x );
printf( "step_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &step_x );
fp = fopen( "d:\\data.csv", "w" );
for( i = 0; i < 20; i++ ) {
x = start_x + ( i * step_x );
y = ( 9.8 / 2.0 ) * x * x;
printf( "x= %f, y= %f\n", x, y );
fprintf( fp, "x=, %f, y=, %f\n", x, y );
}
fprintf( stderr, "file d:\\data.csv created\n" );
fclose( fp );
return 0;
}
計算を行っている部分
キーボードからの
データ読み込み
行っている部分
ファイルへの書き出し
を行っている部分 4
#include "stdafx.h"
#include <math.h>
#pragma warning(disable:4996)
int _tmain()
{
double x;
double y;
char buf[256];
int i;
double start_x;
double step_x;
FILE* fp;
printf( "start_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &start_x );
printf( "step_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &step_x );
fp = fopen( "d:\\data.csv", "w" );
for( i = 0; i < 20; i++ ) {
x = start_x + ( i * step_x );
y = ( 9.8 / 2.0 ) * x * x;
printf( "x= %f, y= %f\n", x, y );
fprintf( fp, "x=, %f, y=, %f\n", x, y );
}
fprintf( stderr, "file d:\\data.csv created\n" );
fclose( fp );
return 0;
}
Cプログラムはメイン関数から
実行開始
プログラムは順次実行
この部分は繰り返し処理
for 文による繰り返し)
変数 x, y, buf, i, start_x,
step_x, fp をメモリエリア中に確保
5
#include "stdafx.h"
#include <math.h>
#pragma warning(disable:4996)
int _tmain()
{
double x;
double y;
char buf[256];
int i;
double start_x;
double step_x;
FILE* fp;
printf( "start_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &start_x );
printf( "step_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &step_x );
fp = fopen( "d:\\data.csv", "w" );
for( i = 0; i < 20; i++ ) {
x = start_x + ( i * step_x );
y = ( 9.8 / 2.0 ) * x * x;
printf( "x= %f, y= %f\n", x, y );
fprintf( fp, "x=, %f, y=, %f\n", x, y );
}
fprintf( stderr, "file d:\\data.csv created\n" );
fclose( fp );
return 0;
}
xの値から
( 9.8 / 2.0 ) * x * x
を求め,yに書き込む
Cプログラムはメインの関数から
実行開始
printf でメッセージを表示
fgets でキーボードから1行を読み込み
sscanf で数値を読み取って変数に格納
printf でメッセージを表示
fgets でキーボードから1行を読み込み
sscanf で数値を読み取って変数に格納
20回の繰り返し (i= 0, 1, ... 19)
6
実行の流れが今日の授業のポイント
#include "stdafx.h"
#include <math.h>
#pragma warning(disable:4996)
int _tmain()
{
double x;
double y;
char buf[256];
int i;
double start_x;
double step_x;
FILE* fp;
printf( "start_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &start_x );
printf( "step_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &step_x );
fp = fopen( "d:\\data.csv", "w" );
for( i = 0; i < 20; i++ ) {
x = start_x + ( i * step_x );
y = sin( x );
printf( "x= %f, y= %f\n", x, y );
fprintf( fp, "x=, %f, y=, %f\n", x, y );
}
fprintf( stderr, "file d:\\data.csv created\n" );
fclose( fp );
return 0;
}
変数は4種類使っている
整数を扱う int
文字を扱う char
整数は, 5, -3, 0 など
文字は, 1, 0, 3, -, a など
数字(1, 0, 3 など)も文字の一種
浮動小数を扱う double
3.14, -1.414, 5, 0, -3 など
5, 0, -3 などの整数も浮動小数の一種)
ファイルポインタ
ファイル操作に使う変数7
#include "stdafx.h"
#include <math.h>
#pragma warning(disable:4996)
int _tmain()
{
double x;
double y;
char buf[256];
int i;
double start_x;
double step_x;
FILE* fp;
printf( "start_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &start_x );
printf( "step_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &step_x );
fp = fopen( "d:\\data.csv", "w" );
for( i = 0; i < 20; i++ ) {
x = start_x + ( i * step_x );
y = sin( x );
printf( "x= %f, y= %f\n", x, y );
fprintf( fp, "x=, %f, y=, %f\n", x, y );
}
fprintf( stderr, "file d:\\data.csv created\n" );
fclose( fp );
return 0;
}
変数は4種類使っている
整数を扱う int
文字を扱う char
整数は, 5, -3, 0 など
文字は, 1, 0, 3, -, a など
数字(1, 0, 3 など)も文字の一種
浮動小数を扱う double
3.14, -1.414, 5, 0, -3 など
5, 0, -3 などの整数も浮動小数の一種)
ファイルポインタ
ファイル操作に使う変数8
double 型の変数については,
sscanf では %lf」を,printf , fprintf
では「%f」を,使う決まりになっている
「ビルド」による実行ファイルの生成
#include "stdafx.h"
#include <math.h>
#pragma warning(disable:4996)
int _tmain()
{
double x;
double y;
char buf[256];
int i;
double start_x;
double step_x;
FILE* fp;
printf( "start_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &start_x );
printf( "step_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &step_x );
fp = fopen( "d:\\data.csv", "w" );
for( i = 0; i < 20; i++ ) {
x = start_x + ( i * step_x );
y = ( 9.8 / 2.0 ) * x * x;
printf( "x= %f, y= %f\n", x, y );
fprintf( fp, "x=, %f, y=, %f\n", x, y );
}
fprintf( stderr, "file d:\\data.csv created\n" );
fclose( fp );
return 0;
}
C++ソースファイル
その他のファイル
ビルド
Microsoft Visual
Studio C++
「ビルド」により実行ファイル等
が生成される
実行ファイル
構文エラーがあると,
ビルド」時にエラーメッセージが表示される
(実行ファイルは生成されない)
その他,ビルドの結果
として生成されるファイル
9
「消去(clean)」の操作
その他のファイル
ビルド
Microsoft Visual
Studio C++
「消去(clean)」の操作により,
ビルドの結果が消える
(元のソースファイル等は消えない)
実行ファイル
その他,ビルドの結果
として生成されるファイル
10
#include "stdafx.h"
#include <math.h>
#pragma warning(disable:4996)
int _tmain()
{
double x;
double y;
char buf[256];
int i;
double start_x;
double step_x;
FILE* fp;
printf( "start_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &start_x );
printf( "step_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &step_x );
fp = fopen( "d:\\data.csv", "w" );
for( i = 0; i < 20; i++ ) {
x = start_x + ( i * step_x );
y = ( 9.8 / 2.0 ) * x * x;
printf( "x= %f, y= %f\n", x, y );
fprintf( fp, "x=, %f, y=, %f\n", x, y );
}
fprintf( stderr, "file d:\\data.csv created\n" );
fclose( fp );
return 0;
}
C++ソースファイル
「消去(clean)」の操作
「消去(clean)」の操作を行っても,元のソース
ファイルが消えるわけでは無い(ディスク使用量
節約になる) 11
構文エラーの例
全角文字
全角文字はプログラム中の決められた場所にしか
入れてはならない。
コメント
文字列(ダブルクォートで囲まれた部分
"抜け
;忘れ
など
12
ビルド結果が現れる.「1 正常
終了,0 失敗・・・」ならばビルド
に成功
ビルドが正常終了し,実行ファイルが生成できた
ことを示すメッセージ
13
構文エラーの例(1)
ここでは,セミコロン「;」を入れるのを
忘れている(人間の目では発見が難しい)
ビルドが失敗したことを示すメッセージ
7行目に構文エラー
14
構文エラーの例(1)
マウスで「構文エラー」とある行をダブルクリックすると,
エディタのカーソルが動く
エラーの付近にマークが付く
15
ここでは,セミコロン「;」を入れるのを
忘れている(人間の目では発見が難しい)
構文エラーの例(2)
ここで,「doublr」とあるのはスペルミス
(正しくは,double
ビルドが失敗したことを示すメッセージ
(ミスは1箇所なのに,エラーは多数)
行目に「’doublr:定義されていない識別子です」
16
データファイル
プログラムでのファイル操作
ファイル生成
ファイル読み出し
ファイル書き込み
17
#include "stdafx.h"
#include <math.h>
#pragma warning(disable:4996)
int _tmain()
{
double x;
double y;
char buf[256];
int i;
double start_x;
double step_x;
FILE* fp;
printf( "start_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &start_x );
printf( "step_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &step_x );
fp = fopen( "d:\\data.csv", "w" );
for( i = 0; i < 20; i++ ) {
x = start_x + ( i * step_x );
y = ( 9.8 / 2.0 ) * x * x;
printf( "x= %f, y= %f\n", x, y );
fprintf( fp, "x=, %f, y=, %f\n", x, y );
}
fprintf( stderr, "file d:\\data.csv created\n" );
fclose( fp );
return 0;
}
「自由落下距離」のプログラムを実行すると
データファイルが生成される
C++ソースファイル
その他のファイル
ビルド
Microsoft Visual
Studio C++
実行ファイル
データファイル
自由落下距離のプログラムを実行すると,
データファイル data.csv が生成される
データファイルに関係
している部分
18
例題1.自由落下距離
自由落下距」のプログラムについ
て,実行順を確認するとともに,変数
の値の変化観察する
Microsoft Visual Studio C++ のステップ実
行機能を使用
前回の授業で作成した「プロジェクト」を
開く
19
#include "stdafx.h"
#include <math.h>
#pragma warning(disable:4996)
int _tmain()
{
double x;
double y;
char buf[256];
int i;
double start_x;
double step_x;
FILE* fp;
printf( "start_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &start_x );
printf( "step_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &step_x );
fp = fopen( "d:\\data.csv", "w" );
for( i = 0; i < 20; i++ ) {
x = start_x + ( i * step_x );
y = ( 9.8 / 2.0 ) * x * x;
printf( "x= %f, y= %f\n", x, y );
fprintf( fp, "x=, %f, y=, %f\n", x, y );
}
fprintf( stderr, "file d:\\data.csv created\n" );
fclose( fp );
return 0;
}
前回の授業の例題1
と同じ
20
#include "stdafx.h"
#include <math.h>
#pragma warning(disable:4996)
int _tmain()
{
double x;
double y;
char buf[256];
int i;
double start_x;
double step_x;
FILE* fp;
printf( "start_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &start_x );
printf( "step_x =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &step_x );
fp = fopen( "d:\\data.csv", "w" );
for( i = 0; i < 20; i++ ) {
x = start_x + ( i * step_x );
y = ( 9.8 / 2.0 ) * x * x;
printf( "x= %f, y= %f\n", x, y );
fprintf( fp, "x=, %f, y=, %f\n", x, y );
}
fprintf( stderr, "file d:\\data.csv created\n" );
fclose( fp );
return 0;
}
Visual Studio C++
ステップ実行で観察した
ステップ実行の順序
実際に確認しよう
・・・ 123
・・・124
・・・125
・・・126
・・・127
・・・128
129
130
131
132
20回の繰り返し
(i = 0, 1, ... 19)
21
ビルド後の画面
ビルドが正常終了したことを示
すメッセージ
ビルドの手順:
「ビルド」「ソリューションのビルド」
ビルドが正常終了しない
ときは,プログラム中の
構文エラーを疑う
「1.正常終了」を確認
22
実行
を示すマーク
実行ウインドウ
が開く
F10」キーを押すとステップ実行
始まる.(マウスカーソルは,
Microsoft Visual Studio C++ に入れておく) 23
変数の値を
観察できる さらに「F10」キーを押すとステップ
実行が続く
マークが進む
24
表示されたメッセージ
printf( "start_x=" );の実行が
終わったので,メッセージが出る
さらに「F10」キーを押すとステップ
実行が続く 25
変数の値を
観察できる
マークが進む
入力待ち状態
(fgets( buf, 256, stdin );の実行が
終わったので,実行ウインドウに
おけるキーボードからの入力待ち
状態に入っている)
さらに「F10」キーを押すとステップ
実行が続く(今度は入力待ち状態)
26
マークが
変化
マークが現れる
読み込んだデータが変数 buf
入ったことが確認でき
ここでは 0 Enter
実行ウインドウで,「0 Enter」と
すると,ステップ実行が再開する
実行ウインドウで「0 Enter」とすると実
行が続く0 の部分は数値なら何でも良い) 27
実行手順 (通常実行の場合)
Microsoft Visual Studio C++ 「デバック」
デバッグなしで開
すると,新しいインドが開く
新しいインドが現れるので, start_x,
step_x の値をキーボードから与える
例えば
start_x = 0
step_x = 0.1
インド消えるが,d: ドライブ
data.csv (データファイル)が作成されるの
で,Excel 等で開き確認する 28
実行手順 ステップ実行の場
合)
Microsoft Visual Studio C++
F10(ファンクションの10)
すると,新しいインド開く
F10」は,Microsoft Visual Studio C++イン
内にマスカーソルを入れた状態で押すこと
F10 を押すたびに,1ステップずつ実行
が進む
29
例題2.平方根の計算
浮動小数データを読み込んで,平方根の計
算と表示を行プログラムを作る.
但し,負の数の場合には,メッセージを表示す
負の数であるかどによって条件分岐を行
ために if 文を使
例) 9のとき:
-1のとき: メッセージを表示 30
#include "stdafx.h"
#include <math.h>
int _tmain()
{
double x;
double y;
char buf[256];
int ch;
printf("x=");
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &x );
if ( x < 0 ) {
printf("負なので計算できませ\n");
}
else {
y = sqrt(x);
printf("sqrt(%f)=%f\n", x, y);
}
ch = getchar();
ch = getchar();
return 0;
}
条件が成り立つ
場合に実行され
る部分
条件式
条件が成り立た
ない場合に実行
される部分
31
#include "stdafx.h"
#include <math.h>
int _tmain()
{
double x;
double y;
char buf[256];
int ch;
printf("x=");
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &x );
if ( x < 0 ) {
printf("負なので計算できませ\n");
}
else {
y = sqrt(x);
printf("sqrt(%f)=%f\n", x, y);
}
ch = getchar();
ch = getchar();
return 0;
}
変数は3種類使っている
整数を扱う int
文字を扱う char
整数は, 5, -3, 0 など
文字は, 1, 0, 3, -, a など
数字(1, 0, 3 など)も文字の一種
浮動小数を扱う double
3.14, -1.414, 5, 0, -3 など
5, 0, -3 などの整数も浮動小数の一種)
変数 xdouble 型なので,
sscanf では %lf」を,printf
では「%f」を,使う決まりになっている 32
#include "stdafx.h"
#include <math.h>
int _tmain()
{
double x;
double y;
char buf[256];
int ch;
printf("x=");
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &x );
if ( x < 0 ) {
printf("負なので計算できません\n");
}
else {
y = sqrt(x);
printf("sqrt(%f)=%f\n", x, y);
}
ch = getchar();
ch = getchar();
return 0;
}
実行順
(x<0) の場合
33
#include "stdafx.h"
#include <math.h>
int _tmain()
{
double x;
double y;
char buf[256];
int ch;
printf("x=");
fgets( buf, 256, stdin );
sscanf_s( buf, "%lf\n", &x );
if ( x < 0 ) {
printf("負なので計算できません\n");
}
else {
y = sqrt(x);
printf("sqrt(%f)=%f\n", x, y);
}
ch = getchar();
ch = getchar();
return 0;
}
実行順
(x0) の場合
34
平方根の計算
マークが「if ( x < 0 ) {」に来たときに,
F10」を押すと 35
y = sqrt(x);」の行にジャンプする 36
条件分岐とは
Yes
No
条件式
「ある条件式」が成り立てばAを、成
り立たなければBを実行
37
if 文と else
「条件式」が成り立てばAを、成り立たな
ければBを実行
Yes
No
条件式
if ( 条件式 ) {
;
...
}
else {
;
...
}
38
if
if 文のみを書いて,else 文を書かないことも
きる
「ある条件」が成り立つときに限りAを実行
Yes
No
条件式
if ( 条件式 ) {
;
...
}
39
比較演算
条件式の中には,ふ,比較演算を書く
演算子 意味
左辺が右辺より小さい
<= 左辺が右辺以下
左辺が右辺より大きい
>= 左辺が右辺以上
== 左辺が右辺と等しい
!= 左辺が右辺と等しくない
40
比較演算の例
if (age >= 20 ){
printf("You may drink alcoholic beverage. ");
}
else{
printf("You may not drink alcoholic beverage.");
}
「左辺が右辺以上」の意味
41
字下げとセミコロンを忘れないこと
if ( 条件式 ) {
;
...
}
else {
;
...
}
if ( 条件式 ) {
;
...
}
字下げ セミコロン
字下げ セミコロン
セミコロンを忘れる
プログラムは動かな
字下げを忘れると
プログラムは動くが,
読みづらい
42
例題3.棒グラフでのステップ
実行
整数から,その長さだけの棒を表示す
る関数 bar を作る
例) 5 → *****
関数 bar を使って,「整数を読み込ん
で,読み込んだ長さの棒を表示するメ
イン関数を作
ステップ実行(「F10」キー)を行
注意点
今までのプロジェクトを使ってもよい.
新しいプロジェクトを作成してもよい 43
#include "stdafx.h"
#include <math.h>
void bar( int len )
{
int i;
for (i=0; i<len; i++) {
printf("*");
}
printf("\n");
return;
}
int _tmain()
{
int len;
char buf[256];
int ch;
printf( "len =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%d\n", &len );
bar( len );
ch = getchar();
ch = getchar();
return 0;
}
棒グラフ
44
#include "stdafx.h"
#include <math.h>
void bar( int len )
{
int i;
for (i=0; i<len; i++) {
printf("*");
}
printf("\n");
return;
}
int _tmain()
{
int len;
char buf[256];
int ch;
printf( "len =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%d\n", &len );
bar( len );
ch = getchar();
ch = getchar();
return 0;
}
棒グラフ
bar関数
main関数
プログラム実行は
メイン関数から始まる
複数の関数を含む
プログラム
45
#include "stdafx.h"
#include <math.h>
void bar( int len )
{
int i;
for (i=0; i<len; i++) {
printf("*");
}
printf("\n");
return;
}
int _tmain()
{
int len;
char buf[256];
int ch;
printf( "len =" );
fgets( buf, 256, stdin );
sscanf_s( buf, "%d\n", &len );
bar( len );
ch = getchar();
ch = getchar();
return 0;
}
変数は2種類使っている
整数を扱う int
文字を扱う char
整数は, 5, -3, 0 など
文字は, 1, 0, 3, -, a など
数字(1, 0, 3 など)も文字の一種
変数 len int 型なので,
sscanf では「%d」を使う決まりになっている
46
ビルド後の画面
ビルドが正常終了したことを示
すメッセージ
ビルドの手順:
「ビルド」「ソリューションのビルド」
ビルドが正常終了しない
ときは,プログラム中の
構文エラーを疑う
47
ステップ実行
F10」キーを押すとステップ実行
始まる.(マウスカーソルは,
Microsoft Visual Studio C++ 内に入れておく) 48
さらに「F10」キーを押すとステップ
実行が続く
マークが進む
変数の値が変化する
49
さらに「F10」キーを押すとステップ
実行が続く
50
実行ウインドウで「5Enter」とすると実
行が続く5 の部分は整数なら何でも良い) 51
さらに「F10」キーを押すとステップ
実行が続く 52
例題3(b).棒グラフでのステッ
プイン
ステップ実行とステップインを
ステップ実行(「F10」キー)
ステップイン(「F11」キー)
例題2のプログラムをそのまま使
53
プログラム実行順
普通,プログラム中の文は,上から下
へ順に実行される
関数呼び出しでは,関数の先頭に
「ジャンプ」する.
関数呼び出しの例 bar( len );
呼び出された関数の中で return に出
と,関数呼び出しの場所に戻る
このことは,C言語が「手続き型言語」と言われる理由の1つ
54
#include "stdafx.h"
#include <math.h>
void bar( int len )
{int i;
for (i=0; i<len; i++) {
printf("*");
}
printf("\n");
return;
}
int _tmain()
{int len;
int ch;
printf( "len=" );
scanf( "%d", &len );
bar( len );
ch = getchar();
ch = getchar();
return 0;
}
プログラムの流れ
bar 関数
メイン関数
bar( len );
関数呼び出し
return;
プログラムの実行開始
プログラムの実行終了 * printf, scanf
呼び出しについては
図では省略 55
関数呼び出し
#include "stdafx.h"
#include <math.h>
void bar( int len )
{
int i;
for (i=0; i<len; i++) {
printf("*");
}
printf("\n");
return;
}
int _tmain()
{
int len;
int ch;
printf( "len=" );
scanf( "%d", &len );
bar( len );
ch = getchar();
ch = getchar();
return 0;
}
プログラム実行順
戻り
メイン関数の先頭行
がプログラム実行の始まり
メイン関数内の return
がプログラム実行の終わり
56
ステップイン機能
マークが「bar( len );」の行に来たときに
F11 キーを押して,ステップイン機能を使う
57
ステップイン機能
マークが bar 関数の内部に移る
後は,「F10」キーでステップ実行を続ける
58
補足説明事項
59
ブレークポイント
Microsoft Visual Studio C++ のブレーク
ポイント機能を試す
ブレークポイント
60
Microsoft Visual Studio.NET
でのブレークポイント設定
ここをクリックして,ブレークポイントの設定
「●」はブレークポイント設定済みの印
ブレークポイントでプログラム実行が中断するので,
実行結果の画面が消えずに残る 61