Tableau en c++

Fermé
noureddine - 6 oct. 2005 à 14:26
mamiemando Messages postés 33432 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 décembre 2024 - 9 août 2006 à 18:05
je cherche une methode qui me permet de determiner le maximum entre des elements d'un tableau en language c sans utiliser les pointeurs.Merci
A voir également:

13 réponses

mamiemando Messages postés 33432 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 décembre 2024 7 809
6 oct. 2005 à 18:02
Oulala j'en entends des vertes et des pas mûres ! Non un tableau n'est pas un pointeur.

Exemple :
int tab[5];

...alloue 5 cases de taille int, à partir de l'adresse tab. On accède aux éléments avec l'opérateur [ ] :
for(unsigned int i=0;i<5;++i){
   std::cout<<tab[0]<<" ";
}
std::cout<<std::endl;

Pour les tableaux on PEUT passer par des pointeurs, notamment en C pour le cas d'un tableau dont la taille n'est pas connue à l'initialisation :
unsigned int n=5;
int *tab=(int *)malloc(n*sizeof(int));

L'utilisation est ensuite similaire (attention avec malloc les cases ne sont pas initialisées, contrairement à calloc).

Cependant, en C++ on peut se passer de ces deux versions en ayant un tableau de taille dynamique et en s'affranchissant des pointeurs, à l'aide de la STL (standrad template librairie). C'est ce qui est communément utilisé.

La STL propose un certain nombre de conteners (vecteurs, ensembles triés...) et génériques (grâce aux template). Le choix du contener est important selon ce qu'on veut faire. Exemple :
- Ensemble non trié d'élément éventuellement distinct, accès direct à un élément (O(1)) -> utiliser la classe vector
- Ensemble trié d'éléments 2 à 2 distincts , par défaut triés par ordre croissant -> utiliser la classe set.

Il faut bien voir qu'on peut mettre aussi bien des int que des char ou des float (toujours grâces au template). De plus un certains nombre de méthodes sont déjà implémentées de base (taille du tableau, insertion d'un élément, recherche d'un élément...).

On peut voir les bases par exemple ici :
http://www-inf.int-evry.fr/cours/C++/CoursEA/node39.html

Concrètement dans ton cas ça donne un truc du genre
//Si tu veux le faire avec des sets change tous les "vector" par des "set"
#include <vector>
#include <iostream>

int main(){
    std::vector<int> tab;
    tab.push_back(3);//pour un set c'est la méthode insert
    tab.push_back(5);
    tab.push_back(2);
    tab.push_back(2);
    tab.push_back(4);
    //Le tableau contient 3,5,2,2,4

     //Méthode 1 (moche) uniquement pour les vectors
    int max=tab[0];
    for(unsigned int i=0;i<tab.size();++i){
          if(tab[i]>max) max=tab[i];
    }

    //Méthode 2 (mieux, mais seulement si tab n'est pas const)
    //Pour les sets tu ne peux pas utiliser la méthode 1
    for(vector<int>::iterator it=tab.begin();it!=tab.end();++it){
         if(*it>max) max=*it;
    }

    std::cout<<"Le max vaut : "<<max<<std::endl;
    return 0;
}


Bonne chance
4
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
6 oct. 2005 à 16:34
si si c'est francais

tu as un tableau mettons {1,4,2,8,6}, le but étant de déterminer le maximum , ici 8.

tu déclare ton tableau exemple tab[10].

apres c'est simple:

int i=0,maximum=0;

while(i<strlen(tab))
{
if(tab[i]>maximum)
{
maximum=tab[i];
}
}
1
Salut arth, sauf erreur de ma part, ton prgm n'est pas tout à fait correct;
Si ton tableau est {-2, -5, -8, -1}, le maximum est 0.

il faut plutôt faire maximum=tab[0]; (et non maximum=0)
puis tu fais une boucle du 2e élément du tableau (tab[1]) jusqu'au dernier (tab[longueur-1])
0
Zep3k!GnO Messages postés 2025 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 200
6 oct. 2005 à 15:12
"permet de determiner le maximum entre des elements d'un tableau "
Soit ça fait vraiment trop longtemps que j'ai pas fait de C++, soit c'est pas français comme explication !
Si c'est le 2ème ,reformule ta question et on verra....

Zep3k!GnO
-->hi i hi o on va pas au boulot :P
0
dje-dje Messages postés 10417 Date d'inscription mardi 6 janvier 2004 Statut Modérateur Dernière intervention 28 janvier 2011 758
6 oct. 2005 à 16:37
Un tableau c'est pas un pointeur? ^^

a+
dje-dje
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dje-dje Messages postés 10417 Date d'inscription mardi 6 janvier 2004 Statut Modérateur Dernière intervention 28 janvier 2011 758
11 oct. 2005 à 14:03
Si tu as un tableau de 5 case et que tu appelles tab[2], tu appelles bien la deuxieme valeur (ou la troisieme si ca part de 0) du tableau tab.
C'est pas considéré comme un pointeur?

a+
dje-dje
0
Luffy =) Messages postés 365 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 19 mai 2006 110
11 oct. 2005 à 14:17
bonjour tout le monde,

Je suis d'accord avec toi dje-dje, quand on fait
int tab[5];
tab contient l'adresse de la première case du tableau. Si tu fais
 tab++;
tu n'incrémentes pas un entier mais tu pointeras sur la 2è case du tableau ('fin je crois...).

++
0
mamiemando Messages postés 33432 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 décembre 2024 7 809
12 oct. 2005 à 10:41
*tab=tab[0] correspond à la première valeur.
tab[1] correspond donc à la seconde et ainsi de suite.

Attention par contre car :
int tab[2] alloue bien seulement deux cases (tab[0] et tab[1]).

Pour le ++tab en effet c'est le pointeur qui est incrémenté (pour incrémenter la case (++*tab) ou ++tab[0]).

Rq: d'une manière générale, préferez la préincrémentation (++i) à la post incrémentation (i++) qui est meilleure point de vue mémoire.

Si vous utilisez la classe vector de la STL, vous avez la méthode at() qui permet d'accéder au ième du vecteur (vec.at(i) retournera vec[i]), mais qui déclenche une exception si on tape en dehors du vector. L'interêt c'est que c'est plus facile à débuger, mais que c'est un peu moins rapide à exécuter.

Pour ceux qui se mettent à la STL (nettement plus pratique que les tableaux du C), je vous conseille vivement de regarder un tutoriel par exemple :
http://www-inf.int-evry.fr/cours/C++/CoursEA/node39.html

Bonne chance
0
benguigui1 Messages postés 26 Date d'inscription jeudi 28 octobre 2004 Statut Membre Dernière intervention 13 septembre 2006 6
13 oct. 2005 à 14:07
il me semblait bien que tab contenanit l'adresse du 1er element du tableau.
On m'aurait menti ?
0
mamiemando Messages postés 33432 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 décembre 2024 7 809
13 oct. 2005 à 14:44
tab c'est l'adresse du début du tableau. Et *tab=tab[0] c'est le contenu de la première case. tab c'est un pointeur, une adresse quoi. Et à cette adresse il y a par exemple un entier qui est la valeur de tab[0]

Exemple :
                        *tab=2
tab=0xF45673------------>tab[0]=2           tab[1]=3       tab[2]=4...
                         0xF45673
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
13 oct. 2005 à 21:25
petite précision:
Tu as tout a fait raison en ce qui concerne la norme C++.
Mais avec certain compilateur comme les ancien gcc, tab ne désignait pas le pointeur sur le premier élément. Ainsi, tab1=tab2 était licite et permettait de copier tout les membres de tab2 dans tab1 sans pour autant avoir une égalité des pointeur.
Plus valable à partir de gcc3
Tu parle de vector::at(int), je l'ai aussi trouver sur internet, mais gcc n'a jamais voulu me le compiler...
L'utilise tu? et si oui avec quel compilo?
0
Luffy =) Messages postés 365 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 19 mai 2006 110
13 oct. 2005 à 14:53
tab c'est un pointeur, une adresse quoi.

Donc on en revient bien à ce que disais dje-dje, à savoir que
Un tableau c'est pas un pointeur? ^^

Sinon sympa la petite précision sur la pré et post incrémentation, bon à savoir ça !
0
mamiemando Messages postés 33432 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 décembre 2024 7 809
14 oct. 2005 à 09:46
Non pas tab::at(i) mais tab.at(i) (avec tab un vector, et je crois que ça marche aussi avec les set). L'opérateur a::b désigne "chercher une fonction b dans un namespace a". Exemple

namespace a{
   int f(){ return 0; }
}


Tu peux imbriquer les namespace. C'est assez pratique quand tu as un énorme projet pour éviter d'avoir deux fois le même nom de fonction, ça permet d'organiser quoi ;-)

Quand vous aurez fini avec la stl, les plus motivés pourront enchaîner avec boost (permet de gérer des matrices énormes et plein d'autres trucs) et la bgl (pour ceux qui font des graphes). Attention par contre c'est chaud et vous avez intérêt à maitriser les template avent de vous y lancer ;-)

Bonne chance
0
moi1 Messages postés 27 Date d'inscription jeudi 6 janvier 2005 Statut Membre Dernière intervention 23 mars 2007
9 août 2006 à 16:01
Dig up!!

J'ai une ptite question en pasant sur boost et bgl.
Tu parlais de dessiner des graphes avec. J'ai justement dessiné recemment un graphe en OpenGl.

Il est plus rapide qu'OpenGL?
Ca serait pas une sorte de Matlab version C++?

J'ai pas vraiment le temps de m'y pencher, ca serait sympa d'avoir des infos dessus.

Merci!

Laurent.
0
mamiemando Messages postés 33432 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 décembre 2024 7 809
9 août 2006 à 18:05
Non ce n'est pas la même vocation. Boost permet de manipuler entre autres des graphes (BGL) mais pas seulement. Il est par exemple possible de serializer des structure (ie générer un fichier binaire qui va permettre lors d'une exécution ultérieure de la charger immédiatement en mémoire).

La BGL permet quant à elle surtout de manipuler des structures de graphe C++ ultra optimisées et propose des algorithmes classiques de la théorie des graphe, comme l'algorithme de Dijkstra. Il est aussi possible de générer très facilement des fichiers dot (utilisé par graphviz) afin de représenter en 2D des graphes. Le dessin du graphe est alors délégué à graphviz (placement des sommets pour éviter les arcs qui se croisent, etc...).

Bonne chance
0