Erreur avec code en langage C

Résolu/Fermé
unfortic Messages postés 24 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 16 mai 2012 - 19 déc. 2009 à 08:59
 koyo - 22 déc. 2010 à 02:47
Bonjour,
J'ai un code source de langage C qui est supposé demander à l'utilisateur de saisir une série de nombre entiers, et de déterminer le plus grand et le petit élément, sans que ces nombres soient conservés en mémoire. Malheureusement quand j'exécute, ça marche pas à tout les coups(on me donne pas le bon résultat). il faut signaler que ce code est la correction d'un exo (voir https://www.000webhost.com/migrate?static=true page 3 et 17) sur les boucles en C (qu'on a pas encore étudié); Et donc si quelqu'un peut m'expliquer comment ça marche et pq ce code ne donne pas le réusltat voulu Merci c'est urgent! Voici le code>>>
#include<stdio.h>
#include<conio.h>
int main ()
{
//Déclaration des variables entiers max et min//
int max, min;
//declaration de l'entier saisie//
int n;
//saisie de l'entier par l'utilisateur//
printf("entier "); scanf("%d%",&n);
//Initialisation de max et min à n//
max=min=n;
//Tant que l'utilisateur saisie un entier différent de 0//
while(n)
{
//Si max est plus petit que n//
if(max<min)
//alors max devient n//
max=n;
//sinon max est plus grand que n//
else
//si min est plus grand que n//
if(min>n)
//alors min devient n//
min=n;
//nouvelle saisie par l'utilisateur//
printf("entier: "); scanf("%d",&n);
}//fin du while(n)//
//Afichage de max et min//
printf("entier le plus grand: %d, et entier le plus petit: %d",max,min);
getch();
}
A voir également:

7 réponses

Le concombre formatté
19 déc. 2009 à 10:09
Salut
Déjà, faudrait synchroniser tes commentaires avec ton code, tu y verrais peut-être un peu plus clair
0
unfortic Messages postés 24 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 16 mai 2012 3
19 déc. 2009 à 11:57
Salut,
Oui c'est vrai moi aussi je l'ai est trouvé mal placés. C'est en fait la solution de l'exo que je vous est réécrite littéralement, le code ne pouvant pas être copier/coller de la page pdf. pourtant, ce code ne marche pas..avez vous une idée pourquoi, sinon une autre solution en utiisant les boucles.
Merci d'avance.
0
salut quelqu'un peut me dire comment faire pour afficher un msgbox en langage c?
0
Utilisateur anonyme
19 déc. 2009 à 10:13
Salut,
et petite question à part : conio.h ? puisque tu l'inclues, il contient quoi ?
0
unfortic Messages postés 24 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 16 mai 2012 3
19 déc. 2009 à 11:47
Salut
Il faut dire que je ne sais pas encore entièrement son rôle. Mais elle sert parfois quand la console ne veut pas démarrer sous Windows à l'exécution du code. Si tu l'utilise tu dois mettre avant la dernière accolade: getch();
Elle peut être remplacé par la bibliothèque stdlib.h en mettant à la fin system("pause").
Cordialement.
0
je ne sais pas ton niveau en C mais si ta deja appris le passage des parametres en lignes de commande que tu passe ensuite a main c pas mieu pour toi au lieu de faire compliqué avec des commentaires qui ne vont avec le code.

essaye un truc du genre


/* compilation: gcc  -Wall -std=c99 -o affiche_min_max affiche.c
   test : ./affiche_min_max 12 48 98 2 45 0 -98 1565 */


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



int main(int argc , char *argv[]){ 
  /* argc est le nombre d'argument de la ligne de commande et argv contient les arguments
     attention le nom du programme est compté par argc et fait partir de argv
     
     il te faut au moins deux arguments: usage : ./nom_programme entier_1 ... entier_i.... entier_n pour i allant de 1 à n */
  
  if(argc < 2 ){ 
    // traiter le cas d'erreur ici par exple
    fprintf(stderr," usage: %s entier_1 ... entier_i.... entier_n\n\t il faut au moins un entier\n",argv[0]);
    exit(EXIT_FAILURE); // tu arete le programme avec une terminaison anormale
  }
  
  /* les argument fournis a la ligne de commande sont des chaines de caracteres donc il faut les convertirs en entier : on a en notre disposition atoi et strtoul pour ça: man ton_choix pour plus d'info  */
  int tab[argc - 1 ]; 
  
  for (int i = 1 /* et oui pour i = 0 , c le nom du programme */; i < argc ; i++)
    tab[i - 1] = atoi(argv[i]);
  
  /* maintenant tu a ton tableau d'entier, tu peux donc faire le traitement que tu veux */
  int min = tab[0], max = tab[0] ; 
  for( int i = 0; i < argc -1 ; i ++){
    if( min > tab[i] )
      min = tab[i]; // tu a trouvé un plus petit, donc tu met a jour ton min
    if( max < tab[i])
      max = tab[i]; // tu met a jour max
  }
  
  printf(" min = %d et max = %d\n",min, max);
  return EXIT_SUCCESS;
}


0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
19 déc. 2009 à 13:13
Oui, mais l'énoncé dit qu'il ne faut pas stocker les nombres en mémoire, chose que tu fais avec ton tableau.

Cdlt,
0
unfortic Messages postés 24 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 16 mai 2012 3
19 déc. 2009 à 11:40
Salut tout le monde;
Merci alphon5o pour ces explications. On n'a pas encore étudié le passage des paramètres en lignes de commande et j'ai eu du mal à suivre. Ce que j'ai trouvé bizarre toutefois, c'est qu'il y as pas de "scanf" dans ton code..Pourtant c'est l'utilisateur qui saisie les suites de nombres. Pourrait tu m'expliquer ça?
sinon, est ce qu'on peut proposer une solutions grâce aux boucles répétitives?
Merci d'avance.
0

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

Posez votre question
unfortic Messages postés 24 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 16 mai 2012 3
19 déc. 2009 à 12:26
Re tout le monde!
si on ne m'avait pas prévenu je ne l'aurais jamais su :D
il y'as deux fautes dans ce code
la première dans la ligne 10 ou j'ai ajouté % a d et l'autre dans la ligne 17 ou il faut remplacer min par n.ça y est mnt ça marche! :D
Sinon alphon j'attend tjrs ta réponse à propos des "scanf".
A bientôt.
0
j'avais zappé !!!! lol
pour les scan refere toi a tes pages de manuel: man scan sscanf fscanf ...
mais deja retient que les fonction de la famille scanf permettent de convertir une entree en respectant un certains formats.en gros la fonction scanf permet de lire des données. Pour chaque format, la fonction lit une valeur et la dépose dans la prochaine variable. j'orai pu m'en servir d'une d'entre elle (sscanf pour la convertion)

dailleurs remplace la ligne tab[i-1] = atoi(argv[i]) par sscanf(argv[i], "%d", &tab[i-1]) pour voir que ça revient au meme c'est une question de choix et d'habitude sinon la mieu adapté pour faire ça est strtoul.

ce qui me gene dans ton code , g ne sait pas c l'ennoncé qui le specifie tu ne peux avoir 0 dans ta suite sinon bienvenue les degat vu ke c ton test d'arret .

en realité le tableau n'est pas stocké en memoire, il est sur la pile d'execution du programme et des qu'on sort de sa porté ( son bloc) il est detruit, c'est une variable locale, g n'ai fait aucune allocation memoire donc pas de souci a ce nivo. mais je pense que ta deja trouvé ta solution.
0
bonjour,

Je vais essayer de te corriger l'exo:

#include<stdio.h>
#include<conio.h>
int main ()
{
//Déclaration des variables entiers max et min
int max, min;
//declaration de l'entier saisie
int n;
//saisie de l'entier par l'utilisateur
printf("entier "); scanf("%d%",&n);
//Initialisation de max et min à n
//l'entier n n'est pas initialisé donc il peut avoir n'importe quelle valeur
//max=min=n;
max=0 ; min=0;

//Tant que l'utilisateur saisie un entier différent de 0
while(n)
{
//Si max est plus petit que n
//ici il faut comparer max à n et non a min
//if(max<min)
if (max<n)

//alors max devient n
max=n;
//sinon max est plus grand que n
else
//si min est plus grand que n
if(min>n)
//alors min devient n
min=n;
//nouvelle saisie par l'utilisateur
printf("entier: "); scanf("%d",&n);
}//fin du while(n)
//Afichage de max et min
printf("entier le plus grand: %d, et entier le plus petit: %d",max,min);
getch();
}
0
unfortic Messages postés 24 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 16 mai 2012 3
19 déc. 2009 à 16:52
Re calibos;
Merci pour préciser les fautes d'une manière plus claire.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
19 déc. 2009 à 13:06
Salut,

Voici un exemple de programme qui fait ce que tu souhaites. Lorsque l'utilisateur tape 0, cela stoppe le programme. Tu peux changer la condition, bien sûr.
Attention, par contre, le programme ne gère pas les mauvaises entrées de la part de l'utilisateur.

#include <stdio.h>
#include <limits.h>

int main(void) {
    int min=INT_MAX,max=INT_MIN;
    int n;

    do {
        printf("nombre: ");
        scanf("%d",&n);
        getchar();
        if(n<min) min=n;
        if(n>max) max=n;
    } while(n!=0);

    printf("min=%d\nmax=%d\n",min,max);
    puts("entree pour continuer");
    getchar();

    return 0;
}


J'ai pas mis de commentaires. S'il y a des parties que tu comprends pas, n'hésite pas.

Cdlt,
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
19 déc. 2009 à 15:16
Sauf si l'utilisateur saisit un nombre négatif, 'min' vaudra zéro ;-)
Bon après-midi.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842 > loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017
19 déc. 2009 à 15:20
C'est tout à fait juste ^^.
Juste à enrichir les if pour ne pas prendre en compte le 0 ^^.
Ou alors beaucoup mieux, détecter les lettres en passant par fgets pour quitter.
0
unfortic Messages postés 24 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 16 mai 2012 3
19 déc. 2009 à 17:13
Salut
Merci, c'est un code plus lisible et pratique. Mais vu que je suis encore débutant en C, je connais pas encore cette biblio que t'as utilisé : limits.h ni "do" ni que while peut se mettre à la fin. je suppose que puts est là car elle est precédé d'un printf avec 2 saut de ligne dedans.
Pourrais tu m'éclairer ça stp?
Merci.
PS:Au passage, je me demande si c'est possible d'avoir comme variables la date actuel actualisé à chaque fois que le programme s'exécute, j'en ai besoin pour un autre programme pour calculer l'âge d'une personne.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842 > unfortic Messages postés 24 Date d'inscription vendredi 1 février 2008 Statut Membre Dernière intervention 16 mai 2012
19 déc. 2009 à 19:08
limits.h c'est pour récupérer les constantes INT_MIN et INT_MAX qui sont respectivement les valeurs minimale et maximale d'un integer. Toi tu en as pas eu besoin car tu as initialisé les variables min et max à n et fait la boucle ensuite.
Moi, j'ai mis tout dans une boucle, mais dans ce cas-là, j'avais besoin d'INT_MIN et INT_MAX pour initialiser les variables min et max.
do while, ça permet de répondre à l'algorithme : répéter ... tant que. En gros, c'est comme while... mais en plaçant la condition d'arrêt à la fin.

Pour la date, tu peux récupérer localtime().
Cdlt,
0