Traitement sur les vecteurs

Fermé
cerobertgomy
Messages postés
2
Date d'inscription
vendredi 12 mai 2017
Statut
Membre
Dernière intervention
17 mai 2017
- 16 mai 2017 à 01:48
YCN-
Messages postés
116
Date d'inscription
mercredi 24 juin 2015
Statut
Membre
Dernière intervention
13 juillet 2017
- 1 juin 2017 à 16:56
salut mes chers, s'il vous plait j'ai un exercice en C dans lequel je n'arrive pas à me retrouver.L’exercice est le suivant:

1) Saisir les éléments dans un vecteur .
2) Afficher les éléments dans un vecteur.
3) Rechercher un élément dans un vecteur.
4) Ajouter un élément dans un vecteur.
5) Supprimer un élément dans un vecteur.
6) Insérer un élément dans un vecteur.
7) Modifier un élément dans un vecteur.

Le tous le tout dans un même exercice.

2 réponses

[Dal]
Messages postés
5912
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
23 septembre 2022
1 014
Modifié le 16 mai 2017 à 09:28
Salut cerobertgomy,

La notion de "vecteur" n'existe pas en C. La première question à te poser est de décider de la structure de données C qui va représenter ton "vecteur".

S'il s'agit de pouvoir stocker une série de nombres entiers, par exemple, tu peux créer ton "vecteur" sous la forme d'un tableau en C.

Il te faudra donc créer un tableau de données du type requis, et avec une dimension donnée.

Sur la question de la dimension, tu peux :

1- créer un tableau statique avec une dimension maximale fixée à l'avance que l'on ne pourra pas excéder,

2- ou créer un tableau dynamique, en allouant la mémoire nécessaire sur un pointeur avec malloc, et en redimensionnant avec realloc si on veut faire varier la taille (en particulier l'augmenter).

Je ne sais pas ce que votre enseignant attend de vous. L'option 2 est, bien sûr, plus compliquée à mettre en place.

Une fois que tu as décidé de ta structure de données, tu dois réaliser les fonctionnalités 1 à 7. Pour rendre ton code plus compréhensible, crée des fonctions.

Dal
0
cerobertgomy
Messages postés
2
Date d'inscription
vendredi 12 mai 2017
Statut
Membre
Dernière intervention
17 mai 2017

17 mai 2017 à 01:26
Bon merci d'avance et par rapport à l'exercice voici pour le moment ce que j’ai tenter avec un frère:

#include <stdio.h>
#include <stdlib.h>
int v[99999],t,i,r,a,s,si,m,m1,selecteur;
vecteur()
{
puts("................Cr\202ation d'un vecteur....................");
printf("saisie la taille de votre vecteur: ");scanf("%i",&t);

}
saisie()
{ puts("............................La saisie des elements.......................");
for(i=0;i<t;i++)
{
printf("Saisie la valeur de la ligne %i : ",i+1);scanf("%i",&v[i]);
}
}
afficher()
{ puts("............................Affichage du contenu........................");
for(i=0;i<t;i++)
{
printf("La valeur de la ligne %i est : %i\n",i+1,v[i]);
}
}
recherche()
{
puts("............................Recherche..........................");
printf("Saisie le nom de l'element a cherche: ");scanf("%i",&r);
for(i=0;i<t;i++)
{
if (v[i]==r)
{
printf("L'element %i est a la ligne %i \n",r,i+1);
}
}

}
ajouter()
{
puts("............................Augumentation de nombre de lignes..........................");
t++;
printf("Saisie le nom de l'element a ajoute: ",i+1);scanf("%i",&a);
v[t-1]=a;
puts(" L'element est ajoute");

}
supprimer()
{
puts("............................Suppression d'un element..........................");
printf("Saisie le nom de l'element a supprime: ",i+1);scanf("%i",&s);
for(i=0;i<t;i++)
{
if(v[i]==s)
{
si=i;
}
}
for(i=si;i<t;i++)
{
v[i]=v[i+1];t--;
}
}
modifier()
{
puts("............................Modification d'un element...........................");
printf("Saisie la valeur a modifie : ");scanf("%i",&m);

for(i=0;i<t;i++)
{
if (m==v[i])
{
printf("Saisie la valeur remplacante: ");scanf("%i",&m1);
v[i]=m1;
}

}

}
int main()
{
puts("..........................MENU VECTEUR..................................");
puts("\t 1: Cr\202er votre vecteur" );
puts("\t 2: Saisie les elements" );
puts("\t 3: Afficher les elements" );
puts("\t 4: Rechercher un element " );
puts("\t 5: Ajouter un element" );
puts("\t 6: Supprimer un element" );
puts("\t 7: Modifier" );
puts("\t 8: Inserer un element" );
puts("\t 9: Quitter" );
printf("votre choix: ");scanf("%i",&selecteur);
switch(selecteur)
{
case 1: system("cls");vecteur();system("pause");system("cls"); main();
case 2: system("cls");saisie();system("pause");system("cls"); main();
case 3: system("cls");afficher();system("pause");system("cls"); main();

}
return 0;
}
Vos impression s'il vous plait!
0
[Dal]
Messages postés
5912
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
23 septembre 2022
1 014
Modifié le 17 mai 2017 à 11:35
Salut et bravo déjà pour ce que vous avez fait :-)

