Gå til innhold

[Løst] Tips for å gjøre koden enklere?


Anbefalte innlegg

Jobber nå med Oblig 2 i INF1000 og den fugerer forsåvidt greit. Jeg lurer likevel på om måten jeg har løst oppgaven på er unødvendig tungvindt. om noen gidder å se på koden, og kanskje komme med noen tips til å forkorte den, hadde det vært strålende!

 

PS. Legger ved hele koden, så om du sliter med oppgaven kan du også kanskje få noen tips! Men, ikke kopier hele greia og lever før meg, da blir jeg tatt for juks!

import easyIO.*;
class Oblig2 {
public static void main(String [] args) {
System.out.print("\n" + "--------Velkommen til Ruritaninas oljeadministrasjon--------");
Olje olje = new Olje();
olje.adminLoop();
System.out.println("--------Takk for at du brukte dette programmet--------");
}
}
class Olje {
In tast = new In();
Out skjerm = new Out();
int rad;
int kolonne;

String [][] eier = new String[10][20];
double [][] utvunnet = new double[10][20];
double total=0;
void adminLoop() {
int ordre= 0;
skjerm.outln();
while(ordre !=6) {
 String  meny=("\n" + "Vennligst velg en kommando" + "\n" + "\n" + "\t" +
 "1) Kjøp et felt" + "\n" + "\t" +
 "2) Annuler kjøp av felt" + "\n" +"\t" +
 "3) Oversiktskart" + "\n" +"\t" +
 "4) Oppdater oljeutvinning" + "\n" +"\t" +
 "5) Vis oljeselskap" + "\n" +"\t" +
 "6) Avslutt program");
 skjerm.outln(meny);
 skjerm.out("Velger: ");
 ordre=tast.inInt();
 skjerm.outln();
 switch (ordre) {
 case 1: kjopFelt();break;
 case 2: annulerKjop();break;
 case 3: oversikt();break;
 case 4: oppdaterOlje();break;
 case 5: oljeselskap();break;
 case 6: avsluttProgram();break;
 default: skjerm.outln("Ugyldig! Bruk tallene 1-5 i menyen. 6 for å avslutte" + "\n"); break;
 }
 }
}
void kjopFelt() {
skjerm.outln("\n" + "**Kjøp et felt**" + "\n");
skjerm.out("Oppgi selskapets navn: " + "\n");
String navn=tast.inLine();
skjerm.out("\n" + "I hvilken radnr vil du kjøpe?(0-9) ");
int rad=tast.inInt();
skjerm.out("\n" + "I hvilken kolnr vil du kjøpe?(0-19) ");
int kolonne=tast.inInt();
if(eier[rad][kolonne]==null) {
 for(int i=0; i<utvunnet.length; i++) {
  for(int j=0; j<utvunnet.length; j++) {
  eier[rad][kolonne]=navn;
  }
 }
 skjerm.outln("\n" + eier[rad][kolonne]+ " har kjøpt feltet " + rad  + "-" + kolonne);
 skjerm.outln();
}else{
 skjerm.outln("\n" + "Desverre " + navn + ", dette feltet er dette feltet er allerede kjøpt av: "  + eier[rad][kolonne]);
 }

}
void annulerKjop() {
skjerm.outln("**Annuler kjøp**"+"\n");
skjerm.out("Selskapets navn: ");
String navn=tast.inLine();
//ser om selskapet er registrert
//ser om angitte felter er registrert som kjøpt
//!!!!!!!VIKTIG!!!!!!! SE OM DET REGISTRERTE SELSKAPET FAKTISK EIER FELTENE!!!!!!!!!!!!
//denne kjører dobbbbbbelt!!!!!!!!!FIKS DET
boolean funnet = false;
//boolean hume=false;
for(int i=0; i<eier.length; i++) {
 for(int j=0; j<eier[i].length; j++) {
  if(navn.equals(eier[i][j]) && !funnet) {
//hume=true;
funnet=true;
skjerm.outln("Hvilke kjøp av felter skal " + navn + " annulere?" + "\n");
skjerm.out("Radnr: ");
rad=tast.inInt();
skjerm.out("Kolnr: ");
kolonne=tast.inInt();
if(eier[i][j].equals(eier[rad][kolonne]) && eier[rad][kolonne]!=null) {
 skjerm.outln("\n" + navn + " eier ikke lenger felt " + rad + "-" + kolonne);
 eier[rad][kolonne]=null;
 }else{
 skjerm.out("Du eier ikke dette feltet, det gjør ");
  if(eier[rad][kolonne]== null) {
   skjerm.out("heller ingen andre. Prøv igjen!");
   }else{
	skjerm.out(eier[rad][kolonne] + ". Prøv igjen!");
   }
  }
 }
  }
 }
if (funnet != true) {
 skjerm.outln("\n"+"Dette selskapet har ingen registrerte oljefelter!");
 }
}

void oversikt() {
skjerm.outln("**Oversiktskart**" + "\n");
skjerm.out("  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19");
for(int i=0; i<10; i++) {
 skjerm.outln();
 skjerm.outln();
 if (i<11) {
  skjerm.out(i);
 }
 for(int j=0; j<20; j++) {
 if (eier[i][j] != null) {
  skjerm.out(" x ");
  }else{
skjerm.out(" . ");
  }
 }
}
skjerm.outln();
}
void oppdaterOlje() {
double fat;
skjerm.outln("**Oppdater oljeutvinning**" + "\n");
skjerm.out("Selskapets navn: ");
String navn=tast.inLine();
//boolean hume=false;
boolean funnet = false;
for(int i=0; i<eier.length; i++) {
 for(int j=0; j<eier[i].length; j++) {
  if(navn.equals(eier[i][j]) && !funnet) {
funnet=true;
//hume=true;
skjerm.outln("Hvilke felter skal oppdaters?" + "\n");
skjerm.out("Radnr: ");
rad=tast.inInt();
skjerm.out("Kolnr: ");
kolonne=tast.inInt();
if(eier[i][j].equals(eier[rad][kolonne]) && eier[rad][kolonne]!=null) {
 skjerm.outln("\n" + "Felt " + rad + "-" + kolonne + " nåværende utvunnet mengde er " + utvunnet[rad][kolonne] + " fat");
 skjerm.out("\n" + "Ny utvunnet olje (i fat) ");
 fat = tast.inDouble();
 utvunnet[rad][kolonne]=utvunnet[rad][kolonne] + fat;
 skjerm.outln("\n" + navn + " har utvunnet " + fat + " fat. Totalt utvunnet på felt " + rad + "-" + kolonne + " : " + utvunnet[rad][kolonne] + " fat.");
 }else{
  skjerm.out("\n" + "Beklager. Felt " + rad + "-" + kolonne + " har ingen eiere. Prøv igjen!" + "\n");
 }
}
  }
 }
}
void oljeselskap() {
double total=0;
skjerm.outln("**Hva eier oljeselskapet**" +"\n");
skjerm.out("Selskapets navn: ");
String navn=tast.inLine();
boolean funnet = false;
for(int i=0; i<eier.length; i++) {
 for(int j=0; j<eier[i].length; j++) {
  if(navn.equals(eier[i][j]) && eier[i][j]!=null) {
funnet=true;
skjerm.outln(navn + " eier felt: " + i + "-" + j);
  }
 }
}
//regner totalt utvunnet olje
for(int i=0; i<eier.length; i++) {
 for(int j=0; j<eier[i].length; j++) {
  if(navn.equals(eier[i][j])) {
total+=utvunnet[i][j];
  }
 }
}
skjerm.outln("Totalt utvunnet for " + navn + " " + total + " fat.");
if(funnet !=true) {
 skjerm.outln(navn + " eier foreløpig ingen oljefelt.");
}
}
void avsluttProgram() {
System.exit(1);
}
}

