Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Invité de passage
    Homme Profil pro
    Inscrit en
    janvier 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : janvier 2013
    Messages : 1
    Points : 0
    Points
    0

    Par défaut projet de gestion de documents

    Bonjour,

    j'ai un projet de programmation en c..on nous demande de realiser la version dynamique cad avec les listes chainéees du programme de gestion de documents...j'ai fait un essai cependant il ne fonctionne pas
    pourriez vous m'aider a trouver et corriger les erreurs

    Voici le code complet:
    Code :
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
     
    #ifndef STRUCTURES_H_INCLUDED 
    #define STRUCTURES_H_INCLUDED 
     
     
    typedef  struct date_cre 
    { 
        int annee; 
        int mois; 
        int jour; 
    }date_cre; 
     
    typedef struct document 
    {   char nom[20]; 
        int  taille; 
        char type[20]; 
        char cat[20]; 
        date_cre date; 
        struct document *suivant; 
     
    }document; 
     
    typedef struct Liste 
    { 
        document *premier; 
    }Liste; 
     
     
     
    #endif // STRUCTURES_H_INCLUDED 
    > 
     
     
    #ifndef ENTETES_H_INCLUDED 
    #define ENTETES_H_INCLUDED 
     
     
    Liste *initialisation(); 
    void ajout(Liste *liste); 
    void suppression(Liste *liste); 
    void afficherListe(Liste liste); 
    int statistiques(Liste liste); 
     
     
    #endif // ENTETES_H_INCLUDED 
     
    #include<stdio.h> 
    #include<stdlib.h> 
    #include<string.h> 
    #include "structures.h" 
     
      document *nouveau(char *pnom,int ptaille,char *ptype, char *pcat,int pannee,int pmois,int pjour) 
    { 
        document *c; 
        c=(document *)malloc(sizeof(document)); 
        strcpy(c->nom,pnom); 
        c->taille=ptaille; 
        strcpy(c->type,ptype); 
        strcpy(c->cat,pcat); 
        c->date.annee=pannee; 
        c->date.mois=pmois; 
        c->date.jour=pjour; 
     
        c->suivant=NULL; 
        return c; 
        } 
     
    #include"structures.h" 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
     
     
    Liste *initialisation() 
    { 
        Liste *liste = malloc(sizeof(*liste)); 
        document *doc = malloc(sizeof(*doc)); 
     
        if (liste == NULL || doc == NULL) 
        { 
            exit(EXIT_FAILURE); 
        } 
        strcpy(doc->nom,'\0'); 
        doc->taille=0; 
        strcpy(doc->type,'\0'); 
        strcpy(doc->cat,'\0'); 
        doc->date.annee=0; 
        doc->date.mois=0; 
        doc->date.jour=0; 
        doc->suivant = NULL; 
        liste->premier = doc; 
     
        return liste; 
    } 
     
     
    #include<stdio.h> 
    #include<stdlib.h> 
    #include<string.h> 
    #include"structures.h" 
     
     
    void ajout(Liste *liste) 
     
    {int a; 
      char pnom; 
      int ptaille; 
      char ptype; 
      char pcat; 
      int pannee; 
      int pmois; 
      int pjour; 
     
        /* Création du nouvel élément */ 
      document *p; 
        if (liste == NULL) 
        { 
            exit(EXIT_FAILURE); 
        } 
     
     
        printf("donnez le nom du document\n"); 
        scanf("%s",pnom); 
        printf("donnez la taille du document\n"); 
        scanf("%d",&ptaille); 
        printf("donnez le type du document\n"); 
        scanf("%s",ptype); 
        printf("donnez la catégorie du document\n"); 
        scanf("%s",pcat); 
        printf("donnez la nouvelle annee\n"); 
        scanf("%d",&pannee); 
         printf("donnez le nouvel mois\n"); 
        scanf("%d",&pmois); 
         printf("donnez l nouvel jour\n"); 
        scanf("%d",&pjour); 
     
       p=nouveau(pnom,ptaille,ptype,pcat,pannee,pmois,pjour); 
     
        /* Insertion de l'élément au début de la liste */ 
        p->suivant = liste->premier; 
        liste->premier = p; 
    do 
    {a=1; 
    printf("tapez 0 pour rentrer au menu principal!\n"); 
    scanf("%d",&a); 
    system("cls"); 
    } 
    while (a!=0); 
     
    return 0; 
    } 
     
     
     
    #include<stdio.h> 
    #include<stdlib.h> 
    #include"structures.h" 
    #include <string.h> 
     
    void suppression(Liste *liste) 
     
    { char supp_nom[20]; 
      int a; 
    printf("entrer l\'element de liste que vous voulez supprimer"); 
    scanf("%s",supp_nom); 
     
        if (liste == NULL) 
        { 
            exit(EXIT_FAILURE); 
        } 
        do 
        { 
        if (strcmp(liste->premier->nom,supp_nom)!=0) 
               liste->premier=liste->premier->suivant; 
        else 
        { 
            document *aSupprimer = liste->premier; 
            liste->premier = liste->premier->suivant; 
            free(aSupprimer); 
        } 
     
    }while (strcmp(liste->premier->nom,supp_nom)!=0); 
     
    a=1; 
    do 
    {printf("tapez 0 pour rentrer au menu principal!\n"); 
    scanf("%d",&a); 
    system("cls"); 
    } 
    while (a!=0); 
    } 
     
    #include<stdio.h> 
    #include<stdlib.h> 
    #include"structures.h" 
     
     
    void afficherListe(Liste liste) 
    {int a; 
    document *actuel = liste.premier; 
     
        while (actuel != NULL) 
        { 
            printf("\n nom %s : ", actuel->nom); 
            printf("\n taille %d : ", actuel->taille); 
            printf("\n type %s : ", actuel->type); 
            printf("\n categorie %s ", actuel->cat); 
            printf("date:  "); 
              printf("\n annee%d : ", actuel->date.annee); 
              printf("\n mois%d : ", actuel->date.mois); 
              printf("\n jour%d : ", actuel->date.jour); 
            actuel = actuel->suivant; 
        } 
        printf("NULL\n"); 
     
    do 
    {a=1; 
    printf("tapez 0 pour rentrer au menu principal!\n"); 
    scanf("%d",&a); 
    system("cls"); 
    } 
    while (a!=0); 
    } 
     
    #include<stdio.h> 
    #include<stdlib.h> 
    #include"structures.h" 
    #include"entetes.h" 
     
    void menu(Liste *liste) 
    { 
    int choix; 
     
         {  printf("============================================================"); 
            printf("            ***Bienvenue!***"); 
            printf("============================================================"); 
            printf("Effectuez votre choix:\n"); 
            printf("    1- Ajouter un document\n"); 
            printf("    2- chercher un document\n"); 
            printf("    3- Supprimer un document\n"); 
            printf("    4- Modifier un document\n"); 
            printf("    5- Trier les documents\n"); 
            printf("    6- Statistiques\n"); 
            printf("    7- Liste des documents\n"); 
            printf("    0- Quitter\n\n\n"); 
            scanf("%d",&choix); 
            switch(choix) 
            {case 0:choix=0; break; 
            case 1: {choix=0; system("cls"); ajout(liste);  menu(liste); break;}; 
            //case 2: choix=0; system("cls"); rechercher(doc);     menu(doc); break; 
            case 3: {choix=0; system("cls"); suppression(liste);   menu(liste); break;}; 
            //case 4: choix=0; system("cls"); modifier(doc);     menu(doc); break; 
            //case 5: choix=0; system("cls"); trier(doc);      menu(doc); break; 
            //case 6: choix=0; system("cls"); statistiques(doc); menu(doc); break; 
            case 7: {choix=0; system("cls"); afficherListe(*liste); menu(liste); break;}; 
            default:system("cls"); 
                    printf("       Choix invalide!\n\n\n");break;} 
             }while(choix!=0); 
       return; 
    } 
     
     
    #include<stdio.h> 
    #include<stdlib.h> 
    #include"structures.h" 
     
     
    void modification(Liste *liste) 
    {int a; 
    char *nvnom[20]; 
    int nvtaille; 
    char *nvtype[20]; 
    char *nvcat[20]; 
    int nvannee; 
    int nvmois; 
    int nvjour; 
    char nom_modif[20]; 
    document *p; 
     
      printf("Consultez la liste avant d\'effectuer une modification:\n"); 
      afficherListe(liste); 
      printf("\n \n"); 
      printf ("donner le nom du document que vous voulez modifier :\n"); 
      scanf("%s=",nom_modif); 
     
        if (liste == NULL) 
        { 
            exit(EXIT_FAILURE); 
        } 
     
        if (liste->premier->nom != nvnom) 
        liste->premier=liste->premier->suivant; 
        else 
        { 
        printf("donnez le nom du document\n"); 
        scanf("%s",nvnom); 
        printf("donnez la taille du document\n"); 
        scanf("%d",&nvtaille); 
        printf("donnez le type du document\n"); 
        scanf("%s",nvtype); 
        printf("donnez la catégorie du document\n"); 
        scanf("%s",nvcat); 
        printf("donnez la nouvelle annee\n"); 
        scanf("%d",&nvannee); 
         printf("donnez le nouvel mois\n"); 
        scanf("%d",&nvmois); 
         printf("donnez l nouvel jour\n"); 
        scanf("%d",&nvjour); 
     
        p=nouveau(nvnom,nvtaille,nvtype,nvcat,nvannee,nvmois,nvjour); 
        liste->premier=p; 
        } 
    do 
    {a=1; 
    printf("tapez 0 pour rentrer au menu principal!\n"); 
    scanf("%d",&a); 
    system("cls"); 
    } 
    while (a!=0); 
    } 
     
    #include<stdio.h> 
    #include<stdlib.h> 
    #include"structures.h" 
     
     
    int main() 
    { 
        Liste *list = initialisation(); 
        menu(list); 
        return 0; 
    }

    REMARQUE:les profs nous demandeneet de creer chaque fonction toute seule dans un fichier source,les entetes et les structures dans les fichiers headers...

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    janvier 2009
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : janvier 2009
    Messages : 601
    Points : 965
    Points
    965

    Par défaut

    Bonjour,


    Quelques remarques générales parce qu'il y beaucoup de choses (trop) qui ne vont pas.

    1. Déjà, ton découpage. Tu mélanges et fais dans les mêmes fonctions :
      • la saisie utilisateur (nouveau document, nom du document à supprimer, etc...)
      • la gestion proprement-dite de ta liste de documents


      Ca nuit fortement à la lisibilité (et au debuggage) et, de façon plus objective (chacun a son propre avis sur la "lisibilité" d'un code), imagine qu'on te demande de proposer à l'utilisateur, non pas une interface "console", mais une interface graphique : tu n'auras plus alors qu'à tout jeter ce que tu as fait et à repartir de zéro. Et pourtant, la gestion de la liste n'a (normalement) pas à bouger d'un iota !

    2. Ensuite, quel est l'intérêt, lors de l'intialisation de la liste, d'insérer un document "null"/neutre ? Le champ "suivant" à NULL d'un document de la liste suffit à marquer la fin de la liste. Et une liste vide est une liste dont le (seul) champ "premier" est NULL.

      Ce document neutre est inutile, perturbant et source d'erreurs. D'ailleurs, tu t'en sers mal : sans avoir compilé ou exécuté ton code, je suis sur que la fonction "afficherListe" t'affiche un "dernier" document un peu "bizarroïde", non ? Tu traites ce dernier élément un peu spécial comme les autres ... Vire le et base toi sur le champ "suivant" !

    3. Enfin, fonction que j'ai regardée un peu plus en détail : suppression. Une fois le nom du document à supprimer saisi, tu flingues consciencieusement ta liste en changeant le champ "premier" qui avance, de suivant en suivant, sans utiliser de variable auxiliaire pour parcourir tes éléments/documents. Quand on retourne à l'appelant, ta liste a méchamment "morflé" (les passages de paramètres en C se font par valeurs, certes, mais changer liste->premier modifie le contenu de ta liste).

      Seul cas où ça passe sans trop de casse : le document à supprimer est le premier de la liste ... c'est maigre.


    Bref, il y a du boulot ... courage !


    ps : évite de poster et dans le forum "C" et dans le sous-forum "Débuter" le même problème. Là, tu devrais pouvoir supprimer ton post dans l'autre branche maintenant que tu as une première réponse ici.

  3. #3
    Expert Confirmé Sénior
    Avatar de Sve@r
    Homme Profil pro Frédéric
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    4 444
    Détails du profil
    Informations personnelles :
    Nom : Homme Frédéric
    Âge : 46
    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 : 4 444
    Points : 8 730
    Points
    8 730

    Par défaut

    Bonjour
    Les remarques de plxpy s'intègrent dans la philosophie "MVC" (Modèle, Vue, Contrôleur). En séparant les fonctions dédiées
    • Au modèle (stockage sur disque, sur bdd, en mémoire)
    • A la vue (saisie/affichage)
    • Au contrôleur (manipulations internes, calculs, etc)

    Tu peux non seulement avoir un projet/programme fiable mais facilement évolutif. Si un jour, comme le dit plxpy, la provenance des éléments ne se fait plus depuis une saisie clavier mais depuis un flux réseau, te suffit de modifier simplement les fonctions dédiées à la vue pour prendre en compte ce nouvel arrivage et tout remarche pareil.

    Mes remarques perso sont juste les suivantes:
    1. essaye de nommer tes types "t_qqchose" et tes structures "s_qqchose". Par exemple la structure "date_cre" pourrait être définie ainsi
      Code c :
      1
      2
      3
      4
      5
      typedef  struct /* s_date_cre si tu veux mais c'est pas obligatoire */ {
          int annee; 
          int mois; 
          int jour; 
      } t_date_cre;
      Ca t'évitera ensuite d'avoir à trouver un nom pour tes variables et aux autres lecteurs de se mélanger entre "date_cre" (le type) et "date_cre" (la variable)...
    2. évite de quitter le programme depuis une sous fonction (typiquement un exit en cas de malloc échoué). On entre dans le programme via le main et on en ressort via le main. Si un problème se produit dans une sous-fonction, alors la sous-fonction s'arrête et renvoie le problème à son appelant via un return. Charge à l'appelant de gérer le cas ou, lui-même, de le remonter à son appelant et etc etc jusqu'au main qui, lui, pourra alors quitter si lui non plus ne sait pas gérer.

    Alors c'est sûr ça n'a rien à voir avec ton problème immédiat mais écrire du code bien construit dès le départ ça fait disparaitre 90% de tes bugs et ça multiplie ensuite ta production par 2...
    Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
    Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
    Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
    Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
    Dr. Adrian Rogers (1931-2005)

  4. #4
    Modérateur
    Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    janvier 2009
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : janvier 2009
    Messages : 601
    Points : 965
    Points
    965

    Par défaut

    Salut Sve@r.

    Tel Mr Jourdain :

    "Par ma foi ! il y a plus de quarante vingt ans que je dis de la prose pratique l'approche MVC sans que j'en susse rien, et je vous suis le plus obligé du monde de m'avoir appris cela."

    Jusque là, j'avais rangé cette façon de faire dans la catégorie "bon sens paysan" !

    Trêve de plaisanterie, sans procéder de la sorte, la validation est tout simplement une horreur ! (ne serait-ce que ça)

  5. #5
    Responsable Modération
    Avatar de diogene
    Homme Profil pro Patrick Gonord
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 664
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrick Gonord
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2005
    Messages : 5 664
    Points : 12 539
    Points
    12 539

    Par défaut

    Quelques remarques sur ce code :

    * La déclaration Liste *initialisation(); n'est pas un prototype : Liste *initialisation(void);.

    ** document *nouveau() : le test sur la validité de l'allocation manque :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    document *nouveau(char *pnom,int ptaille,char *ptype, char *pcat,int pannee,int pmois,int pjour) 
    { 
        document *c = malloc(sizeof *c);
        if(c!= NULL)
        { 
           strcpy(c->nom,pnom); 
           ... 
           c->suivant=NULL;
        } 
        return c; 
    }
    ***Liste *initialisation()
    - strcpy(doc->nom,'\0'); strcpy() demande une chaine de caractères en second argument, pas un caractère : strcpy(doc->nom,"\0"); Erreur qui fait planter le programme. Idem pour les autres strcpy()
    - Pourquoi ne pas utiliser la fonction nouveau() :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Liste *initialisation(void) 
    { 
        Liste *liste = malloc(sizeof *liste);
        if(liste != NULL) 
        {
           liste->premier = nouveau("",0,"","",0,0,0); 
           if(liste->premier == NULL) 
           {
               free(liste);
               liste = NULL;
           }
        }
        return liste;  // retourne NULL si erreur d'allocation.
    }
    ****void ajout()
    - scanf("%s",pnom); demande un tableau de char, et non pas un simple char. Erreur qui fait planter le programme. Idem pour les autres scanf("%s",...)
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    void ajout(Liste *liste) 
    {
      int a; 
      char pnom[20]; 
      int ptaille; 
      char ptype[20];
      char pcat[20]; 
    ....
    20 parce que c'est la taille correspondant dans un document. On aurait intérêt à utliser un #define DIM 20 (et à sécuriser les scanf() pour ne pas dépasser la taille du buffer)
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #define DIM 20
    typedef struct document 
    {   char nom[DIM]; 
    ... 
    }document;
    ...
    void ajout(Liste *liste) 
    {
      int a; 
      char pnom[DIM];
    ...
    Cela devrait éliminer les erreurs de compilation sur l'appel à nouveau()
    - le a=1 de la boucle do while est inutile ; a sera initialisé par le scanf() avant le test.
    - La fonction devrait renvoyer le document créé (p) ou NULL en cas d'échec : elle remonte ainsi l'information au programme appelant plutôt que le brutal exit(EXIT_FAILURE);.
    Code :
    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
    document * ajout(Liste *liste) 
     
    {int a; 
      char pnom[DIM]; 
      int ptaille; 
      char ptype[DIM]; 
      char pcat[DIM]; 
      int pannee; 
      int pmois; 
      int pjour; 
     
        /* Création du nouvel élément */ 
      document *p; 
      if (liste == NULL) return NULL; 
      printf("donnez le nom du document\n"); 
    ...   
      scanf("%d",&pjour); 
      p=nouveau(pnom,ptaille,ptype,pcat,pannee,pmois,pjour); 
      if(p!=NULL)
      {
        /* Insertion de l'élément au début de la liste */ 
        p->suivant = liste->premier; 
        liste->premier = p; 
        do   // je ne sais pas ce que cela vient faire ici !!!
        { 
          printf("tapez 0 pour rentrer au menu principal!\n"); 
          scanf("%d",&a); 
          system("cls"); 
        } while (a!=0);
      } 
      return p; 
    }
    (Codes non testés)

    Je n'ai pas regardé la suite (en attendant de voir comment tu modifies ton code).
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Expert Confirmé Sénior
    Avatar de Sve@r
    Homme Profil pro Frédéric
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    4 444
    Détails du profil
    Informations personnelles :
    Nom : Homme Frédéric
    Âge : 46
    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 : 4 444
    Points : 8 730
    Points
    8 730

    Par défaut

    Citation Envoyé par plxpy Voir le message
    Tel Mr Jourdain :

    "Par ma foi ! il y a plus de quarante vingt ans que je dis de la prose pratique l'approche MVC sans que j'en susse rien, et je vous suis le plus obligé du monde de m'avoir appris cela."
    http://fr.wikipedia.org/wiki/Mod%C3%...ontr%C3%B4leur

    Citation Envoyé par diogene Voir le message
    Je n'ai pas regardé la suite...
    Hum, quand on voit tout ce que t'as déjà regardé je crois que personne ne t'en fera grief...
    Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
    Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
    Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
    Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
    Dr. Adrian Rogers (1931-2005)

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •