Πανελλήνιες 2012 - Λύσεις

Ξεκίνησε από Γιάννης Αναγνωστάκης, 07 Ιουν 2012, 03:16:23 ΜΜ

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

Γιάννης Αναγνωστάκης

Λύσεις των θεμάτων 2012


ΘΕΜΑ Α
Α1)
α) Σωστό   
β) Λάθος
γ) Λάθος
δ) Σωστό 
ε) Σωστό

Α2)
1-ε
2-γ 
3-α
4-στ 
5-β

Α3) γ

Α4)
Βασικές αλγοριθμικές δομές: ακολουθία, επιλογή, επανάληψη
Τεχνικές : Ιεραρχικός σχεδιασμός, Τμηματικός προγραμματισμός

Α5) Φραστική, ψευδοκώδικας, λογικό διάγραμμα


ΘΕΜΑ Β

Β1)

                              Χ     Α
ΑΡΧΙΚΕΣ ΤΙΜΕΣ       10   20
1η επανάληψη        5    23
2η επανάληψη        2    22
3η επανάληψη        1    25
4η επανάληψη       0    24


Β2)

24 , 48 (αντίστοιχα για τις μεταβλητές Β,Γ)



ΘΕΜΑ Γ

Αρχή
   ΣΥΝΟΛΟ=0
   Για 50 φορές επανάλαβε
   Αρχή
      Διάβασε ΟΝ,GB
      AN GB<=2
      τότε ΧΡ=GB*10
      Αλλιώς Αν GB<=6
      τότε ΧΡ=2*10+(GB-2)*2.5
      Αλλιώς ΧΡ=2*10+4*2.5 + (GB-6)*1.5
      ΧΡ=ΧΡ+3
      Εμφάνισε ΟΝ,ΧΡ
      ΣΥΝΟΛΟ=ΣΥΝΟΛΟ+ΧΡ
   Τέλος
   ΜΟ=ΣΥΝΟΛΟ/50
   Εμφάνισε ΜΟ
Τέλος

ΘΕΜΑ Δ

program  themad;
var
   typos: string;
   sum,pl, money, epiv: integer;
begin
   sum:=0;
   pl:=0;
   readln(typos);
      while typos<>'ΤΕΛΟΣ' do
   begin
      readln(epiv);
      if typos='M'
      then money:=10
      else if typos='A'
      then money:=20
      else
         begin
              money:=30;
            pl:=pl+1;
         end;
      money:=money+(epiv-1)*5;
      sum:=sum+money;
      readln(typos);
   end;
      writeln(pl:5, sum:10);
end.

demy8

συμφωνώ απόλυτα με τις λύσεις σου, νομίζω οτι τα θέματα ήταν εύκολα, βέβαια με την υπόδειξη στο θέμα Γ κατάλαβα οτι ήθελε ψευδοκώδικα και απλά να χρησιμοποιήσουμε στοιχεία της pascal  (πχ AND) και όχι όλο το πρόγραμμα σε pascal.

Γιάννης Αναγνωστάκης

nope...

Δεν τις κρατάει..

Κάθε φορά λαμβάνει άλλη τιμή με βάση την είσοδο...Επίσης δεν απαιτείται έλεγχος εγκυρότητας...

demy8

ναι ναι το προσεξα μετά για αυτο το έσβησα ;)

Γιάννης Αναγνωστάκης


kostas318

Καλημέρα
Εχω μια ενσταση ως προς την απάντηση στο θέμα Α3, το Α θεωρω οτι είναι σωστό γιατί αφου δεν εχει παρενθεσεις δεν μπορει να εκτελειται πρωτα απο δεξια και το αποτελεσμα να το προσθετει στο 5 δεν ειναι μαθηματικα ορθό.
Παρακαλώ των καθηγητη που εγραψε τις απαντησεις να με βοηθησει να καταλάβω γιατι βγαινει 7

ευχαριστω

demy8

Χ := 5 + 7 div 3 * 4 - 6 =
        5 + 2 * 4 - 6 =
        5 + 8 - 6 =
        13 - 6 =
        7

Γιάννης Αναγνωστάκης

Παράθεση από: demy8 στις 07 Ιουν 2012, 03:32:41 ΜΜ
Χ := 5 + 7 div 3 * 4 - 6 =
        5 + 2 * 4 - 6 =
        5 + 8 - 6 =
        13 - 6 =
        7

Με κάλυψε πλήρως η συνάδελφος

kostas318

