Methoden while Anweisung

Also hab ich jetzt das richtig verstanden, ein User gibt eine Zahl ein.
Diese Zahl soll dann mit einer anderen Zahl mulitpliziert werden?

Ich würde jetzt mir das so überlegen, beim Einlesen (Bitweises Einlesen), sprich sobald eine Ziffer eingelesen wurde, diese sofort mit der Ziffer aus der anderen Zahl zu multiplizieren....
(Bisher liest du eine ganze Zeile ein...)

Hierzu kann man die Scanner klasse nutzen...

Und zur Motivation, Programmieren lernen schafft man auch in kürzerer Zeit, allerdings sollte man sehr visuell arbeiten (Sprich problemfelder immer aufmalen bzw aufschreiben).
 
Zuletzt bearbeitet:
Wenn du keine Arrays willst, nimm Strings. Der Nachteil ist, dass du die Umrechnung von [c]char[/c] auf [c]int[/c] selbst vornehmen misst. Das gibt dann irgendwie sowas:

Java:
        String nummer = "32442454675";
        String gewicht = "12121212121";
        int pziffer = 0;
        for(int i = 0; i < nummer.length(); i++) {
            pziffer += (nummer.charAt(i)-'0') * (gewicht.charAt(i)-'0');
        }
        pziffer %= 11;
        System.out.println(pziffer);

Das Rechnen mod 11 ist geraten, aber üblich bei Prüfziffern (wird z.B. auch be der Elferprobe oder bei der ISBN-Nummer so gemacht) - es kann aber dabei auch 10 herauskommen (bei der ISBN steht dann ein "X").

Du solltest das nicht einfach kopieren, sondern versuchen zu verstehen. Dass du da selber drauf gekommen bist, wird dir (vor allem wegen des [c]charAt[/c]-Tricks) allerdings kaum jemand abnehmen.
 
Zuletzt bearbeitet:
Genau diese methode brauche ich!
Das ist sie!
Ich weiss nicht wie ich sie anwenden soll.

Was ich in der zwischenzeit hingekriegt habe:
Java:
import java.util.Scanner;
class CheckID{
	public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int idnum = scan.nextInt();
String string = String.valueOf(idnum);
int n1, n2, n3, n4, n5, n6, n7, n8, n9, sum;
n1 = string.charAt(1) * 1;
n2 = string.charAt(2) * 2;
n3 = string.charAt(3) * 1;
n4 = string.charAt(4) * 2;
n5 = string.charAt(5) * 1;
n6 = string.charAt(6) * 2;
n7 = string.charAt(7) * 1;
n8 = string.charAt(8) * 2;
n9 = string.charAt(9) * 1;

if (n1>9) n1=(n1%10)+1;
if (n2>9) n2=(n2%10)+1; 
if (n3>9) n3=(n3%10)+1; 
if (n4>9) n4=(n4%10)+1; 
if (n5>9) n5=(n5%10)+1; 
if (n6>9) n6=(n6%10)+1; 
if (n7>9) n7=(n7%10)+1; 
if (n8>9) n8=(n8%10)+1; 
if (n9>9) n9=(n9%10)+1;

sum = n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9;
sum = sum%10;
System.out.println(sum);

if (sum>0){
	System.out.println("Ausweis falsch"); 
	}
}
}
Ist mein Code einigermassen richtig?
Es ist falsch aber geht es irgendwie in diese Richtung?
Was ich mir gedacht habe ist,
dass ich es in einem String umwandlen muss, damit er ueberhaupt die LAenge erkennen kann, so dass wenn der benutzer weniger als 9 ziffern eingibt es nullen am ende der zahl hinzufuegt.
Durch die charAt methode greife ich dann auf eine bestimmte ziffer in der int variable die zu string konvertiert wurde.
Was falsch ist ist, dass es falsche ergebnisse bei der charAt methode ausgibt wenn sie multipliziert ist.

Diese Methode werde ich mir jetzt genauer ansehen.
 
Zuletzt bearbeitet:
Dieser Code hier ist nah dran.
Jedoch wurden hier glaube ich eigene objekte und methoden verwendet.

