Aller au contenu

[C]Tableaux


Don_Angelo

Messages recommandés

Bonjour à tous,

Mon problème est le suivant, je voudrais créer un tableaux de n entiers mais dont les indices puissent être choisis par moi. Ex, avec n=4:

je voudrais avoir un tableau du style:

tableau[250]=1;

tableau[12]=5;

tableau[56]=3;

tableau[13]=7;

Mais je n'arrive pas à les déclarer et les utiliser convenablement. J'imagine que c'est probablement du au fait que ces tableaux ne se déclarent pas de la même façon que les tableaux classiques.

D'avance Merci.

Lien à poster

LapinGarou>Alors, heu je comprends pas bien ce que tu entends par tableaux dynamiques. Heu non, le but justement ce serait de pas avoir besoin de créer un tableau de la taille Nmax+1 (où Nmax est la valeur de mon plus grand indice) sinon ça deviendrait un peu ardu, étant donné que le tableau doit être parcouru par une boucle.

En fait je pense que ce que je voudrais se rapproche beaucoup d'un tableau associatif (en fait je n'ai pas vraiment besoin que les indices soient de type entier, des chaines de caractères pourraient très bien faire l'affaire) mais je ne pense pas que ce soit possible en C.

Parce que en fait c'est pour mon cours d'algo à la fac. On doit écrire un programme en C qui demande à l'utilisateur de rentrer une suite de nombre et de la lui classer dans l'ordre croissant. On a bien sur pas le droit d'utiliser les fonctions toutes faites, on doit les recoder nous même avec les outils qu'on a appris (cad pas grand chose en fait). Je voulais contourner la difficulté en créant un tableau intermédiaire dont les indices sont en fait les nombres saisis par l'utilisateur. Je sais c'est un peu tordu, mais je pense que ce serait plus rapide que de faire comme la prof me l'a conseillé à savoir faire une énorme boucle qui teste les valeurs 2 à 2 et les permute le cas échéant, et recommencer jusqu'à avoir tout classé.

Lien à poster

Je ne suis pas sur de comprendre ce que tu veux faire avec ton deuxième tableau , mais de toute façon il faudra bien que lui aussi tu le tries à un moment ou à un autre, non ?

Ce qui revient à ton exercice de départ ...

Il me sert d'index. Je pars du principe que le nombre 250 c'est le 250ième en partant de 1. En fait l'idée c'est de faire un tableau pour stocker les nombres donnés au départ par l'utilisateur.

Ensuite mon tableau index il contient en indice un des nombres saisis par l'utilisateur et sa valeur c'est l'indice correspondant dans le tableau de l'utilisateur. De fait j'ai pas besoin d'ordonner mon tableau index, puisque c'est lui qui me donne l'ordre sans lequel lire le tableau des nombres saisis par l'utilisateur. Enfin je ne crois pas.

Seul hic, cette technique ne marchera pas si l'utilisateur saisi 2 fois le même nombre, en effet j'aurais alors 2 valeurs pour un seul indice dans mon tableau index.

Lien à poster

Mouais, ça suppose qu'on ne saisisse pas de nombre supérieur à 250.

