2016-12-17 6 views
-3

私がしたいことは、無期限に長い番号を取得し、文字列に格納し、次に文字列を配列に格納することです。次に、配列内のすべての数字について、配列内のすべての数字が表示された回数をカウントし、最後にそのカウントを(各桁ごとに)表示する必要があります。スイッチがすべてのケースを読み取っていない

#include <iostream> 
#include<cstring> 
using namespace std; 

int main() 
{ 
    string re; 
    int r; 
    cin>>re; 
    r=re.length(); 

    int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0; 
    char arr[200]; 
    for (int i=0;i<r;i++) 
     { 
      arr[i]=re[i]; 
     } 

    for (int i=0;i<r;i++) 
     { 
      switch(arr[i]){ 
      case '0': 
       a++; 
       break; 
      case '1': 
       b++; 
       break; 
      case '2': 
       c++; 
       break; 
      case '3': 
       d++; 
       break; 
      case '4': 
       e++; 
       break; 
      case '5': 
       f++; 
       break; 
      case '6': 
       g++; 
       break; 
      case '7': 
       h++; 
       break; 
      case '8': 
       i++; 
       break; 
      case '9': 
       j++; 
       break; 

      } 

     } 

    cout<<0<<' '<<a<<endl; 
    cout<<1<<' '<<b<<endl; 
    cout<<2<<' '<<c<<endl; 
    cout<<3<<' '<<d<<endl; 
    cout<<4<<' '<<e<<endl; 
    cout<<5<<' '<<f<<endl; 
    cout<<6<<' '<<g<<endl; 
    cout<<7<<' '<<h<<endl; 
    cout<<8<<' '<<i<<endl; 
    cout<<9<<' '<<j<<endl; 
} 

例えば、私が入力95000991418267990215を与え、場合、私は次のような出力が得られます。

// <digit> <count> 
0 4 
1 3 
2 1  
3 0 
4 1 
5 2 
6 1 
7 1 
8 0 
9 5 

それは、例えば、出力は2 2(桁2回登場)と8 1を与えている必要があります(数字8が一度登場)。私はエラーを見つけることができません。誰でも助けてくれますか?

+0

@πάνταῥεῖそれは正しくありません。彼は文字列として数値を入力するので、 'arr [i]'は整数ではなく文字です。 – Barmar

+0

@πάνταῥεῖ 'arr'は、入力文字列の文字配列です。 OPがなぜ中間配列を使うのか分かりません。 –

+1

10変数のスペースを使用する場合は、意味のない名前で10を使用するだけではありません。 'digits [10]'という明確な名前の配列を使用してください。また、厄介なスイッチやコピー・ペースト印刷は、すべて単純な索引付け+ループに置き換えることができます。 – StoryTeller

答えて

1

はここにあなたの問題です:

あなたが持っている私は、インデックスのようにint型とケースのために増加する変数として私をint型「8」。これは何が起こっているのかを混乱させます。両方のループでループインデックスをzに変更します。

0

無意味な名前について私が言ったことを覚えていますか?

int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0; 
            //^--- i here. 

for (int i=0;i<r;i++) // i being shadowed 

    case '8': 
    i++; // Not the "correct" i being incremented 
    break; 
0

問題は、ループは、ローカル変数を使用することであるIループの前に宣言した同じ名前の変数を隠し

for (int i=0;i<r;i++) 
    ^^^^^^^ 

変数a、b、cなどの代わりに、10個の要素からなる配列を宣言し、それを文字列の数字の数に使用することができます。例えば

int digits[10] = {}; 

for (int i=0;i<r;i++) ++digits[arr[i] -'0']; 
+1

もし別の変数を使うつもりなら、 'count0'、' count1'などもっと意味のある名前を使うことができます。 – Barmar

1

私はここを参照してください問題は、「I」変数の増分にあなたがあなたの入力strnigに番号8に遭遇するたびに持っているということです。

しかし、あなたはまた、ループ

も私はARR []を通じてインクリメントするint型の変数を使用しています
for (int i=0;i<r;i++) 

のためにこれを持っています。

+2

その結果、 '8'の次の数字は数えられません。 – Barmar

0

問題は、変数iが変数のスコープが不一致ことができ、

for (int i=0;i<r;i++) 
    ^^^^^^^ 

だから、case文のためとスイッチの両方で宣言されていることです。

関連する問題