■ C言語の処理とPythonでの記述 【 C言語 】 | @Kay-nea@のブログ

@Kay-nea@のブログ

アメブロ初心者なのでよく解っていませんが、始めてみました。

(*)FacebookとInstagramはやっていません。


 プログラミング言語を使用すると独立したウインドウで動作する処理をコードで実装することが出来ます。この時に

  ■ コンソールアプリ
  ■ デスクトップアプリ

の2つがありますが、

  ■ ターミナルに表示する物
  ■ GUIを使う物

に分けることが出来ます。Pythonの場合だと通常のコードとturtleに分けることが出来ますが、turtleについてはtkinterのようなウィジェット環境と同じなので、tkinterで行うようにloopを行って表示が継続するようにする必用があります。

 こ牛田処理を実装していないと一瞬でウインドウが閉じてしまうのですが、コンソールアプリで独立したウインドウを表示して実行できるような環境だとturtleやtkinterで発生するような一瞬でウインドウが消えるという現象が発生します。

 GUI環境の場合だと処理の構造としてループを入れましょうという話になりますが、コンソールアプリの場合だと、処理を止めるような記述にする必用があります。

 アプリケーションのテストをする場合だと、この時に入力待ちを入れて止めることになりますが、C言語だと


  #include <stdio.h>

  int main(void){

       char* a;

       scanf("%s",a);

  }


のようにすると、文字が何か入力されてEnterキーが押されるまで処理が止まるので、ウインドウも維持された状態になります。
 

 

 

  C言語の学習

 


 C言語の学習する際には、


  #include <stdio.h>

  int main(void){

       処理

       return 0;

  }


の構造を基本として覚えて、これを


  【 ファイル名.c 】

 
の名前で保存してgccというコンパイラー(Tyney c Compilerを使う場合には別途インストールが必用になります。)を使用することで、コードを実行ファイルにすることが出来ます。この時に


  gcc ファイル名.c -o リネーム後の名前


のようにしてファイルを生成します。この処理はターミナル上で行うので行うのですが、ターミナル上でアプリケーションや事項ファイルを実行する際には


  ■ プログラム名
  ■ ./ファイル名


などで実行しますが、インストールされているアプリケーションを使う場合には、ファイル名だけで実行できます。
 

 

 

  プログラミング言語とテンプレート

 


 C言語では、main関数という関数を作ってその中にコードを書くことで動作させる仕組みになっています。C言語の拡張を行いオブジェクト指向にしたものがC++なので基本的な構造は同じです。JAVAは完全なオブジェクト指向の設計なのでオブジェクト指向の仕組みが最初から途上するので、最初にクラスを作ってからその中にメソッドを実装して処理を実行する仕組みになっています。

 このようような仕様になっているので、C言語では必ずmain関数が必要になります。

 コードの冒頭に

  # include <stdio.h>
 
という記述がありますが、これがmain関数の中で処理を行う際に必用なプログラムのは行ったものになります。ヘッダーファイルはPythonだとモジュールと同じものと考えることが出来るのですが、標準的な入出力を行うためのものがstdioに入っています。

 イメージとしてはPythonの組み込み関数のようなものを使用するのにそれを行うためのツールが必用なので呼び出している状態になります。

 そのため、printfやscanfなどを使う時にこの記述がないとエラーがでます。

 この記述については、pythonのimportと同じなので、外部のヘッダーファイルを参照する際に使用することになります。

 

 

  関数

 


 C言語では、main関数という関数を用意して使用しますが、この時に


  型 関数名(引数){

       処理;
 
       return 戻り値;

  }


の構造にします。C言語の仕様として


  処理の最後には 【 ; 】 を付けるのですが、これが一つの処理の区切りを示すものになります。そのため、


  ■ 変数などの宣言
  ■ 変数への値の代入
  ■ 処理


を行う際には処理の終わりに必ず 【 ; 】 を付与することになります。

 関数の仕組みはPythonの関数と同じなので、数学の


  【 関数の本体 】

    ■ f(x)=変数xの関数


  【 値の代入 】

    ■ f(1)


