Inscription / Connexion Nouveau Sujet
Niveau algorithmique
Partager :

programmation

Posté par
Rana
06-04-17 à 18:29

Bonsoir , quelqu'un peut il m'aider ?
Ecrire un programme C qui lit une séquence d'entiers. La lecture se termine lorsque la somme des deux derniers entiers lus est égale à la moyenne de tous les entiers lus jusqu'à maintenant. Le programme affiche les deux derniers entiers lus.  Exemple:  
\begin{vmatrix} sequence & affichage\\ 6,0,3 &0,3 \\ 0,3,9,3,1,2,2& 2,2 \end{vmatrix}

j'ai essaye de faire cela mais apres avoir entrer la serie 6,0,3 rien n'apparait sur l'ecran.


#include<stdio.h>
void main(){
int nb1,nb2,compteur=1;
float moyenne ,somme2=0,somme=0;
do{printf("veiller entrer une serie d'entiers");
scanf("%d",&nb1);
compteur++;
scanf("%d",&nb2);
compteur++;
somme2=nb1+nb2;
somme+=nb1+nb2;
moyenne=(1.0)*somme/compteur;
}while(moyenne!=somme2);
printf("affichage est %d,%d",nb2,nb1);
getchar();
}

merci d'avance

Posté par
mathafou Moderateur
re : programmation 06-04-17 à 18:43

Bonjour,

déja dans ta boucle tu entres les données par paires (les deux scanf)
donc ça ne pourra pas marcher si le nombre de données de la série est un nombre impair.

une fois ce problème de principe réglé (il faut entrer les données une par une)
il faudra gérer le fait que on ne peut pas calculer la somme des deux derniers termes tant que on n'en a pas encore entré au moins deux !
une solution est la saisie de la première valeur en dehors de la boucle.
et un décalage des valeurs (nb1 -> nb2 et nouvelle valeur dans nb2)

Posté par
mathafou Moderateur
re : programmation 06-04-17 à 18:44

* et nouvelle valeur dans nb1 bien sur.

Posté par
Rana
re : programmation 06-04-17 à 18:49

bon j'ai essaye ca a marcher comme vous dite . Merci
mais pourquoi dans mon scanf  il y a juste les entiers paires??

Posté par
mathafou Moderateur
re : programmation 06-04-17 à 18:55

tu as deux scanf par boucle
tu fais forcément un nombre entier de boucles
donc tu demandes un nombre pair de données
(pas "des entiers pairs" , un nombre pair de valeurs ; 4 valeurs, 6 valeurs, 238 valeurs)
si ta série ne comporte que 3 valeurs le programme que tu avais écrit en attend une 4ème et ne sort effectivement rien puisqu'il attend que tu lui donnes cette 4ème valeur !

Posté par
Rana
re : programmation 06-04-17 à 18:57

okk
merci beaucoupp!!

Posté par
mathafou Moderateur
re : programmation 06-04-17 à 19:02


l'algorithme correct est

entrer nb2 (un seul scanf)
nb2 dans la somme générale
répéter
| nb2 --> nb1
| entrer nb2 (un seul scanf dans la boucle)
| cumul de ce seul nb2 dans la somme générale et calcul de la moyenne
tant que nb1+nb2 != la moyenne

sortie : nb1 et nb2

Posté par
Rana
re : programmation 06-04-17 à 19:05

mercii!!

Posté par
bbomaths
re : programmation 06-04-17 à 19:42

Bonsoir, une proposition :

#include<stdio.h>
int main()
{
int nb1 = 0, nb2 = 0, compteur = 0 ;
float somme = 0.0 ;
float moyenne = 0.0 ;

printf("veuillez entrer une serie d'entiers\n") ;

while (1)
{
nb1 = nb2 ;

scanf("%d", &nb2) ;

compteur++ ;

somme += nb2 ;

moyenne = somme / compteur ;

if ((compteur > 1) && (moyenne == nb1 + nb2))

break ;
}

printf("affichage est %d, %d", nb1, nb2);

// getchar();
return(0) ;
}

Posté par
Rana
re : programmation 06-04-17 à 19:51

Merci bbomaths pour la 2eme methode.

Posté par
mathafou Moderateur
re : programmation 06-04-17 à 20:00

"j'aime" pas les break dans une boucle while (true)
ni faire un truc différent (if compteur > 1) dans les différentes exécutions d'une boucle

mais c'est un goût personnel et "on peut".
le principal est que :
ça marche
ce soit compréhensible 5 ans après.

l'avantage est ici qu'il n'y a qu'un seul scanf écrit dans le programme
donc si on veut remplacer le scanf par un autre moyen d'entrer les données (récupération de données préexistantes dans un tableau par exemple) il n'y aura qu'une seule ligne à modifier.

Posté par
bbomaths
re : programmation 07-04-17 à 08:24

Mathafou, bonjour.

Vous seriez peut-être malheureux en Perl.

En C, on trouve des instructions comme break et continue pour contrôler l'exécution d'une boucle.

En Perl, on trouve last (= break), next (= continue) et redo. Cette dernière instruction permet de "revenir" au début d'une boucle (itération courante) donc de revenir en "arrière" dans son code...

En Python, on trouve des boucles while-else où le code du bloc d'instruction qui suit le else est exécuté si aucune instruction break n'a été exécutée dans la boucle while .

Chaque langage a ses particularités, ses avantages et ses inconvénients. Il faut savoir en jouer mais pas en abuser.

Le plus important comme vous l'avez souligné est qu'un programme quelque soit le langage utilisé (de l'assembleur au langage de haut niveau) :

> fonctionne, c'est à dire qu'on l'a testé en large et en travers en allant vérifier tous les cas tordus possibles,

> qu'il soit "lisible" par un autre programmeur (avec surtout les commentaires qui vont bien)

> qu'il soit maintenable.

Posté par
mathafou Moderateur
re : programmation 07-04-17 à 10:20

je n'ai pas dit qu'il ne fallait pas utiliser !
surtout en concluant sur un avantage de cette écriture !
mais comme tu le dis "en jouer mais pas en abuser"

(pour info je connais le perl et le pratique à l'occasion et mes programme y sont truffé de ruptures de boucle ainsi)



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 !