Βοήθεια σε ασκηση C++ (template functions)

teo

Πολύ δραστήριο μέλος

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 39 ετών και είναι Φοιτητής. Έχει γράψει 1.573 μηνύματα.
Έστω οτι θέλω να φτιάξω μια template function που θα υπολογίζει το μέσο όρο των περιεχομένων ενός πίνακα. Η συνάρτηση θα πρέπει να υποστηρίζει μεταβλητές τύπου int, long, double και char.

:worry::eek::/:

Σημείωση: Το μήνυμα αυτό γράφτηκε 18 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

 
Θα βοηθούσε περισσότερο αν μας έλεγες που ακριβώς δυσκολεύεσαι :)

Σημείωση: Το μήνυμα αυτό γράφτηκε 18 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

 
Γεια σου και χρονια πολλα!

Ποια θα ειναι η γενικη μορφη της function template(γενικη συναρτηση που μπορει να υποστηριζει πολλους τυπους δεδομενων.)

Εχω μπερδευτει λιγο γι΄αυτο αμα μπορεις να βοηθησεις!

π.χ εστω οτι θελω να υπολογισω τον Μ.Ο για τους παρακατω τεσσερις πινακες:

char chrArr[]={1,3,5,9,11,13};

int intArr[]={1,3,5,9,11,13};

long lonArr[]={1L,3L,5L,9L,11L,13L};

double dubArr[]={1.0,3.0,5.0,9.0,11.0,13.0};

Αυτη η γενικη συναρτηση(function template) θα πρεπει να υπολογιζει τον Μ.Ο για τις παραπανω περιπτωσεις.

Δηλ. αντι να γραψω τεσσερις διαφορετικες συναρτησεις(μια για καθε τυπο δεδομενων) θελω να γραψω μια γενικη συναρτηση(function template) που θα υπολογιζει το μεσο ορο των περιεχομενων ενος πινακα. Αρα η συναρτηση(function template) θα πρεπει να υποστηριζει μεταβλητες τυπου int ,long,double και char.

Σημείωση: Το μήνυμα αυτό γράφτηκε 18 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

 
Τελευταία επεξεργασία:
Δεν θυμάμαι σχεδόν καθόλου C++ (έχουν περάσει 2 χρόνια απο τότε που την έκανα στο πανεπιστήμιο), στη Java αυτό (αν κατάλαβα δλδ καλά τι θες να κάνεις) γίνεται με "υπερφόρτωση", δηλαδή γράφεις πολλές συναρτήσεις, με το ίδιο όνομα και διαφορετικό τύπο επιστροφής τιμής. Μήπως παίζει κάτι τέτοιο και στη C++?

Σημείωση: Το μήνυμα αυτό γράφτηκε 18 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

 
τα λεμε αργοτερα!
για να το ψαξω λιγακι

Σημείωση: Το μήνυμα αυτό γράφτηκε 18 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

 
Αν βάλεις τη συνάρτηση τύπου void; (σόρρυ, εγώ C ξέρω κάτι ψιλά, αλλά ίσως βοηθήσει)


Θα το δω λίγο τώρα. :)

Σημείωση: Το μήνυμα αυτό γράφτηκε 18 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

 
Μπορείς να δηλώσεις τη συνάρτηση με αυτό το τρόπο:
Code:
template <class P>
P foo(P a[])
{
//κώδικας εδώ
return mesos_oros;
}

Σημείωση: Το μήνυμα αυτό γράφτηκε 18 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

 
Τελευταία επεξεργασία:
Μπορείς να δηλώσεις τη συνάρτηση με αυτό το τρόπο:
template <class P>
P foo(P a[])
{
//κώδικας εδώ
return mesos_oros;
}
Από καθαρή περιέργεια, ο αντίστοιχος κώδικας στη C ποιος θα ήταν; Δηλαδή μία συνάρτηση για όλα;



Καλωσήρθες στην παρέα μας. :santa:

Σημείωση: Το μήνυμα αυτό γράφτηκε 18 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

 
Καλώς σας βρήκα :)

Σε C δεν υπάρχει τύπος συνάρτησης που είναι ικανός να χειρίζεται, όλους τους τύπους δεδομένων (ουσιαστικά να μετατρέπει).
Υποθέτω μπορείς να το υλοποιήσεις, με ένα κοινό όνομα συνάρτησης, και με κάποια typedef στο τύπο που θές. (κατα πάσα περίπτωση σε preprocessor directive). Γενικά πάντως η C δεν σου παρέχει αυτή την ευκολία.

Σημείωση: Το μήνυμα αυτό γράφτηκε 18 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

 
Αυτό μπορείς να το πετύχεις έμμεσα περνώντας ορίσματα τύπου void* ,ώστε να τα μετατρέπεις μέσα στη συνάρτηση.
πχ,
Code:
void function(void *arg){
    
        int type;  /* o τύπος που θες να μετατρέψεις */

        type= *((int *)arg);    /*μετατροπή του void ορίσματος στο επιθυμητό */
        printf("%d",type);    
}
Απλά,όπως λες, θα πρέπει να βρεις ένα τρόπο ώστε να ξέρεις τί ορισμα θα χρησιμοποιήσεις.

Καλώς ήρθες.:)

Σημείωση: Το μήνυμα αυτό γράφτηκε 18 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

 

Ένα παράδειγμα με templates.
Το template θα φροντίσει για τους τύπους των δεδομένων σου.Οπότε θα χρειαστεί μόνο να ορισεις την αρχικη συνάρτηση.
Το μονο που θα πρέπει να φροντίσεις είναι να ελέγχεις το μήπως των arrays σου.(περνώντας το μήκος ως όρισμα).

Χρόνια πολλά.

Σημείωση: Το μήνυμα αυτό γράφτηκε 18 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

 
#include<iostream>
using namespace std;

template<class atype,class btype>
btype mesos_oros(atype* array, btype size)
{
btype sum=0; //βοηθητική μεταβλητή.
for(btype j=0;j<size;j++)
sum=sum+array[j];
return(sum/size); //Μέσος όρος.
}

int intArr[]={1,3,5,9,11,13};

double dubArr[]={1.0,3.0,5.0,9.0,11.0,13.0};

int main()
{


cout<<"\n MO= "<<mesos_oros<int>(intArr,6);

cout<<"\n MO= "<<mesos_oros<double>(dubArr,6);

return 0;
}


Εξοδος προγραμματος:

ΜΟ= 7
ΜΟ= 7(εδω κανονικα θα επρεπε να μου δωσει 7.0, δεν γινεται σωστα η μετατροπει απο int σε double)

Αμα μπορει κανεις να βοηθησει!

Ευχαριστώ!

Σημείωση: Το μήνυμα αυτό γράφτηκε 18 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

 
Τελευταία επεξεργασία:
Φταίει οτι δεν μορφωποιείς την έξοδο σου.Επειδή στα αποτελέσματα σου τα ψηφία μετα την υποδιαστολή ειναι 0 δεν εκτυπώνονται στην έξοδο.
Για να δεις οτι δουλευει σωστα το πρόγραμμα σου βάλε στο πρωτο στοιχείο του πινακα 1.01 και τρεξε το.

Αυτό που μπορεις να κανεις ειναι να μορφοποιείς την έξοδο σου σε ακριβεια δεκαδικών ψηφιων μετα την υποδιαστολη.
Ο κωδικας που το κανει αυτο ειναι :

Code:
 std::cout.setf(ios::fixed, ios::floatfield);
  std::cout.setf(ios::showpoint);
  std::cout.precision(2);
Oποτε μετα ,το προγραμμα σου τρεχει κανονικα.
Code:
#include<iostream>
using namespace std;

template<class atype,class btype>
float mesos_oros(atype* array, btype size)
{
float sum=0.0; //βοηθητική μεταβλητή.
for(int j=0;j<size;j++)
sum+=array[j];
return sum/size; //Μέσος όρος.
}

Σημείωση: Το μήνυμα αυτό γράφτηκε 18 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

 
Code:
#include<iostream>
using namespace std;

 
template<class atype,class btype>
float mesos_oros(atype* array, btype size)
{
      float sum=0.0; //βοηθητική μεταβλητή.
      for(int j=0;j<size;j++)
        sum=sum+array[j];
       return(sum/size); //μέσος όρος.
      }
         
         int intArr[]={1,3,5,9,11,13};
      
      double dubArr[]={1.0,3.0,5.0,9.0,11.0,13.0};
         
int main()
{
       std::cout.setf(ios::fixed, ios::floatfield);
       std::cout.setf(ios::showpoint);
       std::cout.precision(2);

      
      cout<<"\n MO= "<<mesos_oros<int>(intArr,6);
      
      cout<<"\n MO= "<<mesos_oros<double>(dubArr,6);
      
      return 0;
      }
Εγω θελω στην εξοδο να μου βγαζει ΜΟ= 7 (μεσος ορος για τον πινακα ο οποιος εχει ακεραιους αριθμους)

Και ΜΟ=7.00 για τον πινακα τυπου double

το προγραμμα αυτο βγαζει ΜΟ=7.00 και για τους δυο πινακες οι οποιοι ο καθενας εχει διαφορετικο τυπο δεδομενων

ΕΥΧΑΡΙΣΤΟ!

Σημείωση: Το μήνυμα αυτό γράφτηκε 18 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

 
Τελευταία επεξεργασία:
μπορει να γινει τιποτα για να λυσω το προβλημα;:hmm:

Σημείωση: Το μήνυμα αυτό γράφτηκε 18 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

 
Για το int array δεν χρειαζεται να εκτυπωσεις αποτέλεσμα με δεκαδικά ψηφία.Εσενα εκτυπώνονται επειδη εχεις βαλει το κομματι κωδικα πριν απο ολα.Μπορεις να τροποποιεις την εξοδο μονο οπου χρειαζεται.
Μπορει να σε βοηθήσει αυτό

Σημείωση: Το μήνυμα αυτό γράφτηκε 18 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

 
#include<iostream>
using namespace std;


template<class atype,class btype>
float mesos_oros(atype* array, btype size)
{
float sum=0.0; //βοηθητική μεταβλητή.
for(int j=0;j<size;j++)
sum=sum+array[j];
return(sum/size); //μέσος όρος.
}

int intArr[]={1,3,5,9,11,13};

Code:
double dubArr[]={1.0,3.0,5.0,9.0,11.0,13.0};
         
int main()
{
       

      
      cout<<"\n MO= "<<mesos_oros<int>(intArr,6);
      
      std::cout.setf(ios::fixed, ios::floatfield);
       std::cout.setf(ios::showpoint);
       std::cout.precision(2);
      
      cout<<"\n MO= "<<mesos_oros<double>(dubArr,6);
      
      return 0;
      }        
ολα οκ ευχαριστω πολυ!

εξοδος προγραμματος:
ΜΟ= 7
ΜΟ= 7.00

:clapup::clapup::clapup:
:):):)

Σημείωση: Το μήνυμα αυτό γράφτηκε 18 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

 
Τελευταία επεξεργασία:
Να σαι καλα.
Απο κει και κατω αμα πας να τυπωσεις κατι αλλο θα βγει και αυτο με 2 δεκαδικα ψηφια μετα την υποδιαστολη.Αν χρειαστει να εκτυπωσεις κατι αλλο απο εκει και περα θα χρειαστει να ξανατροποποιησεις την εξοδο.

Σημείωση: Το μήνυμα αυτό γράφτηκε 18 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

 
#include<iostream>
using namespace std;


template<class atype,class btype>
float mesos_oros(atype* array, btype size)
{
float sum=0.0; //βοηθητική μεταβλητή
for(int j=0;j<size;j++)
sum=sum+array[j];
return(sum/size); //μέσος όρος
}

int intArr[]={1,3,5,9,11,13};

double dubArr[]={1.0,3.0,5.0,9.0,11.0,13.0};

long lonArr[]={1L,3L,5L,9L,11L,13L};

char chrArr[]={1,3,5,9,11,13};

int main()
{



cout<<"\n MO= "<<mesos_oros<int>(intArr,6);

cout<<"\n MO= "<<mesos_oros<long>(lonArr,6);

cout<<"\n MO= "<<mesos_oros<char>(chrArr,6);

std::cout.setf(ios::fixed, ios::floatfield);
std::cout.setf(ios::showpoint);
std::cout.precision(2);

cout<<"\n MO= "<<mesos_oros<double>(dubArr,6);

return 0;
}




εξοδος:



ΜΟ= 7 (Integer)
MO= 7 (long)
MO=7 (char)
MO=7.00 (double)



:clapup::clapup::clapup:

Σημείωση: Το μήνυμα αυτό γράφτηκε 18 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

 

Χρήστες Βρείτε παρόμοια

  • Τα παρακάτω 0 μέλη και 1 επισκέπτες διαβάζουν μαζί με εσάς αυτό το θέμα:
    Tα παρακάτω 0 μέλη διάβασαν αυτό το θέμα:
  • Φορτώνει...
Back
Top