Entwickler-Ecke

Sonstiges (Delphi) - Schulnoten


Fright - Fr 26.08.11 13:47
Titel: Schulnoten
Hallo ihr lieben,

ich bin vor kurzen in eine Klasse dazugestoßen. Die Programmieren nun einige Zeit mit Delphi. Ich habe bis dato jedoch 0 Ahnung von Delphi oder von Programmieren überhaupt.

Folgendes sollen wir machen: Wir sollen ein Programm schreiben, wo wir eine Box mit die Max. zu erreichende Punktzahl eintragen können; eine Box mit den erreichten Punkten und dann einen "Berechnungsbutton" und eine Box wo das Ergebniss dann steht.

Nun meine Frage. Kann mir einer Sowas mal machen und dann erklären wie er es genau gemacht hat?
Des weiteren würde ich gern wissen wie ich dann am besten Anfange mit dem Programmieren.

Ich habe bis nächste Woche Montag Zeit für das Programm. Leider hat der Lehrer kein verständniss dafür, das ich neu in der Schule bin und vorher kein Delphi oder co hatte. Ich kenne mich max mit Excel aus wo ich SVerweiße usw mache oder wenndannsonst Formeln die auch weitreichender sind.

Ich hab das Programm Delphi2010.

Habe mir vorhin ein Buch gekauft, aber das Arbeitet mit einem anderen Delphi Programm was ganz anders ausgebaut ist und wenn ich der beschreibung folgen möchte bringt mir das überhauptnix. Auch sonst sind dort keine erklärungen sondern nur arbeitsschritte.

ich danke euch für eure hilfe jetzt schon.


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 26.08.2011 um 17:47


Gausi - Fr 26.08.11 13:56

Hallo und :welcome: in der Entwickler-Ecke,

Das Buch arbeitet vermutlich mit Delphi7 oder früher - seitdem hat sich an der IDE einiges getan. Für einen Einstieg könnte dann der Crashkurs [http://christian-stelzmann.de/index_tutorials_crashkurs_reloaded.html] von Christian hilfreich sein. Der basiert zwar auf Turbo-Delphi von 2006, aber die IDE sieht da schon ziemlich so aus, wie in der aktuellen Version.

Und das Beispiel "Mini-Taschenrechner" aus dem Tutorial sollte sich recht schnell auf dein Problem anpassen lassen. :-)


Fright - Fr 26.08.11 14:03

Ich schau mir den Crashkurs gern an und danke schon mal. Auch die Sache mit dem Taschenrechner schau ich mir dann gern an. ich danke dir sehr für deine schnelle Antwort


Bergmann89 - Fr 26.08.11 15:47

Hey,

wenn du dann den Crashkusrs durchgearbeitet hast kannst du dein Programm auf folgende Weise realisieren:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
- Pozentzahlen der Noten in einer Array-Konstante speichern (Stichwort: Arrays, Konstanten)
- Gesamtpunktzahl und ereichte Punktzahl in einem Edit eingeben lassen. 
- beim Klick auf den Berechnen-Button:
  - Punkte aus den Edits in Variablen zischenspeichern (Stichwort: StrToInt bzw. TryStrToInt)
  - mit Hilfe der Variablen die Prozentzahl berechnen (erreichte Punkte / Gesamtpunkte * 100)
  - dann mit einer for-Schleife das Array durchsuchen (Stichwort: for-Schleife)
    - die berechnete Prozentzahl mit der im aktuellen Array-Element vergleichen (bei den kleinsten Prozenten bzw schlechtesten Noten anfangen)
      - wenn die berechnete ProzentZahl kleiner ist als die im Array: einfach weiter machen
      - wenn die berechnete ProzentZahl größer ist als die im Array: Index der for-Schleife ausgeben, das ist die Note

Jetzt musst du das nur noch in Quelltext umsetzen ;)

MfG Bergmann


Martok - Fr 26.08.11 17:23

Das geht aber auch einfacher ;) Auch wenn man dann weniger lernt. Also könntest du vielleicht beides mal bauen, zum Üben :zustimm:
So würde ich das machen:


Quelltext
1:
2:
3:
4:
- Punkte und maximale Punkte einlesen, konvertieren und in Variablen speichern
- Prozent berechnen, auf Integer runden (bis hier wie bei Bergmann)
- case-of nutzen, um Zuordnung zu machen
- Ausgabe des Ergebnisses


Bergmann89 - Fr 26.08.11 17:35

Hey,

bei Gymnasien sind die Noten aber Punkte (0-15) und da sind die Kommastellen schon wichtig, weil sonst das Ergebnis zu stark verfälscht wird. Deshalb lieber ein Array of Single ;)

MfG Bergmann


Martok - Fr 26.08.11 18:22

Mehr als halbe Punkte konnte man bei uns eh nie bekommen. Also ließe sich case auch noch verwenden, wenn man eine Kommastelle dazu nimmt und in Promille rechnet: Punkte/Gesamt * 1000 und dann z.B 66% als 660 abfragt ;)


Fright - Fr 26.08.11 20:56

Okay bis morgen Arbeite ich das alles durch und schreib dann den "code" wenn man es so nennt mal hier rein.

danke bis hierhin erstmal


Fright - Sa 27.08.11 12:34

Edit: neue frage:

Folgende Frage:

Da steht nun was ich machen soll, soweit ja auch okay, aber wie ich das genau mache steht da nicht.

Wie sage ich das er was aus "Edit_Erste_zahl" mit "Edit_Zweite_Zahl" addiert und dieses in "Edit_Ergebnis" ausgibt was auf RealOnly auf "True" gestellt wurde. warum das auf True steht verstehe ich ja aber der abschnitt erklärt nicht wie man Sachen zusammenrechnet. Er sagt, das man es so wie vorher mit "Hallo Welt" machen soll. Aber da wird ja nix Addiert.

Kann mir da einer helfen damit ich weiter machen kann und meine Hausaufgaben dann später schaffen kann bis Montag? Hab langsam bange das ich das nicht bis dahin schaffe

EDIT: Hat einer vielleicht ICQ und zeit ein wenig über die Materie zu reden?

PS: var steht für Variabel soweit okay.

warum heißt nun aber bei ihm fristNumber usw und nicht edfirstNumber soll ich nun auch dort nicht Edit_Erste_Zahl sondern Erste_Zahl hin schreiben?
Bevor jetzt wer sagt warum nimmst du nicht die vorgeschriebenden Wörter... Ich hab sie mit absicht nicht genommen um die zusammenhänge besser zu verstehen ob ich dort den Text nehmen numm von Edit oder Caption nehmen muss. Klar denke ich nun Caption aber anscheint hat beides nix damit zu tun sondern eher das man sagt, das man die erste zahl die er nimmt woher auch immer und die zweite voher auch immer addiert und die das ergebniss woher auch immer als internger nehmen soll. heißt das nun bis dato wird kein zusammenhang mit den felder genommen sondern erstmal allgemein gesagt die erste zahl die kommt und zweite zahl die du später rechnest sind alles integer?

Planen
Wechseln Sie durch einen Doppelklick auf Addieren zum Klick-Ereignis des TButton, wie Sie es vom vorigen Programm kennen. Was hier passieren soll, ist Folgendes: Die beiden Zahlen, die der Benutzer in die beiden TEdits eingegeben hat, sollen addiert werden. Das Ergebnis soll in edResult ausgegeben werden. Hier schlägt aber schon die Typensicherheit von Delphi zu, wie man die Tatsache, dass eine Variable einen genau festgelegten Typ haben muss, auch nennt. Denn der Inhalt von TEdit-Felder ist ein Text, also vom Typ String. Addieren in dem Sinne, wie das in diesem Fall gewollt ist, kann man aber nur Zahlen. Das Vorgehen sieht daher so aus:
1. Umwandlung der Benutzer-Eingaben in Zahlen. Diese Zahlen werden in Variablen vom Typ Integer gespeichert. Wir wollen erst einmal nur mit ganzen Zahlen rechnen.
2. Addieren der beiden Zahlen (mittels der Variablen) und speichern des Ergebnisses in einer weiteren Variable vom Typ Integer.
3. Umwandlung des Ergebnisses von einer Zahl in einen Text und Anzeige des Textes in edResult.

Edit: neue frage

Neue Frage: kann ich fristNumber auch einfach "a" Nennen oder ist die FristNumber mit dem ersten TEdit fehlt verbunden? wie genau ist die zugehörigkeit?


Marc. - Sa 27.08.11 14:16

user profile iconFright hat folgendes geschrieben Zum zitierten Posting springen:
Neue Frage: kann ich fristNumber auch einfach "a" Nennen oder ist die FristNumber mit dem ersten TEdit fehlt verbunden? wie genau ist die zugehörigkeit?

Wie mein Professor zu sagen pflegte: Es geht nicht um Namen, sondern um Konzepte. Wie Du Deine Variablen benennst ist dabei völlig irrelevant, nur einigermaßen Sinn sollten sie ergeben und eine gewisse Konsitenz beinhalten.

In diesem Fall ist eine Variable nichts anderes als ein Synonym für eine Adresse im Speicher. Letztere sind in aller Regel dynamisch und ansonsten nur schwer zu merken. :lol:
Mit anderen Worten, es spielt keine Rolle, ob Du Dein Ergebnis mit "result" oder mit "asfdjwke" bezeichnest; ersteres erscheint aber sehr viel verständlicher. ;)


Fright - Sa 27.08.11 14:48

Ich danke dir. Das wollte ich nur hören^^ Nun folgendes:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Edit_ErgebnisChange(Sender: TObject);
begin
 firstNumber := StrToInt(Edit_Erste_Zahl.Text);
 secondNumber := StrToInt(Edit_Zweite_Zahl.Text);

 if secondNumber = 0 then
   Edit_Ergebnis.Text := 'Division durch Null';

 if secondNumber <> 0 then
 begin
 resultNumber := firstNumber div secondNumber;
 Edit_Ergebnis.Text := IntToStr(resultNumber);
end;
end.


Wird diese Eingabe im TEdit Ergebnis Bereich geschrieben? und wenn ja wo liegt mein Fehler?

Moderiert von user profile iconMartok: Quote- durch Delphi-Tags ersetzt


Xion - Sa 27.08.11 15:42

Ich weiß zwar nicht was deine Frage bedeutet, aber an sich passt das so. Nur rechnet div halt mit ganzen Zahlen (4 div 3 = 1). Um normal zu teilen musst du / verwenden und den Datentyp real statt integer benutzen für dein Ergebnis (=> FloatToStr)


Fright - Sa 27.08.11 15:46

er soll ja laut anleitung im crashkurs ganze zahlen nehmen. meine frage ist schreib ich diesen code in ergebniss editonfeld also indem ich doppelklick auf auf TEdit "Edit_Ergebnis" eintrage?

EDIT: okay zeile 2 muss das begin weg.

Habe noch 2 Fehlermeldungen:

- Erwartet: INITIALIZATION, aber Bezeichner 'firstNumber' erhalten in Zeile 59 (59:2)

