Φωτογραφία ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ
Ασκηση 2 Απορια
από ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ - Tuesday, 1 May 2012, 3:21 PM
 
Στην ασκηση 2 θα φτιαξουμε 2 overloaded μεθοδους minimum αφου μας ζητατε να καλουμε την minimum με 2 και 3 ορισματα αντιστοιχα?

ή θα ορίσουμε κάτι σαν το παρακάτω:

vagos.Minimum( a, d, c);
και στην method : void Minimum(float first, float second, float third=0){ // an third =0 {vres ton min apo ta a,b} allios {vres ton min apo ta a,b,c}}

(Επεξεργασμένο από Βασίλης Κόλιας - αρχική υποβολή Τρίτη, 1 Μάιος 2012, 06:18 μμ)

 
Φωτογραφία Βασίλης Κόλιας
Απάντηση: Ασκηση 2 Απορια
από Βασίλης Κόλιας - Tuesday, 1 May 2012, 3:38 PM
 
Συνήθως καταλαβαίνεις αν χρειάζεται να φτιάξεις overloaded μεθόδους αν ζητείται κάτι σαν, να υπάρχει μέθοδος με έναν και δυο και τρεις παραμέτρους.
Προφανώς δεν γίνεται να υπάρξει μόνο μια μέθοδος με 1 2 και 3 παραμέτρους ταυτόχρονα, άρα θα πρέπει να υπάρχουν 3 διαφορετικές μέθοδοι με το ίδιο όνομα αλλά διαφορετικό πλήθος παραμέτρων, θα πρέπει να γίνει δηλαδή overloading.
Στην άσκηση όμως ζητείται να γίνει μια μέθοδος που θα υπολογίζει κάτι για 2 ή 3 αριθμούς που θα τους παίρνει από τις παραμέτρους. Κοιτάζοντας τις σημειώσεις βλέπουμε ότι υπάρχει δυνατότητα στη C# να βάλουμε προαιρετικές παραμέτρους.

Στην προσέγγιση που αναφέρεις υπάρχει το εξής πρόβλημα. Αν εισαχθεί τιμή στη προαιρετική παράμετρο το 0 (κατά την εκτέλεση) αλλά οι υπόλοιπες δυο παράμετροι είναι μεγαλύτερες του 0, τότε θα έπρεπε να επιστραφεί σαν μινιμουμ η τιμή 0, ωστόσο θα επιστραφεί το μίνιμουμ των άλλων δυο τιμών. Κάτι τέτοιο προφανώς δεν είναι επιθυμητό. Άρα θα πρέπει να σκεφτούμε μια εναλλακτική τιμή για να την τοποθετήσουμε σαν προεπιλεγμενη της προαιρετικής παραμέτρου...
Φωτογραφία ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ
Απάντηση: Ασκηση 2 Απορια
από ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ - Tuesday, 1 May 2012, 5:39 PM
 
Άκρη δεν έχω βγάλει ουτε απο τις σημειώσεις, ουτε απο το βιβλίο, ούτε απο το msdn, ούτε απο διάφορα sites στα οποία οι χρήστες προτείνουν overloading. Αν υπήρχε κάποια πρόταση θα το εκτιμούσα.
Φωτογραφία Βασίλης Κόλιας
Απάντηση: Ασκηση 2 Απορια
από Βασίλης Κόλιας - Tuesday, 1 May 2012, 6:10 PM
 
Βαγγέλη πάμε βήμα βήμα. Απάντησέ μου τι είναι μια μέθοδος και τί είναι μια κλάση. Γράψε την απάντηση εδώ. Μετά φτιάξε μου μια κλάση στο το visual studio με μια μέθοδο Print χωρίς παραμέτρους που να εκτυπώνει το μήνυμα Hello και εμφάνισε την κλάση εδώ, σαν απάντηση.
Φωτογραφία ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ
Απάντηση: Ασκηση 2 Απορια
από ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ - Tuesday, 1 May 2012, 6:18 PM
 
Έχω ασχοληθεί αρκετά με προγραμματισμο και κατανοώ τις έννοιες κλαση(δομική μονάδα του αντικειμενοστραφους προγραμματισμού) και μέθοδος(συναρτήσεις που εκτελούν επιθυμητές λειτουργίες των στιγμιοτύπων-αντικειμένων των κλάσεων). Πιστεύω το πρόβλημα ειναι στην πράξη. Αν θέλετε σας στέλνω το .cs να το δέιτε.

public class PrintClass
{
void PrintMessage()
{
Console.Writeline("eimai mia methodos");
}

}
Φωτογραφία Βασίλης Κόλιας
Απάντηση: Ασκηση 2 Απορια
από Βασίλης Κόλιας - Tuesday, 1 May 2012, 6:27 PM
 
Ωραία, φτιάξε άλλη μια κλάση Test, που να περιέχει τη main μεθοδο, φτιάξε μέσα στη main ένα αντικείμενο της PrintClass και κάλεσε την PrintMessage έτσι όπως την έχεις.

Μετά πρόσθεσε στην PrintClass άλλη μια PrintMessage με δυο int παραμέτρους και σε αυτή την PrintMessage αντί να εκτυπώνεις Hello εκτύπωσε τις τιμές των δύο παραμέτρων με κενό μεταξύ τους.

Μετά πίσω στη main, πρόσθεσε στο αμέσως μετά την κλήση στην σκέτη PrintMessage μια κλήση στην PrintMessage(int, int)

Ποσταρε εδώ τις κλάσεις κατευθειαν ή και συνημμένες.
Φωτογραφία ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ
Απάντηση: Ασκηση 2 Απορια
από ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ - Tuesday, 1 May 2012, 6:37 PM
 
class Test
{
static void Main(string[] args)
{
PrintClass Eimai_antikeimeno = new PrintClass();
// overloading tis sunartisis PrinMessage me kanena kai 2 orismata antistoixa
Eimai_antikeimeno.PrintMessage();
Eimai_antikeimeno.PrinteMessage(15,28);
}
}


// epiprosthetos stin PrintClass
public class PrintClass
{
void PrintMessage(int first, int second)
{
Console.Writeline(first+" "+ second);
}

}



/////
sas paratheto kai episunaptomeno to kodika gia tin askisi 2 na to deite.
Φωτογραφία Βασίλης Κόλιας
Απάντηση: Ασκηση 2 Απορια
από Βασίλης Κόλιας - Tuesday, 1 May 2012, 6:44 PM
 
Πολύ ωραία.
Τώρα θέσε στη PrintClass(int, int) τη δεύτερη παράμετρο σαν προαιρετική. Θέσε λοιπόν τη δευτερη παράμετρο στην τιμή 1. Αυτό σημαίνει ότι αν ο χρήστης δεν εισάγει δεύτερο όρισμα, θα κλειθεί η μέθοδος παρόλο παρόλο που δεν υπάρχει στην κλάση PrintMessage με μια μονο παράμετρο.

Επίσης μέσα στη PrintClass(int, int) πρόσθεσε τη λογική εύρεσης του μεγαλύτερου εκ των δυο:
Αν είναι μεγαλύτερο το πρώτο ορισμα μεγαλύτερο απο το δευτερο να εκτυπωσει μονο το πρώτο αλλιως να εκτυπωσει το δευτερο.

Κάλεσε ξανά από τη main αυτή τη νεα PrintClass με ζευγάρια τιμών
(10,5) και (-4) και δες τι εμφανίζει.

Πόσταρε πάλι την ενημερωμένη κλάση και τι εμφανίζει στην κονσόλα η main
Φωτογραφία ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ
Απάντηση: Ασκηση 2 Απορια
από ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ - Tuesday, 1 May 2012, 6:56 PM
 
// epiprosthetos stin PrintClass
public class PrintClass
{
public void PrintMessage(int first, int second=1)
{
if (first > second)
{
Console.WriteLine(first);
}
else
{
Console.WriteLine(second);
}
}

}
class Test
{
static void Main(string[] args)
{
PrintClass Eimai_antikeimeno = new PrintClass();

Eimai_antikeimeno.PrintMessage(10,5);
Eimai_antikeimeno.PrintMessage(-4);
Console.Read();
}
}

///////
CONSOLE OUTPUT:
10
1
////

/// to ksero oti stin deuteri periprtosi (-4) san 2o orisma pairnei to default tou second dld to 1 gi'ayto stin konsola emfanizei 1 san max
Φωτογραφία Βασίλης Κόλιας
Απάντηση: Ασκηση 2 Απορια
από Βασίλης Κόλιας - Tuesday, 1 May 2012, 7:29 PM
 
Ωραιότατα, την έχουμε σχεδόν ολοκληρώσει.
Τώρα πολύ απλά βάλε μια τρίτη παράμετρο με προεπιλεγμένη τιμή τη 0, αφαίρεσε την προεπιλεγμένη από τη δεύτερη και σε κάθε μπλοκ του if κάνε έλεγχο της αντίστοιχης παραμέτρου ενάντια στην τρίτη παράμετρο. Αν είναι η τρίτη η μεγαλύτερη τότε εκτύπωσε αυτήν αλλιώς εκτύπωσε την αντίστοιχη παράμετρο.
Δοκίμασε να τρέξεις τη νέα αυτή μέθοδο με ορίσματα
(1,2,3) και (-1,-1)
Τι παρατηρείς; Τι θα γινόταν αν είχαμε κάνει τον δικό σου έλεγχο αντί των παραπάνω;
Φωτογραφία ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ
Απάντηση: Ασκηση 2 Απορια
από ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ - Tuesday, 1 May 2012, 7:42 PM
 
// epiprosthetos stin PrintClass
public class PrintClass
{
public void PrintMessage(int first, int second, int third=0)
{
if (third > first && third > second)
{
Console.WriteLine(third);
}
else if (first > second)
{
Console.WriteLine(first);
}
else
{
Console.WriteLine(second);
}
}

}
class Test
{
static void Main(string[] args)
{
PrintClass Eimai_antikeimeno = new PrintClass();

Eimai_antikeimeno.PrintMessage(1,2,3);
Eimai_antikeimeno.PrintMessage(-1,1);
Console.Read();
}
}
//////////////
CONSOLE OUTPUT:
3
1
////////////
Polu oraia, ALLA stin periptosi poy i sunartisi kaleite me 2 orismata
p.x " Eimai_antikeimeno.PrintMessage(-1,-5);"
kai ta orismata auta einai mikrotera tis default (third=0), tote LANTHASMENA i methodos tha mas emfanize san max to 0. Kati tetoio den einai ortho.

CONSOLE OUTPUT gia (-1,-5):
0 // LATHOS
/////////////////
Φωτογραφία Βασίλης Κόλιας
Απάντηση: Ασκηση 2 Απορια
από Βασίλης Κόλιας - Tuesday, 1 May 2012, 7:54 PM
 
Για ξανακοίταξέ τα... είναι όντως λάθος στην περίπτωση με 2 ορίσματα;;; Σύγκρινε τώρα αυτή τη σκέψη με τη δική σου πρόταση στην αρχή αρχή.
Φωτογραφία ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ
Απάντηση: Ασκηση 2 Απορια
από ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ - Tuesday, 1 May 2012, 8:02 PM
 
Αν εγώ καλέσω την συνάρτηση PrintMessage τότε απαιτώ απο το πρόγραμμα να μου "απαντήσει" για τον max λαμβάνοντας μόνο τις εισόδους(inputs) που του έχω ορίσει. Δίνοντας μου ενα αποτέλεσμα το οποίο δεν έχει δεχθεί σαν είσοδο αυτομάτος καθιστά το πρόγραμμα εσφαλμένο.
Παρόλο τον έλεγχο "if (third > first && third > second)" το πρόγραμμα δεν απαντα σωστά σύμφωνα με τα δεδομένα εισόδου.
Φωτογραφία Βασίλης Κόλιας
Απάντηση: Ασκηση 2 Απορια
από Βασίλης Κόλιας - Tuesday, 1 May 2012, 8:13 PM
 
Σωστά,
Αν όμως αλλάζαμε την προεπιλεγμένη τιμή της 3ης παραμέτρου σε μια τιμή που να μην επηρεάζει τις άλλες δυο παραμέτρους; Ποιά τιμή θα ήταν αυτή;;
Φωτογραφία ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ
Απάντηση: Ασκηση 2 Απορια
από ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ - Tuesday, 1 May 2012, 8:22 PM
 
Τώρα ξαναγυρίζουμε στην αρχική ερώτηση που σας είχα κάνει. Επειδή το εύρος τιμών των εισόδων ειναι θεωρητικά το (-οο, +οο) δεν μπορούμε να αρνηθούμε στον χρήστη να εισάγει μια τιμή (0). Για να το λύσω αυτό δοκίμασα με Νull αλλά προκύπτει mismatch τύπων (float & null expression). Επίσης εξέτασα και την περίπτωση της ιδιότητας (third.HasValue και float? third) αλλά υπάρχει πρόβλημα στην περίπτωση των 2 παραμέτρων. Αυτό σας ρωτάω γιατί εχώ ψάξει πολλές ώρες τώρα στις σημειώσεις, στο βιβλίο(introducing Visual C# 2010), στο επίσημο site της Microsoft(msdn) και σε διάφορα sites C# (stackoverflow κ.λπ.) και δεν εχω βρει απάντηση. Αν μπορείτε να μου πείτε την τιμή αυτή!
Φωτογραφία Βασίλης Κόλιας
Απάντηση: Ασκηση 2 Απορια
από Βασίλης Κόλιας - Tuesday, 1 May 2012, 8:27 PM
 
Πριν στην πω θα σε ταλαιπωρήσω λίγο!
Πήγαινε στις σημειώσεις της ενότητας 2 στη σελίδα 16. Διάβασε τον πίνακα 3.10 και την τελευταία παράγραφο σε αυτή τη σελίδα!
Φωτογραφία Βασίλης Κόλιας
Απάντηση: Ασκηση 2 Απορια
από Βασίλης Κόλιας - Tuesday, 1 May 2012, 8:36 PM
 
Μπορείς να το βρεις και στη σελίδα 103 του βιβλίου!
Φωτογραφία ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ
Απάντηση: Ασκηση 2 Απορια
από ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ - Tuesday, 1 May 2012, 8:42 PM
 
Αυτά που λέει ειναι για το (-οο, +οο) που ειπα αφού το float αναπαριστά αριθμούς απο (-3.402823Ε, 3,402823Ε). Αν ορίσω default > ή < απο το εύρος τιμών του float θα μου πετάξει error. Οπότε πείτε μου.

Φωτογραφία Βασίλης Κόλιας
Απάντηση: Ασκηση 2 Απορια
από Βασίλης Κόλιας - Tuesday, 1 May 2012, 8:47 PM
 
Αν βάλεις σαν προεπιλεγμένη τιμή της τρίτης παραμέτρου τον ελάχιστο δυνατό αριθμό που μπορεί να μπει στην παράμετρο τότε όποιος αριθμός και να μπει στις άλλες δυο αποκλείεται να είναι μικρότερος του... Άρα θα επιστρέψει το μέγιστο εκ των δυο πρώτων αριθμών και κατά συνέπεια και των τριών
Φωτογραφία ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ
Απάντηση: Ασκηση 2 Απορια
από ΕΥΑΓΓΕΛΟΣ ΤΑΜΠΑΚΗΣ - Tuesday, 1 May 2012, 8:50 PM
 
Αυτό ήταν αλλά πήγαμε Λαμία μέσω Ριου-Αντιρίου!!!
Φωτογραφία Βασίλης Κόλιας
Απάντηση: Ασκηση 2 Απορια
από Βασίλης Κόλιας - Tuesday, 1 May 2012, 9:00 PM
 
Μα μου έλεγες και εσύ ότι έχεις πελαγώσει και δεν καταλαβαίνεις τίποτα!
Επομένως δύο πράγματα πρέπει να μας μείνουν από αυτή τη συζήτηση

1) Η διαδικασία επίλυσης των ασκήσεων. Πηγαίνουμε βήμα βήμα, χτίζοντας πρόταση πρόταση, από τις σημειώσεις και το βιβλίο. Δεν θα σας βάλω κάτι που δεν υπάρχει εκεί και αν το κάνω θα σας πω από που να το βρείτε όπως π.χ. στην πρώτη άσκηση της ενότητας 3 με το Random.

2) Πρέπει να ρωτάμε συγκεκριμένα πράγματα, όπου ακριβώς έχουμε κολήσει αφού έχουμε περιγράψει τι κάναμε. Οι ερωτήσεις πρέπει να είναι ακριβείς. Είχες φτάσει σε ένα σημείο και κόλησες, αλλά η ερώτηση που έκανες αφορούσε την όλη άσκηση γενικότερα. Κακώς! Που να το φανταστώ και γω...