情報処理1 解説サイト

制御文1

第3回 制御文1のおさらいと課題を解くにあたっての考え方についての簡単に解説したいと思います.

まず今回の授業で扱った制御文ですが,今後いろいろなプログラムを書く上での基本となるため,しっかりと復習をしてください.
簡単なおさらいなので,詳しく勉強したいときは授業ページを見たり,Googleや本などできちんと調べてください.

さて,制御文とはプログラムを実行するときに「ある条件によって処理を変更」したり「同じ処理を何度も繰り返し(ループ)」たりするときに便利な書き方です.この制御文を利用することで,複雑な処理を実行することが可能となるメリットがあります.
このようにプログラムを書く上で重要となる制御文ですが,第3回の授業ではその基本となるif文とwhlie文,for文を勉強しました.

if文は英語の「もし~なら」という意味の通り,条件分岐を行うことができるようになります.
if文の詳しい構造は授業ページに書いてあるので,ここではif文のイメージを簡単に説明したいと思います.

if(条件式){
        処理
}

例えば,このようなif文があったときは,「条件式が正しければ(成り立てば),処理が実行される」という感じです.この条件式は関係演算子や論理演算子を用いて表現します.関係演算子と論理演算子については,詳しくは授業ページにまとめられているのでそちらを参照してください.

while文,for文は繰り返しを行うことができる制御文です.
while文の構造は,

   while(条件式){
    処理
   }

この文のイメージは,「毎回の繰り返しにおいて,条件式が成り立つときは処理を行い,条件式が成り立たなくなったら繰り返しを終了する」という感じです.

for文の構造は,以下のようになっています.

   for(初期化式;条件式;値変化){
         処理 
   }


この文のイメージは「初期化式で設定した変数が条件式を満たすことができなくなるまで,繰り返す(初期化式で設定した値は値変化で設定したように変化させる)」ということです.

授業では,特にfor文がどのような働きをするのかが分かっていない人が多かったように感じたので具体例をひとつ挙げて説明したいと思います.

//例)
   for(int i=0;i<10;i++){
         printf("%d\n",i);
   }

このようなfor文があるとき,処理の流れは,

  1. 「i=0」によって,iに0を代入する
  2. 「i<10」よりiの値が10より小さいかを判定し,この条件を満たしていれば(iが10より小さければ),処理(printf)を実行する.
  3. 「printf」によって,iの値を出力する
  4. 「i++」によって,iに1を足す
  5. iが10以上になるまで,2〜4の処理を繰り返す

となります.

この流れがfor文の基本になり,繰り返しを行いたい処理(今回は「printf」)を適宜変更することで,様々なプログラムに応用できます.

以上が,第3回のおさらいです.情報処理自習1の授業は積み重ねが大切なので,繰り返しになりますが,復習をよろしくお願いします.

では,課題の考え方について解説したいと思います.





1.入力された2つの整数が等しいか否かを判定するプログラムを作成せよ.

【実行例】
> 153R000000-03-1
整数1:3
整数2:4
2つの整数は違います.
> 153R000000-03-1
整数1:5
整数2:5
2つの整数は同じです.

この問題を解くポイントは,

  1. どのようにキーボードから値を入力するか?
  2. 等しいか否かの判定のやり方は?

という2点かと思います.
まず,①に関してですが,C言語には,キーボードから入力された値をプログラムで利用するための機能が予め用意されています(標準の関数が用意されているということ).(ちなみに,「printf」などは関数と呼びます).その関数は「scanf」という関数です.この関数の使い方は,main関数のなかで以下のように使います.

int input;

scanf("%d",&input);

この文は,「予め用意しておいた,変数(今回は「input」)にキーボードから入力された値を代入しています」.「scanf」の書き方は,少し「printf」に似ていますね.注意する点は,「&input」のように「&」マークをつけることです.この「&」をつける意味は,C言語でもっとも難しいと言われている「ポインタ」という部分に関係しているのですが,今はまだ「scanfの時はつけなきゃいけないもの」だと思っておいてください.

次に②については,「キーボードから値を入れた2つの変数をどのように比べるか」ですが,この部分にif文を利用します.このときのif文の構造は以下のようになると思います.

	if(条件式){
		printf("2つの整数は等しいです.¥n");
	}
	else{
		printf("2つの整数は違います.¥n");
	}

このときの条件式が「2つの変数が等しい」ということを表現できれば問題は解けると思います.

  • ヒント:授業ページの関係演算子の部分を参照




2.3つの整数をキーボードから読み込み,その中から最も大きな値を表示せよ.

【実行例】
> 153R000000-03-2
整数1:3
整数2:4
整数3:5
最も大きな値は 5 です.

この問題を解くことにおけるポイントは,

  1. どのようにキーボードから値を入力するか?
  2. 最も大きな値の検出はどのように行うのか?

の2点だと思います.
①に関しては,上記の問題1を参照してください.
②についてですが,問題1と同じようにif文を使って大小の判定をし、最も大きい値を記録します.

     int number1, number2, number3;
     int max;

     ...

     max = ... ;
     if(条件式)max = ... ;
     if(条件式)max = ... ;


今回の課題では入力値が3つに限定されていますが,コーディングの工夫次第ではソースコードを変えることなく入力値の数が任意でも処理が可能になりますので,余裕のある人は挑戦してみて下さい(for文を使う).





3.ひとつの整数nを入力し,1からその数までを合計した数を求めなさい.

【実行例】
> 153R000000-03-3
整数入力:3
合計:6
> 153R000000-03-3
整数入力:10
合計:55

この問題を解くポイントは,

  1. どのようにキーボードから値を入力するか?
  2. どのように合計を求めるのか?

①に関しては,上記の問題1を参照してください.
②に関しては下記のように一つ変数(sum)を用意し、for文を使って1から順番に足し合わせていきます.

     int sum = 0;
     
     for(int i=1;...;...){
          sum += i;
     }



4.if-else文を用いて,キーボードから入力した整数の正負を判定しなさい.

【実行例】
> 153R000000-03-4
整数入力:1000
正の値です.
> 153R000000-03-4
整数入力:-3
負の値です.
> 153R000000-03-4
整数入力:0
値は0です.

この問題を解くポイントは,

  1. どのようにキーボードから値を入力するか?
  2. どのように正負の判定をするのか?

①に関しては,上記の問題1を参照してください.
②に関しては,以下のようにif-else文を駆使することで正負の判定を行います.

     if(条件式1){
            printf("正の値です."); // 「条件式1が真」の場合
     }else if(条件式2){
            printf("負の値です."); // 「条件式2が真」の場合
     }else{
            printf("値は0です."); // 「条件式1が偽」かつ「条件式2が偽」の場合
     }

これはあくまで一例です.必ずしも最後の条件分岐 "else{...}" のくだりで " printf("値は0です."); " と出力することにこだわる必要はありません.



5.キーボードから入力された数だけ,#を表示しなさい.

【実行例】
> 153R000000-03-5
整数入力:10
##########
> 153R000000-03-5
整数入力:35
###################################

1〜4の問題が解けた方ならこの問題は即答できますね★


以上が第3回の宿題の考え方です.


ーーーーーーーー命名規則についてーーーーーーーー

この命名規則に従っていない場合は,採点することができなくなってしまいますので,よろしくお願いします.

提出するファイルのテンプレートを以下に示します.
テンプレート

  • 提出用zipファイルの作成
    1. 正しい名前をつけたソースファイル等を,すべて選択(CTRLキーを押しながらファイル名を左クリック)状態にする.
    2. 選択したファイルのいずれかの上で,マウスを右クリック
    3. 開いたメニューの,「送る」「圧縮(zip形式)フォルダー」で,1つのzipファイルに圧縮.ファイル名を153Rxxxxxx-yy.zip と変更する.(xxxxxxは学籍番号,yyは実習の第何回目か)

zipファイルをダブルクリックすると中身が見える.
提出すべきファイルがすべて含まれているか確認.(zip内にフォルダを作らないこと

 2019年度の情報処理実習1についてのブログです.

このブログでは,授業についての簡単なおさらいと課題についての考え方や解説等を行っていきたいと思います.


また,授業についての質問対応等は基本的にこのブログで受け付けます.気軽にコメント欄にて質問してください.

オフィスアワーは,以下のようになっています.

  • 金曜日18:00~19:30

直接質問する場合はこの時間にD103に来てください.
この時間以外の対応はできません.

そのため,
1. インターネット等を利用して自分で調べる
2. このブログのコメント欄で質問する
3. それでも分からないならば,オフィスアワーを利用しに質問に来る
という形をとるようにしてください.

また,質問に来る際は,ノートパソコンを持参する,自分の書いたコードを印刷する等の準備をし,具体的にどのようなエラーが出るのか,どこがわからないのかを示すようにしてください.

 

授業ページ