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

以下のように、実行するプログラムに引数をつけて渡す場合があります。
# program.exe 123

ping 10.1.1.1なども、pingコマンドに10.1.1.1を引数としてつけますね。
このとき、int main(int argc,const char *argv)を使います。
では、以下のプログラム(arg.c)をコンパイルして実行しましょう。
#include <stdio.h>
int main(int argc,const char *argv)
{
 int count;
 for(count=0;count<argc;count++){
  printf("argv[%d]=%s\n",count,argv[count]);
 }
 return 0;
}
※argc = argument count (コマンドラインからの引数の数)。argv = argument vector 
実行結果は、以下のようになります。

c:\pg>arg.exe I am a boy.
argv[0]=arg.exe
argv[1]=I
argv[2]=am
argv[3]=a
argv[4]=boy.

変数の有効範囲について、実際にプログラムを実行しながら確認しましょう。
変数iを以下のようにfuncという関数とmainという2つの関数で定義しています。
どちらは互いに独立しています。

#include <stdio.h>
void func(int i){
 printf("funcでのi=%d\n",i);
}

int main(){
 int i=0;
 func(5);
 printf("mainでのi=%d\n",i);
 return 0;
}

func関数では、main関数の引数5を受け取っています。
main関数では、定義した int i=0が有効です。
なので、同じiでも、全く別物となります。実行結果は以下です。

c:\pg>pg
funcでのi=5
mainでのi=0

このように{}内で宣言した変数はローカル変数です。
一方、外に出すと、このプログラムで利用できるグローバルになります。

応用情報技術者試験を勉強する成子

どっちがお勧めですか?
ローカル変数です。
関数の先頭または、その変数を使用する直前が分かりやすくていいと思います。

■指定子
・char(文字) ⇒ %c
・int(整数) ⇒ %d
・char *(文字列) ⇒ %s
・double(小数含む値) ⇒ %lf

■変数
変数の宣言する場所ですが、関数の先頭または、その変数を使用する直前が分かりやすくていいと思います。

■コメント
/*  */  複数行のコメントを書く場合、終わりがわかるように*/で終わる
// 1行コメントの場合は、先頭に//をつけるだけ

■代入演算子
a+=1; a=a+1;
a-=1; a=a-1;
http://c-lang.sevendays-study.com/day2.html 表2-5より

■論理演算子
&& →AND (例)a == 0 && b == 0  aが0かつ、bが0ならば
|| → OR (例) a == 0 || a == 1  aが0か1ならば
! →否定  (例)!(a == 0)
http://c-lang.sevendays-study.com/day3.html 表3-2より

■比較
aが3以上 ⇒a>=3
※=は後

■キーボードからの入力
・スキャンエフで、キーボード入力。この場合は、整数値をaに入れる
 scanf("%d",&a);

※&が必要なので、注意。&をつけるのは、メモリ上のアドレスをつけるときも必要でした。
http://sm.seeeko.com/archives/65925709.html
そうです。これは、メモリ上のアドレスを表しているのです。
なぜ&をつけるかという正確な理由は分かりませんが、入力された文字を、aのアドレスの場所に入れるとイメージしてもらえばいいでしょう。&をつけないと、エラーになったと思います。

■int main(void)
・意味は、「型 関数の名前(引数)」です。
・intは整数型。float、doubleは小数も表せる。floatは7桁、doubleは15桁。⇒基本はdoubleを使おう
・void → 引数が無いので、戻り値が無い(returnが無い)。例えば、printfにて表示する。
・returnは戻り値
・return 0 →深い意味はない。intの整数型の場合、正常終了という意味で0を返している。

■インクルードファイル
#include<stdio.h>
.hはヘッダファイルという意味。cプログラムのファイルであれば.c
stdioは、standart input outputの意味

■構造体
structで宣言する
以下のサイトが分かりやすい
http://www.isl.ne.jp/pcsp/beginC/C_Language_14.html

■関数について
名前に関して、大文字と小文字は区別される。
大文字小文字を変えてしまうと、「warning: implicit declaration of function~」として、そんな関数が無いと怒られます。
※変数も、大文字小文字は区別される。
※名前に大文字を使うかどうかなどは、開発方針などで決められていることでしょう。

---------------------プログラム1---------------------------
円の面積を求めるプログラムを作りましょう
----------------------------------------------------------------
■処理
➀半径を入力
②円の面積を出力

■プログラムの構造
➀変数を定義 r:半径 x:面積
②メイン処理 main
 ・半径を入力させる scanf
 ・円の面積を表示する printf
web1 

とりあえず、作ってみました。
#include <stdio.h>  //おまじない
double main(void){ 
 double r; //円の半径。半径は小数かもしれないのでintではなくdoubleに
 double x; //円の面積。3.14を掛けるので小数にするからdoubleに
 printf("半径rを入力してください:"); //文字を出力
 scanf("%lf", &r); //画面から入力させ、その結果をrに入れる。doubleなので%lf
 x=r*3.14; //円の面積を計算する。
 printf("半径%lfの円の面積は%lfです",r,x); //文字を出力
}
いいと思います。
では、コンパイルしてみましょう。
c:\work>gcc -o pg1.exe pg1.c

c:\work>pg1.exe
半径rを入力してください:3
半径3.000000の円の面積は9.420000です
c:\work>
うまく動きましたね。

2行目のmain関数では、なぜ、以下にしたのですか?
double main(void){
応用情報技術者試験を勉強する成子 

rやxがdoubleだからです。




ここの書き方は、以下です。
 [戻り値の型] [関数名]([引数])
 まず、先頭ですが、処理結果の戻り値(または返り値)の型を指定します。今回は、戻り値がありません。なので、doubleにする必要はありません。そして、引数として、このmain関数に渡される値もありません。
いろいろな書き方をすると思いますが、参考までに、Windowsコンパイル環境では以下でした。
main(void){  ⇒エラー
int main(void){  ⇒正常動作
void main(void){  ⇒正常動作
int main(){  ⇒正常動作
void main(){   ⇒正常動作

まあ、2行目がいいと思います。加えて、double xを定義せずにそのまま計算させましょう。その方がシンプルになります。加えて、下から2行目の最後に改行コード「\n」を入れておきました。
#include <stdio.h> 
void main(void){ 
 double r; //円の半径。半径は小数かもしれないのでintではなくdoubleに
 printf("半径rを入力してください:"); //文字を出力
 scanf("%lf", &r); //画面から入力させ、その結果をrに入れる。doubleなので%lf
 printf("半径%lfの円の面積は%lfです\n",r,r*3.14); //文字を出力
}
うまく動きましたね。

--------------------------------
では、違う書き方をしてみましょう。
■プログラムの構造
①変数を定義 r:半径 x:面積
②メイン処理 main
 ・半径を入力させる scanf
 ・円の面積を表示する printf
③関数 Menseki
 ・x=r*3.14で計算する

ここでは、戻り値を理解するために、Mensekiという関数で面積の計算をしてもらいます。
書いてもらったプログラムが以下です。
#include <stdio.h> 
double Menseki(r){
 double x; //円の面積。3.14を掛けるので小数にするからdoubleに
 x=r*3.14; //面積の計算
 return x; //xを戻り値として返す
}
int main(void){
 double r;
 printf("半径rを入力してください:"); //文字を出力
 scanf("%lf", &r); //画面から入力させ、その結果をrに入れる。doubleなので%lf
 double result;
 result=Menseki(r);
 printf("半径%lfの円の面積は%lfです",r,result); //文字を出力
}
コンパイルしてみましょう。
c:\work>gcc -o pg1.exe pg1.c
pg1.c: In function 'Menseki':
pg1.c:3:8: warning: type of 'r' defaults to 'int' [-Wimplicit-int]
 double Menseki(r){
エラーが出ましたね
double Menseki(r)において、rのタイプが定義されていないことが原因です。引数であっても、double rと定義しましょう。
また、小数点以下の表示が不自然なので、小数点以下を指定しましょう。
%.0lfとすることで、小数点以下が0桁。%.2lfとすることで、小数点以下2桁であることを表します。

でき上ったものは以下です。
#include <stdio.h> 
double Menseki(double r){
 double x; //円の面積。3.14を掛けるので小数にするからdoubleに
 x=r*r*3.14; //面積の計算
 return x; //xを戻り値として返す
}
int main(void){
 double r=0.0;
 double result=0.0;
 printf("半径rを入力してください:"); //文字を出力
 scanf("%lf", &r); //画面から入力させ、その結果をrに入れる。doubleなので%lf
 result=Menseki(r);
 printf("半径%.0lfの円の面積は%.2lfです",r,result); //文字を出力。小数点以下を0桁にするため%.0lf、2桁にするから%.2lf
}
実行すると、以下です。小数点以下がきれいになりましたね。
c:\>pg
半径rを入力してください:5
半径5の円の面積は78.50です

↑このページのトップヘ