IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

les tableaux !


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 59
    Par défaut les tableaux !
    bonsoir,
    j'ai trouvé cette exercices
    Exo :
    Ecrivez un programme permettant à l’utilisateur de saisir un nombre quelconque de valeurs, qui devront être stockées dans un tableau. L’utilisateur doit donc commencer par entrer le nombre de valeurs qu’il compte saisir. Il effectuera ensuite cette saisie. Enfin, une fois la saisie terminée, le programme affichera le nombre de valeurs négatives et le nombre de valeurs positives.

    j'ai fait le programme comme suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    # include <stdio.h>
    # define N 100
    void main()
    {
    	int i,T[N],P=0,n=0;
    	printf("Donnez le nombre de valeurs : ");
    	scanf("%d",&N);
    	while(N<=0 || N>100)
    	{
    		printf("Retapez svp ! 0< nombre <100 : ");
    		scanf("%d",&N);
    	}
    	for(i=0;i<N;i++)
    	{
    		printf("Donnez le nombre %d : ",i+1);
    		scanf("%d",&T[i]);
    		if(T[i]<0)
    			n++;
    		else if(T[i]>0)
    			P++;
    	}
    	printf("Le nombre de valeurs positives %d \n Le nombre de valeurs positives : %d ",P,n);
    }
    mais Il n'a pas voulu bien exécuter
    et 0 est-il positif ou négatif (je crois quel il n'est pas positif que negatif)
    pouvez-vous m'aider svp
    merci.

  2. #2
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 52
    Par défaut
    Salut,

    Tu fais un define N 100, pusi tu demandes N à l'utilisateur...

    Enlèves le #define N 100 et ajoutes un int N dans le main et ce sera bon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # include <stdio.h>
     
    void main()
    {
    	int i,N,T[N],P=0,n=0;
    	printf("Donnez le nombre de valeurs : ");
    	scanf("%d",&N);
    	while(N<=0 || N>100)
    	{
    		printf("Retapez svp ! 0< nombre <100 : ");
    		scanf("%d",&N);
    	}
    	for(i=0;i<N;i++)
    	{
    		printf("Donnez le nombre %d : ",i+1);
    		scanf("%d",&T[i]);
    		if(T[i]<0)
    			n++;
    		else if(T[i]>0)
    			P++;
    	}
    	printf("Le nombre de valeurs positives %d \n Le nombre de valeurs positives : %d ",P,n);
    }

  3. #3
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 085
    Par défaut
    Juste une toute petite critique :

    Lorsque tu demande a l'utilisateur le nombre de chiffre qu'il compte saisir, tu utilise une boucle while. Comme la condition d'une boucle while se verifie au debut, tu est obligé de faire un scanf avant le while. Dans le cas ou l'utilisateur s'est trompé, tu fais un scanf dans le while, tu as donc deux scanf.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	printf("Donnez le nombre de valeurs : ");
    	scanf("%d",&N);
    	while(N<=0 || N>100)
    	{
    		printf("Retapez svp ! 0< nombre <100 : ");
    		scanf("%d",&N);
    	}
    Semantiquement parlant, ceci peut etre remis en question.
    Il aurait mieux value utilisé une boucle do while.
    En effet, ce qui differencie une boucle while d'une boucle do while, c'est le moment ou l'on verifie la condition.

    la condition d'une boucle while se verifie au debut, alors qu'une boucle do while verifie la condition a la fin.
    En d'autre terme, la boucle do while est parcouru au moins une fois (puisque verifie a la fin et non au debut), contrairement a while qui peut ne pas etre parcourue du tout.

    Dans ce cas, il faut se poser la question : "l'utilisateur va t'il obligatoirement saisir au moins une fois le nombre de chiffre qu'il veut rentrer ?"
    Si oui, boucle do while, sinon boucle while.

    Ici, il aurai donc fallu utilisé une boucle do while.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	printf("Donnez le nombre de valeurs : ");
    	scanf("%d",&N);
    	while(N<=0 || N>100)
    	{
    		printf("Retapez svp ! 0< nombre <100 : ");
    		scanf("%d",&N);
    	}
    devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	do
    	{
    	        printf("Donnez le nombre de valeurs compris entre 0 et 100 exclu : ");
    	        scanf("%d",&N);
     
                    if (N<=0 || N>100)
    		       printf("Retapez svp ! 0< nombre <100 ");
     
    	}while(N<=0 || N>100);
    L'avantage est tres mince, on gagne juste un scanf.
    C'est plutot sur le plan du sens que l'on gagne.

    Après, il y a toujours l'exception qui confirme la regle.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    Citation Envoyé par fredremy68 Voir le message
    Salut,

    Tu fais un define N 100, pusi tu demandes N à l'utilisateur...

    Enlèves le #define N 100 et ajoutes un int N dans le main et ce sera bon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # include <stdio.h>
     
    void main()
    {
    	int i,N,T[N],P=0,n=0;
    	printf("Donnez le nombre de valeurs : ");
    	scanf("%d",&N);
    	<snip>
    Déclarer un tableau de taille variable ne marche qu'en C99, et je pense qu'il faut initialiser ladite taille AVANT la déclaration du tableau...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 8
    Par défaut
    A la vue de ta solution tu ne respecte pas l'énoncé de l'exercice qui précise que l'utilisateur doit pouvoir entrer autant de valeur qu'il le souhaite. Pourquoi le limiter à 100 valeurs alors que l'allocation dynamique a été inventée pour pallier ce problème.
    Deuxièmement ce serait pas mal de vérifier le retour de la fonction scanf avant de vérifier si N est compris dans l'intervalle ]0;100[.
    Troisièmement l'utilité n'est pas vitale mais l'énoncé le demande donc dans un soucis de lisibilité il vaut mieux séparer la partie où l'on remplit le tableau et la partie où tu vérifie si le contenu de chaque cellule est un nombre positif ou négatif. Autrement n'utilise pas de tableau ... .

    Par conséquent ton programme deviendrait :

    n <- nombre de valeurs que l'utilisateur veut entrer (obtenu grâce à scanf par exemple)
    Allouer un tableau d'entiers signés de taille n.
    Stocker une à une les valeurs entrées par l'utilisateur.
    Tester le signe des valeurs du tableau et incrémenter en conséquence les variables contenant le nombres de nombres positifs et de nombre négatifs.

    Dans le cas où on utiliserait pas de tableau (hors énoncé mais interessant puisque la complexité mémoire deviendrait constante) :

    n <- nombre de valeurs que l'utilisateur veut entrer (obtenu grâce à scanf par exemple)
    current <- Prends à chaque tour la valeur entrée par l'utilisateur
    tester le signe de current: agir en conséquence.

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 59
    Par défaut
    Merci également pour les informations
    mais dans ma probléme je doit déclarer un tableau avec une taille const
    comment puis-je redimensionner le tableau

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    Tu dois l'allouer entièrement dynamiquement. Utilise la fonction malloc() pour ça.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 59
    Par défaut
    merciiiiiiiiii

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mais pourquoi ... Avec IE les tableaux sont décentrés ?
    Par nebule dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 26/11/2004, 11h04
  2. Article sur les tableaux dynamiques
    Par Eric Sigoillot dans le forum Langage
    Réponses: 2
    Dernier message: 16/04/2004, 23h00
  3. Réponses: 14
    Dernier message: 01/09/2003, 23h46
  4. Les tableaux en PL/SQL
    Par GRUMLY dans le forum PL/SQL
    Réponses: 5
    Dernier message: 12/08/2002, 19h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo