Powered by SmartDoc

ソフトウェア概論B (2009/12/04)
Ver. 1.0

2009年12月4日
栗野 俊一
kurino@math.cst.nihon-u.ac.jp
http://edu-gw2.math.cst.nihon-u.ac.jp/~kurino/2009/soft/soft.html
ソフトウェア概論 B2009年12月4日 の資料

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

講義で利用するサンプルプログラム

sample-001

Download : sample-001.c ( SJIS 版 )

sample-001.c
#include <stdio.h>

int main ( void ) {
  int index;
  char *pstr;

  printf ( "\"abc\" + 1 == \"%s\"\n", "abc" + 1 );

  for ( index = 0; index < 4; index++ ) {
    printf ( "\"abc\"[%d]==%x ('%c')\n", index, "abc"[index], "abc"[index] );
  }

  printf ( "sizeof ( \"abc\" ) == %d\n", sizeof ( "abc" ) );

  printf ( "\n---\n" );

  /**/

  pstr = "abcxyz";

  printf ( "pstr == %s\n", pstr );

  printf ( "sizeof ( pstr ) == %d\n", sizeof ( pstr ) );

  printf ( "\n---\n" );

  /**/

  // pstr[1] = 'B';	// エラーになった...
  // printf ( "pstr == %s\n", pstr );

  return 0;
}
sample-001.c の実行結果
C:\usr\c\> sample-001
"abc" + 1 == "bc"
"abc"[0]==61 ('a')
"abc"[1]==62 ('b')
"abc"[2]==63 ('c')
"abc"[3]==0 ('')
sizeof ( "abc" ) == 4

---
pstr == abcxyz
sizeof ( pstr ) == 4

---
C:\usr\c\> 

sample-002

Download : sample-002.c ( SJIS 版 )

sample-002.c
#include <stdio.h>

#define	ARRAY_SIZE	1024
#define	EOS		'\0'		

int main ( void ) {
  char carray [ ARRAY_SIZE ];

  printf ( "sizeof ( char )   == %d\n", sizeof ( char ) );
  printf ( "ARRAY_SIZE        == %d\n", ARRAY_SIZE );
  printf ( "sizeof ( carray ) == %d\n", sizeof ( carray ) );

  printf ( "\n---\n" );

  /**/

  carray[0] = 'a';
  carray[1] = 'b';
  carray[2] = 'c';
  carray[3] = EOS;

  printf ( "carray==\"%s\"\n", carray );
  printf ( "sizeof ( carray ) == %d\n", sizeof ( carray ) );

  printf ( "\n---\n" );

  /**/

  carray[1] = EOS;

  printf ( "carray==\"%s\"\n", carray );
  printf ( "sizeof ( carray ) == %d\n", sizeof ( carray ) );
  printf ( "carray[2] == '%c'\n", carray[2] );

  carray[1] = 'B';
  printf ( "carray==\"%s\"\n", carray );

  printf ( "\n---\n" );

  /**/

  printf ( "\"ab\\0cd\" == \"%s\"\n", "ab\0cd" );
  printf ( "sizeof ( \"ab\\0cd\" ) == %d\n", sizeof ( "ab\0cd" ) );
  printf ( "\"ab\\0cd\"[3] == '%c'\n", "ab\0cd"[3] );

  /**/

  return 0;
}
sample-002.c の実行結果
C:\usr\c\> sample-002
sizeof ( char )   == 1
ARRAY_SIZE        == 1024
sizeof ( carray ) == 1024

---
carray=="abc"
sizeof ( carray ) == 1024

---
carray=="a"
sizeof ( carray ) == 1024
carray[2] == 'c'
carray=="aBc"

---
"ab\0cd" == "ab"
sizeof ( "ab\0cd" ) == 6
"ab\0cd"[3] == 'c'
C:\usr\c\> 

sample-003

Download : sample-003.c ( SJIS 版 )

sample-003.c
#include <stdio.h>
#include <string.h>

#define	ARRAY_SIZE	1024
#define	EOS		'\0'		

int main ( void ) {
  char carray [ ARRAY_SIZE ];

  /**/

  strcpy ( carray, "abcxyz" );
  printf ( "carray==\"%s\"\n", carray );
  printf ( "strlen ( carray ) ==%d\n", strlen ( carray ) );

  /**/

  strcpy ( carray, carray + 1 );
  printf ( "carray==\"%s\"\n", carray );

  /**/

  //  strcpy ( carray + 1, carray );
  //  printf ( "carray==\"%s\"\n", carray );


  /**/

  strcpy ( carray, "abcxyz" );
  memmove ( carray + 1, carray, strlen ( carray ) + 1 );
  printf ( "carray==\"%s\"\n", carray );


  return 0;
}
sample-003.c の実行結果
C:\usr\c\> sample-003
carray=="abcxyz"
strlen ( carray ) ==6
carray=="bcxyz"
carray=="aabcxyz"
C:\usr\c\> 

sample-004

Download : sample-004.c ( SJIS 版 )

sample-004.c
#include <stdio.h>
#include <string.h>

#define	ARRAY_SIZE	1024
#define	EOS		'\0'		

int main ( void ) {
  char carray [ ARRAY_SIZE ];
  char *find;

  /**/

  strcpy ( carray, "123abc456abc789" );

  find = strstr ( carray, "abc" );

  if ( find != NULL ) {
    printf ( "%s の中に%sがあり、%s の所です\n", carray, "abc", find );
  } else {
    printf ( "%s の中に%sがありません\n", carray, "abc" );
  }


  find = strstr ( carray, "xyz" );

  if ( find != NULL ) {
    printf ( "%s の中に%sがあり、%s の所です\n", carray, "xyz", find );
  } else {
    printf ( "%s の中に%sがありません\n", carray, "xyz" );
  }

  return 0;
}

	
sample-004.c の実行結果
C:\usr\c\> sample-004
123abc456abc789 の中にabcがあり、abc456abc789 の所です
123abc456abc789 の中にxyzがありません
C:\usr\c\> 

課題

文字列の処理

「文字列の置換」のプログラムを作る

課題20091204-01
それぞれ文字列を指す、三つのポインター型(char *)の引数( line, src, dst )をもち、(char *)型を返す関数replace_oneを作りなさい。ただし、引数および、その関数の働きは以下のようにする。
課題
課題
/*
 *
 */

#include <stdio.h>
#include <string.h>

/*
 *
 */

char *replace_one ( char *line, char *src, char *dst ) {

	/*
	**	 この部分を完成させなさい
	*/

}


/*
 *
 */

#define	BUFSIZE	1024

int main ( void ) {
    char src [ BUFSIZE ];
    char dst [ BUFSIZE ];
    char line [ BUFSIZE ];
    char *ans;

    printf ( "何を ?\n" );
    scanf ( "%s", src );

    printf ( "何に ?\n" );
    scanf ( "%s", dst );

    printf ( "行は ?\n" ); 
    scanf ( "%s", line );

    ans = replace_one ( line, src, dst );

    printf ( "変更結果は「%s」です。\n", line );

    if ( ans == NULL ) {
    	printf ( "置き換える文字列はありませんでした\n" );
    } else {
    	printf ( "置き換えた部分の後の文字列は「%s」です。\n", ans );
    }

    return 0;
}
入力例
入力例
abc
xyz
111abc222abc333
出力例
出例
C:\usr\c\> 20091204-1
何を ?
何に ?
行は ?
変更結果は「111xyz222abc333」です。
置き換えた部分の後の文字列は「222abc333」です。
C:\usr\c\> 
課題20091204-02
それぞれ文字列を指す、三つのポインター型(char *)の引数( line, src, dst )をもち、(char *)型を返す関数replace_allを作りなさい。ただし、引数および、その関数の働きは以下のようにする。
課題
課題
/*
 *
 */

#include <stdio.h>
#include <string.h>

/*
 *
 */

char *replace_one ( char *line, char *src, char *dst ) {
	/*
	 * さっきと同じ
	 */

}

/*
 *
 */

char *replace_all ( char *line, char *src, char *dst ) {
	/*
	 * この部分を完成させなさい。
	 */
}

/*
 *
 */

#define	BUFSIZE	1024

int main ( void ) {
    char src [ BUFSIZE ];
    char dst [ BUFSIZE ];
    char line [ BUFSIZE ];
    char *ans;

    printf ( "何を ?\n" );
    scanf ( "%s", src );

    printf ( "何に ?\n" );
    scanf ( "%s", dst );

    printf ( "行は ?\n" ); 
    scanf ( "%s", line );

    ans = replace_all ( line, src, dst );

    printf ( "変更結果は「%s」です。\n", line );

    return 0;
}
入力例
入力例
abc
xyz
111abc222abc333
出力例
出例
C:\usr\c\> 20091204-2
何を ?
何に ?
行は ?
変更結果は「111xyz222xyz333」です。
C:\usr\c\> 

試して見よう(20091204.c)

次のプログラムを完成させ、「コマンドプロンプト」を開いて、以下の操作をやってみよう。

標準入出とコマンド引数を利用した置換
/*
 *
 */

#include <stdio.h>
#include <string.h>

/*
 *
 */

char *replace_one ( char *line, char *src, char *dst ) {
	/*
	 * さっきと同じ
	 */
}

/*
 *
 */

char *replace_all ( char *line, char *src, char *dst ) {
	/*
	 * さっきと同じ
	 */
}

/*
 *
 */

#define	BUFSIZE	1024

int main ( int ac, char *av[] ) {
    char line [ BUFSIZE ];


    while ( fgets ( buf, BUFSIZE, stdin ) != NULL ) {
    	printf ( "%s", replace_all ( line, av[1], av[2] ) );
    }

    return 0;
}
操作例
C:\usr\c\> 20091204 abc xyz
111abc22abc333
111xyz22xyz333
^Z
C:\usr\c\>