2016-12-10 2 views
1

Даже если этот вопрос задан в миллион раз, я просто не нашел ответа, который действительно помогает моему делу, или я просто не вижу решения.Возврат к началу цикла for в C

Мне задали задачу сделать программу, которая принимает целое число и подсчитывает, сколько раз каждая цифра появляется в ней, а также не отображая одну и ту же информацию дважды. Поскольку мы работаем с массивами, в настоящее время мне приходилось делать это с помощью массивов, конечно, так как мой код запутан из-за моего отсутствия знаний в C. Я попытаюсь объяснить мой мыслительный процесс вместе с предоставлением вам кода.

После ввода числа я взял каждую цифру, разделив число на 10 и поместив эти цифры в массив, затем (поскольку массив обратный), я изменил обратный массив, чтобы он выглядел лучше (хотя это не требуется). После этого у меня есть множество отвратительных циклов, в которых я пытаюсь перебрать весь массив, сравнивая первый элемент со всеми элементами снова, поэтому для каждого элемента массива я сравниваю его с каждым элементом массива снова , Я также добавляю проверенный элемент в новый массив после каждой проверки, поэтому я могу в первую очередь проверить, был ли элемент сопоставлен раньше, поэтому мне не нужно все это делать, но это моя проблема. Я пробовал массу манипуляций с продолжением или goto, но я просто не могу найти решение. Поэтому я просто использовал ** 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 будет увеличиваться ndigit после использования его значения, используя его в качестве индекса массива в квадратных скобках является очень распространенным явлением в C. .)

Мы просто хотим подсчитать цифры, поэтому вспять массив действительно не нужен. Теперь мы хотим считать все цифры. Мы могли бы это сделать, сославшись на все цифры, когда мы увидим в первый раз, например. в 337223, сначала подсчитайте все 3s, затем все 7s, а затем все 2s, но это быстро усложнится. Гораздо проще подсчитать все 10 цифр:

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); 
} 

Внешняя петля охватывает все десять цифр. Внутренняя петля подсчитывает все вхождения 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 явно к нулю, а остальные элементы неявно, чтобы вы начали с массива из десяти нулей.)

Если вы думаете об этом, вам даже не нужен массив 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 
Смежные вопросы