Inscription / Connexion Nouveau Sujet
Niveau algorithmique
Partager :

Somme et Min

Posté par
smir
17-07-14 à 08:27

Bonjour, je veux encore vérifier mon programme en C avec vous. Les deux questions sont indépendantes:

1°/ Ecrire un programme en langage C appelé Somme qui utilise une boucle pour calculer la somme des entiers positifs données par l'utilisateur. La boucle se termine quand l'utilisateur donne un entier négatif. La somme calculée est affichée par la suite.

2°/ Ecrire un programme en langage C appelé Minimum qui utilise une boucle pour calculer le minimum des entiers positifs données par l'utilisateur. La boucle se termine quand l'utilisateur donne un entier négatif. Le minimum calculé est affiché par la suite.

Pour 1°/ voici mon résultat:

#include <stdio.h>
#include <conio.h>
int main()
{
int val, som=0;
printf("donnez un entier positif pour continuer ou négatif pour s'arreter");
scanf("%d",&val);
while(val>0)
{som=som+val;
printf("donnez un entier positif pour continuer ou négatif pour s'arreter");
scanf("%d",&val);
}
printf(" la somme des nombres entiers positifs est %d", som);
getch ();
return 0;
}

Posté par
carpediem
re : Somme et Min 17-07-14 à 13:34

salut

0 est positif et négatif ....

tu répètes deux fois les mêmes instructions ... on peut faire mieux en réordonnant les choses ...

je ne connais pas c donc je te fais un algorithme

Begin
s = 0
a = 1
while not(a < 0) do
  Read (a)
  s = s + a
Write s
End

...

Posté par
smir
re : Somme et Min 17-07-14 à 17:54

Je ne comprends pas ton algo est ce que vous pouvez etre plus clair car mon programme c'est en C

Posté par
J-P Posteur d'énigmes
re : Somme et Min 17-07-14 à 18:14

L'algo de carpediem ne convient pas, me semble-t-il.

Par exemple :

Si on entre un nombre négatif ... il est comptabilisé dans la somme

De plus, on a du mal à comprendre de qui est inclus dans la boucle Write.

Posté par
carpediem
re : Somme et Min 17-07-14 à 18:15

hé ben c'est bien triste si tu ne le comprends pas ...

mais en fait il ne va pas ....

Begin
s = 0
Read a
while a >= 0
  s = s + a
  Read a
Print s
End

....

Posté par
carpediem
re : Somme et Min 17-07-14 à 18:16

oui j'ai vu lafol ...

dans la boucle While il y a les deux instructions indentées suivantes ....

Posté par
smir
re : Somme et Min 17-07-14 à 18:57

J'ai ceci:Mais je voudrais savoir est ce qu'on peut réécrire le programme sans utiliser les conditions if et else

# include < stdio.h >
int main( )
{
int som , v ;
som = 0 ;
printf( " Donnez un entier positif pour continuer ou négatif pour quitter : " ) ; scanf( "%d" , &v ) ;
if ( v < 0 )
{
printf( " Fin ! Vous n'avez pas donné de nombre positif  " ) ;
}
else
{
do
{
som = som + v ;
printf( " Donnez un entier positif pour continuer ou négatif pour quitter : " ) ; scanf( "%d" , &v ) ;
}
while ( v >= 0 ) ;
printf( " La somme des entiers positifs donnés est   %d " , som ) ;
}
fflush( stdin ) ; getchar( ) ;
return 0 ;
}

Que pensez aussi de la partie 2 (le minimum); j'ai du mal à commencer

Posté par
J-P Posteur d'énigmes
re : Somme et Min 17-07-14 à 18:58

C'est un tout autre algo...

