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(