2013-04-27 3 views
0

У меня возникли проблемы, понимающие эту проблему. Код действительно базовый, но он ведет себя довольно неожиданно. Код представляет собой упрощенную версию подпрограммы для извлечения и сохранения в отдельный файл данных за день 15 каждого месяца из ежедневной базы данных. В чем проблема ? Первый cout печатает количество дней, в которые вводится внешний. Затем есть некоторые условные строки для выбора правильного дня (в данном примере это не очень важно), а затем есть блок, внутренний if, который должен распечатать данные за день 15 в новый файл. Теперь, как вы можете видеть, в то время как внешний цикл (внимание!) Вводится только на 10-м (и это уже неправильно - он должен был записать все числа от 11 до 15), но затем он также печатает, что файл написан на 15! В чем проблема ? ВНЕШНИЙ ИФ был введен только 10-го числа, как может быть INNER IF исполнять на 15-м ????Вложенный Если дилемма

#include "stdafx.h" 
#include <iostream> 
#include <string> 

using namespace std; 


int main() 
{ 
    string newdata="mamma"; 
    string risultato="-"; 
    string PriorLine="-"; 
    int PriorDay=0; 
    int lastmonth=0; 

     // Loops through all the months 
     for (int mese=1; mese <=12; mese++) 
     { 
      //Loops through all the days in the month 
      for(int day=1; day<=30; day++) 
      { 
       // at the month's beginning these 2 strings are set ="-" 
       if (mese != lastmonth) 
       { 
       risultato="-"; 
       PriorLine="-"; 
       } 
       // if we are between the 10th and the 20th and the result is still to be found 
       if (day>=10 && day<=20 && risultato=="-") 
       { 
         cout << day << endl; // LISTS ALL THE DAYS THIS LOOP IS ENTERED 
         if (day=15) // if it is exactly day 15 print that day's result 
           risultato=newdata;  
         // if that month in the data there is no day 15 and 
         // this is the second pass, choose the closest ! 
         if (day>15 && PriorLine !="-") 
         { 
          if (abs(day-15)<=abs(15-PriorDay)) 
            risultato=newdata; 
          else 
            risultato=PriorLine; 
         } 
         PriorLine=newdata; 
         PriorDay=day; 
         if (risultato != "-") 
         { 
          // writes the result (risultato) in a file 
          cout << "file written on the " << day << endl; 

         } 
       }     
       lastmonth=mese; 
      } 
    }  
    system("pause"); 
    return 0; 

}

+0

Проследили ли вы это в отладчике? – ChrisF

+0

Я думаю, что это 'if (day> = 10 && day <= 20 && risultato ==" - ")' может быть внутри 'if (mese! = Lastmonth)', поскольку первое не удается, если последнее не работает. –

+1

'for (int day = 1; day <= 30; day ++)' Возможно, вам удалось уйти от вас, чтобы в мае было 31 день? - И Май не за горами! –

ответ

7

if (day=15) назначает 15 к day и возвращает true. Вам нужно if (day==15)

+0

Если вы принимаете мышление «15 = день», эту проблему избегают. –

+1

@Roger Rowland Спасибо! Задача решена ! Эд, ты выглядишь так, будто у тебя характер, похожий на мой; в реальной жизни мы были бы великими друзьями, я полагаю! – alwaystudent

1

Когда я просто компилируется код с g++ -Wall я получил предупреждение:

error: suggest parentheses around assignment used as truth value 

На этой линии:

if (day=15) // if it is exactly day 15 print that day's result           

Я готов быть компилятор сказал вам, что ваша проблема есть. Я предлагаю вам включить все предупреждения в вашей системе сборки.

+0

О, давай! Я потерял 4 за репутацию за это! Это был простой вид! Сравнение == было написано правильно где-то еще в самом коде, который я написал выше, и это то, что все знают ... как люди могут быть такими плохими ??? – alwaystudent

+0

Я думаю, что людям не нравится тратить свое время на то, чтобы выяснить, что любой разумный компилятор, сделанный за последние 10 лет, скажет вам. Формулировка и форматирование вашего вопроса оставляют желать лучшего. Но, эй, не беспокойтесь о немногих точках репутации - если вы держите на нем, 4 очка будет ошибкой округления! –

+0

Кстати, у меня VisualStudio 2010, он не дал никаких предупреждений. Как изменить настройки? – alwaystudent