ευχαριστω πολυ πανε τα 100 και εμειναν τα 96

Γιάννης Αναγνωστάκης

Παράθεση από: kostas318 στις 07 Ιουν 2012, 03:43:29 ΜΜ
ευχαριστω πολυ πανε τα 100 και εμειναν τα 96

Κρίμα να χάσεις το 100 για ένα μαθηματικό λάθος...το 96 βέβαια δεν είναι και λίγο!

ronalz

Ωραιά:)
το έπιασα το 100στάρη..
το Δ το εκανα me repeat .. until γιατι λέει οτι υπαρχει τουλαχιστον ενα όχημα..

Γιάννης Αναγνωστάκης


ronalz


Γιάννης Αναγνωστάκης


ronalz

until typos<>'ΤΕΛΟΣ'
αφου έλεγε οτι μπαινει τουλαχιστον μια φορα.

ronalz


Γιάννης Αναγνωστάκης

Παράθεση από: ronalz στις 07 Ιουν 2012, 04:04:12 ΜΜ
until typos<>'ΤΕΛΟΣ'
αφου έλεγε οτι μπαινει τουλαχιστον μια φορα.



repeat
readln(typos);
if typos<>'ΤΕΛΟΣ' then
.....
until typos='ΤΕΛΟΣ'

1) Αφού το έκανες με until η συνθήκη είναι typos='ΤΕΛΟΣ'

2) Το if χρειάζεται, γιατί αν απουσιάζει τότε το πρόγραμμα διαβάζει αριθμό επιβατών, υπολογίζει χρέωση και συνολική χρέωση ακόμα και όταν δώσουμε τη λέξη 'ΤΕΛΟΣ', ενώ δεν θα έπρεπε...

ronalz

ναι ξερω.. θα μου κοψουν μερικες απο εκει..

dolcefarniente

Αν ήταν όμως κάπως έτσι:

sum:=0;
repeat
readln(typos);
readln(epivates);
if typos= 'M' then
  xr:= 10 +(epivates - 1)*5
else if typos = 'A' then
  xr:= 20 +(epivates - 1)*5
else if typos = 'Φ' then
  begin 
   xr:= 30 +(epivates - 1)*5;
  pl:= pl+1;
end;
sum = sum+ xr;
until typos = "ΤΕΛΟΣ"

αν έδινα τη λέξη τέλος δε θα έμπαινε σε κανένα if, θα γινόταν εκτέλεση 1 φορά και θα ήταν οκ. Σωστά;

Γιάννης Αναγνωστάκης

Πέρα του ότι είναι λογικό λάθος, από τη στιγμή που δώσαμε τη λέξη 'ΤΕΛΟΣ' να πρέπει να δώσουμε και αριθμό επιβατών τι θα γινόταν με την εντολή sum = sum+ xr;

Τι τιμή θα είχε το xr για να γίνει η πρόσθεση; (προφανώς του προηγούμενου οχήματος)

dolcefarniente

Παράθεση από: janag79 στις 07 Ιουν 2012, 04:21:05 ΜΜ
Πέρα του ότι είναι λογικό λάθος, από τη στιγμή που δώσαμε τη λέξη 'ΤΕΛΟΣ' να πρέπει να δώσουμε και αριθμό επιβατών τι θα γινόταν με την εντολή sum = sum+ xr;

Τι τιμή θα είχε το xr για να γίνει η πρόσθεση; (προφανώς του προηγούμενου οχήματος)

Σωστά. Τότε θα έπρεπε να υπάρχει ένα else xr:=0 πριν τη sum = sum+ xr;, οπότε για το αρχικό όχημα έχοντας αρχικοποιήσει το xr:=0 to sum θα ήταν 0 και θα σταματούσε η επανάληψη, ενώ για κάποιο επόμενο θα παρέμενε sum:=sum και θα σταματούσε.

Γιάννης Αναγνωστάκης

Παράθεση από: dolcefarniente στις 07 Ιουν 2012, 04:32:32 ΜΜ
Σωστά. Τότε θα έπρεπε να υπάρχει ένα else xr:=0 πριν τη sum = sum+ xr;, οπότε για το αρχικό όχημα έχοντας αρχικοποιήσει το xr:=0 to sum θα ήταν 0 και θα σταματούσε η επανάληψη, ενώ για κάποιο επόμενο θα παρέμενε sum:=sum και θα σταματούσε.

