プログラミング入門 情報科学演習
2015.01.26

Back to index page



  1. 本日の作業内容

  2. 小テストについて

    授業の最初に小テストを実施します.いつものように柱のところの席を避けて座ってください.

  3. 宿題の結果について

    今回は残念ながら採点対象外の解答が出てきました.きちんと確認してから提出するよう注意してください.

    コンパイルエラー b1480
    解答用紙不使用 b1359

    以下は例によって問題のある答案の例です.参考にしてください.

            for(i=0;i<12;i++)
                    printf("%c",str[i]);
    

    上の例は減点はしていませんが,無駄な for 文です.%s を使えば要りません.

            int ary[12]={105,98,97,114,97,107,105,114,121,111,117};
    

    このような配列が結構たくさん見られたのですが,これも無駄な努力ですね.今は「文字列」のプログラミングをしていることをお忘れなく.

            char str[14]= "shuichiaihara";
    
            char a[14]="fujimototakumi";
            
            char str[18] = {"gokurakujiseiichi"};
    

    上記のものは性と名の間にスペースを入れるという常識が欠けているものです.

            char str[12] = "hirotokouki";
    
            printf("\nMy student number: s134065\n\n");
    
            printf("hiroto kouki\n");
    

    スペースの問題をごまかすために,絶対にやっちゃだめ printf の使い方をしています.零点です.

            for(i=0; i<=10; i++)
                    for(j=0; j<=10; j++)
                            if(str[i]>str[j]){
                                    a=str[i];
                                    str[i]=str[j];
                                    str[j]=a;
                            }
    
            for(i=10; i>=0; i--)
                    printf("%c",str[i]);
    

    何故,逆順に表示しないといけないような入れ換え処理をしたんでしょう?

    以下は配列の添字の範囲を間違えたためにヌル文字が入り込んだものです.less で必ず確認するように言っているのですが,なぜサボるんでしょう?

     ^@adhiiiisuuy
    
    ibaraki ryou
    ^@aabiikorru
    
    ueda naoya^@ソ^@ aaadenouy
    
    okamoto  kousei^@
    aeikkmoooost
    
    kuwahara ryo^@
    ^@ aaahkorruwy
    
    hisatake kouki^@
    aaehiikkkos
    
    kittaka daiya^@
    
    ^@aaaadiikktty
    
    sunagawa ryou
    ^@ aaagnoruuwy
    
    moriyama tatsumi^@
     aaaiimmmorsttuy^@
    
    yamamoto takashi
    ^@aaaahikmmoostt
    
    goto masasi^@
    ^@ aagimoosst
    
    araki kento
    ^@ aaeikknort
    
    hono shintaro^@^D
    ^@^D ahhinnooorst
    
    kajitani shimpei^@
    ^@ aaehiiiijkmnpst
    
    shirano hiroaki
     oo^@^@^@^@^@^@^@鴪
    
    yamamoto daisuke^@
    ^@ aaadeikmmoostuy
    

    以下は文字数があっていなかったり,制御文字が入って画面が乱れたりというダメなものです.配列の添字についてよく学習しましょう.

    ishihara hiroki
    ahhhiiiikorr
    
    kitini ryuya
    aiiiknrtuyy
    
    hirayama akihiro
    ��aaahhiiikmorr
    
    
    fujimurakeng��篦�数燧血町^A
    aefgijkmnoruu
    

    さて,以下はあいかわらずのインデント(字下げ)処理の問題です.どうして直らないのでしょうか?

    33番 途中からインデント幅が変わる.
        printf("\n");
        for(i=0; i<=13; i++){
            for(j=i+1; j<=13; j++){
                    if(str[i]>str[j]){
                            a = str[i] + str[j];
                            str[i] = a - str[i];
                            str[j] = a - str[j];
                    }
            }
        }
    

    37番 同じく.
        for(i=0;i<=13;i++){
            for(j=i+1;j<=13;j++){
                    if(ary[i]>ary[j]){
                            a=ary[i]+ary[j];
                            ary[i]=a-ary[i];
                            ary[j]=a-ary[j];
                    }
            }
        }
    

    46番 if のところと閉じ括弧が変
        for(i=0; i<=13; i++){
            for(j=i+1; j<=14; j++)
                    if(str[i]>str[j]){
                    tmp = str[i];
                    str[i] = str[j];
                    str[j] = tmp;
                }
        }
    

    50番 二つ目の閉じ括弧の位置
            for(i=0; i<11; i++){
                    for(j=i+1; j<12; j++)
                            if(str[i]>str[j]){
                                    tmp = str[i];
                                    str[i] = str[j];
                                    str[j]= tmp;
                            }
                    }
    

    52番 printf
            for(i=0; i<10; i++){
                    for(j=i+1; j<11; j++)
                            if(str[i]>str[j]){
                            tmp = str[i];
                            str[i] = str[j];
                            str[j] = tmp;
                            }
            }
                    printf("%s\n\n-----------------------------------\n",str);
            return(0);
    

    62番 下の for 文.
            for(i=0;i<13;i++){
                    for(j=i+1;j<13;j++)
                            if(name[i] > name[j]){
                                    tmp = name[i];
                                    name[i] = name[j];
                                    name[j] = tmp;
                            }
            }
                    for(j=0;j<13;j++){
    
                    printf("%c",name[j]);
            }
    

    71番 インデント幅が途中で変わる.
             for(i=0; i<=11; i++){
                           for(j=i+1; j<=12; j++){
                                    if(name[i] > name[j]){
                                            tmp = name[i];
                                            name[i] = name[j];
                                            name[j] = tmp;
                                    }
                            }
            }
    

    79番 同じく
            for(i=0; i<=11; i++){
                    for(j=i+1; j<=12; j++)
                            if(name[i]>name[j]){
                                            tmp = name[i];
                                            name[i] = name[j];
                                            name[j] = tmp;
                            }
            }
    

    1345番 printf
                    printf("My student number: s134045\n\n%s\n", a);
            for(i=1;i<=13;i++){
    

    1287番 printf
            for(i=0; i<=11; i++){
                    for(j = i+1;j<=11; j++){
                            if(str[j]<str[i]){
                                    a = str[i];
                                    str[i] = str[j];
                                    str[j] = a;
                            }
                    }
            printf("%c", str[i]);
            }
    

  4. 前回の復習

    文字列配列の要素数と添字

    整数型の配列のときと異なる要素の考え方について理解の足らない人が多く見られました.もう一度よく確認してください.

    • 文字列の考え方

      文字列(複数の文字の組合せ)はそれ自体が配列です.ですので,整数型で定義していた変数ならば,

      	int a = 100;
      

      のように定義していたのですが,数値としての100は値が一つなのに対して,文字列としての100であれば3つの文字の列として扱われるので,それだけで配列となり,以下のように定義しないといけなくなります.

      	char a[4] = "100";
      

    • NULL文字

      文字列は複数の値を持つということで,どこが文字列の終わりなのかを示す記号であるNULL文字が必ず必要となります.そのため,要素の個数は文字数+1となります.

      	char a[4] = {'1', '0', '0', '\0'};
      

      のような定義方法であれば,要素が4つというのがよくわかりますが,これは面倒なので,以下のような定義が便利なのですが,その際にはヌル文字まで含めた要素の個数に注意してください.

      	char a[4] = "100";
      

    • 添字

      上のような要素として1,0,0の3つを持つ文字列配列の要素を for 文を使用して順に表示する場合,以下のような添字なので対応に注意が必要です.

      添字 0 1 2 3
      '1' '0' '0' '\0'

      上記のような添字との対応なので,for 文で順に表示する際には,変数 i は0から2までと要素のサイズよりも2つ小さい i = 2 までになります.

      配列のサイズよりも1つだけ小さい i まで反復処理を行なう例が前回も多く見られました.その間違いに気づくためにも,処理を less に渡すことを忘れないでください.

      $ ./a.out | less
    • %s の意味

      教科書のp.21で %s はすでに紹介されていたのですが,文字列を扱うようになると頻繁に使用するようになります.前回のテキストでも説明しておきましたが,文字1つずつは %c ですが,文字列単位で出力するときには %s が便利です.

      	char a[3] = "ab";
      	char b[3][3] = {"ab", "bc", "ca"};
      	
      	printf("%s\n", a);
      	printf("%s\n", b[0]);
      	
      	for(i=0; i<=2; i++)
      		printf("%s\n", b[i]);
      
      

      のように使用できます.文字列単位で扱えるということは,文字順を示す添字が不要なので,配列の添字が省略できることに注意してください.

  5. 実習

    実習の演習問題は当日ご案内します.

  6. 宿題

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


目次ページに戻る