Zahlenausgabe Problem

Stangl Puch

Mitglied
Hey Leute, ich bin gerade dabei für die Schule zu lernen und ich soll ein Programm programmieren das alle Zahlen von 1 bis 100 in 10er Reihen ausgibt und jede Zahl bei der, der Einer oder Zehner 7 ist soll als * geschrieben werden. Außerdem soll jede Zahl die durch 7 teilbar ist auch ein * sein.

Bis jetzt habe ich es geschafft alle Zahlen von 1 bis 100 in 10er Reihen auszugeben und die Zahlen die als Einer 7 enthalten werden als Stern geschrieben.

Meine Frage: Wie mache ich es dass auch alle durch-7-teilbaren Zahlen als Stern geschrieben werden und die in denen der Zehner 7 ist auch ein * steht.

Mein Programm sieht bisher so aus:


Java:
public class Zahlenausgabe{

	public static void main(String[]args){

		int i=1;
		int n=100;


		while(i<=n){


			System.out.print(+i+" ");
			i++;
			System.out.print(+i+" " );
			i++;
			System.out.print(+i+" ");
			i++;
			System.out.print(+i+" ");
			i++;
			System.out.print(+i+" ");
			i++;
			System.out.print(+i+" ");
			i++;
			System.out.print("* ");
			i++;
			System.out.print(+i+" ");
			i++;
			System.out.print(+i+" ");
			i++;
			System.out.println(+i+" ");
			i++;

				
			}


		
		}

	}

}


Hoffe um Hilfe, jetzt schon mal Danke 😉


mfg
 
Du kannst einfach prüfen ob i durch 7 glatt teilbar ist mit i % 7 == 0.
Das tust du einfach in eine if-Anweisung und zum zweiten Problem:
zwischen 1 und 100 hat ja nur die 70er Reihe die 7 als zehner 😀

und noch ein kleiner Tipp:
ich glaube mit einer for-Schleife wäre es schöner.
 
Zuletzt bearbeitet:
Ja das weiß ich auch schon, aber wenn ich das so mache ersetzt es ja nicht die anderen sonder es schreibt einfach nur einen Stern und den Rest trotzdem normal. Theoretisch müsste ich ja vor jedem System.out.print diese If-Anweisung machen oder?
 
Nein du brauchst nur eine if-else Anweisung. Und diese ganzen "Syso" und i++ sind überflüssig! Einmal in dem Schleifendurchlauf i++ machen und zwei unterschiedliche "Syso" in if.
Überlege dir so was =>

schleife(1 bis 100){
if(glatt durch 7) Syso(*);
else Syso(Zahl);
n++;
}

Versuche das ganze geschickt zu lösen, ist eine schöne Übung!
 
Versuch einmal diese Struktur zu verstehen - die kann später noch vereinfacht werden, aber im Moment zeigt sie, was du machen solltest

Die drei Prozeduren sind nur als Pseudocode zu verstehen - die ersetzen wir nach und nach durch die richtge Prüfung der Zahl i

Weiss du schon, wie eine davon implementiert werden könnte?

Java:
public class Zahlenausgabe {

	public static void main(String[] args) {
		final int n = 100;
		for(int i=1; i<n; i++) {
			if (zahlDurchSiebenteilbar(i)) {
				System.out.println("*");

			} else if (einerStelleGleichSieben(i)) {
				System.out.println("*");

			} else if (zehnerStellegleichSieben(i)) {
				System.out.println("*");

			} else {
				System.out.println(i);
			}
		}
	}

	private static boolean zehnerStellegleichSieben(int i) {
		// TODO Auto-generated method stub
		return false;
	}

	private static boolean einerStelleGleichSieben(int i) {
		// TODO Auto-generated method stub
		return false;
	}

	private static boolean zahlDurchSiebenteilbar(int i) {
		// TODO Auto-generated method stub
		return false;
	}

}
 
Wenn ich bemerke, dass du auf der richtigen Spur bist - sage ich dir wie ich es gelöst habe ;-)

1
2
3
4
5
6
*
8
9
10
11
12
13
*
15
16
*
18
19
*
*
22
23
24
25
26
*
*
29
 
