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:
}
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.