Pascal σε ψευδοκώδικα - Πολλαπλή επιλογή

Ξεκίνησε από anasta, 29 Οκτ 2009, 10:01:08 ΠΜ

« προηγούμενο - επόμενο »

anasta

Πως θα μετατρέπατε σε ψευδοκώδικα το παρακάτω πρόγραμμα σε Pascal;;;;
όχι όμως με εμφωλευμένες....

program ASKHSH;
var
   MO:real;
begin
   writeln('ΔΩΣΕ ΤΕΛΙΚΟ ΜΕΣΟ ΟΡΟ');
   readln(MO);
   if ((MO>=0) and (mo<=9.5)) then
      begin
         writeln('Ο μαθητής απορρίπτεται');
      end
   else if ((MO>9.5) and (MO<=13)) then
      begin
         writeln('Σχεδόν καλά');
      end
   else if ((MO>13) and (MO<=16)) then
      begin
         writeln('Kαλά');
      end
   else if ((MO>16) and (MO<=18)) then
      begin
         writeln('Πολύ καλά');
      end
   else if ((MO>18) and (MO<=20)) then
      begin
         writeln('Άριστα');
      end
   else
      begin
         writeln('ΑΚΥΡΟΣ ΒΑΘΜΟΣ');
      end;
   
end.

Ιωάννης Γκίνης

Άσχετο με την ερώτησή σου αλλά θα μου επιτρέψεις να πω ότι το πρόγραμμά σου κάνει περιττούς ελέγχους, κάτι που είναι deprecated με βάση τα σχολικά εγχειρίδια.
Επίσης κάτι που στα δικά μου τα μάτια φαίνεται πολύ εκνευριστικό είναι η άσκοπη χρήση το compound statement.

Βασίλης Ραξενίδης

Γιατί ντε και καλά δεν θέλεις φωλιασμένες ΑΝ ? Πως αλλιώς να γίνει?
jgini τι εννοείς όταν λες ότι οι περιττοί έλεγχοι είναι deprecated? Επίσης τί εννοείς όταν λες compound statement;

Ιωάννης Γκίνης

Deprecated είναι κάτι που συνίσταται να αποφεύγεται
http://en.wikipedia.org/wiki/Deprecation

Compound Statement ή στα ελληνικά σύνθετη εντολή ή μπλοκ εντολών είναι η ομαδοποίηση εντολών σε μία, με χρήση των begin - end για τη Pascal. Όταν η εντολή είναι μία το μπλοκ εντολών είναι περιττό.
http://www.mirrorservice.org/sites/www.gnu-pascal.de/gpc/begin-end-Compound-Statement.html

Σε ότι αφορά την πολλαπλή επιλογή δείτε την Άσκηση 10 στον παρακάτω σύνδεσμο. Ίσως σας βοηθήσει.
http://users.att.sch.gr/jginis/?pg=sp#pseudo10

karinakis

συνάδελφε θα έλεγα ότι σωστά αντιμεπωπίζεις με ψευδοκώδικα την πολλαπλή επιλογή και μάλιστα αναφέρεσαι στην άσκηση 10. Όμως στη συγκεκριμένη άσκηση δεν θα έλεγα ότι από την εκφώνηση είναι κατανοητό πως υπάρχει επαναληπτική δομή στο πρόβλημα που παραθέτεις. Ωστόσο για άλλη μία φορά πρέπει να πω πως το βιβλίο είναι απαράδεκτο και εμείς όλοι απλά ανακαλύπτουμε τρόπους αναπαράστασης του αλγορίθμου με ψευδοκώδικα και ....προσευχόμαστε να είναι αποδεκτοί από τους βαθμολογητές διαφορετικά τους μαθητές μας τους έχουμε κυριολεκτικά κάψει από τώρα.

iliasthes

Αν και δεν το δοκίμασα σε κάποιον compiler, κάπως έτσι θα ήταν ο κώδικας αν αποφεύγαμε τα else if.Πολύ πιθανό να υπάρχουν λαθάκια, αφού δεν το δοκίμασα. Όλες οι ασκήσεις λύνονται και με τους δύο τρόπους, αλλά όπως βλέπετε, χρειάζεται επιπλέον αλγόριθμος μετά για να εντοπίζουμε ποιο else αντιστοιχεί σε ποιο if. Πέρσι δυστυχώς αναγκάστηκα να γράψω πολλούς αλγόριθμους με αυτή τη λογική, για να αποφύγω το Αλλιώς_ΑΝ:

