Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1207 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1350266
vinoromano
saoule
Posté le 20-04-2006 à 10:40:45  profilanswer
 

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.

mood
Publicité
Posté le 20-04-2006 à 10:40:45  profilanswer
 

n°1350273
_darkalt3_
Proctopathe
Posté le 20-04-2006 à 10:50:37  profilanswer
 

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
n°1350274
noldor
Rockn'roll
Posté le 20-04-2006 à 10:50:56  profilanswer
 

sizeof

n°1350314
Emmanuel D​elahaye
C is a sharp tool
Posté le 20-04-2006 à 11:34:38  profilanswer
 

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/
n°1350377
big_dadi_f​at
Posté le 20-04-2006 à 12:29:56  profilanswer
 

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) ;
 
 
 
 

n°1350585
Sve@r
Posté le 20-04-2006 à 16:21:44  profilanswer
 

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.
n°1350595
vinoromano
saoule
Posté le 20-04-2006 à 16:34:18  profilanswer
 

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.

n°1350618
_darkalt3_
Proctopathe
Posté le 20-04-2006 à 16:48:38  profilanswer
 

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

n°1350716
Sve@r
Posté le 20-04-2006 à 18:39:06  profilanswer
 

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.
n°1350737
skelter
Posté le 20-04-2006 à 19:22:18  profilanswer
 

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

mood
Publicité
Posté le 20-04-2006 à 19:22:18  profilanswer
 

n°1350841
Sve@r
Posté le 20-04-2006 à 22:11:36  profilanswer
 

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.
n°1350843
skelter
Posté le 20-04-2006 à 22:25:12  profilanswer
 

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

n°1350854
Sve@r
Posté le 20-04-2006 à 22:46:13  profilanswer
 

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.
n°1350871
skelter
Posté le 20-04-2006 à 23:10:45  profilanswer
 

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)

n°1350885
Sve@r
Posté le 20-04-2006 à 23:47:16  profilanswer
 

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.
n°1350927
Taz
bisounours-codeur
Posté le 21-04-2006 à 07:21:16  profilanswer
 

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 ?


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
BDD simple (tableau 10 colonnes) > comment m'y prendre ?Faire un programme en C ou C++ et l'utiliser sous excel ou Ooo
HTML probleme avec tableau tres complexeDéclaration de tableau et taille
Utiliser Icones[PHP]Utiliser le resultat d'un DATE_FORMAT de requete mysql sous dream
Accéder aux éléments d'un vecteur de paires[CSS] Quel programme gratuit utiliser ? up: Apercu CSS ?
Cellule d'un tableau avec image étirable en background ?Soucis avec un tableau simple
Plus de sujets relatifs à : utiliser les éléments d'un tableau d'entiers


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR