Обнаружение изменения в значении, считанном scanf - PullRequest
0 голосов
/ 29 марта 2011

Для задания мы должны прочитать список дат и соответствующих значений (температур) из текстового документа.Значения в каждой строке разделены запятыми.

Пример данных:

dd,mm,yyyy,x,y,z,w
01,01,2011,1.1,5.2,6.5,7.5
02,01,2011,2.1,5.2,6.1,1.1
03,01,2011,4.5,2.5,6.1,2.1
...
30,01,2011,4.1,6.1,6.1,2.1
01,02,2011,2.5,6.1,7.1,6.3

До сих пор я реализовал цикл для чтения каждой строки:

while(scanf("%d,%d,%d,%f,%f,%f,%f", &dd, &mm, &yyyy, &x, &y, &z, &w) == 7)
{
}

Мы 'Учитывая допущение, что в документе нет ошибок и нет повторяющихся дат.

Однако могут быть отсутствующие записи (не каждый месяц содержит полные данные; пропущенные дни).

У меня возникают проблемы с обнаружением, если данные каждого месяца (мм) являются полным месяцем или тольконеполный месяц.

Например: 31 день в марте 2011 года. Если у меня есть 31 запись с марта, мне нужно напечатать «Полный месяц», в противном случае, если пропущены дни, я должен напечатать «Частичный месяц».

До сих пор я использовал операторы if(mm==1){} для разделения каждого месяца внутри цикла while(scanf(...)) и затем увеличивал их в отдельные переменные, а затем сравнивал с количеством дней в полном месяце, но я нене знает, как его реализовать, чтобы он обнаружил, что мм изменился по сравнению с предыдущей строкой (новый месяц), и выполняет определенное действие (например, вычисления)

Извините, если это сбивает с толку!

Мыеще не учили массивы, только операции, циклы и функции.

Ответы [ 3 ]

2 голосов
/ 29 марта 2011

Прежде всего, я не думаю, что вам нужны «отдельные переменные» для разных месяцев.Почему не массив, индексированный по месяцам (т.е. мм)?Это, вероятно, уменьшит длину вашего кода на порядок.О, вы еще не учили массивы.

Во-вторых, в верхней части цикла установите переменную 'last_mm'.Это будет значение мм в последний раз, когда вы проходили через цикл.Инициализируйте это к -1 или кое-чему.Когда last_mm и mm различаются, вы знаете, что месяц изменился.В нижней части цикла установите для last_mm значение mm.

Как правило, это способ обнаружения изменений во время циклов.

0 голосов
/ 29 марта 2011

Следующий код не протестирован, но что-то вроде этого должно помочь вам без массивов.Я надеюсь, что вы уже знаете переключатель / чехол.

//Keep track of which month we are fetching data for
int currentMonth = 1;
//Number of days for which data have been read for the current month
int numberOfDaysInCurrentMonth = 0;
//Full = 1 would represent if all data is available for currentMonth
int full = 0;
//This is set to 1 only when data is read for a month different to currentMonth
int monthChanged = 0;

while(scanf("%d,%d,%d,%f,%f,%f,%f", &dd, &mm, &yyyy, &x, &y, &z, &w) == 7)
{
    // If month changed in last iteration  
    if(monthChanged == 1) {
        //Check if full = 1 print "Full Month" to output
        if(full == 1) {
             printf("Full Month");
        //Else there was partial data 
        } else {
             printf("Partial Month");
        }

        //Once the output is on the screen set this back to 0, so it will be set to 
        //1 only when month changes next time.
        monthChanged = 0;
    }

    //If currentMonth is the same as mm, just add 1 to number of days in this month
    //for which data is provided  
    if(currentMonth == mm) {
        ++numberOfDaysInCurrentMonth;

    //otherwise
    } else { 
        switch(currentMonth) {
            //In case the month is January, March, May, July, August, October, December
            case 1, 3, 5, 7, 8, 10, 12:
                //Number of days should be 31 for full to be 1
                if(numberOfDaysInCurrentMonth == 31)
                     full = 1;
            break;
            //In case the month is February
            case 2:
                //Number of days should be 28 for month to be full 
                //(ignoring leap years)  
                if(numberOfDaysInCurrentMonth == 28)
                     full = 1;
            break;
            //In case the month is April, June, September, November
            case 4, 6, 9, 11:
                //Number of days should be 28 for month to be full 
                if(numberOfDaysInCurrentMonth == 30)
                     full = 1;
            break;     
        }
        //Now that we have set what we desired, set
        //currentMonth to mm 
        currentMonth = mm;
        //The month just changed, otherwise we would not have been in this part
        of the code
        monthChanged = 1;
        //Number of days in current month starts from 1
        numberOfDaysInCurrentMonth = 1;
    }

    //Do whatever you are doing with data here
}
0 голосов
/ 29 марта 2011

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

int curmonth = 1;
int dd,mm,yyy;
float x,y,z,w;
float xtotal = 0,ytotal = 0,ztotal = 0,wtotal = 0;
while(scanf("%d,%d,%d,%f,%f,%f,%f", &dd, &mm, &yyyy, &x, &y, &z, &w))==7 {
    if (mm == curmonth) {
        //add to current counters
        ztotal+=z;
        ytotal+=y;
        xtotal+=y;
        wtotal+=w;
    } else {
        if (mm < curmonth) 
            //not the expected order as per specs so better die now
            exit(1);
        printf("month=%d,my_calculations=%f,%f,%f,%f\n",xtotal,ytotal,ztotal,wtotal);
        xtotal = ytotal = ztotal = wtotal = 0; curmonth=mm;
    }
} 
...