Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : aide petit prog c [ Divers / Débutant(e) ] (mayapour)

vendredi 23 juin 2006 à 11:00:58 | aide petit prog c

mayapour

Bonjour,

Débutant en C, je souhaiterai savoir comment changer ce programme initiale (liste chainée) qui demande à l'utilisateur de choisir les options selon l'affichage :
1 : ajout dans la liste
2 : suppression dans liste
3 : trie de la liste
4 : affiche la liste
0 : quit programme

Je voudrai que celui-ci lance le programme suivi de l'option puis les paramêtres (selon option choisi).

Par explemple, ./monprog -a elementAajouter (qui correspond à l'option 1)
  ./monprog -b elementAsupp (qui correspond à l'option 2)
  ./monprog -c (option 3)
  ./monprog -d (option 4)
  ./monprog -q (option 0)

Avez vous des conseils, des exemples, des idées ?

Merci

Voici le code :

#include<stdio.h>
#include<malloc.h>

#define Faux 0
#define Vrai 1

typedef struct Element{
               int val;
               struct Element *next;
        }Element;


int estVide(Element* L){
         if(L == NULL){
                 return Vrai;
              }
         else{
                 return Faux;
              }            
     }         
  
void ajouter(Element **L, int v){
       Element *tmp = *L;
       Element *nouveau = (Element*)malloc(sizeof(Element));
       if(nouveau == NULL){
                  exit(1);
             }
       nouveau->val = v;
       nouveau->next = NULL;
       if(estVide(*L)){
            *L = nouveau;          
       }
       else{
            tmp = *L;
            while(tmp->next != NULL){
                 tmp = tmp->next;  
            }
            tmp->next = nouveau;
       }
     }

 void Trier(Element **L){
       Element *tmp1, *tmp2;
       Element *Min;
       int t;
       tmp1 = *L;
       while(tmp1 != NULL){
             Min = tmp1;
             tmp2 = tmp1;
             while(tmp2 != NULL){
                 if(Min->val > tmp2->val) Min = tmp2;
                 tmp2 = tmp2->next;      
             }
             t = tmp1->val;
             tmp1->val = Min->val;
             Min->val = t;
            
             tmp1=tmp1->next;    
       }
  }    
 void Supprimer(Element **L, int v){
      Element *tmp;
      int d;
      if(!estVide(*L)){
          tmp = *L;
          d = 0;
          if(tmp->val == v){
             *L = (*L)->next;       
          }
          else{
             while( d == 0 && tmp->next != NULL){
                   if(tmp->next->val == v) d = 1;
                   else  tmp = tmp->next;               
             }
             if(d == 1)  tmp->next = tmp->next->next;
             else printf("!cette valeur n'est pas trouvable!\n");     
          }                 
      }
      else{
           printf("!La liste est vide. Impossible de faire la suppression!\n");
      }
 } 
 
 int Longueur(Element *L){
     int l=0;
     Element *tmp = L;
     while(tmp != NULL){
         l++;
         tmp = tmp->next;   
     }
     return l;
 }
 void afficher(Element *L){
         Element *tmp;
         if(estVide(L)){
             printf("!la liste est vide!\n");          
         }
         else{
           tmp = L;
           while(tmp != NULL){
                printf("%d ",tmp->val);
                tmp = tmp->next;   
           }
           printf("   - longueur : %d\n",Longueur(L));   
         }
      }
    
         
int main(){

  Element *L = NULL;
  int choix;
  char *fichier;
  int v;
 
  do{
      printf("1-Ajouter Element.\n");
      printf("2-Supprimer Element.\n");
      printf("3-Trier la Liste.\n");
      printf("4-Afficher.\n");
      printf("0-Quitter.\n");
     
      printf("   -->choix(0-4):");scanf("%d",&choix);
     
      switch(choix){
         case   1:printf(" - Entrer une valeur : "); scanf("%d",&v);
                  ajouter(&L, v);
                break;
         case   2:printf(" - Entrer une valeur : "); scanf("%d",&v);
                  Supprimer(&L,v);
                break;
         case   3:Trier(&L);
                break;
         case   4:afficher(L);
                break;
      }
 
  }while(choix != 0);

 return 0;
}    


vendredi 23 juin 2006 à 11:06:14 | Re : aide petit prog c

mnaulet

la fonction main peut prendre deux arguments
int main(int argc, char *argv[])
où argc contient le nombre d'argument sur la ligne de commande
et argv est un tableau de chaines contenant les arguments de la ligne de commande

Dans ton cas argv[1]contiendra ton option (a b ou c..)

vendredi 23 juin 2006 à 11:59:23 | Re : aide petit prog c

mayapour

J'ai un début d'ajout des options avec modèle argv mais ça ne fonctionne pas:
problème de déclaration ?

#include<stdio.h>
#include<malloc.h>

#define Faux 0
#define Vrai 1

typedef struct Element{
               int val;
               struct Element *next;
        }Element;

int estVide(Element* L){
         if(L == NULL){
                 return Vrai;
              }
         else{
                 return Faux;
              }            
     }
    
int woptions(int ac,char ***av)
{
 int option2return;
 option2return=getopt(ac, *av,"abcd");
 if(getopt(ac,*av,"abcd") != -1)
       {
              printf("listeChaine: usage -[abcd]\n");
        exit(EXIT_FAILURE);
        }
 else
  return option2return;
}
    
void ajouter(Element **L, int v){
       Element *tmp = *L;
       Element *nouveau = (Element*)malloc(sizeof(Element));
       if(nouveau == NULL){
                  exit(1);
             }
       nouveau->val = v;
       nouveau->next = NULL;
       if(estVide(*L)){
            *L = nouveau;          
       }
       else{
            tmp = *L;
            while(tmp->next != NULL){
                 tmp = tmp->next;  
            }
            tmp->next = nouveau;
       }
     }

 void Trier(Element **L){
       Element *tmp1, *tmp2;
       Element *Min;
       int t;
       tmp1 = *L;
       while(tmp1 != NULL){
             Min = tmp1;
             tmp2 = tmp1;
             while(tmp2 != NULL){
                 if(Min->val > tmp2->val) Min = tmp2;
                 tmp2 = tmp2->next;      
             }
             t = tmp1->val;
             tmp1->val = Min->val;
             Min->val = t;
            
             tmp1=tmp1->next;    
       }
  }    
 void Supprimer(Element **L, int v){
      Element *tmp;
      int d;
      if(!estVide(*L)){
          tmp = *L;
          d = 0;
          if(tmp->val == v){
             *L = (*L)->next;       
          }
          else{
             while( d == 0 && tmp->next != NULL){
                   if(tmp->next->val == v) d = 1;
                   else  tmp = tmp->next;               
             }
             if(d == 1)  tmp->next = tmp->next->next;
             else printf("!cette valeur n'est pas trouvable!\n");     
          }                 
      }
      else{
           printf("!La liste est vide. Impossible de faire la suppression!\n");
      }
 } 
 
 int Longueur(Element *L){
     int l=0;
     Element *tmp = L;
     while(tmp != NULL){
         l++;
         tmp = tmp->next;   
     }
     return l;
 }
 
 int nbrconf(char ac)
{
 if(ac!=4)
 {
  printf("listeChaine: usage -[abcd]\n");
  exit(EXIT_FAILURE);
 }
 else
   return 1; 
}
 
 void afficher(Element *L){
         Element *tmp;
         if(estVide(L)){
             printf("!la liste est vide!\n");          
         }
         else{
           tmp = L;
           while(tmp != NULL){
                printf("%d ",tmp->val);
                tmp = tmp->next;   
           }
           printf("   - longueur : %d\n",Longueur(L));   
         }
      }

void priseoption(char choixoption, char *v)
{
  do{
   switch (choixoption)
         {
             case 'a':scanf("%d",&v);
                    ajouter(&L, v);
                 break;
             case 'b':scanf("%d",&v);
                    Supprimer(&L,v);
           break;
          case 'c':
                 Trier(&L);
           break;
           case 'd':
                    afficher(L);
           break;
         }
     }while(choixoption != 0);
   return 0;
}
         
int main(char ac, char **av)
{
  Element *L = NULL;
  char choixoption;
  char *v;
}    


vendredi 23 juin 2006 à 12:04:48 | Re : aide petit prog c

mnaulet

int main(int ac, char **av)
et non pas int main(char ac, char **av)

vendredi 23 juin 2006 à 13:28:26 | Re : aide petit prog c

mayapour

j'ai remodifier (int ac, char **av)

Mais je ne sais pas quel pointeur utiliser pour récuper la bonne info pour la prise des options :

[CODE]void priseoption(char choixoption, char *L, char *v)
{
  do{
   switch (choixoption)
         {
             case 'a':scanf("%d",&v);
                    ajouter(&L, v);
                 break;
             case 'b':scanf("%d",&v);
                    Supprimer(&L,v);
           break;
          case 'c':
                 Trier(&L);
           break;
           case 'd':
                    afficher(L);
           break;
         }
     }while(choixoption != 0);
   return 0;
}
         
int main(int ac, char **av)
{
  Element *L = NULL;
  char choixoption;
  char *v;
}[/CODE]

du coup j'ai des types de pointeurs imcompatibles ?? (le problème doit venir de L)
non ?


vendredi 23 juin 2006 à 13:54:05 | Re : aide petit prog c

deck_bsd

Membre Club
int main(char ac, char **av)
{
  Element *L = NULL;
  char choixoption;
  char *v;
}

Où fais-tu appel à tes fonctions ???? le main est le point d'entré de ton programme si tu n'appel aucunes fonction, comment veus-tu que ton programme fonctionne? la c'est comme si il ignorai toutes tes autre fonctions. quand tu lance ton programme la seule chose qu'il fait c'est crée les variables :s .

vendredi 23 juin 2006 à 14:11:08 | Re : aide petit prog c

mayapour

Exact ... MERCI
J'ai modifier mon main comme ceci : c'est mieux ?

int main(int ac, char **av)
{
  Element *L = NULL;
  char choixoption;
  char *v;
  nbrconf(ac);
  choixoption=woptions(ac,&av);
  priseoption(choixoption,av[2]);
}

Cependant j'ai 161: error: too few arguments to function `priseoption' dans le main
Il attend quel argument ?

vendredi 23 juin 2006 à 14:33:13 | Re : aide petit prog c

deck_bsd

Membre Club
Si je ne me trompe pas ton programme prend 2 argument, un char pour lui dire d'ajouter et autre et un autre contenant la chaine. hors ici priseoption(choixoption,av[2]); tu lui passe le 3ième argument qui soit dit en passant n'exist pas , n'oublie pas que en c si tu a 10 élément dans un tableau ceux-ci sont indexé de 0-9 , donc a la place de av[2] met av[1]. Deplus je comprend pas bien ce que fait ta fonction woptions(ac,&av); .

Je pense que tu te complique énormément la vie.

Il suffit de faire dans le main un if qui vérifie si des argument on été entré en faisant un if de ac (qui contient le nombre d'arguments entré) si il n'y en a pas tu fais appel a ton menu sinon tu transmet les 2 arguments a tes fonctions de la liste chainée.

vendredi 23 juin 2006 à 14:35:05 | Re : aide petit prog c

deck_bsd

Membre Club
heu je me souvient plus si le nom de l'éxécutable est contenut dans argv si oui ton av[2] sinon il doit être av[1]

vendredi 23 juin 2006 à 16:09:34 | Re : aide petit prog c

mayapour

Merci pour ta patience deck_bsd !

en fait, que ce soit av[2] ou av[1], le résultat est le même puisqu'il me manquait un paramètre quand j'appelle la fontion "priseoption".

Mais actuellement, tous mes appelles de fonction dans priseoption génèrent l'erreur : makes integer from pointer without a cast pour ajouter
et from incompatible pointer type pour Supprimer, Tier, afficher.

Je ne trouve pas bcp d'info sur le net sur ce type d'erreur.
Merci de m'éclairer...


1 2

Cette discussion est classé dans : int, printf, element, tmp, next


Répondre à ce message

Sujets en rapport avec ce message

Liste chainée [ par mayapour ] Bonjour, Je souhaite faire une liste chainée d'utilisateurs et pouvoir mettre à blanc, ajouter, supprimer, lister et trier cette liste. En faite quand Lecture et ecriture sur fichier [ par developvbdebut ] Bonjour tout le mondeJe travaille sur la gestion des fichier en c.Mon livre n'explique pas clairement l'ectriture et la lecture dans les fichiers.Voic Passage d'argument pour printf [ par Quazar ] BonjourJe cherche à créer une fonction qui aura le même effet que printf, c'est à dire que je passerais à cette fonction une liste de paramètre du mêm problème de if et else [ par ffnajia ] bonjour je comprend pas pourquoi le programme ci-dessous ne prend pas en compte l'éxistence de if et else!!!???#include#include using namespace std; Communication RS232 : Pb de vitesse [ par arb ] Bonjour Je me suis insipiré du code de ymca2003 (Code source N°22441) pour faire un petit programme qui envoie le contenu d'un fichier via une liais effacement d'element d'un vecteur [ par tomalille ] Bonjour, j'ai un probleme avec l'une de mes methodes. Celle-ci efface l'element d'un vecteur. Malheureusement elle ne fonctionne jamais pour le dernie Utilisation des fonctions [ par darkwhite ] Salut  a tous. Je viens juste de decouvrir le C et j'essaie d'ecrire un programme utilisant2 fonctions : pour utiliser le th de pythagore mon code  ee affichage bizarre [ par darkwhite ] Salut a tousJe commence par faire une lotterie simple mais j'ai un probleme au niveau de l'affichage d'un tableau, mon code est le suivant#include #in Quel est le bug ? [ par mayapour ] Bonjour, En testant ce petit programme qui est l'équivalent du ls sous linux avec différentes options, je me suis appercu qu'il affiche un . (point) e port joystick [ par leon1 ] Bonsoir. Bonne année à tous.J' avais écris il y à une dizaine d'années (j'ai repris mes études et fait un dut à 35 ans) ce petit prog qui lisait et en


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,437 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.