programme informatique
Répondre à la discussion
Affichage des résultats 1 à 18 sur 18

programme informatique



  1. #1
    invite07740c67

    programme informatique


    ------

    bonjour,
    je suis une etudiante entre deux années et je reprends les cours d'informatique des L2 de l'année suivante tout en sachant ne pas passer les examens... j'ai fait des recherches sur le langages C(j'ai du mal mais j'aime faire des programmes) et j'essaie de comprendre le fonctionnement d'un programme qu'un ami m'a fait partagé après un cours...
    celui-çi permet de factoriser un niombre en deux nombres premis, le voici:

    "#include <stdlib.h>
    #include <stdio.h>
    #include <windows.h>
    void main(){
    int nb, i,total=1, j;

    printf("tapez un nombre...");
    scanf("%d", &nb);
    for(j=2;j<nb;j++){
    if(nb%j==0)
    break;
    else if(nb-j==1)
    printf("C'est un nombre premier");
    }
    while(total<nb){
    for(i=2;i<nb;i++){
    if(nb%i==0){

    break;}
    }
    printf("%d*", i);
    total=total*i;
    nb=nb/i;


    }
    printf("%d\n", nb);
    printf("Fini !");
    Sleep(30000);
    }
    "

    je ne peux pas suivre les cours et je me repporte qu'aux notes de cet ami et sur ce coup j'avoue être completement perdue... enfin déjà mes premières questions:
    que veut dire "Break" et "Sleep"? je ne connais que les premieres fonctions de base: Do, while, for, if.... alors une petite explication s'impose, quel est le sens de break/sleep? y-a-t-il un moyene de les exprimer avec une commande plus claire(NMAX peut etre? if/else?? à moins que je n'ai pas bien compris grand chose... sinon pour le reste j'essaierai de comprendre la "logique du programme" sauf si quelqu'un de courageux se lance dans une explication, mais qu'il ne se casse pas la tête non plus, je m'interesse à cette matiere comme passe temps, ced n'est pas vraiment important... mais ça m'intrigue!!

    -----

  2. #2
    invite4492c379

    Re : programme informatique

    Citation Envoyé par kamelie17 Voir le message
    bonjour,
    je suis une etudiante entre deux années et je reprends les cours d'informatique des L2 de l'année suivante tout en sachant ne pas passer les examens... j'ai fait des recherches sur le langages C(j'ai du mal mais j'aime faire des programmes) et j'essaie de comprendre le fonctionnement d'un programme qu'un ami m'a fait partagé après un cours...
    celui-çi permet de factoriser un niombre en deux nombres premis, le voici:
    Hello,

    indentons déjà le code :

    Code:
    #include <stdlib.h>
    #include <stdio.h>
    #include <windows.h>
    
    void main(){
        int nb, i,total=1, j;
    
        printf("tapez un nombre...");
        scanf("%d", &nb);
    
        for(j=2;j<nb;j++){
            if(nb%j==0)
                break;
            else if(nb-j==1)
                printf("C'est un nombre premier");
        }
    
        while(total<nb){
            for(i=2;i<nb;i++){
                if(nb%i==0){            
                    break;
                }
            }
            printf("%d*", i);
            total=total*i;
            nb=nb/i;
        }
        printf("%d\n", nb);
        printf("Fini !");
        Sleep(30000);
    }
    Citation Envoyé par kamelie17 Voir le message
    je ne peux pas suivre les cours et je me repporte qu'aux notes de cet ami et sur ce coup j'avoue être completement perdue... enfin déjà mes premières questions:
    que veut dire "Break" et "Sleep"? je ne connais que les premieres fonctions de base: Do, while, for, if.... alors une petite explication s'impose, quel est le sens de break/sleep? y-a-t-il un moyene de les exprimer avec une commande plus claire(NMAX peut etre? if/else?? à moins que je n'ai pas bien compris grand chose... sinon pour le reste j'essaierai de comprendre la "logique du programme" sauf si quelqu'un de courageux se lance dans une explication, mais qu'il ne se casse pas la tête non plus, je m'interesse à cette matiere comme passe temps, ced n'est pas vraiment important... mais ça m'intrigue!!
    break est une instruction C qui fait sortir d'une boucle. Par exemple dans le programme on a :
    Code:
        for(j=2;j<nb;j++){
            if(nb%j==0)
                break;
            else if(nb-j==1)
                printf("C'est un nombre premier");
        }
    on sort de la boucle for si jdevient égal à nb ou dès que j divise nb. C'est une sorte de «goto à la première instruction qui suit la boucle for». Idem dans la boucle while qui suit.

    Sleep est une fonction (sous environnement windows) qui ne fait rien sinon attendre le temps passé en paramètre (exprimé en ms). Ici Sleep(30000) provoque une pause de 30s.

    Quant à la logique du programme ...

    Code:
        for(j=2;j<nb;j++){
            if(nb%j==0)
                break;
            else if(nb-j==1)
                printf("C'est un nombre premier");
        }
    nb est le nombre entré par le user. On parcourt les nombres de 2 à nb-1. Si on en trouve un qui divise nb alors on sort du for (via l'instruction break). Sinon si on arrive à nb-1, cela signifie qu'on a trouvé aucun diviseur pour nb, donc celui-si est premier et on l'affiche.

    Code:
        while(total<nb){
            for(i=2;i<nb;i++){
                if(nb%i==0){            
                    break;
                }
            }
            printf("%d*", i);
            total=total*i;
            nb=nb/i;
        }
        printf("%d\n", nb);
    Dans cette double boucle on va décomposer nb en ses facteurs premiers. Total représente le produit des facteurs déjà trouvé et nb le nombre qu'il reste à décomposer. La boucle cherche un facteur premier de nb entre 2 et nb-1.

    ce code ne fonctionnera que sous un machine windows à cause de l'include windows.h et de Sleep. Sous unix, il faudrait inclure unistd.h et sleep demanderait un temps exprimé en secondes ...

    voilà ...

  3. #3
    invite07740c67

    Re : programme informatique

    je crois que heu... ce n'est pas du tout ça =.=" (l'explication est surement très bien mais c'est moi qui ai du mal...) je vais essayer de refaire ce programme à ma sauce et on verra x( je comprends l'idée mais la façon dont c'est présenté je m'embrouille o_@

  4. #4
    invite4492c379

    Re : programme informatique

    Tu as bien raison ... le programme n'est pas forcément bien pensé ...
    Je ne peux que te recommander d'écrire d´abord un algorithme avant de te lancer tête première dans le codage ...

    Quel environnement utilises-tu ?

  5. A voir en vidéo sur Futura
  6. #5
    invite07740c67

    Re : programme informatique

    sous linux, gedit et terminal. j'ai encore du mal avec l'encodage(peu d'experience et peu de temps)

    mon alogo...
    1) tester si nombre tapé noté ici "nb" premier:

    print f("taper entier");
    scan f("%d",& nb);
    premier=1;
    for(diviseur=2;diviseur>nb;div iseur++){

    là jvois pas comment on verifie que le reste est nul...

    2) s'il nb non premier,
    decomposer nb tel que n/j=k
    j inferieur à nb et superieur ou egal à 2
    verifier si k entier, alors continuer...

    3)si k entier, on verifie si k premier=> si k premier, afficher nb=k*j

  7. #6
    invite4492c379

    Re : programme informatique

    Citation Envoyé par kamelie17 Voir le message
    sous linux, gedit et terminal. j'ai encore du mal avec l'encodage(peu d'experience et peu de temps)

    mon alogo...
    1) tester si nombre tapé noté ici "nb" premier:

    print f("taper entier");
    scan f("%d",& nb);
    premier=1;
    for(diviseur=2;diviseur>nb;div iseur++){

    là jvois pas comment on verifie que le reste est nul...
    l'opérateur % est ce qu'il te faut :

    a % b renvoie le reste de la division de a par b.

    remarque: tu n'es pas obligée de parcourrir tous les entiers de 2 à nb ... aucun diviseur de nb (s'il y en a) ne peut être supérieur à nb/2

    Citation Envoyé par kamelie17 Voir le message
    2) s'il nb non premier,
    decomposer nb tel que n/j=k
    j inferieur à nb et superieur ou egal à 2
    verifier si k entier, alors continuer...

    3)si k entier, on verifie si k premier=> si k premier, afficher nb=k*j
    que penses-tu de l'idée suivante :


    Code:
    j'ai le nombre à décomposer dans nb
    je commence à tester la divisibilité avec j=2
    tant que j est plus petit ou égal à nb
        tant que j divise nb
            afficher j
            nb devient égal a nb/j
        fin tant que
        j devient égal à j+1
    fin tant que

  8. #7
    invite07740c67

    Re : programme informatique

    j'ai le nombre à décomposer dans nb
    -je commence à tester la divisibilité avec j=2
    tant que j est plus petit ou égal à nb
    - tant que j divise nb
    afficher j
    nb devient égal a nb/j
    fin tant que
    j devient égal à j+1
    fin tant que.

    ha je ne comprends pas vraiment je suis désolée, et nb(=nb/j) doit etre premier, j aussi... aie aie je crois que je ferais ça en journée x)

    ma logique après lecture de votre message:
    1)verifier si nb premier...
    2) diviser nb par j (egal ou superieur à 2 et inferieur à nb)
    continuer pour j premier...
    3) soit nb2 = nb/j
    si nb2 premier afficher: nb2*j=nb

  9. #8
    invite4492c379

    Re : programme informatique

    Citation Envoyé par kamelie17 Voir le message
    j'ai le nombre à décomposer dans nb
    -je commence à tester la divisibilité avec j=2
    tant que j est plus petit ou égal à nb
    - tant que j divise nb
    afficher j
    nb devient égal a nb/j
    fin tant que
    j devient égal à j+1
    fin tant que.

    ha je ne comprends pas vraiment je suis désolée, et nb(=nb/j) doit etre premier, j aussi... aie aie je crois que je ferais ça en journée x)

    ma logique après lecture de votre message:
    1)verifier si nb premier...
    2) diviser nb par j (egal ou superieur à 2 et inferieur à nb)
    continuer pour j premier...
    3) soit nb2 = nb/j
    si nb2 premier afficher: nb2*j=nb
    En fait on oublie le premier jet de ton ami car il n'est pas nécessaire de vérifier si nb est premier. En effet, on peut le savoir avec la deuxième boucle, nb sera premier ssi on ne lui trouve aucun diviseur entre 2 et nb/2.

    Le but de cet algorithme est de trouver la décomposition en facteurs premiers d'un nombre sans avoir à calculer une liste de nombres premiers au préalable.

    Tous les j qui seront affichés seront obligatoirement premiers. En effet, imaginons que l'on ait un j tel que j divise nb et j ne soit pas premier. Alors il existe forcément un nombre j' qui divise j. On aurait forcément j'<j et j'|nb. Ce j' a déjà été traité (car j'<j) et comme j'|nb on entre dans le second tant que. Or à la sortie du second tant que on est sûr que nb n'est plus divisible par j'. C'est donc impossible, donc tous les j affichés seront des nombres premiers.

    Parcourir tous les entiers n'est pas forcément très optimisé. On pourrait créer un algo qui traite le cas 2, puis qui ne parcourt que les impairs plus grands que 3, voir même uniquement les entiers de la forme après avoir traité les cas 2 et 3 à part (tu vois pourquoi ?).

  10. #9
    invite07740c67

    Re : programme informatique

    int premier;
    int j;
    premier=1;
    for(diviseur=2; diviseur<nb; diviseur++){
    premier=0;}


    voilà ma commande pour tester si j est premier, on fait la même chose pour k

    int premier;
    int k;
    premier=1;
    for(diviseur=2; diviseur<nb; diviseur++){
    premier=0;}

    maintenant il faut que je fasse mon p"tit puzzle je pense, mais est-ce qu cette commande qui permet de verifier si j et k sont premiers est juste?

  11. #10
    invite07740c67

    Re : programme informatique

    int premier;
    int j;
    premier=1;
    for(diviseur=2; diviseur<nb; diviseur++){
    if(n%diviseur==0){
    premier=0;}

    désolée j'avais oublié de taper une ligne.

  12. #11
    invite4492c379

    Re : programme informatique

    Re-,

    Tu n'as pas besoin de vérifier que les facteurs trouvés sont premiers car ils le seront obligatoirement, relis mon post numéro 8.

    Un truc très important : avant de bidouiller un source C, essaye de résoudre le problème à la main, écris un algorithme. Ce sera beaucoup plus simple à comprendre.

  13. #12
    invite07740c67

    Re : programme informatique

    bonsoir,
    excusez moi jn'avais pas vu votre posrt :S
    je ne comprends pas: on doit factoriser n'importe quel nombre en deux facteurs premiers... pourquoi ces facteurs seraient toujours premiers? ils peuvent etre n'importe quel nombre non?

  14. #13
    invite4492c379

    Re : programme informatique

    Non, c'est juste un début de preuve. L'algorithme proposé ne peut que produire des facteurs premiers.

  15. #14
    invite07740c67

    Re : programme informatique

    bon j'ai un peu laisé tomber ce programme jvais m'entrainer sur des choses plus simples avant...


    d'abors, cette bouvle permettant de voir si j réel est premier est-elle bonne?

    parce que depuis tout à l'heur je publie des choses et personne ne me dit si j'ai faux dans le langage...

    soit:

    int premier;
    int j;
    j=premier;
    for(diviseur=2; diviseur<j; diviseur++){
    if(j%diviseur==0){
    premier=0} à
    }

  16. #15
    invite4492c379

    Re : programme informatique

    Citation Envoyé par kamelie17 Voir le message
    bon j'ai un peu laisé tomber ce programme jvais m'entrainer sur des choses plus simples avant...


    d'abors, cette bouvle permettant de voir si j réel est premier est-elle bonne?

    parce que depuis tout à l'heur je publie des choses et personne ne me dit si j'ai faux dans le langage...

    soit:

    int premier;
    int j;
    j=premier;
    for(diviseur=2; diviseur<j; diviseur++){
    if(j%diviseur==0){
    premier=0} à
    }
    c'est pas tout à fait ça ...
    j=premier et premier est non initialisé ... erreur
    la boucle est correcte si avant la boucle tu initialises premier à 1 et tu demandes une valeur pour j.


    Dis moi, si tu devis le faire à la main (par exemple vérifier si 17 est premier) comment t'y prendrais-tu ?

  17. #16
    invite07740c67

    Re : programme informatique

    argh les maths... dans la boucle premierveut dire j est un nombre premier pour... j'ai peut etre mal utilisé la chose...

    "
    int premier;
    int j;
    premier=1;
    for(diviseur=2; diviseur<j; diviseur++){
    if(j%diviseur==0){
    premier=0} à
    }
    "

    mais comment dire j est nombre premier si , j==nombre premier? (c'etait ça que jvoulais dire ici je n'avais pas pensé à l'initialisation de n diviseur en effet, jme suis embrouillée

  18. #17
    invite4492c379

    Re : programme informatique

    par défaut premier vaut 1
    si tu trouves un diviseur de j (ce qui signifie que j n'est pas premier), premier vaudra 0, si tu n'en trouves aucun (ce qui signifie que j est premier) il ne sera pas changé et vaudra 1.

    À la sortie de la boucle premier vaut 1 si j est premier, 0 sinon.

  19. #18
    invite2d7144a7

    Re : programme informatique

    Bonjour,

    Il faut porter un peu d'attention à ce que tu écris.

    Avec
    Code:
    int premier;
    int j;
    premier=1;
    c'est j qui n'est pas initialisé !

    Comme te l'a déjà dit photon57, écrit comment tu ferais à la main, en langage clair, AVANT de coder dans le langage de destination.

    Pisser du code sans savoir où on va est une pure perte de temps, tes problèmes avec les initialisations te le montrent d'ailleurs très bien, te rappelant également qu'on ne dois jamais utiliser une variable non initialisée.

Discussions similaires

  1. Programme informatique
    Par invite5da58089 dans le forum Programmation et langages, Algorithmique
    Réponses: 7
    Dernier message: 21/03/2011, 06h44
  2. programme informatique pour résoudre f(x)=0
    Par inviteb71d221c dans le forum Mathématiques du supérieur
    Réponses: 11
    Dernier message: 21/05/2009, 20h33
  3. Programme de bio-informatique
    Par invite6709e8d6 dans le forum Biologie
    Réponses: 9
    Dernier message: 08/01/2009, 15h35
  4. Programme DUT Informatique
    Par invitedae5e039 dans le forum Orientation après le BAC
    Réponses: 3
    Dernier message: 27/06/2008, 16h10