Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Farmers need to plant their crops early enough for the necessary growing season

ID: 673799 • Letter: F

Question

Farmers need to plant their crops early enough for the necessary growing season but late enough to avoid

a killing frost. For this assignment you are to write a program that reads a file created with data from the

National Climatic Data Center to determine the latest day in the spring that a frost has occurred. The file

weatherDaily.dat contains several years of Greensboro daily weather data sorted by increasing date.

Each line in the file represents one day’s weather and contains the values:

year date of this weather record

month date of this weather record from 1 to 12

day date of this weather record from 1 to 31

precipitation amount of precipitation on this day

snow amount of snow that fell on this day

daily high highest temperature recorded on this day in tenths of a degree Celsius

daily low lowest temperature recorded on this day in tenths of a degree Celsius

Explanation / Answer

You can also refer this url for more information

http://bigladdersoftware.com/epx/docs/8-0/input-output-reference/page-008.html

#include <iostream.h>

#include <fstream.h>

#include <iomanip.h>

#include <math.h>

#include <conio.h>

#include <string.h>

fstream file;

char year[5]="";

//Non-Member function to find month, to avoid user data-entrychar *returnMonth(int m){

    switch(m){

        case 1 : return("January");

        case 2 : return("February");

        case 3 : return("March");

        case 4 : return("April");

        case 5 : return("May");

        case 6 : return("June");

        case 7 : return("July");

        case 8 : return("August");

        case 9 : return("September");

        case 10 : return("October");

        case 11 : return("November");

        case 12 : return("December");

    }

    return("Invalid");

}

//Non-Member functions, checks for whether file is loaded or not//it returns 1 if not loaded and 0 otherwise.int checkFile(){

    if(file==NULL){

       cout<<" There is No Data to Display ";

       getch();

       return(1);

    }

    return(0);

}

class weather

{

     public:

     double avgtemp[12];

     char month[12][20];

     weather();

     void getdata(int m){ //simple getdata...

     strcpy(month[m],returnMonth(m)); //avoiding user to input

     cout<<" Enter temperature for "<<month[m]<<" : ?";

     cin>>avgtemp[m];

     }

     void displaydata(int m){ //simple displaydata

     cout<<setw(20)<<setprecision(2)<<setiosflags(ios::left)

         <<setiosflags(ios::showpoint)

         <<month[m]<<setw(10)<<setiosflags(ios::right)<<avgtemp[m];

     }

     void displaytemp(int i){ //Display only Temperature data

      cout<<setw(10)<<setprecision(2)<<setiosflags(ios::right)

          <<setiosflags(ios::showpoint)<<avgtemp[i];

     }

     double returntemp(int i){

      return(avgtemp[i]);

     }

     void loadfile();

     void displaytempscale(); //for displaying temperature scalevoid updatedata(int m,double t)

     {

    strcpy(month[m],returnMonth(m));

    avgtemp[m]=t;

     }

     int validate(double t){ //Validate entered temperature (change to suit ur requirement).if(t>55 || t < (-20))

       return(1); //states that invalid entryelsereturn(0); //valid entry

     }

};

weather :: weather(){ //Constructor to intialize objectfor(int i=0;i<12;i++)

    {

        avgtemp[i]=0;

        month[i][0]=NULL;

    }

}

void weather :: loadfile(){ //for Selecting Year or creation of new year file.

    clrscr();

    file.close(); //It is required when trying to open different year files,//while there is already loaded any year file.char filename[20]="";

    cout<<" *****Select a Year to Work With***** ";

    cout<<"Enter Year (eg: 2001) : ?";

    cin>>year;

    strcat(filename,"c:\"); //Here i am assuming that path must be c:

    strcat(filename,"data"); //if u wan't to skip that criteria just remove this lines.

    strcat(filename,year);

    strcat(filename,".dat");

    file.open(filename,ios::ate|ios::nocreate|ios::in|ios::out|ios::binary);

    if(file==NULL){

        char ans;

        cout<<" File Dose Not Exist "

            <<"Do you wan't to create it! (y or n) N : ?"; //By default No

        ans=getche();

        if(ans=='y'|| ans=='Y'){

           file.open(filename,ios::ate|ios::in|ios::out|ios::binary);

           cout<<" File Created Successfully";

        }

        else{

           file;

           cout<<" Fail to load data file";

        }

    }

       else if(file!=NULL){

        cout<<" Data File is successfully loaded";

       }

       getch();

}

void weather :: displaytempscale(){

    int i,c=0;

    cout<<" ";

    for(i=1;i<=70;i++)

    {

       if(i<=10)

          cout<<"0";

       else if(i<=20)

          cout<<"1";

       else if(i<=30)

          cout<<"2";

       else if(i<=40)

          cout<<"3";

       else if(i<=50)

          cout<<"4";

       else if(i<=60)

          cout<<"5";

       else if(i<=70)

          cout<<"7";

    }

    cout<<" ";

    for(i=1;i<=7;i++)

    {

      for(c=0;c<10;c++)

        cout<<c;

    }

    cout<<" ";

}

void intro()

{

    clrscr();

    cout<<" ";

    cout<<" Email : admin@syntax-example.com "

        <<" Website : http://www.syntax-example.com";

    cout<<" ";

    cout<<"Thanks for using this software.";

    getch();

}

void main(){

    char choice='1';

    int cnt,i,j,iNum,totstars=0,location,m;

    double decNum,dNum,high=0,low=99999,avg=0,t;

    char c;

    weather obj;

    file.close();

    do{

        clrscr();

        cout<<" *****Main Menu***** ";

      cout<<"1> Select a year to work with "

            <<"2> Display data as Table "

            <<"3> Display data as horizontal histogram "

            <<"4> Display Yearly Statistics to date "

            <<"5> Record Data "

            <<"6> Change Data "

            <<"7> Save Data "

            <<"0> Exit "

            <<"Please enter a number (0...7) => ";

        choice=getche();

        //again for sake of simplicity i have directly return code

        //in case brace rather than going for member-function.

        switch(choice){

            case '0' : intro();

                    goto out;

            case '1' : obj.loadfile();

                    break;

            case '2' : clrscr();

                    cout<<" *****Display Data as a Table***** ";

                    if(checkFile()){

                       goto endtable;

                     }

                    cout<<" Table of Temperature data for "<<year;

                    cout<<" ";

                    file.seekg(0,ios::end);

                    cnt=file.tellg();

                    cnt=cnt/sizeof(obj); //cnt contains how many records previously recorded

                    file.seekg(0,ios::beg);

                    for(i=1;i<=cnt;i++)

                    {

                       if(i==1)

                        cout<<" Quater 1 : ";

                       else if(i==4)

                        cout<<" Quater 2 : ";

                       else if(i==7)

                        cout<<" Quater 3 : ";

                       else if(i==10)

                        cout<<" Quater 4 : ";

                       file.read((char *)&obj, sizeof(obj));

                       if(!file.eof()){

                           obj.displaytemp(i);

                    }

                    file.clear();

                    }

                    getch();

                    endtable:

                    break;

            case '3' : clrscr();

                    cout<<" *****Display Data as a Horizontal Histogram***** ";

                    if(checkFile()){

                       goto endhistogram;

                    }

                    cout<<"Histogram of Temperature data for "<<year;

                    obj.displaytempscale();

                    file.seekg(0,ios::end);

                    cnt=file.tellg();

                    cnt=cnt/sizeof(obj); //cnt contains how many records previously recorded

                    file.seekg(0,ios::beg);

                    for(i=1;i<=cnt;i++)

                    {

                       cout<<" "<<setw(15)<<setiosflags(ios::left)<<returnMonth(i);

                       file.read((char *)&obj, sizeof(obj));

                       if(!file.eof()){

                         decNum=obj.returntemp(i);

                         iNum=floor(decNum);

                         dNum=decNum-iNum; //for finding decimal part.

                         totstars=iNum;

                         if(dNum >= 0.5)

                        totstars++;

                         for(j=1;j<=totstars;j++)

                        cout<<"*";

                         cout<<" "<<totstars;

                    }

                    file.clear();

                    }

                    obj.displaytempscale();

                    getch();

                    endhistogram:

                    break;

            case '4' : clrscr();

                    cout<<" *****Display Yearly Statistics to Date***** ";

                    if(checkFile()){

                       goto endstatus;

                    }

                    cout<<"Temperature Statistics data for "<<year;

                    cnt=file.tellg();

                    cnt=cnt/sizeof(obj); //cnt contains how many records previously recorded

                  file.seekg(0,ios::beg);

                    high=avg=0;

                    low=99999;

                    for(i=1;i<=cnt;i++)

                    {

                       file.read((char *)&obj, sizeof(obj));

                       double tmp=obj.returntemp(i);

                       if(!file.eof()){

                         if(high < tmp)

                        high=tmp;

                         if(low > tmp)

                        low=tmp;

                         avg=avg+tmp;

                    }

                    file.clear();

                    }

                    avg=avg/double(cnt);

                    cout<<" Highest Monthly Average : "<<high;

                    cout<<" Lowest Monthly Average : "<<low;

                    cout<<" Average Yearly Temperature : "<<avg;

                    getch();

                    endstatus:

                    break;

            case '5' :      clrscr();

                    cout<<" *****Record Data***** ";

                    if(checkFile()){

                        goto endRecord;

                        }

                    else{

                    cnt=file.tellg();

                    cnt=cnt/sizeof(obj); //cnt contains how many records previously recorded

                    if(cnt==12)

                        cout<<" Data-Entry of "<<year<<" is already been done ";

                    for(i=cnt+1;i<=12;i++)

                    {

                        enteragain:

                        cout<<" Do u wan't to enter data for"<<returnMonth(i)<<" (Y or N) Y : ?";

                        c=getche();

                        if(c=='n' || c=='N')

                           goto endRecord;

                        obj.getdata(i);

                        if(obj.validate(obj.returntemp(i)))

                        {

                            cout<<" Invalid Data Entry ";

                            goto enteragain;

                        }

                        cin.get(c);

                        file.write((char *) &obj, sizeof(obj));

                    }

                     }

                     getch();

                     endRecord:

                      break;

            case '6' : clrscr();

                    cout<<" *****Change Data***** ";

                    if(checkFile()){

                       goto endchange;

                    }

                    else{

                    cnt=file.tellg();

                    cnt=cnt/sizeof(obj); //cnt contains how many records previously recorded

                    tryagain:

                    cout<<" Enter Month (in digit) whose temperature is to be changed : ?";

                    cin>>m;

                    if(m <= 0 || m > cnt){

                        cout<<" Invalid Month ";

                        getch();

                        goto tryagain;

                    }

                    tempagain:

                    cout<<" Enter Temperature : ?";

                    cin>>t;

                    if(obj.validate(t))

                     {

                         cout<<" Invalid Data Entry ";

                         goto tempagain;

                     }

                    file.seekg(0,ios::beg);

                    location= (m-1) * sizeof(obj);

                    file.seekp(location);

                    obj.updatedata(m,t);

                     cin.get(c);

                    file.write((char *) &obj, sizeof(obj))<<flush;

                     }

                     endchange:

                     break;

            case '7' : clrscr();

                   cout<<" *****Store the Current Data***** ";

                   if(checkFile()){

                    goto endsave;

                    }

                   flush(file);

                   cout<<" Data in Memory is Saved successfully ";

                   getch();

                   endsave:

                   break;

            default : cout<<" Invalid Input ";

                   getch();

        }

    }while(choice!='0');

flush(file);

file.close();

clrscr();

out:

}