のようになっていますが、プログラミング言語の関数は関数内の値を外部参照できない仕組み(ブロックスコープが働くのでそのような振る舞いになります。)になっているので、関数内の値を出力する処理を実装する必用があります。

 この時に出力する値のことを 


  【 戻り値(もどりち) 】 


と言いますが、これを参照することで値を使用することが出来ます。C言語の場合はmain関数の仕組みも特殊なので、


  ■ なぜint型なのか?
  ■ なぜ0なのか?


というのがわからない状態でコードを書くことになりますが、最初の段階だと


  ■ 関数の仕組みは数学の合成関数の
    時に使用するものと同じ。

  ■ プログラミング言語の場合、関数
    内の値の外部参照が不可能なので
    戻り値で出力する必用がある

  ■ 数学の関数と同様に値を代入する
    ことで関数内に実装されたアルゴ
    リズムが動く


という仕組みを覚えておくと関数を理解しやすくなります。

 関数の仕組みですが、数学でも


  ■ 関数がなけれが処理ができない。

  ■ 解は実行時の値の入力によって
    成立する

  ■ 実行時に指定されている値を関数
    に当てはめて計算を行い解を求める


という流れになっていますが、プログラミング言語の関数も全く同じです。

 pythoの場合だとdefで指定しますが、


  #▼ 関数部分
  def f(x):

       print(3*x+9)


  #▼ 実行部分
  f(10)


のような形になります。これは一変数関数をf(x)の形で示したものと同じで一次関数を用意して10を代入するようなコードになります。数学だと


  #▼ 関数部分

   f(x) = 3x+9


  #▼ 実行部分

  f(10)
  

になるので、そのまま表現したような状態になります。ただし、この処理を関数内の表示ではなく、戻り値の利用をする場合だと

  #▼ 関数部分
  def f(x):

       s=3*x+9

       return s


  #▼ 実行部分
  z=f(10)

  print(z)


のようになります。プログラミング言語では、関数の実行時に()の中に入る値のことを


  【 引数(ひきすう) 】
  

と言いますが、数学の関数と同じように引数に値を追加して実行すると設定されている関数が実行されて実行部に値が帰ってきます。

 この時の値はそのままでは使用できないので、変数に代入して使用することになりますが、この変数を使用することで関数内で発生した値を使用できるるようになります。

 このように関数を作る際には

  ■ 実行する際に使用する引数
  ■ 処理の結果を出力する戻り値


が必用になるわけですが、戻り値を使用する際には必ずreturnを使用します。

 ただし、先程の数学と同じように戻り値がなくても表示が出来てしまうようなコードも書けるのですが、このような処理だけで完結するようなコードの場合だとreturnの記述を省略できます。

 また、引数がない場合も同様に関数の実行時の引数の記述を省略できるようになっています。
  
 これを踏まえてmain関数を見てみると、returnで0が出力されているので数値であるのが確認できます。

 C言語の関数の型は戻り値の型を指定するので、整数を出力しているのでint型が使用されています。

 そして、関数の名称はコンパイル後に必ず処理が実行されるmain関数になっていますが、引数の名化にvoidという物が入っています。これは 【 型なし 】 を示したものになりますが、引数が存在しないものだとこの状態になります。

 なので、関数を使用する際に引数や戻り値がない場合にも

  void 関数名(void){

       処理;

  }


のような記述をすることが出来ます。main関数自体は


  ■ 戻り値 : int型
  ■ 関数名 : main
  ■ 引 数 : void
  ■ 戻り値 : 0


という構造担っていますが、この部分が定形になっておりこれを使用して処理を考えていくことになります。コードを学習する上では、includeするものが増えることはありますが、多くの場合でこの定形フォーマットが変わることはないので、この形を最初に理解して使っていくことになります。

 

 

  コーディングとファイルの保存

 


 現在のPCはGUIを使ったOS環境なので、サーバOSのようにCUIで動いているものは存在しないと思います。そのため、コードを書く場合もテキストエディタを使ってコードを書いて実行することになりますが、WINDOWS環境の場合だといきなりgccやg++を使用できるわけではありませんから、


  ■ minGW
  ■ Cygwin


などをインストールする必用があります。その後にgccやg++を使えるようにする必用がありますが、Linuxの場合だとbildessencialをインストールするとC++のビルド環境を追加できます。

 C言語については最初からビルドできるようになっていると思いますが、


  gcc -version
  
  man gcc


のようなコマンドを打ち込んで存在しないことが表示された倍にはbuildessencialをインストールすることになります。

 ビルド環境が構築できている場合だと、基本的には


  ■ テキストファイルを作れるソフト
  ■ シェルが使える環境


があればいいので、WINDOWSだと環境構築後であれば、


  ■ メモ帳
  ■ コマンドプロンプト


で実行できます。現在はPowershellもあるので、

  
  ■ Poweshell SE


を使うとコーディングからビルドまでの作業を単体で行えるようになっています。ただし、WINDOWSの場合コンパイラをインストールした後に環境変数を指定する必用があるので、それを行ってから使うことになります。

 それをしなくてもビルド作業やPythonなどを使うことは出来ますが、プログラムの実行時に物凄い文字数のパスの記述が発生するので便宜上、使う前に環境変数の設定を行うことになります。

 Limux環境だとカレントディレクトリ(現在のディレクトリ)を指定しておいて、vimとかnanoとかを使うことが出来るので、


  ターミナルで全ての作業が完結する


ようになっているので、CLIで全てが完結するような構造だとキーボードだけですべてのことを完結させることが出来ます。

 この時にvimを使う場合だとvimでコーディングを行って保存後にターミナルに戻ってビルドを行い、実行ファイル作成後に実行してデバッグを行うことも出来ます。

 Linux環境だとgeditがインストールされている場合だと拡張機能でターミナルを追加できるので


  ■ テキストエディタ
  ■ ターミナル


を1つのソフトで実装できるので、この環境で作業を勧めていくことも出来ます。また、emakesのような有名なエディタもあるので色々な選択肢があります。コードを書く場合の基本は


  ■ テキストエディタ
  ■ ターミナル


になりますが、現在は統合開発環境もあるので、これが1つのツールで行えるようになっていたり、GITが使用できるようになっているので色々と使い勝手のいい物が増えています。

 C言語のコードを書いたらコンパイルできる形にする必用があるので、コンパイラが認識できる拡張子をつけてファイルを保存することになります。C言語の拡張子は 【 .c 】 なので、コードを書いた後に


  ファイル名.c


で保存することになります。
 
 

 

  ソースコードとビルド

 


 そのため、gccというCコンパイラを実行する場合でもgccだけで実行できます。

 ターミナル上で特定のアプリケーションを使用してファイルを開く場合には、

  
  プログラム名 ファイル名


で実行することになります。シェルスクリプトも通常だとその状態になっているので、


  bash ファイル名.sh


で実行しますが、パーミッションの設定の変更をして実行権限を与えると、


  ./ファイル名.sh


で実行できるようになります。これがターミナル上でアプリケーションやファイルを使う時の実行方法になりますが、設定をしていない状態でのシェルコマンドのように通常は


  プログラム名 ファイル名
  

の形で実行するので、gccも例に漏れず静的ライブラリなどを含むような複雑な処理でない場合だと


  gcc ファイル名.c


だけで済みます。この処理を行うと、


  ■ a.out : LinuxやMAC
  ■ a.exe : WINDOWS


のようなファイルが常に出来上がってしまいます。当然、同じファイル名だと上書きされてしまうので、同じ処理をするたびに1つのa.outが上書きされていく使用になっています。

 流石に、その状態だと


  ■ ファイル名で判断できない
  ■ 異なるファイルをビルドできない


ので、異なるファイル名で保存する必用があるので、リネームを行う必用がでてきます。この時に使用するのが 【 -o 】 オプションになります。

 これと使うことで、オプションの後に記述された名前に変更するようになっていますが、シェルコマンドの場合も同様の記述方法をするので、この仕組みを理解しておくと何をしているのか理解しやすくなります。

 この仕組みはffmpegでエンコードをする場合も同様ですが、


  ■ 処理の方法
  ■ 対象物


