utiliser les éléments d'un tableau d'entiers

utiliser les éléments d'un tableau d'entiers - C - Programmation

Marsh Posté le 20-04-2006 à 10:40:45    

Bonjour,
j'ai un tableau t d'entiers, séparés par un espace, de taille n. ex:t={ 12 15 16 86 896 854 589 569 123 156} (taille 10) et une fonction f. je voudrais appliquer à chaque entier du tableau t la fonction f de sorte que:    res = f(12). Comment prendre chaque élément de t?
Voici un code:
for(i=0; i<10; i++)
{res=f(i)};
 
Auriez vous s'il vous plaît un code si la taille du tableau n'est pas connue?
Merci.

Reply

Marsh Posté le 20-04-2006 à 10:40:45   

Reply

Marsh Posté le 20-04-2006 à 10:50:37    

ne pas répondre quand on fait autre chose :o
 
pour l'accès aux éléments d'un tableau t : t[indice]


Message édité par _darkalt3_ le 20-04-2006 à 13:48:32
Reply

Marsh Posté le 20-04-2006 à 10:50:56    

sizeof

Reply

Marsh Posté le 20-04-2006 à 11:34:38    

vinoromano a écrit :

j'ai un tableau t d'entiers, séparés par un espace, de taille n. ex:t={ 12 15 16 86 896 854 589 569 123 156} (taille 10) et une


Les données dont tu parles (entiers séparé par un espace) elles sont dans un fichier texte, ou une chaine de caractère ? C'est pas très clair tout ça...


Message édité par Emmanuel Delahaye le 20-04-2006 à 11:42:36

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 20-04-2006 à 12:29:56    

Les données dont tu parles (entiers séparé par un espace) elles sont dans une chaine de caractère ?
si  c'est la cas alors :
 
1) tu ne doit pas inissialiser comme ce : t={ 12 15 16 86 896 854 589 569 123 156}
tu peut faire :  t={ 12 , 15 , 16 , 86 , 896 , 854 , 589 , 569 , 123 , 156 }
 
 
2)tu peux acceder au element du tableau grace à t[i]   ( ou  *(t+i)   si tu ve utiliser les pointeurs )
 
for(i=0; i<10; i++)      { res = f(i) };
 
 
for(i=0; i<10; i++)        {  res = f( t[i] );    }
 
la variable res prandra à chaque passage :
f(12) ; f(15) ; f(16) ; f(86) ... jusqu'à   f(156) ;
 
 
 
 

Reply

Marsh Posté le 20-04-2006 à 16:21:44    

big_dadi_fat a écrit :

tu peut faire :  t={ 12 , 15 , 16 , 86 , 896 , 854 , 589 , 569 , 123 , 156 }


Non... voici la bonne syntaxe

Citation :

static int t[ ]={ 12 , 15 , 16 , 86 , 896 , 854 , 589 , 569 , 123 , 156 };


 

vinoromano a écrit :

Auriez vous s'il vous plaît un code si la taille du tableau n'est pas connue?


Il te faut alors mettre dans ton tableau une valeur dite "sentinelle" qui servira à détecter la fin du tableau. Bien évidemment, cette valeur particulière ne doit pas pouvoir s'y trouver de façon involontaire du programmeur...
Ex: On pose "-1" comme sentinelle

Code :
  1. static int t[]={ 12 , 15 , 16 , 86 , 896 , 854 , 589 , 569 , 123 , 156, -1 };
  2. int i;
  3. for (i=0; t[i] != -1; i++)
  4.     res=f(t[i]);

Message cité 1 fois
Message édité par Sve@r le 20-04-2006 à 16:35:36

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 20-04-2006 à 16:34:18    

vinoromano a écrit :
 
j'ai un tableau t d'entiers, séparés par un espace, de taille n. ex:t={ 12 15 16 86 896 854 589 569 123 156} (taille 10) et une
 
----------------------------------------------------------------------
Les données dont tu parles (entiers séparé par un espace) elles sont dans un fichier texte, ou une chaine de caractère ? C'est pas très clair tout ça...
 
 
 
Le tableau est enregistré dans un fichier que j'ouvre mais je bloque sur comment lire chaque entier séparé par un espace et déterminer le nombre total d'elements.

Reply

Marsh Posté le 20-04-2006 à 16:48:38    

