Punktegleichheit

Heyho liebe Forengemeinschaft ,
bleibe bei einer Aufgabe stecken , welche von mir verlangt eine Punkteanzahl auf Gleichheit zu überprüfen.
Es gibt dabei , je nach Eingabe , x Testfälle.
Jeder Testfall enthält dann 3 Zeilen:
-1Zeile Punkte
-2.ZeilePunkteherkunft
-3.Zeile Punkte die jede Herkunft gibt
anschließend soll das Programm ausgeben ob die Punkte aus der Herkunft addiert !genau! Punkte ergibt (falls nicht Ausgabe:nein)
Code:
import java.util.Scanner;
public class SamePoints {
public static void main(String[]args) {
Scanner scan=new Scanner(System.in);
int testcases=scan.nextInt();                                    //Anzahl an Testfälle wird eingelesen

if(testcases>=1 && testcases<=50) {
    int points=scan.nextInt();                                    //Punkte werden eingelesen
        if(points>=0 && points<=1000) {                            // min. 0Punkte max jedoch 1000 Punkte
            int pointsorigin=scan.nextInt();                    //Punkteherkunft wird eingelesen
                if(pointsorigin>=1 && pointsorigin<=20) {        //mindestens eine "Herkunft" max jedoch 20 "Herkünfte"
                    int pointsoforigin=scan.nextInt();            //Punkte die jede Herkunft gibt
                }
        }
}

}
}
Soweit bin ich bisher gekommen nun steh ich auf den schlauch und weiß nicht weiter.
Ich bekomme erst ab da an nicht gebacken die einzelnen Punkte zu addieren und dann zu testen ob es gleich den Punkten ist.Für Tipps und Anregungen würde ich mich sehr freuen.:)
 
Also als Beispieleingabe:
Testfälle :2
Testfall1:
Punkte:25
Herkünfte:4
Punkte pro Herkunft: 10 11 6 8
Testfall 2:
Punkte : 155
Herkünfte :6
Punkte pro Herkunft:25 25 25 25 25 25

Ausgabe:
Nein
Ja
 

mihe7

Top Contributor
OK, du liest die Anzahl der Herkünfte ein.
Java:
int pointsorigin=scan.nextInt();
int summe = 0;
for (int i = 0; i < pointsorigin; i++) {
    int punkte = scan.nextInt(); // Punkte der Herkunft i
    summe = summe + punkte; // oder kurz: summe += punkte
}
 
Erstmal danke für die Hilfe doch wenn ich es so in meinen Code einfügen , bekomm ich nicht die Ausgabe wie sie sein sollte...
Java:
import java.util.Scanner;
public class SamePoints {
public static void main(String[]args) {
Scanner scan=new Scanner(System.in);
int testcases=scan.nextInt();                                    //Anzahl an Testfälle wird eingelesen
if(testcases>=1 && testcases<=50) {
    int points=scan.nextInt();                                    //Punkte werden eingelesen
        if(points>=0 && points<=1000) {                            // min. 0Punkte max jedoch 1000 Punkte
            int pointsorigin=scan.nextInt();
            int summe=0;                                                    //Punkteherkunft wird eingelesen
                if(pointsorigin>=1 && pointsorigin<=20) {
                for(int i=0;i<pointsorigin;i++) {
                    int punkte=scan.nextInt();
                    summe+=punkte;
                    //System.out.println(summe);
                    if(summe==points) {
                        System.out.println("Ja");
                    }
                    else {
                        System.out.println("Nein");
                    }
                }
                
                }
        }
}

}
}

Wenn ich dann das obige Beispiel eingeben will kommt zwar Nein als Output aber dies 4x , es sollte aber nur einmal kommen.Außerdem kommt terminiert das Programm bereits obwohl ja eigentlich noch ein 2ter Fall einzugeben wäre.o_Oo_O
 

mihe7

Top Contributor
Wenn ich dann das obige Beispiel eingeben will kommt zwar Nein als Output aber dies 4x , es sollte aber nur einmal kommen.Außerdem kommt terminiert das Programm bereits obwohl ja eigentlich noch ein 2ter Fall einzugeben wäre
Du hast ganz offensichtlich ein Problem mit Schleifen :)

Die for-Schleife wiederholt den in geschweiften Klammern angegebenen Block, so lange i < pointsorigin gilt. Nach jedem Durchlauf wird i um 1 erhöht (i++).

Jetzt schau mal Deinen Code an, wo Du die Prüfung und Ausgabe eingefügt hast: im Block. Du willst aber doch die Summe aller Herkünfte ermitteln und anschließend(!) prüfen.

Dass das Programm terminiert, ist auch klar: Du hast ja keine Wiederholungen (Schleife) programmiert.
 
Danke für die Einwände habe es dann auch noch hinbekommen.
Nun bleibt mir aber noch das Problem dass es eine Kombination aus den Punkte jeder Herkunft die gesamt Punkte sein können.Wie ich das jetzt implementieren soll bleibt mir ein Rätsel.


Code:
import java.util.Scanner;
public class SamePoints {
public static void main(String[]args) {
Scanner scan=new Scanner(System.in);

int testcases=scan.nextInt();
int a=0;
int summe=0;
if(testcases>=1 && testcases<=50) {
    while(a!=testcases) {
    int points=scan.nextInt();                                   
        if(points>=0 && points<=1000) {                             
            int pointsorigin=scan.nextInt();
                if(pointsorigin>=1 && pointsorigin<=20) {
                for(int i=0;i<pointsorigin;i++) {
                    int punkte=scan.nextInt();
                    summe+=punkte;
                    
                }
                    if(summe==points || summe>=points) {
                        System.out.println("Ja");
                    }
                    else {
                        System.out.println("Nein");
                    }
                
                
                }
        }
        a++;
        
}

}
}
}
 
Das Programm soll wenn es eine Kombination aus den Punkten gibt die genau die gesamt Punkte ergeben.
also z.b 925 Punkte sind es die man braucht es wird aufgeteilt aus 10 "Herkünfte" und diese haben jeweils folgende Punkte:
45 15 120 500 235 58 6 12 175 70
Dann soll ja ausgeben werden , denn es gibt eine mögliche Kombination an Punkten die genau die erforderten 925 Punkte sind.
 
Java:
import java.util.Scanner;
public class SamePoints {
public static void main(String[]args) {
Scanner scan=new Scanner(System.in);

int testcases=scan.nextInt();
int a=0;
int summe=0;
if(testcases>=1 && testcases<=50) {
    while(a!=testcases) {
    int points=scan.nextInt();                                   
        if(points>=0 && points<=1000) {                             
            int pointsorigin=scan.nextInt();
                if(pointsorigin>=1 && pointsorigin<=20) {
                for(int i=0;i<pointsorigin;i++) {
                        int punkte=scan.nextInt();
                        int[]array=new int[punkte];
                }
                    
                
                
                }
        }
        a++;
        
}

}
}
}

Ich denke mal so.
 
X

Xyz1

Gast
bleibe bei einer Aufgabe stecken , welche von mir verlangt eine Punkteanzahl auf Gleichheit zu überprüfen.
Es gibt dabei , je nach Eingabe , x Testfälle.
Jeder Testfall enthält dann 3 Zeilen:
-1Zeile Punkte
-2.ZeilePunkteherkunft
-3.Zeile Punkte die jede Herkunft gibt
anschließend soll das Programm ausgeben ob die Punkte aus der Herkunft addiert !genau! Punkte ergibt (falls nicht Ausgabe:nein)
Ich verstehe nur Böhmen....

Es sollte (wie beim Angeln) ein Mindestmaß für qualitativ ansprechende Fragen geben - ohne das eine Frage nicht beantwortet wird... Oder wie seht ihr das?
 
@mihe7 Kann das so machen? Sorry für die dummen Fragen bin aber noch wirklich wie mein Name sagt , blutigerAnfänger im Thema programmieren.
Code:
import java.util.Scanner;
public class SamePoints {
public static void main(String[]args) {
Scanner scan=new Scanner(System.in);

int testcases=scan.nextInt();
int a=0;
int summe=0;
int array[]= {};
if(testcases>=1 && testcases<=50) {
    while(a!=testcases) {
    int points=scan.nextInt();                                   
        if(points>=0 && points<=1000) {                             
            int pointsorigin=scan.nextInt();
                if(pointsorigin>=1 && pointsorigin<=20) {
                for(int i=0;i<pointsorigin;i++) {

                    int punkte=scan.nextInt();
                    array[i]=punkte;
                    }
                    
                }
                
                
                }
        }
        a++;
}

}
}
 

mihe7

Top Contributor
Fast. Die Zuweisung ist ok. Allerdings musst Du Deinem Array auch ausreichend groß dimensionieren (ein Array ist keine dynamische Struktur, die wächst nicht einfach mit).

Da Du weißt, dass Du pointsorigin Punkte einlesen willst, muss das Array auch pointsorigin Punkte aufnehmen können: int[] array = new int[pointsorigin];

Bleibt die Frage, wo Du diese Zeile platzierst. An der Stelle, wo Du sie gerade hast, kannst Du sie nicht lassen, denn dort ist pointsorigin noch nicht bekannt. Es bietet sich also an, die Erzeugung des Arrays zwischen den Zeilen
Java:
int pointsorigin=scan.nextInt();
// ... und 
for(int i=0;i<pointsorigin;i++) {
einzufügen. Sinnvollerweise, machst Du das nach der if-Abfrage, denn nur dann benötigst Du das Array.
 

mihe7

Top Contributor
Durch nachdenken - aufzeichnen - weiter denken usw. Das ist durchaus ernst gemeint.

Wie würdest Du denn auf dem Papier die Kombinationsmöglichkeiten der Zahlen 5, 8, 10 ermitteln? Und wie viele Möglichkeiten gibt es?
 

Neue Themen


Oben