Powered by SmartDoc

ソフトウェア概論B (2011/06/10)
Ver. 1.0

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

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

追加ファイル

  1. 以前の版から更新されていますので、上書きしてください。

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

sample-001

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 2011/06/10 sample-001.c
 */

/*
 * 条件分岐
 */

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

/*
 * is_negative : 負の数なら負という
 */

void is_negative ( int n ) {

  s_print_int ( n );
  s_print_string ( " は、負の数で" );
  if ( n < 0 ) {		/* 0 より小さい整数は「負の数」 */
	s_print_string ( "す。" );
  } else {			/* そうでなければ、「負の数」でない */
	s_print_string ( "はありません。" );
  }
  s_print_newline();

}

/*
 *
 */

int main ( void ) {

  is_negative ( 10 );
  is_negative ( -5 );
  is_negative ( 0 );
  is_negative ( 3 );

  return 0;
}

/*
 *
 */
sample-001.c の実行結果
C:\usr\c\> sample-001
10 は、負の数ではありません。
-5 は、負の数です。
0 は、負の数ではありません。
3 は、負の数ではありません。
C:\usr\c\> 

sample-002

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 2011/06/10 sample-002.c
 */

/*
 * 複数の条件分岐
 */

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

/*
 * 正負零を識別
 */

void sign ( int n ) {

  s_print_int ( n );
  s_print_string ( " は、" );

  if ( n < 0 ) {		/* 0 より小さい整数は「負の数」 */
	s_print_string ( "負の数" );
  } else if ( n > 0 ) {	/* 0 より大きい整数は「正の数」 */
	s_print_string ( "正の数" );
  } else {			/* その何れでもなければ、「零」 */
	s_print_string ( "零" );
  }
  s_print_string ( "です。" );
  s_print_newline();

}

/*
 *
 */

int main ( void ) {

 sign ( 10 );
 sign ( -5 );
 sign ( 0 );
 sign ( 3 );

  return 0;
}

/*
 *
 */
sample-002.c の実行結果
C:\usr\c\> sample-002
10 は、正の数です。
-5 は、負の数です。
0 は、零です。
3 は、正の数です。
C:\usr\c\> 

sample-003

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 2011/06/10 sample-003.c
 */

/*
 * 複数の条件分岐
 */

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

/*
 * 一桁の素数の倍数か ?
 */

void factor ( int n ) {

  s_print_int ( n );
  s_print_string ( " は、" );

  if ( n % 2 == 0 )	{	/* 2 で割った余りが 0 なら 2 の倍数 */
	s_print_string ( "2 の倍数" );
  } else if ( n % 3 == 0 ) {	/* 3 で割った余りが 0 なら 3 の倍数 */
	s_print_string ( "3 の倍数" );
  } else if ( n % 5 == 0 ) {	/* 5 で割った余りが 0 なら 5 の倍数 */
	s_print_string ( "5 の倍数" );
  } else if ( n % 7 == 0 ) {	/* 7 で割った余りが 0 なら 7 の倍数 */
	s_print_string ( "7 の倍数" );
  } else {			/* その何れでもなければ、一桁の素数の倍数 */
	s_print_string ( "一桁の素数の倍数ではない" );
  }
  s_print_string ( "です。" );
  s_print_newline();

}

/*
 * factor_i_to_n
 */

void factor_i_to_n ( int i, int n ) {

  if ( i > n ) {			/* すでに n まで書いた */
	/* なにもする事はない */
  } else {				/* まだやることがある */
	factor ( i );			/* とりあえず i の処理 */
	factor_i_to_n ( i + 1, n );	/* 残りは再帰で */
  }

}

/*
 *
 */

int main ( void ) {

  factor_i_to_n ( 10, 99 );	/* 10 〜 99 の間で、一桁の素数の倍数かどうかを調べる */

  return 0;
}

/*
 *
 */
