import easyIO.*;
import java.util.*;
class Oblig4 {
public static void main(String[] args) {
if (args.length >= 2) {
MetInst m = new MetInst(args[0],args[1]);
m.ordreløkke();
}else{
System.out.println("Bruk: >java Oblig4 <fil med Stasjonsdata> < fil med Observasjonsdata>");
}
}
}
class MetInst{
In tastatur = new In();
Out skjerm = new Out();
HashMap <String,Stasjon> stasjonNavn = new HashMap <String,Stasjon>();
HashMap <Integer,Stasjon> stasjonNumr = new HashMap <Integer,Stasjon>();
MetInst(String stasjonsfil, String vaerdatafil) {
In sf = new In(stasjonsfil);
In vf = new In(vaerdatafil);
while (!sf.endOfFile()) {
int nr = sf.inInt();
String navn = sf.inWord();
int moh = sf.inInt();
String kommune = sf.inWord();
String fylke = sf.inWord();
Stasjon værstasj = new Stasjon(nr, navn, moh, kommune, fylke);
stasjonNavn.put(navn, værstasj);
stasjonNumr.put(nr, værstasj);
}
while (!vf.endOfFile()) {
int nr = vf.inInt();
int dMnd = vf.inInt();
int mnd = vf.inInt();
double maxVind = vf.inDouble();
double nedbør = vf.inDouble();
double minTemp = vf.inDouble();
double maxTemp = vf.inDouble();
Stasjon st = stasjonNumr.get(nr);
st.settInn(dMnd, mnd, maxVind, nedbør, minTemp, maxTemp);
}
sf.close();
vf.close();
}
void skrivMeny() {
skjerm.outln("");
skjerm.outln("");
skjerm.outln("*** Værdatasystem versjon 1.0 ***");
skjerm.outln("");
skjerm.outln("Du har følgende valgmuligheter:");
skjerm.outln("");
skjerm.outln("1 - Finn antall uværsdager");
skjerm.outln("2 - Finn kommune med lavest temperatur");
skjerm.outln("3 - Finn stasjon med mest nedbør");
skjerm.outln("4 - avslutt");
skjerm.outln("");
skjerm.outln("");
}
void ordreløkke() {
skrivMeny();
int kommando = 0;
while (kommando != 4){
kommando = velgOperasjon();
switch (kommando) {
case 1: finnAntallUværsDager(); break;
case 2: finnKommuneMedLavestTemperatur(); break;
case 3: finnStasjonMedMestNedbør(); break;
case 4: avslutt(); break;
default: skjerm.out("Du har tastet feil"); break;
}
}
skjerm.outln("Værdatasystemet avsluttes");
}
int velgOperasjon() {
skjerm.out("Velg en kommando: ");
int kommando = tastatur.inInt();
return kommando;
}
void finnAntallUværsDager() {
for ( Stasjon s : stasjonNavn.values() ) {
skjerm.outln( s.stasjonNavn );
}
skjerm.outln("Finn antall uværsdager i en bestemt måned:");
skjerm.outln("");
skjerm.outln("For hvilken måned ønsker du å telle antall uværsdager: ");
int tastMåned = tastatur.inInt();
skjerm.outln("Velg om du vil identifisere stasjon med navn eller nummer ");
skjerm.outln("Trykk '1' for navn eller '2' for nummer: ");
int valg = tastatur.inInt();
if(valg == 1) {
skjerm.outln("For hvilken stasjon ønsker du å telle antall uværsdager: (bruk STORE bokstaver) ");
String stasjon = tastatur.inWord();
Stasjon st = stasjonNavn.get(stasjon);
if(st != null){
if(tastMåned>=1 || tastMåned<=6){
int antall = st.måned[tastMåned-1].telleUværsdager();
skjerm.outln("I måned nr " + tastMåned + " var det totalt " + antall + " uværsdager");
skjerm.outln("");
}
}else{
skjerm.outln("Finner ikke stasjon, eller så finnes det ikke data for denne stasjonen!");
}
}
if(valg == 2) {
skjerm.outln("For hvilken stasjon ønsker du å telle antall uværsdager: (bruk stasjonens nummer) ");
int stasjon = tastatur.inInt();
Stasjon st = stasjonNumr.get(stasjon);
if(st != null){
if(tastMåned>=1 || tastMåned<=6){
int antall = st.måned[tastMåned-1].telleUværsdager();
skjerm.outln("I måned nr " + tastMåned + " var det totalt " + antall + " uværsdager");
skjerm.outln("");
}
}else{
skjerm.outln("Finner ikke stasjon, eller så finnes det ikke data for denne stasjonen!");
}
}
else{
skjerm.outln("");
}
}
void finnKommuneMedLavestTemperatur() {
double lavest = 0.0;
String komLavest = null;
for (Stasjon s : stasjonNavn.values()) {
for (int i = 0; i < 6; i++) {
if (s.måned[i] != null) {
double a = s.måned[i].finneMinTemp();
if(a < lavest){
lavest = a;
komLavest = s.stasjonsKommune;
}
}
}
}
skjerm.out(komLavest + " ");
skjerm.outln(lavest);
}
void finnStasjonMedMestNedbør() {
skjerm.outln("Finn stasjon med mest nedbør i en gitt måned:");
skjerm.outln("");
skjerm.outln("For hvilken måned ønsker du å finne hvilken stasjon som hadde mest nedbør: ");
int tastMåned = tastatur.inInt();
double maks = 0.0;
String stMaks = null;
if(tastMåned>=1 || tastMåned<=6){
Iterator it = stasjonNavn.values().iterator();
while(it.hasNext()){
Stasjon st = (Stasjon) it.next();
Double a = st.måned[tastMåned-1].telleMestNedbør();
if( a > maks) {
maks = a;
stMaks = st.stasjonNavn;
}
}
skjerm.out(stMaks + " ");
skjerm.outln( maks );
}else{
skjerm.outln("Du har ikke tastet en måned mellom 1 og 6");
}
}
void avslutt() {}
}
class Stasjon{
int stasjonNumr;
String stasjonNavn;
int meterOverHavet;
String stasjonsKommune;
String stasjonsFylke;
Maaned[] måned = new Maaned[6];
Stasjon(int nr, String navn, int moh, String kommune, String fylke){
stasjonNumr = nr;
stasjonNavn = navn;
meterOverHavet = moh;
stasjonsKommune = kommune;
stasjonsFylke = fylke;
}
void settInn(int dMnd, int mnd, double maxVind, double nedbør, double minTemp, double maxTemp) {
if (måned[mnd-1] == null) måned[mnd-1] = new Maaned(mnd, 31);
måned[mnd-1].settInn(dMnd, maxVind, nedbør, minTemp, maxTemp);
}
}
class Maaned{
int maaned;
int DagIMaaned;
Dag[] dager = new Dag[31];
Maaned(int mnd, int dMnd){
maaned = mnd;
DagIMaaned = dMnd;
}
void settInn(int dMnd, double maxVind, double nedbør, double minTemp, double maxTemp) {
dager[dMnd-1] = new Dag(maxVind, nedbør, minTemp, maxTemp);
}
int telleUværsdager(){
int teller = 0;
for(int i=0;i<31;i++){
if(dager[i] != null && dager[i].mmNedbør == -99 ){}
else if(dager[i] != null && dager[i].uvær()){
teller++;
}
}
return teller;
}
double telleMestNedbør(){
double mest = 0;
for(int i=0;i<dager.length;i++){
if(dager[i] != null && dager[i].mmNedbør == -99 ){}
else if(dager[i] != null && dager[i].mmNedbør <= dager[i].mmNedbør ){
mest = (mest + dager[i].mmNedbør);
}
}
return mest;
}
double finneMinTemp(){
double minst = 0;
for(int i=0;i<dager.length;i++){
if(dager[i] != null && dager[i].minTemperatur == -99 ){}
else if(dager[i] != null && dager[i].minTemperatur >= dager[i].minTemperatur ){
minst = dager[i].minTemperatur;
}
}
return minst;
}
}
class Dag{
double maksVindhastighet;
double mmNedbør;
double minTemperatur;
double maksTemperatur;
Dag(double maxVind, double nedbør, double minTemp, double maxTemp) {
maksVindhastighet = maxVind;
mmNedbør = nedbør;
minTemperatur = minTemp;
maksTemperatur = maxTemp;
}
boolean uvær(){
if(maksVindhastighet + mmNedbør > 10.7){
return true;
}else{return false;}
}
}