Java:
function checkidnum(idnum){
 while (idnum.length<9){
 idnum="0"+idnum; 
}
 idnum1=idnum.substr(0,1)*1; 
idnum2=idnum.substr(1,1)*2; 
idnum3=idnum.substr(2,1)*1;
 idnum4=idnum.substr(3,1)*2; 
idnum5=idnum.substr(4,1)*1;
 idnum6=idnum.substr(5,1)*2;
 idnum7=idnum.substr(6,1)*1;
 idnum8=idnum.substr(7,1)*2;
 idnum9=idnum.substr(8,1)*1;
 if (idnum1>9)
 idnum1=(idnum1%10)+1
 if (idnum2>9) idnum2=(idnum2%10)+1
 if (idnum3>9) idnum3=(idnum3%10)+1
 if (idnum4>9) idnum4=(idnum4%10)+1 if (idnum5>9) idnum5=(idnum5%10)+1 if (idnum6>9) idnum6=(idnum6%10)+1 if (idnum7>9) idnum7=(idnum7%10)+1 
if (idnum8>9) idnum8=(idnum8%10)+1 
if (idnum9>9) idnum9=(idnum9%10)+1 
var sumval=idnum1+idnum2+idnum3+idnum4+idnum5+idnum6+idnum7+idnum8+idnum9;
 sumval=sumval%10
 if (sumval>0){
 alert("תעודת הזהות שגוייה"); 
return false; }
 return true; }
Das ist ziemlich nah an das was ich suche
 
Das ist Java Script ;D 😱

In welchem Rahmen machst du das hier?


Dir fehlen weiterhin Grundlegende Elementare Eigenschaften um Programmieren zu können.
 
Du solltest dir erstmal angucken welches Problem du lösen willst und welche Datenstrukturen du dafür verwenden kannst.

int, String...

und welche Möglichkeiten dir die einzelnen Datenstrukturen bieten. Wie es bisher aussieht versuchst du mittels Codeschnippsel zu einem Ziel zu kommen, aber das ist ja nicht der Sinn des Programmierens.

Hilfreiche Lektüre dafür ist die offizielle Java Api (Java Platform SE 6) und Java ist eine Insel (Galileo Computing :: Java ist auch eine Insel - index).

Und so wie ich das sehe sollst du ja das Problem (die Aufgabe) mittels Schleifen lösen, also würde ich mir mal angucken wo man Wiederholungen erkennen kann und wie diese aussehen.

for, while, do-while und for each schleifen sollten dir hier durch aus helfen.

Und was dir eventuell auch erstmal hilft ist, dass man nicht mit Usereingaben arbeitet sondern mit selbst Festgelegten werten, dies hilft dir dann dein Programm währrend der Laufzeit zu verstehen.

@Landei:
Man kann auch einfach mittels Modulo die einzelnen Ziffern bekommen 🙂

Java:
public static void rev(int n){
                System.out.print(n%10);
                       if(n>9)
                             rev(n/10);
          }
 
Java:
public class test {
	private static int personummer = 352041879;
	private static int prufsum = 121212121;
	private static int erg = 0;
	
	
	public static void main(String[] args){
		System.out.printf("%s %d %s %d %s %d\n", "Zwischenergebnis: ", erg, "Aktuelle Ziffer im Perso: ", rev(personummer), "Aktuelle Ziffer der Prüfsumme: ", rev(prufsum));
		while(personummer > 9 && prufsum > 9){
			erg += (rev(personummer) * rev(prufsum));
			personummer /= 10;
			prufsum /= 10;
			System.out.printf("%s %d %s %d %s %d\n", "Zwischenergebnis: ", erg, "Aktuelle Ziffer im Perso: ", rev(personummer), "Aktuelle Ziffer der Prüfsumme: ", rev(prufsum));
		}
		
		System.out.println("Endergebnis: " + erg);
		
	}
	
	public static int rev(int n)
	{
			return n%10;
	}
}

So könnte man das ohne groß konvertieren machen 😉
 