- Erwartet: das Ende der Datei, aber Bezeichner 'Text' enhalten in Zeile 59 (59:42)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label_Erste_Zahl: TLabel;
    Label_Zweite_Zahl: TLabel;
    Edit_Erste_Zahl: TEdit;
    Edit_Zweite_Zahl: TEdit;
    Button_Addiern: TButton;
    Edit_Ergebnis: TEdit;
    Label_Ergebnis: TLabel;
    Button_Dividieren: TButton;
    procedure Button_AddiernClick(Sender: TObject);
    procedure Button_DividierenClick(Sender: TObject);
    procedure Edit_ErgebnisChange(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button_AddiernClick(Sender: TObject);
var
  firstNumber, secondNumber, resultNumber : Integer;
begin
  firstNumber := StrToInt(Edit_Erste_Zahl.Text);
  secondNumber := StrToInt(Edit_Zweite_Zahl.Text);

 resultNumber := firstNumber + secondNumber;

 Edit_Ergebnis.Text := IntToStr(resultNumber);
end;
procedure TForm1.Button_DividierenClick(Sender: TObject);
var
  firstNumber, secondNumber, resultNumber : Integer;
begin
  firstNumber := StrToInt(Edit_Erste_Zahl.Text);
  secondNumber := StrToInt(Edit_Zweite_Zahl.Text);

 resultNumber := firstNumber div secondNumber;

 Edit_Ergebnis.Text := IntToStr(resultNumber);
end;
procedure TForm1.Edit_ErgebnisChange(Sender: TObject);

 firstNumber := StrToInt(Edit_Erste_Zahl.Text);
 secondNumber := StrToInt(Edit_Zweite_Zahl.Text);

 if secondNumber = 0 then
   Edit_Ergebnis.Text := 'Division durch Null';

 if secondNumber <> 0 then
 begin
 resultNumber := firstNumber div secondNumber;
 Edit_Ergebnis.Text := IntToStr(resultNumber);
end;
end.


Xion - Sa 27.08.11 16:11

Was hast du denn genau vor? das mit den Buttons sieht ja schon gut aus. Warum willst du die Division nochmal programmieren?


Fright - Sa 27.08.11 16:17

Also erstmal dem Link zum Crahkurs: http://christian-stelzmann.de/index_tutorials_crashkurs_reloaded.html

Da bin ich nun auf Seite 22. Vorweg habe 0 Ahnung von Programmieren und verstehe bis Dato nur das was ich dir gerade geschickt habe. Weiß auch nicht warum du sagst noch mal DIV programmieren.

Wenn ich das DIV Button fertig gecodet habe geht ja auch alles aber wenn man 5 durch 0 rechnet kommt eine fehlermeldung. die aufgabe auf seite 22 soll den fehler beheben. am besten PDF kurz anschauen.

EDIT: sehe glaube ich was du meinst, ich hätte das nur erweitern müssen das erste mal von der belegung des buttons. statt dessen habe ich es doppelt geschrieben, da ich dachte es wäre ein zusatz. Danke


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label_Erste_Zahl: TLabel;
    Label_Zweite_Zahl: TLabel;
    Edit_Erste_Zahl: TEdit;
    Edit_Zweite_Zahl: TEdit;
    Button_Addiern: TButton;
    Edit_Ergebnis: TEdit;
    Label_Ergebnis: TLabel;
    Button_Dividieren: TButton;
    procedure Button_AddiernClick(Sender: TObject);
    procedure Button_DividierenClick(Sender: TObject);
    procedure Edit_ErgebnisChange(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button_AddiernClick(Sender: TObject);
var
  firstNumber, secondNumber, resultNumber : Integer;
begin
  firstNumber := StrToInt(Edit_Erste_Zahl.Text);
  secondNumber := StrToInt(Edit_Zweite_Zahl.Text);

 resultNumber := firstNumber + secondNumber;

 Edit_Ergebnis.Text := IntToStr(resultNumber);
end;
procedure TForm1.Button_DividierenClick(Sender: TObject);
var
  firstNumber, secondNumber, resultNumber : Integer;
begin
  firstNumber := StrToInt(Edit_Erste_Zahl.Text);
  secondNumber := StrToInt(Edit_Zweite_Zahl.Text);

  if secondNumber = 0 then
   Edit_Ergebnis.Text := 'Division durch Null';

 if secondNumber <> 0 then

 resultNumber := firstNumber div secondNumber;

 Edit_Ergebnis.Text := IntToStr(resultNumber);
end;
end.


nun ist ein anderer Fehler aufgetaucht.

Keine fehlermeldung in der STrucktur aber 1 warnung 2 fehler beim starten
Zeile 21 Makiert er mir rot


Xion - Sa 27.08.11 16:26

Ja, in Zeile 21 wird eine Funktion deklariert, die du unten niemals definierst. Lösch diese Zeile einfach raus, sie ist ein Relikt vom Doppelklick auf das Edit.


Fright - Sa 27.08.11 16:31

vielen Dank, ich glaub langsam kann ich mich dann auch gleich mal an meine Hausaufgabe rantrauen. Danke!

Edit: Nun habe ich eine Frage zu meiner Hausaufgaben.

Ich möchte es wie Folgt angehen.

mit der if funktion sagen welche note er ausgeben. Hab mir gedacht beziehe die IF funktion auf das ergebnis und sage wenn z.B. das ergebnis kleiner gleich 30 ist dann Schreib in ergebnis den Text 6 rein dann die nächste funktion wieder if wenn die zahl kleiner = 50 ist dann schreib 5 hin usw. ist dieser ansatz richtig?

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

zusatzfrage: Integer arbeitet mit ganzen zahlen. Heißt das er rundet Ergebnise wie 44,6 auf 45 auf oder zeigt er sie als 44 an?

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Wo liegt der Fehler? Er zeigt immer als ergebnis 0 an, wollte eine zwischenprüfung machen bevor ich if anfange zu setzen um schulnoten zu setzen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label_Maximalpunktzahl: TLabel;
    Label_Schülerleistung: TLabel;
    Label1: TLabel;
    Edit_Maximalpunktzahl: TEdit;
    Edit_Schülerleistung: TEdit;
    Edit_Note: TEdit;
    Button_Ergebnis: TButton;
    procedure Button_ErgebnisClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button_ErgebnisClick(Sender: TObject);
var
  maxpunkte, schuelerpunkte, ergebnispunkte : Integer;
begin
 maxpunkte := StrToInt (Edit_Maximalpunktzahl.Text);
 schuelerpunkte := StrToInt (Edit_Schülerleistung.Text);

 ergebnispunkte := schuelerpunkte DIV maxpunkte * 100;

 Edit_Note.Text := IntToStr(ergebnispunkte);
end;

end.


EDIT: Hab DIV durch / ersetzt da sich ja um Kommerzahlen handelt trotzdem meldet er die zeile wo vorher DIV stand als fehler


Gausi - Sa 27.08.11 18:15

Schuelerpunkte ist wohl immer kleiner als maxpunkte, oder?

Da Div die ganzzahlige Division ist, ist Schuelerpunkte Div maxpunkte immer Null. daran ändert sich auch nichts, wenn man das wieder mit 100 Multipliziert. ;-)

Probier das mal so:

Delphi-Quelltext
1:
Schuelerpunkte * 100 Div maxpunkte                    


Fright - Sa 27.08.11 18:21

Danke werde nun versuchen statt ergebnise noten ausspucken zu lassen mit if funktionen. Melde mich dann noch mal wenn es Probleme gibt :)

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Okay mein Lösungsweg geht nicht, kann mir einer dabei helfen?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label_Maximalpunktzahl: TLabel;
    Label_Schülerleistung: TLabel;
    Label1: TLabel;
    Edit_Maximalpunktzahl: TEdit;
    Edit_Schülerleistung: TEdit;
    Edit_Note: TEdit;
    Button_Ergebnis: TButton;
    procedure Button_ErgebnisClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button_ErgebnisClick(Sender: TObject);