Αυτό βελτιώνει τη κατάσταση , αλλά κατά την άποψη μου, δεν ικανοποιεί αυτό που ζητάει η άσκηση...Δηλαδή, δεν πρέπει να προχωράει και να δέχεται αριθμό επιβατών όταν έχουμε δώσει ως τύπο τη λέξη 'ΤΕΛΟΣ'..για αυτό είπα ότι χρειάζεται αυτό το if

ronalz

πόσο λέτε να μου κόψουν?  :(

Γιάννης Αναγνωστάκης


dolcefarniente

Παράθεση από: janag79 στις 07 Ιουν 2012, 04:36:03 ΜΜ
Αυτό βελτιώνει τη κατάσταση , αλλά κατά την άποψη μου, δεν ικανοποιεί αυτό που ζητάει η άσκηση...Δηλαδή, δεν πρέπει να προχωράει και να δέχεται αριθμό επιβατών όταν έχουμε δώσει ως τύπο τη λέξη 'ΤΕΛΟΣ'..για αυτό είπα ότι χρειάζεται αυτό το if

Συμφωνώ απολύτως με το while που έχεις δώσει, έχεις πολύ λιγότερα να σκεφτείς και να ελέγξεις από ότι στην υλοποίηση με repeat. Ευχαριστώ για την άποψη σου.
Και κάτι ακόμα, πόσα μόρια πιστεύεις ότι θα έκοβαν από κάποιον που δεν έβαλε ξανά read στο σώμα της επανάληψης και είναι σοβαρό λάθος;

ronalz

Παράθεση από: janag79 στις 07 Ιουν 2012, 04:39:51 ΜΜ
Δεν πιστεύω πάνω 2 μόρια

σε ευχαριστω πολυ janag79..
και γενικα ευχαριστω όλο το Φορουμ για την συμπαρασταση σας σε εμας

Γιάννης Αναγνωστάκης

Παράθεση από: dolcefarniente στις 07 Ιουν 2012, 04:43:19 ΜΜ
Συμφωνώ απολύτως με το while που έχεις δώσει, έχεις πολύ λιγότερα να σκεφτείς και να ελέγξεις από ότι στην υλοποίηση με repeat. Ευχαριστώ για την άποψη σου.
Και κάτι ακόμα, πόσα μόρια πιστεύεις ότι θα έκοβαν από κάποιον που δεν έβαλε ξανά read στο σώμα της επανάληψης και είναι σοβαρό λάθος;

Nα σαι καλά

Εννοείς σε κάποιον που το έκανε με while και δεν έβαζε να ξαναδιαβάζει πάλι τύπο πριν κλείσει η while;

Γιάννης Αναγνωστάκης

Παράθεση από: ronalz στις 07 Ιουν 2012, 04:44:51 ΜΜ
σε ευχαριστω πολυ janag79..
και γενικα ευχαριστω όλο το Φορουμ για την συμπαρασταση σας σε εμας

Καλά αποτελέσματα να χετε παιδιά!

dolcefarniente

Παράθεση από: janag79 στις 07 Ιουν 2012, 04:45:07 ΜΜ
Nα σαι καλά

Εννοείς σε κάποιον που το έκανε με while και δεν έβαζε να ξαναδιαβάζει πάλι τύπο πριν κλείσει η while;


Ναι. Στην περίπτωση της while αν δεν είχε μέσα read, αλλά μόνο έξω. Δε σταματάει ποτέ και είναι σοβαρό λάθος.

Γιάννης Αναγνωστάκης

Παράθεση από: dolcefarniente στις 07 Ιουν 2012, 04:47:59 ΜΜ

Ναι. Στην περίπτωση της while αν δεν είχε μέσα read, αλλά μόνο έξω. Δε σταματάει ποτέ και είναι σοβαρό λάθος.

Κοίτα..Αν το γράφαμε σε διαγώνισμα σε τάξη, μπορεί  να έκοβα πολλά  μόνο και μόνο για να σου τονίσω την σημαντικότητα του

Εδώ, με βάση το ότι η παράλειψη σου επηρεάζει τα ερωτήματα Δ2,Δ4 άντε να σου κόψουν 3-4 μόρια (το πολύ) , κατά τη προσωπική μου άποψη

gedeon

Παράθεση από: janag79 στις 07 Ιουν 2012, 04:58:31 ΜΜ

Κοίτα..Αν το γράφαμε σε διαγώνισμα σε τάξη, μπορεί  να έκοβα πολλά  μόνο και μόνο για να σου τονίσω την σημαντικότητα του

Εδώ, με βάση το ότι η παράλειψη σου επηρεάζει τα ερωτήματα Δ2,Δ4 άντε να σου κόψουν 3-4 μόρια (το πολύ) , κατά τη προσωπική μου άποψη


Όσο κι αν σας φαίνεται περίεργο το συγκεκριμένο λάθος είναι   -1 μονάδα.

Γιάννης Αναγνωστάκης

Παράθεση από: gedeon στις 07 Ιουν 2012, 05:00:57 ΜΜ
Όσο κι αν σας φαίνεται περίεργο το συγκεκριμένο λάθος είναι   -1 μονάδα.

Οπότε μικρό το κακό....

dolcefarniente

Ευχαριστώ janag79 και gedeon για τις απαντήσεις.

gedeon

Η ΚΕΕ στέλνει βαθμολόγηση προγραμμάτων δίνοντας μονάδες ανά γραμμή εντολής....
δε πάει στη λογική ότι εφόσον λείπει το 2ο readln  δε θα δουλέψει η while.

Όμως ο βαθμολογητής έχει τη "δυνατότητα" να θεωρήσει μεγαλύτερης βαρύτητας αυτή την έλλειψη και να κόψει 2, 3 μονάδες.
Συνήθως σε αυτές τις ασκήσεις γίνονται και οι αποκλίσεις απο βαθολογητή σε βαθμολογητή.

dolcefarniente

Και για όσους έβαλαν μηνύματα στις εντολές εξόδου παρά τις υποδείξεις;;

gedeon

Παράθεση από: dolcefarniente στις 07 Ιουν 2012, 05:15:30 ΜΜ
Και για όσους έβαλαν μηνύματα στις εντολές εξόδου παρά τις υποδείξεις;;

Δεν υπάρχει πρόβλημα... είτε σωστή είναι η writeln είτε λάθος, δεν βαθμολογείται. Βαθμολογούνται μόνο αυτά που ζητούν τα θέματα

kostas318

#36
Και πάλι καλησπέρα

Στο θέμα Δ έβαλα την case για τον υπολογισμό με βάση το γραμμα πειράζει?
την χρέωση για τους επιβάτες την έκανα με ξεχωριστό if έξω απο την case και σε ξεχωριστή μεταβλητή απο την χρέωση οχήματος και το αποτέλεσμα για τους επιβάτες το πρόσθετα σε μια μεταβλητή μαζί με την χρέωση οχήματος απο την case

Λογικά είναι σωστό απλά να το επιβεβαιώσω

program thema_d;
uses crt;
var
typos:char;
xreosi_oxim,xreosi_epiv,tel_xreosi,syn_xreosi:real;
ar_fortigon,ar_epivaton:integer;
begin
xreosi_oxim:=0;
xreosi_epiv:=0;
tel_xreosi:=0;
syn_xreosi:=0;
ar_fortigon:=0;
ar_epivaton:=0;
write('Δώσε τον τύπο του οχήματος: ');
readln(typos);
while typos <>'ΤΕΛΟΣ' do
begin
write('Δώσε τον αριθμό των επιβατών: ');
readln(ar_epivaton);
case typos of
'M': xreosi_oxim:=10;
'A': xreosi_oxim:=20;
'Φ': begin
     xreosi_oxim:=30;
     ar_fortigon:=ar_fortigon+1;
     end;
end;
if ar_epivaton=1 then
xreosi_epiv:=0
else
if ar_epivaton>1 then
xreosi_epiv:=(ar_epivaton-1)*5;
tel_xreosi:=xreosi_oxim+xreosi_epiv;
syn_xreosi:=syn_xreosi+tel_xreosi;
writeln('Το όχημα πρεπει να πληρώσει συνολικά: ',tel_xreosi:6:2);
writeln();
write('Δώσε τον τύπο του οχήματος: ');
readln(typos);
end;
writeln('Συνολικά επιβιβάστηκαν ',ar_fortigon,' φορτηγά');
writeln('Η συνολική χρέωση ολων των οχημάτων ειναι',syn_xreosi:8:2);
end.

vaiosz

Κάποιος που έχει κάνει το Θέμα Γ με πρόγραμμα σε Pascal αλλά το έχει ολόσωστο, πόσα μόρια πιστεύετε ότι μπορεί να χάσει;
Μηχανικός Η/Υ Συστημάτων

kostas318

Γιατί κάποιος που ελυσε το θέμα Γ με pascal να χάσει μονάδες ??????  :o αφου έλεγε με ψευδοκώδικα ή εντολές pascal αλλίως ας έλεγε ας δοθεί ο αλγόριθμος σε ψευδοκώδικα.
Πιστεύω πως από την στιγμή που η λειτουργία του αλγορίθμου είναι σωστή και βγάζει τα ζητούμενα αποτελέσματα δεν πρέπει να χάσεις κάτι

Stefevan

Ο αλγόριθμος μπορεί να αποδοθεί: Με ψευδοκώδικα
χρησιμοποιώντας τις εντολές που αναφέρονται στο σχετικό
πίνακα του βιβλίου σας ή με στοιχεία (εντολές) της γλώσσας
Pascal.


Όντως... γιατί ?? Δεν τίθεται τέτοιο θέμα. Προφανώς και δεν χάνει μόρια!! Πιο ξεκάθαρο δεν γίνεται να είναι το παραπάνω!!!  Που να μην το έλεγαν κιόλας

Γιάννης Αναγνωστάκης

Παράθεση από: kostas318 στις 07 Ιουν 2012, 09:45:49 ΜΜ
Και πάλι καλησπέρα

Στο θέμα Δ έβαλα την case για τον υπολογισμό με βάση το γραμμα πειράζει?
την χρέωση για τους επιβάτες την έκανα με ξεχωριστό if έξω απο την case και σε ξεχωριστή μεταβλητή απο την χρέωση οχήματος και το αποτέλεσμα για τους επιβάτες το πρόσθετα σε μια μεταβλητή μαζί με την χρέωση οχήματος απο την case

Λογικά είναι σωστό απλά να το επιβεβαιώσω

program thema_d;
uses crt;
var
typos:char;
xreosi_oxim,xreosi_epiv,tel_xreosi,syn_xreosi:real;
ar_fortigon,ar_epivaton:integer;
begin
xreosi_oxim:=0;
xreosi_epiv:=0;
tel_xreosi:=0;
syn_xreosi:=0;
ar_fortigon:=0;
ar_epivaton:=0;
write('Δώσε τον τύπο του οχήματος: ');
readln(typos);
while typos <>'ΤΕΛΟΣ' do
begin
write('Δώσε τον αριθμό των επιβατών: ');
readln(ar_epivaton);
case typos of
'M': xreosi_oxim:=10;
'A': xreosi_oxim:=20;
'Φ': begin
     xreosi_oxim:=30;
     ar_fortigon:=ar_fortigon+1;
     end;
end;
if ar_epivaton=1 then
xreosi_epiv:=0
else
if ar_epivaton>1 then
xreosi_epiv:=(ar_epivaton-1)*5;
tel_xreosi:=xreosi_oxim+xreosi_epiv;
syn_xreosi:=syn_xreosi+tel_xreosi;
writeln('Το όχημα πρεπει να πληρώσει συνολικά: ',tel_xreosi:6:2);
writeln();
write('Δώσε τον τύπο του οχήματος: ');
readln(typos);
end;
writeln('Συνολικά επιβιβάστηκαν ',ar_fortigon,' φορτηγά');
writeln('Η συνολική χρέωση ολων των οχημάτων ειναι',syn_xreosi:8:2);
end.


Η μεταβλητή typos δεν είναι char (γιατί κάποια στιγμή παίρνει την τιμή 'ΤΕΛΟΣ')


Παρά τους άσκοπους μηδενισμούς που κάνεις στην αρχή (εκτός των syn_xreosi,ar_fortigon)  φαίνεται πως είναι μία χαρά η λύση σου

kostas318

Ευχαριστώ για την απάντηση σας.

Τη μεταβλητή τύπος το σκέφτηκα μετά ότι είναι string.Πόσο μπορεί να μου κόψει για αυτό το λάθος?

Ευχαριστώ


gedeon

Παράθεση από: kostas318 στις 09 Ιουν 2012, 09:52:54 ΜΜ
Ευχαριστώ για την απάντηση σας.

Τη μεταβλητή τύπος το σκέφτηκα μετά ότι είναι string.Πόσο μπορεί να μου κόψει για αυτό το λάθος?

Ευχαριστώ



-1 μονάδα,

Αν είχα το γραπτό σου ούτε αυτή θα έκοβα λόγω της λύσης που έδωσες, μπράβο σου

ronalz

ευχαριστω για τη στηριξη σας :)
ο βαθμος μου στον δομημενο προγραμματισμο ηταν 199,0 ^^ :)