Sorry, scheint so als haette ich was falsches gefunden.
Da habt ihr recht.
es soll mittels einer for schleife erfolgen.
die for schleife greift auf einzelne ziffern mittels dem % operator und multipliziert sie dann mit 121212121 die ebenfalls in einer variable sind.
Jede Nummer die nach dieser multiplikation zweistellig ist, wird mit nummer %10 + 1;
zu einer einstelligen zahl gemacht,
bevor alle zahlen addiert werden.
ist die summe 10, 20, 30 etc. ist die nummer richtig.
Vielen Dank fuer eure Hilfe.
Sry bin sehr durcheinander gewesen.
 
Zuletzt bearbeitet:
es soll mittels einer for schleife erfolgen.
die for schleife greift auf einzelne ziffern mittels dem % operator und multipliziert sie dann mit 121212121 die ebenfalls in einer variable sind.

Eine for-Schleife ist hier glaube ich nicht so sinnvoll (Laufzeit?!). Bei einer for-Schleife musst du zwangsläufig immer durchlaufen und zwar n mal. Wohingegen eine while-Schleife nur so lange durchläuft bis ihre Bedingung erfüllt ist. Hast du also z.B. einen Integer mit 9 Ziffern und einen mit 7 (ich weiß der mit sieben wird aufgefüllt wobei das bei der Prüfsumme keinen Sinn macht da 0 * irgendwas 0 ergibt und daher vernachlässigt werden kann) würde bei einer "statischen" for-Schleife (i < 9) dir die for-Schleife sogar eine Exception werfen.


Jede Nummer die nach dieser multiplikation zweistellig ist, wird mit nummer %10 + 1;
zu einer einstelligen zahl gemacht,
bevor alle zahlen addiert werden.
ist die summe 10, 20, 30 etc. ist die nummer richtig.

Verstehe jetzt grade noch nicht den Sinn von n %10 + 1.

z.B. 89 % 10 + 1 = 10 (also zweistellig)

Bitte überlege dir erst was du genau machen willst, ja das hat etwas mit denken und ggf. schreiben mit Papir und Stift zu tun. Sonst wrist du dich immer häufiger verzetteln. Ich meine bei so kurzen Programmschnippseln ist der Fehler noch leicht zu finden, aber bei einer komplexeren/längeren Programmieraufgabe ist eine Struktur (Klassendiagramm(UML)) wichtig und dann solltest du auch wissen was du genau mit der Methode erreichen willst, vielleicht vormodellieren (Pseudocode). Erst wenn du damit alles erreicht hast was du dir vorgestellt hast, solltest du anfangen zu Programmieren.

BTW: http://www.java-forum.org/mathematik/136288-shannon-theorem.html
Vielleicht kann einer der hier mitliest mir helfen... wäre extrem cool... weil mein Projekt dadurch hängt 😀
 
@GuestfortheRest: Eine for schleife ist genau das gleiche wie ene while Schleife, außer du benutzt die do - while dann kannst du sagen da ist ein Unterschied aber ansonsten sehe ich da keinen gravierenden.

Jede while Schleife kannst du durch eine for Schleife ersetzen oder andersrum.

JavaEE7GmbH
 
Eine for schleife ist genau das gleiche wie ene while Schleife, außer du benutzt die do - while dann kannst du sagen da ist ein Unterschied aber ansonsten sehe ich da keinen gravierenden.

kein Unterschied zwischen for und while ? sehe ich anders:
for Schleife: läuft solange bis ein bestimmtes Ereignis erreicht ist, z.B. eine Zahl hochgezählt ist
--> Hierbei kann man die Anzahl der durchläufe bestimmen

while Schleife: läuft solange bis ein Ereignis eingetreten is, z.b bis ein Array leer ist
--> hierbei kann man die Anzahl der durchläufe in der Schleife nicht festlegen, wenn man also das Array nicht kennt, weiß man nicht wie oft die Schleife läuft


Gruß
 
kein Unterschied zwischen for und while ? sehe ich anders:
for Schleife: läuft solange bis ein bestimmtes Ereignis erreicht ist, z.B. eine Zahl hochgezählt ist
--> Hierbei kann man die Anzahl der durchläufe bestimmen