Quand tu postes du code, fais le entre balises de code, s'il te plaît, afin que ton code reste indenté et avec une coloration syntaxique, cela sera plus lisible pour les lecteur du forum.

Comme cela :

<code c>

ton code ici

</code>

sinon, sur ton code, voilà ce que gcc a à dire en le compilant avec les warnings (option de compilation -Wall) :

$ gcc -Wall cerobertgomy.c
cerobertgomy.c:4:1: warning: return type defaults to ‘int’ [-Wreturn-type]
vecteur()
^
cerobertgomy.c:10:1: warning: return type defaults to ‘int’ [-Wreturn-type]
saisie()
^
cerobertgomy.c:17:1: warning: return type defaults to ‘int’ [-Wreturn-type]
afficher()
^
cerobertgomy.c:24:1: warning: return type defaults to ‘int’ [-Wreturn-type]
recherche()
^
cerobertgomy.c:37:1: warning: return type defaults to ‘int’ [-Wreturn-type]
ajouter()
^
cerobertgomy.c: In function ‘ajouter’:
cerobertgomy.c:41:2: warning: too many arguments for format [-Wformat-extra-args]
printf("Saisie le nom de l'element a ajoute: ",i+1);scanf("%i",&a);
^
cerobertgomy.c: At top level:
cerobertgomy.c:46:1: warning: return type defaults to ‘int’ [-Wreturn-type]
supprimer()
^
cerobertgomy.c: In function ‘supprimer’:
cerobertgomy.c:49:2: warning: too many arguments for format [-Wformat-extra-args]
printf("Saisie le nom de l'element a supprime: ",i+1);scanf("%i",&s);
^
cerobertgomy.c: At top level:
cerobertgomy.c:62:1: warning: return type defaults to ‘int’ [-Wreturn-type]
modifier()
^
cerobertgomy.c: In function ‘vecteur’:
cerobertgomy.c:9:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
cerobertgomy.c: In function ‘saisie’:
cerobertgomy.c:16:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
cerobertgomy.c: In function ‘afficher’:
cerobertgomy.c:23:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
cerobertgomy.c: In function ‘recherche’:
cerobertgomy.c:36:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
cerobertgomy.c: In function ‘ajouter’:
cerobertgomy.c:45:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
cerobertgomy.c: In function ‘supprimer’:
cerobertgomy.c:61:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
cerobertgomy.c: In function ‘modifier’:
cerobertgomy.c:77:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^

De façon générale :

- compile toujours avec les warnings, comprend pourquoi ils se manifestent car dans la quasi totalité des cas ils révèlent une erreur ou une pratique non conforme au standard, et corrige le code afin qu'il compile proprement.

- tu as trop de variables globales, tu devrais définir les variables dont tu as besoin dans le scope de la fonction où elle est utilisée. Pour simplifier ton programme, le tableau, sa taille maximale et le compteur du nombre d'éléments pourraient être des variables globales (et encore, on pourrait faire autrement en les passant en arguments aux fonctions), mais pas les autres

- tes variables n'ont pas des noms explicites, renomme
t
en
taille_vect
, cela rendra les choses plus compréhensibles

- initialise tes variables avec des valeurs par défaut ayant du sens, déclare une variable par ligne et met un commentaire expliquant son usage, par exemple :

const int TAILLE_MAX = 32767;   /* taille max du tableau */
int vecteur[TAILLE_MAX] = { 0 };/* tableau contenant le vecteur */
int nb_elem_vect = 0;           /* nombre d'éléments du vecteur */ 

