Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Débuter
Débuter Forum d'entraide pour débuter en langage C. Avant de poster -> FAQ C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 03/01/2013, 17h07   #1
feddou
Invité de passage
 
Homme
Inscription : 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.
feddou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 09h40   #2
plxpy
Membre émérite
 
Avatar de plxpy
 
Homme
Ingénieur
Inscription : janvier 2009
Messages : 494
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

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

Informations forums :
Inscription : janvier 2009
Messages : 494
Points : 893
Points : 893
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.
plxpy est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/01/2013, 12h16   #3
Sve@r
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 495
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 45
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 : 3 495
Points : 6 606
Points : 6 606
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
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 12h57   #4
plxpy
Membre émérite
 
Avatar de plxpy
 
Homme
Ingénieur
Inscription : janvier 2009
Messages : 494
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

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

Informations forums :
Inscription : janvier 2009
Messages : 494
Points : 893
Points : 893
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)
plxpy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 13h54   #5
diogene
Responsable Modération
 
Avatar de diogene
 
Homme Patrick Gonord
Enseignant Chercheur
Inscription : juin 2005
Messages : 5 434
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 434
Points : 12 967
Points : 12 967
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 !
diogene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 14h04   #6
Sve@r
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 495
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 45
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 : 3 495
Points : 6 606
Points : 6 606
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
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h16.


 
 
 
 
Partenaires

Hébergement Web