If MO>=0 then
   If Mo<=20 then
           If Mo<=18 then
                If Mo<= 16 then
                    If Mo<=13 then
                          If Mo<=9,5 then
                                  writeln('O mathitis aporriptetai');
                     else
                          writeln('Sxedon Kala')
                 else
                     writeln('Kala')
           else
              writeln('Poly kala')
      else
          writeln('Arista')
else
writeln('Dwsate mi apodekto vathmo') 
                       

anasta

Παράθεση από: jginis στις 29 Οκτ 2009, 12:57:09 ΜΜ
Άσχετο με την ερώτησή σου αλλά θα μου επιτρέψεις να πω ότι το πρόγραμμά σου κάνει περιττούς ελέγχους, κάτι που είναι deprecated με βάση τα σχολικά εγχειρίδια.
Επίσης κάτι που στα δικά μου τα μάτια φαίνεται πολύ εκνευριστικό είναι η άσκοπη χρήση το compound statement.
ΣΤΗΝ ΠΕΡΙΠΤΩΣΗ ΠΟΥ ΔΩΣΕΙ Ο ΧΡΗΣΤΗΣ ΜΗ ΑΠΟΔΕΚΤΗ ΤΙΜΗ π.χ. -1 ΓΙΑ ΒΑΘΜΟ, ΧΩΡΙΣ ΑΥΤΟΥΣ ΤΟΥΣ ΠΕΡΙΤΤΟΥΣ ΕΛΕΓΧΟΥΣ ΘΑ ΔΩΣΕΙ ΛΑΘΟΣ ΑΠΟΤΕΛΕΣΜΑ. ΕΦΟΣΟΝ ΔΕΝ ΥΠΑΡΧΕΙ "ΔΙΑΣΦΑΛΙΣΗ" ΤΙΜΗΣ ΝΟΜΙΖΩ ΠΩΣ ΟΙ ΠΕΡΙΤΤΕΣ ΛΟΓΙΚΕΣ ΣΥΝΘΗΚΕΣ ΜΟΝΟ ΠΕΡΙΤΤΕΣ ΔΕΝ ΕΙΝΑΙ!
ΟΣΟ ΓΙΑ ΤΑ BEGIN K END Κ ΕΜΕΝΑ ΜΟΥ ΤΗ "ΣΠΑΝΕ" ΑΛΛΑ ΠΡΟΤΙΜΩ ΝΑ ΤΑ ΓΡΑΦΩ ΓΙΑ ΝΑ ΜΗΝ ΜΠΕΡΔΕΥΟΝΤΑΙ ΤΑ ΠΑΙΔΙΑ.

Παράθεση από: Βασίλης Ραξενίδης στις 29 Οκτ 2009, 04:44:23 ΜΜ
Γιατί ντε και καλά δεν θέλεις φωλιασμένες ΑΝ ? Πως αλλιώς να γίνει?
ΓΙΑΤΙ ΜΕ ΕΜΦΩΛΕΥΜΕΝΕΣ ΣΥΜΦΩΝΑ ΜΕ ΤΟ ΒΙΒΛΙΟ ΒΓΑΙΝΕΙ.
ΜΕ "ΑΝ...ΑΛΛΙΩΣ_ΑΝ" ΟΠΩΣ ΣΤΗΝ ΑΕΠΠ ΟΜΩΣ??
ΕΛΕΓΑ ΜΗΠΩΣ ΜΟΥ ΔΙΕΦΕΥΓΕ ΚΑΤΙ.
ΜΑΛΛΟΝ ΠΡΕΠΕΙ ΝΑ ΤΟ ΚΑΝΟΥΜΕ ΟΠΩΣ ΤΟ ΜΠΛΕ ΠΛΑΙΣΙΟ ΤΗΣ ΣΕΛΙΔΑΣ 30 ΤΟΥ ΒΙΒΛΙΟΥ.

ΣΥΝΑΔΕΛΦΙΚΟΥΣ ΧΑΙΡΕΤΙΣΜΟΥΣ!

Νίκος Αδαμόπουλος

Παράθεση από: iliasthes στις 29 Οκτ 2009, 09:31:46 ΜΜ
Αν και δεν το δοκίμασα σε κάποιον compiler, κάπως έτσι θα ήταν ο κώδικας αν αποφεύγαμε τα else if. 

Αν και δεν έχω υπόψη μου τα περί του μαθήματος, όμως γιατί κάποιος να προσπαθεί να αποφύγει τα "else if";

