Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo,
ich verzweifle gerade bei meiner informatik hausaufgabe...
Und zwar ist unser thema gerade schleifen und wir sollen mit den schleifen 7 Nummern lösen bei 3 komme ich nicht weiter:
4. Vielfaches
Erstelle ein Programm Vielfache. Dabei sollen die ersten 20 Vielfachen einer Zahl ausgegeben
werden, die der Benutzer eingeben kann.
5. Aufgabe
Die Fakultät einer natürlichen Zahl n (geschrieben n!) ist definiert als das Produkt aller natürlichen
Zahlen, die kleiner oder gleich n sind, also z.B.: 5! = 5*4*3*2*1
Schreibe ein Programm Fakultaet, das die Fakultät einer eingegebenen Zahl ausgibt. Realisiere es
einmal mit der for-schleife, einmal mit der while-Schleife.
6. Aufgabe
Von einer natürlichen Zahl n soll festgestellt werden, ob sie eine Primzahl ist. Ein einfaches –
wenngleich ineffiktives – Verfahren ist es, die Zahl durch die Zahlen durch 2, 3, ... n zu teilen
und zu überprüfen, ob dabei der Rest einmal Null ist. Entwickle ein Programm Primzahltest.
Könnt ihr mir bitte helfen? Ich habe es versucht doch ich schaffe es einfach nicht!
zu feiste, was bedeutet "long"? das hatten wir noch nicht, kannst du bitte eins ohne long machen? wir hatten bis jetzt nur int und double gehabt und schleifen das wars
zu feiste, was bedeutet "long"? das hatten wir noch nicht, kannst du bitte eins ohne long machen? wir hatten bis jetzt nur int und double gehabt und schleifen das wars
6. :
mit Math.sqrt(c) zieht man die Wurzel aus der Zahl c.
Das mach ich weil ich ja die Zahlen die über Wurzel-c nicht prüfen muss.
Java:
boolean value = true;
public primzahl(int c)
{ double b = Math.sqrt(c);
for(int i=2;i<=b;i++)
{
if( (c % i) == 0 )
{ value = false; }
}
if(value == false ^ c == 2)
{ System.out.println("Die Zahl " + c + " ist keine Primzahl!");}
else
{System.out.println("Die Zahl " + c + " ist eine Primzahl!");}
}
dankeschön hast mir sehr geholfen!! es gibt noch eine zusatzaufgabe die ich gerne machen würde:
Zusatzaufgabe: Simulation einer Population
In einem Teich leben anfangs A = 50 Karpfen. Platz ist für höchstens H = 350 vorhanden. Die Forellen
vermehren sich jährlich mit einer Rate von 6% der Differenz zwischen Höchstbestand H und
aktuellem Bestand A. Wie entwickelt sich die Population?
a) ohne äußere Einwirkungen
b) wenn am Ende jedes Jahres 20% des Bestandes entnommen werden?
Schreibe dazu ein Simulationsprogramm.
Reimherr
bei
a) müsste doch ung. so aussehen das man a mit 50 karpfen bestimmt und h mit 350.
dann zieht man die differenz zwischen h und a, also a = h / a.
Dann muss man a = a*1.06 rechnen. Dies alles in eine schleifen setzen bis a >= 350 ist. Da würde ich noch gerne eine anzahl einbauen, die bestimmt wieviele jahre man braucht bis der teich gefüllt ist. Wie geht das?
b) genau das gleiche bei a nur nach a = a*1.06, muss man a = a*0.80 rechnen. die bedingung wäre wieder bis a >= 350 ist oder a<0 ist, denn ich habe das gefühl, das viel mehr gefischt wird, als das die fische sich wieder regenerieren können. Ist mein gedankenablauf bis jetzt ok?? ich werde mich jetzt hinsetzen und das programm schreiben. Wenn ich fertig bin werde ichs hier posten
erstmal ... bitte java-code-tags nutzen ...
zweitens : Fakultät ist nun wirklich kein name für eine klasse ...
man sollte sowieso auf sonderzeichen in datei- und verzeichnisnamen verzichten um plattform-inkompatibilitäten zu vermeiden
drittens : was fakultät angeht ... die lösung dazu steht bei wikipedia .. einmal als iterator und einmal als recursive ... Rekursion ? Wikipedia bei programmierbeispiel II ... das untere ... ist zwar pseudo-code aber lässt sich leicht nach java übersetzen
jetzt zu deinen ansätzen ...
dein erstes beispiel schlägt schon mal sehr heftige fehler alleine in der reinen mathematik und logik ...
du liest eine zahl ein ... soweit ok
du betritts eine schleife mit DO ... > ich hoffe du kennst den unterschied zwischen while und do-while ...
bei do-while wird die schleife IMMER mindestens EIN MAL ausgeführt ... egal ob die bedingung true oder false liefert
dann speicherst du das ergebnis von x MAL x *also x²* in y ... das hat aber in keinster weise was mit vielfachem zu tun ...
sicher ... if(1 <= input <= 20) ... also input zwischen 1 und 20 *beide mit eingeschlossen* ... dann wird irgendwann mal auch x² dabei sein ... aber ansonsten hat beides nichts weiter mit ein ander zu tun ...
dann auch noch dieses komische while-konstrukt ... also ohne es auszuprobieren ... aber das dürfte zu einem compiler-error führen ... und selbst wenn es irgendwie compiled werden sollte ... dann ist es definitiv NICHT die bedingung die da rein gehört
du musst dir die aufgabe erstmal durch den kopf gehen lassen ...
du sollst ein programm schreiben das die 20 ersten vielfache der eingegeben zahl ausgibt ...
brauchst du erstmal 3 variable : 1) der input 2) den zähler 3) das ergebnis je schleifen durchgang ...
hiervon können wir den dritten gleich wieder streichen da wir das ergebnis ja sofort ausgeben ...
haben wir als ROH-bau schonmal das hier
Java:
public class Vielfaches
{
public static void main(String[] args) { new Vielfaches(); }
public Vielfaches()
{
int input=0, zaehler=1;
}
}
nun kommen wir zur schleife
du willst erreichen das bei jedem durchgang das produkt aus der gleichung "input x zaehler" auf der console ausgegeben wird bis der zähler 20 erreicht hat
gleichzeitig muss aber auch der zähler erhöt werden
daraus folgen also schonmal die formel und die bedingung
ob wir das nun in einer FOR- oder eine WHILE- schleife machen ist egal ... man könnte sich bei der FOR lediglich die expliziete "zaehler" variable sparen ...
aber machen wir es ruhig mal mit WHILE *FOR werd ich drunter schreiben*
Java:
public class Vielfaches
{
public static void main(String[] args) { new Vielfaches(); }
public Vielfaches()
{
int input=0, zaehler=1;
while(zaehler<=20)
{
System.out.println(input*zaehler);
zaehler++;
}
}
}
was jetzt noch fehlt ist das lesen des inputs ...
wir bedienen uns hier einfach mal des java.util.Scanner ... er wird oft in anfänger-tut's genutzt und spart das lästige selbst-schreiben ...
komplett sieht dann dein programm also so aus
Java:
import java.util.Scanner;
public class Vielfaches
{
public static void main(String[] args) { new Vielfaches(); }
public Vielfaches()
{
int input=0, zaehler=1;
System.out.print("Bitte Zahl eingeben : ");
Scanner scanner=new Scanner(System.in);
try { input=scanner.nextInt(); }
catch(Exception e) { e.printStackTrace(); System.exit(1); }
while(zaehler<=20)
{
System.out.println(input*zaehler);
zaehler++;
}
}
}
und das ganze mit FOR sieht so aus
Java:
import java.util.Scanner;
public class Vielfaches
{
public static void main(String[] args) { new Vielfaches(); }
public Vielfaches()
{
int input=0; //zaehler kann hier entfallen da dieser im kopf der FOR-schleife erzeugt wird
System.out.print("Bitte Zahl eingeben : ");
Scanner scanner=new Scanner(System.in);
try { input=scanner.nextInt(); }
catch(Exception e) { e.printStackTrace(); System.exit(1); }
for(int i=1; i<=20; i++)
{
System.out.println(input*i);
}
}
}
zu 5. hab ich bereits gesagt : steht bei wikipedia *das ist die WHILE-variante*
als FOR sähe das in etwa so aus
Java:
public int fakultaet(int input)
{
int fakultaet=1;
for(int faktor=2; faktor<=input; faktor++)
{
fakultaet*=faktor;
}
return fakultaet;
}
außerdem hast du einen schweren fehler im kopf der FOR
for (int zahl=1; zahl == x; zahl++) ... wird entweder garnicht ausgeführt ... nämlich dann wenn du alles andere als 1 eingibst ... oder nur einmal ... nämlich wenn du 1 eingibst ...
hier müsstest du sowas wie <= verwenden ...
und nun zu 6.
du sollst also ermitteln ob die eingegebene zahl eine primzahl ist ...
du hast sogar einen lösungsansatz vorgegeben : testen ob n/2, 3, 4, n-1 einen rest aufweist ... wenn rest 0 ist dann false returnen
und bleiben wir doch mal zum testen bei dieser langsamen methode ...
bauen wir es hier mal wieder als FOR *am while wäre nicht viel anders*
das beispiel von feiste das man die zahlen über sqrt(input) nicht prüfen muss is zwar mathematisch richtig ... aber wir bleiben hier mal aufm boden ...
zusatz
also a = h / a
totaler blödsinn ... h / a heißt h GETEILT DURCH a ...
differenz ist MINUS ...
also h-a ...
Danke!
Jetzt zur zusatzaufgabe, ja du hast recht differenz heißt minus^^ habe es verwechselt
so sieht mein java programm aus für die a):
[Java]public class Fischteich {
public static void main(String[] args) {
double a= 50, h = 350, i = 0;
System.out.println("In einem Teich leben anfangs A = 50 Karpfen. Platz ist für höchstens H = 350 vorhanden. Die Forellen vermehren sich jährlich mit einer Rate von 6% der Differenz zwischen Höchstbestand H und aktuellem Bestand A. Wie entwickelt sich die Population?");
do {
a = h-a;
a = a*1.06;
i++;
}while ( a < 350 );
System.out.println("Es dauert " +i+ " Jahre bis der Teich voll ist");
also erstens : gewöhn dir bitte die sofortige nutzung des DO-while ab ... das macht nur in sehr wenigen fällen sinn wenn man sichergehen will das der schleifen-inhalt mindestens einmal ausgeführt wird ... wenn das nicht 100% notwendig ist reicht ein normales while völlig aus ...
und zweitens : ich versteh nich viel von population ... aber da ja gefragt wird wie sich die population entwickelt und nicht wie lange es dauert bis der teich voll ist denke ich mal das bei jedem schleifen-durchlauf die aktuelle population ausgegeben werden soll ...
und zu b : grob übern daumen gepeilt ist der ansatz soweit erstmal richtig ... nur ist darauf zu achten ob man erst 1.06 und dann 0.8 oder umgekehrt rechnet ... probier am besten mal beides aus und werte die ergebnisse aus ob sie realistisch erscheinen *also der bestand sich irgendwie hält oder anwächst* oder eben nicht so der wahrheit entsprechen *der teich innerhalb kurzer zeit leer ist*
Ich habs neu gemacht, aber jetzt sehen die Ergebnisse seeeehr unrealistisch aus:
Java:
public class Fischteich {
public static void main(String[] args) {
double a= 50, h = 350, i = 0;
System.out.println("In einem Teich leben anfangs A = 50 Karpfen. Platz ist für höchstens H = 350 vorhanden. Die Forellen vermehren sich jährlich mit einer Rate von 6% der Differenz zwischen Höchstbestand H und aktuellem Bestand A. Wie entwickelt sich die Population?");
while ( a < 350 ) {
a = h-a;
a = a*1.06;
i ++;
System.out.println("Die Fischpopulation im " +i+ "ten Jahr beträgt"+ a);
}
}
}
runden ? klar ... aber wozu ... einfach INT anstatt DOUBLE und bei der rechnung einfach a=(int)a*1.06 ... rest macht java selbst ...
und was das unrealistisch angeht : ich glaub du rechnest einfach mit der falschen zahl weiter da du beim zweiten durchgang plötzlich a=318 hast ... und dann im nächsten schritt a=350-318 ... ich glaub du hast hier einfach nur die falsche variable bzw eine zu wenig genommen
es funktioniert danke für eure hilfe!!!
nur noch eine schönheitskorrektur, und zwar wenn ich double durch int ersetze kürzt java eine bestimme zahl immer ab ( ich glaube es war 334) und deshalb läuft mein programm bis ins unendliche.
wie könnte ich es dennoch schaffen das nur gerade zahlen rauskommen?
Java:
public class Fischteich {
public static void main(String[] args) {
double a= 50, h = 350, i = 0;
System.out.println("In einem Teich leben anfangs A = 50 Karpfen. Platz ist für höchstens H = 350 vorhanden. Die Forellen vermehren sich jährlich mit einer Rate von 6% der Differenz zwischen Höchstbestand H und aktuellem Bestand A. Wie entwickelt sich die Population?");
while ( a < 350 ) {
a += (h-a)*0.06;
a += 0.20;
i ++;
System.out.println("Die Fischpopulation im " +i+ "ten Jahr beträgt"+ a);
}
}
}
1. ist es immer noch falsch, da "20% entnommen werden" und nicht "20% bleiben"
2. 5.1724 fische... merkst du was? Warum benutzt du bei Teilaufgabe A integer und bei B plötzlich wieder double?
jetzt habe ich a*=0.80 eingegeben, aber er bleibt bei 67.7 hängen.
und ich hab bei meiner a) double und nicht int benutzt, habe nur gesagt das man mit int gerade zahlen herausbekommen würde, die sich aber ab einer bestimmten zahl nur noch abrunden.
und das Math.ceil() funktioniert nicht bei mir kommt das:
ceil(double) in java.lang.Math cannot be applied to ()
Math.ceil();
^
1 error
Java:
public static void main(String[] args) {
double a= 50, h = 350, i = 0;
System.out.println("In einem Teich leben anfangs A = 50 Karpfen. Platz ist für höchstens H = 350 vorhanden. Die Forellen vermehren sich jährlich mit einer Rate von 6% der Differenz zwischen Höchstbestand H und aktuellem Bestand A. Wie entwickelt sich die Population?");
Math.ceil();
while ( a < 350 ) {
a += (h-a)*0.06;
a *= 0.80;
i ++;
System.out.println("Die Fischpopulation im " +i+ "ten Jahr beträgt"+ a);
}
}
}
y = A * x^1.06 (bzw. 0.8) (das ^ bedeutet hoch, also potenz)
x: zeit (in jahre)
y: anzahl karpfen
A: Startwert (50 Karpfen)
wenn man jetzt wissen will wieviele karpfen nach 1 Jahr ( bzw. 2,3,4,5 .. Jahre) im teich sind
einfach in x die anzahl der jahre einsetzten.
und dann einfach while schleife ( <=350 )
wenn man jetzt genau wissen will wielange es dauert bis genau 350 karpfen drin sind (mit nachkomma stellen) muss man auf x auflösen und für y 350 einsetzten. (logarithmus)
y = A * x^1.06 (bzw. 0.8) (das ^ bedeutet hoch, also potenz)
x: zeit (in jahre)
y: anzahl karpfen
A: Startwert (50 Karpfen)
wenn man jetzt wissen will wieviele karpfen nach 1 Jahr ( bzw. 2,3,4,5 .. Jahre) im teich sind
einfach in x die anzahl der jahre einsetzten.
und dann einfach while schleife ( <=350 )
wenn man jetzt genau wissen will wielange es dauert bis genau 350 karpfen drin sind (mit nachkomma stellen) muss man auf x auflösen und für y 350 einsetzten. (logarithmus)
Ok, die zusatzaufgabe hab ich jetzt. Jetzt wollte ich nochmal kurz die fakultät machen, doch ich bleibe hängen :/
Java:
public class Vielfaches {
public static void main(String[] args) {
int x = 0, y = 0;
System.out.println("Geben Sie ihre Zahl ein");
x = Input.readInt ();
while (x != 1) {
y = x*(x-1);
x--;
System.out.println("Ihr Ergebnis ist: "+y);
}
}
}
anstatt das die zahl höher wird, z.b bei 5 = 20, 60, 120
wird sie niedriger 20,12,6,2
ich hab es jetzt anders gemacht als beim vorherigen post es mir gezeigt wurde, weil ich das return nicht verstanden habe
das return ist lediglich das zurückgeben des ergebnisses wenn du es als funktion aufrufst ...
dierekt inner main
FOR
Java:
public static void main(String[] args)
{
int fakultaet=1;
int input=(new Scanner(System.in)).nextInt();
for(int faktor=2; faktor<=input; faktor++)
{
fakultaet*=faktor;
}
System.out.println(fakultaet);
}
WHILE *nach wikipedia-pseudo-code*
Java:
public static void main(String[] args)
{
int fakultaet=1;
int faktor=2;
int input=(new Scanner(System.in)).nextInt();
while(faktor<=input)
{
fakultaet*=faktor;
faktor++;
}
System.out.println(fakultaet);
}
das mit dem immer kleiner werdenen faktor ist rekursiv und so wie du es wolltest nicht umsetzbar
darüber hinaus hast du wieder den selben fehler gemacht wie letzte mal : du speicherst das ergebnis einer runde in y und rechnest damit aber in der nächsten runde nicht weiter sondern speichers nur immer wieder ein neues ergebnis in y ...
vllt solltest du nächste mal deine klassen mit papier und bleistift versuchen durchzurechnen ... vllt merkst du dann beim dritten versuch ob du den selben fehler wieder gemacht hast oder etwas anderes nicht stimmt
Zusatzaufgabe: Simulation einer Population
In einem Teich leben anfangs A = 50 Karpfen. Platz ist für höchstens H = 350 vorhanden. Die Forellen
vermehren sich jährlich mit einer Rate von 6% der Differenz zwischen Höchstbestand H und
aktuellem Bestand A. Wie entwickelt sich die Population?
a) ohne äußere Einwirkungen
b) wenn am Ende jedes Jahres 20% des Bestandes entnommen werden?
Schreibe dazu ein Simulationsprogramm.
Sogar der Fehler mit Karpfen und Forellen ist identisch :-(
An andere Stelle wird über das Niveau der Fragen philosophiert - na ja, das gehört eben auch dazu und man muss nicht einam die Forumssuche hier benutzen - google liefert mit dem Suchbegriff "java karpfenteich" den direkten Link zum HA-Thread :-(
OUCH ... das is schon heftig wenn selbst google dierekt den HA-thread listet ... und das bestimmt als einen der ersten einträge ...
tja ... aber da sieht man wie tief das niveau hier liegt ... noch nich mal mehr die mühe machen selbst zu googlen ... schlimm schlimm