sample-003.c の実行結果
C:\usr\c\> sample-003
10 は、2 の倍数です。
11 は、一桁の素数の倍数ではないです。
12 は、2 の倍数です。
13 は、一桁の素数の倍数ではないです。
14 は、2 の倍数です。
15 は、3 の倍数です。
16 は、2 の倍数です。
17 は、一桁の素数の倍数ではないです。
18 は、2 の倍数です。
19 は、一桁の素数の倍数ではないです。
20 は、2 の倍数です。
21 は、3 の倍数です。
22 は、2 の倍数です。
23 は、一桁の素数の倍数ではないです。
24 は、2 の倍数です。
25 は、5 の倍数です。
26 は、2 の倍数です。
27 は、3 の倍数です。
28 は、2 の倍数です。
29 は、一桁の素数の倍数ではないです。
30 は、2 の倍数です。
31 は、一桁の素数の倍数ではないです。
32 は、2 の倍数です。
33 は、3 の倍数です。
34 は、2 の倍数です。
35 は、5 の倍数です。
36 は、2 の倍数です。
37 は、一桁の素数の倍数ではないです。
38 は、2 の倍数です。
39 は、3 の倍数です。
40 は、2 の倍数です。
41 は、一桁の素数の倍数ではないです。
42 は、2 の倍数です。
43 は、一桁の素数の倍数ではないです。
44 は、2 の倍数です。
45 は、3 の倍数です。
46 は、2 の倍数です。
47 は、一桁の素数の倍数ではないです。
48 は、2 の倍数です。
49 は、7 の倍数です。
50 は、2 の倍数です。
51 は、3 の倍数です。
52 は、2 の倍数です。
53 は、一桁の素数の倍数ではないです。
54 は、2 の倍数です。
55 は、5 の倍数です。
56 は、2 の倍数です。
57 は、3 の倍数です。
58 は、2 の倍数です。
59 は、一桁の素数の倍数ではないです。
60 は、2 の倍数です。
61 は、一桁の素数の倍数ではないです。
62 は、2 の倍数です。
63 は、3 の倍数です。
64 は、2 の倍数です。
65 は、5 の倍数です。
66 は、2 の倍数です。
67 は、一桁の素数の倍数ではないです。
68 は、2 の倍数です。
69 は、3 の倍数です。
70 は、2 の倍数です。
71 は、一桁の素数の倍数ではないです。
72 は、2 の倍数です。
73 は、一桁の素数の倍数ではないです。
74 は、2 の倍数です。
75 は、3 の倍数です。
76 は、2 の倍数です。
77 は、7 の倍数です。
78 は、2 の倍数です。
79 は、一桁の素数の倍数ではないです。
80 は、2 の倍数です。
81 は、3 の倍数です。
82 は、2 の倍数です。
83 は、一桁の素数の倍数ではないです。
84 は、2 の倍数です。
85 は、5 の倍数です。
86 は、2 の倍数です。
87 は、3 の倍数です。
88 は、2 の倍数です。
89 は、一桁の素数の倍数ではないです。
90 は、2 の倍数です。
91 は、7 の倍数です。
92 は、2 の倍数です。
93 は、3 の倍数です。
94 は、2 の倍数です。
95 は、5 の倍数です。
96 は、2 の倍数です。
97 は、一桁の素数の倍数ではないです。
98 は、2 の倍数です。
99 は、3 の倍数です。
C:\usr\c\> 

sample-004

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 2011/06/10 sample-004.c
 */

/*
 * 世界のナベアツ
 */

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

/*
 *
 */

void nabeatsu ( int n ) {

  if ( n % 3 == 0 ) {				/* 3 の倍数なので.. */
	s_print_string ( "アホ" );
  } else if ( n % 10 == 3 ) {			/* 一桁目が 3 の倍数なので.. */
	s_print_string ( "アホ" );
  } else if ( ( n / 10 ) % 10 == 3 ) {		/* 二桁桁目が 3 の倍数なので.. */
	s_print_string ( "アホ" );
  } else if ( ( n / 100 ) % 10 == 3 ) {	/* 三桁目が 3 の倍数なので.. */
	s_print_string ( "アホ" );
  } else {			/* 四桁目も考えられるが、そこまでは芸は続けられないだろうから.. */
	s_print_int ( n );
  }

}

/*
 * i から n までを「ナベアツ」する
 */

void nabeatsu_i_to_n ( int i, int n ) {

  if ( i > n ) {			/* すでに n まで書いた */
	/* なにもする事はない */
  } else {				/* まだやることがある */
	nabeatsu ( i );		/* とりあえず i のナベアツ */
	s_print_string ( " " );	/* 隙間をあける */
	nabeatsu_i_to_n ( i + 1, n );	/* 残りは再帰で */
  }
}

/*
 *
 */

int main ( void ) {

  nabeatsu_i_to_n ( 1, 100 );
  s_print_newline();

  return 0;
}

/*
 *
 */
sample-004.c の実行結果
C:\usr\c\> sample-004
1 2 アホ 4 5 アホ 7 8 アホ 10 11 アホ アホ 14 アホ 16 17 アホ 19 20 アホ 22 アホ アホ \
    25 26 アホ 28 29 アホ アホ アホ アホ アホ アホ アホ アホ アホ アホ 40 41 アホ アホ 44 \
    アホ 46 47 アホ 49 50 アホ 52 アホ アホ 55 56 アホ 58 59 アホ 61 62 アホ 64 \
    65 アホ 67 68 アホ 70 71 アホ アホ 74 アホ 76 77 アホ 79 80 アホ 82 アホ アホ \
    85 86 アホ 88 89 アホ 91 92 アホ 94 95 アホ 97 98 アホ 100
C:\usr\c\> 

sample-005

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * 2011/06/10 sample-005.c
 */

/*
 * 多条件分岐
 *	トランプのカードの出力 ( else if 版 )
 */

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

/*
 * print_card
 */

