argv[ ] その1

●課題   起動時に同時入力

 プログラム起動時にキ−ボ−ドから数字や文字を同時に入力する方法。
 通常argv[ ]を使われていますが、 aaa[ ]でも xyz[ ]でも動作します。
/* program  name  argv.c   */
#include  <stdio.h>

void	main( int  argc ,   char   *argv[ ] )
{
	printf("%s    %s", argv[0] , argv[1]);
}
1.  キーボードから argv   abcd  とキータイプすると画面には次のように表示します。

  D:\cc\argv.exe  abcd 

	注意   D:\cc\     は、 Dドライブのccフォルダで実行した場合。

2.  argv[0] に argv.exe の文字列が
    argv[1] に abc を受け取ってプログラムが開始します。

3.  argv[0] に入っている argv.exe が表示します。

4.  その後に argv[1] に入っている abcd が表示します。

5. printf("%s    %s", argv[0] , argv[1]); 
	を 
  printf("argv[0]= %s   argv[1]= %s    argv[2]= %s   argv[3]= %s", argv[0] , argv[1], argv[2] , argv[3]);
	に取り替えて argv   abc 123  zzz と入力しますと
	argv[0]= D:\cc\argv   argv[1]= abc   argv[2]= 123   argv[3]= zzz
	と表示します。  

6.  使用例の一例が下にあります。

7.  使い方は argv2  m  とタイプして Enter キ− を押す。

8.  Good morning が画面に表示します。

9.  argv2  n も試して下さい。

/* program  name  argv2.c   */
#include  <stdio.h>

void    main( int  argc , char  *argv[ ] )
{    
	printf("\n") ;
	switch( argv[1][0] ) {
		case    'm':    printf("Good morning ");        break;
		case    'n':    printf("Good evening ");        break;
		case    'a':    printf("Good afternoon");       break;
		default :       break;
	}
}
9.  上の argv2.c は 304教室のプログラムを基に書き足しました。

10. argv2  m  として このプログラムを実行すると argv[0] に argv2 が
	argv[1] に m が格納されてプログラムが起動します。

11.  argv2 はプログラムを実行するだけに必要ですが m はプログラムの
	中で使います。 その m はargv[1][0]に格納されています。
	argv[1][1]に \0 が格納されています。 図解配列を復習のこと

12.  argv[1][0] に m が入っていれば、 case 'm' が実行され
	Good morning が表示します。

13. 表示後 break ;  で switch から脱出します。



起動時に2つの数字と1つの記号を入れて四則演算する

 この例題は、プログラム起動時に同時に二つの数字を入力して計算します。
argv3  100  4  *  と入力すると 「掛けた結果 400 です」と表示します。
*は掛算  +は足し算  -は引算  / 割算
/* program  name  argv3.c   */

#include  <stdio.h>
#include  <stdlib.h>
void    main( int  argc , char  *argv[ ] )
{    
	int  a , b   ;

	a = atoi( argv[1] );
	b = atoi( argv[2] );

	printf("\t  *は掛算 +は足し算 -は引算 / 割算\n") ;
	printf("\t次のように  入力して下さい。\n") ;
	printf("\t  argv3  200  40  *  \n") ;

	/******
	printf("%c\n", argv[3][0] ) ;
	*******/

	switch( argv[3][0] ) {
		case    '*':    printf("掛けた結果 %d です " , a * b );  break;
		case    '+':    printf("足した結果 %d です " , a + b );  break;
		case    '-':    printf("引算の結果 %d です " , a - b );  break;
		case    '/':    printf("割算の結果 %f です " , (double)a / (double)b ); break;

		default :       break;
	}
}
1. argv[1] には、最初の文字(数字ではない) 200 が入ります。
	argv[1][0] に 、argv[1][1] に 、argv[1][2] にが入っています 

2. argv[2] には、次の文字(数字ではない) 40  が入ります。
	argv[2][0] に 、argv[2][1] に  が入っています 

3. argv[3][0] に *  +  -  /  の何れかが 入ります。
	argv[3][0] の中の文字が * の場合 case  '*' で振り分けます。

4. a = atoi( argv[1] ); で文字列から数字に変換されます。
	aは、アスキー toは、から iは、インテジャー へ変換の意味です。
	ですから、この例題は 200の文字列を 200の数字に変換します。
	atoiは、標準関数です。

