ce-14. プログラムの実行順序
1
金子邦彦
(C プログラミング応用)(全14回)
URL: https://www.kkaneko.jp/pro/c/index.html
C言語プログラムの実行順序の理解、Microsoft Visual
Studio C++のステップ実行機能を用いた変数値変化の観察。
【学習内容の構成】
1. プログラムの順次実行:メイン関数から始まり上から下
へ順に実行される基本原理
2. ビルドと実行ファイル生成:C++ソースファイルからの
実行ファイル生成、構文エラー時の対処
3. 条件分岐:if文・else文による条件式の成否に応じた処理
の切り替え
4. 関数呼び出しと戻り:関数呼び出しによるジャンプと
return文による呼び出し元への復帰
5. デバッグ機能:ステップ実行(F10)、ステップイン
(F11)、ブレークポイントによる実行制御と変数観察
• 前提:Microsoft Visual Studio C++の基本操作、C言語の変
数・繰り返し・関数の基礎知識
• 意義:プログラムの動作原理の理解、デバッグ技法の習得
2
自由落下距離
• 前回の授業の「例題1」の復習と重要事項の確認
• 地上で物を落とし始めた後の自由落下距離を求める
• 重力加速度 g は 9.8 とする
• 自由落下距離を求めるために,プログラム中に,計算
式 y = ( 9.8 / 2.0 ) * x * x を書く
•3
Microsoft Visual Studio C++ の画面構成
•4
ファイルなど
が表示される
C++ソースファイ
ルの編集はここで行
う
ビルド結果が現れ
る
#include "stdio.h"
#include <math.h>
#pragma warning(disable:4996)
int main()
{
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;
}
•5
自由落下距離の
計算を行っている部分
データファイル名
d:¥¥data.csv
は適切に設定すること
#include "stdio.h"
#include <math.h>
#pragma warning(disable:4996)
int main()
{
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;
}
•6
計算を行っている部分
キーボードからの
データ読み込みを
行っている部分
ファイルへの書き出し
を行っている部分
#include "stdio.h"
#include <math.h>
#pragma warning(disable:4996)
int main()
{
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;
}
•7
Cプログラムはメイン関数から
実行開始
プログラムは順次実行
変数 x, y, buf, i, start_x,
step_x, fp をメモリエリア中に確保
printf でメッセージを表示
fgets でキーボードから1行を読み込み
sscanf で数値を読み取って変数に格納
printf でメッセージを表示
fgets でキーボードから1行を読み込み
sscanf で数値を読み取って変数に格納
20回の繰り返し (i = 0, 1, ... 19)
x の値から
( 9.8 / 2.0 ) * x * x
を求め,y に書き込む
「ビルド」による実行ファイルの生成
•8
#include "stdio.h"
#include <math.h>
#pragma warning(disable:4996)
int main()
{
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++
「ビルド」により実行ファイル等
が生成される
実行ファイル
構文エラーがあると,
「ビルド」時にエラーメッセージが表示される
(実行ファイルは生成されない)
その他,ビルドの結果
として生成されるファイル
「消去(clean)」の操作
•9
その他のファイル
ビルド
Microsoft Visual
Studio C++
「消去(clean)」の操作により,
ビルドの結果が消える
(元のソースファイル等は消えない)
実行ファイル
その他,ビルドの結果
として生成されるファイル
#include "stdio.h"
#include <math.h>
#pragma warning(disable:4996)
int main()
{
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++ソースファイル
•10
「消去(clean)」の操作
「消去(clean)」の操作を行っても,元のソース
ファイルが消えるわけでは無い(ディスク使用量
の節約になる)
構文エラーの例
• 全角文字
• 全角文字はプログラム中の決められた場所にしか入れ
てはならない。
• コメント
• 文字列(ダブルクォートで囲まれた部分)
• 「"」 抜け
• 「;」 忘れ
• など
•11
ビルド結果が現れる.「1
正常終了,0 失敗・・・」
ならばビルドに成功
ビルドが正常終了し,実行ファイルが生成できた
ことを示すメッセージ
•12
•13
構文エラーの例(1)
ここでは,セミコロン「;」を入れるのを
忘れている(人間の目では発見が難しい)
ビルドが失敗したことを示すメッセージ
7行目に構文エラー
構文エラーの例(1)
マウスで「構文エラー」とある行をダブルクリックすると,
エディタのカーソルが動く
エラーの付近にマークが付く
•14
ここでは,セミコロン「;」を入れるのを
忘れている(人間の目では発見が難しい)
•15
構文エラーの例(2)
ここで,「doublr」とあるのはスペルミス
(正しくは,double)
ビルドが失敗したことを示すメッセージ
(ミスは1箇所なのに,エラーは多数)
9行目に「’doublr’:定義されていない識別子です」
データファイル
• プログラムでのファイル操作
• ファイル生成
• ファイル読み出し
• ファイル書き込み
•16
#include "stdio.h"
#include <math.h>
#pragma warning(disable:4996)
int main()
{
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;
}
「自由落下距離」のプログラムを実行すると
データファイルが生成される
•17
C++ソースファイル
その他のファイル
ビルド
Microsoft Visual
Studio C++
実行ファイル
データファイル
自由落下距離のプログラムを実行すると,
データファイル data.csv が生成される
データファイルに関係
している部分
例題1.自由落下距離
• 「自由落下距離」のプログラムについて,実行順
を確認するとともに,変数の値の変化を観察する
• Microsoft Visual Studio C++ のステップ実行機能を使用
• 前回の授業で作成した「プロジェクト」を開く
•18
#include "stdio.h"
#include <math.h>
#pragma warning(disable:4996)
int main()
{
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;
}
•19
自由落下距離の
計算を行っている部分
データファイル名
d:¥¥data.csv
は適切に設定すること
•20
ビルド後の画面
ビルドが正常終了したこと
を示すメッセージ
ビルドの手順:
「ビルド」→「ソリューションのビル
ド」
ビルドが正常終了しない
ときは,プログラム中の
構文エラーを疑う
「1.正常終了」を
確認
実行
を示すマーク
実行ウインドウ
が開く
「F10」キーを押すとステップ実行が
始まる.(マウスカーソルは,
Microsoft Visual Studio C++ 内に入れておく)
•21