Andi_CH es kann sein das ich mich täusche aber die Lösung sollte so Aussehen,
wenn ich die Aufgabe richtig verstehe:

1 2 3 4 5 6 * 8 9 10
11 12 13 * 15 16 17 18 19 20
* 22 23 24 25 26 27 * 29 30
31 32 33 34 * 36 37 38 39 40
41 * 43 44 45 46 47 48 * 50
51 52 53 54 55 * 57 58 59 60
61 62 * 64 65 66 67 68 69 *
71 72 73 74 75 76 * 78 79 80
81 82 83 * 85 86 87 88 89 90
* 92 93 94 95 96 97 * 99 100

???:L
 
Nein deine ist sicher falsch. Da kommt ja noch 17 raus und alle 70iger auch

Das darf nicht sein

und ob die Zahlen untereinander oder nebeneinader stehen, macht ja wohl keinen grossen Unterschied.
Wenn das sein muss, brauche ich etwa 30 Sekunden die println durch print zu ersetzen und immer wenn i modul 10 == 0 ist ein println hinterher zu jagen.

Ach und wenn wir schon bei Kosmetik sind 😀
Bitte die Werte schön auf so viele Felder verteilen, wie die längste der Zahlen braucht (aber nicht hard coded bitte 🙂)
 
Zuletzt bearbeitet:
Habs schon geschafft 😉

Zwar nicht durch eure Lösungen aber ich habe einfach vor jeder Sys-print Anweisung eine If Anweisung gemacht mit i%10==7||i/10%10==7 und dann einfach System.out.print("*");

Das wars 😉

mich würde interessieren wie vladimir das meint, könntest du mir bitte die Lösung deiner Methode zeigen?
 
Andi Du machst bei 20 auch ein * , ist das richtig? Ich meine "Nicht richtig!"
Ich poste mal meine Lösung:
Java:
//Als 10-ner Reihen mit Sternen
  for(int i=1;i<=100;i++){
    if((i%7)==0 || (i%10)== 7 || i/10%70==7) System.out.print("* ");
    else System.out.print(i+" ");
    if((i%10)==0) System.out.println("");
  }

Bitte um Verbesserungen!
Die Ausgabe noch dazu:

1 2 3 4 5 6 * 8 9 10
11 12 13 * 15 16 * 18 19 20
* 22 23 24 25 26 * * 29 30
31 32 33 34 * 36 * 38 39 40
41 * 43 44 45 46 * 48 * 50
51 52 53 54 55 * * 58 59 60
61 62 * 64 65 66 * 68 69 *
* * * * * * * * * 80
81 82 83 * 85 86 * 88 89 90
* 92 93 94 95 96 * * 99 100
 
Zuletzt bearbeitet:
Ich warne dich vor - die ist überhaupt nicht optimiert

Ich hoffe nur du hast bemerkt dass du nur zwei System.out Zeilen brauchst - als andere ist sehr wartungsunfreundlich!


Die Funktionen sind alles andere als optimiert! (Also: Hinweise wie "einerStelleGleichSieben() kann man kompakter schreiben" sind unnötig 😀 das weiss ich auch)

Java:
public class Zahlenausgabe {

	public static void main(String[] args) {
		final int n = 100;
		for(int i=1; i<n; i++) {
			if (zahlDurchSiebenTeilbar(i) || 
			   einerStelleGleichSieben(i) || 
			   zehnerStellegleichSieben(i)) 
			{
				System.out.println("*");
			} else {
				System.out.println(i);
			}
		}
	}

	private static boolean zehnerStellegleichSieben(int i) {
		if (i<10) return false;
		return ((i/10)%7) == 0;
	}

	private static boolean einerStelleGleichSieben(int i) {
		int x;
		if (i>10)
			x = i%10;
		else
			x = i;
		boolean retVal = x%7==0;
		return retVal;
	}

	private static boolean zahlDurchSiebenTeilbar(int i) {
		return i%7==0;
	}
}
 
Zuletzt bearbeitet:
So geht es natürlich auch ;-)
Java:
private static boolean einerStelleGleichSieben(int i) {
	return ((i%10)%7)==0;
}

Selbsverständlich können die Funktionsaufrufe auch durch den boolean Ausdruck ersetzt werden.
die Funktionen sind ja nur drin weil ich dir Pseudocode liefern wollte.

Falls dir die Formatierung der Ausgabe nicht gefällt zeige ich dir auch das noch
 
Zuletzt bearbeitet:
Andi, deine Lösung sieht ja schon mal sehr gut aus, jedoch arbeite ich jetzt in der Schule seit 2 Wochen mit Java und habe ehrlich gesagt keine Ahnung was ein private static boolean ist usw. 🙂

Trotzdem danke 😉
 
private niemand ausserhalb der Klasse sieht das. Du kannst das im Moment noch weglassen -> kommt schon noch.

static muss da stehen (wie beim Main auch) schreib es hin. Auch das kommt noch
(Wenn es nicht da steht kann die Funktion nicht ganz so einfach aufgerufen werden)

boolean heisst dass meine Funktion einen boolean Wert (true - false) zurück gibt
(das macht i%10%7 auch, denn sonst könnte if(i%10%7) nichts damit anfangen)

Funktionen schreibt man, wenn man einem Stück Code einen Namen geben will. Der Code wird lesbarer

Java:
if(i%10%7)  //ist nicht so gut lesbar wie 
{
}
if(einerstelleDurchSeibenTeilbar(i))
{
}

oder wenn man denselben Code an mehr als einer Stelle braucht.


Mein Algorithmus hat noch einen unschönen Nebeneffekt:
Alle mehrfachen von 10 werden etwas seltsam behandelt

die Einerstelle ist 0
0%7 ist 0 -> Das heisst 0 ist durch 7 ohne Rest teilbar, was mathematisch ja auch stimmt.

Das ist jetzt eine Definitionsfrage ob 10, 20 etc ausgegeben werden muss oder nicht.
 
Zuletzt bearbeitet:
Andi Du machst bei 20 auch ein * , ist das richtig? Ich meine "Nicht richtig!"
Ich poste mal meine Lösung:
Java:
//Als 10-ner Reihen mit Sternen
  for(int i=1;i<=100;i++){
    if((i%7)==0 || (i%10)== 7 || i/10%70==7) System.out.print("* ");
    else System.out.print(i+" ");
    if((i%10)==0) System.out.println("");
  }


(i%10)== 7 -- ist ok ich habe (i%10)%7==0 deines ist besser, denn meines befindet dass 0 auf durch 7 teilbar ist. i%10 Kennst du modulo? % ist der modulo Operator. Der bringt im Fall von 10 die Einerstelle.

i/10%70==7 -- was soll %70? Das ist absolut unnötig. Du teilst die int-Zahl / 10 (dazu musst du wissen dass 79/10 = 7 gibt. (Java macht das bei int Zahlen so) dann dann prüfst du ob es 7 ist -> ok
i/10 == 7 reicht

Wenn du immer noch 10 Zeilen mit System.out drin hast, machst du einen Fehler - ich hoffe du hast das korrigert

Hier mein Code bei dem 20 auch raus kommt
Java:
public class Zahlenausgabe {

	public static void main(String[] args) {
		final int n = 100;
		for(int i=1; i<n; i++) {
			if (((i/10) == 7) || (i%10 == 7) || (i%7==0))
			{
				System.out.print("* ");
			} else {
				System.out.print(i+ " ");
			}
			if ((i%10==0)&&(i>0)) System.out.println("");
		}
	}
}


Allerdings finde ich diese Variante besser lesbar
Java:
package com.javaforum;

public class Zahlenausgabe {

	public static void main(String[] args) {
		final int n = 100;
		for(int i=1; i<n; i++) {
			if (zahlDurchSiebenTeilbar(i) ||
				einerStelleGleichSieben(i) ||
				zehnerStelleGleichSieben(i)) 
			{
				System.out.print("* ");
			} else {
				System.out.print(i+ " ");
			}
			if ((i%10==0)&&(i>0)) System.out.println("");
		}
	}

	private static boolean zehnerStelleGleichSieben(int i) {
		return (i/10) == 7;
	}

	private static boolean einerStelleGleichSieben(int i) {
		return i%10 == 7;
	}

	private static boolean zahlDurchSiebenTeilbar(int i) {
		return i%7==0;
	}
}
 

Zurück
Oben