5. (double)はキャスト演算子で整数の計算で小数点以下の数を有効にします。



 上のプログラムを関数に分けてみました。

/* program  name  argv4.c   */

#include  <stdio.h>
#include  <stdlib.h>
void kakezan();
void tasizan();
void hikizan();
void warizan();

void    main( int  argc , char  *argv[ ] )
{    
	int  a , b   ;
	
	a = atoi( argv[1] );
	
	b = atoi( argv[2] );
	printf("\t  *は掛算 +は足し算 -は引算 / 割算\n") ;
	printf("\t次のように  入力して下さい。\n") ;
	printf("\targs3  500  10  k\n\n") ;
	
	switch( argv[3][0] ) {
		case    '*':   kakezan( a, b );  break;  /* 掛算 */
		case    '+':   tasizan( a, b );  break;  /* 足算 */
		case    '-':   hikizan( a, b );  break;
		case    '/':   warizan( a, b );  break;

		default :       break;
	}
}
	/* 掛算 */
void  kakezan(int k1 , int  k2){
	 printf("   %d  と  %d   " , k1 ,k2  );
	 printf("掛けた結果  "  );
	 printf(" %d です " , k1 * k2 );
}
	/* 足算 */
void  tasizan(int a, int b){
	 printf("   %d  と  %d   " ,a , b  );
	 printf("足した結果  "  );
	 printf(" %d です " , a + b );
}
	/* 引算 */
void  hikizan( int a, int b){
	 printf("   %d  と  %d   引いた結果  %d です "  ,a , b ,   a - b );
}
	/* 割算 */
void  warizan(int a, int b){
	 printf("   %d  と  %d   " ,a , b  );
	 printf("割った結果  "  );
	 printf(" %f です " , (double)a / (double)b );
}


argv[ ] その5

●課題   詩の中の同一文字列の有無を調べる

 このプログラムは、「山のあなたの空遠く」の詩の中の同じ文字が含むか調べる方法。
/* program  name  argv5.c   */
#include  <stdio.h>
#include  <stdlib.h>
#include  <string.h>
void	main( int  argc  , char  *argv[ ] )
{
	int   h, i ,  k , mm , nn  ;
	char	aa[6][30]  ,  *xx ;	
	
    strcpy( aa[0] , "yamano anatano soratooku");    /*  山のあなたの空遠く */
    strcpy( aa[1] , "saiwai sumuto hitohaiyu");     /*  幸い住むと人の言う */
    strcpy( aa[2] , "aa warehitoto tazumeyukite");  /* 嗚呼、我人と尋め行きて */
    strcpy( aa[3] , "namidasasigumi kaerikinu");    /*  涙さしぐみ帰り来ぬ */
    strcpy( aa[4] , "yamano anatano naotooku");     /*  山のあなたの尚遠く */
    strcpy( aa[5] , "saiwaisumuto hitohaiyu");

    mm = strlen( argv[1]);

    for( h = 0; h < 6; h++ ){
	nn = strlen( aa[h] ) ;
	xx = aa[h] ;
	for( i= 0 ; i< nn-1 ; i++ ){
		k =  strncmp( argv[1] , xx++  ,  mm ) ;

		if( k == 0 )
			printf("%s\n" , aa[h] );
	}
    }
}
1. argv5  tooku 
	と 入力して下さい。
	yamano anatano soratooku
	yamano anatano naotooku

	と表示します。

2. strcpy( aa[0] , "yamano anatano soratooku");
	配列 aa[0] に、詩の1行をコピーする。
	 6回繰り返します。

3. mm = strlen(argv[1]); 
	で argv[1] の中の文字数を調べる。

4. nn = strlen( aa[0] ) ;
	で 詩の1行の長さを調べる。

5. 最初の forの h<6 は詩が6行

6. xx = aa[h] で 詩の一行を xx にコピー

7. 内側のforで1行の長さの文字数分繰り返す。nn-1回

8. k =  strncmp( argv[1] , xx++  ,  mm ) ;
	は、argv[1] には探す文字が入っています。
	xxには 詩の1行が入っています。
	mmには、探す文字の文字数の数が入っています。
	探す文字列が含まれていれば、Kに 0が代入される。

9. if( k == 0 )
	  printf("%s\n" , aa[h] );
	は、 k=0 の場合一致したので
	その行を表示します。