void print_card ( int card ) {

  if ( card == 1 ) {			/* card == 1 の時 */
	s_print_string ( "A" );	/* 'A' エースを出力 */
  } else if ( card == 2 ) {		/* card == 2 の時 */
	s_print_int ( card );		/* 2 〜 10 の場合は、card 自身を出力 */
  } else if ( card == 3 ) {
	s_print_int ( card );
  } else if ( card == 4 ) {
	s_print_int ( card );
  } else if ( card == 5 ) {
	s_print_int ( card );
  } else if ( card == 6 ) {
	s_print_int ( card );
  } else if ( card == 7 ) {
	s_print_int ( card );
  } else if ( card == 8 ) {
	s_print_int ( card );
  } else if ( card == 9 ) {
	s_print_int ( card );
  } else if ( card == 10 ) {
	s_print_int ( card );
  } else if ( card == 11 ) {
	s_print_string ( "J" );
  } else if ( card == 12 ) {
	s_print_string ( "Q" );
  } else if ( card == 13 ) {
	s_print_string ( "K" );
  } else {				/* その他 ( 1 〜 13 以外 ) の場合 */
	s_print_string ( "?" );	/* "?" を出力 */
  }


}

/*
 * i から n までのカードを出力
 */


void print_card_i_to_n ( int i, int n ) {

  if ( i > n ) {			/* すでに n まで書いた */
	/* なにもする事はない */
  } else {				/* まだやることがある */
	s_print_int ( i );		/* とりあえず i のプリント */
	s_print_string ( " : " );
	print_card ( i );
	s_print_newline();

	print_card_i_to_n ( i + 1, n );	/* 残りは再帰で */
  }
}

/*
 *
 */

int main ( void ) {

  print_card_i_to_n ( 1, 13 );

  return 0;
}
sample-005.c の実行結果
C:\usr\c\> sample-005
1 : A
2 : 2
3 : 3
4 : 4
5 : 5
6 : 6
7 : 7
8 : 8
9 : 9
10 : 10
11 : J
12 : Q
13 : K
C:\usr\c\> 

sample-006

Download : sample-006.c ( SJIS 版 )

sample-006.c
/*
 * 2011/06/10 sample-006.c
 */

/*
 * 多条件分岐
 *	トランプのカードの出力 ( switch 版 )
 */

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

/*
 *
 */

void print_card ( int card ) {

  switch ( card ) {	/* card の値によって多重分岐する */
  case 1:				/* card == 1 の時 */
	s_print_string ( "A" );	/* 'A' エースを出力 */
	break;		/* card == 1 の時を終了するためには break が必要 */
  case 2:		/* card == 2 の時 */
  case 3:		/* card == 3 の時 : 以下 10 までは同じコードよい */
  case 4:
  case 5:
  case 6:
  case 7:
  case 8:
  case 9:
  case 10:
	s_print_int ( card );	/* 2 〜 10 の場合は、card 自身を出力 */
	break;		/* card == 1 の時を終了するためには break が必要 */
  case 11:
	s_print_string ( "J" );
	break;
  case 12:
	s_print_string ( "Q" );
	break;
  case 13:
	s_print_string ( "K" );
	break;
  default:				/* その他 ( 1 〜 13 以外 ) の場合 */
	s_print_string ( "?" );	/* "?" を出力 */
	break;
  }

}

/*
 * i から n までのカードを出力
 */


void print_card_i_to_n ( int i, int n ) {

  if ( i > n ) {			/* すでに n まで書いた */
	/* なにもする事はない */
  } else {				/* まだやることがある */
	s_print_int ( i );		/* とりあえず i のプリント */
	s_print_string ( " : " );
	print_card ( i );
	s_print_newline();

	print_card_i_to_n ( i + 1, n );	/* 残りは再帰で */
  }
}

/*
 *
 */

int main ( void ) {

  print_card_i_to_n ( 1, 13 );

  return 0;
}
sample-006.c の実行結果
C:\usr\c\> sample-006
1 : A
2 : 2
3 : 3
4 : 4
5 : 5
6 : 6
7 : 7
8 : 8
9 : 9
10 : 10
11 : J
12 : Q
13 : K
C:\usr\c\> 

sample-007

Download : sample-007.c ( SJIS 版 )

sample-007.c
/*
 * 2011/06/10 sample-007.c

 */

/*
 * 整数の表現 ( n 進数 )
 */

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

/*
 *
 */

void n3_print ( int n, int base ) {

  if ( n < base ) {
	s_print_string ( "  " );	/* 1桁なので空白を二つ追加 */
  } else if ( n < base * base ) {
	s_print_string ( " " );	/* 2桁なので空白を一つ追加 */
  }

  switch ( base ) {
  case 8:
	  s_print_oct ( n );	/* 八進数 */
	  break;
  case 16:
	  s_print_hex ( n );	/* 十六進数 */
	  break;
  default:
  case 10:
	  s_print_int ( n );	/* 十進数 */
	  break;
  }

}

void n_print ( int n ) {

  n3_print ( n, 10 );
  s_print_string ( "  " );
  n3_print ( n, 16 );
  s_print_string ( "  " );
  n3_print ( n, 8 );
  s_print_string ( "\n" );

}

