Le programme vous invite à entrer 3 entiers A, B et C selon les

Résolu/Fermé
Halidc Messages postés 12 Date d'inscription mercredi 29 janvier 2014 Statut Membre Dernière intervention 17 février 2014 - 29 janv. 2014 à 02:13
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 2 févr. 2014 à 01:49
Salut, quelqu'un peut aider avec ce problème dans C:

Le programme vous invite à entrer 3 entiers A, B et C selon les règles suivantes:

* A est acceptée si elle peut être divisée en au moins un de ces numéros (7, 5 et 3)
* B est acceptée si elle peut être divisée en au moins un de ces numéros (7, 5 et 3), mais pas celle qui peut diviser A.
C * est acceptée si elle peut être divisée par l'un des trois numéros (7, 5 et 3), mais pas celle qui peut diviser A ou B
* Imprimer les nombres acceptés


A voir également:

9 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
29 janv. 2014 à 07:11
Bonjour,

Qu'as-tu fait jusqu'à maintenant ? Montre-nous ton début de code ou d'algo pour qu'on puisse t'aider. Merci d'utiliser la balise "code c" (liste déroulante située à droite du bouton "souligné").
Cdlt
2
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
29 janv. 2014 à 22:39
Pas facile à lire ton code...
Il ne faut pas avoir peur d'utiliser des fonctions. Cela évite de répéter des bouts de code communs (économie de ligne, facilité de lecture, facilité de maintenance, ...).

system("cls");
Ce n'est pas portable, et cela énervera plus l'utilisateur qu'autre chose à supprimer ce qu'il a tapé au-dessus.

scanf("%s",&rep);
Attention, rep est un char. Donc : scanf("%c",&rep); ou plus performant rep=getchar(); De plus, il faut faire attention, car il y aura la touche "Enter" qui sera stocké dans le buffer. Il faut donc l'enlever avec getchar().
Donc :
rep=getchar();
getchar();


Pour le reste, je n'ai pas regardé. Trop long...
Je te conseillerais vraiment de le refaire et de revoir l'algorithmique (n'oublie pas d'utiliser des fonctions...).
Déjà, que ce soit pour les variables a, b ou c, il y a une même contrainte : il faut que la variable soit divisible par 3, 5 ou 7. Tu peux donc faire une fonction de vérification respectant cette contrainte.

Tu peux également faire une autre fonction de vérification pour s'assurer qu'une variable n'est pas divisible par les mêmes diviseurs (3, 5, 7) qu'une autre. Ainsi tu pourras l'utiliser pour t'assurer que b respecte bien les contraintes, de même pour c.

Comme ça, je dirais que tu peux presque diviser ton code par 4.

Après, on peut même faire plus intelligent en utilisant un tableau de diviseur : tab={3, 5, 7}; A toi de voir selon ton niveau.

Bon courage.
Cdlt,
1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
30 janv. 2014 à 23:37
J'ai regardé un peu.
Bon déjà, attention à l'indentation, elle n'est pas régulière. Du coup on manque de lisibilité.

a11, b11, c11;

Tu n'as pas initialisé ces 3 variables. Et plus tard dans le code, tu fais une comparaison dessus. Il faut donc l'initialiser à 0.
D'ailleurs, cela serait plus propre que tu déclares les variables autre part.
Les noms de variables ne sont pas très bien choisis. Et tu n'es pas obligé d'utiliser a11,b11,c11 puisque tu pouvais réutiliser a1,b1 et c1.

if(a%5!=0) {
    if(b%5 == 0) {
        b1=1;
    }
}

Là, tu dis : si a n'est pas divisible par 5 et que b l'est alors b1=1 (on redéfinit b). Alors que ta consigne est : si a est divisible par 5 alors b ne peut pas l'être. De plus, tu peux simplifier la syntaxe avec un seul if et un &&
Donc ça sera plutôt :
if (a%5==0 && b%5==0) { 
     b1=1;
}

N'oublie pas d'adapter les autres diviseurs.

while( (a1 != 1 && b1 != 1 && c1 != 1) || b == 0);

La condition est à revoir. Il faut boucler si a1==1 ou b1==1 ou c1==1. (Ou sinon tu mets une négation devant). D'ailleurs, tu pouvais mettre les conditions sur les modulos directement dans le while.

De même pour le C. Je te laisse le revoir seul, c'est plus ou moins les mêmes remarques que ci-dessus.

Et enfin, il faut que tu fasses un scanf("%*c"); avant le scanf("%c",&rep); pour vider le buffer clavier. Ou alors si tu comprends pas pourquoi, lit plutôt un entier (%i) et tu recommences le programme si l'utilisateur tape 1 (0 pour quitter). Tu n'auras plus le problème.

D'une manière générale, tu pouvais diminuer le nombre de if et utiliser un tableau. Car imagine, si on te demandait pour 3, 5, 7, 9 et 11, tu aurais 20 fois plus de code environ...

Bon courage.
1
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
31 janv. 2014 à 11:55
Bonjour

Pour ton exercice, je me suis posé la question suivante,
1-> peut on utiliser des instructions de branchement, c'est à dire les switch etc.. ,voir imbriquer les if ,while (oui)
2-> peut on faire simple (non) et algorithmiquement oui mais l'implémentation chaud.
3-> y a t'il une ou des instructions différents de switch qui me permettrons de me déplacer d'un bout à l'autre de mon programme ou entre deux séquence (oui mais c'est vieux jeu ).

Le choix est donc :
1-> utiliser la séquence de saut d'instruction GOTO
2-> l'appliquer a notre algorithme
3-> et implémenter le code.

Je précise que ce type de codage est révolu dû à goto qui est une instruction dépassée et classée en zone « oubliette » mais efficace.

