第5章 printfを極めようこの章では、前回使用したprintfをさらに掘り下げて
説明します。なぜなら、前回の説明だけでは不充分だからです。
■改行してみよう
| |
|
前回のプログラムは、改行されずに
ok program良いプログラム
と、続けて表示されてしまいました。これでは実用性がありません。
なぜなら、横長の表示は極めて見づらいからです。
そこでここでは、改行する方法を紹介します。
改行を行う方法は、大きく分けて2つあります。
1つは、\nを使う方法、もう一つは、printfを使わない方法です。
|
■\nを使って改行してみよう
| |
|
ここでは、\nを使って改行する方法を紹介します。
\nを使って改行するには、改行したいところで、\nを使用しなければいけません。
なぜなら、\nが改行命令だからです。
\nの使用方法は、実際にサンプルを打ち込んで、作成された実行ファイルを
動かせば理解できます。
/* \nを使って改行を行うサンプルプログラム */
1: #include<stdio.h>
2:
3: void main()
4: {
5: printf("ok program\n");
6: printf("良いプログラム\n");
7: }
|
ちなみに、5行目の所を
printf("ok program\n良いプログラム");
にしても動きます。なぜなら、cには行の概念があまりないからです。しかし、
printf("ok program\n良いプログラム");
のように、プログラムを組んではいけません。なぜなら見づらくなるからです。
後は、ここまでの説明を、理解しているか調べるための問題を、とかなければいけません。
なぜなら、数学と同じで、理解しないで次を読んでいくと、だんだん理解できなくなるからです。
問題は、ここをクリックすると出てきます。
|
■printfを使わないで改行してみよう
| |
|
ここでは、printfを使わないで改行する方法を紹介します。なぜなら、
一定の決まりにしたがって、文字を表示するだけなら、こちらのほうが簡単だからです。
printfを使わないで改行するには、putsを使うと効果的です。なぜなら、
putsは必ず最後に改行をしやがるからです。
putsの使用方法は、実際にサンプルを打ち込んで、作成された実行ファイルを
動かせば理解できます。
#include<stdio.h>
void main()
{
puts("☆☆☆好きなゲームソフトランキング☆☆☆");
puts(" 1位:ニルゲンツ");
puts(" 2位:魔法の少女シルキーリップ");
puts(" 3位:デザイア");
}
|
printfとputsには、大きな違いがあります。なぜなら、
putsには、計算ができないからです。計算については、次の単元を見れば理解できます。
最後に、問題を載せときます。
問題は、ここをクリックすると出てきます。
|
■printfを使って計算をしよう
| |
|
ここでは、printfを使って計算をする方法を紹介します。
なぜなら、printfとputsの違いが、わかるからです。
まず、実際にサンプルを打ち込んで、
作成された実行ファイルを動かさなければ行けません。
なぜなら、その方が理解しやすいからです。
1: #include<stdio.h>
2:
3: void main()
4: {
5: printf("4+8=%d",4+8); /* ここで4+8を計算している */
6: /* puts("4+8=%d",4+8); ←これだと,バグります. */
7: }
|
5行目の、 printf("4+8=%d",4+8); の意味ですが、
大まかに説明すると、 printf("文字列",定数又は、変数)になります。
定数又は変数の意味は、今回は詳しく説明をしません。なぜなら、
ここでの目標は、printfとputsの違いを、明確にするためだからです。
だから今は、定数又は変数の所は、計算をする所と解釈をしてください。
定数又は変数の所で計算をしても、不充分です。なぜなら、計算結果を
表示する命令が存在しないからです。
計算結果を表示する命令は、文字列の中にある%dです。
%dの意味は、計算結果を整数
で表示する命令です。 だから、計算結果を整数で表示させたい時は、
%dを入れなければいけません。
最後に、問題を載せときます。
問題は、ここをクリックすると出てきます。
|
■\を使って、特殊な文字を表示してみよう
| |
|
突然ですが、問題を出します。
この問題は、5分以上考えても答えが浮かばない人は、考えるのをやめて、
答えを見なければいけません。なぜなら、この問題は、まだ習っていない
内容が、含まれているからです。
ではなぜ、習っていない内容の問題を出すのか?その答えは、皆さんに、特殊な文字を
表示するにはどうすればいいか、考えてほしいからです。
問題は、ここをクリックすると出てきます。
では、特殊な文字の表示方法を考えてくれたと思うので、
問題1と問題2の解説を書きます。
なぜなら答えだけを見るよりも、解説を見たほうが、
理解しやすいからです。
問題1の解説に入る前に、注意書きをひとつ書きます。
問題1において、もし
\の表示方法以外の所で、わからない所があれば、
もう一度、この問題を解かなければいけません。
ならならあなたは、このページの内容を理解していないまま、
読み進めている危険性があるからです。
問題1は、\の表示方法で迷ったと思います。
なぜなら\の表示方法は教えていなかったからです。
\を表示するには、\ではなく、\\と書き込まなければいけません。
なぜなら、\は2つで1つの意味を
持つ特殊な記号(この記号のことを、エスケープ シーケンスと
呼ぶます)、そのため、単体で
使われた場合、文法上は合っているが、\の意味がコンパイラに
理解できず、
コンパイラが、\を無視することが多いからです。
だらか、\を表示するには,
\を単体で使うのではなく、\\にしなければいけません。
問題2は、"の表示方法で迷ったと思います。
なぜなら"の表示方法を教えていなかったからです。
"を表示するには、"ではなく、\"と書き込まなくてはいけません。
その理由は2つあります。
1つめの理由は、"の数が奇数だと、コンパイラがエラーを起こすからです。
なぜなら、"は
puts("文字列");
のように、"は文字列の始めと終わりに使用するもの。
そうすると必然的に"は、偶数になるため、
"が奇数だとコンパイラが理解できないからです。
だから、
puts(" " ");
みたいにすると、始めの"は文字列の始まり、
2つ目の"は文字列の終わり、
3つ目の"のは文字列の始まりで………、いつになったら
文字列が終わるか、コンパイラが
理解できなくなるため、エラーがおきてしまうのです。
2つめの理由は、"を表示するには、\"に
しなければいけないからです。
なぜなら、\"にしないと
コンパイラが、"の意味が、文字列の始め、又は終わりなのか、
それとも、"と表示したのか、区別が
つかなくなるからです。
だから、"を表示するには、"ではなく\"にしなければいけません。
|
■エスケープ シーケンスを理解しよう
| |
|
ここでは、エスケープ シーケンス(¥を使い、2つで1つの意味を持つ、
特殊なもの)の種類と使い方を紹介します。
ただし、実用的でないものは、表を使い簡単に紹介します。
なぜなら、実用的でないものまで、詳しく紹介していたら、このページが
縦長になるため、見づらくなるからです。
|
■\a( ビープ音)
| |
|
ビープ音は、とても便利です。なぜなら、入力ミスをしたときなど、
好きなタイミングに警告音を鳴らすことができるからです。
\aの使用方法は、実際に下記のサンプルを打ち込んで、
作成された実行ファイルを動かせば理解できます。
/*---------------------------------------
仮に入力ミスしたと、仮定した場合の処理
---------------------------------------*/
#include<stdio.h>
void main()
{
puts("入力失敗\a");
}
|
|
■\t(水平タブ)
| |
|
\tは便利です。その理由は2つあります。
1つ目の理由は、実行結果をきれいに整えることができること。
2つ目の理由は、""の中で全角や半角の空白を打ち込むよりも、
\tを使った方が、ソースファイルが見やすくなるからです。
\tの使用方法は、実際に下記のサンプルを打ち込んで、
作成された実行ファイルを動かせば理解できます。
#include<stdio.h>
void main()
{
puts("#include<stdio.h");
puts(""); /* 改行 */
puts("void main()");
puts("{");
puts("\tputs(\"入力失敗\\a\");");
puts("}");
}
|
|
■その他のエスケープ シーケンス
| |
|
ここでは、その他のエスケープ シーケンスを、表でまとめておきます。
エスケープ シーケンス
|
表示内容
|
\b |
バックスペース |
| \f |
フォーム フィード |
| \r |
キャリッジ リターン |
| \v |
垂直タブ |
| \’ |
シングル クォーテーション |
| \? |
クェスチョン マーク (文字) |
| \ooo |
8 進表記の ASCII 文字 |
| \xhhh |
16 進表記の ASCII 文字 |
|
■画面を消去(cls)をマスターしよう
| |
|
ここでは、画面を消去(cls)をする方法を紹介します。
はじめに、注意書きを1つ書きます。
今回紹介するプログラムは、環境に依存したプログラムです。
よって、一部の環境では正しく動作しません。
あらかじめ、ご了承ください。
まず、下記に画面を消去するサンプルプログラムを載せときます。
だから、実際にサンプルを打ち込んで、作成された実行ファイルを動かさなければいけません。
なぜなら、その方が理解しやすいからです。
1: #include<stdio.h>
2:
3: void main()
4: {
5: /* ↓この文字は消える */
6: puts("てめぇの存在は、水と、空気と、食料の無駄だ。");
7: /* ↓cls */
8: printf("\x1B[2J");
9: puts("先生、おはようございま〜す。");
10: }
|
上記のプログラムは、6行目にputsを使っているため、
文字列を表示しています。
しかしこの文字列は、瞬間的に消えてしまいます。なぜなら、8行目に
画面を消去しているからです。
そして、9行目にputsを使って文字列を表示しています。だから、画面には
先生、おはようございま〜す
としか、表示されません。
ちなみに、このプログラムは未完成です。なぜなら、マクロを使っていないため、8行目が見づらいからです。
マクロについては、今は疑問に感じていてください。なぜなら、疑問を感じることがcをマスターする近道だからです。
|
■文字の色を変えてみよう
| |
|
ここでは、文字の色を変える方法を紹介します。
はじめに、注意書きを2つ書きます。
今回紹介するプログラムは、環境に依存したプログラムです。よって、一部の環境では正しく動作しません。あらかじめ、ご了承ください。
それと、このプログラムを実行するときは、全体画面にしてから、実行することをお勧めします。
なぜなら、全体画面にした方が、色の違いがはっきりわかるからです。
Windows画面と、全体画面の切替は、、Altキーを押しながら、Enterキーを押せばできます。
まず、下記に画面を消去するサンプルプログラムを載せときます。だから、実際にサンプルを打ち込んで、作成された実行ファイルを動かさなければいけません。なぜなら、その方が理解しやすいからです。
1: #include<stdio.h>
2:
3: void main()
4: {
5: /*│背景色黒に、文字黒だから、
6: ↓なにも表示されない */
7: printf("\x1B[3%dm",0);
8: puts("黒");
9:
10: printf("\x1B[3%dm",1);
11: puts("赤");
12:
13: printf("\x1B[3%dm",2);
14: puts("緑");
15:
16: printf("\x1B[3%dm",3);
17: puts("黄");
18:
19: printf("\x1B[3%dm",4);
20: puts("青");
21:
22: printf("\x1B[3%dm",5);
23: puts("マゼンタ");
24:
25: printf("\x1B[3%dm",6);
26: puts("シアン");
27:
28: /*│最後は、背景色黒、文字白に変更しないと、
29: ↓以降の画面が変わってしまう。 */
30: printf("\x1B[3%dm",7);
31: puts("白");
32: }
|
色を変える方法は、7行目や、10行目を見ていただければわかると思いますが、
色を変える方法は、
printf("\x1B[3%dm",0〜7までの数値);
になります。
この数値の所が、0なら黒、1なら赤、2なら緑、3なら黄、4なら青、
5ならマゼンタ、6ならシアン、7なら白になります。
|
■背景色を変えてみよう
| |
|
ここでは、背景色を変える方法を紹介します。
はじめに、注意書きを2つ書きます。
今回紹介するプログラムは、環境に依存したプログラムです。よって、一部の環境では正しく動作しません。あらかじめ、ご了承ください。
それと、このプログラムを実行するときは、全体画面にしてから、実行することをお勧めします。
なぜなら、全体画面にした方が、色の違いがはっきりわかるからです。
背景色を変える方法は、実際に下記のサンプルを打ち込んで、
作成された実行ファイルを動かせば理解できます。なぜなら、背景色を変える方法は、
文字を変える方法と、たいして違いがないからです。
#include<stdio.h>
void main()
{
printf("\x1B[4%dm",7);
printf(" ");
printf("\x1B[4%dm",6);
printf(" ");
printf("\x1B[4%dm",5);
printf(" ");
printf("\x1B[4%dm",4);
printf(" ");
printf("\x1B[4%dm",3);
printf(" ");
printf("\x1B[4%dm",2);
printf(" ");
printf("\x1B[4%dm",1);
printf(" ");
/*│最後は、背景色黒にしないと、
↓以降の画面が変わってしまう。*/
printf("\x1B[4%dm",0);
printf(" ");
}
|
|
■最後に
| |
|
このほかにも、出力を扱った命令はたくさんあります。なぜなら、
(このことは、最初に書くべきだったのですが)出力はプログラムを組む
うえで、最も重要なことであり、出力されなければ、どんなにす
ばらしいプログラムを組んでも、なにがすごいか理解できないからです。
このことは、どんなに面白いTVゲームソフトでも、テレビの電源を
つけなければ(出力を一切封じた状態では)、面白みが感じられないことで
証明できます。
しかし、この章では、これ以上出力を扱いません。なぜなら、出力ばかりでは、
飽きてしまうからです。
次の章では、入力について紹介します。なぜなら、出力の次に重要なのが入力だ
からです。
|
|