が存在しており、多くの場合、

 
  処理の方法 → 対象物


の順に記述されています。実際んコードもそうですが、Pythonの変数の指定も


  変数名 = 値


ですし、表示を行うprint関数も


  print(引数)


ですから、処理をする対象物に値を代入したり、処理をする構造物を用意してその中に値を代入する作りになっています。

 そのため、C言語のコードをビルドする場合だと


  gcc ファイル名.c -o ファイル名


の記述でビルドを行うことになります。この時の処理は、


  C言語のコードを書いたファイルがある
  ディレクトリで行う


ことになるので、


  ■ ファイルのパスを指定してから
    実行する

  ■ ディレクトリを移動してから
    実行する


という2つの方法があります。基本的にターミナルを立ち上げるとホームディレクトリが現在位置になるのでカレントディレクトリはホームディクトリということになります。

 

 

  パスの指定を行って実行

 


 この場所に名称をつけたフォルダーを作ってコードを書いたファイルを保存している場合にはそこに移動する必用があります。

 例えば、


  ▼ カレントディレクトリ

  📁 : home
  ┃
  ┗━  📁 : c-lang
      ┃
      ┗━  📒 : test.c

          ▲対象のファイル


のような階層担っている場合、


  gcc c-lang/test.c


で対象を指定できるので、ビルドした実行ファイルのファイル名をtestにリネームする場合だと


  gcc c-lang/test.c -o test


でビルドを行うことが出来ます。すると


  ▼ カレントディレクトリ

  📁 : home
  ┃
  ┗━  📁 : c-lang
      ┃
      ┣━  📒 : test.c
      ┃
      ┗━  📒 : test

          ▲作成されたファイル



のようになります。この時のカレントディレクトリはhomeなので、実行ファイルを実行する場合にもパスを指定する必用があります。実行時にはファイルのあるディレクトリで


  ./ファイル名


で実行することになりますが、相対パスを指定するとどこからでも実行できることになります。この場合、


  c-lang/test


のようにすると階層を指定して実行できるのでコードで実装した内容を実行できます。
 

 

 

  ディレクトリを移動して実行

 


 上記の状態でファイルのある場所に移動する場合だと


  ▼ カレントディレクトリ

  📁 : home
  ┃
  ┗━  📁 : c-lang
      ┃
      ┗━  📒 : test.c

          ▲対象のファイル


の場合、homeからc-langに移動する必用があります。この時にシェルコマンドを使うことになりますが、ディレクトリの移動をするときにはcdコマンドを使用することになります。

 cdコマンドはchange dhirectryの略称ですが、


  cd ディレクトリのパス


で移動できます。この時に


  ■ 1つ上の階層 : ../


で移動することになりますが、DASのようにPC内部のストレージではない物を選択する場合だと絶対パスを使うことになりますが、


  ■ homeディレクトリと同じ
  ■ homeディレクトリよりも上


の階層だと移動する階層分だけ../を追加することになります。それを行うと、ディレクトリの丈夫に移動できるので、そこからファイルの場所を指定することになります。

 今回の事例では、一つ下の階層のc-langに移動するので


  cd c-lang

で移動するとターミナルのプロンプトの表記が変わりディレクトリが下がった状態になります。コマンド実行後は


  📁 : home
  ┃
  ┃   ▼ カレントディレクトリ
  ┗━  📁 : c-lang
      ┃
      ┗━  📒 : test.c

          ▲対象のファイル


になるのでgccを使う場合にもこのディレクトリの中のファイルが対象になります。
 
 この状態でこのディレクトリに何が入ってるのかを見る場合には 【 ls 】 コマンドを使うことになります。

  ls

と入力すると、このディレクトリには作成したtest.cファイルしかないので

  
  test.c


と表記されます。この状態だとカレントディレクトリにC言語のファイルがあるので、


  gcc test.c -o test