Pourquoi ce choix pour la simple raison que cette instruction nous permet d'aller à n'importe quelle portion du code en amont et en aval entre les séquences en cours. L'instruction est très pratique. Mais l'utilisation abusive de cette instruction
peut rendre impossible la maintenance ou la lisibilité du code. C'est pour cela que vous trouverez dans le code-source des balises pour bien séparer les instructions entre elles et rendre le code lisible. Mais le code en lui même est appellé code spaghetti parce qu'il y a une utilisation abusive de l'instruction goto.

Je met deux versions de ce code une pour montrer le fonctionnement
et le deuxième pour virer ce qui est inutile et qui à été mis exprès dans la première pour montrer le fonctionnement complet du programme mais qu'on peut bien s'en passer.

Mon code utilisera le multiple commun a 7 5 et 3 pour montrer le fonctionnement et après il suffit de changer l'instruction pour utiliser le « ou » bref assez blabla le code source.

#include <unistd.h>	  /* pour le sleep */
#include <stdio.h>			
#include <stdlib.h>

/* effacement écrans */
#define ECR_RESET printf("\033[2J\033[0;0H");

/* teste de divisibilité
 (multible des 3 chiffre)*/

int bfDivisible(const int iNb){
	/* en teste si il on un multiple commun 
	en peut tout à fait appliquer le 'ou' */
	if((iNb%7==0)&&(iNb%5==0)&&(iNb%3==0))
		return 0;	/* si multiple donc vrais */
	return 1;		/* sinon faut */
}

/* Formatage de la saisie au clavier et évite 
les caractère ou chaîne 
si les caractère ou chaine detecté
er renvoie 0*/
 
int fSaisieControle(const char c){
	int iVal=0;		           /* varible resultat */
	char pChar[150];		  /* chaine de saisie */
	printf("%c = ",c);		  /* indication de saisie*/
	fgets(pChar,sizeof(pChar),stdin);  /* saisie	*/
	sscanf(pChar, "%d", &iVal);	 /* conversion */
	return iVal;			 /* return 0 ou iVal */
}

/* Propgramme principale */
int main(void){

	/* déclaration des variable */
	int iA=0;	/* variable du cas A */
	int iB=0;	/* variable du cas B */
	int iC=0;	/* variable du cas C */
	
	/* Cas de A	*/
	{
		A:
			iA=fSaisieControle('A');      
			if(iA==0){
				goto EXT;   /* erreur en sort */
			}
			else if(bfDivisible(iA)!=0){
				ECR_RESET;	
		
				printf("A=%d est pas divisible par 7 5 & 3\n",iA);
				goto A;   /* recommence */
			} goto WIN_A;  /* passe étape suivante */
	}
	
	/* Cas de B	*/
	{
		B:
			iB=fSaisieControle('B');
			if(iB==0){
				goto EXT;
			}
			else if(iB==iA){ goto MSG_B; }  /* message eurreur type B */
			
			else if(bfDivisible(iB)!=0){
				ECR_RESET;
				printf("B=%d est pas divisible par 7 5 & 3\n",iB);
				sleep(2);
				goto B;		/* recommence */	
			} goto WIN_B;   /* passe étape suivante */
	}
	
	/* Cas de C	*/
	{
		C:
			iC=fSaisieControle('C');
			if(iC==0){
				goto EXT;	
			}
			else if(((iC==iB)||(iC==iA)))
				goto MSG_C;
				
			else if(bfDivisible(iC)!=0){
				ECR_RESET;
				printf("C=%d est pas divisible par 7 5 & 3\n",iC);
				sleep(2);
				goto C;	/* recommence */
			} goto WIN_C;   /* en vas au questionaire */
	}
	
	
	/*	Le Win & Les Erreure & Sortie	*/
	{
		/* Win A */
		WIN_A:
			ECR_RESET;
			printf("A=%d est divisible par 7 5 & 3\n",iA);
			sleep(3);
			goto B; /* en peut allé a B */
		
		/* Win B */
		WIN_B:
			ECR_RESET;
			printf("B=%d est divisible par 7 5 & 3\n",iB);
			sleep(3);
			goto C;  /* en peut allé à c */
		
		/* Win C */
		WIN_C:
			ECR_RESET;
			printf("C=%d est divisible par 7 5 & 3\n",iC);
			sleep(3);
			goto INTERO;  /* en va à l'interogation de sorti*/
		
		/* ERR_B */	
		MSG_B:
			ECR_RESET;
			printf("B ne peut pas diviser A\n");
			goto B; /* en repart à B */
		
		/* ERR_C*/
		MSG_C:
			ECR_RESET;
			printf("C ne peut pas diviser A & B\n");
			goto C; /* en repart à c */
		
		/* SORTIE */	
		INTERO:
			ECR_RESET;
			int iExit=0;   /* variable de sortie */
			printf("Voulez vous recommencer 1->(Oui) 2->(Non) \n");
			iExit=fSaisieControle('?');
			if(iExit==0||iExit==2)  /* soit 0 ou 2 en fin du prog */ 
				goto EXT;	
			/* en reinitialise les variable à nouveau */
			iA=iB=iC=0;
			goto A;  /* en ce rend à A directement */
		
		/* Fin */	
		EXT:
			ECR_RESET;
			printf("Aurevoir\n"); /* message de sortie */
	}
	
	/* sortie propre */
	return 0;
}


Et l'autre ou j'ai viré une portion du code

#include <unistd.h>	  /* pour le sleep */
#include <stdio.h>			
#include <stdlib.h>

/* effacement écrans */
#define ECR_RESET printf("\033[2J\033[0;0H");

/* teste de divisibilité
 (multible des 3 chiffre)*/

int bfDivisible(const int iNb){
	/* en teste si il on un multiple commun 
	en peut tout à fait appliquer le 'ou' */
	if((iNb%7==0)&&(iNb%5==0)&&(iNb%3==0))
		return 0;	/* si multiple donc vrais */
	return 1;		/* sinon faut */
}

