This is a copy of the assignment: write a c++ program to compute some statistics
ID: 674881 • Letter: T
Question
This is a copy of the assignment: write a c++ program to compute some statistics based on daily high temperatures recorded throughout the three summer months (June, July, and August). The 2015 data for San Marcos has been downloaded from wunderground.com, and placed in a file named “tempdata.txt”. This file has the following format: the first line describes the file contents. The remaining lines each contain a date followed by the high temperature for that day: 6/1/15 87 The high temperatures are in order, so that the first one is for June 1, the second is for June 2, and so on through July and August. To keep things simple, I have deleted the rows for 7/31 and 8/31, so we can assume each month has exactly 30 days. The statistics you should compute in your program are: • The average daily high temperature for the entire summer • The number of days that reached at least 100 degrees for the entire summer • The maximum temperature for each month and on what day it occurred. Input: All of the input will come from the file “tempdata.txt”. You may assume that there will be 90 dates and temperatures in the file, and that they will be in order from June 1 to Aug 30 (excluding July 31). I will place a sample file for you to use for testing on the web page. Processing: Compute the statistics requested above. Output: Display the statistics, labelled, and with the average temperature formatted to 1 decimal place. additional requirements: using three arrays to store the temperatures, one for June, one for July, and one for August. • Your program should test for file open errors. • I recommend temporarily echoing the input from the file to the screen (using cout) to be sure you are reading the input correctly into your array(s). • Don’t forget to skip the first line in the file.
Explanation / Answer
#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
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.