/*
 * i から n までを出力する
 */

void print_i_to_n ( int i, int n ) {

  if ( i > n ) {			/* すでに n まで書いた */
	/* なにもする事はない */
  } else {				/* まだやることがある */
	n_print ( i );			/* とりあえず i の表示 */
	print_i_to_n ( i + 1, n );	/* 残りは再帰で */
  }
}

void print_0_to_n ( int n ) {
  printf ( " 10   16    8\n" );
  print_i_to_n ( 0, n );
}

/*
 *
 */

int main ( void ) {

  print_0_to_n ( 200 );	/* 0 から 200 までの表を作る */

  return 0;
}
sample-007.c の実行結果
C:\usr\c\> sample-007
 10   16    8
  0    0    0
  1    1    1
  2    2    2
  3    3    3
  4    4    4
  5    5    5
  6    6    6
  7    7    7
  8    8   10
  9    9   11
 10    a   12
 11    b   13
 12    c   14
 13    d   15
 14    e   16
 15    f   17
 16   10   20
 17   11   21
 18   12   22
 19   13   23
 20   14   24
 21   15   25
 22   16   26
 23   17   27
 24   18   30
 25   19   31
 26   1a   32
 27   1b   33
 28   1c   34
 29   1d   35
 30   1e   36
 31   1f   37
 32   20   40
 33   21   41
 34   22   42
 35   23   43
 36   24   44
 37   25   45
 38   26   46
 39   27   47
 40   28   50
 41   29   51
 42   2a   52
 43   2b   53
 44   2c   54
 45   2d   55
 46   2e   56
 47   2f   57
 48   30   60
 49   31   61
 50   32   62
 51   33   63
 52   34   64
 53   35   65
 54   36   66
 55   37   67
 56   38   70
 57   39   71
 58   3a   72
 59   3b   73
 60   3c   74
 61   3d   75
 62   3e   76
 63   3f   77
 64   40  100
 65   41  101
 66   42  102
 67   43  103
 68   44  104
 69   45  105
 70   46  106
 71   47  107
 72   48  110
 73   49  111
 74   4a  112
 75   4b  113
 76   4c  114
 77   4d  115
 78   4e  116
 79   4f  117
 80   50  120
 81   51  121
 82   52  122
 83   53  123
 84   54  124
 85   55  125
 86   56  126
 87   57  127
 88   58  130
 89   59  131
 90   5a  132
 91   5b  133
 92   5c  134
 93   5d  135
 94   5e  136
 95   5f  137
 96   60  140
 97   61  141
 98   62  142
 99   63  143
100   64  144
101   65  145
102   66  146
103   67  147
104   68  150
105   69  151
106   6a  152
107   6b  153
108   6c  154
109   6d  155
110   6e  156
111   6f  157
112   70  160
113   71  161
114   72  162
115   73  163
116   74  164
117   75  165
118   76  166
119   77  167
120   78  170
121   79  171
122   7a  172
123   7b  173
124   7c  174
125   7d  175
126   7e  176
127   7f  177
128   80  200
129   81  201
130   82  202
131   83  203
132   84  204
133   85  205
134   86  206
135   87  207
136   88  210
137   89  211
138   8a  212
139   8b  213
140   8c  214
141   8d  215
142   8e  216
143   8f  217
144   90  220
145   91  221
146   92  222
147   93  223
148   94  224
149   95  225
150   96  226
151   97  227
152   98  230
153   99  231
154   9a  232
155   9b  233
156   9c  234
157   9d  235
158   9e  236
159   9f  237
160   a0  240
161   a1  241
162   a2  242
163   a3  243
164   a4  244
165   a5  245
166   a6  246
167   a7  247
168   a8  250
169   a9  251
170   aa  252
171   ab  253
172   ac  254
173   ad  255
174   ae  256
175   af  257
176   b0  260
177   b1  261
178   b2  262
179   b3  263
180   b4  264
181   b5  265
182   b6  266
183   b7  267
184   b8  270
185   b9  271
186   ba  272
187   bb  273
188   bc  274
189   bd  275
190   be  276
191   bf  277
192   c0  300
193   c1  301
194   c2  302
195   c3  303
196   c4  304
197   c5  305
198   c6  306
199   c7  307
200   c8  310
C:\usr\c\> 

sample-008

Download : sample-008.c ( SJIS 版 )

sample-008.c
/*
 * 2011/06/10 sample-008.c
 */

/*
 * 「整数値(文字コード)」を利用して「文字」表示を行う
 *	cf. http://e-words.jp/p/r-ascii.html
 */

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

/*
 * main
 */

int main ( void ) {

  /*
   * ASCII Code 表で 'A' の文字を調べる
   */

  s_print_char( 65 );	/* 整数値の 65 は、ASCII コードで 'A' を表す */

  s_print_newline();	/* 改行 */

  /*
   * SJIS の対応表で '漢' の文字を調べる
   */

  s_print_char( 0x8a );	/* 「漢」(0x8ABF)の 1 byte 目 */
  s_print_char( 0xbf );	/* 「漢」(0x8ABF)の 2 byte 目 */

  s_print_newline();	/* 改行 */

  return 0;
}

/*
 *
 */
sample-008.c の実行結果
C:\usr\c\> sample-008
A
??
C:\usr\c\> 

sample-009

Download : sample-009.c ( SJIS 版 )

sample-009.c
/*
 * 2011/06/10 sample-009.c
 */

/*
 * 「シングルクォート」を利用して「文字」を表現する
 */

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

/*
 * main
 */

int main ( void ) {

s_print_int( 'A' );	/* 'A' は ASCII Code 表の 'A' に対応した、ASCII Code (整数値) 65 \
    を意味する */
  s_print_newline();	/* 改行 */

  s_print_char( 'A' );	/* 'A' を使えば、簡単に 'A' が表示できる */
  s_print_newline();	/* 改行 */

  /* この方法は、漢字には使えない.. */

  s_print_newline();	/* 改行 */

  return 0;
}

/*
 *
 */
sample-009.c の実行結果
C:\usr\c\> sample-009
65
A

C:\usr\c\> 

sample-010

Download : sample-010.c ( SJIS 版 )

sample-010.c
/*
 * 2011/06/10 sample-010.c
 */

/*
 * 「文字コード」の計算
 */

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

/*
 * main
 */

int main ( void ) {

  s_print_char ( 'A' );	/* 'A' を出力 */
  s_print_newline();

  s_print_int ( 'A' );		/* 'A' の ASCII Code */
  s_print_newline();

  s_print_int ( 'A' + 1 );	/* 'A' の ASCII Code + 1 は.. */
  s_print_newline();

  s_print_char ( 'A' + 1 );	/* 'B' の ASCII Code になるので .. */
  s_print_newline();

  return 0;
}

/*
 *
 */
sample-010.c の実行結果
C:\usr\c\> sample-010
A
65
66
B
C:\usr\c\> 

sample-011

Download : sample-011.c ( SJIS 版 )

sample-011.c
/*
 * 2011/06/10 sample-011.c
 */

/*
 * 「文字コード」で情報処理
 */

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

/*
 * print_lower ( 小文字に変換するして出力 )
 */

void print_lower ( char ch ) {

  s_print_char ( ch - 'A' + 'a' );	/* 小文字に変換して出力 */

}

/*
 * print_upper ( 大文字に変換するして出力 )
 */

void print_upper ( char ch ) {

  s_print_char ( ch - 'a' + 'A' );	/* 大文字に変換して出力 */

}

/*
 * main
 */

int main ( void ) {

  s_print_char ( 'H' );	/* 普通に大文字を出力 */
  s_print_newline();
  print_lower ( 'H' );		/* 大文字を小文字に変換して出力 */
  s_print_newline();

  s_print_char ( 'j' );	/* 普通に小文字を出力 */
  s_print_newline();
  print_upper ( 'j' );		/* 小文字を大文字に変換して出力 */
  s_print_newline();

  return 0;
}

/*
 *
 */
sample-011.c の実行結果
C:\usr\c\> sample-011
H
h
j
J
C:\usr\c\> 

sample-012

Download : sample-012.c ( SJIS 版 )

sample-012.c
/*
 * 2011/06/10 sample-012.c
 */

/*
 * 「文字コード」の計算
 */

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

/*
 * i から n までの整数値で示される文字コードに対応する文字を出力
 */

void print_char_i_to_n ( int i, int n ) {

  if ( i > n ) {				/* すでに n まで書いた */
	/* なにもする事はない */
  } else {					/* まだやることがある */
	s_print_char ( i );			/* とりあえず i の表示 */
	print_char_i_to_n ( i + 1, n );	/* 残りは再帰で */
  }
}

/*
 * main
 */

int main ( void ) {

  print_char_i_to_n ( 'A', 'Z' );	/* 英大文字 ( 'A' 〜 'Z' ) を出力 */
					/* これらが ASCII Code 表で「並んでいる」事がポイント */
  s_print_newline();

  print_char_i_to_n ( 'a', 'z' );	/* 今度は英大小文字 ( 'a' 〜 'z' ) を出力 */
					/* やはり ASCII Code 表で「並んでいる」事がポイント */
  s_print_newline();

  print_char_i_to_n ( '0', '9' );	/* 数字 (数値ではない !!) */
  s_print_newline();

  return 0;
}

/*
 *
 */
sample-012.c の実行結果
C:\usr\c\> sample-012
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789
C:\usr\c\> 

sample-013

Download : sample-013.c ( SJIS 版 )

sample-013.c
/*
 * 2011/06/10 sample-013.c
 */

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

/*
 * a と b の和を計算する
 */

int addition ( int n, int m ) {

  return n + m;	/* n と m を加えた和を「関数の値」として「返す」 */
}

/*
 *
 */

main()
{

  s_print_int ( addition ( 3, 4 ) );	/* 返された値を利用する事ができる */
  s_print_newline();
}

/*
 *
 */
sample-013.c の実行結果
C:\usr\c\> sample-013
7
C:\usr\c\> 

sample-014

Download : sample-014.c ( SJIS 版 )

sample-014.c
/*
 * 2011/06/10 sample-014.c
 */

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

/*
 * sum ( n ) : sum of 1 to n
 */

int sum ( int n ) {

  if ( n == 0 ) {			/* n が 0 の時 */
	return 0;			/* sum 0 = 0 */
  } else {				/* その他の場合 */
	return sum ( n - 1 ) + n;	/* sum(n) = sum(n-1) + n */
  }
}

/*
 *
 */

main()
{

  s_print_string ( "sum 4 = " );
  s_print_int ( sum ( 4 ) );
  s_print_newline();

  s_print_string ( "sum 50 = " );
  s_print_int ( sum ( 50 ) );
  s_print_newline();

}

/*
 *
 */
sample-014.c の実行結果
C:\usr\c\> sample-014
sum 4 = 10
sum 50 = 1275
C:\usr\c\> 

sample-015

Download : sample-015.c ( SJIS 版 )

sample-015.c
/*
 * 2011/06/10 sample-015.c
 */

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

/*
 * Fibonacci
 */

int fib ( int n ) {

  switch ( n ) {
  case 1:
  case 2:
	return 1;	/* fib 1 = fib 2 = 1 */
	break;
  default:
	return fib ( n - 1 ) + fib ( n - 2 );
			/* fib( n ) = fib( n - 1 ) + fib( n - 2 ) */
	break;
  }

}

/*
 *
 */

main()
{

  s_print_string ( "fib(" );
  s_print_int ( 2 );
  s_print_string ( ")=" );
  s_print_int ( fib ( 2 ) );
  s_print_newline();

  s_print_string ( "fib(" );
  s_print_int ( 7 );
  s_print_string ( ")=" );
  s_print_int ( fib ( 7 ) );
  s_print_newline();

  s_print_string ( "fib(" );
  s_print_int ( 10 );
  s_print_string ( ")=" );
  s_print_int ( fib ( 10 ) );
  s_print_newline();

}

/*
 *
 */
sample-015.c の実行結果
C:\usr\c\> sample-015
fib(2)=1
fib(7)=13
fib(10)=55
C:\usr\c\> 

sample-016

Download : sample-016.c ( SJIS 版 )

sample-016.c
/*
 * 2011/06/10 sample-016.c
 */

#include <stdio.h>
#include <stdlib.h>	/* rand を使うために必要 */
#include "s_print.h"

/*
 * main
 */

main()
{

  s_print_int ( rand() );	/* rand には引数が要らない */
  s_print_newline();

  s_print_int ( rand() );	/* 呼出す毎に異なる値になる */
  s_print_newline();

  s_print_int ( rand() );
  s_print_newline();

  s_print_int ( rand() );
  s_print_newline();

  return 0;

}

/*
 *
 */
sample-016.c の実行結果
C:\usr\c\> sample-016
1804289383
846930886
1681692777
1714636915
C:\usr\c\> 

sample-017

Download : sample-017.c ( SJIS 版 )

sample-017.c
/*
 * 2011/06/10 sample-017.c
 */

#include <stdio.h>
#include <stdlib.h>	/* rand を使うために必要 */
#include "s_print.h"

/*
 * saikoro
 */

int saikoro() {

  return rand() % 6 + 1;	/* 6 で割った余りは 0 〜 5, これに 1 を加えれば 1 〜 6 になる */
}

/*
 * main
 */

main()
{

  s_print_int ( saikoro() );	/* saikoro には引数が要らない */
  s_print_newline();

  s_print_int ( saikoro() );	/* 呼出す毎に異なる値になる */
  s_print_newline();

  s_print_int ( saikoro() );
  s_print_newline();

  s_print_int ( saikoro() );
  s_print_newline();

  return 0;

}

/*
 *
 */
sample-017.c の実行結果
C:\usr\c\> sample-017
2
5
4
2
C:\usr\c\> 

sample-018

Download : sample-018.c ( SJIS 版 )

sample-018.c
/*
 * 2011/06/10 sample-018.c
 */

#include <stdio.h>
#include "s_print.h"
#include "s_input.h"	/* 入力のために必要 */

/*
 * main
 */

main()
{

  s_print_string ( "整数をキーボードから入力して、改行キーを押してください : " );
  s_print_int ( s_input_int() );	/*  */
  s_print_newline();

  s_print_string ( "文字をキーボードから入力して、改行キーを押してください : " );
  s_print_char ( s_input_char() );	/*  */
  s_print_newline();

  return 0;

}

/*
 *
 */
入力例
123
x
sample-018.c の実行結果
C:\usr\c\> sample-018
整数をキーボードから入力して、改行キーを押してください : 123
文字をキーボードから入力して、改行キーを押してください : x
C:\usr\c\> 

