C++の質問2

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
眠い人

C++の質問2

#1

投稿記事 by 眠い人 » 14年前

C++の勉強で前と同じようなものを組んだのですが疑問に思ったことがあるので教えてもらえませんでしょうか?
↓西暦を打ち込んで平成を出すものです。

#include<iostream>
using namespace std;

//平成を求める
//変な数字はすべて 0 にする

int WesternToHeisei (int WESTERN) {
if( 1989 <= WESTERN && WESTERN <= 2010) {
return WESTERN - 1988;
} else {
return 0;
}
}

void Heisei() {
int western;
cout << "西暦を入力してください > " << flush;
cin >> western;

int heisei = WesternToHeisei(western);
if(heisei == 0) {
cout << "その年は平成ではありません" << endl;
} else {
cout << "平成 " << heisei << " 年です。" << endl;
}
}

int main() {
Heisei();
Heisei();
getchar();
getchar();
}

1つはint heisei = WesternToHeisei(western); は
int WesternToHeisei (int WESTERN) { の
WesternToHeiseiの部分を読み込んでいるようですが別の領域のは使えないのにどうしてできるのでしょうか?

2つ目は
int main() {
Heisei();
Heisei();
getchar();
getchar();
}

getchar();
getchar();
の部分ですがgetchar();を2つ書かないと途中で表示が消えるので書いてあるのですが
1つ、又は書かなくてすむようにするにはどうしたらよいでしょうか?

意味不明なことを聞いていたらすみません;



>誤字修正しました; 画像

ゆーずぃ

Re:C++の質問2

#2

投稿記事 by ゆーずぃ » 14年前

1つ目の質問
別の領域に干渉できないのは、大域変数を除いた自スコープ外の変数などです。WesternToHeiseiはmain関数の外に書かれている大域的な関数なので、呼び出しはどこからでも出来ます。これが別のclassのprivateな領域に宣言されていれば別ですが。
また、上手くHeisei内でWesternToHeiseiを呼び出せているのは、WesternToHeiseiがHeiseiの上に書かれているからです。
コンパイラは上から順に翻訳していくので、すでに翻訳済みのWesternToHeiseiはどこからでも使える準備が整っているということです。もしこれが逆であった場合はHeisei内のWesternToHeiseiはまだコンパイラが見つけていないので、不明な識別子としてエラーになります。是非やってみてください。

2つ目の質問

書かなくていい方法はあります。コマンドプロンプトを立ち上げて、そこから実行ファイルのあるディレクトリまで降りて行き、コマンドプロンプトからファイル名.exeを叩けばいいだけです。これなら実行後も消えません。

恐らくそーゆーことではないと思うので解決策を下に。

2回書かなければいけない理由はご存知でしょうか?もし想定外の入力文字数が返ってきた場合、getchar();は2回どころかその文字数分書かなければなりません。
2回書きたくないだけなのであれば
getchar();
getchar();

の代わりに

fflush(stdin);
getchar();

と入れればgetchar();は1回で済みます。ですが、このfflush(stdin)の動作は環境に依存するそうなので、おすすめは出来ません。

While(getchar() != '\n');
getchar();
と書けば想定外の入力数であっても改行まで吐き出してくれるので私はこう書いています。
因みにこれは私が勝手に考えて使っているだけなので、これが正しいのかどうかは知りません。もしかしたら上級者の方には怒られるかもしれませんw

まぁ、fflushにしろwhileにしろバッファのクリアをどうやるかってだけで、結局2行になるのは変わりません。

眠い人

Re:C++の質問2

#3

投稿記事 by 眠い人 » 14年前

ありがとうございます。
これですっきりしました^^
While(getchar() != '\n');
getchar();
を試してみます^^



>ちゃんとできました^^ 画像

閉鎖

“C言語何でも質問掲示板” へ戻る