while Schleife: läuft solange bis ein Ereignis eingetreten is, z.b bis ein Array leer ist
--> hierbei kann man die Anzahl der durchläufe in der Schleife nicht festlegen, wenn man also das Array nicht kennt, weiß man nicht wie oft die Schleife läuft

Ähm....
Java:
int[] array =...
int i = 0;
while (i < array.length) {
   System.out.println(array[i++]);
}

for- und while-Schleifen sind von der Ausdrucksfähigkeit völlig äquivalent. Zeige mir ein Beispiel, wo du etwas mit der jeweils anderen Schleifenart nicht ausdrücken könntest.
 
Zuletzt bearbeitet:
geht auch, ich weiß,
hab ja nicht gesagt dass man die beiden Schleifeninhalte jeweils nicht in die andere packen kann

ich wollte nur sagen, dass zwischen for und while schon ein Unterschied besteht
 
Java:
int[] array =...
int i = 0;
while (i < array.length) {
   System.out.println(array[i++]);
}

array.length ... = "vordeginierte länge";

Beispiel für einen Unterschied:
while(InetAddress.isReachable()){
..
}

natürlich kannst du jede for-Schleife in eine while-Schleife umbauen... aber andersrum ist das nicht so simpel...

Mit anderen Worten, sobald man irgendwelche boolschen überprüfungen hat ist eine for-schleife unzweckmäßig, meiner Meinung nach.
 
Zuletzt bearbeitet:
Java:
for(;InetAddress.isReachable();){

}

? ^^
Jede Schleife prüft was boolsches, ich kann mir auch kein Beispiel vorstellen in dem selbst eine rekursive Schleife keine boolean als Bedingung nutzt. Ich denke jede Schleife ist mit einer anderen austauschbar, wichtig ist nur die schönste Schleife für die Aufgabe auszuwählen. Falls man do mit while austauscht wiederholt sich oft eine Abfrage vor der eigendlichen Schleife. Nicht unmöglich, aber imo hässlich. Falls man while mit do austauscht braucht man eventuell sogar noch ein if davor oder herum.
 
Mir gefällt die am besten:

Orange_Schleife_161494.jpg
 
kein Unterschied zwischen for und while ? sehe ich anders:
for Schleife: läuft solange bis ein bestimmtes Ereignis erreicht ist, z.B. eine Zahl hochgezählt ist
--> Hierbei kann man die Anzahl der durchläufe bestimmen

while Schleife: läuft solange bis ein Ereignis eingetreten is, z.b bis ein Array leer ist
--> hierbei kann man die Anzahl der durchläufe in der Schleife nicht festlegen, wenn man also das Array nicht kennt, weiß man nicht wie oft die Schleife läuft


Gruß

Dass ein Unterschied vom Aussehen bestimmt ist schon klar 😀

Die Funktionsweise ist dennoch genau die gleiche, wie gesagt.
Reine Gewöhnungssache was man lieber nimmt oder was in dem Moment übersichtlicher ist.
 
OT: Zume Thema lernen: Java lernt man sicher nicht daruch das man in Google gefunden JavaScript Code in ein Java Forum postet und fragt ob das richtig ist ;-)
 
Also eigentlich ist
Java:
for (a; b; c) {
    // ...
}
nichts anderes als
Java:
{
    a;
    while (b) {
        // ...
        c;
    }
}

Edit: ...wobei ich bewusst einen Block [c]{}[/c] um die while machte, denn z.B. Variablendeklarationen in a können ausserhalb der Schleife nicht gesehen werden.
 
außer du benutzt die do - while dann kannst du sagen da ist ein Unterschied

Java:
bool sollAbbrechen = false;
for(;true;)
{
   .... // hier kommt natürlich code hin, welcher dann auch irgendwann sollAbbrechen auf true setzt ;)
   if(sollAbbrechen)
   {
      ...
      break;
   }
}
 
