last update 00/7/24 new 00/7/14(新規作成)

学籍番号

 

 

名前

 

静大プログラミング 期末試験 by望月 00/7/25火9,10

注意:   筆記用具以外に持ち込み可なものは, テキスト(ザ・C 2)のみです。 誰の作成であろうと, プリントやメモ書き等の持ち込みは禁止です。

              団扇(扇子) ...何も書き込みがないなら ...持込可です。

              模擬試験等と比べてあまり変わってませんが, 数値は変えてあります:注意

.            回答は,空きスペースの適当な場所に書いて下さい。

.             部分点もあります。正解が思い浮かばなくても回答にトライして下さい。

 

1 : 次に挙げる文字列それぞれについて,C言語の変数名として使用可()なのか,使用不可(不可)なのか,どちらかをチェックして答えよ。

テキスト ボックス: 可 不可  候補
□  □   ohya 
□  □   ShiZuOKa 
□  □   45street 
□  □   apple-juice 
□  □   a123z987 
□  □   j++  
 

 

 

 

 

2: 次のプログラム(抜粋)を実行した結果,変数 ah, m,n の値はいくらになるか答えなさい。

ヒント:ここで問題にしていることは,

@    c言語の文法で書かれた式の演算が理解できているか,

A    整数型と実数型の混合演算のルールが理解できているか,ということです。

 

a=                        d=                        g=                                      m=

b=                        e=                        h=                                      n=

c=                        f=

テキスト ボックス: ---(略)---
int  i,j,k,m,n;
double a,b,c,d,e,f,g,h,x,y,z;
i=9;  j=5;  k=3;
x=9.0;  y=5.0;  z=3.0;
/*  Questions  */
a = x+y*z ;
b = x+(y*z) ;
c = x + x / z * z ;
d = i/j ;  
e = x/y ;          m = x/y ;
f = x/y - i/j ;    n = x/y - i/j ;
g = (i/j)/(x/y) ;
h = x/y * j/i ;

 

 

 

 

 

 

 

 

3: 次にあげるプログラムリストは,いずれも,i = ##  (ただし ## とは数字のこと)という表示を,「10」回繰り返すために作られたが,うまく動くものもあれば,動作のおかしいものもあるという。そこで,まずそれぞれのプログラムについて,
@ 最初に表示する i = #### の値,A 最後に表示する i = #### の値,B 表示された i = #### の回数   を示せ。(Bについては,もしもその値が予測できないなら,「予測できない」と書くこと。)
また,もしも 10 回の表示ができないならば,C どこをどう改良したら 10 回の繰り返しが出来る様になるか修正案を記せ。ただし,最初に表示する数値と,変化分は変えない事。

… 問3a …

int  i;

 

i=0;

while(i<11){

   printf(“i=%d\n”,i);

   i=i+1;

}

… 問3b …

int  i;

 

i=1;

do{

   i=i+1;

   printf(“i=%d\n”,i);

}while(i<10);

… 問3c …

int  i;

 

for(i=0; i<=10; i=i+1){

   printf(“i=%d\n”,i);

}

 @

 A

 B

(C)

 @

 A

 B

(C)

 @

 A

 B

(C)

… 問3d …

int  i;

 

for(i=0; i<30; i=i+2){

   i=i+1;

   printf(“i=%d\n”,i);

}

 

… 問3e …

int  i;

 

i=10;

while(i>-10){

   printf(“i=%d\n”,i);

   i=i-2

}

… 問3f …

int  i;

 

i=1;

while(1){

   if(i>20){ break;};

   i=i+2;

   printf(“i=%d\n”,i);

}

 @

 A

 B

(C)

 @

 A

 B

(C)

 @

 A

 B

(C)

… 問3g …

int  i,j;

 

for(j=0; j<10; j=j+2){

  for(i=j; i<j+2; i=i+1){

    printf(“i=%d\n”,i);

  }

}

 

… 問3h …

int  i,j;

 

for(j=0; j<10; j=j+3){

  for(i=j; i<j+3; i=i+1){

    if(i>=10){break;};

    printf(“i=%d\n”,i);

  }

}

以上,8問

 @

 A

 B

(C)

 @

 A

 B

(C)

 

 

 

テキスト ボックス: int a;

