Aide petit prog c

mayapour Messages postés 17 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 12 janvier 2022 - 23 juin 2006 à 11:00
deck_bsd Messages postés 1242 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 23 juin 2006 à 17:53
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;
}    

10 réponses

mnaulet Messages postés 11 Date d'inscription vendredi 9 juin 2006 Statut Membre Dernière intervention 27 juin 2006
23 juin 2006 à 11:06
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..)
0
mayapour Messages postés 17 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 12 janvier 2022
23 juin 2006 à 11:59
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;
}    
0
mnaulet Messages postés 11 Date d'inscription vendredi 9 juin 2006 Statut Membre Dernière intervention 27 juin 2006
23 juin 2006 à 12:04
int main(int ac, char **av)
et non pas int main(char ac, char **av)
0
mayapour Messages postés 17 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 12 janvier 2022
23 juin 2006 à 13:28
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 :

void priseoption(char choixoption, char *L, char *v)
{
  do{
   switch (choixoption)
         {
             case 'a':scanf("%d",&amp;v);
                    ajouter(&amp;L, v);
                 break;
             case 'b':scanf("%d",&amp;v);
                    Supprimer(&amp;L,v);
           break;
          case 'c':
                 Trier(&amp;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;
}


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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
deck_bsd Messages postés 1242 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
23 juin 2006 à 13:54
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 .
0
mayapour Messages postés 17 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 12 janvier 2022
23 juin 2006 à 14:11
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 ?
0
deck_bsd Messages postés 1242 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
23 juin 2006 à 14:33
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.
0
deck_bsd Messages postés 1242 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
23 juin 2006 à 14:35
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]
0
mayapour Messages postés 17 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 12 janvier 2022
23 juin 2006 à 16:09
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...
0
deck_bsd Messages postés 1242 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
23 juin 2006 à 17:53
Le problème vient certainement du passage de paramètre, mais je ne comprend pas pourquoi tu utilise des fonctions pour cela, c'est tellement si simple sens, un if et tous roule.
0
Rejoignez-nous