Δεν είναι όπως το "αλλιώς_αν" που απαιτεί άλλη αντιμετώπιση σε σχέση με το "αλλιώς αν" δηλαδή με το
"αλλιώς
    Αν"

...αλλά είναι το else που ακολουθείται από άλλη εντολή if.

Ιωάννης Γκίνης

Παράθεση από: anasta στις 29 Οκτ 2009, 09:33:34 ΜΜ
ΣΤΗΝ ΠΕΡΙΠΤΩΣΗ ΠΟΥ ΔΩΣΕΙ Ο ΧΡΗΣΤΗΣ ΜΗ ΑΠΟΔΕΚΤΗ ΤΙΜΗ π.χ. -1 ΓΙΑ ΒΑΘΜΟ, ΧΩΡΙΣ ΑΥΤΟΥΣ ΤΟΥΣ ΠΕΡΙΤΤΟΥΣ ΕΛΕΓΧΟΥΣ ΘΑ ΔΩΣΕΙ ΛΑΘΟΣ ΑΠΟΤΕΛΕΣΜΑ.

Είναι απλό, κρατάμε μόνο την πρώτη συνθήκη ((MO >= 0) and (MO <= 9.5)) και απλουστεύουμε τις υπόλοιπες.

program Askisi;

var
  MO: Real;

begin
  Write('Dwse ton teliko meso oro: ');
  Readln(MO);
  
  if (MO >= 0) and (MO <= 9.5) then
    Writeln('O ma9itis aporriptetai')
  else if MO <= 13 then
    Writeln('Sxedon kala')
  else if MO <= 16 then
    Writeln('Kala')
  else if MO <= 18 then
    Writeln('Poly kala')
  else if MO <= 20 then
    Writeln('Arista')
  else
    Writeln('Mi apodektos mesos oros')
end.

Νίκος Αδαμόπουλος

Παράθεση από: jginis στις 29 Οκτ 2009, 09:52:25 ΜΜ
Είναι απλό, κρατάμε μόνο την πρώτη συνθήκη ((MO >= 0) and (MO <= 9.5)) και απλουστεύουμε τις υπόλοιπες.

program Askisi;

var
  MO: Real;

begin
  Write('Dwse ton teliko meso oro: ');
  Readln(MO);
  
  if (MO >= 0) and (MO <= 9.5) then
    Writeln('O ma9itis aporriptetai')
  else if MO <= 13 then
    Writeln('Sxedon kala')
  else if MO <= 16 then
    Writeln('Kala')
  else if MO <= 18 then
    Writeln('Poly kala')
  else if MO <= 20 then
    Writeln('Arista')
  else
    Writeln('Mi apodektos mesos oros')
end.


Πρόσεξε: Αν ο MO είναι -1 τότε θα μπει στη 2η περίπτωση και θα εμφανίσει "Sxedon kala". Είναι αρκετά συνηθισμένο λάθος και είχα ανεβάσει σχετικό θέμα στο: https://alkisg.mysch.gr/steki/index.php?topic=2145

anasta

Παράθεση από: jginis στις 29 Οκτ 2009, 09:52:25 ΜΜ
Είναι απλό, κρατάμε μόνο την πρώτη συνθήκη ((MO >= 0) and (MO <= 9.5)) και απλουστεύουμε τις υπόλοιπες.

ΕΠΙΜΕΝΕΙΣ....
ΑΝ ΔΩΣΕΙ ΓΙΑ ΜΕΣΟ ΟΡΟ ΤΗΝ ΤΙΜΗ -1 Η ΠΡΩΤΗ ΣΥΝΘΗΚΗ ΔΕΝ ΙΣΧΥΕΙ.
Η ΕΠΟΜΕΝΗ ΟΜΩΣ "else if MO <= 13 then" ΙΣΧΥΕΙ (ΩΣ ΓΝΩΣΤΟ -1<13), ΟΠΟΤΕ ΕΙΝΑΙ ΑΛΗΘΗΣ, ΟΠΟΤΕ ΘΑ ΕΚΤΕΛΕΣΤΕΙ.   ;)

Ιωάννης Γκίνης

#11
Έχετε απόλυτο δίκιο. Ήμουν αφελής. Επιτρέψτε μου να διορθώσω.
program Askisi;

var
  MO: Real;

begin
  Write('Dwse ton teliko meso oro: ');
  Readln(MO);
 
  if (MO < 0) or (MO > 20) then
    Writeln('Mi apodektos mesos oros')
  else if MO <= 9.5 then
    Writeln('O ma9itis aporriptetai')
  else if MO <= 13 then
    Writeln('Sxedon kala')
  else if MO <= 16 then
    Writeln('Kala')
  else if MO <= 18 then
    Writeln('Poly kala')
  else 
    Writeln('Arista')
end.

anasta

Παράθεση από: iliasthes στις 29 Οκτ 2009, 09:31:46 ΜΜ
Αν και δεν το δοκίμασα σε κάποιον compiler, κάπως έτσι θα ήταν ο κώδικας αν αποφεύγαμε τα else if.Πολύ πιθανό να υπάρχουν λαθάκια, αφού δεν το δοκίμασα. Όλες οι ασκήσεις λύνονται και με τους δύο τρόπους, αλλά όπως βλέπετε, χρειάζεται επιπλέον αλγόριθμος μετά για να εντοπίζουμε ποιο else αντιστοιχεί σε ποιο if. Πέρσι δυστυχώς αναγκάστηκα να γράψω πολλούς αλγόριθμους με αυτή τη λογική, για να αποφύγω το Αλλιώς_ΑΝ:

If MO>=0 then
   If Mo<=20 then
           If Mo<=18 then
                If Mo<= 16 then
                    If Mo<=13 then
                          If Mo<=9,5 then
                                  writeln('O mathitis aporriptetai');
                     else
                          writeln('Sxedon Kala')
                 else
                     writeln('Kala')
           else
              writeln('Poly kala')
      else
          writeln('Arista')
else
writeln('Dwsate mi apodekto vathmo') 
                       

ΕΥΧΑΡΙΣΤΩ ΠΟΛΥ, ΤΟ ΔΟΚΙΜΑΣΑ Κ ΕΦΤΙΑΞΑ ΤΟ ΠΑΡΑΚΑΤΩ.
ΣΥΓΝΩΜΗ ΑΛΛΑ ΣΤΟΝ COMPILER ΠΟΥ ΕΧΩ ΔΕΝ ΕΤΡΕΧΕ ΧΩΡΙΣ "COMPOUND STATEMENTS"
program ASKHSH;
var
   MO:real;
begin
   writeln('ΔΩΣΕ ΤΕΛΙΚΟ ΜΕΣΟ ΟΡΟ');
   readln(MO);
If MO>=0 then
   If Mo<=20 then
      If Mo<=18 then
         If Mo<= 16 then
            If Mo<=13 then
               If Mo<=9.5 then
              BEGIN
                 writeln('O mathitis aporriptetai');
              END
           else
           BEGIN
              writeln('Sxedon Kala');
           END
        else
        BEGIN
           writeln('Kala');
        END
     else
     BEGIN
         writeln('Poly kala');
     END
   else
   BEGIN
      writeln('Arista');
   END
else
BEGIN
   writeln('Dwsate mi apodekto vathmo');
END;

end.

Νίκος Αδαμόπουλος

#13
Παράθεση από: anasta στις 29 Οκτ 2009, 10:01:08 ΠΜ
Πως θα μετατρέπατε σε ψευδοκώδικα το παρακάτω πρόγραμμα σε Pascal;;;;
όχι όμως με εμφωλευμένες....

Τα begin end που είχες βάλει δεν χρειάζονταν (χωρίς όμως τα ερωτηματικά... γιατί τότε θα ήταν σαν να τελείωνε εκεί η πλησιέστερη if)! Η παρακάτω εκδοχή έχει απλούστερους ελέγχους. Όμως κι αυτή θεωρώ πως έχει εμφωλευμένα if, όπως και η αρχική σου λύση, όπως και αυτή του iliasthes που προσπάθησε να μη χρησιμοποιήσει else if...


program ASKHSH;
var
   mo:real;
begin
   writeln('ΔΩΣΕ ΤΕΛΙΚΟ ΜΕΣΟ ΟΡΟ');
   readln(mo);

   if ((mo<0) or (mo>20)) then
      writeln('ΑΚΥΡΟΣ ΒΑΘΜΟΣ')
   else if (mo<=9.5) then
      writeln('Ο μαθητής απορρίπτεται')
   else if (mo<=13) then
      writeln('Σχεδόν καλά')
   else if (mo<=16) then
      writeln('Kαλά')
   else if (mo<=18) then
      writeln('Πολύ καλά')
   else
      writeln('Άριστα');
end.

Νίκος Αδαμόπουλος

#14
Παράθεση από: Νίκος Αδαμόπουλος στις 29 Οκτ 2009, 10:26:44 ΜΜ
χωρίς όμως τα ερωτηματικά... γιατί τότε...

Γενικά η χρήση των ερωτηματικών στην Pascal πρέπει να γίνεται πολύ προσεκτικά και αφού κάποιος έχει καταλάβει την σημασία τους... Δεν οριοθετεί το τέλος των εντολών αλλά αποτελεί διαχωριστικό εντολών. Έτσι αν δεν ακολουθεί άλλη εντολή τότε μπορεί και να μην μπει. Όμως από την άλλη, δεν μπορεί να μπει στο μέσον κάποια εντολής!

Μια και με έπιασε όρεξη, και από όσο θυμάμαι από την τελευταία φορά που έπιασα pascal στα χέρια μου - πριν 3 χρόνια οπότε συγχωρήστε με αν κάνω κανά λάθος, ...στην ιf...then...else έχουμε:

if συνθήκη then εντολή1 else εντολή2


Όλο αυτό θεωρείται μια εντολή. Δεν μπορεί να κοπεί στα δύο βάζοντας ερωτηματικό:

if συνθήκη then εντολή1; else εντολή2


(δεν υπάρχει εντολή που να ξεκινάει με else!)

Αν αντί για μία εντολή πρέπει βάλουμε πολλές τότε τις βάζουμε μέσα σε begin end ώστε να "θεωρούνται πάλι ως μια":

if συνθήκη then begin εντολή1; ... εντολήn end else begin εντολή3; ... εντολήz end


...που μάλλον θα ήταν πιο κατανοητό αν γραφόταν έτσι:

if συνθήκη then 
  begin 
     εντολή1; 
     ... 
     εντολήn 
  end 
else 
  begin 
     εντολή3; 
     ... 
     εντολήz 
  end


Όλο αυτό συνεχίζει να θεωρείται μια εντολή. Άρα μπορεί να μπει ολόκληρο (και χωρίς begin end) ως εντολή μέσα σε άλλη if (μετά το then ή/και μετά το else), κ.ο.κ.

Και όλο αυτό μια εντολή θεωρείται:

if συνθήκη1 then if συνθήκη2 then εντολή1 else εντολή2 else if συνθήκη3 then εντολή3 else εντολή4


...που μάλλον θα ήταν πιο κατανοητό αν γραφόταν έτσι:

if συνθήκη1 then 
   if συνθήκη2 then 
      εντολή1 
   else 
      εντολή2 
else 
   if συνθήκη3 then 
      εντολή3 
   else 
      εντολή4


Τώρα, όταν γράφουμε:

if συνθήκη1 then
  εντολή1 
else if συνθήκη2 then 
  εντολή2   
else if συνθήκη3 then 
  εντολή3 
else 
  εντολή4


... είναι σαν να γράφουμε:

if συνθήκη1 then
  εντολή1 
else 
   if συνθήκη2 then 
      εντολή2   
   else 
      if συνθήκη3 then 
        εντολή3 
      else 
        εντολή4


Ουσιαστικά όλα αυτά είναι εμφωλευμένα! Το κάθε else αντιστοιχεί στο πλησιέστερο if που δεν έχει κλείσει (που δεν έχει άλλο πλησιέστερο else). Αν όμως δεν θέλουμε να γίνει κάτι τέτοιο, επειδή το πλησιέστερο if τυχαίνει να μην έχει το δικό του else, τότε μπορούμε να το κλείσουμε αυτό σε begin end ή να του προσθέσουμε else χωρίς εντολή! Δηλαδή:

if συνθήκη1 then 
  begin
     if συνθήκη2 then 
       εντολή1
  end
else 
   if συνθήκη3 then 
      εντολή3 
   else 
      εντολή4


ή

if συνθήκη1 then 
   if συνθήκη2 then 
     εντολή1
   else
else 
   if συνθήκη3 then 
      εντολή3 
   else 
      εντολή4


Αν δεν γινόταν κάτι από τα παραπάνω και είχαμε:

if συνθήκη1 then 
   if συνθήκη2 then 
      εντολή1
else 
   if συνθήκη3 then 
      εντολή3 
   else 
      εντολή4


...θα ήταν σαν να είχαμε:

if συνθήκη1 then 
   if συνθήκη2 then 
      εντολή1
   else 
      if συνθήκη3 then 
         εντολή3 
      else 
         εντολή4