Download : sample-001.c ( SJIS 版 )
/*
* 2015/05/22 sample-001.c
*/
/*
* "Hello, World" again
*/
#include <stdio.h>
int main ( void ) {
printf ( "Hello, World\n" ); /* "Hello, World" という文字列と改行 ( "\n" ) を表示する */
return 0;
}
$ ./sample-001.exe Hello, World $
Download : sample-002.c ( SJIS 版 )
/*
* 2015/05/22 sample-002.c
*/
/*
* プログラム・ノックアウト (1)
*/
#include <stdio.h>
int main ( void ) {
/* まず、printf をノックアウト */
return 0;
}
$ ./sample-002.exe $
Download : sample-003.c ( SJIS 版 )
/* * 2015/05/22 sample-003.c */ /* * プログラム・ノックアウト (2) */ /* * main 関数もなくしたら ? */ /* ここには何もない */
$ cc -c sample-003.c
$ cc -o sample-003.exe sample-003.o
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 0 が無効なシンボル索引 11 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 1 が無効なシンボル索引 12 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 2 が無効なシンボル索引 2 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 3 が無効なシンボル索引 2 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 4 が無効なシンボル索引 11 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 5 が無効なシンボル索引 13 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 6 が無効なシンボル索引 13 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 7 が無効なシンボル索引 13 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 8 が無効なシンボル索引 12 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 9 が無効なシンボル索引 13 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 10 が無効なシンボル索引 13 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 11 が無効なシンボル索引 13 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 12 が無効なシンボル索引 13 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 13 が無効なシンボル索引 13 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 14 が無効なシンボル索引 13 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 15 が無効なシンボル索引 13 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 16 が無効なシンボル索引 13 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 17 が無効なシンボル索引 13 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 18 が無効なシンボル索引 13 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): \
再配置 19 が無効なシンボル索引 21 を持っています
/usr/bin/ld: \
/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): \
再配置 0 が無効なシンボル索引 2 を持っています
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: \
関数 `_start' 内:
(.text+0x20): `main' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
$
Download : sample-004.c ( SJIS 版 )
/*
* 2015/05/22 sample-004.c
*/
/*
* プログラム・ノックアウト (3)
*/
/*
* #include <stdio.h> // #include を無くした
*/
int main ( void ) {
printf ( "Hello, World\n" ); /* この行で「警告」が出る */
return 0;
}
$ cc -c sample-004.c
sample-004.c: In function ‘main’:
sample-004.c:15:3: warning: incompatible implicit declaration of \
built-in function ‘printf’ [enabled by default]
printf ( "Hello, World\n" ); /* この行で「警告」が出る */
^
$
Download : sample-005.c ( SJIS 版 )
/*
* 2015/05/22 sample-005.c
*/
/*
* プログラム・ノックアウト (4)
*/
/*
* #include <stdio.h> // #include を無くした
*/
int main ( void ) {
/* printf も使わないと、「警告」はなくなった */
return 0;
}
$ ./sample-005.exe $
Download : sample-006.c ( SJIS 版 )
/*
* 2015/05/22 sample-006.c
*/
/*
* プログラム・ノックアウト (5)
*/
void main ( void ) { /* int を void に変更 */
/* return 0; を削って、空っぽにする */
}
/*
最も短い C 言語プログラムの実現
*/
$ ./sample-006.exe $
Download : sample-007.c ( SJIS 版 )
/*
* 2015/05/22 sample-007.c
*/
/*
* プログラム・ノックアウト (6)
*/
/*
* #include の代りに printf の extern 宣言
*/
extern int printf ( const char *message, ... );
/* 「extern void printf ( char *message );」 ではない ?? */
/*
* main
*/
int main ( void ) {
printf ( "Hello, World\n" ); /* 「警告」が消えた */
return 0;
}
$ ./sample-007.exe Hello, World $
Download : sample-008.c ( SJIS 版 )
/*
* 2015/05/22 sample-008.c
*/
#include <stdio.h>
/*
* 文字列を三度表示する : 関数定義の例
*/
void threeTimesPrint ( char *message ) {
printf ( message ); /* 一度目 */
printf ( message ); /* ニ度目 */
printf ( message ); /* 三度目 */
}
/*
* main
*/
int main(void) {
threeTimesPrint ( "Hello\n" ); /* 関数呼出しの例 */
threeTimesPrint ( "こんにちは\n" );
return 0;
}
$ ./sample-008.exe Hello Hello Hello こんにちは こんにちは こんにちは $
Download : sample-009.c ( SJIS 版 )
/*
* 2015/05/22 sample-009.c
*/
#include <stdio.h>
/*
* echo_char ( char ch )
* char ch -- 引数で指定された文字
* 引数で指定された文字を『』付で出力
*/
void echo_char ( char ch ) {
printf ( "『" );
putchar ( ch ); /* 引数で指定された文字を出力する */
printf ( "』" );
}
/*
* main
*/
int main(void) {
printf ( "何か文字を入れてから[Enter]キーを押す : " );
echo_char ( getchar() ); /* getchar() で文字を読込み、それを出力 */
putchar ( '\n' );
return 0;
}
A
$ ./sample-009.exe < sample-009.in 何か文字を入れてから[Enter]キーを押す : A『A』 $
Download : sample-010-01.c ( SJIS 版 )
/*
* 2015/05/22 sample-010-01.c
*/
#include <stdio.h> /* putchar が必要なので.. */
/*
* nprinttail
* n 回数 message を出力するが、行末を変更する。
*/
void nprinttail ( char *tail, char *message ) {
if ( *tail == '\0' ) {
} else {
printf ( message );
if ( *tail == '\n' ) { /* 改行の時のみ */
putchar ( '\n' ); /* 改行する */
} else { /* それ以外は */
/* 何もしない */
}
nprinttail ( tail + 1, message );
}
}
Download : sample-010.c ( SJIS 版 )
/*
* 2015/05/22 sample-010.c
*/
/*
* extern 宣言
*/
extern void println ( char *message );
extern void nprinttail ( char *tail, char *message );
/*
* n 回数の繰返し
*/
int main ( void ) {
println ( "毎回改行「Hello」: " );
nprinttail ( "\n\n\n", "Hello" );
println ( "3 回目, 7 回目だけ改行「Hello」: " );
nprinttail ( "12\n456\n", "Hello" );
return 0;
}
$ ./sample-010.exe $
Download : sample-011.c ( SJIS 版 )
/*
* 2015/05/22 sample-011.c
*/
#include <stdio.h>
/*
* 文字の扱い
*/
int main ( void ) {
printf ( "abc\n" ); /* 「abc(改行)」とでる */
printf ( "abc\n" + 1 ); /* 「bc(改行)」とでる ( 1 を加えると短くなる ) */
putchar ( 'A' ); /* 「A」とでる */
putchar ( '\n' ); /* 「(改行)」とでる */
putchar ( 'A' + 1 ); /* 文字に 1 を加えると ? */
putchar ( '\n' ); /* 「(改行)」とでる */
return 0;
}
$ ./sample-011.exe abc bc A B $
Download : sample-012.c ( SJIS 版 )
/*
* 2015/05/22 sample-012.c
*/
/*
* extern 宣言
*/
extern void printcharln ( char ch );
/*
* 文字の扱い(2)
*/
int main ( void ) {
printcharln ( 'A' + 1 ); /* 'B' になった */
printcharln ( 'B' + 1 ); /* 'C' になる */
printcharln ( 'A' + 1 + 1 ); /* これも 'C' になる */
printcharln ( 'A' + 0 ); /* これはもちろん 'A' */
printcharln ( 'A' + 10 ); /* 'A', 'B', .., 'J', 'K' になるはず */
printcharln ( 'A' + 25 ); /* 'Z' !! */
printcharln ( 'Z' + 1 ); /* ??? */
return 0;
}
$ ./sample-012.exe $
Download : sample-013.c ( SJIS 版 )
/*
* 2015/05/22 sample-013.c
*/
/*
* extern 宣言
*/
extern void nprintcharln ( char *n, char ch );
extern void printcharln ( char ch );
extern void println ( char *string );
/*
* 文字の扱い(3)
*/
int main ( void ) {
println ( "'A' から 10 個 :" );
nprintcharln ( "1234567890", 'A' );
println ( "'U' から 10 個 :" );
nprintcharln ( "1234567890", 'U' );
println ( "'k' から 10 個 :" );
nprintcharln ( "1234567890", 'k' );
println ( "'0' から 10 個 :" );
nprintcharln ( "1234567890", '0' );
println ( "'9' + 1 は.. :" );
printcharln ( '9' + 1 ); /* 残念ながら "10" ではない */
return 0;
}
$ ./sample-013.exe $
Download : sample-014.c ( SJIS 版 )
/*
* 2015/05/22 sample-014.c
*/
/*
* extern 宣言
*/
extern void println ( char *string );
extern void printonedigit ( int n );
extern void printonedigitln ( int n );
/*
* 整数
*/
int main ( void ) {
println ( "整数値 0 の出力" );
printonedigitln ( 0 ); /* 「'0'」 でも 「"0"」 でもなく 「0」 */
println ( "整数値 9 の出力" );
printonedigitln ( 9 ); /* 一桁は OK */
println ( "整数値 11 の出力" );
printonedigitln ( 11 ); /* 上手く行かない */
println ( "整数値 1 + 1 の出力" );
printonedigitln ( 1 + 1 ); /* やっと計算がでてきた */
println ( "整数値 5 - 2 の出力" );
printonedigitln ( 5 - 2 ); /* 引算 */
println ( "整数値 3 * 2 の出力" );
printonedigitln ( 3 * 2 ); /* かけ算 */
println ( "整数値 8 / 3 の出力" );
printonedigitln ( 8 / 3 ); /* 小数点以下は余りは切り捨て */
println ( "整数値 8 % 3 の出力" );
printonedigitln ( 8 % 3 ); /* 余りは「%」をで計算 */
println ( "整数値 8 - ( 8 / 3 ) * 3 の出力" );
printonedigitln ( 8 - ( 8 / 3 ) * 3 ); /* 余りを求めるもう一つの方法 */
return 0;
}
$ ./sample-014.exe $
Download : sample-015.c ( SJIS 版 )
/*
* 2015/05/22 sample-015.c
*/
/*
* extern 宣言
*/
extern void println ( char *string );
extern void printpositiveint ( int n );
extern void printpositiveintln ( int n );
/*
* 整数
*/
int main ( void ) {
println ( "整数値 0 の出力" );
printpositiveintln ( 0 );
println ( "整数値 11 の出力" );
printpositiveintln ( 11 );
println ( "整数値 12345 の出力" );
printpositiveintln ( 12345 );
println ( "整数値 12 * 34 の出力" );
printpositiveintln ( 12 * 34 );
return 0;
}
$ ./sample-015.exe $
Download : sample-016.c ( SJIS 版 )
/*
* 2015/05/22 sample-016.c
*/
#include <stdio.h>
/*
* check_star_char
*/
void check_star_char ( char ch ) {
if ( ch == '*' ) { /* ch の中身が '*' かどうかをチェック */
printf ( "これは「*」です\n" );
} else {
printf ( "これは「*」ではありません\n" );
}
}
/*
* main
*/
int main(void) {
check_star_char ( getchar() ); /* getchar() で文字を読込み、それを出力 */
return 0;
}
A
$ ./sample-016.exe < sample-016.in Aこれは「*」ではありません $
/*
* 20150515-02-QQQQ.c
* 出力する繰返し回数を整数で指定する ntimeprint を作りなさい
*/
#include <stdio.h>
/*
* ntimeprint ( int times, char *message )
*/
void ntimeprint ( int times, char *message ) {
if ( times <= 0 ) { /* 非正なら、回数として不適切か、終わり */
/* times が 負の場合もなにもしない(安全性を考えた予防的プログラミング) */
/* 何もしないくてよい */
} else { /* 繰返し回数が正ならば.. */
printf ( message ); /* 少なくても一度は出力し.. */
ntimeprint ( times - 1, message );
}
}
/*
* main
*/
int main ( void ) {
printf ( "「Hello」を 3 回\n" );
ntimeprint ( 3, "Hello\n" );
printf ( "「ハ」を 30 回\n" );
ntimeprint ( 30, "ハ" );
printf ( "\n" );
return 0;
}
/*
* 20150515-03-QQQQ.c
* 負の整数も処理できる printint を作成しなさい
* ただし、正の整数を出力する printpositiveintsub, printpositiveint を利用してよい
*/
#include <stdio.h>
/*
* printint
*/
void printint ( int n ) {
if ( n < 0 ) { /* 負の時は.. */
/*
** この部分を完成させなさい
*/
putchar ( '-' );
printpositiveint ( n * (-1) ); /* 符号を変更して正にすればよい */
/* 「n * (-1)」 のかわりに「-n」としてもよい */
} else { /* 正の時には.. */
printpositiveint ( n );
}
}
/*
* printintln
*/
void printintln ( int n ) {
printint ( n );
putchar ( '\n' );
}
/*
* main
*/
int main ( void ) {
printf ( "123 の出力\n" );
printintln ( 123 );
printf ( "-123 の出力\n" );
printintln ( -123 );
printf ( "123 + 456 の出力\n" );
printintln ( 123 + 456 );
printf ( "123 - 456 の出力\n" );
printintln ( 123 - 456 );
return 0;
}
#include <stdio.h>
int main(void) {
putchar ( 'A' ); /* putchar 関数は文字を出力する */
printf ( "文字列\n" ); /* printf 関数は文字列を出力 */
return 0;
}
#include <stdio.h>
int main(void) {
/*
"abc" = { 'a', 'b', 'c', '\0' }
長さが 3 の "abc" という文字列は、
'a', 'b', 'c' という三つの文字 + '\0' (文字列の終了: EOS (End Of String)) の
合計四つの文字からなる
更に、
文字列から文字を取り出すには [n] ( n = 0, 1, .. ) をつければよい
*/
putchar ( "abc"[0] ); /* "abc" = { 'a', 'b', 'c', '\0' } の 0 番目で 'a' を表す */
/* 結果的に、この命令で、'a' が出力される */
putchar ( "abc"[2] ); /* 同様に、"abc" = { 'a', 'b', 'c', '\0' } の 2 番目で 'c' \
を表す */
putchar ( '\n' ); /* '\n' は改行一文字扱い */
return 0;
}
#include <stdio.h>
int main(void) {
/*
文字列[0] の代わりに、 *文字列 としてもよい
*/
putchar ( *"abc" ); /* *"abc" = "abc"[0] = 'a' */
/*
文字列 "abc" に 1 を加えると、先頭の文字がなくなって "bc" になる (以前やった)
すると、
*("abc"+2) = *("c") = 'c' = "abc"[2]
*/
putchar ( *("abc"+2) ); /* *("abc"+2) = "abc"[2] = 'c' */
/*
実は、一般論として、
文字列[n] は *(文字列 + n)
が成立
*/
putchar ( '\n' ); /* '\n' は改行一文字扱い */
return 0;
}
#include <stdio.h>
int main(void) {
putchar ( 'A' + 1 ); /* 文字 'A' に 1 を加えると... 文字が一つずれて 'B' になる */
/*
'a' 〜 'y' は 1 を加えると 'b' 〜 'z'
'A' 〜 'Y' は 1 を加えると 'B' 〜 'Z'
'0' 〜 '8' は 1 を加えると '1' 〜 '9
逆に
'b' 〜 'z' は 1 を引くと 'a' 〜 'y'
'B' 〜 'Z' は 1 を引くと 'A' 〜 'Y'
'1' 〜 '9' は 1 を引くと '0' 〜 '8'
同一種類の文字の間では、順番が保証されている
cf. ASCII コード表
残念ながら、
'9' + 1 -> "10" になったり、 'z' + 1 -> 'A'
になったりはしない
*/
putchar ( 'b' + 1 ); /* 文字 'b' に 1 を加えると... 文字が一つずれて 'c' になる */
putchar ( '7' + 1 ); /* 文字 '7' に 1 を加えると... 文字が一つずれて '8' になる */
putchar ( 'z' + 1 ); /* ASCII コード表から、 '{' になる事が分る */
putchar ( '\n' );
return 0;
}
#include <stdio.h>
int main(void) {
putchar ( 'u' - 'a' + 'A' ); /* これは何がでるか ? */
/* 'U' でるだろうと予想できる */
putchar ( 'a' - 'a' + 'A' ); /* これは 'A' がでるだろう... */
putchar ( 'b' - 'a' + 'A' );
/*
'b' - 'a' + 'A'
= ('a' + 1) - 'a' + 'A' (何故なら 'b' = 'a' + 1 )
= ('a' - 'a' + 1 ) + 'A' (多分、交換則や結合則は成立するだろう..)
= (0 + 1 ) + 'A' (多分、'a' - 'a' = 0)
= 1 + 'A'
= 'B'
一般化すると
小文字から 'a' を引いて 'A' を加えると、大文字なる
という規則がみえてくる
*/
putchar ( 'X' - 'A' + 'a' ); /* これは、大文字を小文字にする */
putchar ( '\n' );
return 0;
}
#include <stdio.h>
int main(void) {
putchar ( '0' ); /* '0' */
putchar ( '1' ); /* '1' */
putchar ( '0' + 1 ); /* ASCII 表をみると分るが '1' */
/*
この事から 0 から 9 までの一桁の整「数値」は、
'0' を加えると、それに対応する「数字」の '0' から '9' になる
ので、putchar で出力できる
*/
putchar ( 5 + '0' ); /* 5 + '0' が '5' になるので、5 が表示される */
putchar ( '\n' );
return 0;
}
#include <stdio.h>
int main(void) {
putchar ( 10 + '0' ); /* は... "10" にはならない.. */
/* ASCII 表から ':' になる事がわかる */
/* じゃあ、二桁の数はどうやって出力するか */
/* 例えば 10 は ?
答は '1' (十の位) と '0' (一の位) の二文字だせばよい
10 ÷10 = 1 .. 0
商 余
十の位 一の位
整数で割り算をする場合
/ 割り算 (小数点以下は切り捨て)
% 余りの計算
*/
putchar ( '\n' );
/* 10 の出力 */
putchar ( (10 / 10) + '0' ); /* 10 / 10 = 1 で十の位 */
putchar ( (10 % 10) + '0' ); /* 10 % 10 = 0 で一の位 */
putchar ( '\n' );
/* 53 の出力 */
putchar ( (53 / 10) + '0' ); /* 53 / 10 = 5 で十の位 */
putchar ( (53 % 10) + '0' ); /* 53 % 10 = 3 で一の位 */
putchar ( '\n' );
return 0;
}
/*
p-008.c
二桁の数を出力する print 関数 print2
*/
void print2 ( int X ) { /* 引数が整数なので、int と書く */
putchar ( (X / 10) + '0' ); /* X / 10 で十の位 */
putchar ( (X % 10) + '0' ); /* X % 10 で一の位 */
putchar ( '\n' ); /* おまけで、改行も.. */
}
int main(void) {
print2 ( 10 ); /* 10 が出るはず */
print2 ( 87 ); /* 87 が出るはず */
print2 ( 3 ); /* ?? -> 03 */
print2 ( 123 ); /* ?? -> <3*/
return 0;
}
/*
p-009.c
n桁の数を出力する print 関数 printn
printn ( 123 )
-> 123 を出す
-> 12 を出してから 3 を出す
-> printn ( 12 )
putchar ( '3' );
-> printn ( 123 / 10 )
putchar ( (123 % 10) + '0' );
-> 0 の時は終わりなので、
void printn ( int X ) {
if ( X == 0 ) { == は 等しいを意味する
なにもしない
} else {
printn ( X/10 );
putchar ( X%10 + '0' );
}
}
*/
void printn ( int X ) { /* 引数が整数なので、int と書く */
if ( X == 0 ) { /* X が 0 に等しい時 */
} else {
printn ( X / 10 );
putchar ( X % 10 + '0' );
}
}
void print_positive_number ( int n ) {
if ( n == 0 ) { /* n が 0 の時だけ特別扱い */
putchar ( '0' );
} else { /* 0 以外は、printn にお任せ */
printn ( n );
}
putchar ( '\n' ); /* ついでに改行も.. */
}
int main(void) {
printn ( 10 ); /* 10 が出るはず */
putchar ( '\n' );
printn ( 87 ); /* 87 が出るはず */
putchar ( '\n' );
printn ( 3 );
putchar ( '\n' );
printn ( 123 );
putchar ( '\n' );
printn ( 0 ); /* これは何も出力しない */
print_positive_number ( 0 );
print_positive_number ( 123 );
print_positive_number ( 123456 );
return 0;
}
#include <stdio.h>
extern void printpositiveint ( int n ); /* 他のフィアル定義されている関数を利用するために */
int main ( void ) {
printpositiveint ( 123 );
putchar ( '\n' );
printpositiveint ( -123 );
putchar ( '\n' );
return 0;
}
p-005.c では、小文字を大文字したり、その逆をしたりしている
これは、内容的には「情報処理」だけど、「プログラムでは計算」をしている
「計算の結果として情報処理がされる事」になっている
2015/05/15 の 課題 02
出力する繰返し回数を整数で指定する ntimeprint を作りなさい
ntimeprint ( 3, "Hello\n" );
->
Hello
Hello
Hello
->
Hello
と
Hello
Hello
->
printf ( "Hello\n" );
と
ntimeprint ( 2, "Hello\n" );
->
printf ( "Hello\n" );
ntimeprint ( 3 - 1, "Hello\n" );
->
n が 0 の時なにもしなくてよいので
void ntimeprint ( n, s ) {
if ( n == 0 ) {
} else {
printf ( s );
ntimeprint ( n-1, "Hello\n" );
}
繰返し (同じを事を何度もする)は、再帰で実現する
再帰の場合は、なんかしらが「小くなってなくなる」状況を考える
以前 : 文字列が 1 を加えると、短かくなって最後に空文字列になる
今回 : 自然数は 1 を引くと、小くなって最後に 0 になる
2015/05/15 の 課題 03
printint ( 123 );
-> 123
-> printpositiveint ( 123 )
printint ( -123 );
-> -123
->
putchar ( '-' );
printpositiveint ( 123 )
->
putchar ( '-' );
printpositiveint ( (-1)* (-123) )
[参考]
printpositiveint ( 123 )
-> 123 これは利用してよい
printpositiveint ( -123 )
->
printpositiveintsub ( -123 / 10 ); -> -12
->
printpositiveintsub ( -12 / 10 ); -> -1
->
printpositiveintsub ( -1 / 10 ); -> 0
printonedigit ( -1 % 10 ); -> -1
printonedigit ( -12 % 10 ); -> -2
printonedigit ( -123 % 10 ); -> -3
シェルスクリプト ( shell script )
キーボードから入力するコマンド ( cc -c abc.c ) をファイルに書き込む
# サクラエディタで作成する時は、
漢字コードを SJIS から UTF-8
改行字コードを CRLF(msdos) から LF (unix) に直す
ubuntu で
sh ファイル名
とすると、
ファイルの中に記述された命令が実行できる
シェルスクリプトの引数
sh ファイル名 abc
とすると
ファイル内の $1 が abc に置き換わる。
#
cc -o 20150515-03-9999.exe 20150515-03-9999.o sample-015-01.o \
sample-014-01.o
# cc -c p-$1.c cc -o p-$1.exe p-$1.o ./p-$1.exe
# cc -c p-001.c cc -o p-001.exe p-001.o ./p-001.exe
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20150522-01.c ( SJIS 版 )
/*
* CDATE FILENAME
*
* キーボードから一文字入力し、その文字によって異る国の挨拶をする
*/
#include <stdio.h>
/*
* hello ( char contry )
* char contry : 国を表す一文字
* j : 日本
* e : 英語
* c : 中国
* f : フランス語
* g : ドイツ語
*/
void hello ( char cmd ) {
if ( cmd == 'j' ) { /* 'j' の時は、日本語にする */
printf ( "こんにちは\n" );
} else if ( cmd == 'e' ) { /* 'e' の時は、英語にする */
/*
** この部分を完成させなさい
*/
} else if ( cmd == 'c' ) { /* 'c' の時は、中国語にする */
printf ( "ニイハオ\n" );
} else if ( cmd == 'f' ) { /* 'f' の時は、フランス語にする */
printf ( "Bonjour\n" );
/*
** この部分を完成させなさい
*/
printf ( "Guten tag\n" );
} else { /* どれでもなければ.. */
printf ( "???\n" );
}
}
/*
* main
*/
int main( void )
{
printf ( "国を表す文字を入力してください\n" );
printf ( "\tj\t日本\n" );
printf ( "\te\t英語\n" );
printf ( "\tc\t中国\n" );
printf ( "\tf\tフランス\n" );
printf ( "\tg\tドイツ\n" );
hello ( getchar() ); /* getchar() で文字を入力し、それに対応する結果を出す */
return 0;
}
f
C:\usr\c\> 20140523-01-QQQQ 国を表す文字を入力してください j 日本 e 英語 c 中国 f フランス g ドイツ f Bonjour C:\usr\c\>
Download : 20150522-02.c ( SJIS 版 )
/*
* CDATE FILENAME
*
* キーボードから一行(改行まで..)文字列を読込み、それを逆順に出す
*/
#include <stdio.h>
/*
* reverse ( char contry )
* char cmd : どのメッセージにするかを表す文字
*
*/
void reverse_line ( char ch ) {
if ( ch == '\n' ) { /* 改行ならば.. */
/* なにもしなくてよい */
} else { /* そうでなければ.. */
/*
** この部分を完成させなさい
*/
}
}
/*
* main
*/
int main( void )
{
reverse_line ( getchar() ); /* 最初の文字を読み込んで .. */
putchar ( '\n' ); /* 改行を出力 */
return 0;
}
abc123
C:\usr\c\> 20140523-02-QQQQ abc123 321cba C:\usr\c\>