/* Formatage de la saisie au clavier et évite 
les caractère ou chaîne 
si les caractère ou chaine detecté
er renvoie 0*/
 
int fSaisieControle(const char c){
	int iVal=0;		           /* varible resultat */
	char pChar[150];		  /* chaine de saisie */
	printf("%c = ",c);		  /* indication de saisie*/
	fgets(pChar,sizeof(pChar),stdin);  /* saisie	*/
	sscanf(pChar, "%d", &iVal);	 /* conversion */
	return iVal;			 /* return 0 ou iVal */
}

/* Propgramme principale */
int main(void){

	/* déclaration des variable */
	int iA=0;	/* variable du cas A */
	int iB=0;	/* variable du cas B */
	int iC=0;	/* variable du cas C */
	
	/* Cas de A	*/
	{
		A:
			iA=fSaisieControle('A');      
			if(iA==0){
				goto EXT;   /* erreur en sort */
			}
			else if(bfDivisible(iA)!=0){
				ECR_RESET;	
		
				printf("A=%d est pas divisible par 7 5 & 3\n",iA);
				goto A;   /* recommence */
			} goto B;  /* passe étape suivante */
	}
	
	/* Cas de B	*/
	{
		B:
			iB=fSaisieControle('B');
			if(iB==0){
				goto EXT;
			}
			else if(iB==iA){ goto MSG_B; }  /* message eurreur type B */
			
			else if(bfDivisible(iB)!=0){
				ECR_RESET;
				printf("B=%d est pas divisible par 7 5 & 3\n",iB);
				sleep(2);
				goto B;		/* recommence */	
			} goto C;   /* passe étape suivante */
	}
	
	/* Cas de C	*/
	{
		C:
			iC=fSaisieControle('C');
			if(iC==0){
				goto EXT;	
			}
			else if(((iC==iB)||(iC==iA)))
				goto MSG_C;
				
			else if(bfDivisible(iC)!=0){
				ECR_RESET;
				printf("C=%d est pas divisible par 7 5 & 3\n",iC);
				sleep(2);
				goto C;	/* recommence */
			} goto INTERO;   /* en vas au questionaire */
	}
	
	
	/*	Le Win & Les Erreure & Sortie	*/
	{
		
		/* ERR_B */	
		MSG_B:
			ECR_RESET;
			printf("B ne peut pas diviser A\n");
			goto B; /* en repart à B */
		
		/* ERR_C*/
		MSG_C:
			ECR_RESET;
			printf("C ne peut pas diviser A & B\n");
			goto C; /* en repart à c */
		
		/* SORTIE */	
		INTERO:
			ECR_RESET;
			int iExit=0;   /* variable de sortie */
			printf("Voulez vous recommencer 1->(Oui) 2->(Non) \n");
			iExit=fSaisieControle('?');
			if(iExit==0||iExit==2)  /* soit 0 ou 2 en fin du prog */ 
				goto EXT;	
			/* en reinitialise les variable à nouveau */
			iA=iB=iC=0;
			goto A;  /* en ce rend à A directement */
		
		/* Fin */	
		EXT:
			ECR_RESET;
			printf("Aurevoir\n"); /* message de sortie */
	}
	
	/* sortie propre */
	return 0;
}
1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
31 janv. 2014 à 13:39
Pourquoi l'utilisation d'accolades comme ça ?
Sinon l'algorithme est à revoir : pas de goto sauf cas particulier...
De plus unistd.h et sleep sont non standard. De meme pour ta manière d'effacer l'écran.
Et enfin notre ami n'a pas le droit d'utiliser les fonctions...
PS : merci de ne pas donner les solutions toutes faites mais plutôt d'expliquer les erreurs qu'il a faites. C'est la philosophie CCM.
0
Halidc Messages postés 12 Date d'inscription mercredi 29 janvier 2014 Statut Membre Dernière intervention 17 février 2014 13
Modifié par Halidc le 31/01/2014 à 15:51
// Modifications effectuer mais un bug A=3 B=5 C=7 (ne valide pas C)  

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a=0, b=0, c=0, a1=0, b1=0, c1=0, rep = 1;

 while (rep == 1)
 {
        a = 0;           
        while((a%7 != 0 && a%5 != 0 && a%3 != 0) || a == 0)
            {
        printf("Entrer A : ");
        scanf("%i", &a);        
            }
    
  if (a%7 == 0 && a%5 == 0 && a%3 == 0)
  {
    printf("A = %i\n%i est divisible par : 7 , 5 et 3\n", a,a);
  }
  else
  {   
       b=0;            
      while(a1 == 1 || b1 == 1 || c1 == 1 || b == 0) // condition pour accepter B
        {   
            a1=0; b1=0; c1=0;           
            printf("Entrer B : ");
            scanf("%i",&b);
            
            if(b%7 == 0 && a%7 == 0) {a1=1;}         
            if(b%5 == 0 && a%5 == 0) {b1=1;}         
            if(b%3 == 0 && a%3 == 0) {c1=1;}                          
        }
        
    if ((a%7==0 && a%5==0) && b%3==0  )
    {
        printf("A = %i\nB = %i\n7 et 5 divise %i et 3 divise %i\n",a,b,a,b);
    }
    else if ((a%7==0 && a%3==0) && b%5==0)
    {
        printf("A = %i\nB = %i\n7 et 3 divise %i et 5 divise %i\n",a,b,a,b);
    }
    else if ((a%5==0 && a%3==0) && b%7==0)
    {
        printf("A = %i\nB = %i\n5 et 3 divise %i et 7 divise %i\n",a,b,a,b);
    }
    else if (a%7==0 &&(b%5==0 && b%3==0))
    {
        printf("A = %i\nB = %i\n7 divise %i, 3 et 5  divise %i\n",a,b,a,b);
    }
    else if (a%5==0 &&(b%7==0 && b%3==0))
    {
        printf("A = %i\nB = %i\n5 divise %i, 3 et 7  divise %i\n",a,b,a,b);
    }
    else if (a%3==0 &&(b%5==0 && b%7==0))
    {
        printf("A = %i\nB = %i\n3 divise %i, 7 et 5  divise %i\n",a,b,a,b);
    }
    else
    {
        c=0;
        while(a1 == 1 || b1 == 1 || c1 == 1 || c == 0)
       {
            a1=1; b1=0; c1=0; 
            printf("Entrer C : ");
            scanf("%i",&c);

            if(c%7 == 0 && (a%7==0 || b%7==0)) {a1=1;}          
            if(c%5 == 0 && (a%5==0 || b%5==0)) {b1=1;}            
            if(c%3 == 0 && (a%3==0 || b%3==0)) {c1=1;}              
       }        
  
        if (a%7==0 && b%5==0 && c%3==0)
        {
            printf("A = %i\nB = %i\nC = %i\n7 divise %i , 5 divise %i et 3 divise %i\n",a,b,c,a,b,c);
        }
        else if (a%7==0 && b%3==0 && c%5==0)
        {
            printf("A = %i\nB = %i\nC = %i\n7 divise %i , 3 divise %i et 5 divise %i\n",a,b,c,a,b,c);
        }
        else if (a%5==0 && b%7==0 && c%3==0)
        {
            printf("A = %i\nB = %i\nC = %i\n5 divise %i , 7 divise %i et 3 divise %i\n",a,b,c,a,b,c);
        }
        else if (a%5==0 && b%3==0 && c%7==0)
        {
            printf("A = %i\nB = %i\nC = %i\n5 divise %i , 3 divise %i et 7 divise %i\n",a,b,c,a,b,c);
        }
        else if (a%3==0 && b%5==0 && c%7==0)
        {
            printf("A = %i\nB = %i\nC = %i\n3 divise %i , 5 divise %i et 7 divise %i\n",a,b,c,a,b,c);
        }
        else if (a%3==0 && b%7==0 && c%5==0)
        {
            printf("A = %i\nB = %i\nC = %i\n3 divise %i , 7 divise %i et 5 divise %i\n",a,b,c,a,b,c);
        }
   }
}
   printf("\n\nAutre Taitement (OUI=> 1 , NON=> 2) ? ");
   scanf("%i",&rep);
    }
    return 0;
}
0
Halidc Messages postés 12 Date d'inscription mercredi 29 janvier 2014 Statut Membre Dernière intervention 17 février 2014 13
31 janv. 2014 à 15:26
merci sambia39 pour tes exemples.
0

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