sample-019

Download : sample-019.c ( SJIS 版 )

sample-019.c
/*
 * 2011/06/10 sample-019.c
 */

#include <stdio.h>
#include "s_print.h"
#include "s_input.h"	/* 入力のために必要 */

/*
 * input_add
 */

int input_add ( int n )
{

   s_print_string ( "整数をキーボードから加える数を入力して、改行キーを押してください : " );

   return n + s_input_int();

}


/*
 * main
 */

main()
{

  s_print_string ( "一つ目の整数をキーボードから入力して、改行キーを押してください : " );
  s_print_int ( input_add ( s_input_int() ) );
  s_print_newline();

  return 0;

}

/*
 *
 */
入力例
123
380
sample-019.c の実行結果
C:\usr\c\> sample-019
一つ目の整数をキーボードから入力して、改行キーを押してください : \
    整数をキーボードから加える数を入力して、改行キーを押してください : 503
C:\usr\c\> 

sample-020

Download : sample-020.c ( SJIS 版 )

sample-020.c
/*
 * 2011/06/10 sample-020.c
 */

#include <stdio.h>
#include "s_print.h"
#include "s_input.h"	/* 入力のために必要 */

/*
 * min_max_game_check
 */

extern void min_max_game ( int question, int count );

/*
 * min_max_game_check
 */

void min_max_game_check ( int question, int count, int answer )
{

  if ( question == answer ) {
	s_print_string ( "正解です。" );
	s_print_newline();
	s_print_int ( count );
	s_print_string ( "回で発見できました。" );
  } else if ( question < answer ) {
	s_print_string ( "大きすぎます" );
	s_print_newline();
	min_max_game ( question, count + 1 );
  } else {
	s_print_string ( "小さすぎます" );
	s_print_newline();
	min_max_game ( question, count + 1 );
  }

}


/*
 * min_max_game
 */

void min_max_game ( int question, int count ) 
{

  s_print_int ( count );
  s_print_string ( "回目の予想です。" );
  s_print_newline();

  s_print_string ( "予想する数を入力してください :" );
  min_max_game_check ( question, count, s_input_int() );

}


/*
 * main
 */

main()
{

  s_print_string ( "1 〜 1000 の数を予想してください\n" );
  min_max_game ( rand() % 1000 + 1, 1 );

  return 0;

}

/*
 *
 */
sample-020.c の実行結果
C:\usr\c\> sample-020
1 〜 1000 の数を予想してください
1回目の予想です。
予想する数を入力してください :100
小さすぎます
2回目の予想です。
予想する数を入力してください :500
大きすぎます
3回目の予想です。
予想する数を入力してください :400
大きすぎます
4回目の予想です。
予想する数を入力してください :300
小さすぎます
5回目の予想です。
予想する数を入力してください :350
小さすぎます
6回目の予想です。
予想する数を入力してください :370
小さすぎます
7回目の予想です。
予想する数を入力してください :380
小さすぎます
8回目の予想です。
予想する数を入力してください :385
大きすぎます
9回目の予想です。
予想する数を入力してください :384
正解です。
9回で発見できました。
C:\usr\c\>

本日の課題

課題 20110610-01

Download : 20110610-01.c ( SJIS 版 )

20110610-01.c
/*
 * 20110610-1-QQQQ.c
 *	Fizz Buzz
 */

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

/*
* <a href="http://ja.wikipedia.org/wiki/Fizz_Buzz"> Fizz Buzz (フィズ・バズ) </a>
 *   最初は「1」と数値を発言。次は次の数値を発言。
 *   ただし、3で割り切れる場合は 「Fizz」、
 *   5で割り切れる場合は 「Buzz」、
 *   両者で割り切れる場合は 「Fizz Buzz」を数値の代わりに発言しなければならない。
 */

void fizz_buzz ( int n ) {

	if ( n % 3 == 0 ) {	/* 3 で割切れた */
		if ( /* q:ここ */ ) {	/* 更に 5 で割切れた */

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

		} else {		/* 3 で割れるが 5 で割切れないので.. */
			s_print_string ( "Fizz" );		/* Fizz だけでよい */
		}
	} else if ( /* q:ここ */ ) { 	/* 3 で割切れずに 5 で割切れたので.. */

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

	} else {			/* いずれでもなければ、3, 5 共に割切れない */
 		s_print_int ( n );
	}
}

/*
 * fizz_buzz_i_to_n
 */

void fizz_buzz_i_to_n ( int i, int n ) {

  if ( i > n ) {			/* すでに n まで書いた */
	/* なにもする事はない */
  } else {				/* まだやることがある */
	fizz_buzz ( i );		/* とりあえず i の処理 */
	s_print_string ( " " );	/* 隙間 */

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

  }

}

/*
 *	main
 */

int main()
{

  fizz_buzz_i_to_n ( 1, 100 );
  s_print_newline();

  return 0;
}