for(a=0; a<20; a=a+1){
   if( ((a+8)/10 == 1 ){
      printf("a = %d\n",a);      
   }
}
4: 次のプログラム(抜粋)は,forループの中で変数 a の値を 0 から 19 まで変化させる一方で,a の値が条件に合う時にはその値を表示するものである。

  それでは表示される値を総て書きなさい。

 

 

a が,{                                                             }の時に表示。

 

 

5: マイクロコントローラ*1用のプログラム開発を,C言語で行っているものとする。囲み-Aで示されるようなハードウエアに対して,囲み-Bのプログラムを作成した。

それでは,

@         囲み-Bのプログラムを実行すると,どのような動作をするか,説明しなさい。
プログラムを眺めて,勘で答えても構わない。

動作は:{
                                                             
}である。

A         プログラムは,だいたい数行をひとつの単位としてなにかしら決められた処理を行っている。そこで,このプログラムについて,数行ごとに「結局のところどんな処理を行うのか」ということと「その処理の存在意義」を書きなさい。

 

*1 マイクロコントローラとは,いわゆる組み込み型のコンピュータのことです。エアコンや炊飯器などの内部に組み込まれています。通常は,コスト重視で,処理能力はそれほど高くありません(し,必要とされていません)。

囲み-A                      [ハードウエアの説明]

    入力ポートは1つ。アドレスは100番地。スイッチに接続されている。
下記のようにスイッチ情報を読み取ることができる。
       int  a ;
       a=inportb(100) ;
       if ( (a & 1) != 0 ){
              printf(“ Switch - ON !!! \n “);
       }else{
              printf(“ Switch - off !!! \n “);
       }    

    出力ポートは1つ。アドレスは110番地。赤・黄・青のライトが接続されている。
下記のように使用する。
      
       outportb(110 , 1);  /*
この命令により,赤いライトだけが点灯 */

       outportb(110 , 2);  /*
この命令により,黄色いライトだけが点灯 */

       outportb(110 , 4);  /*
この命令により,青いライトだけが点灯 */

       outportb(110 , 0);  /*
この命令により,3つともライトは消灯 */

   

    下記のようなサブルーチン(あるいは,戻り値なしの関数)が定義されている。
void oneSecond(void)
このサブルーチンを呼び出すと,1秒間だけ処理を停止する。
次のプログラムは,赤と黄のライトが1秒,青のライトが2秒,順番に点灯する。
       while(1){                 /*
無限ループ */
              outportb(110 , 1);  /*
赤いライトだけが点灯 */
              oneSecond( );      /* 1
秒間の待ち時間 */
              outportb(110 , 2);  /*
黄色いライトだけが点灯 */
              oneSecond( );      /* 1
秒間の待ち時間 */
              outportb(110 , 4);  /*
この命令により,青いライトだけが点灯 */
              oneSecond( );      /* 1
秒間の待ち時間 */
              oneSecond( );      /* 1
秒間の待ち時間,併せて2 */
       }

 

囲み-B                      [問題としているソフトウエア]

 void oneSecond(void)
 {
    /*
何らかの処理。ここでは略す */
 }

 void main(void)
 {
 int i, j ;
 j = 1;


 while(1){
    while( (inportb(100) & 1) == 0 ) {
       j = - j;
       if( j > 0 ){ outportb(110, 2);
       }else{    outportb(110,0);
       };
       oneSecond( );
    }

    for( i=0; i<10 ; i=i+1) {
       j = - j;
       if( j > 0 ){ outportb(110, 2);
       }else{    outportb(110,0);
       };
       oneSecond( );
    }

    outportb(110,4);
    for( i=0 ; i<10 ; i=i+1){
       oneSecond( );
    }

    outportb(110,2);
    for( i=0 ; i<3 ; i=i+1){
       oneSecond( );
    }

    outportb(110,1);                                                         

    for( i=0 ; i<10 ; i=i+1){
       oneSecond( );
    }
 }

 

 

6: 5は,スイッチは人間が操作し,ライトは人間でないもの*2が検知すべきものである。

ところで,人間が押しボタンを押す理由は,結局のところプログラムの最後から5行目(囲み中,☆印)を実行させるためであるが,これを実行させるまでの間に何ステップもの処理がはさまっているため,人間から見るならば反応が遅いと感じられる可能性が高い。

しかし,最後から5行目(囲み中,☆印)以外の部分にもそれなりの存在意義があるため,プログラム中からけずってしまうわけにはいかない。

そこで,人間がスイッチを押してからなるべく早く 最後から5行目の処理を実行させたい。 そのためにはプログラムをどう改良したらよいか。新しいプログラムを白紙部分に書き直しなさい。なお,なぜそういった改良をしたのか理由も述べなさい。もしも回答により人間が危険な目に曝される可能性が増えるようならば正解としない。

 

*2 (人間でないもの):これを正確に書くと答えがバレルので,ここではこう記述します。