Posez votre question
Halidc Messages postés 12 Date d'inscription mercredi 29 janvier 2014 Statut Membre Dernière intervention 17 février 2014 13
Modifié par jipicy le 29/01/2014 à 18:16
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a, b, c, a1=0, b1=0, c1=0, a11, b11, c11;
    char rep = 'O';

    while (rep == 'o' || rep == 'O')
    {
        system("cls");
    do{
        printf("Entrer A : ");
        scanf("%i", &a);
      }
    while((a%7 != 0 && a%5 != 0 && a%3 != 0) || a == 0);
    system("cls");
if (a%7 == 0 && a%5 == 0 && a%3 == 0)
{
    printf("A = %i\n%i est divisible par : 7 , 5 et 3\n", a,a);
}
else
{
    do {
            printf("Entrer B : ");
            scanf("%i",&b);

        if(a%7!=0)
           {
               if(b%7 == 0){a1=1;}
           }
        if(a%5!=0)
           {
               if(b%5 == 0){b1=1;}
           }
        if(a%3 !=0)
           {
               if(b%3 == 0){c1=1;}
           }
       }
    while( (a1 != 1 && b1 != 1 && c1 != 1) || b == 0);
    system("cls");
    if ((a%7==0 && a%5==0) && b%3==0  )
    {
        printf("A = %i\nB = %i\n7 et 5 divise %i et 3 divise %i\n",a,b,a,b);
    }
    else if ((a%7==0 && a%3==0) && b%5==0)
    {
        printf("A = %i\nB = %i\n7 et 3 divise %i et 5 divise %i\n",a,b,a,b);
    }
    else if ((a%5==0 && a%3==0) && b%7==0)
    {
        printf("A = %i\nB = %i\n5 et 3 divise %i et 7 divise %i\n",a,b,a,b);
    }
    else if (a%7==0 &&(b%5==0 && b%3==0))
    {
        printf("A = %i\nB = %i\n7 divise %i, 3 et 5  divise %i\n",a,b,a,b);
    }
    else if (a%5==0 &&(b%7==0 && b%3==0))
    {
        printf("A = %i\nB = %i\n5 divise %i, 3 et 7  divise %i\n",a,b,a,b);
    }
    else if (a%3==0 &&(b%5==0 && b%7==0))
    {
        printf("A = %i\nB = %i\n3 divise %i, 7 et 5  divise %i\n",a,b,a,b);
    }
    else
    {
    do {
         printf("Entrer C : ");
            scanf("%i",&c);

             if(a%7!=0 && b%7!=0)
               {
                  if(c%7 == 0){a11=1;}
               }
            if(a%5!=0 && b%5!=0)
               {
                  if(c%5 == 0){b11=1;}
               }
            if(a%3 !=0 && b%3!=0)
               {
                  if(c%3 == 0){c11=1;}
               }
       }
    while( (a11 != 1 && b11 != 1 && c11 != 1) || c == 0);
    system("cls");
        if (a%7==0 && b%5==0 && c%3==0)
        {
            printf("A = %i\nB = %i\nC = %i\n7 divise %i , 5 divise %i et 3 divise %i\n",a,b,c,a,b,c);
        }
        else if (a%7==0 && b%3==0 && c%5==0)
        {
            printf("A = %i\nB = %i\nC = %i\n7 divise %i , 3 divise %i et 5 divise %i\n",a,b,c,a,b,c);
        }
        else if (a%5==0 && b%7==0 && c%3==0)
        {
            printf("A = %i\nB = %i\nC = %i\n5 divise %i , 7 divise %i et 3 divise %i\n",a,b,c,a,b,c);
        }
        else if (a%5==0 && b%3==0 && c%7==0)
        {
            printf("A = %i\nB = %i\nC = %i\n5 divise %i , 3 divise %i et 7 divise %i\n",a,b,c,a,b,c);
        }
        else if (a%3==0 && b%5==0 && c%7==0)
        {
            printf("A = %i\nB = %i\nC = %i\n3 divise %i , 5 divise %i et 7 divise %i\n",a,b,c,a,b,c);
        }
        else if (a%3==0 && b%7==0 && c%5==0)
        {
            printf("A = %i\nB = %i\nC = %i\n3 divise %i , 7 divise %i et 5 divise %i\n",a,b,c,a,b,c);
        }
   }
}
   printf("\n\nAutre Taitement (OUI=> O , NON=> N) ? ");
   scanf("%s",&rep);
    }
    return 0;
}

