• 検索結果がありません。

C言語基礎 Professor Nishi's Lectures

N/A
N/A
Protected

Academic year: 2018

シェア "C言語基礎 Professor Nishi's Lectures"

Copied!
20
0
0

読み込み中.... (全文を見る)

全文

(1)

応用Cプログラミング演習 ( 第 3

回 )

むかしは西が担当してました.

西

(2)

練習問題です.各自の PC でやってみよう.

できた人ももう一度確認しよう

int の引数 a,b を渡すと, a

2

+b

2

を戻り値

として返す関数と,それを使うメインプログ

ラムを書け

(3)

回答例

#include<stdio.h>

int sq2(int a, int b){

int kekka;

kekka = a*a + b*b;

return kekka;

}

void main(){

int a, b, kekka;

a=3; b=4;

kekka=sq2(a, b);

printf("a^2+b^2=%g\n",kekka);

}

関数部分 関数部分

メイン メイン

(4)

だいじなこと

「変数には有効範囲がある」ということ

今までは main() しかなかったので,変数の

有効範囲を考えなくてよかった → しか

し...

関数を含む複数のブロックからなるプログラ

ムでは変数の有効範囲を意識する必要がある

このことは,「めんどうくさいこと」ではな

くて,とても「便利なこと」であることを学

びます.

(5)

変数には有効範囲がある

#include<stdio.h> int sq2(int a, int b){

int kekka;

kekka = a*a + b*b; return kekka;

}

void main(){

int a, b, kekka; a=3; b=4;

kekka=sq2(a, b);

printf("a^2+b^2=%g\n",kekka); }

この, a,b は,関数 から抜けて main に 戻ったら消えてなく なる.

生きて戻るのは kekka の値 ( 戻り 値 ) だけ

この, a,b は,関数 から抜けて main に 戻ったら消えてなく なる.

生きて戻るのは kekka の値 ( 戻り 値 ) だけ

この, a,b は,引数 として main から, 関数に渡される. この, a,b は,引数 として main から, 関数に渡される.

(6)

こう書いても同じ

#include<stdio.h> int sq2(int x, int y){

int kekka;

kekka = x*x + y*y; return kekka;

}

void main(){

int a, b, kekka; a=3; b=4;

kekka=sq2(a, b);

printf("a^2+b^2=%g\n",kekka); }

a,b のかわりに

x,y が使われて

いる

a,b のかわりに

x,y が使われて

いる

逆に, main の方

で, a,b のかわり

に x,y を使っても

いい

逆に, main の方

で, a,b のかわり

に x,y を使っても

いい

(7)

ところで,こうすると,最後の行がエラー

になる.

#include<stdio.h> int sq2(int x, int y){

int kekka;

kekka = x*x + y*y; return kekka;

}

void main(){

int a, b, kekka; a=3; b=4;

kekka=sq2(a, b);

printf("a^2+b^2=%g\n",kekka); printf("x=%g, y=%g\n",x,y);

} この行はエラー → な

ぜ?

この行はエラー → な ぜ?

変数の有効範囲を過ぎているのに,使おうとしたか

ら !!

変数の有効範囲を過ぎているのに,使おうとしたか

ら !!

(8)

記憶クラス

auto 変数 (自動変数 )

関数やブロック { } 内でのみ有効な変数

static 変数(静的変数)

プログラムが終了するまで有効であり,

保持される

この他にレジスター変数があるがコンパイラーの進歩により,使 う必要がなくなった

(9)

変数の有効範囲は,「めんどうくさい

こと」ではなくて,とても「便利なこ

と」です.

auto 変数は,関数から抜けると有効ではな

くなるので,別の関数や main プログラム内

で悪さをする心配がない.

宣言と同時に初期化すると,その行の度に初期化

される

static 変数はプログラムの最初で定義してお

けば,プログラム全体を通して代入や参照が

できる.

(10)

auto 変数 ( 自動変数 )

実は,今まで勉強してきた変数は全て auto 変

数 ( 自動変数 ) でした.

宣言例

auto int a;

注 ) auto は省略することができる.

特徴

ブロックつまり { } の先頭で宣言される

ブロックが終了すると削除される.つまりブロック内 でのみ有効.

明示的に初期化を行わないと初期値は不定になる.

皆さんは既に知らないうちに auto 変数を使っ

ていたのです !!

(11)

auto 変数の例

#include<stdio.h> int sq2(int x, int y){

int kekka;

kekka = x*x + y*y; return kekka;

}

void main(){

int a, b, kekka; a=3; b=4;

kekka=sq2(a, b);

printf("a^2+b^2=%g\n",kekka); }

a,b,x,y,kekka

全て auto 変数です

a,b,x,y,kekka

全て auto 変数です

(12)

static 変数 ( 静的変数 )

宣言例

static int a;

関数内部で宣言するとき当然ながら static は省略できない

関数の外部で宣言すると自動的に static 宣言として取り扱われ る

特徴

初期化は一度だけ

宣言と同時に初期化しても,初期化されるのは最初の 1 回だ け. 2 回目以後は初期化されず,前の値が保持されている.

static 変数はプログラム全体で値の引渡しに使えるので,一 見便利そうだが,どこで値が変えられるかがわかりづらいの で多用は禁物である.本当に必要なものにだけ使用すること

