2017-10-11 6 views
0

私は数多くの学生の性別をチェックし、リストするプログラムを作ろうとしています。 私のコードに何が間違っているのかよく分かりませんが、m変数とl変数を表示するときにはどちらかが本当に巨大です。 これを数時間解決しようとしてきましたが、あなたの助けが大変高く評価されています。C++チャーチェックはひどい値を与えます

P.S私の悪い英語のために申し訳ありません。

#include<iostream> 
#include<string> 
using namespace std; 
main() 
{ 
char gender[20]; 
int jlh,i,j,m,l; 

cin>>jlh; 
system("cls"); 
for(i=0;i<jlh;i++) 
{ cout<<"Data "<<i+1<<endl; 
    cout<<"Enter your gender - "<<endl; 
    cin>>gender[i]; 
} 

m,l=0; 
for(i=0;i<jlh;i++){ 
    if(gender[i]=='p'){ 
     m=m+1; 
    } 
    else if(gender[i]=='l'){ 
     l=l+1; 
    } 
    } 
    cout<<endl<<l<<endl; 
    cout<<m; 
} 
+0

インクリメントを開始する前に 'm'と' l'の値は何ですか? – user463035818

+2

[mcve]についてお読みください。たとえば、mcveは次のようになります。 'int main(){int m; m = m + 1; std :: cout << m; } 'はるかにあなたは本当にここで何が間違っているのか理解する必要はありません – user463035818

+1

また、いくつかの空白を使用するのを恐れてはいけません。 – zenzelezz

答えて

2

あなたが期待するように、ライン

m,l=0; 

は動作しません。 comma operatorを参照して、最初のオペランド(この場合はm)を評価し、結果を破棄し、2番目のオペランドを評価して返します。したがって、lだけがゼロに設定されます。私は、上に示したように

int m=0, l=0; 
for (int i=0; i<jlh; i++) 
    ... 

ように私はまた、彼らが必要とされる場所にiような変数の宣言を移動するだろう、この行に宣言を移動すると、一度に変数を初期化することをお勧めします。すべての宣言を関数の先頭に置く必要はありません。その後

出力endl最初の変数の前と後ではなく秒後

cout<<endl<<l<<endl; 
cout<<m; 

場所。出力の最後の行の後ろにendlがなければなりません。さもなければ、あなたの値の直後にコンソールプロンプトが表示されます。あなたの配列がこのサイズを持っているとして、あなたはまた、20以下の値が入力されていることを確認する必要があります

std::cout << "Number of females: " << m << std::endl; 
std::cout << "Number of males: " << l << std::endl; 

:それはこのような何かを持って読みやすさを改善するだろう。しかし、これが必要なことさえありません(実際のコードにはありますが、MCVEにはないかもしれません)。入力を読み込むときに変数をインクリメントするだけで、配列に格納する必要はありません。これは、この任意の制限を取り除きます。実際に値が必要な場合は、固定サイズの配列の代わりにstd::vectorを使用する必要があります。

+0

プログラムは私がmを変えた後に働いた、l = 0;私はその基本的な間違いで数時間を費やしたとは信じられません。私はあなたのアドバイスに敬意を払います、ありがとうございます:) – Aldo

+0

配列のサイズについて、私は に変更しました cin >> jlh; char gender [jlh]; これも機能しますか? – Aldo

+0

@Aldoおそらく[this post](https://stackoverflow.com/questions/15013077/arrayn-vs-array10-initializing-array-with-variable-vs-real-number)を読むべきです - 可変で配列を定義するlengthはg ++拡張です。可変長配列と同等のものが必要な場合は、[std :: vector](http://www.cplusplus.com/reference/vector/vector/)を見てください(ただし、Karstenは答えで完璧な選択肢を提案しましたが)。 また、あなたの問題を解決した場合、回答を受け入れたものとしてマークするのは丁寧なものです。 – hnefatl

関連する問題