のように入力するだけでファイルをビルドすることが出来ます。すると先ほどと同様に

  📁 : home
  ┃
  ┃   ▼ カレントディレクトリ
  ┗━  📁 : c-lang
      ┃
      ┣━  📒 : test.c
      ┃
      ┗━  📒 : test

          ▲作成されたファイル


のようになります。カレントディレクトリがファイルの場所と同じなので、この場合もビルドと同様にパスの指定が不要なので、


  ./test


だけで実行することが出来ます。
 
 

 

  文字の表示を行う


 どのプログラミング言語でも最初に行うのは文字の表示になりますが、C言語の教本でもお馴染みの


  【 Hello,world! 】


の印字が登場します。pythonは対話型を最初に使って


  ■ 文字 
  ■ 数字


の違いを知り、算数や数学で使用する演算方法をどのような記号を使って処理をするのかを学ぶことで計算を試すことになります。

 この時に称するのが算術演算子になりますが、ターミナル上で


  python3


と入力したあとだと使用できる対話型でどのような処理ができるのかを学習することができます。

 文字列を使う際に引用符である


  ■ 【 " 】
  ■ 【 ' 】


を使用することになりますが、対話型でこの指定をすると引用符も残ってしまいます。そこで、これがでないようにするためにprint関数を使用します。

 この時にはじめて


  print('Hello,world!')


を使うことになります。対話型は、

  
  quit()


で終了することが出来るのですが、Linuxだとこの状態でシェルコマンドが使えるようになります。

 Pythonの場合だと、コードを書いて 【 .py 】  の拡張子で保存することになりますが、実行時にファイルのある場所に移動するか相対パスで指定して実行するのは同じです。

 カレントディレクトリにファイルがある状態だと


  python3 ファイル名.py


で実行でき、カレントディレクトリとファイルのあるディレクトリが異なる場合、


  python3 相対パス/ファイル名.py


で実行することが出来ます。対話型でHello,world!を表示するときには、


  print('Hello,world!')


だけで実行できましたが、テキストエディタで記述する場合もこれだけで済みます。ただし文字化け対策として文字コードの指定をする記述をこの前に書く必用がありますが、LinuxやMAC環境だとそのコードは何で実行するものなのかを判断するための記述としてshebangを先頭行に追加しておく必用があります。

 シェルコマンドやCGIで使用するperlについてもshebangの記述が必用ですが、WINDOWS環境のPythonではpythonランチャーがあるので、Python側でバージョンの違いを判断して実行できるようになっています。

 C言語の場合も同様に

 【 表示をする仕組みを実装する 】


ことになるので、その関数を使用することになりますが、この時に使用するのがprintf関数になります。C言語はPythonの組み込み関数のような機能を使う場合でもstdio.hというヘッダーファイルが必用なのでincludeして、main関数がないと動かないので、動かすための枠組みを最初に用意することになります。

 この時にreturn 0まで存在する状態にしておいてから、returnの前の部分に処理を記述することになります。

 どのプログラミング言語でも共通していることとして


  returnの後の記述は実行されない


ので関数の記述をする場合にはreturnの前に処理の記述を行うことになります。

 C言語でHello,world!を表示させたい場合にはmain関数の中に何を追加すればいいのか?というと


  pirntf("Hello,world!");


だけで済みます。そのため、引数を指定して表示をするだけだとそれほど難しい記述にはなりません。コード全体だと


  #include <stdio.h>

  int main(void){

       pirntf("Hello,world!");

       return 0;

  }


のようになります。基本的な構造がわからない状態でこれを見ると困惑しますが、ある程度の仕組みを理解すると何をしているのかを理解しやすくなります。

 これは文字列ですが、数字を扱うことも出来るので、


  #include <stdio.h>

  int main(void){

       pirntf(1234567890);
       pirntf(1+1);
       pirntf("Hello,world!");

       return 0;

  }


のようなことが出来ます。このコードでは引数に決まった値を記述しているので定数になりますが、定数の指定だとC言語でも簡素な記述で対応できるようになっています。

 ただし、変数を使うとPythonのformatメソッドを少し複雑にしたような記述になるので難易度が少し上がります。