- tu dois conserver la taille maximale du tableau, pour vérifier que tu ne dépasses pas les limites de mémoire en ajoutant des éléments

- tu dois déclarer tes fonctions avec un type
void
si elles ne retournent rien, et mettre void entre parenthèses si elles n'ont pas d'arguments, comme cela :

void afficher(void)
{

- la fonction vecteur() ne crée pas un vecteur, elle permet seulement la saisie de la taille souhaitée, et sans contrôler un dépassement de taille, de plus ce n'est pas une des fonctionnalités mentionnées dans ta liste. Tu devrais demander cette saisie initiale avant de présenter ton menu, et ne pas mettre ce choix dans le menu, sinon tu vas avoir des comportements inattendus

- dans certains printf, comme ici :
printf("Saisie le nom de l'element a ajoute: ",i+1);
tu dois supprimer
,i+1
car cela ne sert à rien dans le printf

- si tu demandes la saisie de nombres entiers, dis le, plutôt que de parler de "nom de l'element a ajoute"

- dans ton scanf, tu devrais utilise %d plutôt que %i, pour cette raison, et, tant qu'à faire, l'utiliser aussi dans tes printf pour être cohérent

- un vecteur ne se représente pas habituellement en "lignes"

- la fonction de suppression (qui n'est appelée dans le switch) ne fonctionne pas, de plus je pense qu'on te demande de supprimer un élément par son numéro (supprimer l'élément 2 du vecteur, et non pas supprimer tous les 2 qui se trouvent dans le vecteur), c'est sans doutes pareil pour la recherche et la modification

- un prototype correct de main est
int main(void)
, si, comme dans ton programme, tu n'utilises pas des arguments de ligne de commande

- dans ton switch / case, termine tes case par des break; et non pas en appelant main(), et met ton code dans une boucle while qui teste le choix 9

- met un
default:
dans ton switch / case avec un message informatif

- met des
system("cls")
et
system("pause"); 
en dehors du case / switch, cela t'évite de répéter du code

- aère ton code, met des espaces, il faut que cela respire :-)

Ouf !

Dal
0
YCN-
Messages postés
116
Date d'inscription
mercredi 24 juin 2015
Statut
Membre
Dernière intervention
13 juillet 2017
12
Modifié le 1 juin 2017 à 16:58
Bon c'est un peu frankensteinesc.
L'informatique c'est la science de l'abstraction, c'est la science de comment est ce que tu rends concrets des donnée et des informations.

Pour ton sujet je pense qu'il faut d'abord que tu définisse bien la façon dont tu vas décrire tes vecteurs. Et garder dans l'idée de garder tout ça modulaire.

Si ce sont des vecteurs 2D tu vas pouvoir donc les stocké de la façon suivante :

struct vecteurs {
float x;
float y;
};


Maintenant si tu veux une structure vecteur un peu plus flexible on va pouvoir allé un peu plus loin en faisant ça :

struct vecteurs {
float * coord ;
int dimension;
};


avec ça tu vas pouvoir créer des fonctions qui auront certainement un peu plus de sens par exemple :


void afficher_vecteur ( struct vecteurs my_vect){
int i;
printf("[");
for (i=0;i<my_vect.dimension;i++){
printf(" %f ,",my_vect.coord[i]);
}
printf("] \n");
}


Si tu veux ajouter un élément à un vecteur à une position donnée:

void ajouter_elem ( int pos , int elem , struct vecteurs * my_vect ){
if ( pos < my_vect->dimension){
my_vect->data[pos] = elem;
}
}


Je te donne aussi la fonction d'initialisation d'un vecteur :


void init_vect ( struct vecteurs * my_vect , int dimension ){
my_vect->coord = (float *) dimension * sizeof ( float);
my_vect->dimension = dimension;
}


/!\ je n'ai pas compilé ces codes c'est simplement pour te donner une idée de ce que tu pourrais faire. /!\

L'idée du menu c'est bien par contre rappeler le main c'est un peu bizarre, normalement on va plutôt faire un while(1) dans le main qui va "gérer" les appels de fonctions et la façon dont tu interagis avec l'utilisateur.

En écrivant ma réponse je me rend compte que c'est peut être un peu compliqué à votre niveau d'utiliser des pointeurs sur structure. Cependant tu peux très bien conservé la même structure mais en statique, cad que tu gèrerais tout dans le main.
0