Se documenter d'urgence sur:
- opération sur les fichiers: ouverture, fermeture, lecture.
- les tableaux.

Reply

Marsh Posté le 20-04-2006 à 18:39:06    

vinoromano a écrit :

Le tableau est enregistré dans un fichier que j'ouvre mais je bloque sur comment lire chaque entier séparé par un espace et déterminer le nombre total d'elements.


 
Donne des détails sur la structure de ton fichier. Comment le tableau est-il écrit dans ton fichier ? Un nombre par ligne ?? Tous les nombres sur une même ligne ??? Est-il écrit textuellement "t={........}" ???
 

_darkalt3_ a écrit :

Se documenter d'urgence sur:
- opération sur les fichiers: ouverture, fermeture, lecture.
- les tableaux.


A mon avis, il serait bon de jeter aussi un oeuil sur les bases, les boucles, les manipulations de chaînes, bref tout le C...[:ddr555]


Message édité par Sve@r le 20-04-2006 à 18:41:56

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 20-04-2006 à 19:22:18    

Sve@r a écrit :

Non... voici la bonne syntaxe


 
pourquoi static ?
 
 

Citation :

Il te faut alors mettre dans ton tableau une valeur dite "sentinelle"


 
je comprends pas l'interet d'une telle solution, c'est tres restrictif et inutile car tu connais toujours la taille d'un tableau que tu manipules

Reply

Marsh Posté le 20-04-2006 à 19:22:18   

Reply

Marsh Posté le 20-04-2006 à 22:11:36    

skelter a écrit :

pourquoi static ?


C'est une habitude que j'ai prise lorsque j'ai vu que certain compilos refusaient de créer un tableau initialisé s'il n'était pas mis en classe d'allocation "static"...
 

skelter a écrit :

je comprends pas l'interet d'une telle solution, c'est tres restrictif et inutile car tu connais toujours la taille d'un tableau que tu manipules


En général oui. Il existe cependant un cas où la solution de la sentinelle est assez intéressante à employer
C'est le cas où tu as une liste de valeurs que tu veux traiter tout en laissant ton programme évolutif.
Si tu définis un tableau de "n" éléments, tu peux en effet boucler de 0 à "n". Mais le jour où tu rajoutes quelques valeur dans ton tableau, tu dois reprendre tout ton code et remplacer dans chaque boucle "n" par le nouveau "n".
Avec la valeur sentinelle, t'as plus ce soucis. Tu insères autant d'éléments que tu veux quand tu veux. Evidemment tu es restreint sur une valeur interdite.
 
T'as un exemple d'un tel tableau ici: http://forum.hardware.fr/hardwaref [...] 8189-1.htm
J'ai posté un code le 4/10/2004 où je balaye (ligne 49) un tableau nommé "tabQuestion" grâce à une sentinelle. Je peux y rajouter ainsi autant de questions que je veux sans me préoccuper de la boucle...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 20-04-2006 à 22:25:12    

Citation :

C'est une habitude que j'ai prise lorsque j'ai vu que certain compilos refusaient de créer un tableau initialisé s'il n'était pas mis en classe d'allocation "static"...


 
sur ? vieux compilateurs alors
et c'est tres problematique comme habitude car la sémantique n'est plus la meme (sauf si le tableau constant)
 

Citation :

C'est le cas où tu as une liste de valeurs que tu veux traiter tout en laissant ton programme évolutif.
Si tu définis un tableau de "n" éléments, tu peux en effet boucler de 0 à "n". Mais le jour où tu rajoutes quelques valeur dans ton tableau, tu dois reprendre tout ton code et remplacer dans chaque boucle "n" par le nouveau "n".


 
non ! un tableau reste un tableau, ce n'est pas parce que tu peux ne pas préciser sa taille en l'initialisant que celle-ci est inconnue
 

Code :
  1. int v [] = { 12 , 15 , 16 , 86 , 896 , 854 , 589 , 569 , 123 , 156 };
  2. const size_t size = sizeof v / sizeof *v;
  3. size_t i;
  4. for( i = 0; i < size; i++ ) { ... }


 
avec ca tu peux modifier la liste de valeur d'initialisation du tableau sans remplacer un "n" par un autre "n", je vois pas ou est le probleme et surtout dans quel cas une valeur "sentinelle" se justifie

Reply

Marsh Posté le 20-04-2006 à 22:46:13    

skelter a écrit :