Il te faudra à la fin faire une fois le parcours du tableau pour trouver les chiffre choisis (car dans ton exemple tableau[0] à [11] existent mais n'ont pas de valeurs).

Ou alors code un tableau associatif.

Lien à poster

Dans ton cas, comme le suggère nworr, il ne faut pas de valeurs supérieures à 250, ou alors tu vas vite avoir un bug mémoire de sortie de tableau, d'où le tableau dynamique. En plus de ça, tu gaspilles de la mémoire. En plus de ça, les cases de tableau vide ont soit pour valeur 0, soit un nombre aléatoire, ça dépend du compilateur utilisé. Donc tu ne pourrais pas faire un test du genre : if(tableau[x]!=0)..., ce qui serait faux.

Ok. Un tableau dynamique, contrairement au statique, c'est un tableau dont on ne connait pas la taille au lancement du programme on va dire. (Ce qui est le cas ici, sauf si tu fixes le nombre d'entrées de l'utilisateur ).

Par exemple: tu demandes combien de nombres rentrer (nbvalues), et tu alloues le tableau (en C: "int* prt = calloc(nbvalues, sizeof(int);" pour des entiers, je suis plus trop sur de la syntaxe, ça fait un bout de temps déjà que j'ai arrêté le C)

A la fin du prog, ne pas oublier "if(ptr!=null) free(ptr);" sinon leak mémoire.

Après, à toi de chercher un algorithme de tri sur le web: tri à bulle, insertion, etc.

Si tu veux, j'ai un outil pour comparer les vitesses des différents tris. (Bon, faut encore que je le retrouve dans ma molle de fichiers de prog :D)

Et puis il y a : http://haypo.developpez.com/article/halloc/

Voilà.

Lien à poster

Merci pour vos réponses.

C'est plus ou moins ce que je craignais. J'espérais que les indices non-utilisés ne soient pas réservé en mémoire. Dommage, quoiqu'il en soit je vais quand même zieuter à fond la doc sur les allocations mémoires que vous m'avez recommandé, ça me sera utile pour le projet de fin de semestre.

Lien à poster
  • 2 semaines après...

Re-bonjour,

Je pose une question de vocabulaire, parce que je me suis pris la tête avec ma prof d'algo sur une précision de vocabulaire.

Pour moi un tableau à N dimension et un tableau de dimension N ne se rapporte pas à la même chose.

Un tableau à N dimension contient N tableau imbriqués les uns les autres, càd tableau[1][2]...[N]

et un tableau de dimension N contient N éléments, càd tableau[N-1]. Ma prof d'algo soutient que c'est là même chose. Moi je pense qu'elle a tort, parce que ça ne me semble pas logique, dans le sens ou un tableau c'est la même chose qu'une matrice en maths, et je suis sûr qu'en maths une matrice de dimension N contient bien N éléments (mon prof de maths m'avait un jour mis en garde à ce sujet) et que je suis presque certain d'avoir lu un paragraphe entier sur la distinction entre ces deux notions dans un bouquin de programmation.

D'après vous qui à tort et qui à raison?

[edit] au temps pour moi je me suis pas relu, je voulais dire que pour moi tableau de dimension N signifie N élément dans le tableau, mais qu'il pouvait conetnir plusieurs dimensions, le tout étant qu'il devait toujours avoir N élément au total

Lien à poster

alors pour moi une matrice de dimension N est un tableau N x N, mais pas obligatoirement si tu precise la taille de chaque dimension

un tableau à 2 dimension est effectivement un tableau du genre tab[x][y]

un tableau a 3 dimensions tab[x][y][z]

tableau à N dimension = matrice carrée de dimension N sauf si tu précise la taille de chaque dimension, ce qu'il faut de toute manière faire lors de la création statique du tableau. bref on s'éloigne.

tableau de dimension N, et bien c'est la même chose.

Je pense que tu associe dans ce cas le mot dimension à taille de la dimension. Alors qu'en principe, dans ce cas là le mot défini vraiment la dimension.

dimension != taille

toi tu utilise dimension equivalent à la taille : ok dans le sens commun ou en mécanique, MAIS c'est un abus de langage, surtout en mathématique et en physique.

a mon avis.

Lien à poster

rjds> +1. Je pense plutôt que ta prof voulait dire un tableau à 1 dimension de N éléments. Il est rare que l'on utilise des tableaux (voire impossible) de dimension N (3 tout au plus, voire 4) : tu imagines le problème taper la ligne de code pour accéder à une valeur dans N (disons 2000 par exemple) dimensions (quelle que soit sa taille :D ) ?

Lien à poster

rjds>Mon soucis c'est que le paragraphe du bouquin en question semblait justement marteler sur le fait que la taille est la dimension d'un tableau sont la même chose.

Lapin_Garou>En fait l'intitulé de son exo demandais d'utiliser, je cite, "une matrice carrée de dimension N".

Moi j'ai compris qu'elle voulait un tableau de 2 dimensions contenants N éléments au total, et justement ce n'était pas ça. Elle voulait un tableau de 2 "colonnes" à N "lignes" chacune, en clair tableau[N][N]. Je suis sûr que la formulation et ce qu'elle dit ne désignent pas la même chose. En fait la question est de savoir comment qu'on dit en vrai si je puis dire.

Lien à poster

Oui, il y a effectivement un problème sur ce qu'elle veut vraiment. (un tableau de 2 colonnes à N lignes ça donnerait plutôt : tab[N][2] (colonnes en premier il me semble)

Bon, pour un tableau carré (donc 2 Dimensions, pas 2 colonnes) de N éléments sur chaque coordonnées, il faut :

statique: tab[TAB_SIZE][TAB_SIZE] (TAB_SIZE doit être défini avant, avec par ex : #define TAB_SIZE 1200000000 (gaffe à la ram quand même !)

dynamique: allouer un tableau de pointeurs de taille : TAB_SIZE, eux même pointant chacun vers un tableau de taille TAB_SIZE. (ne pas oublier les free pour chaque ligne, ce qui devient fastidieux... et compliqué à gérer si il y a une erreur)

Sinon elle aurait dit une matrice de 2 par N ou N par 2...

Lien à poster

cela dit, si la matrice est carrée, cela a du sens de demander une matrice carrée de dimension N, chaque dimension doit avoir la taille N. obligatoirement.

Don_Angelo > ok je vois l'enoncé. Il est merdique.tu as eu raison de soulever ce point de vocabulaire. Moi ce qui me choc le plus c'est le fait qu'elle puisse demander une matrice carrée, et qu'elle attendait un tableau 2 x N

edit: j'ai dis qq conneries

Lien à poster

LapinGarou>Ouh là effectivement j'ai décidément pas les idées qui tournent rond, elle voulait bien du tableau[N][2].

J'aime pas cette distinction ligne colonnes, ça veut rien dire. Je suis juste passé pour un gros chieur aux yeux de 90% des gens présents, à la rigueur je m'en fiche mais ce qui me gène c'est que cette prof n'y connait rien au C, et elle notre prof de TP. Je prétends pas être un expert du C, je ne connais que les bases et je n'ai pas beaucoup de pratique, mais quand je vois ce qu'elle dit parfois comme âneries, du style en C il y a quatre types de boucles, je me marre. :oups

Heureusement que vous et les bouquins êtes là. ^^ :top

Lien à poster
  • 2 semaines après...

je reviens dans ce topic pour une autre question tout aussi méta-physique.

Le prof d'info nous expliquait qu'en C on n'a pas le droit de déclarer un tableau dont le nombre d'éléments soit une variable, çàd que je n'ai pas le droit d'écrire ceci:

int n;
int tableau[n];

Que la seule exception était la suivante:

const int n=6;
int tableau [n];

Je lève alors une objection en expliquant que j'étais sûr, pour l'avoir déjà fait, que en C

j'ai tout à fait le droit de déclarer le tableau de la façon suivante:

int tableau [n];

et que la seule condition était que n soit déclarée et du type entier, et que n pouvait même être le résultat d'une saisie utilisateur et donc que n n'était pas nécessairement une constante.

Le prof répond que j'ai tort et que à la compilation j'aurais un problème puisque la valeur de n doit être connue au moment de la compilation que le compilateur devait réserver l'espace mémoire occupé par mon tableau en mémoire et donc que dans le cas d'une saisie utilisateur je devais procéder de la façon suivante sous peine d'avoir une erreur de compilation:

scanf("%d",&n);
const int i=n;
int tab[i];

Il ne m'a bien sûr pas laissé lui répondre que même dans ce cas là la valeur de i n'était pas connue au moment de la compilation.

Moi je pense que le problème ne se pose pas parce que au moment de la compilation une variable déclarée possède une valeur par défaut fixée par le compilateur et que cette valeur est écrasée à l'initialisation.

Quel est votre avis sur la question?

Lien à poster

+1 avec nworr.

Comment veux-tu reserver un tableau d'une taille i non encore connue ??

déja en principe en C on ne déclare pas de variable au milieu du code.

Le seul truc que tu puisse faire c'est de l'allocation dynamique qui va dans ce cas là réserver de la mémoire dans le tas (heap)

les variables définie dans le code seront placé dans l'image mémoire du binaire.

Lien à poster

nworr>J'ai naturellement testé ce code avant de le poster, et sous codeblocks la compilation et ensuite l'exécution se passent sans le moindre problème. C'est justement ça ce que je me demande, comment ça peut fonctionner alors que la logique voudrait que ça ne fonctionne pas. J'ai bien une idée sur la question à savoir que le compilateur fait avec la valeur par défaut de la variable de type int, mais ça parait risqué.

Je suis d'accord sur le fait que ce serait milles fois plus propre avec un bon vieux malloc mais le fait que ça semble fonctionner me chiffonne quand même un peu.

Lien à poster
×
×
  • Créer...