2016-12-10 7 views
1

この質問に何百万回も質問がありましたが、実際に私のケースを助ける答えが見つからなかっただけで解決策が見えません。Cのforループの先頭に戻る

私は、整数を取り、その中に各数字が何回出現するかを数え、同じ情報を二度も表示しないプログラムを作るという仕事を与えられました。私たちは配列を使って作業しているので、配列を使ってやる必要がありました。私のコードがC言語の知識が不足しているために乱雑です。私は思考プロセスを説明し、コードを与えようとします。

数字を入力した後、数字を10で割って配列に入れた後(配列が逆になっているので)、逆の配列を反転させて見栄えを良くしました。必須ではありません)。その後、私はループのためにたくさんの嫌なことがあります。最初の要素とすべての要素を再び比較しながら配列全体をループしようとするので、配列の各要素に対して、配列の各要素と再び比較します。私はまた、各チェックの後に新しい配列にチェックされた要素を追加するので、要素が前に比較されているかどうかを最初に確認することができるので、すべてをやり直す必要はありませんが、それは私の問題です。私は継続または後藤で操作のトンを試したが、私は解決策を見つけることができません。だから私はちょうど** EDIT:return 0 **を使用して、私のアイデアが最初からうまくいっているかどうかを確認しました。私にとっては、forループの先頭に戻るという知識が不足しているようです。お願い助けて?

//戻り値0の場合、プログラムはすでにチェックされているので、数字1をチェックしようとすると完全に停止します。私はそれが他のものをチェックし続けたいが、パットの多くのバージョンでは、それは仕事をしていない。 //

///コードを見栄え良くしようとしました。 ///私は何が必要だと思う

#include <stdio.h> 


#define MAX 100 

int main() 
{ 
int a[MAX]; 
int b[MAX]; 
int c[MAX]; 
int n; 
int i; 
int j; 
int k; 
int counter1; 
int counter2; 


printf("Enter a whole number: "); 
scanf("%i",&n); 
while (1) 
{ 
    for (i=0,counter1=0;n>10;i++) 
    { 
     a[i] = n%10; 
     n=n/10; 
     counter1+=1; 
     if (n<10) 
     a[counter1] = n; 
    } 
    break;  
} 


printf("\nNumber o elements in the array: %i", counter1); 
printf("\nElements of the array a:"); 
for (i=0;i<=counter1;i++) 
{ 
    printf("%i ",a[i]); 
} 


printf("\nElements of the array b:"); 
for (i=counter1,j=0;i>=0;i--,j++) 
{ 
    b[j] = a[i]; 
} 
for (i=0;i<=counter1;i++) 
{ 
    printf("%i ",b[i]); 
} 

for (i=0;i<=counter1;i++) 
{ 
    for(k=0;k<=counter1;k++) 
    { 
     if(b[i]==c[k]) 
     { 
     return 0; 
     } 
    } 
    for(j=0,counter2=0; j<=counter1;j++) 
    { 
     if (b[j] == b[i]) 
     { 
     counter2+=1; 
     } 
    } 
    printf("\nThe number %i appears %i time(s)", b[i], counter2); 
    c[i]=b[i]; 
} 
} 
+2

なぜながら、(1)とブレーク。彼らは基本的にちょうどお互いをキャンセルします。それは何もしていない余分なコードです。 –

+0

あなたの答えは本当に私の質問に合っておらず、どんな場合でも役に立ちません... – dragoljub

+0

これは答えのコメントではありません –

答えて

0

は0ではなく

for (i=0;i<=counter1;i++) { 
    for(k=0;k<=counter1;k++) { 
    if(b[i]==c[k]) { 
     continue; /* formerly return 0; */ 
    } 

    for(j=0,counter2=0; j<=counter1;j++) 
     if (b[j] == b[i]){ 
      counter2+=1; 
     } 
    } 
1

リターンの「継続」された当面の作業は非常に簡単で、確かに聞かせて、複雑な構造を必要としません。単独でgoto

数字を配列に配置することをお勧めしますが、counterをあまりに早くインクリメントします。 (Cでの配列はインデックス0で始まることに注意してください)それでは、これを修正しましょう:

int n = 1144526;  // example number, assumed to be positive 

int digits[12];   // array of digits 
int ndigit = 0; 

while (n) { 
    digits[ndigit++] = n % 10; 
    n /= 10; 
} 

++その値を使用した後ndigitを増加します、それを使用して、角かっこ内の配列インデックスはCで非常に一般的であるようndigit後。 。)

私たちは数字を数えたいので、本当に配列を逆にする必要はありません。今、我々はすべての数字を数えたいと思う。最初に見たときにすべての数字を数えることで、これを行うことができます。 337223では最初にすべての3を数え、次に7つすべてを、その後2つすべてを数えますが、それはすぐに複雑になります。

int i, d; 

for (d = 0; d < 10; d++) { 
    int count = 0; 

    for (i = 0; i < ndigit; i++) { 
     if (digit[i] == d) count++; 
    } 

    if (count) printf("%d occurs %d times.\n", d, count); 
} 

外側のループはすべて10桁を超えています。内部ループは、数字配列内のすべての出現をdと数えます。カウントが正の場合は、書き出します。

あなたがそれについて考えるなら、あなたはより良くすることができます。数字には0〜9の値しか指定できません。私たちは、各桁のためにカウントの配列を維持し、一度桁の配列を渡し、あなたが行くように数字を数えることができます。

int count[10] = {0}; 

for (i = 0; i < ndigit; i++) { 
    count[digit[i]]++; 
} 

for (i = 0; i < 10; i++) { 
    if (count[i]) printf("%d occurs %d times.\n", i, count[i]); 
} 

は(= {0}が明示的にゼロにcountの最初の要素と残りの要素を設定することを忘れないでください暗黙のうちに、10個の0の配列から始めるようにしてください)。

これについて考えると、配列digitも必要ありません。

int count[10] = {0}; 

while (n) { 
    count[n % 10]++; 
    n /= 10; 
} 

for (i = 0; i < 10; i++) { 
    if (count[i]) printf("%d occurs %d times.\n", i, count[i]); 
} 

最後に、アドバイスの言葉を:あなたはすぐに数字を数えることができるあなた自身が簡単な作業のための複雑なコードを救出する例外的なツールに手を伸ばす見つけた場合は、ステップを取り戻すと、問題を単純化してみてください。私はあなたが実際には理解していなくても、あなたがもっと複​​雑になったという印象を持っています。

たとえば、数字を数える方法は非常に混乱しています。たとえば、配列cは何ですか?あなたはそれに賢明な価値を書く前にそれから読む。非常に単純なソリューションを実装しようとすると、まずは巧妙ではなく、簡単な解決策をとろうとしないでください。たとえそれが人間のようなものではないとしても、コンピュータは愚かな作業を速く実行することができます。

0

このプログラムがあなたに役立つかどうか試してみてください。

#include <stdio.h> 

int main() { 
    unsigned n; 
    int arr[30]; 
    printf("Enter a whole number: "); 
    scanf("%i", &n); 
    int f = 0; 
    while(n) 
    { 
     int b = n % 10; 
     arr[f] = b; 
     n /= 10; 
     ++f; 
    } 
    for(int i=0;i<f;i++){ 
     int count=1; 
     for(int j=i+1;j<=f-1;j++){ 
      if(arr[i]==arr[j] && arr[i]!='\0'){ 
       count++; 
       arr[j]='\0'; 
      } 
     } 
     if(arr[i]!='\0'){ 
      printf("%d is %d times.\n",arr[i],count); 
     } 
    } 
} 

テスト

Enter a whole number: 12234445 
5 is 1 times. 
4 is 3 times. 
3 is 1 times. 
2 is 2 times. 
1 is 1 times. 
0

ここで入力を分析するだけつのループを使用する別の製品です。私はコメントされている他の変更を加えた。

#include <stdio.h> 

int main(void) 
{ 
    int count[10] = { 0 }; 
    int n; 
    int digit; 
    int elems = 0; 
    int diff = 0; 

    printf("Enter a whole number: "); 
    if(scanf("%d", &n) != 1 || n < 0) {   // used %d, %i can accept octal input 
     puts("Please enter a positive number"); // always check result of scanf 
     return 1; 
    } 

    do { 
     elems++;         // number of digits entered 
     digit = n % 10; 
     if(count[digit] == 0) {     // number of different digits 
      diff++; 
     } 
     count[digit]++;       // count occurrence of each 
     n /= 10; 
    } while(n);         // do-while ensures a lone 0 works 

    printf("Number of digits entered: %d\n", elems); 
    printf("Number of different digits: %d\n", diff); 
    printf("Occurrence:\n"); 
    for(n = 0; n < 10; n++) { 
     if(count[n]) { 
      printf(" %d of %d\n", count[n], n); 
     } 
    } 
    return 0; 
} 

プログラムセッション:

 
Enter a whole number: 82773712 
Number of digits entered: 8 
Number of different digits: 5 
Occurrence: 
    1 of 1 
    2 of 2 
    1 of 3 
    3 of 7 
    1 of 8 
関連する問題