sur ? vieux compilateurs alors


Tout le monde n'est pas sur du Linux Mandrake 10.2  ;)  
 

skelter a écrit :


Code :
  1. int v [] = { 12 , 15 , 16 , 86 , 896 , 854 , 589 , 569 , 123 , 156 };
  2. const size_t size = sizeof v / sizeof *v;
  3. size_t i;
  4. for( i = 0; i < size; i++ ) { ... }


 
avec ca tu peux modifier la liste de valeur d'initialisation du tableau sans remplacer un "n" par un autre "n", je vois pas ou est le probleme et surtout dans quel cas une valeur "sentinelle" se justifie


 
Très joli exemple - En voici un autre

Code :
  1. static char *pays[]={"Panama", "Cuba", "France", "Bolivie", NULL};
  2. char **pt;
  3. for (pt=pays, *pt != NULL; pt++) {...}


Je préfère personnellement cette solution qui inclut automatiquement le critère de fin dans le tableau que je manipule, plutôt que de définir une seconde variable où sa liaison avec le tableau "v" ne saute pas forcément aux yeux du néophyte.
 
Mais je ne dis pas que la sentinelle est "toujours" la meilleure solution. Surtout avec un tableau d'entiers où il peut être difficile d'aller trouver une valeur qui n'est jamais utilisée. Je dis que c'est "une solution" (je sais, dans mon post initial j'ai dit "il faut" mais c'est une erreur...)
 

skelter a écrit :

et c'est tres problematique comme habitude car la sémantique n'est plus la meme (sauf si le tableau constant)


Ah ? Que veux-tu dire avec la "sémantique" ???

Message cité 1 fois
Message édité par Sve@r le 20-04-2006 à 22:56:02

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 20-04-2006 à 23:10:45    

Citation :

plutôt que de définir une seconde variable où sa liaison avec le tableau "v" ne saute pas forcément aux yeux du néophyte


 
pour une histoire de forme... tu peux aussi faire une macro si tu trouves ca trop lourd
 

Code :
  1. #define array_size(V) (sizeof V / sizeof *V)
  2. ...
  3. for( i = 0; i < array_size(v); i++ )
  4. { ... }


 
et aucun probleme d'éfficacité puisque c'est évalué à la compilation
 
de toute facon tu as toujours besoin de connaitre la taille d'un tableau et ta méthode de parcours en testant une valeur sentinnelle doit severement brider le compilateur à l'étape optimisation
 
le seul interet que je vois aux valeurs sentinelles c'est pour les listes d'arguments variables (comme les fonctions exec), c'est nettement mieux au niveau de la sécurité que de devoir mettre à jour un entier indiquant le nombre d'arguement passés à la fonction
mais pour les tableaux c'est inutile et surement inefficace
 

Citation :


Ah ? Que veux-tu dire avec la "sémantique" ???


 
si ton tableaux est déclarée "static" et de fait non constant les modifications seront conservées d'un appel à l'autre (puisque c'est le meme tableau, d'ailleur attention à la non-réentrance du code) alors que si il est lexical (automatique) il est créé et initialisé à chaque appel donc ce n'est pas du tout le meme comportement et le choix du qualificateur 'static' doit se faire avant tout en fonction de ca (la sémantique)

Reply

Marsh Posté le 20-04-2006 à 23:47:16    

skelter a écrit :

si ton tableaux est déclarée "static" et de fait non constant les modifications seront conservées d'un appel à l'autre (puisque c'est le meme tableau, d'ailleur attention à la non-réentrance du code) alors que si il est lexical (automatique) il est créé et initialisé à chaque appel donc ce n'est pas du tout le meme comportement et le choix du qualificateur 'static' doit se faire avant tout en fonction de ca (la sémantique)


 
Je vois - Ce pourrait être illustré ainsi

Code :
  1. void f()
  2. {
  3.      static int v[]={5};
  4.      v[0]++;
  5. }


Si "v" est static, v[0] s'incrémente au fur et à mesure qu'on appelle "f" alors que si "v" n'est pas static, v[0] vaut toujours 6 en fin de fonction
 
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 21-04-2006 à 07:21:16    

Sve@r a écrit :

Tout le monde n'est pas sur du Linux Mandrake 10.2  ;)  

j'aimerais bien voir ça quand même... t'es sur de pas confondre avec le fait que l'initialiseur doit être constant ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed