Цикл For работает не так, как ожидалось

#android

#Android

Вопрос:

Спокойной ночи.

У меня есть for цикл для вычисления некоторых значений в течение недели, в течение нескольких недель. Мой код сравнивает день недели с количеством прошедших дней.

For работает нормально только в понедельник, когда workday это то же самое, что totdays . Остаток дней totact равен 0, и уравнение fianl становится NaN .

             int totdias = PrefProteos.getInt("dia",0);
            int totact = 0;
            float califtot = 0;
            int stateday = 0;
            float promdias;
            float promcalif;
            int workdays;
            Date day = new Date();
            SimpleDateFormat formatter = new SimpleDateFormat("EE", Locale.US);
            String dayweek = formatter.format(day);
            if (dayweek.equals("Mon")) {
                stateday = 1;
            }
            else if (dayweek.equals("Tue")) {
                stateday = 2;
            }
            else if (dayweek.equals("Wed")) {
                stateday = 3;
            }
            else if (dayweek.equals("Thu")) {
                stateday = 4;
            }
            else if (dayweek.equals("Fri")) {
                stateday = 5;
            }
            else if (dayweek.equals("Sat")) {
                stateday = 6;
            }
            else if (dayweek.equals("Sun")) {
                stateday = 7;
            }

            if (stateday >= totdias) {
                workdays = 1;
                promdias = totdias;
            } else {
                workdays = (totdias - (stateday - 1));
                promdias = stateday;
            }

            for (int y = workdays; y == totdias;y  ) {
                for (int x = 1; x <= 12; x  ) {
                    String activ=PrefProteos.getString("act"   x   "-habit", "");
                    if (!activ.equals("")) {
                        float notactiv = PrefProteos.getFloat("act"   x   "-puntdia" y, 0);
                        califtot = califtot notactiv;
                        totact = totact 1;
                    }
                }
            }

            promcalif = califtot / (totact * promdias);
  

Комментарии:

1. можете ли вы опубликовать logcat?

2. for (int y = workdays; y == totdias;y ) { поскольку вы просите использовать цикл только тогда, когда workdays == totdias я бы предположил, что это может быть вашей проблемой 😉

Ответ №1:

Вы неправильно записали свое первое условие цикла, вы запрашиваете только для запуска, только если workdays = totdias . Я предполагаю, что вы хотите выполнять цикл для каждого дня от рабочих дней до итогов, поэтому исправьте этот блок :

 for (int y = workdays; y == totdias;y  ) {
  

В

 for (int y = workdays; y <= totdias;y  ) {
  

PS :

Ваш текущий цикл похож на запись

 if(workdays == totdias) {
  

Ответ №2:

  • Вы должны предоставить еще немного кода, потому что мы не можем понять ваш PrefProteos класс и, вероятно, ошибка там.
  • Вы также должны добавить полный logcat
  • И вы должны сообщить нам, какая строка выдает ошибку.

В любом случае есть некоторые ошибки:

Здесь

 for (int y = workdays;y==totdias;y  ){
  

Нет смысла использовать условие equals в условии выхода из цикла for, если оба условия equals и переменная цикла одинаковы, потому что это приведет к циклу if. Это потому, что for будет работать, только если workdays == totdias с самого начала, в противном случае он не будет работать.

Условия For являются:

 for(counter = defaultvalue; condition that if true, makes the loop goes on; what to do each loop end)
  

Это означает, что ваш код будет выполнять:

 is y(workdays) == totdias?
  if yes, do the loop
    add one to y(workdays)
    exit because the condition is no more true
  if not, don't run the loop
  

Итак, вам просто нужно вызвать:

 if(y == totdias){
  //do code
  y  ;
}
  

Но, вероятно, это ошибка, потому что, за исключением понедельника, этот код никогда не будет запущен! так что в другие дни promdias не установлено

В цикле

 for (int x = 1; x<=12; x  ){
  String activ=PrefProteos.getString("act"   x   "-habit", "");
  if (!activ.equals("")){
    //there must be an error here somewhere
    float notactiv=PrefProteos.getFloat("act"   x   "-puntdia" y, 0);
    califtot=califtot notactiv;
    totact=totact 1;
  }
}
  

И это, должно быть, выдает ошибку.

         promcalif = califtot/(totact*promdias);
  

Два варианта:

  • promidias или totact являются 0 . вы не можете сделать number/0
  • Как было сказано выше, promdias может не выполняться в другие дни недели, потому что цикл for никогда не запускается

Кстати, float name = 0; не идеально, измените их на float name = 0f;

Комментарии:

1. Вы определенно сделали больше обзоров, чем я! PS: == можно было бы использовать в цикле for, но, конечно, не используя объявление переменной в части объявления (ну, даже это не совсем верно 😉 но это уродливый код)

2. if(y == totdias){ //do code y ; } это не цикл. Я думаю, что он пытается выполнить цикл, но его предложение неверно

3. @AxelH да, вероятно, я неправильно объяснил ошибку, я редактирую объяснение, что, как он написал, это не цикл, а условие if! спасибо 🙂

4. @Doomsknight извините, я не вижу, где я написал, что if (…) — это цикл, я сказал, что он выполняет цикл с if вместо confition цикла, если вы скажете мне, где я это исправлю! 😉

5. @PierGiorgioMisley Просто я просматриваю ответ. В следующей строке объясняется, что это, вероятно, не то, что он хотел сделать 🙂