Alemort Posté(e) April 9, 2014 Signaler Posté(e) April 9, 2014 (modifié) Exercice 1 Réaliser un algorithme qui permet d'afficher une structure qui contient l'âge, le nom, le prénom, et la ville. Exercice 2: Il sera un peu plus poussé Nous allons améliorer le précédent programme. Eux lieu de donner des valeurs prédéfinie pour le prénom, nom age, ville, nous allons laisser l'utilisateur l'ai saisir Une image devrait vous éclaircir la chose ps: Vous pouvez résoudre cette exercice en passant par un autres chemin, mais le but et de s'exercer au maniement des structures Vous pouvez poster vos codes sources et des images, pour que l'on puisse en discuter et peux être apprendre de nouvelles choses Mettez tout ça dans une balise spoil Modifié April 9, 2014 par Alemort 1
Cyrion Posté(e) April 9, 2014 Signaler Posté(e) April 9, 2014 (modifié) Vite fait en classe >.< #include <stdio.h> #include <conio.h> struct Info { char Prenom[10]; char Nom[15]; int Age; char Ville[15]; }; void DemandeInfo(Info &P) { printf("-----Saisi des donnees-----\n\n\n"); printf("Entrer votre prenom:"); scanf("%s",P.Prenom); printf("Entrer votre nom:"); scanf("%s",P.Nom); printf("Entrer votre age:"); scanf("%i",&P.Age); printf("Entrer votre ville actuelle:"); scanf("%s",P.Ville); } void AfficherInfo(Info &P) { printf("\n\n\n-----Affichage des donnees-----\n\n\n"); printf("Prenom: %s\n",P.Prenom); printf("Nom: %s\n",P.Nom); printf("Age: %i\n",P.Age); printf("Ville: %s\n",P.Ville); } int main() { Info Personne; DemandeInfo(Personne); AfficherInfo(Personne); getch(); return 0; } Modifié April 9, 2014 par Cyrion 1
AlexMog Posté(e) April 9, 2014 Signaler Posté(e) April 9, 2014 (modifié) Vite fait en classe >.< #include <stdio.h> #include <conio.h> struct Info { char Prenom[10]; char Nom[15]; int Age; char Ville[15]; }; void DemandeInfo(Info &P) { printf("-----Saisi des donnees-----\n\n\n"); printf("Entrer votre prenom:"); scanf("%s",P.Prenom); printf("Entrer votre nom:"); scanf("%s",P.Nom); printf("Entrer votre age:"); scanf("%i",&P.Age); printf("Entrer votre ville actuelle:"); scanf("%s",P.Ville); } void AfficherInfo(Info &P) { printf("\n\n\n-----Affichage des donnees-----\n\n\n"); printf("Prenom: %s\n",P.Prenom); printf("Nom: %s\n",P.Nom); printf("Age: %i\n",P.Age); printf("Ville: %s\n",P.Ville); } int main() { Info Personne; DemandeInfo(Personne); AfficherInfo(Personne); getch(); return 0; } Normalement, ça ne devrais pas compiler Voici la correction: (par contre, c'est pas du tout sécu ton truc, y'a un risque de segfault énorme! ne faites JAMAIS confiance en ce qu'entre vos utilisateurs ) #include <stdio.h> #include <conio.h> struct Info { char Prenom[10]; char Nom[15]; int Age; char Ville[15]; }; // Le typpage "Info" n'existe pas. Le véritable typpage est "struct Info", puisque tu n'as absolument pas utilisé de typedef . On peut régler le problème en rajoutant un typedef, comme ici: // typedef s_ma_structure type_name; // Ici, tu utilise "struct Info &P", donc tu demande une référence de P, les références existent uniquement en C++ . Il faut donc envoyer un pointeur. Et ne surtout pas oublier de changer les "." par des "->" (car pointeurs) void DemandeInfo(struct Info *P) { printf("-----Saisi des donnees-----\n\n\n"); // ATTENTION! printf("Entrer votre prenom:"); scanf("%s",P->Prenom); printf("Entrer votre nom:"); scanf("%s",P->Nom); printf("Entrer votre age:"); scanf("%i",&P->Age); printf("Entrer votre ville actuelle:"); scanf("%s",P->Ville); } void AfficherInfo(struct Info *P) { printf("\n\n\n-----Affichage des donnees-----\n\n\n"); printf("Prenom: %s\n",P->Prenom); printf("Nom: %s\n",P->Nom); printf("Age: %i\n",P->Age); printf("Ville: %s\n",P->Ville); } int main() { struct Info Personne; // Ici, tu demande l'adresse de "Personne" et non pas le contenu DemandeInfo(&Personne); AfficherInfo(&Personne); getch(); return 0; } Ensuite, la norme UNI de C stipule ne pas utiliser les majuscules, SAUF au niveau des macros . C'est en C++ qu'on définit des majuscules UNIQUEMENT au début des objets (et non pas des attributs) et au niveau des nom des methodes (for exemple: getGetter()) Modifié April 9, 2014 par AlexMog 1
AlexMog Posté(e) April 9, 2014 Signaler Posté(e) April 9, 2014 (modifié) Ma petite version: #include <unistd.h> #include <stdio.h> typedef struct s_user { char *name; char *last_name; unsigned int *age; char *city; } t_user; int read_data(t_user *user) { unsigned int readed; char buffer[100]; char *questions[] = {"Your name?", "Your last name?", "Your age?", "Your city?"}; int types[] = {0, 0, 1, 0}; int i; void *first_addr; first_addr = &user->name; i = 0; readed = 0; while (i < 4) { printf("%s\n", questions[i]); if ((readed = read(0, buffer, 15)) < 0) return (1); buffer[readed] = 0; printf("%c", '\n'); if (!types[i]) { if (((char*)(*first_addr) = malloc(strlen(buffer) * sizeof(char))) == NULL) return (1); memcpy((char*)(*fist_addr), buffer, strlen(buffer) * sizeof(char)); first_addr += sizeof(void*); } else { (unsigned int)(*first_addr) = atoi(buffer); first_addr += sizeof(int); } ++i; } return (0); } // Pointeur constant car non modifié void show_data(const t_user *user) { printf("First Name: %s\nName: %s\nAge: %d\nCity: %s\n", user->name, user->last_name, user->age, user->city); } int main(void) { t_user userdata; if (read_data(userdata)) { fprintf(stderr, "Error on reading."); return (1); } // J'envois un pointeur car je ne vais pas copier toute une structure dans la stack... Pouah! show_data(&userdata); return (0); } Modifié April 9, 2014 par AlexMog 1
Cyrion Posté(e) April 11, 2014 Signaler Posté(e) April 11, 2014 Meh, je fais du C++ à l'habitude, je me souvenais pas de toute les petites règles par contre, c'est pas du tout sécu ton truc, y'a un risque de segfault énorme! ne faites JAMAIS confiance en ce qu'entre vos utilisateurs Personne a demandé à ce qu'il le soit.
Azad Posté(e) April 17, 2014 Signaler Posté(e) April 17, 2014 Pas d'autres participants ? Merci Alemort d'avoir proposé un exercice comme ça, sympa comme idée (et à refaire si possible !).
Recommended Posts
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant