このドキュメントは http://edu.net.c.dendai.ac.jp/ 上で公開されています。
「Place」ボタンを押すと、作業領域に画面が切り替わります。 白い画面の中央付近を左クリックすると、抵抗を表す記号が表示されます。
抵抗の記号を指して右クリックして「Duplicate」を選択する。 そして合計 3 本の抵抗を配置します。 抵抗記号を右クリックして「Edit Device Data」を選びます。 「Label-Value」という欄が抵抗値を表しますので、ここで抵抗値を指定しま す。
下の回路図で1Ωの抵抗を流れる電流の大きさを求めなさい。
電池は(Anarog, Power, Battery)。 電流を測定するにはマルチメータで current を指定します。 完成図は次のようになります。
下の回路図で、A 点と B 点の電圧を調べ、増幅率を求めなさい。
1kHz を入力するには、(Analog, Instruments, Signal Gen) を選びます。 電圧の幅を入力するには、Signal Gen の記号を右クリックし、「Edit Signal Generator」を選びます。そして、「Peak Amplitude」の欄に 100mV を入力します。
下の回路図で、A 点と B 点の電圧を調べ、増幅率を求めなさい。
鈴木雅臣「実験研究 トランジスタ回路の誕生」トラ技ORIGINAL No.1. CQ出版 (1989)
二進数一桁(つまり 0 か 1)を二つ入力して、足し算を実現するディジタル 回路を作りなさい。 但し、真理値表は次のとおりです。
x | y | z1 | z0 |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 |
1 | 1 | 1 | 0 |
以下に示す全加算器を利用して、二進数二桁を二つ入力する足し算回路を作り なさい。 全加算器とは 3 つの一桁の二進数の入力の和を二桁の二進数として出力する ものです。
真理値表は次のとおりです。
x | y | c | z1 | z0 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 1 |
1 | 0 | 0 | 0 | 1 |
1 | 1 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 1 |
C 言語でもっとも基本的な繰り返し文は while 文です。 while 文は次のような構文になっていて、 if 文とよく似ています。
while(条件式){ 繰り返し文 }
条件式が正しい限り繰返し文を実行し続けます。 一方、始めに条件式が成立しなければ繰返し文は一回も実行されません。 条件式が成立すると繰返し文が実行されますが、もし繰返しているうちに条件 式が変わらないと永遠に繰り返しが起きてしまいます。 if 文と違う点は、 if 文では条件文の中身を変化させることに意識をする必 要がないのにもかかわらず、 while 文では条件式を繰り返している間中見て いて、繰り返している間は常に成立し、繰り返しを終える時に条件が不成立に なるようにしなければならないことです。 そこで、繰り返しの基本的なテクニックとして、次のような変数を使用します。
このような変数のことをループ変数と言います。
例えば、 5 回だけ繰り返すことを考えます。その時、ループ変数の役割は、 繰り返しの回数を数えることです。 そのためには、繰り返しの中で繰り返されるたびにループ変数が 1 ずつ増え る必要があります。 これには次の式を使います。
このようにするとこの式を実行した回数だけループ変数が増えます。 これを利用して、while 文に入る前にループ変数の初期値を与え、 while 文 の条件式でループ変数の値を監視するようにすると、 5 回処理を繰り返すこ とができるようになります。
ループ変数 = 1; while(ループ変数 <= 5){ 処理; ループ変数 = ループ変数 +1; }
これを実行すると、次のようになります。
これにより処理が 5 回行われたことがわかると思います。
次のプログラムを走らせなさい。 また、このプログラムを改造して 「●」を 10 個表示するプログラムを作り なさい。
#include <stdio.h> main(){ int a; a=0; while(a<5){ printf("○"); a=a+1; } printf("\n"); }
「a=a+1」という記法は、「次の a は、今の a に 1 を足したもの」という意味 になります。つまりこれは漸化式 ai+1=ai+1 と同じ役割になります。 始めに「a=0」としておいて、「a=a+1」を繰り返すと、「a=a+1」を繰り返した回数 だけ a が増えていきます。繰り返し回数を i とすると、 a の値は i になります。
下のプログラムを走らせなさい。 また、このプログラムを改造し、ループ変 数の値が以下のようになるようにしなさい。
#include <stdio.h> main(){ int b; b=2; while(b<=10){ printf("ループ変数 = %d\n",b); b=b+2; } }
一方、ループ変数を使用して数列の一般項を書くと、数列を表示するこ とができます。
下のプログラムを走らせなさい。 また、このプログラムを改造して、次を表示するようにしなさい(余裕のある 人は最後のカンマ「,」が出ないようにしなさい)。
#include <stdio.h> main(){ int i,b; i=0; while(i<10){ b=2*(i+1); printf("%d, ",b); i=i+1; } printf("\n"); }
以下の三角関数の表を出力するプログラムを完成させなさい。
#include <stdio.h> #include <math.h> main(){ int i; float x,y; i=0; while(i<20){ x = /* x の値は 0 から 2πの間 をとるようにする。 */ y = /* sin x の値を入れる */ printf("x=%f, sin(x)=%f\n",x,y) /* i の値を更新する */ } }
フィボナッチ数列を(20個)表示するプログラムを書きなさい。 但し、フィボナッチ数列とは次のような数列である。
1, 1, 2, 3, 5, 8, 13, 21, 34, 53, ... a0=1 a1=1 ai=ai-1+ai-2 (i≧2)
C 言語では全ての文や式に値を持ちます。 例えば代入文は代入した数を値に持ちます。 j=0 という代入文の値は 0 です。 従って次のような記法が可能です(代入文は右から処理されます)。
i=j=0
この場合、「j=0」 により j に 0 が代入されますが、「j=0」の式の値は 0 なので、 i にはこの式の値 0 が代入されます。
条件文の式の値は、真であれば 1、偽であれば 0 です。従って、0==0 は 1、 1==0 は 0 の値を持ちます。一方、条件文では、 0 なら偽、0 以外の値なら 真だと判定します。したがって、次の文は同じ意味を持ちます。
if(x!=0){} if(x){}
次の操作で変数 i,j の値はどうなっているか?
プログラミングでは i=i+1 など、もともと変数に入っている値を 「増やす」など変化させる操作が 多いです。そのため、これを i+=1 と書くこともできるようになってます。 これを代入演算子と言います。 また、特に 1 を足したり引いたりすることが多いので、特別に 1 増やすのを ++i、 1 減らすのを --i と書くことができます。 これらのそれぞれの式の値は、計算結果の変数の値になります。 一方で、i++, i-- は変数の値を1 増やしたり減らしたり する際に、式の値は増減させる前の変数の値になります。 また、 2 減らすのは i-=2、 5 倍するには i*=5 と書きます。
次のプログラムを実行し、実際に式の値を調べなさい。
#include <stdio.h> main(){ int i,j; printf("i=0 で i に 1 を増やす\n"); i=0;j=(i=i+1);printf("i の値 %d, 式の値 %d\n",i,j); i=0;j=(i+=1);printf("i の値 %d, 式の値 %d\n",i,j); i=0;j=(++i);printf("i の値 %d, 式の値 %d\n",i,j); i=0;j=(i++);printf("i の値 %d, 式の値 %d\n",i,j); }
i++ は配列変数の処理で使います。詳しくは次回以降に説明します。
次のプログラムで何が出力されるか予想しなさい。 また、画面に 10, 8, 6, 4, 2 と出力されるように改造しなさい。
#include <stdio.h> main(){ int i; i=5; while(i--){ printf("%d\n",i); } }
次のプログラムが何を出力するのか予想しなさい。 また、次のパターンを出力するよう、大幅に改造しなさい。
● ●● ●●● ●●●● ●●●●● ●●●●●●
#include <stdio.h> main(){ int i, j; i=5; while(j=i--){ while(j--){ printf("○"); } printf("\n"); } }
他の言語では for 文は特別な動作をすることがありますが、 C 言語では for 文は while 文とほぼ同じです。 文法は次のようになります。
for(一番はじめにだけ実行する文 ; 条件文 ; 繰り返しの最後に実行する文 ) { 繰り返しの内容}
つまり次の二つのプログラムは同じ意味になります。
実際には次のように使います。
for(i=0;i<10;++i){ printf("%d\n",i); }
これは次のプログラムと同じ意味です。
i=0; while(i<10){ printf("%d\n",i); ++i; }
for 文で書くと、ループ変数の処理を一か所にまとめることができるので、繰 り返し回数が一目でわかるなどの利点があります。 逆に for の中にループ変数以外の文を多く入れてしまうと読みづらくなりま す。
次のプログラムの for 文を while 文に直しなさい。 また、n に 6, 14, 23 を入れて出力がどうなるか調べなさい。 なお、型が int 同士の割算は切捨てになります。 一方、a%b は a 割る b の余りを意味します。
#include <stdio.h> main(){ int n; n=11; for(;n;n/=2){ printf("%d",n%2); } printf("\n"); }
数を表す時、下の桁から表すのを little endian と言い、上の桁 から表すのを big endian と言います。 人間は通常 big endian で数を表現しますが、コンピュータでは little endian の方が処理に便利な場合もあり、使われることがあります。 Intel 社の Pentium Processor は little endian です。
次のプログラムの while 文を for 文に直しなさい。 また、 n の値を 32, 60 に変えて出力がどうなるか調べなさい。 余裕がある人は約数の数だけ表示するように改造しなさい。
#include <stdio.h> main(){ int n,i; n=18; printf("%dの約数は",n); i=1; while(i<=n){ if(!(n%i)){ printf(" %d",i); } i++; } printf("\n"); }
Mupad をダウンロードしておいて下さい。