Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 20/02/2020, à 16:51

chris7522

Retourner un tableau vector<double>tab depuis une fonction

Bonjour,
J'aimerai depuis une fonction ,  retourner un tableau dynamique de type double apres classement croissant .  Est ce possible ?
J'avais pensé a ca , mais ca ne fonctionne pas :

int *classement(vector<double>tab)
 {
  int *p = tab;
  int i,j,c;
  for(i=0;i<nb-1;i++)
   for(j=i+1;j<nb;j++)
   if(tab[i]>tab[j]){
    c=tab[i];
    tab[i]=tab[j];
    tab[j]=c;
   }
  return p;

L'appel ressemblerai peut etre a un truc de ce genre :

int *p = classement(tab);

please help me

Hors ligne

#2 Le 20/02/2020, à 20:07

lann

Re : Retourner un tableau vector<double>tab depuis une fonction

Tout est déjà prévu dans la STL : http://www.cplusplus.com/reference/algorithm/sort/
A moins que tu ne veuiile faire ta propre fonction ?

Hors ligne

#3 Le 21/02/2020, à 09:08

chris7522

Re : Retourner un tableau vector<double>tab depuis une fonction

Merci de ton aide .
Voila le code en entier . C'est pour la fonction classement que ca coince , j'ai trouvé ca sur le net mais ca n'a pas l'air d'etre ce qu'il me faut ...


#include <iostream>
#include <vector>
using namespace std;
int const nb(5);

double moyenne(vector<double>tab);
int *classement(vector<double>tab);

int main()
{
 vector<double>tab(nb);

 int i(0);
 for(i=0;i<nb;i++)
 {
  cout << "Entrez la note n° " << i+1 << endl;
  cin >> tab[i];
  cin.ignore();
 }
 tab.push_back(1.5);
 int *p = classement(tab);
 cout << "Classement des notes croissantes :" << endl;
 for(i=0;i<nb;i++){
  cout << tab[i] << endl;}
 cout << "La moyenne des notes est de : " << moyenne(tab) << endl;

 return 0;
}

 
 double moyenne(vector<double>tab)
 {
  double moy(0);
  for(int i=0;i<tab.size();i++)
  {
   moy+=tab[i];
  }
  moy /= tab.size();
  return moy;
 }
 int *classement(vector<double>tab)
 {
  int *p = tab;
  int i,j,c;
  for(i=0;i<nb-1;i++)
   for(j=i+1;j<nb;j++)
   if(tab[i]>tab[j]){
    c=tab[i];
    tab[i]=tab[j];
    tab[j]=c;
   }
  return p;
 }
    

A la compilation , ca donne ce message :

chris@chris:~/Bureau/Essai$ g++ -std=c++17 essai9.cpp -o essai9C
essai9.cpp: In function ‘int* classement(std::vector<double>)’:
essai9.cpp:43:12: error: cannot convert ‘std::vector<double>’ to ‘int*’ in initialization
   int *p = tab;
            ^~~
chris@chris:~/Bureau/Essai$ 

Dernière modification par chris7522 (Le 21/02/2020, à 09:11)

Hors ligne

#4 Le 21/02/2020, à 09:17

lann

Re : Retourner un tableau vector<double>tab depuis une fonction

En regardant vite fait, il y a déjà au moins deux erreurs :
- l'erreur de compilation : un int pour un pointeur de std::vector
- la variable c (int) alors que tu as un tableau de doubles

Ne cherche pas sur Internet des codes pourris
Réfléchi par toi même

Hors ligne

#5 Le 21/02/2020, à 10:28

NicoApi73

Re : Retourner un tableau vector<double>tab depuis une fonction

Bonjour,

De plus tu retournes un pointeur sur une variable locale, ave tous les problèmes qui vont avec.

Il y a un constructeur par recopie pour la class vector, utilise-le.

En ligne

#6 Le 21/02/2020, à 14:02

chris7522

Re : Retourner un tableau vector<double>tab depuis une fonction

Merci a tous les deux de votre aide .
Je pense que je vais revenir a des choses moins complexe pour le debutant en C++ que je suis . Comme j'étudie tout seul dans mon coin , mon apprentissage part un peu  dans tous les sens . Je tombe sur des choses qui ne sont pas de mon niveau , alors que je ne maitrise pas encore les bases .
Merci encore et bon week-end .

Hors ligne

#7 Le 21/02/2020, à 20:43

NicoApi73

Re : Retourner un tableau vector<double>tab depuis une fonction

Il faut que tu persévères. tab est un objet, pas un tableau et il faut que tu l'utilises comme tel avec ce qui t'est mis à disposition. Tu as fait le choix d'utiliser la librairie standard, vas jusqu'au bout.

Les 2  fonctions que tu as utilisées peuvent être faites à partir de la librairie standard. De plus utilise le potentiel de la classe vector qui compte elle-même le nombre d'éléments. Voici ce que peut donner ton code :

#include <iostream>
#include <algorithm>
#include <numeric> 
#include <vector>

using namespace std;

int main()
{
	vector<double> tab;
	unsigned int i (0);

	for(;;)
	{
		double entree;
	 
		cout << "Entrez la note n° " << ++i << " (nombre négatif pour sortir) " << endl;
		cin >> entree;
		if (entree < 0)
			break;
		tab.push_back (entree);
	}

	if (tab.size() > 0)
	{
		sort (tab.begin(),tab.end());
		cout << "Classement des notes croissantes :" << endl;
		for(i=0;i<tab.size();i++)
			cout << tab[i] << endl;
		cout << "La moyenne des notes est de : " << accumulate( tab.begin(), tab.end(),0)/tab.size() << endl;
	}
	return 0;
}

Dernière modification par NicoApi73 (Le 21/02/2020, à 20:43)

En ligne

#8 Le 22/02/2020, à 22:57

chris7522

Re : Retourner un tableau vector<double>tab depuis une fonction

Merci beaucoup d'avoir pris le temps d'ecrire ce code et de ces explications .
Je pense avoir compris certaines choses et d'autres un peu moins .

Tu as choisis unsigned int  pour n'avoir que des entiers positifs ?
Je ne comprends pas comment fonctionne  le  for( ; ; )
Dans : cout << "Entrez la note n° " << ++i <<....     Pourquoi le ++avant le i ? Le resultat n'aurai pas été le meme avec le i seul ?

Hors ligne

#9 Le 22/02/2020, à 23:14

NicoApi73

Re : Retourner un tableau vector<double>tab depuis une fonction

chris7522 a écrit :

Tu as choisis unsigned int  pour n'avoir que des entiers positifs ?

C'est à cause de cette comparaison :

i<tab.size();

dans

		for(i=0;i<tab.size();i++)

La méthode size() http://www.cplusplus.com/reference/vector/vector/size/ renvoie un entier non signé. Tu peux déclarer i en entier signé, mais tu auras un warning lors de la compilation

chris7522 a écrit :

Je ne comprends pas comment fonctionne  le  for( ; ; )

C'est une boucle infinie. J'en sors avec la commande break
for est du format (condition_initiale;comparaison;action). Tu peux faire à peu près ce que tu veux, y compris faire un appel de fonction pour l'action

chris7522 a écrit :

Dans : cout << "Entrez la note n° " << ++i <<....     Pourquoi le ++avant le i ? Le resultat n'aurai pas été le meme avec le i seul ?

Je pré-incrémente i, car i est initialisé à 0. Si i était intialisé à 1, on peut le post-incrémenter (i++). Si tu ne fais rien, i reste constant et tu as besoin de l'incrémenter pour savoir le n° de la note.

Persévère, je t'ai vu commencer par le C. Le C++ est un langage différent et une approche différente. Quand tu auras une meilleure compréhension des mécanismes objets, vas voir la documentation qt (https://doc.qt.io/), en particulier la partie C++. Regarde les classes, de quoi elles héritent, ce qu'elles contiennent. C'est très instructif

En ligne

#10 Le 23/02/2020, à 11:27

chris7522

Re : Retourner un tableau vector<double>tab depuis une fonction

Merci , les explications sont parfaitement comprise . smile

Hors ligne

#11 Le 23/02/2020, à 20:31

chris7522

Re : Retourner un tableau vector<double>tab depuis une fonction

Une derniere petite question sans rapport avec mon probleme initiale .
   Dans une instruction switch , est il possible d'ecrire tout une suite d'instructions imbriquées  ?
Ex :
switch(a)
{
  case 'O':
    do{
      ....
       if(....)
       else(...)
   while(a<N);

Hors ligne

#12 Le 23/02/2020, à 23:19

NicoApi73

Re : Retourner un tableau vector<double>tab depuis une fonction

Bien sûr. switch fait un branchement, les instructions sont exécutées jusqu'à ce que break soit trouvé ou que l'on sorte d'une manière ou d'une autre.

Attention, s'il n'y a pas de break ou d'instructions interrompant la suite, le code continue à s'exécuter. Ca peut être utile si tu veux exécuter les mêmes instructions dans différents cas ou si tu veux poursuivre...

En ligne

#13 Le 24/02/2020, à 13:11

chris7522

Re : Retourner un tableau vector<double>tab depuis une fonction

Ok . Par contre j'ai éssayé ca , mais ca compile pas :

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
 string phrase="";
 cout <<"Entrez votre phrase :" << endl;
 getline(cin,phrase);
 
 fstream flux("Enregistrement_texte1",ios::app);
 if(flux){
  flux << phrase;
  flux << endl;
  cout << "fichier crée et données enregistrée avec succes " << endl;
 }else {
   cout << "Echec d\'enregistrement "<< endl;
   }

 char a;
 cout << "Voulez vous lire le fichier ?"<< endl;
 cout << " Tapez O (oui) " << endl;
 cout << " Tapez N (non) " << endl;
 
 cin >> a;
 cin.ignore();
 switch(a)
 {
    case 'O':
     ifstream fichier("Enregistrement_texte1");
    if(fichier)
    {
     string line;
     while(getline(fichier,line))
     {
      cout << line << endl;
     }
    break;
    case 'N':
    {
     cout << " Comme tu veux " << endl;
    }
    break;
    default :
    {
     cout << " trompé de choix" << endl;
    }
    break;
 }
return 0;
}

Hors ligne

#14 Le 24/02/2020, à 13:41

NicoApi73

Re : Retourner un tableau vector<double>tab depuis une fonction

Déjà, il te manque une accolade avant le premier break

Rajoute une accolade après le case 'O' : et ferme là avant le break, ce afin de limiter la porté de fichier. Sinon, il faut déclarer fichier au niveau du dessus

En ligne

#15 Le 24/02/2020, à 14:38

chris7522

Re : Retourner un tableau vector<double>tab depuis une fonction

Merci . Ca va finir par rentrer smile

Hors ligne

#16 Le 24/02/2020, à 14:48

NicoApi73

Re : Retourner un tableau vector<double>tab depuis une fonction

Quel IDE utilises tu?

En ligne

#17 Le 24/02/2020, à 21:28

chris7522

Re : Retourner un tableau vector<double>tab depuis une fonction

J'ai installé éclipse . Je ne m'en sers pas pour le moment , dans la mesure ou mes fonctions ne sont pas très longue . Je me dit que l'utilisation des class , ca peu attendre un peu . J'ai peut etre tort .
  Ca m'eviterai aussi d'oublier des accolades .

Hors ligne

#18 Le 24/02/2020, à 21:34

NicoApi73

Re : Retourner un tableau vector<double>tab depuis une fonction

ok, prends geany pour l'instant. C'est très simple et disponible dans les dépots officiels. Et fais attention à ton indentation. C'est très important pour la lisibilité.

En ligne

#19 Le 24/02/2020, à 21:52

chris7522

Re : Retourner un tableau vector<double>tab depuis une fonction

Merci pour geany , je vais l'installer .
Bonne soirée

Hors ligne