var
  maxpunkte, schuelerpunkte, ergebnispunkte : Integer;
begin
 maxpunkte := StrToInt (Edit_Maximalpunktzahl.Text);
 schuelerpunkte := StrToInt (Edit_Schülerleistung.Text);

   if ergebnispunkte >= 30 then
   Edit_Note.Text := '6'
   else
   if schuelerpunkte = 0 then
   Edit_Note.Text := '6';

 if schuelerpunkte <> 0 then

 ergebnispunkte := schuelerpunkte * 100 Div maxpunkte;

 Edit_Note.Text := IntToStr(ergebnispunkte);
end;

end.


was wollte ich machen?
wenn das ergebnis 0 ist soll die note 6 geben
wenn das ergebnis kleiner oder gleich 30 ist soll im ergebnisfeld auch note 6 rauskommen also nur 6 ohne Note davor.
dann bei 50 kleiner größer dann 5 wie mach ich das `?

Edit: Hab gerade gesehen wo ich fehler gemacht habe. aber weiß nicht ob dann gehen wird teste es mal hab bei 30 was das ergebnis ist auch hin geschrieben schuelerpunkte aber da geht ja um ergebnispunkte

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label_Maximalpunktzahl: TLabel;
    Label_Schülerleistung: TLabel;
    Label1: TLabel;
    Edit_Maximalpunktzahl: TEdit;
    Edit_Schülerleistung: TEdit;
    Edit_Note: TEdit;
    Button_Ergebnis: TButton;

    procedure Button_ErgebnisClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button_ErgebnisClick(Sender: TObject);
var
  maxpunkte, schuelerpunkte, ergebnispunkte : Integer;
begin
 maxpunkte := StrToInt (Edit_Maximalpunktzahl.Text);
 schuelerpunkte := StrToInt (Edit_Schülerleistung.Text);

   if schuelerpunkte = 0 then
   Edit_Note.Text := 'Division durch Null';

 if schuelerpunkte <> 0 then

 ergebnispunkte := schuelerpunkte * 100 Div maxpunkte;

 Edit_Note.Text := IntToStr(ergebnispunkte);

 CASE ergebnispunkte OF
  1 : 93-100 := '1';
  2 : 82-92 := '2';
  3 : 68-81 := '3';
  4 : 51-67 := '4';
  5 : 31-50 := '5';
  6 : 0-30 := '6';
  ELSE WAS KOMMT HIER REIN := 'Diesen Notenwert gibt es nicht.';


end;

end.


Komme hier ohne wissen nicht weiter.... mir fehlen einfach die grundkenntnise für case of und auch von zeichensetzung von textausgabe


Martok - Sa 27.08.11 19:56

user profile iconFright hat folgendes geschrieben Zum zitierten Posting springen:
Komme hier ohne wissen nicht weiter.... mir fehlen einfach die grundkenntnise für case of und auch von zeichensetzung von textausgabe
Ja, sieht man ;)
Der Crashkurs wurde ja schon verlinkt; leider kann man da drin nicht auf einzelne Unter-Überschriften verlinken, also erstmal das hier [http://www.christian-stelzmann.de/artikel/CrashkursReloaded/#_Toc180058866] und etwas runterscrollen. Da kommt irgendwo der Abschnitt "Die case-Anweisung".

Bitte auch den Teil vorher lesen; dir fehlt nämlich das Konzept "Anweisung", beziehungsweise Verständnis dessen.

In Edit_Note gibst du momentan die berechnet Prozentzahl aus. Das sollte klar sein (hab jetzt nicht alle Beiträge gelesen).


Was möchtest du also weiter realisieren? Erstmal in natürlicher Sprache (und natürlich ähnlich für die anderen Noten):
Zitat:
Wenn die Prozente zwischen 93% und 100% sind, gib Note 1 aus.


Das übersetzt in "Programmlogik" sieht ungefähr so aus:
Zitat:
Wenn der Wert der Variable die die Prozente enthält zwischen 93 und 100 liegt, schreibe '1' in das Edit_Note.


Hier ist das 3. Codebeispiel aus dem Crashkurs hilfreich:
Crashkurs hat folgendes geschrieben:
Wie Sie sehen, können Sie Wertebereiche angeben und auch mehrere Werte mittels Kommata aufzählen.
Das klingt doch fast schon so, wie wir das wollen. Da ist auch das mit dem else zu erkennen.

Also

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
case ergebnispunkte of
  93..100: Edit_Note.Text:= '1';
  {etc...}
else
  Edit_Note.Text:= 'Das kann nicht sein.';
end;


Fright - Sa 27.08.11 20:10


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label_Maximalpunktzahl: TLabel;
    Label_Schülerleistung: TLabel;
    Label1: TLabel;
    Edit_Maximalpunktzahl: TEdit;
    Edit_Schülerleistung: TEdit;
    Edit_Note: TEdit;
    Button_Ergebnis: TButton;
    procedure Button_ErgebnisClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button_ErgebnisClick(Sender: TObject);
var
  maxpunkte, schuelerpunkte, ergebnispunkte : Integer;
begin
 maxpunkte := StrToInt (Edit_Maximalpunktzahl.Text);
 schuelerpunkte := StrToInt (Edit_Schülerleistung.Text);

   if schuelerpunkte = 0 then
   Edit_Note.Text := 'Division durch Null';

 if schuelerpunkte <> 0 then

 ergebnispunkte := schuelerpunkte * 100 Div maxpunkte;

 Edit_Note.Text := IntToStr(ergebnispunkte);

case ergebnispunkte of
  92..100: Edit_Note.Text:= '1';
  82..91: Edit_Note.Text:= '2';
  67..81: Edit_Note.Text:= '3';
  50..66: Edit_Note.Text:= '4';
  30..49: Edit_Note.Text:= '5';
   0..29: Edit_Note.Text:= '6';
else
  Edit_Note.Text:= 'Das kann nicht sein.';
end;
end.


jetzt makiert der mit end. also zeile 58 als fehler, aber das stand vorher schon da.

ein dickes danke erstmal für die hilfe. hatte mir den bereich schon durchgelesen aber nicht verstanden mit der case funktion auch unter google karmen beispiele aber hatte auch die nicht verstanden.

wenn ich das später irgendwann fertig habe kann ich hier fragen stellen, wie ich mich am besten vorbereite auf kommende sachen und was am anfang wichtig ist zu lernen? weil das hier ist ja wirklich eher ein crashkurs ohne wirklich alles 100% genau zu vertiefen für mich


Martok - Sa 27.08.11 20:23

Genau so meine ich das.

Die Meldung mit dem End. bezieht sich (logischerweise) auf das End. am Ende. Wenn du mal mitzählst, wie viele Blöcke (begin und case hier) du öffnest und schließt wird dir auffallen, dass vor dem end. welches die Unit beendet ein end; fehlt.
Dafür hilft es, den Code ordentlich blockweise einzurücken. Dann sieht man direkt wo eins hin gehört.

Hier nämlich hinter das end; vom case noch ein weiteres, welches die procedure dann abschließt.


Klar kannst du Fragen stellen ("neue Frage, neues Thema" beachten). Hilfreich ist es, dir selber kleine Projekte auszudenken, und die dann umzusetzen. Viel kannst du noch nicht verpasst haben, wenn das die aktuelle Aufgabe war ;)
Oft genommen werden im Unterricht Währungsumrechner, Zahlenraten, Taschenrechner in ungefähr dieser Reihenfolge. Da sollte dann alles wichtige mal dabei gewesen sein... die Hälfte (Sprach-Funktions-mäßig gezählt) davon hast du jetzt schon ;)


Fright - Sa 27.08.11 20:33

Okay das Programm läuft doch ein Fehler ist noch da...

Folgendes: Wenn ich 100 Punkte Max sind und der schüler macht 1 Punkt gibt er 6 als Note...
soweit richtig hat aber ein schüler 0 Punkte gibt er den fehlertext "Kann nicht sein" aus. aber da müsste er auch eine 6 ausspucken. wie mach ich das jetzt?

fehler selbst gefunden. Danke euch allen für eure antwort!


Fright - So 28.08.11 10:52

Hab doch noch ein Problem. und zwar wenn ich einen fehler machen und oben beim faktor Maximalpunkte 0 eingebe und bei schülerpunkte auch 0 eingebe kommt die bekannte fehlermeldung.zeroerror :(
100 durch 0 geht als faktor 6 durch das klappt nur diese eine rechnung geht nicht


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label_Maximalpunktzahl: TLabel;
    Label_Schülerleistung: TLabel;
    Label1: TLabel;
    Edit_Maximalpunktzahl: TEdit;
    Edit_Schülerleistung: TEdit;
    Edit_Note: TEdit;
    Button_Ergebnis: TButton;
    procedure Button_ErgebnisClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button_ErgebnisClick(Sender: TObject);
var
  maxpunkte, schuelerpunkte, ergebnispunkte : Integer;
begin
 maxpunkte := StrToInt (Edit_Maximalpunktzahl.Text);
 schuelerpunkte := StrToInt (Edit_Schülerleistung.Text);

 ergebnispunkte := schuelerpunkte * 100 Div maxpunkte;

 Edit_Note.Text := IntToStr(ergebnispunkte);

case ergebnispunkte of
  92..100: Edit_Note.Text:= '1';
  82..91: Edit_Note.Text:= '2';
  67..81: Edit_Note.Text:= '3';
  50..66: Edit_Note.Text:= '4';
  30..49: Edit_Note.Text:= '5';
   0..29: Edit_Note.Text:= '6';
else
  Edit_Note.Text:= 'Das kann nicht sein.';
end;
end;
end.


Singlepin - So 28.08.11 12:17

Division durch Null geht nun mal nicht.
Das muß du vermeiden.
z.B. solltest du deinen Quelltext in folgender Art erweitern:

Wenn maxpunkte gleich Null dann Fehlermeldung sonst Berechnung durchführen.


Fright - So 28.08.11 12:30

wenn ich sage max:100 schülerpunktzahl 0 dann kommt ja note 6 raus, aber wenn halt max 0 einsetze macht er die fehlermeldung.

die frage ist es wie vermeide ich es wie im tutorial beschrieben zeigt er mir ja 0 als antwort an. er soll mir halt wenn das passiert "das kann nicht sein" ausgeben. aber nur wenn bei Max.punktzahl halt 0 steht

wie du das jetzt sagst, sollte ich das wie folgt machen?

if maxpunkte = 0 then
Edit_Ergebnis.Text := 'Das kann nicht sein.';

ergebnispunkte := schuelerpunkte * 100 Div maxpunkte;
usw?

okay gemacht zeigt nun das an was will aber macht die fehlermeldung noch "Division durch 0" ansonsten passt alles. wo ist mein fehler?


Singlepin - So 28.08.11 12:45

Die IF-Anweisung gibt es auch in der Form
IF "Bedingung" then "Anweisung wenn wahr" else begin "Anweisungen wenn Falsch" end;
In den else-Zweig packst du den Code zur Berechnung.


Fright - So 28.08.11 13:05

keine ahnung wie ich das machen soll.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if maxpunkte = 0 then
Edit_Note.Text := 'Das kann nicht sein.';

ergebnispunkte := schuelerpunkte * 100 Div maxpunkte;

 Edit_Note.Text := IntToStr(ergebnispunkte);

case ergebnispunkte of


Man müsste ja nun nur weiter machen in zeile 3 else hin zu schreiben dann in 4 das umzuschreiben, aber wie kenne diese if funktion ja nur in der form wie ich sie hatte. mach das ja erst seid gestern...

habe nun versucht mit


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  if maxpunkte = 0 then
  Edit_Note.Text := 'Das kann nicht sein.';
  else
  if maxpunkte > 0 then
  Edit_Note.Text := 'ergebnispunkte := schuelerpunkte * 100 Div maxpunkte';

 Edit_Note.Text := IntToStr(ergebnispunkte);


geht aber auch nicht

so auch nicht hatte .text übersehen


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
if maxpunkte = 0 then
   Edit_Note.Text := 'Das kann nicht sein.';

   else
   Edit_Note := 'ergebnispunkte := schuelerpunkte * 100 Div maxpunkte';

 Edit_Note.Text := IntToStr(ergebnispunkte);


Singlepin - So 28.08.11 13:21

Der Ansatz ist richtig


Delphi-Quelltext
1:
2:
3:
if maxpunkte = 0 then
 Edit_Note.Text := 'Das kann nicht sein.' 
 else

ist soweit OK nur das Semikolon vor dem ELSE mußte weg.

Nach dem ELSE kommen mehrere Anweisungen die mußt du in BEGIN ... END einschließen.
Da wo jetzt die Punkte stehen kommen deine Berechnungen hinein.


Fright - So 28.08.11 13:38


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
begin
 maxpunkte := StrToInt (Edit_Maximalpunktzahl.Text);
 schuelerpunkte := StrToInt (Edit_Schülerleistung.Text);

   if maxpunkte = 0 then
   Edit_Note.Text := 'Das kann nicht sein.'
   else
   ergebnispunkte := schuelerpunkte * 100 Div maxpunkte;

 Edit_Note.Text := IntToStr(ergebnispunkte);


super danke! Klappt super nun alles. ich hab nicht dran gedacht das mit ";" den befehl beende


Fright - So 28.08.11 14:16

*CLOSE*