printf関数【C言語講座 #3】

printf関数【C言語講座 #3】

今回は、ブロックインデントに加えてprintf関数を用いた出力方法について勉強していきます。今回の記事から練習問題をつけておくので復習としてコードをたくさん書いてみてください。手を動かして自分で書いてみないと、身についた知識もすぐに忘れてしまうので積極的に取り組んでみましょう。

練習問題の解答例のコードは次回の記事につけておくので解けなかった方はそちらを参照していただければと思います。

前回の復習

ソースコードの中にメモを書けるコメントという機能について学びました。コメントは煩雑な処理をしている部分の補足をするためにつけるのでしたね。ソースコードをコンパイルして実行ファイルを作る際に、コンパイラがコメント部分を無視することを利用してソースコードの一部をコメント化することをコメントアウトというのでした。

また、プログラムを実行する時に最初に呼ばれるmain関数というものについて触れました。プログラムに実行させたい処理はmain関数の中に書いていくのでしたね。

今回の記事では、文とブロック及びインデントについて学んだ後に、出力の方法としてprintf関数を勉強していきます。今回のprintf関数まで勉強すれば、過去に登場したサンプルコードのmain関数に書かれていた処理がほとんど理解できるようになるので、張り切って勉強していきましょう!

文とトークン

最初に文について説明をします。プログラミングにおけるというのは、ソースコード中で『セミコロン(;)』で終わるものや、”{“と”}”で囲まれているもののことを指します。

プログラムの処理を実装する時には文という形で記述する必要があります。

例えば、printf関数を使用する際には後ろにセミコロンが必要になります。他にも、後々の記事で登場するif文やfor文と呼ばれるものも名前の通り文です。文というものを理解するためにif文とfor文の形をサンプルコードとして掲載しておきます。(形を見るためだけに作ったソースコードなのでコンパイルするとコンパイルエラーが出ます)

#include <stdio.h>

int main() {
  /*if文の形*/
  if(time > 12) {
    printf("お腹すいた\n");
  }

  /*for文の形*/
  for(int i = 1; i <= num; i++) {
    printf("羊が%d匹\n", i);
  }
  return 0;
}

5行目から7行目にかけて”{“と”}”で囲まれているのがわかりますね。この5行目から7行目までをif文と言います。if文についてはif文【C言語講座 #9】の記事で登場するので、詳しい話はその時にします。

同様に、10行目から12行目にかけても”{“と”}”で囲まれているのがわかります。この10行目から12行目までをfor文といいます。こちらはif文について勉強した後の記事(for文【C言語講座 #10】)でしっかりと説明をしていくので、ここでは文の形を見るということだけで大丈夫です。

またif文とfor文の”{“と”}”の中にprintf関数が書かれているのがわかります。このprintf関数をみると、”printf(中身は省略);”のように最後にセミコロン”;”がついているのがみて取れます。このように一番最後にセミコロンがついているものも文です。

ちなみにソースコードを分けたときの最小単位をトークンといいます。次のサンプルコードをトークンで分けた場合、コメント部分のようになります。

#include <stdio.h>

int main() {
  printf("hello\n");
  return 0;
}

/*トークンで分割するとこうなります
*int , main , ( , ) , { , printf , ( , "hello\n" , ) , ; , return , 0 , ; , } 
*/

非常に単純なのでトークンについては問題ないでしょう。強いて言うなら半角の空白を入れても問題なくプログラムが動く区切りですね。

とは一番後ろにセミコロン”;”がついているものや、”{“と”}”で囲まれているもののことを指す。

トークンとはプログラムを構成する最小単位のことである。

ブロックとインデント

文について学んだところでブロックという概念についても押さえておきましょう。ブロックというのは、”{“と”}”で囲まれた塊のことを指します。後々の記事で『変数のスコープ』についてお話をする際にブロックという言葉を知らないと混乱するので、頭の片隅に入れておいてもらえると助かります。

ブロックは入れ子構造にすることができます。サンプルコードを載せておくので、”{“と”}”で囲まれた領域の内側に”{“と”}”で囲まれた領域があることを確認しておいてください。

#include <stdio.h>

int main() {
  for(int i = 0; i < 10; i++) {
    printf("%d ", i);
  }
  return 0;
}

上記のサンプルコードをよく見てください。4〜7行の行頭に空白があるのがわかると思います。これはインデントと言って、ブロックが入れ子状になっている時に、コードの見通しを良くするために行うプログラミングの作法のようなものです。

最初に学び始める時からインデントをしっかりとつける癖をつけておくと良いです。面倒な人はエディタの自動補完機能でインデントが自動的に入るようにすると楽ちんです。

『それじゃあインデントを入れる基準って何?空白何個文入れるの?』という疑問が聞こえてきそうなので簡単に補足します。まずインデントを入れるのはブロックの構造を可視化するためです。そのためブロックの定義である”{“と”}”に注目してインデントを入れていきます。上のソースコードを例にみてみると、3行目の最後に”{“がありますよね? なので次の4行目から対応する”}”がある8行目の手前まではインデントを1つ入れます(インデントを入れるときはTabキーを用いて入れるのが一般的です)。ブロックの構造を可視化するために入れているので、ブロックの中にブロックがあるような入れ子構造になっていればその分インデントを増やします。

これは前でも述べた通りお作法のようなものなので、インデントを全く行っていないソースコードでもバグがなければ正常に実行できます。極端な例ですが以下のようなコードもコンパイルして実行すれば正常に動きます。

#include <stdio.h>
int main() { for(int i = 0; i < 10; i++) { printf("%d ", i); } return 0; }

このコードを見てどう思いますか? コンパクトという印象もあるかもしれませんが、『コードが読みにくいな』という印象も感じたはずです。

このような読みにくいコードを書かないためにもインデントを怠らないように気をつけましょう。(言語によってはインデントを文法として強制しているものまであるのでインデントを入れる癖はつけておきましょう)

インデントを入れる際にはTabキーで入れるのが通例です。実際にエディタを開いてTabキーを押してみて下さい。半角空白4個分のスペースが入力された人と、8個分のスペースが入力された人が大半でしょう。Tabキー1回で空白いくつ分かはエディタの設定で変更できるので変更したい人はどうぞ。(自分はTabキー1回で半角空白4個分に設定していますが、半角空白8個分の人もいます。会社や大学などで指定がなければ見やすい方で選べば大丈夫です)

ブロックとは『{』と『}』で囲まれている塊のことを指す。

インデントとはブロックの塊を見やすくするために、行頭に空白を入れることである。インデントを入れる際にはTabキーを用いる。

printf関数

ここからは今回の記事のメインである出力について勉強していきます。実は今までのサンプルコードの中に頻繁に出てきていた『printf』というのが出力に関係しています。printf関数はC言語の方であらかじめ用意された関数で、画面に出力することができます。printf関数の書き方は以下の形が基本形になります。

printf("出力内容をダブルクォーテーションで囲み記述する\n");

『ダブルクォーテーション(“)』で囲まれた部分が画面に出力されます。”\n”は正規表現というもので、『ここで改行を入れて下さい』という合図を表しています。正規表現については他にもいろいろあって奥が深いのですがC言語の基礎を学ぶ段階ではあまり頻繁に出てこないので改行だけ押さえておけば大丈夫でしょう。(ちなみに『バックスラッシュ(\)』は『エンマーク(¥)』と同じなので、改行は”\n”でも”¥n”でも大丈夫です)

それでは実際にprintf関数を用いたソースコードを書いていきましょう。

#include <stdio.h>

int main() {
  printf("Hello!!");
  return 0;
}

実行結果

Hello!!

printf関数を用いて”Hello!!”という文字列を出力しています。ここではあえて”\n”をつけずに書いてみました。

次は先ほどのコードにもう1つprintf関数を書き足してみましょう。

#include <stdio.h>

int main() {
  printf("Hello!!");
  printf("World!!");
  return 0;
}

実行結果

Hello!!World!!

実行結果を見て下さい。2つのprintf関数で出力された文字列が繋がって出力されています。これは1つ目のprintf関数で出力した文字列の最後に改行を入れていないため、2つ目のprintf関数が実行された時に、2つ目のprintf関数の出力が1つ目の出力結果の後ろに続いてしまった状態です。文字列を分けたい時には、改行”\n”を入れることを忘れないように注意して下さいね。

画面に文字列を出力するためには、printf関数を用いる必要があり、基本的な形は以下のようになる。

#include <stdio.h>

int main() {
  printf("画面に出力する文字列を記述する\n");
  return 0;
}

まとめ

今回は前半で文やトークン、ブロックやインデントなどの用語・概念的なものを学びました。後半ではprintf関数を用いた出力を実際にプログラムを書きながら勉強してもらいましたね。今回の記事を簡単におさらいしておきましょう。

  • 文というのはセミコロンで終わっているものや、”{“と”}”で囲まれた塊のことを指す。
  • トークンとはプログラムを構成する最小単位のことを指す。
  • ブロックとは”{“と”}”で囲まれた塊のことを指し、ブロックの対応関係をわかりやすくするために、ソースコードはtabキーを用いてインデントを入れ視覚的にも階層構造を作るのが好ましい。
  • 画面に出力する際はprintf関数を用いる。出力したい文字列をダブルクォーテーションで囲む必要があり、改行や特殊な文字を扱う際には正規表現を使わなければならない。

次回は、型と変数について学んでいきます。練習問題もつけておいたので復習として解いてみて下さいね。

練習問題

A問題

以下のソースコードを変更して、”おやすみ”という文字列を出力してください。

#include <stdio.h>

int main() {
  printf("おはよう\n");
  return 0;
}

B問題

実行結果が以下の出力になるようにソースコードを書いてください。

**********
*good job*
**********

コメントとmain関数【C言語講座#2】

型と変数【C言語講座#4】


最後まで記事を見ていただきありがとうございます。また別の記事でお会いできることを祈っております。

Print Friendly, PDF & Email

C言語カテゴリの最新記事