cprogram.

機械工学実験
「C 言語(Turbo-C)」
実験担当者:
目次
1回目
C 言語(基礎編)
1-1
C 言語・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2
1-2
予備知識・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2
1-3
Turbo-C の概略・・・・・・・・・・・・・・・・・・・・・・・・・・・・2
1-4
Turbo-C の操作説明・・・・・・・・・・・・・・・・・・・・・・・・・・3
1-5
Turbo-C を用いてのプログラム作成・・・・・・・・・・・・・・・・・・・3
1-6
算術演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・6
1-7
代入演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・7
2回目
C 言語(応用編)
2-1
関係演算子・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・8
2-2
繰り返し
2-3
構造体と共用体・・・・・・・・・・・・・・・・・・・・・・・・・・・・9
2-4
DA 変換ボードの演習(C プログラムによる波形の作成)
for 文・・・・・・・・・・・・・・・・・・・・・・・・・・・9
2-4-1
はじめ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・12
2-4-2
機能および仕様・・・・・・・・・・・・・・・・・・・・・・・・・・・12
2-4-3
演習用 C プログラムの解説・・・・・・・・・・・・・・・・・・・・・・13
2-4-4
波形の出力結果・・・・・・・・・・・・・・・・・・・・・・・・・・・18
2-4-5
デジタルストレージオシロスコープの使い方・・・・・・・・・・・・・・19
1回目
C 言語(基礎変)
1−1.C 言語
コンピュータを動かすには、ソフトウェア(プログラムの集まり)がなければならない。大
型コンピュータやパソコンにいたるまでコンピュータはただの箱でありソフトを作る(書
く)事で機能する。この時「プログラム言語」と呼ぶものを使用する。
プログラミング言語の中には「BASIC」や「COBOL」、「FORTRAN」、「アセンブラ」、
「C 言語」などがある。初心者向けには「BASIC」、実用的プログラミングには「C 言語」、
「アセンブラ」が使用される。
1−2.予備知識
※ビット(bit)・・・コンピュータで演算子が一度に処理する数値の桁数をビットといい、
1 または 0 を表わす情報量の最小範囲である。よって、1ビットで2つの数、2 ビットで
4つの数3ビットで8つの数を表わすことができる。(1バイト=8ビット)
例)n ビットの個数は 2^n
※ 2進数とは 1 と 0 だけの数字の世界である。
※ 16進数とは 0∼9 と A∼F までを使った世界である。
2進数
10進数
16進数
0000
0
0
0001
1
1
0010
2
2
0011
3
3
0100
4
4
0101
5
5
0110
6
6
0111
7
7
1000
8
8
1001
9
9
1010
10
A
1011
11
B
1100
12
C
1101
13
D
1110
14
E
1111
15
F
1−3.Turbo−Cの概略
C はプログラムにとって確かに有効なプログラム言語の一つですが、コンパイラ言語にあ
りがちな操作性のわずらわしさから、敬遠されがちでした。
Turbo-C の総合開発環境はプルダウンメニュー方式であるためエディット、コンパイル、
リンク、実行がすばやく行えるので、コンパイラ言語に不慣れな初心者にも違和感なく使
えます。
1−4.Turbo−Cの操作説明
Save
(ここではパソコンの画面上で説明する)
・・・プログラムをセーブするには、まずエディットモードから抜けます。F・10
でメインメニューモードに戻り File の項目にあわせてリターンキーを押し
Save を選ぶ。プログラム名を入力した後、リターンキーを押す。
Load
・・・File の項目内にあるプログラムを呼び出すときに使う。
New
・・・新規作成するときに使う。
Ran
・・・Ran の項目内にありプログラムの実行を意味する。Ran をすることで
Compile(exe)エグゼファイルの作成を行い、実行できる。(新規作成したとき
のみ)
Compile とはコンピュータ内でコンピュータ用の言葉に変換することを意味
する。
User screen
・・・Ran の項目内にあり、実行後の画面の表示を意味する。
Build all ・・・Compile の項目内にあり、同名でセーブデータを上書きし、Compile(exe)
エグゼファイルを作り直すときに使う。
1−5.Turbo−Cを用いてのプログラム作成
[例題1−1]次のプログラムを実行してみよう。
/*
Hello と Ohayou を表示させるプログラム
*/
main()
{
printf(“Hello¥n”);
printf(“Ohayou¥n”);
}
実行結果
Hello
Ohayou
解説
①/*
Hello と Ohayou を表示させるプログラム
*/
ここではプログラムをわかりやすく作るために、/* */の中にコメントを表記する。なお
コメントはプログラムになんら影響を及ぼさない。
②main()
{
プログラム本体
}
このような形にまとまったものを、C 言語では関数という。Main とは関数の名前であり、
そのあとの()は関数を示すためのカッコである。つまり、main()関数は{からプログ
ラム本体が始まり}で終わる。
③printf(“Hello¥n”);
printf(“Ohayou¥n”);
文字や数字を出力する標準関数に printf がある。
書式
printf(“文字列”);
文字そのものを出力するには printf()関数の中に””(ダブルクォーテーション)で囲まれた
文字列を記述するだけでよい。””の中に書かれた文字列はそのまま形で出力される。
Print()関数の文字列の最後に、
「¥n」が書かれているのに、その文字が出力されていない。
これは特殊な記号を送る働きをもったものでエスケープ文字といい、この¥n は二文字で
一つの文字として扱い画面にそれ自身は出力されない。
「¥n」は、ニューラインといい働
きとしては「改行」を行う信号である。」
[問題1−1]
自分の名前と生年月日を printf()関数とニューライン「¥n」を用いて2行で表示せよ。
[問題1−2]
アスタリスク‘*’を10個横に並べて出力するプログラムを作れ。
[例題1−2]
次のプログラムを実行してみよう。
/*複数の編集変換子*/
main()
{
int
a=15;
printf(“%d¥n”,a);
printf(“%x¥n”,a);
}
実行結果
15
f
解説
① 編集変換子
printf(“書式”,変数);
printf 関数の中に、出力する変数に対して書式を設定する方法がある。書式は“”で囲
み、先頭に%を置き、その後に編集変換子と呼ばれる記号を付けることによって変数の
出力状態を決めるようになっている。変数の位置には変数を置くばかりでなく、式を書
くこともできる。printf()関数の中で使われるデータの書式指定のための編集変換子に
は次のような種類がある。
編集変換子の種類
データの型
整数型
② int
変換文字
出力状態
d
10進数
x、X
16進数
a=15;
a を整数型(int)で宣言し、その中を15に設定している。
[問題1−3]
10進数の10から15までを16進数に変換して縦に並べて出力せよ。
1−6.算術演算子
四則演算などの算術演算子のための演算子を算術演算子という。
例)b=20, c=4 とした場合の a とその値の算出例
加算(+)
a=b + c
a = 20 + 4
24
減算(−)
a=b − c
a = 20 – 4
16
乗算(*)
a=b * c
a = 20*4
80
乗算(/)
a=b / c
a = 20/4
5
剰余(%)
a=b % c
a = 20%4
0
%はモジュロ演算子といい、二項演算で余りを求めるときに用いる。
[例題 1-3]
/*
算術演算子
*/
main()
{
int a,b,c;
b=10;
c=3;
a=b*3-c/2;
printf(“%d¥n”,a);
}
実行結果
29
解説
a=10*3−3/2
=30-1
=29
ここでは 3/2 は 1.5 ではなく、整数同士を割ると結果も整数化されて1となる。
整数化は整数部の四捨五入ではなく、端数切捨てとなる。
[問題1−4]
a=14,b=6 として、この2数の和、差、積、商、剰余をそれぞれ求めるプログラムを作れ。
1−7.代入演算子
a=a+1;
は右辺の a+1 の演算結果を左辺の a に代入することを意味する式であるが、これと同じこ
とを
a+=1
と表記することができる。「a に加算する増分は 1 である」という意味とも言える。
=
a=b
a=b
bにaを代入
+=
a+=b
a=a+b
aにbを加算a
−=
a−=b
a=a−b
aからbを減算しa
*=
a*=b
a=a*b
aにbをかけてa
/=
a/=b
a=a/b
aをbで割ってa
%=
a%=b
a=a%b
aをbで割った余りをa
&=
a&=b
a=a&b
aとbの理論積をしa
|=
a|=b
a=a|b
aとbの理論和をしa
<<=
a<<=b
a=a<<b
aにbビット左シフトをしa
>>=
a>>=b
a=a>>b
aにbビット右シフトをしa
*シフト演算子について
シフト演算子は、ビット並びを、左や右に必要な数だけシフト(桁ずらし)するための演算
子です。対象となるデータ型は、整数型と文字型です。
例)
aが−1234であるとき、
1111101100101110
aを左に2ビットシフトする。
(a<<=2)
1110110010111000
aを右に2ビットシフトする。
・・・
ゼロが補充される。
(a>>=2)
1111101100101110
[例題1−4]5に3を加えて同じ変数に再び代入するプログラム
/*
代入演算子
main()
{
int a=5;
a+=3;
printf(“%d¥n”,a);
}
*/
実行結果
8
解説
int
a=5という変数を整数型で宣言し、さらにその変数に定数5を代入している
ことを意味する。
int a,b,c;
a=b=c=0;
という式があったとすれば、これらの式はすべて整数型であることになり、まず、c=0
とし、その結果をbに代入し、さらにその結果をaに代入するという意味をあらわす。し
たがって、すべての値を0とすることと同じである。
[問題1−5]変数、a、b、cすべての初期値を10として、それぞれに3を加算、
減算、乗算した結果を再び代入し、値を求めて出力せよ。
2回目
C 言語(応用編)
2−1.関係演算子
関係演算子とは、2 つの数値を比較して、その結果を評価するものである。評価した値は、
結果が真であれば1となり、偽であれば 0 を返すようになっている。たとえば、
a=(b==c);
という式の b と c の値を比較し、その結果を a に代入することを意味する。bと c の値が
等しいとき a は1となり、等しくないとき a は 0 となる。
[例題2−1]
/*
関係演算子を用いて次のプログラムを実行せよ。
関係演算子
*/
main()
{
int
a;
int
b=3;
int
c=4;
a=(b==c);
printf(“%d¥n”,a);
}
実行結果
0
解説
b==c の関係が偽なので、a=0
a==b
a と b の値が等しい
a!=b
a と b の値が等しくない
a> b
a は b より大きい
a<b
a は b より小さい
a>=b
a は b 以上である
a<=b
a は b 以下である
a>=b とあるのを a=>b とした場合エラーとなる。
記号には優先順位が指定されており、不等号の記号を必ず先に置かなければならない。
2−2.繰り返し
for 文
for 文は、繰り返し実行したい文に対して、回数をあらかじめ指定して実行するときに
用いる。繰り返しを指定する文に対しては、同じ動作を単に繰り返すだけでなく、文に
含まれている変数にともなって、出力する値や形態を変化させることもできる。
書式
for
(初期値;条件式;増分値)
{
文;
}
初期値・・・・・繰り返し回数の最初の値を設定する。
条件式・・・・・繰り返し変数の最終値の条件を指定する。
増分値・・・・・1回のループで変数が変化する値を指定する。
For のあと、(
{
)の中にこれらの式を;で区切って、順に並べる。
}の中に文はいくつあってもよい。
[例題2−2]
/*
for 文を用いて繰り返しを5回行い、回数をそのつど表示させよ。
for 文による繰り返し
*/
main()
{
int
I;
for(I=1;I<=5;I++)
{
printf(“%d 回¥n”,I);
}
}
実行結果
1回
2回
3回
4回
5回
解説
初期値1から変数が5以下の間、1づつ増加させながら10進数(%d)で I を表示させ、
表示後に改行(¥n)させている。
[問題2−1]
100 以下の整数のうち、3の倍数を出力するプログラムをつくれ。
[問題2−2]
for 文をもちいて 10 から 0 までの整数を降順に表示せよ。
[問題2−3] for 文と代入演算子を用いて、0 から 100 までのせいすうのうち、5の倍数
を検出して出力せよ。
2−3.構造体と共用体
2−4節で行う DA 変換ボードで使われる共用体(union)
についてここでは触れておく。
構造体(struct)のデータ群は、全てのメモリ領域に確保され、自由にメンバを参照できる。
(なお構造体については、今回は使わないので省くものとする。)共用体も、データの塊を
1つにまとめて扱うという点では構造体と同じである。
共用体は異なったデータの先頭アドレスが共通になっている。構造体は、設定された各
メンバが、それぞれのメモリ領域に割り付けられるのに対して、共用体の場合は、データ
の型はことなっていても各メンバが共通のメモリ領域に配置される。
(例)共用体 data;
union
{
int
char
}
data;
word;
byte[2];
2−4.DA 変換ボードの演習(C プログラムによる波形の作成)
2−4−1
はじめに
デジタル・アナログ変換モジュール(以下 DA 変換ボード)の演習として、DA 変換ボー
ドから電圧波形を出力する C プログラムの作成を行う。DA 変換ボードの機能および仕様、
演習用 C プログラムの解説を以下に示す。
2−4−2
機能および仕様
(a) 機能
DA 変換ボードのインターフェイスは2バイトの出力ポートを持っており、12 ビットの
データとチャンネル番号を OUT 命令で出力すると、該当するチャンネルの D/A 変換され、
バッファのオペレーショナルアンプを通じて外部装置にアナログ電圧として出力される。
この 12 ビットのデータを扱うが、バイト単位で出力する場合、下位バイト、上位バイト
の順序で命令を行う。
(b) 仕様
型番
:DA12―4(98)
(株)CONTEC 社製
実装点数
:4 チャンネル
分解能
:12 ビット
出力形式
:−10∼+10V
出力誤差
:±1LSB(周囲温度)
MAX3mA(バイボーラのみ)
周囲温度 0℃、50℃時 0,1 程度の誤差が生じる。
使用素子
:DA7545 相当品
変換時間
:命令実行後 600ns で D/A 変換され、OP─AMP を通じて出力さ
れるまでに約 10μsec を要する。
占有ポート数
I/O ポート選択
:8ビット2ポート
:モジュール内ディップスイッチで設定
外部接続方法
:モジュールの前面からコネクタで接続
アナログ電源
:インターフェイスに内臓
出力電源許容量
:DC5V
使用条件
:0∼50℃
550mA MAX
湿度 20∼90%(結露しないこと)
2−4−3
演習用 C プログラムの解説
C 言語による演習用 C プログラムのリストを以下に示し,プログラムの内容を解説する。
ただし、プログラムの先頭にある番号は解説のために行を表したものであり,実際のプロ
グラムには含まれない。
2−4−3−1
1:
演習用 C プログラムリスト
#include
<stdio.h>
#include
<dos.h>
#include
<graphics.h>
#include
<board.h>
5:
#define DA_ADRL 0xde
#define DA_ADRU 0xdf
char *TITLE=”DA 変換ボードの演習1”;
10:
char *LABO=”制御工学”;
char *BYNAME=”programed by 鷹取
char *DATE=”作成日
純”;
1997 年 6 月 1 日”;
char *FILENAME=”FILNAME: JT_DA01.C;
15:
union
{
unsigned int word;
unsigned char byte[2];
} data;
20:
void main(void)
{
int graphdrive=DETECT,graphmode;
initgraph(&graphdriver,&graphmode,”a:¥¥turboc”);
25:
cleardevice( );
initial_screen( );
outportb(DA_ADRL,0x03 );
outportb(DA_ADRU,0x0);
/*************************/
35:
40:
/*
9.995[v]---> 7ff
|
-10.00[v]---> 800
*/
/*
8.999[v]---> 733
|
-8.999[v]---> 8cd
*/
/*
7.998[v]---> 666
|
-7.998[v]---> 99a
*/
/*
7.002[v]---> 59a
|
-7.002[v]---> a66
*/
/*
6.001[v]---> 4cd
|
-6.001[v]---> b33
*/
/*
5.000[v]---> 400
|
-5.000[v]---> c00
*/
/*
3.999[v]---> 333
|
-3.999[v]---> ccd
*/
/*
2.998[v]---> 266
|
-2.998[v]---> d9a
*/
/*
2.002[v]---> 19a
|
-2.002[v]---> e66
*/
/*
1.001[v]---> 0cd
|
-1.001[v]---> f33
*/
/*************************/
45:
/*1 [v]電圧出力 */
data.word =0x0cd;
data.word <<=4;
data.word +=3;
outportb(DA_ADRL,data.byte[0]);
50:
outportb(DA_ADRU,data.byte[1]);
delay(500);
/* 0[v]電圧出力 */
data.word =0x0;
55:
data.word <<=4;
data.word +=3;
outportb(DA_ADRL,data.byte[0]);
outportb(DA_ADRU,data.byte[1]);
delay(500);
60:
/* -1[v]電圧出力 */
data.word =0xf33;
data.word <<=4;
data.word +=3;
65:
outportb(DA_ADRL,data.byte[0]);
outportb(DA_ADRU,data.byte[1]);
delay(500);
/* 0[v]電圧出力 */
70:
data.word =0x0;
data.word <<=4;
data.word +=3;
outportb(DA_ADRL,data.byte[0]);
outportb(DA_ADRU,data.byte[1]);
75:
}
2−4−3−2
プログラムの解説
1∼4行
#include は指定したファイルをプログラムの中に取り込む働きがある。
指定するファイルは<
>や“”で囲む。これは取り込むファイルを検出
するときに,どこのディレクトリから優先的に探すかを,目的に応じて使
い分ける。
書式
#include
<ファイル名>
include 文でプログラムに必要な関数の型を宣言する。以下にその内容を
示す。
6∼7行
<stdio.h>
:標準入出力関数
<dos.h>
:OS に関連する定義
<graphics.h>
:グラフィックスに関する関数
<board.h>
:研究室で作成
#define 文は文字列を記号定数に置き換えて定義する働きがある。
書式
#define
記号定数
文字列
define 文で
DA_ADRL にポートアドレス+0 を表す16進数
0xde
DA_ADRU にポートアドレス+1 を表す16進数
0xdf
をそれぞれ定義する。
9∼13行
関数 initial_screen( )の中で参照する文字列のポインタ変数で、それぞれ
の内容を画面表示させる。“”内に任意の文字列を入れる。
15∼19行
union(共用体)は、構造体の書式を借りて、データ型の異なる各種の変数
用の記憶領域を割り付ける文である。
書式
union 共用体タグ
{
型
共用体メンバ;
型
共用体メンバ;
型
共用体メンバ;
} 共用体変数;
ここでは data という共用体変数を宣言しており、2バイトの int 型で参
照するときには data.word で、1バイトの char 型で参照するときには
data.byte[0],data.byte[1]の共用体メンバで呼び出される。
整数型・文字型データの種類
・ int
・ unsigned int
整数型(2バイト) -32768∼32767
符号なし
整数型(2バイト) 0∼65536
・ char
文字型(1バイト) -128∼127
・ unsigned char 符号なし
文字型(1バイト) 0∼256
例えば、data.word=0x10f とすれば data.byte[0]=0x0f、data.byte[1]=
0x01 になる。
data.word
0
1
data.byte[1]
21行
0
f
data.byte[0]
関数間に引数を持たない関数を扱う場合は、void 型でプロトタイプ宣言
して明確化することもできる。
void main(void)
{
}
この表現で,main()関数自身は値を返さない void 型であり、関数の中に
引数を持たないことを意味している。
23∼25行
関数 initial_screen( )で画面表示をするためにグラフィックシステムの初
期化、画面のクリアを行う。
26行
画面表示を行う関数である。9∼13行目に書いた内容を表示する。
28∼30行
DA 変換ボードの3ch を 0[v]に設定する。
0
0
0
3
ch 番号
30行
()内の数字は[msec]である。ここでは、5秒間、0[v]実行する。
32∼43行
DA 変換ボードの出力電圧とその電圧の指定数(16進数)の対応表をあ
らわしている。
45∼51行
DA 変換ボードの1ch から1[v]の電圧が出力されるように指定している。
このときポートアドレス+0 の下1桁に出力チャンネル番号を入力するた
め、電圧の指定数のビット演算を行う。以下にビット演算の内容を示す。
data.word =0x0cd;
data.word に電圧1[v]の指定数を代入する。
data.word
0
0
data.byte[1]
data.word <<=4;
c
d
data.dyte[0]
data.word の内容を4ビット左へシフトしたもの
を data.word に代入する。(data.word=data.word<<4 と同じ)
シフト
0
data.word +=1;
c
d
o
data.word にチャンネル番号 3 を加えたものを、
data.word に代入する。(data.word=data.word+1 と同じ)
0
c
d
3
ch 番号
(49∼51行)ビット演算後1バイトずつのデータを各ポートアドレスへ出力し、出力電圧
が設定される。関数 delay( )で実行を 500[msac]停止することにより、
500[msec]間電圧が出力される。
53∼75行 電圧の指定数を変更することにより、それぞれ 0[v]、-1[v]、0[v]の電圧設定
を行う。プログラムの流れは45∼51行と同じである。
2−4−4
波形の出力結果
演習プログラムを実行して得られた波形をデジタルストレージオシロスコープで取り込
むと下図のような波形が出る。
1.5
1
0.5
電
圧
0
[v]
-0.5
-1
-1.5
0
2
4
6
時間 [sec]
図
JT_DA01.C を実行して得られた波形
8
2−4−5
デジタルストレージオシロスコープの使い方
①POWAR
押し込んだ状態で電源 ON となり、引き出した状態で OFF となります。
②STORAGE
このスイッチの LED が消灯しているときは、REAL
TIME モードで通常のリアルタイ
ムオシロスコープとしての動作を行う。このスイッチの LED が点灯し、STORAGE モー
ドになります。STORAGE モードの時は、サンプリングに同期して、LED が点灯します。
③A
AND
B
TIME/DIV
A、B の掃引時間を設定します。A、B 共通ですが、HORIZONTAL MODE により選択
され、かつ TIME/DIV 設定はブラウン管画面上に表示されます。
④POSITION
垂直位置調整用ツマミです。時計方向に回すと輝線は上昇し、半時計方向に回すと輝線
は降下します。
⑤VOLTS/DIV
垂直軸偏向感度を切り替えるスッテプ減衰期です。入力信号の大きさに応じて観測しや
すいレンジに設定します。
⑥HOLD
このスイッチを押すとサンプリングを停止し、ホールド状態となり、LED が点灯します。
再度スイッチを押すと、ホールド状態を解除し、サンプリングを開始します。
機械工学実験 「C 言語(Turbo-C)」 のレポート
1.下記のプログラムを作りなさい。
◎Program-1
自分の学籍番号と名前を表示させるプログラムを作りなさい。
◎Program-2
for 文と代入演算子を用いて、0から100までの整数のうち6の倍数を検出して、
出力するプログラムを作りなさい。
◎Program-3
整数の30を10進数と16進数で表示するプログラムを作りなさい。
◎Program-4
a=10,b=12として論理和と論理積のプログラムを作り、計算過程と実行結果を
答えよ。
◎Program-5
for 文を用いて50から0までの8の倍数を整数で小さい順に表示せよ。
2.考察
3.感想