情報科学演習
2018.01.15

Back to index page



  1. 本日の作業内容

  2. 小テストについて

    文字列配列に関する小テストを実施します.テストの時の席配置で柱の部分を避けて座ってください.

  3. 宿題の結果について

    解答用紙を使用しない人が突然増えてきました.採点の対象外となってしまうので,注意してください.

    解答用紙不使用: b1723 b1663 program1

    学生番号やハイフンラインについても減点対象の人が見られました.

    番号出力間違い: b1760
    番号出力無し: b1777
    ハイフンライン無し: b1734

    困ったことに,インデント(字下げ)の不備が無くなりません.こちらも注意してください.

    インデントの不備: b1703 b1705 b1711 b1715 b1734 b1738 b1746 b1751 b1766 b1773 b1777 b1523 b1605 b1620 b1623 b1664

    プログラムの処理としては大体の人ができていたのですが,ただ以下のように手作業で和を求めるものはあまり感心しません.反復処理を活用しましょう.その利点については最後の授業の演習で試す予定です.

            for(i=0; i<=2; i++){
                    printf("\n  %d %d %d", ary[i][0], ary[i][1], ary[i][2]);
                    sum=ary[i][0]+ary[i][1]+ary[i][2];
                    if(sum==0||sum==3)
                            printf(" B");
            }
    
            printf("\n");
            sum=ary[0][2]+ary[1][1]+ary[2][0];
            if(sum==0||sum==3)
                    printf("B");
            else
                    printf(" ");
    
            for(j=0; j<=2; j++){
                    sum=ary[0][j]+ary[1][j]+ary[2][j];
                    if(sum==0||sum==3)
                            printf(" B");
                    else
                            printf("  ");
            }
    

  4. 初期化

    C言語の変数の初期値に関しては統一の規定が無いために,教室環境のように自動的に0を入れてくれるものや,広く普及しているGCC(GNU C Compiler)のように不定のままのものなど,多様な仕様が存在しています.

    そのため,みなさんは初期値を入れる(初期化する)こと無しに変数を使うという悪い癖が身についてしまっている可能性があります.これについては,Yahoo知恵袋などでも紹介されていますので,良く読んでおいて,以後は注意してください.

    http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1421060754

    http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1449816014

    初期化を忘れることを防ぐためには何度も書いていますが,以下のようにオプションを利用してください.

    $ cc -Wuninitialized hoge.c

    実際に採点する環境はGCCを使用しているので,初期化が行われていないのに複合演算子を使用した場合,間違った答えが出てきます.自分で気づかないうちに減点されるので,うっかりミスは致命的です.
  5. 前回の復習

    配列以前に,変数の値の入れ換えができない人が見られました.値の入れ換えは数値や文字の並べ変えを理解する際の基本ですので,これができないと実際のプログラミング課題に困難が生じます.復習や質問をしっかり行って理解を深めて下さい.

  6. 文字列配列

    C言語では文字列(abc shimane のような文字の組)は配列 となります.それぞれの文字は配列の要素として利用可能です.文字列に関して は以下のような注意が必要です.

    • ヌル文字

      文字列の最後には文字列の終わりを意味するヌル文字 \0 があります. これは目には見えませんが,必ず付いているものです.ですので,配列の要素の 個数は文字数+1にしておく必要があります.

      実際にNULL文字が存在するのかは以下のようなプログラムで確認することが出来 ます.

      #include <stdio.h>
      
      main()
      {
      	int i;
      	char str[4]="abc";
      	
      	for(i=0; i<=4; i++)
      		printf("%c", str[i]);
      	
      	printf("\n");
      	
      	return(0);
      }
      

      このプログラムでは,for 文で実際には存在しない配列 str の4文字目までを出力することになっています.しかし,そこにはNULL文字が入っているのですが,NULL文字自体は通常の端末では目に見えません.そこで,標準出力(画面)への出力結果を整形して表示するページャと呼ばれるソフトにその表示処理を預けてみると,確認できます.

      $ ./a.out | less

      通常の実行コマンドの後に縦棒 | に続けて標準のページャソフトである less を指定することで,UNIXのパイプという機能を使用して出力を渡すことができます.結果はどうでしたでしょうか?

      なお,less を終了するには,キーボードから q を入力してください.文字列配列を使用したプログラムの実行は,このように必ず処理を less に渡すようにしてください.これでうっかりミスが防止できます.

    • 文字としての数字

      見た目には区別しにくいですが,char 型で定義すると数字も文字にな り,四則演算はできなくなります.注意してください.次の配列は数値です.

          int ary[2] = {1, 2};
      
          printf("%d\n", ary[0]+ary[1]);
      
      

      しかし,次のものは文字なので,計算には使用できません.

      
          char str[3] = {'1', '2', '\0'};
      
          printf("%d\n", str[0]+str[1]);
      
      

    • static 宣言

      教科書のp.59からは初期化のところで,auto (省略可)と static の宣言の話が出てきます.この授業の範囲では auto で構 いませんので,特別に宣言することは不要です.

    • %s %c

      教科書では配列の要素としての文字列を printf を用いて出力する際 に %s を使用しています.教科書のp.21にあるように,%s は「文字列」を表示させるものです.一方,文字列の中の「一文字」を出力する 際には %c を使用します.この違いに注意してください.本日の実習 では,%s %c の両方を使用します.

      #include <stdio.h>
      
      main()
      {
      	int i;
      	char str[4]="abc";
      	
      	for(i=0; i<=3; i++)
      		printf("%c", str[i]);
      	
      	printf("\n");
      	
      	printf("%s\n", str);
      	
      	return(0);
      }
      

      これも以前に書きましたが,二重引用符 " " で囲まれたものは文字列です.ですので,目に見えないヌル文字が最後についています.一方,引用符 ' ' で囲まれたら1文字です.ですので,その場合にはヌル文字はついていません.

  7. 実習

    実習の演習問題予習用はこちらです.

  8. 次回の予習範囲

    次回も文字列です.文字列を集めた配列が2次元配列になることにも注意して予習してください.

  9. 宿題

    授業の終わりに宿題の案内をします.ただし,問題を見ることができるのは16日以降です.レポート提出システムから閲覧してください.


目次ページに戻る