Добавление цикла while и for - PullRequest
2 голосов
/ 16 апреля 2011

Вопрос задается: спроектируйте и внедрите приложение, которое сначала читает список из 10 трехзначных целых чисел, а затем подсчитывает количество появлений для каждой цифры от 0 до 9.

Вот пример трех трехзначных чисел
Номер входа [123, 456, 789]
Выход:
Цифра 0 появилась 0 раз
Цифра 1 появилась 1 раз
Цифра 2 появилась 1 раз
...
Цифра 9 появилась 1 раз

Я считаю, что я вычислил правильные формулы для вычисления количества раз, которое появляется каждое число, но я не уверен, как создать массив и начать поиск по нему. Я думаю, что мне нужно время и цикл for, но я не уверен, как их включить. Однако я боюсь, что мои текущие операторы if должны будут измениться после того, как циклы будут реализованы. Я иду в правильном направлении здесь? Любая помощь будет принята с благодарностью!

double i1, i2, i3, i4, i5, i6, i7, i8, i9, i10;
int c0=0, c1=0, c2=0, c3=0, c4=0, c5=0, c6=0, c7=0, c8=0, c9=0;

Scanner scan = new Scanner(System.in);

System.out.println ("Enter 10 3-digit integers");

//Counts the 1st number
System.out.println ("Enter first 3-digit integer");
i1 = scan.nextDouble();

    if (i1%10==0)
    c0++;
    if (i1%10==1)
    c1++;
    if (i1%10==2)
    c2++;
    if (i1%10==3)
    c3++;
    if (i1%10==4)
    c4++;
    if (i1%10==5)
    c5++;
    if (i1%10==6)
    c6++;
    if (i1%10==7)
    c7++;
    if (i1%10==8)
    c8++;
    if (i1%10==9)
    c9++;

    if ((i1%100>=0) & (i1%100<10))
    c0++;
    if ((i1%100>=10) & (i1%100<20))
    c1++;
    if ((i1%100>=20) & (i1%100<30))
    c2++;
    if ((i1%100>=30) & (i1%100<40))
    c3++;
    if ((i1%100>=40) & (i1%100<50))
    c4++;
    if ((i1%100>=50) & (i1%100<60))
    c5++;
    if ((i1%100>=60) & (i1%100<70))
    c6++;
    if ((i1%100>=70) & (i1%100<80))
    c7++;
    if ((i1%100>=80) & (i1%100<90))
    c8++;
    if ((i1%100>=90) & (i1%100<100))
    c9++;


    if((i1/1000>=.0) & (i1/1000<.1))
    c0++;
    if((i1/1000>=.1) & (i1/1000<.2))
    c1++;
    if((i1/1000>=.2) & (i1/1000<.3))
    c2++;
    if((i1/1000>=.3) & (i1/1000<.4))
    c3++;
    if((i1/1000>=.4) & (i1/1000<.5))
    c4++;
    if((i1/1000>=.5) & (i1/1000<.6))
    c5++;
    if((i1/1000>=.6) & (i1/1000<.7))
    c6++;
    if((i1/1000>=.7) & (i1/1000<.8))
    c7++;
    if((i1/1000>=.8) & (i1/1000<.9))
    c8++;
    if((i1/1000>=.9) & (i1/1000<1.00))
    c9++;

Ответы [ 4 ]

1 голос
/ 16 апреля 2011

Дополнительные подсказки:

  1. Обобщите задачу, чтобы «подсчитать различные символы в строке».Так как вы все равно читаете входные данные как строку, просто забудьте, что на данный момент вы подсчитываете целые числа, и сосредоточьтесь на подсчете появления символов в строке.

  2. Подумайте о данныхструктура, которая может содержать пару (отличный символ, число).

  3. Перебирать символы в строке, добавить символ в структуру данных в точке 2, если она не существуетсо значением по умолчанию 0, затем увеличьте количество символов, на которые вы сейчас смотрите.

  4. При отображении выходных данных вашей программы перебирайте записи вашей структуры данных, проверяйте, что символ является целым числом (если проверка важна), и возвращайте счет для этого символа..

Я не уверен, есть ли у вас проблемы с итерацией или нет, но вот как перебрать символы строки:

String s = "123 456 789";

for (int i = 0; i < s.length(); i++){
    char c = s.charAt(i);
    // process c
}

// or, if you know what 'smart loops' in Java are...

for(char c : s.toCharArray()) {
    // process c
}

Toзапутать дело, вот он в ... 'псевдокод' (редактируется на основе комментариев);)

>>> s = "012 345 678 900"
>>> datastructure = {}
>>> for c in s:
...     if c not in datastructure:
...         datastructure[c] = 0
...     datastructure[c] += 1
... 
>>> for c in '0123456789':
...     if c not in datastructure:
...         datastructure[c] = 0
...     print 'Digit %s appeared %d times' % (c, datastructure[c])
... 
Digit 0 appeared 3 times
Digit 1 appeared 1 times
Digit 2 appeared 1 times
Digit 3 appeared 1 times
Digit 4 appeared 1 times
Digit 5 appeared 1 times
Digit 6 appeared 1 times
Digit 7 appeared 1 times
Digit 8 appeared 1 times
Digit 9 appeared 1 times
1 голос
/ 16 апреля 2011

Ваша идея не так уж и плоха, вам просто нужны петли:)

1: цикл для получения чисел - вы не можете дублировать один и тот же код 10x - запишите его один раз, в цикле.

2: цикл для проверки цифр - вы можете использовать свои if s или сделать так, как сказал Джош но прежде - вам нужна структура данных для хранения ваших данных - встречаются цифры. 10 переменных это плохо, ПЛОХО :), идея.
используйте array[2][10] или просто array[10] (где число цифр = индекс массива и значение = встречается) или еще лучше - HashMap<> - Google.

затем внутри цикла вы делаете:

for(int i = 0; i<10; i++){
    if (myCurrentNumberToCheck %10 == i)
        array[i] = array[i] + 1; // approach with simple array[10]
    if ((myCurrentNumberToCheck %100 >= i*10) && (myCurrentNumberToCheck %100 < (i+1)*10 )) // needs to be tested
        array[i] = array[i] + 1;
    if ((myCurrentNumberToCheck %1000 >= i*100) && (myCurrentNumberToCheck %1000 < (i+1)*100 )) // needs to be tested
        array[i] = array[i] + 1;
}

ааа, и ваши вставленные числа тоже должны быть в какой-то структуре - попробуйте List numbers = new ArrayList<int>() здесь :) и повторите список, чтобы взглянуть на следующее число.

так что вам нужно будет добавить числа в список, а затем - перейти в этот список и проверить их, и здесь использовать цикл, который я написал выше

1 голос
/ 16 апреля 2011

Подсказки:

  1. Избавьтесь от всех объявлений c<n> и i<n> и всех тестов if. Они не помогут вам решить проблему.
  2. Используйте тот факт, что '0' + <n> == '<n>', где <n> равно 0 .. 9.
  3. Или используйте Character.digit(char, 10). Прочитайте javadocs .
  4. Вы не используете nextDouble() для чтения целого числа. Прочитайте javadocs .
0 голосов
/ 16 апреля 2011

проблема с readInt () и readDouble () заключается в том, что он игнорирует ведущие 0 и конечные 0 после десятичной точки, т.е. 01.10 => 1.1

Гораздо более простой подход - просто прочитатькаждый символ.

  int ch;
  while((ch = System.in.read())>=0) {
      // you have one character

  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...