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 :

Explication pour un ProgrammeQuiAfficheLaPlusGdeLigne


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 25
    Par défaut Explication pour un ProgrammeQuiAfficheLaPlusGdeLigne
    Bonsoir tout le monde.
    Nouveau exo, nouvelles questions (désolée j'apprends le langage C toute seule avec un bouquin espagnol (et me demander pas pourquoi ^^)).
    Bref, voici un programme qui doit retourner une ligne saisie par l'utilisateur, celle-ci devant être la plus grande qu'il y a été saisie.

    Ca nous donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #include <stdio.h>
    #define MAXLINE 1000 //Taille maximùun de la ligne entree
    int getline(char line[], int maxline);
    void copy(char to[], char from[]);
     
    //Imprime la ligne de l'entree la plus grande
    main()
    {
        int len; //taille de la ligne
        int max; //taille maximun jusqu'au moment
        char line[MAXLINE]; //Ligne entre actuelle
        char longest[MAXLINE]; //Sauvegarde la ligne la plus grande
     
        max = 0;
        while ((len = getline(line, MAXLINE))>0)
            if (len>max){
                max = len;
                copy(longest,line);
            }
        if(max >0) //Il y avait une ligne
            printf("%s",longest);
        return 0;
    }
    //Getline : lis une ligne en s, retourne sa taille
     
    int getline(char s[], int lim)
    {
        int c, i;
     
        for(i = 0; i<lim-1 && (c = getchar()) != EOF && c!= '\n';++i)
            s[i] = c;
        if(c == '\n'){
            s[i] = c;
            ++i;
        }
        s[i] = '\0';
        return i;
    }
     
    //Copie : cpoie 'from' en 'to'; en supposant que to est suffisament grand
    void copy(char to[], char from[])
    {
        int i;
     
        i = 0;
        while ((to[i] = from[i]) != '\0')
            ++i;
    }
    Je ne comprends pas tout à ce pg même pas grand chose d'ailleurs...
    Bref, précisément, voici mes questions :

    - pour les arguments dns les fonctions déclarées, que signifie char to[] par exemple ? (c'est surtout les crochets qui me gênent...)

    -Pq devons nous faire :
    int getline(char line[], int maxline);
    void copy(char to[], char from[]);
    au début ? parce que si je ne met pas ces deux lignes, mon programme fonctionne encore.

    -Que signifie : char line[MAXLINE] ? Ou plutôt quelle est l'action de cette instruction ?

    - Que signifie '\0'

    Whaouu, je ne comprends pas pourquoi ils nous propose un pg si difficile dès le début... c'est vraiment flou dans ma tête. Une aide ?
    Merci d'avance !

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par julcha Voir le message
    Bonsoir tout le monde.
    Nouveau exo, nouvelles questions (désolée j'apprends le langage C toute seule avec un bouquin espagnol (et me demander pas pourquoi ^^)).
    On te demandera pas pourquoi. Mais t'as tout un tas de cours et tutoriels pour apprendre C en français sur le net.

    Citation Envoyé par julcha Voir le message
    Bref, voici un programme qui doit retourner une ligne saisie par l'utilisateur, celle-ci devant être la plus grande qu'il y a été saisie.

    Ca nous donne :

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #include <stdio.h>
    #define MAXLINE 1000 //Taille maximùun de la ligne entree
    int getline(char line[], int maxline);
    void copy(char to[], char from[]);
     
    //Imprime la ligne de l'entree la plus grande
    main()
    {
        int len; //taille de la ligne
        int max; //taille maximun jusqu'au moment
        char line[MAXLINE]; //Ligne entre actuelle
        char longest[MAXLINE]; //Sauvegarde la ligne la plus grande
     
        max = 0;
        while ((len = getline(line, MAXLINE))>0)
            if (len>max){
                max = len;
                copy(longest,line);
            }
        if(max >0) //Il y avait une ligne
            printf("%s",longest);
        return 0;
    }
    //Getline : lis une ligne en s, retourne sa taille
     
    int getline(char s[], int lim)
    {
        int c, i;
     
        for(i = 0; i<lim-1 && (c = getchar()) != EOF && c!= '\n';++i)
            s[i] = c;
        if(c == '\n'){
            s[i] = c;
            ++i;
        }
        s[i] = '\0';
        return i;
    }
     
    //Copie : cpoie 'from' en 'to'; en supposant que to est suffisament grand
    void copy(char to[], char from[])
    {
        int i;
     
        i = 0;
        while ((to[i] = from[i]) != '\0')
            ++i;
    }

    Je ne comprends pas tout à ce pg même pas grand chose d'ailleurs...
    Bref, précisément, voici mes questions :

    - pour les arguments dns les fonctions déclarées, que signifie char to[] par exemple ? (c'est surtout les crochets qui me gênent...)
    Ce sont deux chaines de caractères. Et, en C, le type "chaine de caractère" n'existe pas. On le matérialise donc par un tableau de caractères plus exactement par l'adresse de la case mémoire qui contient le premier caractère de la chaine.

    Citation Envoyé par julcha Voir le message
    -Pq devons nous faire :
    int getline(char line[], int maxline);
    void copy(char to[], char from[]);
    au début ? parce que si je ne met pas ces deux lignes, mon programme fonctionne encore.
    Il s'agit de prototyper tes fonctions. c.a.d. dire au compilo quel est leur type et quels sont leurs arguments. Ca permettra au compilo de mieux pouvoir vérifier si ce que tu leur passes ensuite est correct.
    Tu peux ne pas le faire mais il les prototype alors par défaut comme étant de type "int" ce qui peut poser des problèmes si ce n'est pas le cas et si en plus tu cherches à récupérer ce qu'elles renvoient. Là le compilo poussera alors une gueulante entre ce que tu fais (utiliser une fonction de type truc) et ce qu'il a prévu (la fonction de type int). Ici, exceptionnellement, ça passe car ta première fonction est int et ta seconde est void donc tu ne récupères rien d'elle.

    Citation Envoyé par julcha Voir le message
    -Que signifie : char line[MAXLINE] ? Ou plutôt quelle est l'action de cette instruction ?
    Tu définis un tableau de caractères de taille MAXLINE (1000 caractères). Attention, le C ne te dira rien si tu le remplis avec 1001 caractères. C'est à toi de gérer toute seule.

    Citation Envoyé par julcha Voir le message
    - Que signifie '\0'
    Comme le C ne sait pas gérer les chaines, pour pouvoir gérer une chaine, il te faut récupérer l'adresse de son premier caractère puis balayer ensuite caractère par caractère (ce qui est aisé car en C, un tableau est toujours contigu en mémoire). Mais il faut savoir où s'arrêter (parce que ton tableau est perdu au milieu de plein d'autres choses qui sont aussi en mémoire). Donc pour savoir où s'arrêter il suffit de placer dans le tableau un caractère '\0' (valeur ascii 0). Il te faut bien entendu t'assurer que ton tableau a la place de stocker ce '\0'. C'est le cas quand tu définis tes chaines de façon textuelle (par exemple char chaine[]="bonjour" va automatiquement créer un tableau de 7 caractères qui contiendront 'b', 'o', 'n', 'j', 'o', 'u', 'r', '\0') mais si tu crées une chaine "à la main", il te faudra alors prendre en charge ce '\0'. Par exemple ton char line[MAXLINE] ne pourra stocker que MAXLINE - 1 caractères significatifs pour toi car tu devras toujours t'assurer qu'il reste une place pour le '\0'

    Citation Envoyé par julcha Voir le message
    Whaouu, je ne comprends pas pourquoi ils nous propose un pg si difficile dès le début
    C'est vrai qu'il est "un peu" chiadé mais il couvre un large panel des notions primordiales à savoir maitriser pour "comprendre" le C.

    Te faut l'étudier en commençant par la plus petite fonction (copy) jusqu'à la comprendre parfaitement. Ensuite, tu passes à getline puis le main.
    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. Explications pour un débutant
    Par tatemilio2 dans le forum Spring
    Réponses: 1
    Dernier message: 09/09/2006, 16h18
  2. [Humour]Une petite explication pour mesdemoiselles (et pour les messieurs aussi ;) )
    Par chaval dans le forum La taverne du Club : Humour et divers
    Réponses: 44
    Dernier message: 12/07/2006, 15h28
  3. Besoin d'explication pour l'impression
    Par mygwel dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 25/05/2006, 10h49
  4. [FLASH MX2004] Explication pour les comboBox
    Par Sorento dans le forum Flash
    Réponses: 7
    Dernier message: 18/06/2005, 23h47
  5. Réponses: 4
    Dernier message: 30/04/2005, 13h59

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