queersumme & teilen

esteban_1986

Mitglied
AUFGABE:
Schreiben Sie ein Java Programm, das nacheinander eine beliebige natürliche Zahl einliest, die Zahl
überprüft, ob sie durch 7 teilbar oder ob deren Quersumme gleich 7 ist. Zahlen, für die dies gilt, sind
auf dem Bildschirm anzuzeigen. Das Ende der Eingabe soll durch die Eingabe eines Wertes, der
außerhalb der zulässigen Werte liegt, signalisiert werden. Verwenden Sie für die Repräsentation der
relevanten Daten geeignete Datentypen.

"so ich habe das programm versucht zu schreiben, aber iwas läuft nich so wie es soll! ich kenne auch das problem weis aber nicht genau wie ich es richtig machen kann :( vllt könnt ihr mir helfen :)"
"SRY WENN DER BEITRAG SCHLECHT ERSTELLT IST; IS MEIN ERSTER"

Java:
import java.util.Scanner;
public class testtest
	{
	public static void main(String[] args)
		{
		Scanner in = new Scanner(System.in);
		int zahl=0, zahl2, rest;
		int quer=0;
		System.out.println("Geben sie eine natuerliche Zahl ein");
		System.out.println("Zahl = ");
		zahl=in.nextInt();
		while (zahl > 0)
			{
			zahl2=zahl;
			rest = zahl %7;
			while (zahl > 0)
				{
				quer = quer + zahl%10;
				zahl = zahl/10;
				}
			if (quer == 7 || rest ==0)
				{
				System.out.println("Ihre Zahl lautet: " +zahl2);
				zahl = zahl+1;
				}
			else
				{
				System.out.println("Geben sie erneut eine natuerliche Zahl ein");
				System.out.println("Zahl: ");
				zahl = in.nextInt();
				}
			}
			System.out.println("ENDE");
		}
	}
 
Zuletzt bearbeitet von einem Moderator:

Andi_CH

Top Contributor
Gibt doch einfach die Werte aus oder nimm den Debugger, dann siehst du das Problem!

Wenn eine zweite Zahl eingegeben wird, musst du die Variablen neu initialisieren.

Bei deinem Ansatz gibt es IMHO genau zwei Zahlen die deinen Bedingungen entsprechen und die sind 7 und 70.
Ist der wirklich richtig?
 

esteban_1986

Mitglied
danke erstmal, dass überhaupt iwer was geschr. also das programm läuft eig. das problem is nur, dass es nur eine 7quersumme aus gibt mit dem text "ihre zahl lautet". weil ja dann zahl =0 ist..mit zahl=zahl+1 läuft er nochmal die schleife an wegen zahl>0, bildet rest und quer springt dann aber in die else anweisung. aber ich muss ja wenn if wahr ist weitere zahlen eingeben können, was ich haj auch kann nur sagt er dann nicht: "ihre zahl lautet".....:(
sry wegen des schreibstils...hab grad keine zeit mehr beim nächsten mach ichs dann besser ;)
 
B

bone2

Gast
hm der code erscheint mir arg unlogisch, ich mal mir das mal auf^^

hast du mal zahlen eingesetzt und bist mal auf dem papier durchgegangen was du da programmiert hast?

bsp: 25

Java:
einlesen
zahl = 25
zahl > 0 = true, also geht er in while1
    zahl2 = 25
    rest = 25 % 7 = 4
    zahl > 0 = true, also geht er in while2
        quer = 0 + 25 % 10 = 5
        zahl = 25 / 10 = 2
        if ist false, also springt er ins else und liest eine neue zahl ein:
            zahl = 21
    zahl > 0 = true, also bleibt er in while2
        quer = 5 + 21 % 10 = 5 + 1 = 6
        zahl = 21 / 10 = 2
        if ist wieder false. wieder neu einlesen.

das ganze kann zu keinem ergebnis führen. vielleicht hast du die mathematischen operatoren und variablenzuweisung nicht verstanden?
 
Zuletzt bearbeitet von einem Moderator:

Andi_CH

Top Contributor
Hm - also so unlogisch ist der Code nicht - grundsätzlich funktioniert er nämlich.
Allerdings müssen im Widerholungsfall die Variablen neu initialisiert werden.

Damit der TO nicht unnötig verwirrt ist, hier die korrekt laufende Version
(Es sei denn du wolltest etwas anderes ;-) )

[EDIT]
Wie schon oben getippt: Nur 7 und 70 sind gültige Werte nach dieser Definition
[/EDIT]


Java:
import java.util.Scanner;

public class SiebnerTest {

