Funktion ZinsBerechnen

Hallo liebe Forumgemeinde!
Ich habe von meinem Informatiklehrer den Auftrag bekommen, ein PHP-Script zu erstellen, welches aus den Inputs Grundkapital, Zinssatz und Zinstage das Endkapital berechnet und ausgibt.
Eigentlich war ich recht sicher, dass es klappt, doch PHP will wohl nicht so…
:sad:

Könntet ihr mir vielleicht sagen wo sich ein Fehler eingeschlichen hat und wo Verbesserungsbedarf nötig ist?

Hier das HTML-Formular:
[HTML]

Kapital:

Zinssatz:

("," als ".")

%
Zinstage:
Vertragsstart: . . (tt.mm.jjjj)
Vertragsende: . . (tt.mm.jjjj)
[/HTML]

Der PHP-Code zur Verarbeitung lautet:
[PHP]<?php

$nachkommastellen = 2; // Anzahl der Nachkommastellen des Endbetrags (Summe) wird der Variable „$nachkommastellen“ zugewiesen

$kapital = $_POST[‚kapital‘]; // Wert „kapital“ wird angenommen und der Variable „$kapital“ zugewiesen
$zinssatz = $_POST[‚zinssatz‘]/100; // Wert „zinssatz“ wird angenommen und der Variable „$zinssatz“ zugewiesen und durch 100 geteilt, um den Zinssatz als Kommazahl zu erhalten

$start_jahr = $_POST[‚start_jahr‘]*360; // Wert „start_jahr“ wird angenommen, mit 360 multipliziert und der Variable „$start_jahr“ zugewiesen
$start_monat = $_POST[‚start_jahr‘]*30; // Wert „start_monat“ wird angenommen, mit 30 multipliziert und der Variable „$start_monat“ zugewiesen
$start_tag = $_POST[‚start_jahr‘]; // Wert „start_tag“ wird angenommen und der Variable „$start_tag“ zugewiesen
if($start_tag == 31){
$start_tag = 30;
}

$ende_jahr = $_POST[‚start_jahr‘]*360; // Wert „ende_jahr“ wird angenommen, mit 360 multipliziert und der Variable „$ende_jahr“ zugewiesen
$ende_monat = $_POST[‚start_jahr‘]*30; // Wert „ende_monat“ wird angenommen, mit 30 multipliziert und der Variable „$ende_monat“ zugewiesen
$ende_tag = $_POST[‚start_jahr‘]; // Wert „ende_tag“ wird angenommen und der Variable „$ende_tag“ zugewiesen
if($ende_tag == 31){
$ende_tag = 30;
}

$start_tag_dauer = $start_jahr+$start_monat+$start_tag; // Zeitspanne zwischen Christi-Geburt und Vertragsstart wird errechnet
$ende_tag_dauer = $ende_jahr+$ende_monat+$ende_tag; // Zeitspanne zwischen Christi-Geburt und Vertragsende wird errechnet
$zinstage = $ende_tag_dauer-$start_tag_dauer;

if($kapital == „“ or $kapital == „0“){ // WENN Kapital ist gleich leer oder Kapital ist gleich 0
echo „Bitte gib dein Kapital an.“; // DANN gib Text aus
}elseif($zinssatz == „“ or $zinssatz == „0“){ // WENN Zinssatz ist gleich leer oder Zinssatz ist gleich 0
echo „Bitte gib deinen Zinssatz an.“; // DANN gib Text aus
}elseif($zinstage == „“ or $zinstage == „0“){ // WENN Zinstage ist gleich leer oder Zinstage ist gleich 0
echo „Bitte gib deine verzinsten Tage an.“; // DANN gib Text aus
}else{ // ANSONSTEN:

$jahreszins = $zinssatz*$kapital; // Jahreszins wird mittels Multiplikation von Zinssatz und Kapital errechnet
$tageszins = $jahreszins/360; // Tageszins wird mittels Division aus Jahreszins und Antahl der Tage in jahr (360 bei Banken) errechnet
$zinsbetrag = $tageszins*$zinstage; // Zinsbetrag wird mittels Multiplikation aus Tageszins und Zinstage errechnet
$summe = $kapital+$zinsbetrag; // Summe wird mittels Summe aus Tageszins und Zinsbetrag errechnet
$summe_gerundet = round($summe,$nachkommastellen); // Summe wird auf zwei Nachkommstellen (siehe oben) gerundet und der Variable „$summe_gerundet“ zugewiesen
$zinssatz_prozent = $zinssatz*100; // Zinssatz wird mit 100 multipliziert um den Wert in Prozent zu erhalten und wird dann der Variable „$zinssatz_prozent“ zugewiesen

echo "Dein Gesamtkapital: ".$summe_gerundet.„€
\r\n“; // Gesamtbetrag wird in Euro ausgegeben
echo "Dein Zinsbetrag: ".$zinsbetrag.„€
\r\n“; // Zinsbetrag wird ausgegeben
echo „Zuvor getätigte Eingaben:
\r\n“; // Eingaben:
echo "Kapital: ".$kapital.„€
\r\n“; // Kapital ohne Zinsen wird ausgegeben
echo „Zinssatz: „.$zinssatz_prozent.“%
\r\n“; // Zinssatz wird ausgegeben
echo „Zinstage: „.$zinstage.“
\r\n“; // Die verzinsten Tage werden ausgegeben

} // ANSONSTEN-Klammer wird geschlossen
?>[/PHP]

Verzeiht die vielen Kommentare, diese brauche ich jedoch zur Erläuterung vor meiner Schulklasse…

Zur Erläuterung noch:
Um die Zinsberechnung wie bei Banken erfolgen zu lassen, hat im Script ein Jahr 360 Tage und ein Monat 30. (Sollte ein Monat 31 Tage haben, so wird er als 30 gewertet.)

Das Ergebnis meiner bemühungen könnt ihr aus ZinsBerechnung

Wen ihr noch Fragen habt dann meldet euch bitte!
vielen dank schon einmal :razz:
MfG Vitus

P.S.: Muss ich bei dem Umwandeln von einem 31-tägigem Monat in einen 30-tägigen die Zahlen in anführungszeichen schreiben oder könnte das die Funktionalität beeinflussen? Oder umgekehrt? :shock:

Dein HTML ist Verbesserungs würdig, hinsichtlich Semantik.

Man benutzt für das Layout heute keine Tabellen mehr.

Allerdings finde ich das Benutzen Tabellen, solange man nicht pfuscht, nicht schlimm, seis drum.

Elemente wie Strong die keinerlei semantischen Sinn haben und nur dafür da sind den Text dicker zu machen benutzt man auch nicht mehr, dazu benutzt man CSS.

Für die Beschriftungen von Textfeldern nimmt man übrigens Labels
http://de.selfhtml.org/html/formulare/strukturieren.htm#label

Dein PHP Fehler liegt vermutlich in Zeile 15-17, dort weißt du die "end"variablen den posts der "start"variablen zu, was wenig sinn macht.
Weiter habe ich den Quelltext nicht durchgekuckt.

Was gibt es daran zu verzeihen? Je mehr Kommentare desto besser, doppelte Menge Kommentare wie Code, sollte meiner Ansicht nach das Minimum, solange es wie bei dir nicht störend am Rand ist.

Mit Anführungszeichen würdest du eine Zeichenkette zuweißen, und das wäre wohl nicht ganz sinnvoll, da du mit einer Zeichenkette nicht rechnen kannst.

MfG

Könntet ihr mir vielleicht sagen wo sich ein Fehler eingeschlichen hat und wo Verbesserungsbedarf nötig ist?

Du solltest auch int’s und strings vereinheitlichen. Zwar macht PHP normal keine Zicken, wenn ein string als int behandelt werden soll, aber richtiger währe es, wenn du deine Zahlen zur Abfrage und Berechnung als int behandelst und nicht als string.

Mfg

Danke für eure Antworten…
Was die „Richtigkeit“ der beiden Scripte angeht, kann ich euch verstehen…
Jedoch muss ich diese so einfach wie möglich gestalten, damit meine Klassenkameraden es auch verstehen… :wink:
Ich werde nun den PHP Teil einfach noch einmal neu schreiben und dabei Schritt für Schritt vorgehen… Dann werde ich den Fehler schon finden.
Danke nochmal und einen guten Rutsch! :grin:

Ich habe dir doch schon den Fehler in deinem PHP genannt.

Zeile 15 - 17 weist du den "End"variable die posts der "Start"eingaben zu, was keinen Sinn macht, weil du dann als Zinstage logischerweiße immer 0 rausbekommst.

MfG

Uuuuuups :S
Nun verstehe ich das auch :razz:
Ich war wohl so übermütig, so dass ich den Fehler dauernd übersehen habe.
Tut mir Leid :idea:
Habe nun jedoch bereits alles neu geschrieben und es funktioniert auch :grin:
Danke nochmal :wink: und nochmal einen guten Rutsch^^

Imbericle, wenn du klugscheißen musst und dich nicht auf das eigentliche Thema beziehst (PHP-Forum), solltest du keine Fehler machen.
hat sehr wohl eine semantische Bedeutung und zwar stellt es eine sehr wichtige Textpassage dar.

Süßerlchen, falls du Aggressionen hast, dann solltest du mal Judo oder dergleichen ertesten.

Deine vulgäre Ausdrucksart ist nicht angebracht und hat genauso wenig etwas im PHP Forum zu suchen.

Wie du schon sagst, strong ist für wichtige Textpassagen.

Das ein Punkt eine wichtige Textpassage ist, entzieht sich meiner Intellegenz, aber wenn du anderer Meinung bist, dann wäre es doch nett, dies das nächste mal in angemessenem Ton dar zu legen.

MfG

Also,
ich habe die -Attribute verwendet, da ich zuerst fand, die Punkte zwischen den Textfeldern sähen sonst sehr „mikrig“ aus. Ausserdem hatte nicht vor ein Stylesheet oder ähnliches anzulegen, weil es mit bei dieser Funktion wirklich nur um die Funktionalität und nicht um das Aussehen und der Semantik.
Der Punkt ist nun ein einfacher Punkt, jedoch komme ich nicht drauf, wie man zB ein einziges Zeichen formatieren kann per CSS… Muss ich dafür ein eigenes DIV anlegen oder wie macht man das?
LG Vitus

Nein, Div ist ein outline-Element, es bricht hinter sich die Zeile ab, und dann müsstes du das in CSS mit float:left; oder display:inline; wieder ausgleichen.

Allerdings würde das den Sinn von Div auch weit verfehlen (Seitenunterteilung).

Für einen nichtssagenden Text nimmst ein span, das ist inline und bricht nicht die Zeile ab.

Für die Punkte nun extra immer ein span zu nehmen finde ich persönlich ein wenig arg, aber ich habe es nicht so mit der Semantik.

Das ist nun interpretations Sache, ist der Punkt inhaltlich wichtig, dann ist strong die richtige Wahl,

da du die Leute allerdings nicht unbedingt auf den Punkt aufmerksam machen willst und ihn auch nicht hervorheben willst, sondern eben nur mit der Schrift nicht zufrieden bist wäre strong die falsche Wahl.

Ich würde es der Faulheit einfach mit b machen, da strong mir unpassend erscheint und jedes mal ein extra span wäre mir zu viel Schreibarbeit.

Auch wenn b natürlich ein verbuhtes Element ist, da es meines Wissens keinen anderen Sinn hat als fett zu machen, was dem Sinn von HTML widerspricht.

Belasse es erstmal dabei, vielleicht meldet sich ja hier noch ein Semantikexperte um mich aufzuklären.

MfG

The b element now represents a span of text to be stylistically offset from the normal prose without conveying any extra importance, such as keywords in a document abstract, product names in a review, or other spans of text whose typical typographic presentation is emboldened.

[…]

The i element now represents a span of text in an alternate voice or mood, or otherwise offset from the normal prose, such as a taxonomic designation, a technical term, an idiomatic phrase from another language, a thought, a ship name, or some other prose whose typical typographic presentation is italicized. Usage varies widely by language.

HTML 5 differences from HTML 4. W3C Working Draft 25 August 2009

Sieht für mich so aus, als würde das W3C etwas krampfhaft versuchen, und eine Bedeutung zu geben, die es irgendwie sinnvoll erscheinen lässt, mit diesen Tags ausgezeichneten Text weiterhin fett bzw. kursiv darzustellen. Ich tue mich mit den Definitionen reichlich schwer.

Die Darstellung von Tags, die eine rein semantische Bedeutung haben (, und ab „demnächst“ wohl auch und und überhaupt alle), ist dem Client überlassen. Das heißt, es gibt keinerlei Garantie, dass ein Client bei oder Fettschrift einsetzt. Bei Webbrowsern ist die spezielle Formatierung zwar ein ungeschriebenes Gesetz, aber andere Clients wie etwa Screenreader können Text überhaupt nicht fett darstellen und müssen sich anders helfen, um die semantische Bedeutung zu vermitteln.

Der entscheidende Punkt ist: An einen HTML-Tag ist niemals eine spezielle Form der Präsentation geknüpft.

@vitus37: Wenn es dir nur darum geht, den etwas mickrigen Punkt hervorzuheben, ist theoretisch etwas wie . die korrekte Wahl. Praktisch erfüllen und aber genau denselben Zweck. Das ist hier keine Stelle, an der man sich mit tiefschürfenden Überlegungen über die Tag-Wahl aufhalten muss. Das Thema wird gerne übertrieben und im Endeffekt interessiert es sowieso keinen Besucher der Seite.

Mach’ es im Zweifel einfach so:

[php]$_POST[‚zinssatz‘] = str_replace(‚,‘, ‚.‘, $_POST[‚zinssatz‘]);[/php]

Ahh, kannte ich zuvor noch nicht so gut, danke für eure vielen Erläuterungen, aber eine Frage hätte ich noch:
Ist die Schriftformatierung mit noch üblich?

@mermshaus: Danke auch für den Tipp mit der Funktion str_replace :grin:,werde sie heute gleich noch einbauen. Mit den Funktionen habe ich es nicht so und meistens finde ich auf php.net nicht die passenden^^.

LG Vitus

Nein, das ist auch CSS: SELFHTML: Stylesheets / CSS-Eigenschaften / Schriftformatierung

Und damit es keine Probleme gibt, würde ich die Eingaben darauf Überprüfen lassen, ob es auch Zahlen sind mit is_numeric(); Aber erst nachdem du str_replace(); benutzt hast.