Lenke til kommentar
Videoannonse
Annonse

Jeg regner med objekt orientert programmering ikke er pensum før i slutten av semesteret eller i neste semester, så det legger litt begrensninger på restrukturering.

 

Prøv å se etter ting du gjør ofte (som å be bruker om selskapsnavn eller hente koordinater) og gjør det i egne metode, f.eks:

 

private int[] hentXY() {
	int[] result = { -1, -1 };
	while (!(result[0] >= 0 && result[0] <= 9)) {
		skjerm.out("Radnr: ");
		result[0] = tast.inInt();
	}
	while (!(result[1] >= 0 && result[1] <= 19)) {
		skjerm.out("Kolnr: ");
		result[1] = tast.inInt();
	}
}

Lenke til kommentar
  • 4 uker senere...

Ah, INF1000, det vekker minner :) Det jeg husker er at jeg hata EasyIO, ettersom du bare vil få bruk for det i INF1000. I INF1010 er det BufferedReader og Scanner som er tingen. Én ting du kan gjøre er å drite i

class Olje

og heller bruke

class Oblig2

. Det vil bli som dette


class Oblig2 {
 public static void main(String [] args) {
   System.out.print("\n" + "--------Velkommen til Ruritaninas oljeadministrasjon--------");
   Oblig2 olje = new Oblig2();
   olje.adminLoop();
   System.out.println("--------Takk for at du brukte dette programmet--------");
 }
…

Lenke til kommentar

Her er noen tips:

- generelt: skriv egne metoder for å lese inn data fra brukeren (signaturen kan f.eks. se slik ut: private int lesInt(String beskjed, int min, int max)) og bruk disse i de forskjellige metodene for å gjøre de mer oversiktlige

- kjopFelt(): denne inneholder løkker som kan fjernes

- annulerKjop() + oppdaterOlje(): her kan du ta vare på rad og kolonne og avbryte løkka når sjekken slår til, og flytte koden inne i løkka til etter løkka isteden

- oljeselskap(): her kan du kombinere de to løkkene

- "funnet != true" kan bedre skrives som "!funnet"

Lenke til kommentar

Er i prinsippet enig med deg, men man kan fort spare seg for mye trøbbel ved å unngå norske tegn (i hvertfall når man studerer ved UiO, der brukes latin1 som standard tegnsett ennå... blir fort litt trøbbel hvis man ikke er oppmerksom på dette). Selv foretrekker jeg absolutt å skrive kode på engelsk.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...