# queersumme & teilen



## esteban_1986 (11. Nov 2010)

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"


```
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");
		}
	}
```


----------



## Gast2 (11. Nov 2010)

> ich kenne auch das problem weis aber nicht genau wie ich es richtig machen kann


Dann solltest du uns deine Erkenntniss doch mal mitteilen 

PS:
Java tags benutzen.


----------



## Andi_CH (11. Nov 2010)

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 (11. Nov 2010)

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


----------



## bone2 (11. Nov 2010)

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


```
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?


----------



## Andi_CH (11. Nov 2010)

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]



```
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");
	}
}
```


----------



## bone2 (11. Nov 2010)

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 (11. Nov 2010)

bone2 hat gesagt.:


> 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.



esteban_1986 hat gesagt.:


> 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
> ...



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


----------



## Andi_CH (11. Nov 2010)

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.


```
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");
	}
}
```


----------



## bone2 (11. Nov 2010)

oh ich habn lesefehler bei der zweiten while schleife, das erklärt einiges^^


----------



## esteban_1986 (11. Nov 2010)

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.


----------



## bone2 (11. Nov 2010)

//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:

```
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);
    }
```


----------



## Andi_CH (11. Nov 2010)

bone2 hat gesagt.:


> zahl = zahl+1;
> ist in andis neuer lösung nur überflüssig^^



Stimmt - dem habe ich keine Beachtung geschenkt, habe aber soeben mein letztes Posting noch editiert und auch das Hauptprogramm besser geschrieben.

Du siehst jetzt sicher auch, dass das Programm mit einer Funktion viel übersichtlicher wird.


----------



## bone2 (11. Nov 2010)

edit is cool 


```
return true;
```
 ist überflüssig^^


----------



## Andi_CH (11. Nov 2010)

esteban_1986 hat gesagt.:


> 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...


----------



## esteban_1986 (11. Nov 2010)

ich liebe meine klammern, die sind viel logischer!


----------



## bone2 (11. Nov 2010)

die klammern einzurücken ist nicht logisch^^

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


----------



## Andi_CH (11. Nov 2010)

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

[EDIT]
Jetzt vertstehe ich

```
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 ---


----------



## Andi_CH (11. Nov 2010)

bone2 hat gesagt.:


> edit is cool
> 
> 
> ```
> ...



Wo du recht hast, hast du recht 

```
return (quer == 7 || rest == 0);
```
so sollte es aussehen ...


----------



## bone2 (11. Nov 2010)

!!! und feierabend
is der thread dann shcon als erledigt markiert?^^


----------



## esteban_1986 (11. Nov 2010)

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 (12. Nov 2010)

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


----------



## esteban_1986 (12. Nov 2010)

esteban_1986 hat gesagt.:


> 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


----------



## bone2 (12. Nov 2010)

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


----------



## Landei (12. Nov 2010)

"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 (12. Nov 2010)

zahl=zahl+1 braucht man damit die while noch mal angelaufen wird um dann in der elseanweisung zu enden.

```
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.


----------



## esteban_1986 (12. Nov 2010)

Landei hat gesagt.:


> "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")



wie geil haha, seh ich auch grad


----------



## bone2 (15. Nov 2010)

```
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^^


----------



## esteban_1986 (17. Nov 2010)

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


----------



## bone2 (17. Nov 2010)

probier meine lösung aus, überflüssig wenn man das else weglässt.


----------



## esteban_1986 (18. Nov 2010)

okok


----------

