Le décalage des éléments de rang supérieur à i dans un tableau
Fermé
leilamoncif
Messages postés
5
Date d'inscription
samedi 31 janvier 2015
Statut
Membre
Dernière intervention
25 mai 2015
-
Modifié par leilamoncif le 31/01/2015 à 15:36
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 4 févr. 2015 à 13:05
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 4 févr. 2015 à 13:05
A voir également:
- Le décalage des éléments de rang supérieur à i dans un tableau
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Comment faire un tableau - Guide
- Les données fournies dans le fichier à télécharger peuvent être synthétisées par le tableau récapitulatif suivant. dans le fichier, générez ce tableau automatiquement (tableau croisé dynamique ou table de pilote) à partir des 4 premières colonnes. cinq valeurs manquent dans le tableau suivant. retrouvez-les dans votre tableau puis reportez-les, arrondies à l’entier le plus proche, dans la zone de réponse. - Forum Excel
- I showkeyplus - Télécharger - Utilitaires
5 réponses
ElementW
Messages postés
4816
Date d'inscription
dimanche 12 juin 2011
Statut
Contributeur
Dernière intervention
5 octobre 2021
1 228
31 janv. 2015 à 16:19
31 janv. 2015 à 16:19
'lut, et qu'as-tu déjà tenté?
leilamoncif
Messages postés
5
Date d'inscription
samedi 31 janvier 2015
Statut
Membre
Dernière intervention
25 mai 2015
31 janv. 2015 à 16:43
31 janv. 2015 à 16:43
J'ai tenté ça mais ça n'a pas marché
C'est programme en C mais il est incomplet,
#include <stdio.h>
#include <stdlib.h>
int inserer (liste *l, cell *c, int r)
{
list *tmp = l;
int j = 0;
while (tmp != NULL && j < r)
{
[tab] tmp = tmp->suiv;
[tab]j++;
}
c- >suiv = tmp- >suiv;
tmp- >suiv = c;
}
void main()
{
int lis *i, cel* o, a;
printf("%d",inserer(lis *i, cel* o, a)) ;
getch();
}
C'est programme en C mais il est incomplet,
#include <stdio.h>
#include <stdlib.h>
int inserer (liste *l, cell *c, int r)
{
list *tmp = l;
int j = 0;
while (tmp != NULL && j < r)
{
[tab] tmp = tmp->suiv;
[tab]j++;
}
c- >suiv = tmp- >suiv;
tmp- >suiv = c;
}
void main()
{
int lis *i, cel* o, a;
printf("%d",inserer(lis *i, cel* o, a)) ;
getch();
}
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
31 janv. 2015 à 18:02
31 janv. 2015 à 18:02
Bonsoir
@leilamoncif:j'aimerais faire un programme qui l'insertion suivante:
Soit un tableau de taille N si l'on souhaite ajouter un élément en i ème position il faut décaler tous les éléments de rang supèrieur à i.
Tableaux ou liste chainée ? (vue la fonction insertion )
Dans le cas d'un tableau, il suffit de faire comme l'exemple ci-dessous, mais dans le cas d'une liste, il faudrait chainer les informations à la position souhaitée et tout ce qui se situe après la position l'actuelle de I, seront respectivement tous à In + 1
à bientôt
@leilamoncif:j'aimerais faire un programme qui l'insertion suivante:
Soit un tableau de taille N si l'on souhaite ajouter un élément en i ème position il faut décaler tous les éléments de rang supèrieur à i.
Tableaux ou liste chainée ? (vue la fonction insertion )
Dans le cas d'un tableau, il suffit de faire comme l'exemple ci-dessous, mais dans le cas d'une liste, il faudrait chainer les informations à la position souhaitée et tout ce qui se situe après la position l'actuelle de I, seront respectivement tous à In + 1
#include <stdio.h> #include <stdlib.h> #define MAX 5 int main( void ){ short *p_short = NULL; unsigned int i = 0; /* Allocation */ p_short = (short*)calloc( MAX, sizeof(short) ); if( p_short == NULL ){ perror("Erreur Allocation\n"); exit( EXIT_FAILURE ); } /* Ajout des valeurs */ for( i = 0; i < MAX; i++ ) p_short[i] = (short)i; /* Affichage du tableau */ for( i = 0; i < MAX; i++ ) printf("%4d|(%d) = (%d) |\n",i+1, i, p_short[i] ); printf("--Fin tableaux origine--\n"); /* Ré-allocation */ p_short = (short*)realloc( p_short, (MAX*sizeof(short)) ); if( p_short == NULL ){ perror("Erreur réallocation\n"); exit( EXIT_FAILURE ); } /* Ajout i+1 élement */ for( i = 5; i < (MAX*2); i++ ) p_short[i] = (short)i; /* Affichage du tableau */ for( i = 0; i < (MAX*2); i++ ) printf("%4d|(%d) = (%d) |\n",i+1, i, p_short[i] ); free( p_short ); printf("--Fin tableaux modifier--\n"); return( EXIT_SUCCESS ); }
à bientôt
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
31 janv. 2015 à 21:45
31 janv. 2015 à 21:45
Sambia39,
Je sais que c'est plus fort que toi, mais il faut se contenter d'aider pas de faire ;-).
Ce n'est pas leur rendre service.
Je sais que c'est plus fort que toi, mais il faut se contenter d'aider pas de faire ;-).
Ce n'est pas leur rendre service.
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
31 janv. 2015 à 22:01
31 janv. 2015 à 22:01
;) Fiddy
Ok, j'essayerais la prochaine fois de faire que le strict minimum, merci pour le conseil à bientôt
Ok, j'essayerais la prochaine fois de faire que le strict minimum, merci pour le conseil à bientôt
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
Modifié par [Dal] le 2/02/2015 à 12:18
Modifié par [Dal] le 2/02/2015 à 12:18
@sambia39, ton realloc n'augmente pas la taille allouée, car en ligne 28 le 2ème argument de realloc indique une taille (supposée nouvelle) de MAX*sizeof(short), ce qui est la même taille que la taille initialement allouée en ligne 12 avec le calloc (MAX éléments de taille sizeof(short) chacun). Du coup l'écriture en ligne 35 et la suite du code accède à des zones mémoire non allouées et provoque une erreur de segmentation.
Si tu veux insérer des données représentant deux fois la taille du tableau d'origine, ton realloc doit doubler la taille initiale avec un truc du genre
@fiddy, il me semble que le code de Sambia ne répond pas vraiment à l'énoncé, puisqu'il n'insère pas un élément en décalant les autres. Il ne donne donc pas une solution "pré-machée". Par contre, il illustre comment une allocation et réallocation de mémoire peut être utilisée pour augmenter la taille en mémoire d'un tableau, sous réserve de la correction ci-dessus.
@leilamoncif : je ne suis pas sûr que ton énoncé te demande de gérer des allocations de mémoire avec des pointeurs. Si ce n'est pas le cas, tu peux prévoir un tableau de départ avec une capacité plus grande que le nombre d'éléments de départ, pour pouvoir y insérer des éléments dans la limite de l'espace disponible. Cela peut simplifier ton code. Tu dois alors juste gérer le décalage. Prend une feuille de papier quadrillée et un crayon et vois comment tu insères un élément au milieu de cases consécutives numérotées, et reproduit cette logique dans ton programme.
Dal
Si tu veux insérer des données représentant deux fois la taille du tableau d'origine, ton realloc doit doubler la taille initiale avec un truc du genre
p_short = (short*)realloc( p_short, (MAX*2*sizeof(short)) );par exemple.
@fiddy, il me semble que le code de Sambia ne répond pas vraiment à l'énoncé, puisqu'il n'insère pas un élément en décalant les autres. Il ne donne donc pas une solution "pré-machée". Par contre, il illustre comment une allocation et réallocation de mémoire peut être utilisée pour augmenter la taille en mémoire d'un tableau, sous réserve de la correction ci-dessus.
@leilamoncif : je ne suis pas sûr que ton énoncé te demande de gérer des allocations de mémoire avec des pointeurs. Si ce n'est pas le cas, tu peux prévoir un tableau de départ avec une capacité plus grande que le nombre d'éléments de départ, pour pouvoir y insérer des éléments dans la limite de l'espace disponible. Cela peut simplifier ton code. Tu dois alors juste gérer le décalage. Prend une feuille de papier quadrillée et un crayon et vois comment tu insères un élément au milieu de cases consécutives numérotées, et reproduit cette logique dans ton programme.
Dal
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
2 févr. 2015 à 16:10
2 févr. 2015 à 16:10
Bonjour @Dal ;)
Exacte ,je n'ai pas mis le "*2" pour la réallocation (mais bien dans la boucle d'affectation qui suit l'instruction précédente) et comme à mon habitude je me précipite.
Cependant, pour qu'il puisse décale un élément du tableau il doit réallouer une taille suffisante afin de remplir tout le contenue de son tableau d'où l'exemple. Le reste c'est à lui de le faire( traitement du décalage) afin d'affecter chaque élément à la place souhaitée.
à bientôt
Exacte ,je n'ai pas mis le "*2" pour la réallocation (mais bien dans la boucle d'affectation qui suit l'instruction précédente) et comme à mon habitude je me précipite.
Cependant, pour qu'il puisse décale un élément du tableau il doit réallouer une taille suffisante afin de remplir tout le contenue de son tableau d'où l'exemple. Le reste c'est à lui de le faire( traitement du décalage) afin d'affecter chaque élément à la place souhaitée.
à bientôt
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
3 févr. 2015 à 10:08
3 févr. 2015 à 10:08
Salut sambia39 :-)
oui, ton exemple est un exemple d'usage de malloc / réalloc, avec des pointeurs et l'accès aux données par les indices de tableaux, pour obtenir un tableau de taille dynamique (pas un exemple réellement de décalage).
pour être complet sur l'usage de realloc, il y a une autre précaution souhaitable, qui est d'utiliser un pointeur intermédiaire pour y mettre le résultat de realloc, afin de ne pas écraser le premier pointeur avec le résultat de realloc (qui peut renvoyer NULL) tant que l'on n'a pas vérifié que la réallocation ne s'est pas déroulée sans erreurs (et pouvoir libérer cette mémoire si nécessaire, ou faire ce que l'on doit faire avec les données en mémoire).
autrement, le premier pointeur vers les données peut être perdu.
Dal
oui, ton exemple est un exemple d'usage de malloc / réalloc, avec des pointeurs et l'accès aux données par les indices de tableaux, pour obtenir un tableau de taille dynamique (pas un exemple réellement de décalage).
pour être complet sur l'usage de realloc, il y a une autre précaution souhaitable, qui est d'utiliser un pointeur intermédiaire pour y mettre le résultat de realloc, afin de ne pas écraser le premier pointeur avec le résultat de realloc (qui peut renvoyer NULL) tant que l'on n'a pas vérifié que la réallocation ne s'est pas déroulée sans erreurs (et pouvoir libérer cette mémoire si nécessaire, ou faire ce que l'on doit faire avec les données en mémoire).
autrement, le premier pointeur vers les données peut être perdu.
Dal
leilamoncif
Messages postés
5
Date d'inscription
samedi 31 janvier 2015
Statut
Membre
Dernière intervention
25 mai 2015
31 janv. 2015 à 18:44
31 janv. 2015 à 18:44
Merci pour la reponse mais si je pouvais eventuellement avoir ce que tu as mis en programme C, il s'agissait effectivement d'un tableau.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
31 janv. 2015 à 21:46
31 janv. 2015 à 21:46
C'est du C ce que sambia39 a mis. À toi de t'en inspirer pour utiliser un tableau.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
leilamoncif
Messages postés
5
Date d'inscription
samedi 31 janvier 2015
Statut
Membre
Dernière intervention
25 mai 2015
1 févr. 2015 à 01:15
1 févr. 2015 à 01:15
En tout cas merci Sambia39 :)