Identique, cette-fois (dans l'esprit), à celui donné par Smir ... à un détail près.

Soit on comprend le mot "négatif" comme n'importe quel "Monsieur tout le monde" ou comme n'importe quel mathémacien non européen occidental ou Anglo-Saxon et ... c'est l'algo de smir qui convient.

Soit on comprend le mot "négatif" comme un mathémacien européen occidental non Anglo-Saxon et ... c'est l'algo de carpediem qui convient.

Je n'entre pas dans la polémique pour voir si 0 est à la fois positif et négatif (comme pour uniquement les matheux européens occidentaux non anglo-saxon) ou bien si 0 est tout simplement 0, ni positif, ni négatif (comme pour tout le monde sauf les matheux européens occidentaux non anglo-saxons)

Posté par
J-P Posteur d'énigmes
re : Somme et Min 17-07-14 à 19:01

Dans le message ci-dessus, l'algo de Smir dont je parlais était celui de son message initial.
... dont le seul problème potentiel est issus du scanf, qui laisse trainer un "retour chariot" parasite qu'il faut supprimer.

Posté par
smir
re : Somme et Min 17-07-14 à 22:23

Bonsoir, voici mon programme pour le minimum. Mais le problème est que si je prends par exemple 8 et 6
on m'affiche que le minimum est 8. Pouvez-vous m'aider:
#include<stdio.h>
#include<stdio.h>
int main()
{
    int val,min=0;
printf("donner un entier positif pour continuer ou negatif pour finir\n");
scanf("%d",&val);
while(val>=0)
{
min=val;
printf("donner un entier positif pour continuer ou negatif pour finir\n");
scanf("%d",&val);
}
printf("la minimum des nbres entiers positifs est %d",min);
getch ();
return 0;
}


Je rappel la question

2°/ Ecrire un programme en langage C appelé Minimum qui utilise une boucle pour calculer le minimum des entiers positifs données par l'utilisateur. La boucle se termine quand l'utilisateur donne un entier négatif. Le minimum calculé est affiché par la suite.

  

Posté par
Razes
re : Somme et Min 18-07-14 à 05:56

Bonsoir Smir, Bonsoir tout le monde,

Si je peux me permettre de te donne ces conseils:
- Donne à tes paramètres des noms compréhensible afin de faciliter la lecture par autrui et toi aussi, (et les documenter avec des commentaires) car il y a des gens qui n'arrivent pas à relire leur propres programmes. Tout cela ne change en rien les performance de ton programme.

- Utilise l'indentation afin que les niveaux et structures de ton programme soient visibles, cela te permettra de le comparer rapidement avec ton algorithme.

- Il faudrait que tu fasse de l'algorithmique, sinon tu risque de perdre du temps, l'avantage est que tu pourrais communiquer dessus avec quiconque car c'est en langage parlé. C'est vrai que pour des petit bouts de programmes comme ces deux là ça peut sembler pas nécessaire mais détrompe toi car, je constate que tu ne sais pas lire les algo, celui de carpediem est bon mais in English, dont ci-après la transcription en français:

DEBUT
VARIABLES
     s = 0
     AFFICHER("Donnez un entier positif pour continuer ou négatif pour s'arrêter")
     LIRE(a)
     TANT-QUE a >= 0 FAIRE
          s = s + a
          AFFICHER("Donnez un entier positif pour continuer ou négatif pour s'arrêter")
          LIRE(a)
     FIN DE TANT-QUE
     AFFICHER(s)
FIN


Je reviens à ton programme, il est bon, seulement il y avait un oubli d'initialisation du paramètre Valeur dont l'interprétation dans le test de l'instruction while peut te faire des surprises.

J'ai corrigé et cela donne:
#include <stdio.h>
#include <conio.h>
int main() {
     int Valeur = 0, Somme = 0; /* initialisation à zéro des deux paramètres */
     printf("Donnez un entier positif pour continuer ou négatif pour s'arrêter\n");
     scanf("%d", &Valeur);
     while (Valeur >=0) {      /*J'ai mis >=0 afin de permettre au programme de démarrer*/
         Somme += Valeur;  /* plus esthétique que Somme = Somme + Valeur;  */
         printf("Donnez un entier positif pour continuer ou négatif pour s'arrêter\n");
         scanf("%d",&Valeur);
     }  /* FIN DE WHILE */
     printf("La somme des nombres entiers positifs est %d\n", Somme);
     getch ();
     return 0;
}



Et comme je te l'avais expliqué dans un précédent post, tu peux utiliser la boucle REPETER ...TANT-QUE qui va nous économiser deux lignes, dont voici le programme.
#include <stdio.h>
#include <conio.h>
int main() {
     int Valeur = 0, Somme = 0; /* initialisation à zéro des deux paramètres */
     do {
        Somme += Valeur;  /* plus esthétique que Somme = Somme + Valeur;  */
        printf("Donnez un entier positif pour continuer ou négatif pour s'arrêter");
        scanf("%d",&Valeur);
     } while (Valeur >=0) ;
     printf("La somme des nombres entiers positifs est %d", Somme);
     getch ();
     return 0;
}

Posté par
Razes
re : Somme et Min 18-07-14 à 05:59

Regarde la structure du programme et celle de l'algorithme.

Pour la deuxième variante, tu peux rajouter \n à la fin des lignes printf

Posté par
Razes
re : Somme et Min 18-07-14 à 06:01

Je n'ai pas tester les programmes, je te laisse le soin de le faire.

Posté par
Razes
re : Somme et Min 18-07-14 à 06:16

Pour le deuxième programme, il y a des erreurs:

#include<stdio.h> écrite deux fois
Manque l'initialisation d'un paramètre
Comment trouve tu le minimum? car je ne vois aucune instruction qui fait cela

Posté par
J-P Posteur d'énigmes
re : Somme et Min 18-07-14 à 07:47

Razes,

L'initiation de la variable "Valeur" à 0 est inutile ...
Une telle initiation n'est pas obligatoire en C et la variable Valeur est entrée par le scanf de la 3eme ligne de la procédure main() écrasant de toute manière celle qui aurait été initialisée en 1ere ligne.

Posté par
smir
re : Somme et Min 18-07-14 à 07:47

Merci Razes, surtout pour les conseils
Voici mon programme rectifié pour le minimum

#include<stdio.h>
#include <conio.h>

int main()
{
int val,min;
printf("donner un entier positif pour continuer ou negatif pour finir\n");
scanf("%d",&val);
if(val<0)
{
printf("vous devez donner un nombre positif pour continuer\n");
scanf("%d",&val);
}

while(val>=0)
{
            
             if(val<min)
             {
min=val;
}
printf("donner un entier positif pour continuer ou negatif pour finir\n");
scanf("%d",&val);
}
printf("le minimum des nbres entiers positifs est %d",min);
getch ();
return 0;
}

Posté par
J-P Posteur d'énigmes
re : Somme et Min 18-07-14 à 07:50

Razes,

Ma remarque ci-dessus concerne le programme qui suit ton :

"J'ai corrigé et cela donne:
..."

Posté par
Razes
re : Somme et Min 18-07-14 à 14:09

@J-P
Effectivement, comme je l'avais écris le programme de smir, ne nécessitait pas de modification, j'ai glissé cette phrase par erreur en pensant à la variante FAIRE...TANT-QUE.

@smir
Ton 2ème programme est bon, seul un point me chiffonne, si on saisit 2 fois un nombre négatif, le programme sortira du if et du while et va procéder à l'affichage du min qui n'est même pas initialisé.

Posté par
Razes
re : Somme et Min 18-07-14 à 14:24

@smir
Lors de la comparaison if(val<min) tu n'a pas d'initialisation de min donc la comparaison donnera des résultats inattendus.

Posté par
Razes
re : Somme et Min 18-07-14 à 14:38




#include<stdio.h>
#include <conio.h>

int main() {
        int val, min;
        printf("Donner un entier positif pour continuer ou négatif pour finir\n");
        scanf("%d",&val);
        if(val<0)  {
               printf("vous avez saisi un nombre négatif, arrêt du programme.\n");
        } else {
               min=val /* initialisation de min */
               while(val>=0) {
                   if(val<min)    {
                      min=val;
                   }
                   printf("donner un entier positif pour continuer ou negatif pour finir\n");
                   scanf("%d",&val);
                } /* FIN DE WHILE */
             printf("le minimum des nbres entiers positifs est %d",min);
             getch ();
        } /* FIN IF ELSE */
        return 0;
}


De plus le langage C te permet certaines écritures qui condensent les lignes, on peut écrire:
min = val>min ? min : val;

au lieu de

if(val<min) {
   min=val;
}

Posté par
smir
re : Somme et Min 18-07-14 à 14:40

C'est vrai quand je saisi 2 nombres négatifs il m'affiche un minimum. Comment faire donc

Posté par
Razes
re : Somme et Min 18-07-14 à 20:53

As tu testé le programme 2?

Posté par
smir
re : Somme et Min 18-07-14 à 23:36

Oui je l'ai testé tout fonctionne parfaitement. Merci encore une fois.  

Posté par
Razes
re : Somme et Min 19-07-14 à 00:17

C'était un plaisir.



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !