Verrouiler un programme??!!

Verrouiler un programme??!! - C - Programmation

Marsh Posté le 15-10-2005 à 10:01:08    

Slt à toute et a tous,
J'ai un problème encore une fois sur un de mes programmes voici ce que je dois faire:
 
"Verrouiller votre programme en refusant les fonctions autre que la saisie du menu tant que la saisie n'a pas été effectué. En effet l'affichage du tableau avant la saisie par exemple donnera des resultats aléatoires."
Il ne me reste plus que ca à faire mais je ne voi vraiment pas comment faire...
Merci d'avance pour votre aide.
 
 
 
voici le source...
 
 
/*fonctionsaisietab.c*/
/*10/10/05*/
/*Windows XP*/
/*permet la saise du tableau tab de n entiers*/
 
 
#include <stdio.h>
#include <conio.h>
#define TITRE "\t\t\n***permet de saisir un tableau et d'utilise differente fonctionnalite***\n"
 
void modifieTab(int taille,int tab[], int val, int i);
void maxTab(int ,int []);
void affichTab(int ,int []);
void saisieTab(int ,int []);
void menu(void);
 
void main(void)
{
   char lettre;
   int taille=6;
   int tab[6];
   int i;
   int val;
 
 
   while(1)
   {
    menu();
      lettre=getchar();
      fflush(stdin);
    switch(lettre)
    {
     case 'a':
         saisieTab(taille,tab);
         break;
               case 'b':
         affichTab(taille,tab);
         break;
                case 'c':
           maxTab(taille,tab);
                        break;
                case'd':
                        printf("\nEntrez la valeur i de l'indice:" );
                        scanf("%d",&i);
                        printf("\nEntrez la valeur val que vous voulez affecter a i:" );
                        scanf("%d",&val);
           modifieTab(taille,tab,val,i);
 
 
                case 'q':
                       printf("\nmerci de votre attention" );
                 exit();
                       break;
     default:
            printf("\nVeuillez verifier votre saisie" );
                 break;
    }
   } //fin du while(1)
}
 
 
 
void menu (void)
{
   printf(TITRE);
   printf("\n********a:Saisie du tableau tab de n entier********\n" );
   printf("\n*******b:Affiche le tableau de n entiers*******\n" );
   printf("\n******c:Saisie de la taille du tableau******\n" );
   printf("\n*****d:Rangement de valeur*****\n" );
   printf("\nTaper a pour saisir le tableau\n" );
   printf("\nTaper b pour afficher le tableau\n" );
   printf("\nTaper c pour afficher le plus grand des entiers du tabeau tab de n entiers\n" );
   printf("\nTaper d pour ranger la valeur val de rang i du tableau tab de n entiers\n" );
   printf("\n--Taper q pour quitter le programme--\n" );
   printf("\nVeuillez entrer la lettre correspondant a la fonction choisie:\n" );
}
 
 
 
 
 
/*affichTab*/
/*Entrées:tab:tableau d'entiers,taille:entier*/
/*Sorties:rien*/
/*E/S:*/
/*Description:affiche à l'écran tous les éléments du tableau*/
/*var:i:entier*/
 
void affichTab(int taille,int tab[])
{
   int i;
 
   for(i=0;i<taille;i++)
   {
    printf("\ntab[%d]=%d",i,tab[i]);
   }
}
 
 
/*saisieTab*/
/*Entrées:tab:tableau d'entiers,taille:entier*/
/*Sorties:rien*/
/*E/S:*/
/*Description:affiche à l'écran tous les éléments du tableau*/
 
 
void saisieTab(int taille,int tab[])
 
{
   int i;
   for(i=0;i<taille;i++)
   {
      printf("\n indice=%d veuillez entrer une valeur n:", i);
      scanf("%d",&tab[i]);
      fflush(stdin);
   }
}
 
 
 
/*maxTab*/
/*Entrées:tab:tableau d'entiers,taille:entier*/
/*Sorties:rien*/
/*E/S:*/
/*Description:affiche à l'écran tous les éléments du tableau*/
 
 
void maxTab(int taille,int tab[])
 
{
   int max;
   int i;
 
   for(i=0;i<taille;i++)
   {
    if(max<tab[i])
      {
       max=tab[i];
      }
   }
   printf("%d",max);
}
 
 
/*modifieTab*/
/*Entrées:tab:tableau d'entiers,n:entier,val:entier,i:entier*/
/*sortie:rien*/
/*description:range la valeur val dans l'élément de rang i du tableau tab de n entiers*/
 
void modifieTab(int taille,int tab[], int val, int i)
 
{
  tab[i]=val;
}

Reply

Marsh Posté le 15-10-2005 à 10:01:08   

Reply

Marsh Posté le 15-10-2005 à 10:22:29    

enhancer38 a écrit :

Slt à toute et a tous,
J'ai un problème encore une fois sur un de mes programmes voici ce que je dois faire:
 
"Verrouiller votre programme en refusant les fonctions autre que la saisie du menu tant que la saisie n'a pas été effectué. En effet l'affichage du tableau avant la saisie par exemple donnera des resultats aléatoires."
Il ne me reste plus que ca à faire mais je ne voi vraiment pas comment faire...
Merci d'avance pour votre aide.


 
Ben tu rajoutes une variable qui mémorise si la saisie a été faite ou pas (tu peux même utiliser pour ça un élément supplémentaire dans "tab" )... et tu modifies ta fonction "menu" pour que :
1) elle repose la question tant que l'utilisateur n'aura pas tapé un choix valide
2) elle puisse détecter avec un paramètre si la saisie a été faite ou pas (ce qui lui permetra de déterminer si elle doit accepter ou pas un choix autre que "saisie" )
3) elle renvoie directrement la lettre choisie; ce qui te permettra de remplacer la lourde structure

menu();
lettre=getchar();


par la structure plus élégante :

lettre=menu()


 
De plus, la variable "taille" n'est pas nécessaire. Tu peux la remplacer par une macrodéfinition style

#define SIZE_TAB                6
int tab[SIZE_TAB]    (ou bien int tab[SIZE_TAB + 1] si tu utilises la dernière case de ton tableau pour mémoriser le fait qu'il ait été rempli ou pas)


 
Enfin le "fflush(stdin)" ne sert à rien. Au mieux, il ne fait rien. Au pire, il conduit à un résultat imprévisible (bug).
Si ton désir est d'ôter de ton clavier ce "retour charriot" qui reste après avoir saisi ton nombre et qui peux te gêner (ce qui est compréhensible), t'as qu'à l'enlever par un simple "getchar()"


Message édité par Sve@r le 15-10-2005 à 10:28:59
Reply

Marsh Posté le 15-10-2005 à 12:14:45    

Merci pour toute ces précisions mais je débute en C, et je ne vois tjrs pas comment faire... Peu tu etre plus précis stp...

Reply

Marsh Posté le 15-10-2005 à 14:23:03    

:bounce:  :bounce:  :bounce:  :bounce:  :bounce:  :bounce:  :bounce:

Reply

Marsh Posté le 15-10-2005 à 14:58:34    

enhancer38 a écrit :

Merci pour toute ces précisions mais je débute en C, et je ne vois tjrs pas comment faire... Peu tu etre plus précis stp...


 
1) la fonction "menu"
Cette fonction ne fait qu'afficher un menu et la saisie de la lettre se fait dans le main.
Pourquoi ne pas lui faire tout faire : Afficher le menu, faire saisir la lettre que l'utilisateur désire, vérifier que cette lettre est bien autorisée parmis tous les choix dispo, éventuellement faire resaisir avec une boucle. une fois que la lettre est correcte, ta fonction la renvoie avec un simple "return" et la fonction qui utilise "menu()" (donc située à un niveau supérieur) peut récupérer la lettre choisie en faisant "lettre=menu()"
Ensuite, elle n'a plus qu'à faire un "switch(lettre)" pour agir en fonction de la lettre retournée par le menu.
On peut même faire "switch(menu())" si on n'a pas besoin de mémoriser la lettre
 
2) A partir du moment où la fonction "menu()" a la charge de l'affichage et de la saisie contrôlée du choix, il lui est nécessaire qu'elle soit mise au courant si le tableau est rempli ou pas parce que le contrôle n'est pas le même. Donc il faut qu'elle reçoive un paramètre qui indiquera si le tableau est rempli ou pas.
 
3) Dans le "main()", il y a plusieurs façons de faire pour mémoriser le fait que le tableau est rempli ou pas. Tu peux utiliser une variable style "int tableauRempli=0" que tu passes à "1" lorsque le tableau est rempli. Et tu appelles "menu" en lui passant "tableauRempli" en paramètre
Tu peux aussi utiliser pour ça la case [6] de ton tableau. Les cases de [0] à [5] servent à stocker les nombres et la case [6] ne sert qu'à indiquer si le tableau est rempli ou pas. Au niveau mémoire, c'est pareil. L'avantage, c'est que tu n'as pas à inventer un nouveau nom de variable. Et cette valeur reste associée au tableau qu'elle contrôle.
Dans ce dernier cas, étant donné que ton tableau possède 7 cases (6 pour stocker les nombres choisis et 1 pour indiquer s'il est rempli ou pas), il te faut déclarer un tableau de [7].
Les programmeurs de C ont alors l'habitude de déclarer "tableau[6 + 1]" au lieu de "tableau[7]" pour indiquer à celui qui relit derrière que le tableau possède 6 cases qui ont une utilité de base plus une 7° case qui a une utilité particulière.
 
4) Les macrodéfinitions servent à remplacer des valeurs particulières par un nom symbolique. lors de la compilation, le préprocesseur remplace littéralement ce nom par la valeur qu'elle représente.
Cela permet, si la valeur doit changer plus tard, de ne faire qu'une seule modification dans le programme.
Au lieu d'écrire "int tableau[6 + 1]", on écrit "int tableau[SIZE_TAB + 1]" avec "#define MAX_SIZE     (6)"
Dans tout le programme, on peut utiliser ensuite "SIZE_TAB" comme le nombre qui lui correspond.


Message édité par Sve@r le 15-10-2005 à 15:02:18
Reply

Marsh Posté le 15-10-2005 à 19:18:18    

lol tu vas me prendre pour une quiche... mais j'ai essayé de faire ce que tu m'a proposé mais j'ai pas réussi...
Pourrait tu me faire un exemple please, il faut que je le fasse pour les cours lundi (je suis en BTS iris) mais j'ai encore un peu de mal en programmation.
Merci pour ton aide!

Reply

Marsh Posté le 16-10-2005 à 09:38:27    

:bounce:  :bounce:  :bounce:  :bounce:  :bounce:  :bounce:  :bounce:  :bounce:  :bounce:

Reply

Marsh Posté le 16-10-2005 à 14:39:17    

enhancer38 a écrit :

lol tu vas me prendre pour une quiche... mais j'ai essayé de faire ce que tu m'a proposé mais j'ai pas réussi...

Poste ton code et moi (ou d'autres) te diront ce qui va pas et pourquoi ça ne va pas
 

enhancer38 a écrit :

Pourrait tu me faire un exemple please, il faut que je le fasse pour les cours lundi (je suis en BTS iris) mais j'ai encore un peu de mal en programmation.

Hum... désolé mais la charte du forum interdit de faire les codes des autres... surtout si c'est pour des exos ou cours  :sweat:  
 

Reply

Marsh Posté le 16-10-2005 à 16:49:26    

je lai déja posté mon code...
Si je te l'envoi en privé tu peux peut étre m'aider non?

Reply

Marsh Posté le 16-10-2005 à 19:15:27    

enhancer38 a écrit :

je lai déja posté mon code...
Si je te l'envoi en privé tu peux peut étre m'aider non?


Tu as posté un code au début de ce topic oui. Mais hier, tu dis que tu as essayé de faire ce que j'avais dit donc tu dois avoir fait un nouveau code. C'est ce nouveau code que j'aurais voulu et pas que tu me repostes le premier.
 

enhancer38 a écrit :

Si je te l'envoi en privé tu peux peut étre m'aider non?

En privé ou en public, tout les bons en C de ce forum aident tous ceux qui ont des problèmes. Mais aider ne veut pas dire "faire le travail à la place des autres..."
 
Je vais juste de donner un coup de pouce un peu particulier...
Voici une fonction "menu" de base qui fait choisir une lettre entre 'a' et 'd' ou 'q' et qui la renvoie

char menu (void)  
{
   char choix;
 
   // Affichage du menu
   printf("%s", TITRE);  
   printf("\n********a:Saisie du tableau tab de n entier********\n" );  
   printf("\n*******b:Affiche le tableau de n entiers*******\n" );  
   printf("\n******c:Saisie de la taille du tableau******\n" );  
   printf("\n*****d:Rangement de valeur*****\n" );  
   printf("\nTaper a pour saisir le tableau\n" );  
   printf("\nTaper b pour afficher le tableau\n" );  
   printf("\nTaper c pour afficher le plus grand des entiers du tabeau tab de n entiers\n" );  
   printf("\nTaper d pour ranger la valeur val de rang i du tableau tab de n entiers\n" );  
   printf("\n--Taper q pour quitter le programme--\n" );
 
   // Saisie en boucke tant que choix incorrect
   do {  
       printf("\nVeuillez entrer la lettre correspondant a la fonction choisie:\n" );
       choix=getchar();
   } while ((choix < 'a' || choix > 'd') && choix != 'q')
 
   // Renvoi choix
  return choix;
}


 
Et dans le main...

main()
{
    char lettre;
 
    lettre=menu();
    ...suite du programme...
}


 
Edit: Tous les printf("n..."   sont en fait des printf("\n..." mais le backslash disparait lors de la mise en ligne d'un code sur le forum


Message édité par Sve@r le 16-10-2005 à 19:33:48

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed