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

teo

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

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

:worry::eek::/:
 

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

Subject to change

e-steki.gr Founder

Η Λία αυτή τη στιγμή δεν είναι συνδεδεμένη. Είναι 37 ετών και επαγγέλεται Web developer. Έχει γράψει 15,891 μηνύματα.
Θα βοηθούσε περισσότερο αν μας έλεγες που ακριβώς δυσκολεύεσαι :)
 

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

teo

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

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
Γεια σου και χρονια πολλα!

Ποια θα ειναι η γενικη μορφη της 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.
 

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

Τελευταία επεξεργασία:

Subject to change

e-steki.gr Founder

Η Λία αυτή τη στιγμή δεν είναι συνδεδεμένη. Είναι 37 ετών και επαγγέλεται Web developer. Έχει γράψει 15,891 μηνύματα.
Δεν θυμάμαι σχεδόν καθόλου C++ (έχουν περάσει 2 χρόνια απο τότε που την έκανα στο πανεπιστήμιο), στη Java αυτό (αν κατάλαβα δλδ καλά τι θες να κάνεις) γίνεται με "υπερφόρτωση", δηλαδή γράφεις πολλές συναρτήσεις, με το ίδιο όνομα και διαφορετικό τύπο επιστροφής τιμής. Μήπως παίζει κάτι τέτοιο και στη C++?
 

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

teo

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

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
τα λεμε αργοτερα!
για να το ψαξω λιγακι
 

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

Γιώργος

Τιμώμενο Μέλος

Ο Γιώργος αυτή τη στιγμή δεν είναι συνδεδεμένος. Μας γράφει απο Ελβετία (Ευρώπη). Έχει γράψει 30,791 μηνύματα.
Αν βάλεις τη συνάρτηση τύπου void; (σόρρυ, εγώ C ξέρω κάτι ψιλά, αλλά ίσως βοηθήσει)


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

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

netharis

Νεοφερμένος

Ο Χάρης αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 34 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 2 μηνύματα.
Μπορείς να δηλώσεις τη συνάρτηση με αυτό το τρόπο:
Code:
template <class P>
P foo(P a[])
{
//κώδικας εδώ
return mesos_oros;
}
 

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

Τελευταία επεξεργασία:

Γιώργος

Τιμώμενο Μέλος

Ο Γιώργος αυτή τη στιγμή δεν είναι συνδεδεμένος. Μας γράφει απο Ελβετία (Ευρώπη). Έχει γράψει 30,791 μηνύματα.
Μπορείς να δηλώσεις τη συνάρτηση με αυτό το τρόπο:
template <class P>
P foo(P a[])
{
//κώδικας εδώ
return mesos_oros;
}
Από καθαρή περιέργεια, ο αντίστοιχος κώδικας στη C ποιος θα ήταν; Δηλαδή μία συνάρτηση για όλα;



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

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

netharis

Νεοφερμένος

Ο Χάρης αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 34 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 2 μηνύματα.
Καλώς σας βρήκα :)

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

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

Bill

Επιφανές μέλος

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

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

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

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

Bill

Επιφανές μέλος

Ο Bill αυτή τη στιγμή δεν είναι συνδεδεμένος. Έχει γράψει 10,408 μηνύματα.

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

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

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

teo

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

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
#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)

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

Ευχαριστώ!
 

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

Τελευταία επεξεργασία:

Bill

Επιφανές μέλος

Ο Bill αυτή τη στιγμή δεν είναι συνδεδεμένος. Έχει γράψει 10,408 μηνύματα.
Φταίει οτι δεν μορφωποιείς την έξοδο σου.Επειδή στα αποτελέσματα σου τα ψηφία μετα την υποδιαστολή ειναι 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; //Μέσος όρος.
}
 

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

teo

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

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
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 και για τους δυο πινακες οι οποιοι ο καθενας εχει διαφορετικο τυπο δεδομενων

ΕΥΧΑΡΙΣΤΟ!
 

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

Τελευταία επεξεργασία:

teo

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

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
μπορει να γινει τιποτα για να λυσω το προβλημα;:hmm:
 

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

Bill

Επιφανές μέλος

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

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

teo

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

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
#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:
:):):)
 

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

Τελευταία επεξεργασία:

Bill

Επιφανές μέλος

Ο Bill αυτή τη στιγμή δεν είναι συνδεδεμένος. Έχει γράψει 10,408 μηνύματα.
Να σαι καλα.
Απο κει και κατω αμα πας να τυπωσεις κατι αλλο θα βγει και αυτο με 2 δεκαδικα ψηφια μετα την υποδιαστολη.Αν χρειαστει να εκτυπωσεις κατι αλλο απο εκει και περα θα χρειαστει να ξανατροποποιησεις την εξοδο.
 

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

teo

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

Ο Θοδωρής αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 37 ετών και επαγγέλεται Φοιτητής/τρια. Έχει γράψει 1,573 μηνύματα.
#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:
 

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

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

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