Gibt es eine einfachere Variante diese Aufgabenstellung zu lösen?

moccajoghurt

Bekanntes Mitglied
Die Aufgabe lautet:

"Ein Musik-Anbieter im Internet habe folgendes Geschäftsmodell: Jeder Nutzer kann sich zunächst 5 Musikstücke kostenlos downloaden. Für die nächsten 30 Stücke muss er jeweils 20 Cent bezahlen und für jeden weiteren Download 15 Cent.
Schreiben Sie ein Java-Programm, das einem Nutzer ermöglicht, die Anzahl an insgesamt gewünschten Downloads anzugeben, das daraufhin die insgesamt entstehenden Gebühren berechnet und diese auf den Bildschirm ausgibt."

Ich habe sie folgendermaßen gelöst:

Java:
public class Musikanbieter {
	
	
	public static void main(String[] args) {
		
		int downloads = IO.readInt("Anzahl der Musiktitel: ");
		int kosten = 0;
		
		
		if (downloads <= 5) {
			System.out.println("Kosten: 0c");
		}
		
		if (downloads >= 6 && downloads <= 30) {
			for (int anzahl = 6; anzahl <= downloads; anzahl ++) {
			kosten = kosten + 20;
			} System.out.println("Kosten: " + kosten + "c");
		}
		
		if (downloads >= 31) {
			for (int anzahl = 31; anzahl <= downloads; anzahl++) {
				kosten = kosten + 15;
			} System.out.println("Kosten: " + (kosten + 500) + " c");
		}	
		
	}
}

Habe gerade die Anweisungen: do, for, switch, break, continue und return erlernt und würde diese natürlich nutzen um die Aufgabe zu lösen... leider ist mir keine andere Variante als mit if zu arbeiten eingefallen.

Gehts leichter und effektiver?
 
Zuletzt bearbeitet:
Als ganz simple Schleife kann mans machen:

Java:
for(int i = 0; i < downloads; i++){
   if(i > 5){
       if(i <35){
           kosten+=20;
       }
       else{
           kosten+=15;
       }
   }
}

oder wie wäre es mit sowas:
Java:
if(downloads>5){
   downloads -= 5;
   if(downloads > 30){
       kosten+= 20*20;
       downloads -= 30;
       kosten+= downloads*15;
   }
   else kosten+= downloads*20;
 
}
 
Zuletzt bearbeitet:
bedeutet
Java:
kosten+=20
soviel wie
Java:
kosten = kosten + 20
und was passiert bei deinem ersten code, wenn jemand nur 1-5 downloads hat?
 
Jepp 😉
genau wie so Sachen wie:
Java:
a = a - 2 => a-=2
a = a * 2 => a*=2
a = a / 2 => a/=2

Beim ersten Code passiert garnichts, weil die Schleife niemals höher als 5 geht => also nie das IF wahr wird.
 
Wieso nicht berechnen?
Java:
import static java.lang.Math.*;

public class Test {

    public static void main(String[] args) {
        int downloads = 7;
        int kosten = min(max(downloads - 5, 0), 30) * 20 + max(downloads - 5 - 30, 0) * 15;
        System.out.println("Kosten: " + kosten + " c");
    }
}
 
Ja, Einzeiler können sehr mächtig sein und sind oft hübsch. In diesem Fall vielleicht nicht so selbsterklärend auf den ersten Blick 😉 das hier wär wohl verständlicher:
Java:
import static java.lang.Math.*;

import java.util.Arrays;
import java.util.List;

public class Test {

    public static void main(String[] args) {
        Rechnung r = new Rechnung();
        r.setDownloads(7);
        System.out.println(r);
    }

    static class Rechnung {
        final List<Kosten> kosten = Arrays.asList(new Kosten(20, 5), new Kosten(15, 35));

        int downloads;

        public void setDownloads(int downloads) {
            this.downloads = downloads;
        }

        public int getDownloads() {
            return downloads;
        }

        public int getPreis() {
            int preis = 0;
            for (int i = 0; i < kosten.size(); i++) {
                Kosten item = kosten.get(i);
                int teil = max(downloads - item.getStart(), 0);
                if (i < kosten.size() - 1) {
                    teil = min(teil, kosten.get(i + 1).getStart());
                }
                preis += teil * item.getCents();
            }
            return preis;
        }

        @Override
        public String toString() {
            return "Kosten: " + getPreis() + " c";
        }
    }

    static class Kosten {
        private int cents;

        private int start;

        Kosten(int cents, int start) {
            this.cents = cents;
            this.start = start;
        }

        public int getCents() {
            return cents;
        }

        public int getStart() {
            return start;
        }
    }
}
 

Neue Themen


Zurück
Oben