(13)

static 変数の練習問題

はじめに所持金が 10000 円あるとして, 2 回の支払

いを行う.

最初の支払いに 3000 円,

2 回目の支払いに 5000 円,使ったら,

所持金がどのように減っていくかを表示するプログラ

ムを作れ

所持金は「 static 変数」として,「 mymoney 」と

する.

支払うことを subt(int x) というユーザ定義関数で

処理する

(14)

static 変数の例

#include<stdio.h>

static int mymoney=10000; int subt(int x){

mymoney = mymoney - x; return mymoney;

}

void main(){

int a, b, kekka; a=3000;

printf(" 最初に %d 円持っていました \n",mymoney); kekka=subt(a);

printf("%d 円使ったので所持金の残金は %d 円です. \n",a, kekka); b=5000;

kekka=subt(b);

printf("%d 円使ったので所持金の残金は %d 円です. \n",b, kekka); }

static 変数の mymoney は最 初の一回だけ 10000 に初期化さ れることに注意. 2 回目以後は 直前の値が保持されている

static 変数の mymoney は最 初の一回だけ 10000 に初期化さ れることに注意. 2 回目以後は 直前の値が保持されている

(15)

今日の練習問題

キーボードから整数値 a , b を入力すると,

a

2

+b

2

を表示する処理を 3 回行うプログラムを作

れ.ソースファイル名は「 report1.cpp 」とし,

完成した実行形式ファイル「 report1.exe 」また

は,「 report1 」を提出せよ.

ただし,キーボードから整数値 a , b を取り込んで, a2+b2 を表示する処理をユーザ定義関数とせよ.

それを 3 回繰り返す処理を main() に入れよ.

(16)

まず,枠組みを考えよう

#include<stdio.h> void sqrsum(void){

型宣言 (a,b,c を int で )

「 a の値は?」を表示

キーボードから整数値 a を取り込む

「 b の値は?」を表示

キーボードから整数値 b を取り込む a2+b2 を計算する ( 結果を c に代入 ) a2+b2 を表示する (c を表示 )

return; }

void main(){

型宣言 ( 例えば, int i; ) 3 回繰り返す {

「?回目」を表示 sqrsum();

}

自分の氏名と番号を表示

scanf(“%d”,&i); // 注意,採点の都合上必要 }

#include<stdio.h> void sqrsum(void){

型宣言 (a,b,c を int で )

「 a の値は?」を表示

キーボードから整数値 a を取り込む

「 b の値は?」を表示

キーボードから整数値 b を取り込む a2+b2 を計算する ( 結果を c に代入 ) a2+b2 を表示する (c を表示 )

return; }

void main(){

型宣言 ( 例えば, int i; ) 3 回繰り返す {

「?回目」を表示 sqrsum();

}

自分の氏名と番号を表示

scanf(“%d”,&i); // 注意,採点の都合上必要 }

(17)

キーボードから変数 n に,整数値を読

み込むには?

int n;

scanf(“%d”,&n);

のようにすればよい. 思い出したかな?

なお, main プログラムの最後に,次の 1 文をいれること

scanf("%d",&i); int n;

scanf(“%d”,&n);

のようにすればよい. 思い出したかな?

なお, main プログラムの最後に,次の 1 文をいれること

scanf("%d",&i);

(18)

ファイルの拡張子について

マイコンピュータやエクスプローラーで,

ファイルの拡張子が表示されないことがある

その場合,次の操作で,表示されるようにな

ることがあるので,実施すること.

マイコンピュータの「ツールメニュー」→「フォ

ルダーオプション」→「表示」タブ→下から 3

つ目のチェックボックス「登録されている拡張子

は表示しない」のチェックを外す

これで,すべての拡張子が表示されるようになる

. report1→report1.exe と表示される

(19)

実行結果がこのようになること !!

(20)

#include<stdio.h> void sqrsum(void){

int a,b,c;

printf("a の値は? \n"); scanf("%d",&a);

printf("b の値は? \n"); scanf("%d",&b);

c= a * a + b * b;

printf("a^2+b^2=%d\n",c); return;

}

void main(){ int i;

for(i=0;i<3;i++){

printf("%d 回目 \n",i+1); sqrsum();

}

printf("Report1 0533051 松井秀喜 \n"); scanf("%d",&i);

}

参照

関連したドキュメント

前章 / 節からの流れで、計算可能な関数のもつ性質を抽象的に捉えることから始めよう。話を 単純にするために、以下では次のような型のプログラム を考える。 は部分関数 (

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

【その他の意見】 ・安心して使用できる。

つまり、p 型の語が p 型の語を修飾するという関係になっている。しかし、p 型の語同士の Merge

断するだけではなく︑遺言者の真意を探求すべきものであ

られる。デブリ粒子径に係る係数は,ベースケースでは MAAP 推奨範囲( ~ )の うちおよそ中間となる

自然言語というのは、生得 な文法 があるということです。 生まれつき に、人 に わっている 力を って乳幼児が獲得できる言語だという え です。 語の それ自 も、 から

その太陽黒点の数が 2008 年〜 2009 年にかけて観察されな