カテゴリ:13.実際にやってみる > 13.1 C言語

■メモリのアドレスを表記   
#include<stdio.h>
int main(){
 int a=10; //整数aを定義してaに10を代入
 printf("a=%d\n",a); //aの値を表示
 printf("aのアドレス=%p\n",&a); //aのメモリ上のアドレスを表示
}

実行結果は以下です。
c:\work>pg4
a=10
aのアドレス=0028FF2C

http://sc.seeeko.com/archives/5377814.html

まず、言葉の定義から
・引数:関数に渡す値
・戻り値:関数の処理をした結果、呼び出し元に返す値
・関数(function):サブプログラムとでもいうのでしょうか。値を渡され、その演算をして結果を返す。

たとえば、2つの値、xとyがあって(←xとyが引数)、
それを、hikakuという関数で、大きい値を求めます(←この値が戻り値)


関数の書き方は、以下です。

戻り値の型 関数名(引数)

(例1)一般的な場合(戻り値がある)
  int fact(int n)
  引数:nというint型の値
  戻り値:関数factによる演算結果で、int型
  関数:factという処理。内容は、そのあとの{}で囲まれた中に記載される。

returnで戻り値を返す

 

(例2)戻り値が無い場合
  voidを使う
voidは戻り値が無いという意味です。(returnを使わない、またはreturn 10などと戻り値を入れず、returnのみと記載)。例えば、printfにて表示する。

 

(例3)main関数

void main(){
 メイン関数。
 

■プロトタイプ宣言
いろいろな処理をする関数を書き、最後にmain関数を書きます。先にmain関数を書いて、後ろにその他の関数を書く場合、関数の型だけを先に宣言しておく必要があります。それをプロトタイプ宣言といいます。

■参考としたサイト
http://www.sejuku.net/blog/4791#_C


■Cの環境
WindowsでCのコンパイル環境(gcc)が欲しいので、以下に従う
http://yohshiy.blog.fc2.com/blog-entry-292.html

MinGW のダウンロード
https://sourceforge.net/projects/mingw/?source=typ_redirect

欲しいのはCのコンパイル環境だけなので
mingw32-base
mingw32-gcc-g++
を選択してInstllationタブからApply Chagesから「apply」
格安SIMからのテザリングのせいか、結構時間がかかる

PATHの設定をします。システム環境変数のPATHのところを編集して、最後に「;C:\MinGW\bin」を追記

これで完成。再起動は必要なかった。

コマンドプロンプト(cmd)を起動して
gcc -o test test.c
コンパイル。※テキストでtest.cというファイルを作り、上記コマンドを実行するとtest.exeという実行ファイルが完成する
※文字化けするときは、メモ帳ではなくなんらかのエディタで文字コードを「Shift-JIS」で保存すると治る可能性がある。

■Cの環境2 Linuxを入れる
VMware Workstation player(=VMware player)をダウンロード
http://www.vmware.com/jp/products/player/playerpro-evaluation.html

Windows64bit版をダウンロードし、インストール
インストールするとき、○○がなんちゃらと出たが、入れなかった。

CentOSのダウンロード
http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1611.iso

4Gもあるから重たい。軽くできるソフトもあるようだが、不用意にソフトを入れたくないので、入れなかった。

上記の中で理研のサイトから取得しょうとしたが、重すぎて、途中で中断。
http://ftp.riken.jp/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1611.iso


■ドットインストール C言語入門
http://dotinstall.com/lessons/basic_c
とてもわかりやすいVTR。


OSのコマンドを実行するプログラム。以下では、system関数を使って、pwdとdirを実行させています。
Linuxで動作させています。

https://www.ipa.go.jp/security/awareness/vendor/programmingv1/b06_04_main.html を参照

■プログラム pg.c
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char * argv[])
{
 system(pwd;dir);
}
※argc = argument count (コマンドラインからの引数の数)。argv = argument vector 

コンパイル
#gcc -o pg pg.c
 ※pg.exeとしても結果は同じで、exeファイルが作成される。

■実行および実行結果
#./pg.exe
/home   ←pwdの実行結果
pg.c pg.exe  ←dirの実行結果

Windowsの場合は” ”で囲いましょう
#include <stdio.h>
#include <stdlib.h>

int main()
{
 system("dir");
}

Windows環境にて、IPアドレスを入力してもらい、そのIPアドレスpingを打つプログラム
#include <stdio.h>
#include <stdlib.h>
int main(){
 char sbuff[512];
 char command[1024];
 printf("アドレスを入力してください");
 gets(sbuff);
 // コマンドを合成する
 sprintf(command,"ping %s",sbuff);
 // コマンドを実行する
 system(command);
 return 0;
}

3項演算子とは、以下のように書くことで、スッキリとしたプログラムになります。

条件式 ? 式1 : 式2

条件式の結果がYesならが式1を返し、Noなら式2を返します。

たとえば、以下です。これは、aの方が大きければa、bの方が大きければbになります。
a >= b ? a : b

では、以下のプログラムを書いてみましょう。
---------------------プログラム2---------------------------
aとbの大きい数字を表示するプログラムを作りましょう
----------------------------------------------------------------
➀aとbを入力させます。
②aとbで、大きな値を出力します。
応用情報技術者試験を勉強する成子 

書いてみましたが、自信はありません。




#include<stdio.h>
int main(){
 int a;
 int b;
 printf("aを入力してください:");
 scanf("%d",&a);
 printf("bを入力してください:");
 scanf("%d",&b);
 a >= b ? a:b;
}
さて、結果はどうでしょうか。
c:\work>gcc -o pg3 pg3.c

c:\work>pg3.exe
aを入力してください:5
bを入力してください:4

c:\work>
結果が表示されません。結果を表示するようになっていなからです。以下のようにしましょう。また、intでaとbをまとめています。 int main(int a,int b){ としてもいいです。
#include<stdio.h>
int main(){
 int a,b;
 printf("aを入力してください:");
 scanf("%d",&a);
 printf("bを入力してください:");
 scanf("%d",&b);
 a >= b ? printf("%d\n",a):printf("%d\n",b);
}
今度はうまくいきました。
c:\work>pg3.exe
aを入力してください:5
bを入力してください:4
5

または、関数に引き渡すことも可能です。書いてみませんか?
顔カット3 

書きました。動きましたよ。
main関数からHikakuというaとbを比較する関数を呼びます。
結果をresultに入れて、それを表示します。
#include<stdio.h>
int Hikaku(int a,int b){
 return (a>=b)? a:b;
}
 
int main(int a,int b){
 printf("aを入力してください:");
 scanf("%d",&a);
 printf("bを入力してください:");
 scanf("%d",&b);
 int result;
 result=Hikaku(a,b);
 printf("%d\n",result);
}
ただ、Hikaku関数のa,bとmain関数のa,bは別物です。その関数の中でのみ変数が有効だからです。
よって、分かりやすいように、違う文字にした方がいいでしょう。
少し整形をした完成版がこちら。
#include<stdio.h>
int Hikaku(int x,int y){
 return (x>=y)? x:y;
}
 
int main(){
 int a=0;
 int b=0;
 int result;
 printf("aを入力してください:");
 scanf("%d",&a);
 printf("bを入力してください:");
 scanf("%d",&b);
 result=Hikaku(a,b);
 printf("大きい数字は%d\n",result);
}

↑このページのトップヘ