プログラミング入門II
2019.06.17

Back to index page



  1. 本日の作業内容

  2. 宿題の結果について

    久しぶりに解答用紙を使用していない解答が出てきてしまいました.焦らず,まずは解答用紙に番号と名前を入力するところから作業を始めましょう.番号と名前の抜けている人もいましたし.

    解答用紙不使用: b1835
    番号と名前無し: b1806

    インデントの不備も出てます.気をつけましょう.

    インデント不備: b1847

    全体では,せっかく並べ直した配列をもう一回全部並べ直すプログラムばかりでした.大変な無駄です.ちりもつもればWindowsですので,重くならないよう2重の for 文が不要な場合は使わないで処理を考えましょう.

    以下はいつものように気になるものです.参考にしてください.

                    num[i] = rand() % 90 + 10;
    

    いつもいつも2桁の整数とは限りませんよ.今回は %2d の練習でした.

            int a[20],i,num1,j,tmp,num2;
    

    最初から要素が21個の配列を用意すると書いておいたのですが.後から無理やり要素を追加するのはC言語らしくないです.

            for(i = 0;i < 21;i++)
            {
                    num[i] = rand() % 99 + 1;
                    if(i < 20)
                    {
                            printf("%d ",num[i]);
                    }
            }
    
    
            printf("\n\nAdd %d into array\n", ary[20]);
            
            for(i=0;i<=20-1;i++)
            {
                    for(j=i+1;j<=20;j++)
                    {
                            if(ary[i] < ary[j])
                            {
                                    tmp = ary[i];
                                    ary[i] = ary[j];
                                    ary[j] = tmp;
                            }
                    }
            }
    

    後から乱数を追加と書いていたのに,最初から入れてますね.

            for(i = 0; i <= 19; i ++)
            {
                    if(num > ary[i] && i == 0)
                    {
                            printf("%2d ", num);
                    }
                    
                    printf("%2d ", ary[i]);
                    
                    if(num <= ary[i] && num > ary[i + 1])
                    {
                            printf("%2d ", num);
                    }
                    
                    if(num <= ary[i] && i == 19)
                    {
                            printf("%2d ", num);
                    }
                    
            }
    

    意図はわかりますが,そんなに場合分けしなくても.

            int h[20],t[99];
            int i,j,k,num;
            
            for(i=0;i<99;i=i+1)
            {
                    t[i]=0;
            }
            
            for(i=0;i<20;i=i+1)
            {
                    h[i]=rand()%99+1;
                    
                    if(t[h[i]-1]==1)
                    {
                            i=i-1;
                    }
                    
                    t[h[i]-1]=1;
            }
    

    すみません.意味がわかりませんでした.

            printf("Add 75 into array\n");
            
            x = 75;
            
            for(i=0;i<=19;i++)
            {
                    printf(" %2d ",ary[i]);
                    
                    if(x>=ary[i+1])
                    {
                            printf(" 75 ");
                            
                            x = 0;
                    }       
                    
            }       
    

    さすがに,75で決め打ちはいかんです.

  3. 前回の復習

    前回も引き続き1次元配列でした.並べ替えを中心に演習を行いました.本来は再帰を使用するQuick sortという手法が速いのですが,わかりやすい総当り方式を練習しています.これからも使用しますので,慣れていってください.

  4. 文字配列

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

    • ヌル文字

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

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

      #include <stdio.h>
      
      int main(void)
      {
      	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]);
      
      

    • %s %c

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

      #include <stdio.h>
      
      int main(void)
      {
      	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文字です.その場合にはヌル文字はついていません.

      文字配列のキモ

      • 宣言するときの [ ] の中は要素(文字)の個数 + 1

      • 最後の文字の後にはヌル文字 \0 がある

      • つまり, str[5] のように宣言した文字配列は実際は,文字数は4文字以内

      • %s を使って文字を表示させるときには,添字は不要

      • printf("%s\n", str);

    • 実習

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

    • 次回の予習範囲

      教科書のp.121からp.124までを予習してきてください.

    • 宿題

      宿題の公開は6月18日以降です.よろしくお願いします.


目次ページに戻る