// Ca ne marche pas avec 33 30 21
0
Halidc Messages postés 12 Date d'inscription mercredi 29 janvier 2014 Statut Membre Dernière intervention 17 février 2014 13
29 janv. 2014 à 18:15
0
Halidc Messages postés 12 Date d'inscription mercredi 29 janvier 2014 Statut Membre Dernière intervention 17 février 2014 13
Modifié par Halidc le 29/01/2014 à 23:28
on na pas encore fait les fonctions. juste un mois...
ni getchar(),
ce code contient un bug. a=33 b=30 c=21
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
30 janv. 2014 à 00:29
Ok pour les fonctions.
Il n'empêche que : scanf("%s",&rep); est faux...
"%s" s'applique pour un pointeur/tableau de caractère, pas pour un char. Donc à corriger. Ensuite, tu auras le problème de l'entrée.

Pour le reste, je verrai demain si j'ai le courage de le lire vu qu'il n'y a même pas de commentaire...
0
Halidc Messages postés 12 Date d'inscription mercredi 29 janvier 2014 Statut Membre Dernière intervention 17 février 2014 13
30 janv. 2014 à 17:58
#include <stdio.h>
#include <stdlib.h>

int main()
{
int a, b, c, a1=0, b1=0, c1=0, a11, b11, c11;
char rep = 'O';

while (rep == 'o' || rep == 'O')
{
// system("cls");
do{
printf("Entrer A : ");
scanf("%i", &a);
}
while((a%7 != 0 && a%5 != 0 && a%3 != 0) || a == 0);
//system("cls");
if (a%7 == 0 && a%5 == 0 && a%3 == 0)
{
printf("A = %i\n%i est divisible par : 7 , 5 et 3\n", a,a);
}
else
{
do {
printf("Entrer B : ");
scanf("%i",&b);

if(a%7!=0)
{
if(b%7 == 0){a1=1;}
}
if(a%5!=0)
{
if(b%5 == 0){b1=1;}
}
if(a%3 !=0)
{
if(b%3 == 0){c1=1;}
}
}
while( (a1 != 1 && b1 != 1 && c1 != 1) || b == 0);
//system("cls");
if ((a%7==0 && a%5==0) && b%3==0 )
{
printf("A = %i\nB = %i\n7 et 5 divise %i et 3 divise %i\n",a,b,a,b);
}
else if ((a%7==0 && a%3==0) && b%5==0)
{
printf("A = %i\nB = %i\n7 et 3 divise %i et 5 divise %i\n",a,b,a,b);
}
else if ((a%5==0 && a%3==0) && b%7==0)
{
printf("A = %i\nB = %i\n5 et 3 divise %i et 7 divise %i\n",a,b,a,b);
}
else if (a%7==0 &&(b%5==0 && b%3==0))
{
printf("A = %i\nB = %i\n7 divise %i, 3 et 5 divise %i\n",a,b,a,b);
}
else if (a%5==0 &&(b%7==0 && b%3==0))
{
printf("A = %i\nB = %i\n5 divise %i, 3 et 7 divise %i\n",a,b,a,b);
}
else if (a%3==0 &&(b%5==0 && b%7==0))
{
printf("A = %i\nB = %i\n3 divise %i, 7 et 5 divise %i\n",a,b,a,b);
}
else
{
do {
printf("Entrer C : ");
scanf("%i",&c);

if(a%7!=0 && b%7!=0)
{
if(c%7 == 0){a11=1;}
}
if(a%5!=0 && b%5!=0)
{
if(c%5 == 0){b11=1;}
}
if(a%3 !=0 && b%3!=0)
{
if(c%3 == 0){c11=1;}
}
}
while( (a11 != 1 && b11 != 1 && c11 != 1) || c == 0);
//system("cls");
if (a%7==0 && b%5==0 && c%3==0)
{
printf("A = %i\nB = %i\nC = %i\n7 divise %i , 5 divise %i et 3 divise %i\n",a,b,c,a,b,c);
}
else if (a%7==0 && b%3==0 && c%5==0)
{
printf("A = %i\nB = %i\nC = %i\n7 divise %i , 3 divise %i et 5 divise %i\n",a,b,c,a,b,c);
}
else if (a%5==0 && b%7==0 && c%3==0)
{
printf("A = %i\nB = %i\nC = %i\n5 divise %i , 7 divise %i et 3 divise %i\n",a,b,c,a,b,c);
}
else if (a%5==0 && b%3==0 && c%7==0)
{
printf("A = %i\nB = %i\nC = %i\n5 divise %i , 3 divise %i et 7 divise %i\n",a,b,c,a,b,c);
}
else if (a%3==0 && b%5==0 && c%7==0)
{
printf("A = %i\nB = %i\nC = %i\n3 divise %i , 5 divise %i et 7 divise %i\n",a,b,c,a,b,c);
}
else if (a%3==0 && b%7==0 && c%5==0)
{
printf("A = %i\nB = %i\nC = %i\n3 divise %i , 7 divise %i et 5 divise %i\n",a,b,c,a,b,c);
}
}
}
printf("\n\nAutre Taitement (OUI=> O , NON=> N) ? ");
scanf("%c",&rep);
}
return 0;
}
0
Halidc Messages postés 12 Date d'inscription mercredi 29 janvier 2014 Statut Membre Dernière intervention 17 février 2014 13
31 janv. 2014 à 17:11
// Problem resolue

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a=0, b=0, c=0, a1=0, b1=0, c1=0, rep = 1;

 while (rep == 1)
 {
        a = 0;           
        while((a%7 != 0 && a%5 != 0 && a%3 != 0) || a == 0)
            {
        printf("Entrer A : ");
        scanf("%i", &a);        
            }
    
  if (a%7 == 0 && a%5 == 0 && a%3 == 0)
  {
    printf("A = %i\n%i est divisible par : 7 , 5 et 3\n", a,a);
  }
  else
  {   
       b=0;            
      while(a1 == 1 || b1 == 1 || c1 == 1 || b == 0) // condition pour accepter B
        {   
            a1=0; b1=0; c1=0;           
            printf("Entrer B : ");
            scanf("%i",&b);
            
            if(b%7 == 0 && a%7 == 0) {a1=1;}         
            if(b%5 == 0 && a%5 == 0) {b1=1;}         
            if(b%3 == 0 && a%3 == 0) {c1=1;}                          
        }
        
    if ((a%7==0 && a%5==0) && b%3==0  )
    {
        printf("A = %i\nB = %i\n7 et 5 divise %i et 3 divise %i\n",a,b,a,b);
    }
    else if ((a%7==0 && a%3==0) && b%5==0)
    {
        printf("A = %i\nB = %i\n7 et 3 divise %i et 5 divise %i\n",a,b,a,b);
    }
    else if ((a%5==0 && a%3==0) && b%7==0)
    {
        printf("A = %i\nB = %i\n5 et 3 divise %i et 7 divise %i\n",a,b,a,b);
    }
    else if (a%7==0 &&(b%5==0 && b%3==0))
    {
        printf("A = %i\nB = %i\n7 divise %i, 3 et 5  divise %i\n",a,b,a,b);
    }
    else if (a%5==0 &&(b%7==0 && b%3==0))
    {
        printf("A = %i\nB = %i\n5 divise %i, 3 et 7  divise %i\n",a,b,a,b);
    }
    else if (a%3==0 &&(b%5==0 && b%7==0))
    {
        printf("A = %i\nB = %i\n3 divise %i, 7 et 5  divise %i\n",a,b,a,b);
    }
    else
    {
        c=0;
        while((a1 != 1 && b1 != 1 && c1 != 1) || c == 0)
       {
            a1=1; b1=0; c1=0; 
            printf("Entrer C : ");
            scanf("%i",&c);

            if((a%7!=0 && b%7!=0) && c%7 == 0){a1=1;}                               
            if((a%5!=0 && b%5!=0) && c%5 == 0){b1=1;}          
            if((a%3!=0 && b%3!=0) && c%3 == 0){c1=1;}             
       }        
  
        if (a%7==0 && b%5==0 && c%3==0)
        {
            printf("A = %i\nB = %i\nC = %i\n7 divise %i , 5 divise %i et 3 divise %i\n",a,b,c,a,b,c);
        }
        else if (a%7==0 && b%3==0 && c%5==0)
        {
            printf("A = %i\nB = %i\nC = %i\n7 divise %i , 3 divise %i et 5 divise %i\n",a,b,c,a,b,c);
        }
        else if (a%5==0 && b%7==0 && c%3==0)
        {
            printf("A = %i\nB = %i\nC = %i\n5 divise %i , 7 divise %i et 3 divise %i\n",a,b,c,a,b,c);
        }
        else if (a%5==0 && b%3==0 && c%7==0)
        {
            printf("A = %i\nB = %i\nC = %i\n5 divise %i , 3 divise %i et 7 divise %i\n",a,b,c,a,b,c);
        }
        else if (a%3==0 && b%5==0 && c%7==0)
        {
            printf("A = %i\nB = %i\nC = %i\n3 divise %i , 5 divise %i et 7 divise %i\n",a,b,c,a,b,c);
        }
        else if (a%3==0 && b%7==0 && c%5==0)
        {
            printf("A = %i\nB = %i\nC = %i\n3 divise %i , 7 divise %i et 5 divise %i\n",a,b,c,a,b,c);
        }
   }
}
   printf("\n\nAutre Taitement (OUI=> 1 , NON=> 2) ? ");
   scanf("%i",&rep);
    }
    return 0;
}

0
Halidc Messages postés 12 Date d'inscription mercredi 29 janvier 2014 Statut Membre Dernière intervention 17 février 2014 13
31 janv. 2014 à 17:14
Je tient a vous remercier tous pour votre soutient ,
spécialement fiddy .
cdlt,
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
31 janv. 2014 à 23:27
Bonsoir

Alors pourquoi des accolades ? A cause des étiquettes de goto
et ces accolades ne fond que définir le périmètre de mes étiquettes (bloc d'instruction des différents cas) et rien d'autres.
On peut tout à fait s'en passer, mais la lecture du code serait très vite impossible à lire voilà pourquoi.

Algorithmiquement à revoir en évitant goto sauf cas particulier. Pour te répondre, essayons de nous poser la question suivante: « Qu'attendons-nous d'un algorithme informatique? »
Tout d'abord, le rôle principale d'un algorithme est de résoudre des problèmes informatiques.
Et on attend de lui deux choses :
1->Une approche ou une solution juste à partir des données entrées du problème.
2->L'utilisation des RESSOURCES nécessaire de manière efficace.

et je suis tout à fait d'accord pour revoir l'algorithme, c'est même une autre approche différente de la première qui pourrais l'améliorer le programme.

Goto fait parti des ressources utilisées, il est à priori déconseillé sauf cas particulier.
C'est peut être vrai mais comment veux-tu voler dans les airs si tu ne peux pas utiliser tes ailes?

Quant à unistd.h et sleep !! Qui vous a dit que ce n'était "NON standard? Et que voulez-vous dire par non standard ?.

unistd.h fait parti de la norme POSIX 1.0 UNIX et c'est un standard UNIX et veux dire UNIX Standard, personnellement je trouve cela totalement faux, c'est à croire que , Exemple : pour écrire du code standardiser sur Windows, j'utiliserai uniquement conio et non stdio ou stdlib. Ce raisonnement est totalement faux et d'ailleurs en trouve pas mal d'implémentation UNIX dans Windows.

Pour finir, l'effacement de l'écran est une commande utilisée par le terminal Linux/UNIX pour effacer l'écran.
Il dépend du système sur lequel on a édité le code source, pour mon cas FreeBSD donc UNIX et Windows ça commande console est CLS.

Le choix de ne pas utiliser les fonctions est possible et je m'excuse si c'est une solution toute faite qui va à l'encontre des règles du forum CCM j'en suis désolé, mais ceci dit, je n'ai pas court-circuité son exercice, j'ai juste donné une approche différente de celle qu'il nous a soumis.

J'apprécie vos remarque et j'en prend notes à bientôt
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
1 févr. 2014 à 01:21
Alors pourquoi des accolades ? A cause des étiquettes de goto
Pas besoin d'accolades pour les goto...

On peut tout à fait s'en passer, mais la lecture du code serait très vite impossible à lire voilà pourquoi.
C'est ce que tu penses. Dans la plupart des cas, y compris ici, il est possible de s'en passer via des boucles / fonctions, etc. Ca sera plus propre, plus court et plus joli. L'utilisation de goto produit du code spaghetti.
Exemple :
Ton code :
	{
		A:
			iA=fSaisieControle('A');      
			if(iA==0){
				goto EXT;   /* erreur en sort */
			}
			else if(bfDivisible(iA)!=0){
				goto A;   /* recommence */
			} goto B;  /* passe étape suivante */
	}
	{
		B:
			iB=fSaisieControle('B');
                        ...
        }

peut se traduire en C...
     do {
          iA=fSaisieControle('A');
          if(iA==0) {
              return 0;
          }
     } while (bfDivisible(iA)==0);
     do {
          iB=fSaisieControle('B');
          ...
     }

En programmant, tu verras que les goto sont très peu utilisés. L'exeption confirmant la règle est la gestion des erreurs dans des cas compliqués. Ce qui n'est pas le cas ici.

2->L'utilisation des RESSOURCES nécessaire de manière efficace.
Et c'est là que le bât blesse. Goto ne produit pas du code efficace :-). De plus, si tu utilises du goto dans un cours d'algorithme, il y a de grandes chances que tu te fasses tirer les oreilles ;-).

Quant à unistd.h et sleep !! Qui vous a dit que ce n'était "NON standard? Et que voulez-vous dire par non standard ?.
La norme ISO ;-). La norme ISO (C89/90, voire C99 maintenant) est le standard qui te garantit que ton code sera compilable sur n'importe quel compilateur quel que soit ton OS !


pour écrire du code standardiser sur Windows, j'utiliserai uniquement conio et non stdio ou stdlib. Ce raisonnement est totalement faux et d'ailleurs en trouve pas mal d'implémentation UNIX dans Windows.

Lorsque tu programmes, ton réflexe est d'utiliser du code portable. Le problème est que tu ne pourras pas toujours le faire. Dans ces cas-là, bien sûr, tu peux utiliser des fonctions systèmes. Pour ce faire, il est conseillé de bien séparer les parties pour en faciliter la maintenance.

je n'ai pas court-circuité son exercice, j'ai juste donné une approche différente de celle qu'il nous a soumis.
Disons que plutôt donner un code fonctionnel directement, on préfère ici dire ce qui ne va pas dans le code proposé. Ou alors on donne des idées de piste :-).

A bientôt sur le forum ;-)))
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
1 févr. 2014 à 23:32
Bonjour,

Alors pour commencer quand j'ai parlé de balise, je parle de la lisibilité du code car il est des fois nécessaire de mettre des balises supplémentaires afin de différencier les blocs d'instruction et surtout quand il s'agit d'un code spaghetti. Sans oublier, que j'ai mentionné « code spaghetti » clairement dans mon premier poste.
Exemple pour les balises :

 /* en peut ne pas mettre ces balise mais dans mon code j'utilise pas mal de goto et etiqtte donc j'ai mis les ballise pour les séparé c'est un choix */

  {//<-debut de bloc 
      A:
         iA=fSaisieControle('A');      
         if(iA==0){ goto EXT;}  
         
         else if(bfDivisible(iA)!=0){goto A; } 
         goto B; 
  }//<-fin de bloc


On peut utiliser goto pas uniquement pour la gestion des erreurs, celui-ci peut être utilisé pour faire une boucles for par exemple :

{
  int i=0;
  INCREMT:
    if(i<=15){
        i+=1;
        goto INCREMENT;
    }




Quand je parle d'utilisation des ressources nécessaires et efficace, je ne parle pas ici de goto car il ne fait pas du code efficace. Je parle au contraire de toutes les ressources, instruction + instruction goto, gestion de la mémoire, temps d'exécution ou temps d'accès à la mémoire, etc... Et tout ceci dépend de l'algorithme à exécuter, surtout que tout bon algorithme se focalise sur une ressource particulière qui est le temps. Car comment peut-on juger le temps nécessaire à un algorithme ? Contrairement à l'exactitude fournie qui ne dépend pas de l'ordinateur sur lequel l'algorithme s'exécute.
Son temps dépendant principalement de plusieurs facteurs externes à l'algorithme lui-même dont certains sont énoncés plus haut. Bref, je rentre dans un débat d'algorithme qui va m'attirer les foudres des ténors. Mais c'est vrai, qu'on pourrait me tirer les cheveux rien que pour l'utilisation de goto, je l'avoue.

Pour la norme, là encore une fois, je ne vais pas promouvoir le POSIX mais je tiens à dire cela : il permet d'être utilisé sur n'importe quels autres systèmes ( exemples : MAC, Windows NT (compatible Posix 1 mais pour une extension plus large, l'utilisation de Cygwin est conseillé), Linux, Qnx, Système V etc...) et d'ailleurs, il intègre la norme AINSI que je conseil fortement au lieu de C99 pour le peu que je connais.
Sauf erreur de ma part, le C99 est l'inter-compatibilité entre le C/C++ et n'intègre pas la norme de programmation système ou temps réel contrairement à POSIX.
Pour les débutants, je conseil biensur l'ISO C99 et pour les experts libre à eux d'utiliser la norme qu'ils veulent. D'ailleurs, les compilateurs ne font que supporter le C99, il est vrais que le code peut est portable mais ce n'est pas tout à fais vrais si on programme en système suivant les norme, le C99 est pas ce qu'il nous faut mais pour du code simple sans Api ou autre oui. Faite un tour sur le statut de Gcc ou Watcom C, pour connaître l'état d'intégration du support C99. Sur certains compilateurs, les types sont optionnels ce qui limite la portabilité du code. Certaines directives préprocesseur sont ignorées c'est normal, le choix d'intégration des normes est laissé au concepteur du compilateur. C'est pourquoi certain compilateur ne supporte pas la portabilité de certain code. Il faudrait faire un choix judicieux de portage si l'on veut rendre notre code multi-plateformes.

Quant au réflexe d'écrire un code portable, il est bien vrai qu'il faut avoir ce réflexe. Mais, cela dépend de l'application que l'on écrit. En utilisant des fonctions systèmes par exemple en doit s'assurée des différents cas Os bref , je suis d'accord pour code portable mais il est préférable de faire un choix de norme adapté au plateforme Viva la révoluçione POSIX (je déconne).

Et Désolé pour le code fonctionnel fourni. Prochainement, je m 'efforcerais de corriger et d'orienter la personne. Cependant, je ne garantie pas ma générosité à fournir du code fonctionnel même si cela m'attire les foudres. Je suis ouvert à toutes critiques, suggestions et corrections .....
à Bientôt ^_^
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
2 févr. 2014 à 00:46
On peut utiliser goto pas uniquement pour la gestion des erreurs, celui-ci peut être utilisé pour faire une boucles for
Je n'ai pas dit que goto ne fonctionnait que pour la gestion des erreurs. J'ai dit qu'il était déconseillé de l'utiliser ailleurs.

Libre à chacun de programmer comme il veut. Mais, je te garantie que je ne serai pas le seul à te faire ce reproche ;-))). Que ce soit sur Internet, à l'école, en entreprise, ça sera idem.

et d'ailleurs, il [POSIX] intègre la norme AINSI que je conseil fortement au lieu de C99 pour le peu que je connais.
Alors déjà, c'est pas AINSI mais ANSI. Ensuite, Tous les systèmes ne sont pas posix compliant. Il vaut mieux utiliser les solutions les plus portables quand c'est possible. Donc, C89/C90 ou C99. Si c'est pas possible, alors seulement à ce moment, on peut utiliser Posix (sans mélanger les codes de préférence).

Sauf erreur de ma part, le C99 est l'inter-compatibilité entre le C/C++
Erreur de ta part ;-). Le C et le C++ sont deux langages différents régis par deux normes différentes.

je conseil biensur l'ISO C99 et pour les experts libre à eux d'utiliser la norme qu'ils veulent. D'ailleurs, les compilateurs ne font que supporter le C99,
Pas moi. Je conseille plutôt C89/C90. Le C99 n'est pas encore intégrer à 100% dans tous les compilateurs...

Bref, tu dis que Posix permet plus de chose que le standard ISO. C'est vrai. Sauf que, et tu me rejoins dans ton post, qu'il vaut mieux privilégier la norme ISO quand c'est possible. Pour un code aussi simple (car il ne faut pas oublier le contexte : entrée de 3 entiers...), pas besoin de POSIX là ou l'ISO C89/90 suffit largement.
0
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. 2014 à 01:44
Bonsoir

Merci pour tes remarques de Goto,
Cependant j'utilise pas Goto au quotidien (c'est un arrêt de mort que je signe la preuve tes foudre et bien d'autres à venir ^_^) mais très très très rarement (cas d'exemple avec le code poster dans les précédents post).

Faute de frappe de ma part pour ANSI, par contre je ne suis pas de cet avis, que tous les systèmes ne sont pas POSIX mais à me renseigner, quant à C/C++ je sais que ce sont là deux langages de programmation différents avec leurs normes respectives, mais le C99 à été conçu pour minimiser incompatibilités entre les C et le C++ sans pour autant en faire un seul et même langage (si ma phrase précédente n'a pas été comprise).

Encore le cas C99, j'ai bien dit les compilateurs ne font que supporter C99 dans mon dernier post, cela ne veut pas dire qu'il est à 100 % intégrés
Et pour finir ? il est vrai, et je te rejoins sur le cas ISO, quand il est possible de l'utiliser "utiliser", mais pour ma part je suis POSIX et c'est un choix tout comme toi qui est C89/C90.
0
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. 2014 à 01:49
J'avais oublié, désolé pour les fautes orthographiques, merci pour vos interventions, (même-ci en campe sur nos normes ^_^) à bientôt
0