Powered by SmartDoc

ソフトウェア概論A/B (2021/06/18)
Ver. 1.0

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

目次

講義資料

当日の OHP 資料

Download

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

Download : sample-001.c

sample-001.c
/*
 * 2021/06/18 sample-001.c
 */

/*
 * 返値を持つ関数
 */

#include <stdio.h>

/*
 * to_upper : 引数で与えられた文字が小文字なら大文字にする
 */

char to_upper ( char ch ) {

	 if ( 'a' <= ch ) {				/* もし、ch が 'a' 以上で.. */
	 	if ( ch <= 'z' ) {			/* 更に、ch が 'z' 以下なら.. */
			return ch - 'a' + 'A';	/* 小文字なので大文字に変換して返す */
									/* return 命令が実行されると、そこで関数は終了 */
		} /* else {} */				/* else 以下はないので省略 */
	} /* else {} */

	return ch;						/* 小文字でない場合は、そのまま返す */
}

/*
 * main 関数
 */

int main ( void ) {

	printf ( "一文字入力して、[Enter] キーを押してください : " );
	putchar ( to_upper ( getchar() ) );
	putchar ( '\n' );

	return 0;
}
入力例
k
sample-001.c の実行結果
$ ./sample-001.exe < sample-001.in
一文字入力して、[Enter] キーを押してください : k
K
$ 

Download : sample-002.c

sample-002.c
/*
 * 2021/06/18 sample-002.c
 */

/*
 * main の返値
 */

#include <stdio.h>

/*
 * is_upper : ch が大文字なら 1 そうでなければ、0 を返す
 */

int is_upper ( int ch ) {

	if ( 'A' <= ch ) {
		if ( ch <= 'Z' ) {
			return 1;		/* 大文字だった.. */
		}
	}

	return 0;				/* 大文字ではなかった.. */

}


/*
 * main 関数
 */

int main ( void ) {

	printf ( "一文字入力して、[Enter] キーを押してください : " );

	if ( is_upper ( getchar() ) ) {
		printf ( "大文字なので 0 を返します。\n" );
		return 0;
	} else {
		printf ( "大文字でなかったので 1 を返します。\n" );
		return 1;
	}

}
入力例
Q
sample-002.c の実行結果
$ ./sample-002.exe < sample-002.in
一文字入力して、[Enter] キーを押してください : Q
大文字なので 0 を返します。
$ 

Download : sample-003.c

sample-003.c
/*
 * 2021/06/18 sample-003.c
 *
 *	コンパイルの方法:
 *		cc -c -I ~/c/include sample-003.c
 */

/*
 * s_print.h の使い方
 */

#include <stdio.h>
#include "s_print.h"	/* s_print_... を利用する場合には必要 */

/*
 * main 関数
 */

int main ( void ) {

	s_print_char ( 'A' );		/* 文字の出力 : putchar ( 'A' ) と同じ */
	s_print_newline();			/* 改行の出力 : putchar ( '\n' ) と同じ */

	s_print_string ( "Hello, World\n" );
								/* 文字列の出力 : printf と同じ */

	s_print_int ( 123 );		/* 整数値の出力 */
	s_print_newline();

	return 0;
}
sample-003.c の実行結果
$ ./sample-003.exe
A
Hello, World
123
$ 

Download : sample-004.c

sample-004.c
/*
 * 2021/06/18 sample-004.c
 *
 *	コンパイルの方法:
 *		cc -c -I ~/c/include sample-004.c
 */

/*
 * s_input.h の使い方
 */

#include <stdio.h>
#include "s_print.h"
#include "s_input.h"	/* s_input_... を利用する場合には必要 */

/*
 * main 関数
 */

int main ( void ) {

	s_print_string ( "一文字を入力して、[Enter] を押してください : " );
	s_print_char ( s_input_char () + 1 );
	s_print_newline();

	s_print_string ( "整数値を一つ入力して、[Enter] を押してください : " );
	s_print_int ( s_input_int () + 1 );
	s_print_newline();

	return 0;
}
入力例
B
123
sample-004.c の実行結果
$ ./sample-004.exe < sample-004.in
一文字を入力して、[Enter] を押してください :  B
C
整数値を一つ入力して、[Enter] を押してください : 123
124
$ 

Download : sample-005.c

sample-005.c
/*
 * 2021/06/18 sample-005.c
 *
 *	コンパイルの方法:
 *		cc -c -I ~/c/include sample-005.c
 */

/*
 * 二つの入力を利用する場合
 */

#include <stdio.h>
#include "s_print.h"
#include "s_input.h"

/*
 * addfunc
 */

int addfunc ( int a ) {

	s_print_string ( "二つ目の整数値を入力して、[Enter] を押してください : " );

	return a + s_input_int();

}

/*
 * main 関数
 */

int main ( void ) {

	s_print_string ( "一つ目の整数値を入力して、[Enter] を押してください : " );
	s_print_int ( addfunc ( s_input_int() ) );
	s_print_newline();

	return 0;
}
入力例
123
456
sample-005.c の実行結果
$ ./sample-005.exe < sample-005.in
一つ目の整数値を入力して、[Enter] を押してください : 123
二つ目の整数値を入力して、[Enter] を押してください : 456
579
$ 

Download : sample-006.c

sample-006.c
/*
 * 2021/06/18 sample-006.c
 *
 *	コンパイルの方法:
 *		cc -c -I ~/c/include sample-006.c
 */

/*
 * 二つの入力を利用する場合 (失敗例)
 */

#include <stdio.h>
#include "s_print.h"
#include "s_input.h"

/*
 * subfunc
 */

int subfunc ( int a, int b ) {

	return a - b;

}

/*
 * main 関数
 */

int main ( void ) {

	s_print_string ( "二つの整数値を入力して、[Enter] を押してください : " );
	s_print_int ( subfunc ( s_input_int(), s_input_int() ) );
	s_print_newline();

	return 0;
}
入力例
123
456
sample-006.c の実行結果
$ ./sample-006.exe < sample-006.in
二つの整数値を入力して、[Enter] を押してください : 123
456
333
$ 

講議中に作成したプログラム

本日の課題

課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。

課題 20210618-01 : 文字の種類に応じて、その種類を表す文字を返す関数

Download : 20210618-01.c

20210618-01.c
/*
 * 20210618-01-QQQQ.c
 *	文字の種類に応じて、その種類を表す文字を返す関数
 *		種別		範囲			返す文字
 *		英大文字	A-Z					A
 *		英子文字	a-z					a
 *		数字		0-9					0
 *		その他							?
 */

#include <stdio.h>

/*
 * char_type : 引数で与えられた文字の種類を表す文字を返す関数
 */

char char_type ( char ch ) {

	/* 英大文字かどうかをチェック */
	if ( 'A' <= ch ) {				/* もし、ch が 'A' 以上で.. */
	 	if ( ch <= 'Z' ) {			/* 更に、ch が 'Z' 以下なら.. */

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

		} /* else {} */				/* else 以下はないので省略 */
	} /* else {} */

	/* 英小文字かどうかをチェック */
	if ( 'a' <= ch ) {				/* もし、ch が 'a' 以上で.. */
	 	if ( ch <= 'z' ) {			/* 更に、ch が 'z' 以下なら.. */
			return 'a';				/* 英小文字なので 'A' を返す */
		} /* else {} */				/* else 以下はないので省略 */
	} /* else {} */

	/* 数字かどうかをチェック */
	if ( '0' <= ch ) {				/* もし、ch が '0' 以上で.. */

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

	} /* else {} */

	/* 上記のいずれでもない場合は、'?' を返す */


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

}

/*
 * change_char_type : 一行分、キーボードから文字列を読込、そのタイプに変換
 */

void change_char_type ( char ch ) {

	if ( ch == '\n' ) {		/* 改行ならば、一行分の処理は終り */
		/* do nothing */
	} else {				/* 文字のタイプを表示し、再帰処理 */
		putchar ( char_type ( ch ) );
		change_char_type ( getchar() );
	}
}

/*
 * main 関数
 */

int main ( void ) {

	printf ( "一行文字列入力して、[Enter] キーを押してください : " );
	change_char_type ( getchar() );
	putchar ( '\n' );

	return 0;
}
入力例
abcABC123()~
20210618-01.c の実行結果
$ ./20210618-01-QQQQ.exe
一行文字列入力して、[Enter] キーを押してください : aaaAAA000***
$ 

課題 20210618-02 : 二つの整数値を入力し余りを計算する関数

Download : 20210618-02.c

20210618-02.c
/*
 * 20210618-02-QQQQ.c
 *	二つの整数値を入力して、その余りを出力する
 */

#include <stdio.h>

#include "s_print.h"
#include "s_input.h"

/*
 * remainder
 */

int remainder ( int a ) {

	s_print_string ( "割る整数を入力して、[Enter] を押してください : " );


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


}

/*
 * main
 */

int main ( void ) {

	s_print_string ( "割られる整数を入力して、[Enter] を押してください : " );
	s_print_int ( remainder ( s_input_int() ) );
	s_print_newline();

  return 0;
}
入力例
100
13
20210618-02.c の実行結果
$ ./20210618-02-QQQQ.exe
割られる整数を入力して、[Enter] を押してください : 100
割る整数を入力して、[Enter] を押してください : 13
9
$