ce-5. 中間まとめ1
1
金子邦彦
(C プログラミング応用)(全14回)
URL: https://www.kkaneko.jp/pro/c/index.html
資料の構成
• 変数の種類
• 前回授業のプログラムを使って確認
• int 整数
• char 文字
• double 浮動小数 など
• 論理的エラーの発見と解決
• ステップ実行機能なども使用して,論理的エラーの発
見と解決の練習を行う
• 条件分岐と繰り返しに関する練習
• while と if の組み合わせ
•2
変数の種類
•3
#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 = 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
変数は4種類使っている
整数を扱う int 型
文字を扱う char 型
整数は, 5, -3, 0 など
文字は, 1, 0, 3, -, a など
数字(1, 0, 3 など)も文字の一種
浮動小数を扱う double 型
3.14, -1.414, 5, 0, -3 など
(5, 0, -3 などの整数も浮動小数の一種)
ファイルポインタ
ファイル操作に使う変数
double 型の変数については,
sscanf では 「%lf」(エルエフ)を,printf ,
fprintf では「%f」を,使う決まりになっている
論理的エラーの発見と解決
•5
例題1.論理的エラーの例(1)
• 次ページのプログラムは,構文エラーは無い(ビ
ルドは問題無くできる)
• 実行してみると,動作がおかしい
• 資料の手順に従って,原因を探し,解決しなさい
•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 = sin( x );
printf( "x= %d, y= %d¥n", x, y );
fprintf( fp, "x=, %d, y=, %d¥n", x, y );
}
fprintf( stderr, "file d:¥¥data.csv created¥n" );
fclose( fp );
return 0;
}
•7
まずは,このページのプログラムを
ビルド,実行してみなさい
•8
ビルド後の画面
ビルドが正常終了したこと
を示すメッセージ
ビルドの手順:
「ビルド」→「ソリュー
ションのビルド」
「1.正常終了」を
確認
実行中の画面
実行の手順:
「デバッグ」→
「デバッグなし
で開始」
実行ウインドウが現れるので,
start_x = 0 Enter
step_x = 0.1 Enter
のように操作してみる
•9
実行結果の確認
•10
d ドライブの
data.csv をダブル
クリックする
実行の結果,データファイルが生成されるので,
中身を確認してみる
結果が期待通りになっていない
•11
#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 = 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;
}
•12
x, y は double 型の変数なので,
sscanf では 「%lf」を,printf, fprintf
では「%f」を使う決まりになっている
「%d」ではなく,「%f」が正しい
元のプログラムに間違いがあることが
分かった.
例題2.繰り返しと条件分岐
• キーボードから数値(正の整数)を読み込んで,
足し算を続けるプログラム
• 変数の用途
• sum 足し算の結果
• buf キーボードから読み込んだ1行分
• n キーボードから読み込んだ整数値
•13
#include "stdio.h"
#include <math.h>
int main()
{
int sum;
int n;
char buf[256];
printf( "整数の足し算を続けます¥n" );
printf( "終了したいときは,負の数を入力してください¥n" );
sum = 0;
while ( 1 ) {
printf( "整数値をどうぞ:", buf );
fgets( buf, 256, stdin );
sscanf_s( buf, "%d¥n", &n );
if ( n >= 0 ) {
printf ( "%d + %d = %d¥n", sum, n, sum + n );
sum = sum + n;
}
else {
break;
}
}
return 0;
}
•14
•15
実行画面
•16
実行画面
「-2 Enter」のようにして,負の数を与えると,
プログラムの実行が止まる
•17
#include "stdio.h"
#include <math.h>
int main()
{
int sum;
int n;
char buf[256];
printf( "整数の足し算を続けます¥n" );
printf( "終了したいときは,負の数を入力してください¥n" );
sum = 0;
while ( 1 ) {
printf( "整数値をどうぞ:", buf );
fgets( buf, 256, stdin );
sscanf_s( buf, "%d¥n", &n );
if ( n >= 0 ) {
printf ( "%d + %d = %d¥n", sum, n, sum + n );
sum = sum + n;
}
else {
break;
}
}
return 0;
}
•18
n ≧ 0 のとき実行される部分
n < 0 のとき実行される部分
「while ( 1 )」 は, 無条件に繰り返す
という意味になる
(「1」が,常に成り立つ条件式の意味)
この「break;」は,while による繰り返し処理
から抜け出すという意味になる.
(n < 0 のとき抜け出す)
課題
• プログラムの作成と動作確認を行いなさい.次の
1,2,3のうち1つ以上を各自で選ぶこと.
• 例題2のプログラムについて,計算結果を,デー
タファイル 「d:¥sum.csv」に出力するように書
き換えなさい
• for あるいは while を使い, を求める
プログラムを作成しなさい
• 例題2のプログラムについて,平均値を表示でき
るように書き換えなさい
•19
=
+
n
k
kk
1
)1(