/*
 *
 */
20110610-01.c の実行結果
C:\usr\c\> 20110610-01
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 Fizz Buzz 16 17 \
    Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 Fizz Buzz 31 \
    32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44 Fizz Buzz \
    46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 Fizz \
    Buzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 \
    Fizz Buzz 76 77 Fizz 79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 \
    89 Fizz Buzz 91 92 Fizz 94 Buzz Fizz 97 98 Fizz Buzz
C:\usr\c\> 

課題 20110610-02

Download : 20110610-02.c ( SJIS 版 )

20110610-02.c
/*
 * 20210610-2-QQQQ.c
 *	文字コードを利用して "Hello, World 「自分の名前」" を表示するプログラム
 */

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

/*
 * 文字コードを利用して "Hello, World 「自分の名前」" を表示するプログラム
 */

int main()
{

	s_print_char ( 0x48 );		/* 'H' */
	s_print_char ( 0x65 );		/* 'e' */
	s_print_char ( 0x6c );		/* 'l' */
	s_print_char ( 0x6c );		/* 'l' */

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

	s_print_char ( 0x6f );		/* 'o' */
	s_print_char ( 0x72 );		/* 'r' */
	s_print_char ( 0x6c );		/* 'l' */
	s_print_char ( 0x64 );		/* 'd' */
	s_print_char ( 0x20 );		/* ' ' */

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

	s_print_newline();
	return 0;
}
20110610-02.c の実行結果
C:\usr\c\> 20110610-02
Hello, World 栗野俊一
C:\usr\c\> 

課題 20110610-03

Download : 20110610-03.c ( SJIS 版 )

20110610-03.c
/*
 * 20110610-3-QQQQ.c
 *	rem function
 */

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

/*
 *	rem : calc ( n mod m )
 */

int rem ( int n, int m ) {


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

}

/*
 *	main
 */

int main()
{

  s_print_string ( "10 mod 4 = " );
  s_print_int ( rem ( 10, 4 ) );
  s_print_newline();

  s_print_string ( "10 mod 3 = " );
  s_print_int ( rem ( 10, 3 ) );
  s_print_newline();

  s_print_string ( "10 mod 2 = " );
  s_print_int ( rem ( 10, 2 ) );
  s_print_newline();

  return 0;
}
20110610-03.c の実行結果
C:\usr\c\> 20110610-03
10 mod 4 = 2
10 mod 3 = 1
10 mod 2 = 0
C:\usr\c\> 

Links

ASCII Code と JIS_X_0201

この表は、実際はASCII Codeではなく、それを包含した、「JIS X 0201」という規格( cf. JIS X 0201)。ASCII Codeでは、文字コードを7 bitで表現し、残りの1 bitはパリティビットとして利用するので、文字コードに対応するのは0x00〜0x7f (16進数表現)だけである。

これは、ASCII Codeが通信用の符号(Infromation Interchange)であり、エラー検出を必要としたからである。また、0x00〜0x1fの範囲に入るのは「文字コード」ではなく、「制御コード」である。改行がCR(Carriage Return)とLF(Line Feed)の二つからなる(4)JIS_X_0201は、後半の0x80〜0xffの範囲に「半角カナ」などが入り、更にバックスラッシュ(「\」)が円マーク(「¥」)に、チルダ(「〜」)が、ダッシュ(「−」)になっている。

JIS, SJIS, EUC そして utf-8(unicode)

コンピュータで、文字を扱うためには、何らかの形で、コーディング(符号化)を行う必要がある。

コンピュータの発達が、アメリカで進んだという理由から、いわゆる、英数記号文字(半角文字)に関しては、一つの文字を1 byteで表現するASCIIコードが標準として、採用され、事実上、これが世界標準となっている。

しかし、漢字などの文字種が多い日本語では、1 byteで表現可能な文字数256では当然の事ながら表現しきれない。そこで、考えられたのが、「JIS Code ( JIS X 0208) :全角文字」だったが、これは、これだけで日本で利用される文字を表現しようとしたために、文字種として、ASCIIと重なっていた(いわゆる、全角文字と半角文字の問題.. )だけでなく、文字コード(の数値)としても重なっていたために、ASCIIと併用する事ができなかった。

そこで、ASCIIとJIS Codeを併用するための様々な試みがあり、その結果がSJIS, UJIS, ISO-2022-JP ( JIS SI/SO )というコード規格の乱立だった。

現在は、日本語文字だけでなく、世界中の文字を一つの文字コード体系で、表現しようとするUnicodeが策定され、利用されるようになってきている。

  1. SJIS (エスジス)とも呼ばれる。
  2. いわゆるSJISは、最初にMicrosoft社が自社OS ( MS-DOS )日本語表示を行うために定めたという経緯があり、その後、このコードが標準として、
  3. Windowsの場合だけ。Unixの場合は、LFのみで、改行を表現し、逆にMacOSでは、CRのみで改行を表すなど、OSによって、「改行」コードは異なる事に注意。