Problem in Pascal - SciFi-Forum

Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem in Pascal

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Problem in Pascal

    Ich habe ein Programm zur Berechnung von Durchmesser, Umfang und Fläche eines Kreises in Pascal geschrieben. Beim Kompilieren kommt aber folgende Fehlermeldung:

    kreisb~1.pas(26,40) Error: Constant and CASE types do not match
    kreisb~1.pas(26,40) Error: Ordinal expression expected
    kreisb~1.pas(26,40) Fatal: Syntax error, : expected but ; found
    Ich hab schon einiges versucht, hab aber den Fehler nicht beseitigen können.
    Hier ist der Quelltext von dem Programm:

    program Kreisberechnung;
    var auswahl :char;
    var d,A,U :real;
    begin
    writeln('Kreisberechnung');
    writeln('===============');
    writeln('Ein Kreis ist durch eine der 3 Groessen Durchmesser d, Umfang U oder');
    writeln('Flaeche A eindeutig bestimmt.');
    writeln('Nach Eingabe von einer der 3 Groessen, werden die beiden fehlenden');
    writeln('vom Programm berechnet und auf 2 Nachkommastellen gerundet.');
    writeln('Zum Schluss werden alle 3 Werte auf dem Bildschirm ausgegeben.');
    writeln;
    writeln;
    writeln;
    writeln('gegeben: gesucht: Auswahl:');
    writeln('___________________________________________________');
    writeln('Durchmesser Umfang, Flaeche 1');
    writeln('Flaeche Durchmesser, Umfang 2');
    writeln('Umfang Durchmesser, Flaeche 3');
    writeln;
    writeln('Programmende 4');
    writeln;
    writeln;
    write('Waehlen Sie eine Zahl: '); readln(auswahl);
    case auswahl of
    '1' : write('Durchmesser: '); readln(d); U:=pi*d; A:=pi*sqr(d)/4;
    '2' : write('Flaeche: '); readln(A); d:=sqrt(4*A/pi); U:=pi*d;
    '3' : write('Umfang: '); readln(U); d:=U/pi; A:=pi*sqr(d)/4;
    '4' : write('Ende');
    else write('Eingabe nicht moeglich.');
    end;
    writeln;
    writeln;
    writeln;
    writeln('Durchmesser Flaeche Umfang');
    writeln('========================================');
    writeln(d:0:2,' ',A:0:2,' ',U:0:2);
    readln;
    end.

    Tnx schon mal im Voraus!

    #2
    Ich hab auf anhieb keinen Fehler gefunden, nur leider habe ich auf diesem Rechner kein Pascal....

    Ich checks die Tage nochmal auf nem anderen Rechner durch...

    Chakotay

    Kommentar


      #3
      Ganz einfach:

      Du hast bei den case-Anweisungen einfach die begin ... end- Anweisung vergessen, wie er bei jedem längeren Pascal-Block hingehört

      P.S:
      var d,A,U :real;

      Kommentar


        #4
        Afaik muss in eine Case-Of Anweisung keine Begin-End Anweisung rein. Aber trotzdem, wo genau soll die denn hin?

        Kommentar


          #5
          begin write('Durchmesser: '); readln(d); U:=pi*d; A:=pi*sqr(d)/4; end;
          du schreibst doch in jedem case-Block mehrere Anweisungen und die müssen geklammert (mit begin..end) werden

          Kommentar


            #6
            das glaub ich kaum.
            ich kann zwar kein pascal, aber das wäre ja sehr schlecht, wenn geblockt werden muss.
            eher muss ein abbruchsbefehl an dem punkt eingeführt werden, wo abgebrochen werden soll. in c heißt dieser 'break'.
            kann es vielleicht sein, dass es statt 'else' im 'case' 'default' heißen muss?
            Das mir mein Hund viel lieber sei; Sagst du, oh Mensch, sei Sünde. Doch mein Hund bleibt mir im Sturme treu; Der Mensch nicht mal im Winde.
            Die technischen Fortschritte und menschlichen Rückschritte des STFs.

            Kommentar


              #7
              Glaub mir da muss ein begin..end-Block rein und zwar bei jeder Verzweigung im case-Block, da ja mehrere Anweisungen in diesem Block ausgeführt werden sollen und das heisst nicht nur bei Pascal "Klammerung" (in C/Java z.B. mit {} )

              Die Meldung sagt es im Prinzip ja eh:
              Der Compiler will nach '1' : write('Durchmesser: '); eigentlich '2' verarbeiten, weil er denkt es kommt ja nach '1' nur ein Befehl

              P.S: Mache das doch nicht für umsonst seit 5 Jahren. Pascal ist sozusagen meine Muttersprache

              Kommentar


                #8
                bei c/c++/java und so weiter braucht man case nicht zu blocken. hier sieht der syntax so aus:
                Code:
                switch (X)
                {
                  case 0:
                  case 1:
                    ...;
                  case 2:
                    ...;
                    break;
                  default:
                    ...;
                }
                case 0 und 1 sind theoretisch ein und der selbe punkt. da vor case 2 kein break kommt, wird das von case 2 ebenfalls ausgeführt bis zum break. default wird ausgeführt wenn in der case-liste kein entsprechender punkt kam. default kann auch an den anfang gesetzt werden. für ... kann man soviel code einsetzten wie man möchte. ohne zu blocken.

                blocken ist das in die {}-klammern setzten. {...} definieren einen eigenständigen block.


                wenn du pascal kannst, kannst du mir ein tutorial, vorzugsweiße deutsch oder englisch, empfehlen?
                ich möchte ein wenig pascal lernen, auch wenn ich es niemals brauchen werde.
                Das mir mein Hund viel lieber sei; Sagst du, oh Mensch, sei Sünde. Doch mein Hund bleibt mir im Sturme treu; Der Mensch nicht mal im Winde.
                Die technischen Fortschritte und menschlichen Rückschritte des STFs.

                Kommentar


                  #9
                  Ok überzeugt
                  In C/Java wird der Code jeweils bis break ausgeführt, ABER in Pascal ist es anders, dort wird normalerweise nur die 1.Anweisung ausgeführt.

                  Kommentar


                    #10
                    @deac
                    Hab dein edit jetzt erst gesehen
                    auch mit Linux hatt ich schon lang nichts mehr zu tun, hat mich zu sehr genervt

                    Also ich kenn leider nur meine alten Pascal-Bücher. Wirklich gut war aber Borland Pascal 7.0 von tewi, da stand wirklich in Puncto Windows/Dos-PascalProgrammierung alles drin (sogar wie man Pascal/C/Assembler gegenseitig einbindet).
                    Ansonsten würde ich dir stark zu Delphi raten, und mal nach einem guten Tutorial oder Buch zu Object Pascal Auschau halten.

                    Kommentar


                      #11
                      Du hast recht Kamin, bei der CASE Anweisung muss jeder Block mit begin und end eingeklammert sein. Überhaupt ist es günstig in Pascal so viele begin end Blöcke zu machen und den Quelltexte einzrücken. Er wird dadurch übersichtlicher.

                      bei einer IF Anweisung (inkl. ESLE) braucht man auch ein end (ähnlich wie bei der CASE Anweisung.

                      Beispiel:

                      Code:
                      IF variable=wert THEN
                      BEGIN
                        Quelltext
                        Quelltext
                      END
                      ELSE
                        Quelltext
                      END;
                      Beim ersten end (in der IF Anweisung kein (!!!) Semikolon machen!
                      Live well. It is the greatest revenge.

                      Kommentar


                        #12
                        Originalnachricht erstellt von Kamin
                        @deac
                        Hab dein edit jetzt erst gesehen
                        auch mit Linux hatt ich schon lang nichts mehr zu tun, hat mich zu sehr genervt
                        hab ich irgend etwas von linux geschrieben? sehe ich nirgends.
                        Also ich kenn leider nur meine alten Pascal-Bücher. Wirklich gut war aber Borland Pascal 7.0 von tewi, da stand wirklich in Puncto Windows/Dos-PascalProgrammierung alles drin (sogar wie man Pascal/C/Assembler gegenseitig einbindet).
                        Ansonsten würde ich dir stark zu Delphi raten, und mal nach einem guten Tutorial oder Buch zu Object Pascal Auschau halten.
                        ich hab gerade gehört, dass turbopascal eine sehr ausführliche hilfe hat. das wundert mich. die hilfe von turboc++ ist beschissen.
                        mit delphi werd ich mich wohl überhaupt nicht beschäftigen. ich möchte ja keine programme schreiben sondern nur pascal lernen. kylix schon eher. ich versuche jetzt irgendwo noch eine seutsche version von borlandpascal zu bekommen.
                        das alte gute dos...

                        wie ich bisher sehe, ist es garnicht so schwer von c auf pascal zu kommen. gibt es auch arrays, structs, classes und unions (und die blöden streams)?
                        Das mir mein Hund viel lieber sei; Sagst du, oh Mensch, sei Sünde. Doch mein Hund bleibt mir im Sturme treu; Der Mensch nicht mal im Winde.
                        Die technischen Fortschritte und menschlichen Rückschritte des STFs.

                        Kommentar


                          #13
                          Originalnachricht erstellt von deac

                          ich hab gerade gehört, dass turbopascal eine sehr ausführliche hilfe hat.
                          Das stimmt, gibt zu jedem Befehl ne Erklärung und oft noch weitere Verknüpfungen. Man sollte sich allerdings nicht zu doll auf die Hilfe verlassen, denn jede hat ihre Fehler....

                          Chakotay

                          Kommentar


                            #14
                            Deswegen hat mich Turboc++ ja immer abgeschreckt (wegen der Hilfe)

                            . ich möchte ja keine programme schreiben sondern nur pascal lernen
                            Dann reicht es doch die Hilfe zu lesen oder ein gutes Buch dazuzunehmen. , vorallem wenn man c kann.
                            Aber Kylix ist doch praktisch Delphi. Das einzige sind Teile der API, die anders heissen. Jedoch ist die Sprache Object Pascal identisch.
                            Mir persönlich hat Turbo Pascal 7.0 immer am besten gefallen.
                            Das hatte eine anständige Hilfe. Man konnte übersichtlich programmieren und es war im Prinzip alles möglich.
                            Aber falls es möglich ist, würde ich mir wieder Borland Pascal 7.0 besorgen, denn das beinhaltet TP 7.0/ Borland Pascal 7.0/ BPWin. Das war ein wirklich sensationell großes Packet damals.

                            Ich glaube die Strukturen sind sich gar nicht so unähnlich, aber von streams hab ich bisher keinen Gebrauch in TP gemacht (gibts glaub ich nicht). Im gesamten gilt: TP baut deutlich weniger auf Zeiger-arithmetik und ist gerade deswegen für den Anfänger besser und übersichtlicher

                            Kommentar


                              #15
                              Danke für die Hilfe!

                              Karmin hat recht. Hier die richtige Version:

                              program Kreisberechnung;
                              var auswahl :char;
                              var d,A,U :real;
                              begin
                              writeln('Kreisberechnung');
                              writeln('===============');
                              writeln('Ein Kreis ist durch eine der 3 Groessen Durchmesser d, Umfang U oder');
                              writeln('Flaeche A eindeutig bestimmt.');
                              writeln('Nach Eingabe von einer der 3 Groessen, werden die beiden fehlenden');
                              writeln('vom Programm berechnet und auf 2 Nachkommastellen gerundet.');
                              writeln('Zum Schluss werden alle 3 Werte auf dem Bildschirm ausgegeben.');
                              writeln;
                              writeln;
                              writeln;
                              writeln('gegeben: gesucht: Auswahl:');
                              writeln('___________________________________________________');
                              writeln('Durchmesser Umfang, Flaeche 1');
                              writeln('Flaeche Durchmesser, Umfang 2');
                              writeln('Umfang Durchmesser, Flaeche 3');
                              writeln;
                              writeln('Programmende 4');
                              writeln;
                              writeln;
                              write('Waehlen Sie eine Zahl: '); readln(auswahl);
                              writeln;
                              writeln;
                              case auswahl of
                              '1' : begin write('Durchmesser: '); readln(d); U:=pi*d; A:=pi*sqr(d)/4; end;
                              '2' : begin write('Flaeche: '); readln(A); d:=sqrt(4*A/pi); U:=pi*d; end;
                              '3' : begin write('Umfang: '); readln(U); d:=U/pi; A:=pi*sqr(d)/4; end;
                              '4' : begin write('Ende'); end;
                              else begin write('Eingabe nicht moeglich.'); end;
                              end; {of case}
                              writeln;
                              writeln;
                              writeln;
                              writeln('Durchmesser Flaeche Umfang');
                              writeln('========================================');
                              writeln(d:0:2,' ',A:0:2,' ',U:0:2);
                              readln;
                              end.

                              Kommentar

                              Lädt...
                              X