Sample Solutions to first Assignment. EEN218 Thursday 20th
September 2001
A reminder of the data-file format: each line contains exactly 28 characters. Here is a sample line with the key to the digits' meanings underneath:
199901011300+043055011017632
aaaabbccddeeffffggghhhiiijjja=year, b=month, c=day, d=hour, e=minute, f=temperature, g=humidity, h=wind speed, i=wind direction, j=pressure. I will show both the C (stdio) and C++ (iostream) ways of reading the file and interacting with the user:
This is the C/stdio way
#include <stdio.h>
#include <stdlib.h>
const int MAX = 9000;
int year[MAX], month[MAX], day[MAX], time[MAX], temp[MAX],
hum[MAX], wspd[MAX], wdir[MAX], pres[MAX];
int nrecords=0;
void main(void)
{ FILE *infile=fopen("weather.dat", "r");
if (infile==NULL)
{ printf("Could not read weather.dat\n");
exit(1); }
while (nrecords<MAX)
{ int n=fscanf(infile, "%4d%2d%2d%4d%4d%3d%3d%3d%3d",
&year[nrecords], &month[nrecords], &day[nrecords],
&time[nrecords], &temp[nrecords], &hum[nrecords],
&wspd[nrecords], &wdir[nrecords], &pres[nrecords]);
if (n!=9) break;
nrecords+=1; }
fclose(infile);
printf("1 = average temperature throughout year\n");
printf("2 = average temperature for a particular month\n");
printf("3 = average temperature for a particular time of day\n");
printf("4 = find windiest moment\n");
printf("5 = full report on a particular moment\n");
printf("6 = exit\n");
while (1)
{ printf("option: ");
int option;
scanf("%d", &option);
if (option==1) avg_temp_all_year();
else if (option==2) avg_temp_all_month();
else if (option==3) avg_temp_for_time();
else if (option==4) find_windiest();
else if (option==5) report_on_moment();
else if (option==6) break;
else printf("What are you talking about?\n"); } }
// These functions would of course be defined before main:
void avg_temp_all_year(void)
{ float total=0.0;
for (int i=0; i<nrecords; i+=1)
total+=temp[i];
float avg=total/nrecords;
printf("Average temperature over all records is %.1f degrees Fahrenheit\n", avg); }
void avg_temp_all_month(void)
{ printf("which month (number 1-12): ");
int mth;
scanf("%d", &mth);
float total=0.0, count=0.0;
for (int i=0; i<nrecords; i+=1)
if (month[i]==mth)
{ total+=temp[i];
count+=1.0; }
float avg=total/count;
if (count==0.0)
printf("No records have month = %d\n", mth);
else
printf("Average temperature in month %d is %.1f degrees Fahrenheit\n", mth, avg); }
void avg_temp_for_time(void)
{ printf("what time (number 0000-2359): ");
int tim;
scanf("%d", &tim);
float total=0.0, count=0.0;
for (int i=0; i<nrecords; i+=1)
if (time[i]==tim)
{ total+=temp[i];
count+=1.0; }
float avg=total/count;
if (count==0.0)
printf("No records have time = %d\n", tim);
else
printf("Average temperature at time %04d is %.1f degrees Fahrenheit\n", tim, avg); }
void find_windiest(void)
{ int windex=0, wmax=-999999;
for (int i=0; i<nrecords; i+=1)
if (wspd[i]>wmax)
{ wmax=wspd[i];
windex=i; }
printf("Windiest moment is at %04d on %04d/%02d/%02d, speed was %d mph\n",
time[windex], year[windex], month[windex], day[windex], wmax); }
void report_on_moment(void)
{ int yr, mn, dy, tm;
printf("enter year month date time: ");
scanf("%d %d %d %d", &yr, &mn, &dy, &tm);
int found=0;
for (int i=0; i<nrecords; i+=1)
if (year[i]==yr && month[i]==mn && day[i]==dy && time[i]==tm)
{ found=1;
printf("on %04d/%02d/%02d at %04d:\n", yr, mn, dy, tm);
printf(" temperature %+4d degrees fahrenheit\n", temp[i]);
printf(" humidity %4d %%\n", hum[i]);
printf(" wind speed %4d mph\n", wspd[i]);
printf(" w direction %4d degrees East from North\n", wdir[i]); }
if (found==0)
printf("No matching record for %04d/%02d/%02d at %04d found\n", yr, mn, dy, tm); }