CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Suites mathématiques

solidsquall
solidsquall
Niveau 8
07 décembre 2007 à 22:10:27

Salut,
je suis en train de réaliser des programmes informatiques dans le cadre d´un projet de programmation, mais voilà je bloque sur un programme, ce dernier ne marche pas sans que je sache pourquoi.

En fait mon programme doit calculer une suite (syracuse):
Un+1=Un/2 si Un est pair, sinon Un+1=3Un+1.
En fait les resultats que l´on trouvera à chaque fois sont Un= 4,2,1,4,2,1 etc...
En gros j´aimerai bien que mon programme s´arrête dès que Un a été égal deux fois à 1 (c´est à dire au bout de 4, 2, 1, 4, 2, 1.
Mais le truc c´est que Un à n´importe quel rang est toujours égal à 1, alors qu´il devrait valoir U1=4, U2=2, U3=1.
J´espère que j´ai bien expliqué mon problème, et je remercie déjà ceux qui ont pris la peine de lire mon post, et encore plus ceux qui prendront la peinde de m´aiguiller :-)
Mon programme est:

  1. include <stdio.h>
  2. include <stdlib.h>

int main ()
{
long U, n, cpt;

do
{
printf("Saisir un nombre entier, compris entre 1 et 500:");
fflush(stdin);
scanf("%ld", &U);
}while ((U<1)||(U>500));

n=0;
cpt=0;

do
{

if(U%2==0)
{
U=U/2;
}
else
{
U=3*U+1;
}

if(U=1)
{
n=n+1;
}

printf("\nU au rang %ld", cpt);
printf(" vaut: %ld", U);
cpt=cpt+1;
}
while (n<=2);

system("PAUSE");
return 0 ;
}

solidsquall
solidsquall
Niveau 8
07 décembre 2007 à 22:41:27

Désolé d´avoir pollué le forum avec ça, j´ai oublié un égal...
3h de perdues ^^

godrik
godrik
Niveau 30
07 décembre 2007 à 23:42:56

pas de soucis, ca arrive a tout le monde! :)

Neoknight
Neoknight
Niveau 10
08 décembre 2007 à 00:32:50

if(U=1)
{
n=n+1;
}

ça ne sert à rien

while (u>1); à la place revient au même et est mieux en terme d´optimisation

godrik
godrik
Niveau 30
08 décembre 2007 à 11:11:57

c´est pas clair, il veut le faire deux fois.
Et apres, je ne tiendrai pas de pari sur ce que fait ou non le compilateur.
Une remarque quand meme: La condition Un+1==1 ne peut etre vrai que si Un==2 donc que dans le cas Un%2 == 0, ce qui peut t´eviter un test sur deux.

Je n´ai pas bien compris pourquoi tu voulais voir Un==1 deux fois ?
De plus, ton test while (n <= 2); ne deviendra faux que lorsque n == 3. donc apres 3 incrementations de n (puisque n=0 au debut de ton code), ce qui ne semble pas etre ce que tu veux faire.

solidsquall
solidsquall
Niveau 8
08 décembre 2007 à 13:59:28

Oui, une petite erreur corrigée (n < 2);
En ce qui concerne Un deux fois égal à 1, c´est pour être sur que j´ai bien ma suite qui commence :)
http://img510.imageshack.us/img510/7691/sanstitrebb8.jpg

dnob700
dnob700
Niveau 10
09 décembre 2007 à 00:39:32

tu sais, si ça a été 1 une fois, le coup d´après ça va être 4, puis 2, puis 1. Donc dès que tu as vu 1 une fois, tu sais que tu l´aura une autre fois trois nombre plus tard. Donc tu pourrais t´arrêter dès que tu le vois pour la première fois.

solidsquall
solidsquall
Niveau 8
09 décembre 2007 à 10:23:18

Ouais j´ai repensé à ça hier soir, je l´ai modifié :ok:

DantePC
DantePC
Niveau 10
09 décembre 2007 à 19:57:11

fflush(stdin);

=> Malheur, ceci est absolument à éviter. Tu as un beau comportement indéterminé là, et c´est un bug très grave.

solidsquall
solidsquall
Niveau 8
09 décembre 2007 à 20:18:36

Mes profs de C m´ont dit de mettre ça avant chaque scanf pour nettoyer le cache du clavier :question:

DantePC
DantePC
Niveau 10
09 décembre 2007 à 20:50:07

Met leur une baffe de ma part et dis leur d´aller lire la norme une bonne fois pour toute. Le comportement de fflush n´est défini que pour les flux sortants, point barre. Donc pas de fflush(stdin);

Pour vider le buffer d´entrée de manière totalement standard, il est possible de faire ceci :

void cleanbuffer(void)
{
int c;
while ((c = getchar()) != ´\n´ && c != EOF)
{
}
}

kufa
kufa
Niveau 9
09 décembre 2007 à 21:50:38

Oui la norme ansi precise que fflush n est definie que pour les ouptut streams ou les update streams dont la derniere operation est une ecriture. Dans les cas contraires, il y a undefined behaviour.
Cela dit, rien n empeche une implementation d avoir un defined behaviour, comme c est le cas avec visual studio.

solidsquall
solidsquall
Niveau 8
10 décembre 2007 à 18:28:56

Ok, bah je vais corriger ça alors :)

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment