カテゴリー
C

C(Step1-3)

変数を利用した表示

ここまでのプログラムでは、計算式を書いてただ表示するだけでしたが、ここからはより効率的な書き方を学びます。

変数を準備する

何度も同じ値を使う時や、複雑な計算をするときに一時的な値を入れておく箱をイメージしてください。これを用いることで無駄な部分が無くなります。値を記憶する箱のことを変数(variable)と言います。

C言語では、どのように利用するか以下のサンプルで確認しましょう。

#include <stdio.h>

int main(){
    /*変数を用意*/
    int total; //①

    total = (10*8+15*5)*105/100; //②

    /*10000でのお釣り表示*/
    printf("10000: %d\n", 10000-total); //③
    /*5000でのお釣り表示*/
    printf("5000: %d\n", 5000-total);
    /*1000でのお釣り表示*/
    printf("1000: %d\n", 1000-total);

    return(0);
}
sample1-3.1実行結果

①変数を宣言する

ここの部分は、変数宣言と呼ばれる部分で、値を記憶する箱である変数を記述する部分です。以下のように記述します。

変数宣言の記述方法

[変数の種類] [変数の名前];

このプログラムでは、totalというのが「変数の名前」にあたり、作成者が名前をつけます。「変数の種類」は、入れたい値が整数なのか、小数なのか文字なのかを指定するものです。種類のことをまたはデータ型といいます。ここでは、整数値なので、intという整数の型を指定しています。他にも、実数を扱うfloatやdoubleといった型があります。

同じデータ型の変数を複数用意したいときには、それぞれ別の行に記述してもいいですが、カンマで区切って記述することもできます。

■同じデータ型の変数を複数用意する場合

[変数の種類] [変数の名前1], [変数の名前2], [‥‥‥];

このように変数に値を代入する前には変数宣言をしなくてはいけません。

②変数に値を代入

②の部分は、①で宣言した変数に値を入れて記憶させています。「変数名=数値」と書くことで、変数に値を記憶させることができます。これを、変数に値を代入するといいます。「=」は数学では、イコール記号と同じですが、プログラムでは、代入するという意味になります。例えば、以下のように書くとします。

a = 1000;
a = a + 1000;

この場合、最初のaには1000を代入しますが、2行目のaは、変数aに記憶されている1000に1000を足してそれを、左辺のaに代入しなおす形になります。「値に記憶している変数にさらに値を足す」という記述です。よく使われる記述なので、覚えておくと良いでしょう。

③変数を使って計算し、結果を表示する

③の部分は、printf()で、カンマ(,)のあとに「1000-変数名」と記述しています。変数totalには計算した整数値が入っています。変数に入っている値で計算が処理され、%dの位置に結果が表示されます。

データ型の種類と詳細

ここでは、C言語の型についてまとめています。また、printf()での変換仕様と共に表にしています。

型の名称と読み方変数の取り得る値printf()での変換仕様備考
int
(イント)
整数値%d最大(小)値はコンパイラによって異なる
long int
(ロングイント)
整数値%ld最大(小)値はコンパイラによって異なる
float
(フロート)
実数値
(小数を含む)
%f
double
(ダブル)
実数値
(小数を含む)
%lf値の精度はfloatの約2倍
char
(キャラ)
文字%c1文字を記憶できる
short int
(ショートイント)
整数値%dlong int よりも小さい範囲の値を格納できる
unsigned int
(アンサインドイント)
0以上の正の整数%d最大値は、intの約2倍
unsigned long int
(アンサインドロングイント)
0以上の正の整数%ld最大値は、long intの約2倍
変数のデータ型と変換仕様

printf()で数値を表示するときには、桁を揃えて表示することや、整数部何桁+小数部何桁といった表示する桁の調整も可能です。

整数の桁を揃える方法

整数の桁を揃えるときには、何桁を表示するのかあらかじめ決めれます。3桁表示するなら、以下のように記述します。

printf("%3d", 99);

%とdの間に数値が入っていますが、表示する桁数を表しています。3桁の表示をして、99のように2桁以下の数値を出力した場合、左に空白が入ります。指定の桁以上の表示をするときは、右に溢れて表示されるので、注意が必要です。

実数の桁の調整

小数部値を含んだ値ー実数を表示するときは、整数部何桁+小数部何桁と表示する場合があります。例えば、整数3桁+小数2桁と表示したいときは、全体の桁数を小数点を1と数え、1+3+2=6として記述します。

printf("%6.2lf", 32.456);

表示する数値が指定の桁数未満なら、左に空白が入ります。小数部分が指定の桁以上ある場合は、その下の数値は四捨五入して表示されます。桁数以上の表示では、右にあふれてしまいます。

プログラムを実行中に結果を得る

プログラムを実行しているときに、値を入力し、その入力された値を利用する場合があります。そのような処理について説明していきます。

プログラムで値の入力をする

プログラム実行中に値を入力できるようにするには、「変数に値を読み込む」という処理を行います。まずは、整数値を入力し、入力した値を表示するサンプルを実行しましょう。

#include <stdio.h>

int main(){

    /*整数値の読み込み*/
    int num;

    scanf("%d", &num); //整数値を変数numに読み込む
    printf("result[%d]\n", num); //numの値を表示する

    return(0);
}
sample1-3.2実行結果

このプログラムを実行すると、入力待ち状態になり、そこで数値を入力、改行すると、実行結果のように値を表示してくれます。

入力を受ける関数scanf()の詳細

ここでは、scanf()の使い方について説明していきます。

scanf()の使い方
scanf("%○", &変数名,‥‥‥, &変数名);

・%○にはprintf()で利用した変換仕様%dや%fなどをつけて記述する
・変数名を読み込むときは、変数名の先頭に&をつけて記述する

実際のコードを見ながら考えていきましょう。

int num1, num2; //int型の変数num1とnum2を用意
float num3; //float型の変数num3を用意
double num4; //double型の変数num4を用意

scanf("%d %d", &num1, &num2); //①
scanf("%d:%d", &num1, &num2); //②
scanf("%f %lf", &num3, &num4); //③

①の部分は、2つの整数値を読み込む場合の記述です。%dと%dの間に空きを入れて記述しなければなりません。[整数値][空き][整数値]のようにする必要があります。

②の部分も、2つの整数値を読み込む場合の記述です。この記述の場合は、%dと%dの空きを[整数値][:][整数値]としなければなりません。

③の部分は、2つの実数値を読み込む場合の記述です。実数値を扱う%fと%lfを使っており、他同様、間には空きを記述しています。

キャストの利用

色々な計算をする場合に、はじめは整数型で用意していた変数を、ここの計算のときだけ、小数を含んだ計算に利用したいということがあると思います。そんな時に「そのときだけこの値を小数とみなす」とする記述方法があります。以下のような場合です。

total = (int)((double)a * 110 / 100);

上の例では、「(double)a」とすると、変数aを一時的にdouble型で宣言されたものとして扱えます。これをさらに応用して「(int)(式)」という外側の囲みでは、式の計算結果の「値」を整数に変換しています。ただし、実数から整数に変換したときは小数以下は四捨五入されます。

このように「(変数の型)値」とする記述方法をキャスト(cast)といい、複雑な計算をするときに便利です。

カテゴリー
C

C(Step1-2)

プログラムの詳細

前回、実行環境を設定してプログラムを実行させました。ここからより詳細に説明していきます。

C言語の構成と記述規則

まずは、基本的なことから覚えましょう。以下が簡単な規則になります。

  • 基本的には上から下に処理が順番に進む
  • { と }は対応しており、囲まれた部分はひとつの処理のまとまりとなる
  • 処理ひとつひとつは、;{セミコロン}によって区切られる
  • 空白、改行、タブは、関数{命令}の間に好きなだけ入れられる

現段階では、上記を意識してプログラムを書いていきましょう。次にプログラムの内容の意味について考えていきます。

#include <stdio.h> //①

int main() //②
{
  /*表示をする ③*/
    printf("");  //④
    printf("");

    return(0); //⑤
}

①インクルード部

この部分はプログラムの中で使う関数がどのファイルに定義しているかを指定しています。このファイルをヘッダーファイルまたは、インクルードファイルといいます。#includeのあとに<>で囲んだファイル名を記述します。この部分をインクルード部といいます。

<>でファイル名を指定する時は、コンパイラで指定されている場所にあるファイルしか指定できません。ここで使っている「stdio.h」は、「standard input output(標準入出力)」の略で、キーボードからの入力、ディスプレイへの出力を行う関数の定義が書かれているファイルです。そのため、printf()を使って画面に表示させるには必ず必要になります。

②プログラムの処理の開始

main()は、C言語のプログラムに絶対に欠かせません。これは、main(メイン)関数といい、C言語では必ずひとつのmain関数が必要です。処理は関数(function)というまとまりで構成されていますが、main関数はここからプログラムの処理を開始することを表しています。

main()
{
    //処理内容
}

ソースプログラムでmain()の位置は先頭とは限りませんが、実行されるときはここから実行されます。

③コメント部

C言語のプログラムは、/*と*/で囲まれた部分はプログラムの内容とは無関係な「解説の部分」となります。これはコメント部と呼ばれ、プログラムに不可欠な記述ではありません。しかし、あとで自分が見返す時や他人の書いた処理を見たときに分かりやすいように様々な部分の処理の説明に「コメント」を書いておきましょう。日本語で書くことができるので、分かりやすさを常に意識しましょう。

④プログラムの処理内容を記述

main()の中には、{}で囲んでプログラムの処理内容や手順を記述していきます。この例では、printf関数を使って画面へ結果を表示する処理を行っています。

⑤関数の終了

ここは関数の処理の終了をあらわす部分です。C言語では、main関数から他の関数を呼び出し、さらにそれが他の関数を呼び出し…というように処理を記述していきます。ここで、return(x);が出現したら、いまの処理を終了し、「x」という結果を持って、呼び出された関数に戻ります。main()の中にあった場合、プログラムの処理終了を意味し、この記述をreturn文といいます。

printf()の詳細

文字列を画面に表示させる処理には、printf()という関数で実現していました。ここでは、より詳しく把握していきましょう。

Printf()の使い方… printf(“XXXXX”);

  • “XXXXX”には、画面に表示したい文字を記述する
  • 改行をしたい場所に「\n」を記述する
  • “XXXXX”の記述において、「%, \, “, {, }, ;」は特殊な役割がある。これらの文字を表示したいときは、その文字の前に「\」をつけて記述する。

特殊な役割を持つものは以下のように使われます。

  • \ は改行を表す「\n」などで使われる
  • ” は表示する文字列の範囲を表す
  • { } はC言語の処理のまとまりをあらわす
  • ; は処理の終わりをあらわす

これまで「%」については説明していませんでしたが、もう1つの使い方をサンプルを書いて理解しましょう。

以下のコードを書いてみてください。

#include <stdio.h>

int main()
{
    /*2種類の方法で数値の表示をする*/
    printf("1+2=3\n");
    printf("1+2=%d\n", 1+2);

    return(0);
}

このプログラムを実行すると以下のようになります。

サンプル実行結果

プログラムでは、2種類の記述をしていますが、どちらも同じ実行結果になります。ここで「%d」という記述は、「カンマ(,)の後ろに記述した値が、文字列中の%dの位置に整数として入ります」ということを表しています。

補足…C言語では、足し算は「+」、引き算は「-」、掛け算は「*」、割り算は「/」で表せ、()を使い数学と同じように計算式が書けます。

次のサンプルプログラムでは、整数値や小数値を含む様々な結果を得る方法を紹介します。

#include <stdio.h>

int main(){

   /*printfの様々な使いかた*/
   printf("10/3=%d\n", 10/3);//①
   printf("10/3=%f\n", 10.0/3.0);//②
   printf("10/3=%lf\n", 10.0/3.0);//③

   printf("7+1=%3d\n", 7+1);//④
   printf("7*9=%3d\n", 7*9);//⑤
   printf("7/3=%.3f\n", 7.0/3.0);//⑥

   return(0); 
}
サンプル実行結果

①②③は、算数でいう割り算を実行し、その結果を求めています。しかし、①と②、③の値は異なっています。それは各記述に違いがあるからです。違いは以下のようになります。

  1. 文字列中の「%d」の位置に整数(10進数)として画面に表示させる
  2. 文字列中の「%f」の位置に実数として画面に表示させる
  3. 文字列中の「%lf」の位置に精度の高い実数として画面に表示させる

*C言語では、「1,2,3」としたら整数、実数とするなら、「1.0,2.0,3.0」と明示的に記述しなくてはなりません。また、「整数」と「実数」の計算では、「実数」となります。

④⑤⑥は、計算結果を成形して表示しています。「%3d」とした場合、3桁の整数が右揃えで表示されます。「%.3f」とすれば、小数点以下何桁まで表示するか指定できます。

このように%dや%fなどのように%ではじまる記述を変換仕様(convertion    spesification)といいます。これ以外にもありますが、コードを各過程で覚えていきましょう。

カテゴリー
C

C(Step1-1)

C言語の開発環境設定

まず、始めに開発できる環境を整えましょう。Cの開発環境を今回はVisual Studio Codeを使って説明していきます。必要になるソフトは以下の2つです。

  • エディタ(Visual Studio Code)
  • C言語コンパイラ(gcc コンパイラ)

コンパイラのインストール

C言語のコンパイラには様々な種類がありますが、フリーで導入しやすいgccコンパイラをインストールしていきましょう。MinGWというものを使います。

MinGW(ミン・ジー・ダブリュー、Minimalist GNU for Windows)はGNUツールチェーンのWindows移植版である。MinGWはWindows APIのためのヘッダファイルを含んでおり、フリーのコンパイラであるGCCを、Windowsアプリケーションの開発のために利用できる。

ウィキペディア(Wikipedia)

MinGWのダウンロード

まずは、公式のサイトに行きましょう。

http://mingw-w64.org/

以下のような画像のサイトにたどり着くはずです。

MinGWサイト

この画面になったら、画面内の赤丸で囲まれたダウンロードを選択してください。

選択すると、次の画面に移ります。MinGWが入っているパッケージが表示されると思います。自分のOSに合ったパッケージを選択してダウンロードして頂ければ大丈夫です。

パッケージ選択画面

ちなみに私はWindowsなので、「Msys2」のパッケージを選択しました。今回はこの流れで説明していきます。ダウンロードして頂いて画面の指示に沿っていくと、次の画面が立ち上がると思います。

コマンドプロンプトの画面をイメージして頂けると分かりやすいです。もし、立ち上がらない場合は、プログラムメニューから MSYS2 の MSYS Shell を選択しましょう。この画面で、まず以下のコマンドを入力してください。

pacman -Syuu

もし、次のメッセージが出ていたら、画面を再度開いてもう一度実行しましょう。

警告: terminate MSYS2 without returning to shell and check for updates again
警告: for example close your terminal window instead of calling exit

続いて、以下のコマンドを入力しましょう。

pacman -S base-devel
pacman -S mingw-w64-x86_64-toolchain

これは、MinGW-w64 (64bit) の開発環境をインストールするためのコマンドになります。もし、32bitの場合は、次のように変えてください。

pacman -S mingw-w64-i686-toolchain

途中、インストールを続けますか?と表示されるので、Yes or No を入力します。基本的にはYと入力して続けて構いません。

MinGWインストール中画面

最後まで進んだら、以上でコンパイラのインストールは完了になります。

MinGWをコマンドラインから使うための設定

次にMinGWをコマンドプロンプトなどから使うためのPathの設定を行います。Path(パス)というのは、アプリケーションなどの所在をOSに教えるための仕組みになっています。コントロールパネルからシステム情報を確認できるページに飛びましょう。システムの詳細設定を選択すると環境変数(N)…の項目をクリックします。

システムのプロパティ

下のPathを編集して、新しくMinGWをインストールしたフォルダ内のbinフォルダの場所を入力します。

システム環境変数の設定

今までのインストールが成功しているなら、以下のように入力すると、Pathが通るようになります。

MinGWのPath

Pathの確認を行うのであれば、コマンドプロンプトを開き、「gcc -v」と入力してください。以下のようにgccのバージョンが表示されれば成功になります。

コマンドプロンプト「gcc -v」の実行

Visual Studio Codeの設定

拡張機能を利用してC言語を導入していきましょう。

Cの機能拡張

まずは、C言語の関数など予測して表示してくれるサポートとして「C/C++」の機能拡張を導入しましょう。VsCodeを起動して次の拡張ボタンをクリックします。

C/C++導入

検索欄から「C/C++」と検索し、インストールしましょう。続いて「Code Runner」をインストールします。C言語のプログラムはそのまま実行することはできないので、コンパイルが必要になります。この面倒な作業を簡単にしてコンパイルと実行を同時にやってくれる機能になります。

同様に、検索してインストールしましょう。

Code Runner導入

インストールが完了したら、拡張機能の設定を行います。

表示された中から「Executor Map」という項目を探し出し、settings.jsonで編集の部分を選択します。

開いたら、”code-runner.executorMap”: { 以下の項目を探します。下の赤線で引かれているように文字列「gcc」の後に「-fexec-charset=CP932」という文字列を追加しましょう。それが終わったら、settings.jsonファイルを上書き保存し閉じます。

Executor Map」の項目と同じように、設定ウインドウを下にスクロールして「Run In Terminal 」という項目を見つけてください。初期状態では項目にチェックが入っていないので、クリックしてチェックを入れてください。

Code Runnerの設定は以上になります。

これで2つの設定が完了したので、C言語ファイルを作って動作を確認してみましょう。新しく「.c」ファイルを作成し、以下のプログラムを書いてみてください。

/* 画面に何か表示するプログラム*/
#include <stdio.h>
int main(void)
{
    printf("Hello World!!\n");
    return 0;
}

そして、VsCodeの右上にある再生ボタンを押して実行します。

そうすると、画面下のターミナルに以下のように出力されます。

次からはCのプログラムを本格的に書いていきましょう。