	public static void main(String[] args)
	{
		Scanner in = new Scanner(System.in);
		int zahl = 0;
		int zahl2 = 0;
		int rest = 0;;
		int quer = 0;
		System.out.println("Geben sie eine natuerliche Zahl ein");
		System.out.println("Zahl = ");
		zahl=in.nextInt();
		while (zahl > 0)
		{
			zahl2=zahl;
			rest = zahl %7;
			while (zahl > 0)
			{
				quer = quer + zahl%10;
				zahl = zahl/10;
			}
			if (quer == 7 || rest ==0)
			{
				System.out.println("Ihre Zahl lautet: " +zahl2);
				zahl = zahl+1;
			}
			else
			{
				// Hier Variablen initialisieren
				zahl = 0;
				zahl2 = 0;
				rest = 0;;
				quer = 0;
				System.out.println("Geben sie erneut eine natuerliche Zahl ein");
				System.out.println("Zahl: ");
				zahl = in.nextInt();
			}
		}
		System.out.println("ENDE");
	}
}
 
Zuletzt bearbeitet:
B

bone2

Gast
ich verstehe die aufgabenstellung so, das auch 21 und 25 angezeigt werden müssten

und das zahl = zahl + 1; ist eine sehr unschöne lösung um wieder zum zahleinlesen zu kommen
 

Andi_CH

Top Contributor
ich verstehe die aufgabenstellung so, das auch 21 und 25 angezeigt werden müssten

und das zahl = zahl + 1; ist eine sehr unschöne lösung um wieder zum zahleinlesen zu kommen

Im ersten Ansatz helfen wir hier im Anfängerteil mal zu lauffähigen Versionen zu kommen.
Wenns ganz übel aussieht können wir am Schluss immer noch eine elegante Version präsentieren.

AUFGABE:
Schreiben Sie ein Java Programm, das nacheinander eine beliebige natürliche Zahl einliest, die Zahl
überprüft, ob sie durch 7 teilbar oder ob deren Quersumme gleich 7 ist. Zahlen, für die dies gilt, sind
auf dem Bildschirm anzuzeigen. Das Ende der Eingabe soll durch die Eingabe eines Wertes, der
außerhalb der zulässigen Werte liegt, signalisiert werden. Verwenden Sie für die Repräsentation der
relevanten Daten geeignete Datentypen.

Ich habe das wirklich falsch gelesen - aber mein code machts ja trotzdem richtig.
 
Zuletzt bearbeitet:

Andi_CH

Top Contributor
Noch ein hinweis - es ist sehr angenehm, den eigentlichen Code in eine Funktion zu packen. Damit wird das Ganze einfacher testbar. Für Tests verwende ich das auskommentierte Hauptprogramm.

Java:
import java.util.Scanner;

public class SiebnerTest {

	private static boolean test (int pInput) {
		int zahl = pInput;
		int rest = 0;
		int quer = 0;

		rest = zahl %7;
		while (zahl > 0)
		{
			quer = quer + zahl%10;
			zahl = zahl/10;
		}
		if (quer == 7 || rest ==0)
		{
			return true;
		} else {
			return false;
		}
	}

//	public static void main(String[] args) {
//		for(int i=7; i<50; i++)
//			if (test(i)) {
//				System.out.println("Die Zahl " + i + " entspricht den Regeln.");
//			}
//	}


	public static void main(String[] args)
	{
		Scanner in = new Scanner(System.in);
		int zahl = 0;
		while(true) {
			System.out.print("Geben sie eine natuerliche Zahl ein : ");
			zahl=in.nextInt();
			if (zahl==0) 
				break;
			if (test(zahl))
				System.out.println("Die Zahl " + zahl + " entspricht den Regeln.");
			else
				System.out.println("Die Zahl " + zahl + " entspricht nicht den Regeln.");
		}
		System.out.println("ENDE");
	}
}
 
Zuletzt bearbeitet:

esteban_1986

Mitglied
Also,
zu bone 2: meiner meinung nach bleibt er nicht in der wihle2, weil die schon beendet ist. Bei der Quersumme durchlläuft er diese (while2) für die Zahl 25 zweil mal, weil 2>0 ist! Die 21 und die 25 werden ja angezeigt. Nach meiner Lösung nur beim Ersten Mal wenns eine Quersumme ist, bei Andis Lösung immer. Danke fürs anschauen.
Und jetzt zu Andi: also, komischerweise klappt deine Lösung, ich versuceh grad noch nachzuvollziehen warum...haha :)
Danke erstmal vllt kommt gleich noch eine Frage.
 
B

bone2

Gast
//zahl = zahl+1;
// ist in andis neuer lösung nur überflüssig^^
edit: hat sich erledigt^^

das ich die while2 falsch gelesen hab, hab ich oben schon gesagt. :( die komische klammer formatierung hat mich wohl verwirrt

edit: die neue lösung ist schon echt hübsch, noch besser:
Java:
    private static boolean test (int pInput) {
        int zahl = pInput;
        int rest = 0;
        int quer = 0;

        rest = zahl %7;
        while (zahl > 0)
        {
            quer = quer + zahl%10;
            zahl = zahl/10;
        }

        return (quer == 7 || rest == 0);
    }
 
Zuletzt bearbeitet von einem Moderator:
B

bone2

Gast
edit is cool ;)

Java:
return true;
ist überflüssig^^
 
Zuletzt bearbeitet von einem Moderator:

Andi_CH

Top Contributor
Und jetzt zu Andi: also, komischerweise klappt deine Lösung ...
Ui, das währe eher peinlich wenn ich sowas nicht zum Laufen brächte - da würde mich mein Chef wohl rausschmeissen ;-)
Aber der Algorithmus ist von dir - ich habe nur die Variablen an der richtigen Stelle initialisiert, nämlich bevor die Daten das zweite mal eingelesen werdne (bei der Funktion geschieht das automatsich) und habe dann noch den relevanten Code in eine Funktion gepackt um es übersichtlicher zu gestalten...
 
B

bone2

Gast
die klammern einzurücken ist nicht logisch^^

sie sind praktisch das begin ... end und eigentlich wird nur das dazwischen eingerückt
 

Andi_CH

Top Contributor
Inwiefern logischer?
Klammern kannst du noch beliebig viel rein machen wenn du meinst es fehlen welche ;-)

[EDIT]
Jetzt vertstehe ich
Java:
while(true) {
{

//oder
while(true)
{

}
Das ist Geschmackssache
[/EDIT]

D
Aber an die Denkweise mit den Funktionen solltest du dich gewöhnen denn ohne das kann man keine nur annähernd grossen Programme schreiben ---
 
Zuletzt bearbeitet:

esteban_1986

Mitglied
also mit funktionen sind wir noch nicht soweit! wenns dann da zu einem späteren zeitpunkt noch fragen gibt, werde ich dich nochmal anschreiben.
vielen dank
 

esteban_1986

Mitglied
das programm läuft fast perfekt.
bei genau (bis jetzt) einer zahl gibt er etwas richtiges und falsches aus.
benutzt habe ich das programm, in dem du die initialisierung hinzugefügt hast andi.
bitte probiere, wenn du zeit hast, die 111111 (6 mal 1) aus.
vielen dank
 
Zuletzt bearbeitet:

esteban_1986

Mitglied
das programm läuft fast perfekt.
bei genau (bis jetzt) einer zahl gibt er etwas richtiges und falsches aus.
benutzt habe ich das programm, in dem du die initialisierung hinzugefügt hast andi.
bitte probiere, wenn du zeit hast, die 111111 (6 mal 1) aus.
vielen dank

ohh man ich habs schon raus. er übernimmt ja die 6 als quersumme vom ersten schelifendurchgang, rechnet dann die 1 dazu und ist bei sieben. somit ist die aussage wahr.
ich habe jetzt nach zeile: zahl=zahl+1; noch ein : quer=0; einfgefügt.
es läuft!
also musste nich nochmal nachschauen
bis dann
 
B

bone2

Gast
warum hast du die zeile "zahl = zahl +1" noch drinne? die war bisher immer falsch. wie sieht dein code jetzt aus?
 

Landei

Top Contributor
"Quer" schreibt sich übrigens mit genau einem "e". Nicht dass ich ein Rechtschreibnazi wäre, aber mit obiger Schreibwiese löst du sicher bei englischen Kollegen einige Heiterkeit aus ("queer" = "lesbisch")
 

esteban_1986

Mitglied
zahl=zahl+1 braucht man damit die while noch mal angelaufen wird um dann in der elseanweisung zu enden.
Java:
import java.util.Scanner;							//aufrufen der bibo zum scannen 
 
public class SiebenTest 
	{
	public static void main(String[] args)
		{
        Scanner in = new Scanner(System.in);		//vererbung von scanner(?)
        int zahl = 0;								//zahl die einglesen werden soll
        int zahl2 = 0;								//zahl die im falle ausgegeben werden soll
        int rest = 0;;								//ganzahliger rest
        int quer = 0;								//quersumme
        System.out.println("Geben sie eine natuerliche Zahl ein");
        System.out.println("Zahl = ");
        zahl=in.nextInt();							//einscannen der zahl
        while (zahl > 0)							//schleife springt nur an wenn zahl groeser null ist, sonst sprung zu zeile 47
			{
            zahl2=zahl;								//zahl wird kopiert zu zahl2, da zahl2 als ausgabewert benutzt wird, weil sich zahl im laufe des programm ändert
            rest = zahl %7;							//berechung des rests
            while (zahl > 0)						//quersummenrechnungsschleife(naechsten 4 zeilen)
				{
                quer = quer + zahl%10;				//berechnung der quersumme
                zahl = zahl/10;						//bei ganzzahliger division wegen int fällt der rest weg
				}
            if (quer == 7 || rest ==0)				//wenn mind eine aussage der beiden wahr ist = bedingung erfüllt
				{
                System.out.println("Die Zahl " + zahl2 + " entspricht den Regeln.");	//gibt zahl2 aus da zahl jetzt 0 null ist
				zahl=zahl+1;						//aendert zahl von 0 auf 1, weil nach der if-anweisung erste while schleife angesteuert wird; bedingung: zahl>0; ohne zahl=zahl+1 sprung in z.47
				quer = 0;							//muss null!, bei "richtigen" zahlen wird while1 und while2 zweimal durchlaufen=> BSP:zahl:42 =>quer=6; rest=0>im zweiten durchlauf: zahl=1(zahl=zahl+1)=>quersumme dann 7 fuer zahl=1: FALSCH
				}
            else									//wenn if nicht erfüllt
				{
                zahl = 0;							//alle variablen werden neu initialisiert z.38-41
                zahl2 = 0;
                rest = 0;;
                quer = 0;
                System.out.println("Geben sie erneut eine natuerliche Zahl ein");		//wenn zahl eine nat.zahl ist wird die else-anweisung in jedem fall angesteuert. auch fuer "richtige" zahlen. Zeile 34 erklaerung; aufforderung einer "neuen" zahl 
                System.out.println("Zahl: ");											
                zahl = in.nextInt();													//einlesen der "neuen" zahl
				}
			}
        System.out.println("Die Zahl " + zahl +" liegt auserhalb der zulaessigen Werte. Das Programm endet an dieser Stelle!"); //sprung wenn zahl <=0 => programm endet
		}
	}

die zeilenangaben bei den comments sind flasch, weil ich nicht den anfang mit nahme und so kopiert habe.
 
B

bone2

Gast
Java:
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);        //vererbung von scanner(?)
        int zahl = 0;                               //zahl die einglesen werden soll
        int zahl2 = 0;                              //zahl die im falle ausgegeben werden soll
        int rest = 0;                              //ganzahliger rest
        int quer = 0;                               //quersumme
        System.out.println("Geben sie eine natuerliche Zahl ein");
        System.out.println("Zahl = ");
        zahl=in.nextInt();                          //einscannen der zahl
        while (zahl > 0)                            //schleife springt nur an wenn zahl groeser null ist, sonst sprung zu zeile 47
        {
            zahl2=zahl;                             //zahl wird kopiert zu zahl2, da zahl2 als ausgabewert benutzt wird, weil sich zahl im laufe des programm ändert
            rest = zahl %7;                         //berechung des rests
            while (zahl > 0)                        //quersummenrechnungsschleife(naechsten 4 zeilen)
            {
                quer = quer + zahl%10;              //berechnung der quersumme
                zahl = zahl/10;                     //bei ganzzahliger division wegen int fällt der rest weg
            }
            if (quer == 7 || rest ==0)              //wenn mind eine aussage der beiden wahr ist = bedingung erfüllt
            {
                System.out.println("Die Zahl " + zahl2 + " entspricht den Regeln.");    //gibt zahl2 aus da zahl jetzt 0 null ist
            }
    
            rest = 0;
            quer = 0;
            System.out.println("Geben sie erneut eine natuerliche Zahl ein");       //wenn zahl eine nat.zahl ist wird die else-anweisung in jedem fall angesteuert. auch fuer "richtige" zahlen. Zeile 34 erklaerung; aufforderung einer "neuen" zahl 
            System.out.println("Zahl: ");                                           
            zahl = in.nextInt();                                                    //einlesen der "neuen" zahl
    
        }
        System.out.println("Die Zahl " + zahl +" liegt auserhalb der zulaessigen Werte. Das Programm endet an dieser Stelle!"); //sprung wenn zahl <=0 => programm endet
    }
}

wie gesagt, überflüssig^^
 
Zuletzt bearbeitet von einem Moderator:

esteban_1986

Mitglied
Nicht überflüssig, weil wenn die beiden Zeilen entfallen, springt das Programm nicht in die Whileschleife zurück sondern gibt Ende aus.Ende soll erst ausgegeben werden wenn eine nicht NAT. Zahl eingegeben wird.
Deswegen is meine lösung richtig
Bis dann
 

Ähnliche Java Themen

Neue Themen


Oben