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 :

Déclaration et initialisation


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2018
    Messages : 4
    Points : 0
    Points
    0
    Par défaut Déclaration et initialisation
    Écrire un programme en c qui détermine si un nombre est parfait où pas

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    C'est marrant Les 2 définitions font peur

    Un nombre égal à la somme de ses diviseurs propres est parfait. Un diviseur propre est un diviseur autre que le nombre lui-même.
    Lorsque la somme d’une suite de nombres doubles les uns des autres est un nombre premier, il suffit de multiplier ce nombre par le dernier terme de cette somme pour obtenir un nombre parfait.
    L'exemple qui va bien :
    • 1+2=3 qui est premier donc 2x3=6 est parfait.
    • 1+2+4=7 qui est premier donc 4x7=28 est parfait.
    • 1+2+4+8=15 n’est pas premier.
    • 1+2+4+8+16=31 est premier donc 16x31=496 est parfait.


    Ensuite le bon Euclide a donné une formule :
    2^(p-1)*(2^p - 1) est parfait si p et (2^p - 1) sont premiers.
    Cela sert la récursion, une suite mathématiques

    Et là tu tombes sur :
    Les nombres parfaits sont rares, il n’en existe que trois inférieurs à 1000 qui sont 6, 28 et 496.
    Ensuite vient 8128, puis 33 550 336,
    8 589 869 056,
    137 438 691 328,
    2 305 843 008 139 952 128 (découvert par Leonhard Euler),
    2 658 455 991 569 831 744 654 692 615 953 842 176, …
    Donc cela se résume à 6 tests. C'est un programme de fou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        if ((nb == 6) || (nb == 28) || (nb == 496) || (nb == 8128) || (nb == 33550336) || (nb == 8589869056)) {
            printf("this is a perfect number\n");
        } else {
            printf("this is NOT a perfect number\n");
        }

    Source : Les nombres parfaits - sur le site "maths et tiques"

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2018
    Messages : 4
    Points : 0
    Points
    0
    Par défaut
    J'ai réussi à écrire l algorithme puis j'ai effectué la trace avec algobox ça fonctionne , le véritable problème c est lorsque je traduis en c ça donne pas le résultat attendu , je sais pas alors si j'ai mal initialiser ou pas où mal traduis

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2018
    Messages : 4
    Points : 0
    Points
    0
    Par défaut
    Si je souhaite que l'utilisateur entre un nombre
    Avant de déterminer s'il est parfait où pas j'ai ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Int main()
     Int c , nb,i
    Printf(" entrez un nombre\n");
    Scanf("%d",$nb);
    For(i==1; i<nb; i++)
      If(nb%i==0)
    C=c+1;
    If( c==nb)
    Printf(" il est parfait");
    Else
    Printf ("il n'est pas parfait");
     
    Return0;

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Écrire un programme en c qui détermine si un nombre est parfait où pas
    Vraiment ? Les formules de politesse, c'est bien quand on demande de l'aide : https://club.developpez.com/regles/#LIV-A

    Accessoirement, on n'est pas là pour faire votre travail : https://club.developpez.com/regles/#LIV-N

    J'ai réussi à écrire l algorithme puis j'ai effectué la trace avec algobox ça fonctionne , le véritable problème c est lorsque je traduis en c ça donne pas le résultat attendu , je sais pas alors si j'ai mal initialiser ou pas où mal traduis
    De plus, on n'est pas devin, sans code ni message d'erreur ni description du problème, on ne pourra pas vous aider : https://club.developpez.com/regles/#LIII-C

    Int main()
    Int c , nb,i
    Printf(" entrez un nombre\n");
    Scanf("%d",$nb);
    For(i==1; i<nb; i++)
    If(nb%i==0)
    C=c+1;
    If( c==nb)
    Printf(" il est parfait");
    Else
    Printf ("il n'est pas parfait");

    Return0;
    Ceci n'est pas du C...

    Pensez également à ceci pour poster du code ça permet de le rendre plus lisible : https://club.developpez.com/regles/#LIII-E

    On attend votre code avec les explications de ce qui ne va pas maintenant

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Cyrille motchiyo Voir le message
    Avant de déterminer s'il est parfait où pas j'ai ceci
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Int main()         // pas de majuscule à "int"
     Int c , nb,i                   // idem + manque l'accolade  
    Printf(" entrez un nombre\n");
    Scanf("%d",$nb);                   // $nb ??? tu te crois en shell ???
    For(i==1; i<nb; i++)               // i == 1 !!!!! Apprend à assigner une valeur à une variable (ou alors il s'agit vraiment d'une comparaison)...
      If(nb%i==0)
    C=c+1;                                  // La variable "C" n'a pas été initialisée. Ah non, en réalité elle n'existe même pas
    If( c==nb)
    Printf(" il est parfait");
    Else
    Printf ("il n'est pas parfait");
    
    Return0;                            // Pas d'accolade au début donc pas d'accolade à la fin. Au moins tu es cohérent avec toi-même
    Ton algorithme me semble un peu bizarre. Tu regardes si le nombre de diviseurs de "nb" vaut "nb" ce qui, mis à part pour "1" et "2", n'est pas possible (par exemple 48 n'a pas 48 diviseurs !!!) mais bon, ceci n'est pas une démonstration au sens mathématique du terme alors qui sait, peut-être qu'effectivement il existe un nombre "X" qui a "X" diviseurs
    Et euh... accessoirement tester la division par 1 me semble un peu inutile (je crois qu'il existe une légende qui dit que tous les nombres sont divisibles par 1).
    Sinon mes remarques en rouge dans ce canada-dry (ça ressemble à du C, son nom sonne comme un nom de prog C mais ce n'est pas du C).

    Et maintenant un conseil: découpe les taches. D'un côté le main() qui se chargera de faire saisir le nombre et d'afficher s'il est ou n'est pas parfait ; et de l'autre une fonction qui détermine si le nombre est ou n'est pas parfait. Ainsi tu pourras tester le main tout seul, puis la fonction toute seule, et quand les deux seront ok, tu pourras alors intégrer la fonction dans le main.

    Et aussi peut-être ouvrir un tutoriel de C parce que vu ton niveau...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2018
    Messages : 4
    Points : 0
    Points
    0
    Par défaut
    Merci , j'arrivais pas à formater le code source raison pour laquelle je l'ai écrit dans les commentaires
    Je tiens compte de toutes vos précisions

  8. #8
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Bonjour,

    C'est vrai que les lignes ressemblent à un mélange de langages. Il quand même reconnaître que c'est bien le C qui correspond le mieux à ces lignes. Ce qui nous a perturbé :
    - les majuscules et les minuscules sont importantes, en particulier tous tes mots de début de lignes doivent commencer par une minuscule.
    - les accolades servent à quelque chose. Elles ont toutes disparues dans ton code. Il manque au moins entre les lignes 1 et 2 et après la ligne 13.
    - les point-virgules servent à quelque chose. Il manque ligne 2.
    - pour prendre l'adresse d'une variable, il faut utiliser l'esperluette(&), pas le dollar($). Ligne 4.
    - le = et le == sont différent. A un moment tu utilises == au lieu de =. Ligne 5.
    - En C une variable doit être déclarée, et initialisée avant de pouvoir être utilisée. Ligne 7.
    - les espaces sont parfois nécessaires. Il en manque un ligne 13.

    Maintenant, pour revenir à l'algorithme lui-même, tu peux partir des commentaires de Sve@r.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Maintenant, pour revenir à l'algorithme lui-même, tu peux partir des commentaires de Sve@r.
    Si @Cyrille motchiyo veut coder l'algo le plus complètement, et non feinter comme je l'ai fait avec mes 6 tests , alors c'est nettement plus difficile :
    • il faut une fonction (fun_01, paramètre donnée : X) qui teste si un nombre X a comme multiple une puissance de 2 (A) (*) et retourne à la fois cette puissance N (A = 2^N) et B (B = (X / A))
    • il faut une fonction (fun_02, paramètre donnée : X) qui teste si un nombre X est premier ou pas
    • il faut une fonction (fun_03, paramètres donnée : X, N) qui teste si un nombre X est égal à la somme des N premières puissance de 2
    • (*) éventuellement, il faut une fonction (fun_04, paramètres donnée : X) qui teste si un nombre X est une puissance de 2. Il faut utiliser un logarithme binaire (<- lien wiki français). Et log2(X) = (ln(X) / ln(2))

    je ne donne pas les paramètres résultats des fonctions s'il y en a, ni les retours.

    Parce que l'algo final est :
    1. Tu appelles fun_01. Tu as 2 nombres B et N en cas de succès. Sinon l'algo s'arrête : le nombre n'est pas parfait.
    2. Tu appelles fun_02 pour vérifier que B est premier. Si ce n'est pas le cas, l'algo s'arrête : le nombre n'est pas parfait.
    3. Tu appelles fun_03 pour vérifier que B est égal à la somme des N premières puissance de 2. Si c'est le cas, le nombre est parfait.


    On peut simplifier fun_03 , parce que la somme des N premières puissance de 2 est égale à 2^(N + 1) - 1.
    Cette simplification t'évite une boucle avec une borne maximale.


    Édit 1 : les noms des fonctions sont mauvais, je ne me prends pas la tête sur cela ... par exemple fun_02 est is_a_prime_number

    Édit 2 : (À confirmer ) pour tester si un nombre X est premier (fun_02), il faut faire une boucle de 2 à sqrt(X) (peut-être faire un +1/ ceil pour la perte de la partie flottante) et tester pour chacun s'il n'est pas multiple (le reste de la division différent de 0)
    par exemple, 143 = 13 * 11 (sqrt(143) = 11.9582)

    Édit 3 : (*), je vois 2 approches , mais à prouver mathématiques
    • reprendre l'algo du test "nombre premier", mais avec les puissances de 2
    • prendre la moitié du logarithme binaire du nombre (peut-être avec +1). Parce que la formule d'Euclide nous montre une multiplication entre 2^N et 2^(N + 1) (2 puissances successives). Par exemple, log2(6) = 2.58496 -> 6 = 2 x 3 = 2^(floor( log2(6) ) / 2) x 3, log2(496) = 8.9542 -> 496 = 16 x 31 = 2^(floor( log2(496) ) / 2) x 31. Et avec le logarithme binaire, tu peux détecter que le nombre est une puissance de 2, et donc il n'est pas parfait.

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par foetus Voir le message
    Édit 2 : (À confirmer ) pour tester si un nombre X est premier (fun_02), il faut faire une boucle de 2 à sqrt(X) (peut-être faire un +1/ ceil pour la perte de la partie flottante) et tester pour chacun s'il n'est pas multiple (le reste de la division différent de 0)
    par exemple, 143 = 13 * 11 (sqrt(143) = 11.9582)
    Pas besoin de ceil(). S'arrêter à (int)sqrt(n) inclus suffit pour prouver "n" premier. S'il n'est pas premier on l'aura vu avant d'arriver au bout (et même pour 143 on le verra en testant 11). Et en testant les pairs à part, on peut alors monter de 2 en 2.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [XL-2013] Déclaration et Initialisation
    Par perouse07 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 08/11/2015, 10h28
  2. Déclaration et initialisation d'une variable
    Par micjal dans le forum Visual C++
    Réponses: 6
    Dernier message: 23/04/2014, 18h42
  3. Réponses: 18
    Dernier message: 26/01/2007, 22h18
  4. [VB.Net]Déclaration et initialisation d'une variable
    Par DonF dans le forum Windows Forms
    Réponses: 6
    Dernier message: 14/11/2006, 20h05
  5. déclaration et initialisation d'une matrice
    Par Gébix dans le forum C++
    Réponses: 5
    Dernier message: 16/02/2006, 01h22

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