Zuletzt bearbeitet von einem Moderator:
hallo nochmal.
Von wikipedia :
das ist das offizielle Programm.
aber das hat irgendwie objekte
Da bin ich noch nicht wirklich angekommen.
Ich versuche es gerade zu verstehen und in ein einfacheres programm umzuwandeln.
Vielen Dank fuer eure Hilfe nochmals
Ich mag while schleifen viel mehr, doch muss ich gerade die for schleife erlernen.

public static int checkDigit(int num){
int digit, sum=0;
for (int i = 1; i <= 8; i++)
{
digit = num % 10;
if (i % 2 != 0) digit *= 2;
sum += digit % 10 + digit / 10;
num = num / 10;
}
int checkdigit = (1 + sum / 10) * 10 - sum;
checkdigit = checkdigit % 10;
return checkdigit;
}

EDIT:
Hier ist das was ich hingekriegt habe:
Java:
import java.util.Scanner;	
class CheckID{
	public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int digit, num, checkdigit, sum = 0;
	num = scan.nextInt();
	for (int i = 1; i <= 8; i++){
	digit = num % 10;
	if(i % 2 != 0) digit *= 2;
	sum += digit % 10 + digit /10;
	num = num + 10;
	}
	checkdigit = (1 + sum / 10) * 10 - sum;
	checkdigit = checkdigit % 10;
	if(checkdigit == 0)
		System.out.println("Correct ID");
	else
		System.out.println("wrong id");
	
	}
}
Doch es stimmt glaube ich etwas immer noch nicht.
Jede Passnummer endet mit 0.
Wenn ich 888888888 eingebe erkennt er das als eine richtige ausweisnummer.
Tja immerhin bin ich der loesung nah
 
Zuletzt bearbeitet:
Wikipedia solltest du nicht nutzen um eine Programmiersprache zu lernen...

Java:
public static int checkDigit(int num){
        /*
         * Hier werden primitive Datentypen initialisiert (Typ: Integer)
         */
        int digit, sum=0;
        /*
         * For( Initialisierung eines Laufindiezes ; Boolsche überprüfung ; Laufindiezes verändern )
         * Hier wird ein Integer i auf 1 gesetzt, die Bedingung (Boolsche Überprüfung) ist, dass i       
         * kleiner gleich 8 ist, danach soll das i (nach Bearbeitung des Blocks) um 1 erhöht werden.
         */
        for (int i = 1; i <= 8; i++)
        {
               //Zuweisung und Rechnung
               digit = num % 10;
                   //if(Bedingung: i ist ungrade) Zuweisung und Rechnung
                   if (i % 2 != 0) digit *= 2;
               //Zuweisung und Rechnung
               sum += digit % 10 + digit / 10;
               num = num / 10;
        }
        //Initialisierung, Zuweisung und Rechnung
        int checkdigit = (1 + sum / 10) * 10 - sum;
        //Zuweisung und Rechnung
        checkdigit = checkdigit % 10;
        //Wirft ein Integerwert zurück
        return checkdigit;
}

Hierbei handelt es sich um eine Methode die auf primitive Datentypen zurückgreift (Es ist keine Klasse und auch keine ausführbare Methode!!!!).

For-Schleifen Lernen und Verstehen:

Beispiel:
Java:
...
      int[] ziffernblock = new int[]{1,2,3,4,5,6,7,8,9,0};   
      int n = 4;     //sollte verändert werden -> Spielraum
      for(int i = 0; i < n; i++){
         System.out.println("Das ist i: " + i);
         System.out.println("Das ist die i-te Stelle im Ziffernblock: " + ziffernblock[i]);
      }
...

Immer erst mit dem einfachsten Problem anfangen (Vollständige-Induktions-Prinzip), sprich wenn etwas mit n funktioniert und dann funktionierts auch mit einem anderen n.
 
Zuletzt bearbeitet:
Ich benutze wikipedia ja nicht.
Ich versuche aus dem Code schlau zu werden.
Ich denke nach was jeder code macht.
Guck oben, ich habe es so geaendert dass es ausfuehrbar ist.
je mehr code ich lese desto schlauer werde ich(vielleicht);
Ich habe schon so ziemlich alle moeglichen codes gesehen.
 

Zurück
Oben