2017-10-18 11 views
-1

Je suis novice en programmation et j'ai toujours des problèmes avec les tableaux, les pointeurs et les fonctions. J'aimerais savoir ce qui ne va pas et comment je peux y remédier. Spécifiquement pourquoi le pointeur ne fonctionne pas avec la fonction. Voici le programme que j'essaie d'écrire: Ecrire un programme qui crée DYNAMIQUEMENT un pointeur vers un tableau assez grand pour contenir un nombre défini de tests. Une fois que tous les scores sont entrés (dans la fonction principale), le tableau doit être passé à une fonction qui renvoie un DOUBLE pour le score moyen. Dans la sortie utilisateur, le score moyen doit être formaté avec deux décimales. Utilisez la notation par pointeur; n'utilisez pas la notation de tableau.En C++, comment utiliser les pointeurs pour obtenir la moyenne d'un tableau?

#include <iostream> 
#include <iomanip> 
#include <memory> 
using namespace std; 

double getAverage(int, int); 

int main() 
{ 
    int size = 0; 
    cout << "How many scores will you enter? "; 
cin >> size; 

unique_ptr<int[]> ptr(new int[size]); 


cout << endl; 
int count = 0; 

//gets the test scores 

for (count = 0; count < size; count++) 
{ 
    cout << "Enter the score for test " << (count + 1) << ": "; 
    cin >> ptr[count]; 
    cout << endl; 
} 
//display test scores 
cout << "The scores you entered are:"; 
for (count = 0; count < size; count++) 
    cout << " " << ptr[count]; 
cout << endl; 

double avg; 
avg = getAverage(ptr, size); 
cout << setprecision(2) << fixed << showpoint << endl; 

cout << "The average is " << avg << endl; 

return 0; 
} 

double getAverage(int *ptr, int size) 
{ 
double average1; 
double total = 0; 
for (int count = 0; count < size; count++) 
{ 
    total = total + *(ptr + count); 
} 
average1 = total/size; 

return average1; 
} 
+0

Il y a deux fonctions distinctes nommées 'getAverage' dans votre programme. On est déclaré à prendre deux 'int' mais jamais implémenté; c'est celui que vous essayez d'appeler 'main', avec de mauvais types d'arguments. L'autre prend 'int '' et 'int' - celui-ci est implémenté, mais jamais appelé. –

+0

[Comment puis-je passer unique_ptr dans une fonction] (https://stackoverflow.com/q/30905487/669576) –

Répondre

3

Tout d'abord, votre fonction getAverage() a un prototype différent de celui que vous avez défini. Et d'autre part, vous essayez de passer l'objet std::unique_ptr<int []> dans une fonction qui attend à la place un int*. Mais std::unique_ptr<int []> est un type différent de int* et non implicitement convertible. Donc, pour passer int *, utilisez la fonction std::unique_ptr::get. comme

#include <iostream> 
#include <iomanip> 
#include <memory> 
using namespace std; 

double getAverage(int *, int); 

int main() 
{ 
    int size = 0; 
    cout << "How many scores will you enter? "; 
cin >> size; 

unique_ptr<int[]> ptr(new int[size]); 


cout << endl; 
int count = 0; 

//gets the test scores 

for (count = 0; count < size; count++) 
{ 
    cout << "Enter the score for test " << (count + 1) << ": "; 
    cin >> ptr[count]; 
    cout << endl; 
} 
//display test scores 
cout << "The scores you entered are:"; 
for (count = 0; count < size; count++) 
    cout << " " << ptr[count]; 
cout << endl; 

double avg; 
avg = getAverage(ptr.get(), size); 
cout << setprecision(2) << fixed << showpoint << endl; 

cout << "The average is " << avg << endl; 

return 0; 
} 

double getAverage(int *ptr, int size) 
{ 
double average1; 
double total = 0; 
for (int count = 0; count < size; count++) 
{ 
    total = total + *(ptr + count); 
} 
average1 = total/size; 

return average1; 
} 
+0

Merci pour cela. C'est frustrant comment les petites choses peuvent vraiment déranger un programme. –

-1

Vous l'avez presque eu. Juste besoin de changer ce morceau:

using namespace std; 

double getAverage(int*, int); // <--here 

int main() 
{ 
    int size = 0; 
    cout << "How many scores will you enter? "; 
    cin >> size; 
    int *ptr = new int[size]; //<--and here (but you'll need to delete it later) 
    //unique_ptr<int[]> ptr(new int[size]); 

Je ne recommande pas le mélange des pointeurs intelligents et pointeurs standards jusqu'à ce que vous avez une meilleure compréhension des pointeurs standard. edit: Je veux dire les mélanger en termes de même pointeur effectif.

+0

Il n'y a rien de mal à distribuer un pointeur brut de 'std :: unique_ptr :: get()'. – user0042

+0

À moins que le paramètre unique_ptr ne soit hors de portée tant que le pointeur brut est utilisé. Mais vous avez certainement raison pour cet exemple. – zzxyz

0

Dans l'affectation, il est écrit

Utilisez la notation de pointeur; n'utilisez pas la notation de tableau

Cela signifie que vous ne devez pas utiliser d'indice.

En général, la variable ptr est déclarée comme ayant le type std::unique_ptr<int[]>.

unique_ptr<int[]> ptr(new int[size]); 

Vous essayez de le transmettre à la fonction getAverage

avg = getAverage(ptr, size); 

qui a le paramètre correspondant du type int.

double getAverage(int, int); 

Bien que vous défini la fonction comme ayant le paramètre du type int * dans tous les cas, il n'y a pas de conversion explicite du type std::unique_ptr<int[]> du type int *. Vous devez utiliser la méthode get du pointeur intelligent.

Le paramètre de fonction doit également être déclaré comme const int * car le tableau n'est pas modifié dans la fonction.

Le programme peut regarder la façon dont

#include <iostream> 
#include <iomanip> 
#include <memory> 

double getAverage(const int *a, size_t n) 
{ 
    double total = 0.0; 

    for (const int *p = a; p != a + n; ++p) total += *p; 

    return n == 0 ? total : total/n; 
} 

int main() 
{ 
    size_t n = 0; 

    std::cout << "How many scores will you enter? "; 
    std::cin >> n; 

    std::unique_ptr<int[]> ptr(new int[n]); 

    std::cout << std::endl; 

    size_t i = 0; 
    for (int *current = ptr.get(); current != ptr.get() + n; ++current) 
    { 
     std::cout << "Enter the score for test " << ++i << ": "; 
     std::cin >> *current; 
    } 

    std::cout << std::endl; 

    std::cout << "The scores you entered are:"; 
    for (const int *current = ptr.get(); current != ptr.get() + n; ++current) 
    { 
     std::cout << " " << *current; 
    } 
    std::cout << std::endl; 

    double avg = getAverage(ptr.get(), n); 

    std::cout << std::setprecision(2) << std::fixed << std::showpoint; 

    std::cout << "\nThe average is " << avg << std::endl; 

    return 0; 
} 

suivant la sortie du programme pourrait ressembler à

How many scores will you enter? 10 

Enter the score for test 1: 1 
Enter the score for test 2: 2 
Enter the score for test 3: 3 
Enter the score for test 4: 4 
Enter the score for test 5: 5 
Enter the score for test 6: 6 
Enter the score for test 7: 7 
Enter the score for test 8: 8 
Enter the score for test 9: 9 
Enter the score for test 10: 10 

The scores you entered are: 1 2 3 4 5 6 7 8 9 10 

The average is 5.50