応用Cプログラミング演習 ( 第 3
回 )
むかしは西が担当してました.
西
練習問題です.各自の PC でやってみよう.
できた人ももう一度確認しよう
int の引数 a,b を渡すと, a
2+b
2を戻り値
として返す関数と,それを使うメインプログ
ラムを書け
回答例
#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);
}
関数部分 関数部分
メイン メイン
だいじなこと
「変数には有効範囲がある」ということ
今までは main() しかなかったので,変数の
有効範囲を考えなくてよかった → しか
し...
関数を含む複数のブロックからなるプログラ
ムでは変数の有効範囲を意識する必要がある
このことは,「めんどうくさいこと」ではな
くて,とても「便利なこと」であることを学
びます.
変数には有効範囲がある
#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 から, 関数に渡される.
こう書いても同じ
#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 を使っても
いい
ところで,こうすると,最後の行がエラー
になる.
#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);
} この行はエラー → な
ぜ?
この行はエラー → な ぜ?
変数の有効範囲を過ぎているのに,使おうとしたか
ら !!
変数の有効範囲を過ぎているのに,使おうとしたか
ら !!
記憶クラス
auto 変数 (自動変数 )
関数やブロック { } 内でのみ有効な変数
static 変数(静的変数)
プログラムが終了するまで有効であり,
保持される
この他にレジスター変数があるがコンパイラーの進歩により,使 う必要がなくなった
変数の有効範囲は,「めんどうくさい
こと」ではなくて,とても「便利なこ
と」です.
auto 変数は,関数から抜けると有効ではな
くなるので,別の関数や main プログラム内
で悪さをする心配がない.
宣言と同時に初期化すると,その行の度に初期化
される
static 変数はプログラムの最初で定義してお
けば,プログラム全体を通して代入や参照が
できる.
auto 変数 ( 自動変数 )
実は,今まで勉強してきた変数は全て auto 変
数 ( 自動変数 ) でした.
宣言例
auto int a;
注 ) auto は省略することができる.
特徴
ブロックつまり { } の先頭で宣言される
ブロックが終了すると削除される.つまりブロック内 でのみ有効.
明示的に初期化を行わないと初期値は不定になる.
皆さんは既に知らないうちに auto 変数を使っ
ていたのです !!
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 変数です
static 変数 ( 静的変数 )
宣言例
static int a;
関数内部で宣言するとき当然ながら static は省略できない
関数の外部で宣言すると自動的に static 宣言として取り扱われ る
特徴
初期化は一度だけ
宣言と同時に初期化しても,初期化されるのは最初の 1 回だ け. 2 回目以後は初期化されず,前の値が保持されている.
static 変数はプログラム全体で値の引渡しに使えるので,一 見便利そうだが,どこで値が変えられるかがわかりづらいの で多用は禁物である.本当に必要なものにだけ使用すること
static 変数の練習問題
はじめに所持金が 10000 円あるとして, 2 回の支払
いを行う.
最初の支払いに 3000 円,
2 回目の支払いに 5000 円,使ったら,
所持金がどのように減っていくかを表示するプログラ
ムを作れ
所持金は「 static 変数」として,「 mymoney 」と
する.
支払うことを subt(int x) というユーザ定義関数で
処理する
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 回目以後は 直前の値が保持されている
今日の練習問題
キーボードから整数値 a , b を入力すると,
a
2+b
2を表示する処理を 3 回行うプログラムを作
れ.ソースファイル名は「 report1.cpp 」とし,
完成した実行形式ファイル「 report1.exe 」また
は,「 report1 」を提出せよ.
ただし,キーボードから整数値 a , b を取り込んで, a2+b2 を表示する処理をユーザ定義関数とせよ.
それを 3 回繰り返す処理を main() に入れよ.
まず,枠組みを考えよう
#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); // 注意,採点の都合上必要 }
キーボードから変数 n に,整数値を読
み込むには?
int n;
scanf(“%d”,&n);
のようにすればよい. 思い出したかな?
なお, main プログラムの最後に,次の 1 文をいれること
.
scanf("%d",&i); int n;
scanf(“%d”,&n);
のようにすればよい. 思い出したかな?
なお, main プログラムの最後に,次の 1 文をいれること
.
scanf("%d",&i);
ファイルの拡張子について
マイコンピュータやエクスプローラーで,
ファイルの拡張子が表示されないことがある
.
その場合,次の操作で,表示されるようにな
ることがあるので,実施すること.
マイコンピュータの「ツールメニュー」→「フォ
ルダーオプション」→「表示」タブ→下から 3
つ目のチェックボックス「登録されている拡張子
は表示しない」のチェックを外す
これで,すべての拡張子が表示されるようになる
. report1→report1.exe と表示される
実行結果がこのようになること !!
#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);
}