Créer un logiciel de suivi

  • Initiateur de la discussion Initiateur de la discussion NASON
  • Date de début Date de début
Bonjour!

J'ai un projet et souhaiterais avoir des propositions de structuration sur le problème. En clair, je voudrais qu'on me dise les différents sous programmes à créer. Merci à vous.

Voici le projet:

Un chercheur aimerait un programme pour suivre sa colonie de souris blanches. Chaque souris se caractérise par un identifiant (numéro), son nom, sa date de naissance, son poids à la naissance, son poids actuel, son sexe, son état de santé, sa catégorie (jeunes, adultes et vieux).
Cette colonie peut comprendre au maximum 100 souris blanches.

Travail à faire

Ecrire un algorithme permettant la gestion de la colonie des souris blanches. Cette gestion consiste en l’enregistrement d’une nouvelle souris, lister les souris dans l’ordre croissant de l’âge, à lister les souris dans l’ordre décroissant des poids, à afficher le nombre et la liste des souris par sexe, à afficher le nombre et la liste des souris par catégorie.
Le chercheur souhaite aussi pouvoir rechercher une souris en particulier à partir de son identifiant.
Une fois la souris trouvée, il veut pouvoir modifier les informations sur la souris (sauf son
identifiant qui est unique et non modifiable) ou la supprimer.
Faire un rapport dans lequel vous décrirez la décomposition du problème, les structures de données utilisées, les sous programmes. Vous y écrirez aussi les différents algorithmes.
Vous programmerez votre solution en langage C.
Une attention particulière sera accordée à la modularité de votre solution, aux commentaires tant au niveau de l’algorithme qu’au niveau du programme C.
L’interface utilisateur du programme C devra être également soignée.
 
Le mieux adapté dans ton cas est de faire recours à un SGBD (système de gestion de base de donné).
pour le choix du SGBD dépend du budget de projet et du volume de ta base de donnée (si tu dis qu'il y a qu'une colonie avec 100 souris, un système comme Acces fera largement l'affaire, après rien ne t'empeche de choisir mySQL,...).
Le travail à faire n'est pas tres compliqué, tu crée une table, chaque ligne représente une souris, la clé de ta table sera l'identifiant de la souris. et chaque ligne contient "un identifiant (numéro) de la souris, son nom, sa date de naissance, son poids à la naissance, son poids actuel, son sexe, son état de santé, sa catégorie (jeunes, adultes et vieux)"
les fonctionnalités du ton SGBD te permettent facilement de lancer tes requetes : enregistrement d’une nouvelle souris, lister les souris dans l’ordre croissant de l’âge, à lister les souris dans l’ordre décroissant des poids, à afficher le nombre et la liste des souris par sexe, à afficher le nombre et la liste des souris par catégorie.
Le chercheur souhaite aussi pouvoir rechercher une souris en particulier à partir de son identifiant....
Il faut juste un minimum de connaissances sur le langage de ton SGBD.
En langage C çà se fait tres bien ;)
si t'a des questions précises je pourrais t'aider.
 
ton problème est facile c'est un simple algorithme, mais comme tu dois le developper en C je te conseille d'utiliser les fichiers comme source de donnés 'fichiers plats' ou tu va stocké tte info sur les souris.
 
je suis d'accord avec TheGone69, le mieux c'est de créer une base de données dans laquelle tu pourras stoker tes infos!!
après tu pourras developper ton programme dans n'importe quel langage, le VB6 est facile si tu es débutant en prog...
 
Bonjour!

J'ai un projet et souhaiterais avoir des propositions de structuration sur le problème. En clair, je voudrais qu'on me dise les différents sous programmes à créer. Merci à vous.

Voici le projet:

Un chercheur aimerait un programme pour suivre sa colonie de souris blanches. Chaque souris se caractérise par un identifiant (numéro), son nom, sa date de naissance, son poids à la naissance, son poids actuel, son sexe, son état de santé, sa catégorie (jeunes, adultes et vieux).
Cette colonie peut comprendre au maximum 100 souris blanches.

Travail à faire

Ecrire un algorithme permettant la gestion de la colonie des souris blanches. Cette gestion consiste en l’enregistrement d’une nouvelle souris, lister les souris dans l’ordre croissant de l’âge, à lister les souris dans l’ordre décroissant des poids, à afficher le nombre et la liste des souris par sexe, à afficher le nombre et la liste des souris par catégorie.
Le chercheur souhaite aussi pouvoir rechercher une souris en particulier à partir de son identifiant.
Une fois la souris trouvée, il veut pouvoir modifier les informations sur la souris (sauf son
identifiant qui est unique et non modifiable) ou la supprimer.
Faire un rapport dans lequel vous décrirez la décomposition du problème, les structures de données utilisées, les sous programmes. Vous y écrirez aussi les différents algorithmes.
Vous programmerez votre solution en langage C.
Une attention particulière sera accordée à la modularité de votre solution, aux commentaires tant au niveau de l’algorithme qu’au niveau du programme C.
L’interface utilisateur du programme C devra être également soignée.

C'est pour quel cours? Tu fais faire tes travaux sur internet? :D
 
Ton projet me rappel mes premiers pas en programmation avec le fameux langage C. C un travail qui n'est pas difficile du tout. Tu peux procéder comme suite:

-Définir les structures de données nécessaires pour gérer ta colonie de souris (enregistrement, liste chainée, tableau, matrices...etc). Le cas échéant, la structure la plus adaptée à mon avis c plutt une liste chainée d'enregistrements(cf ton cours de structures de données pour plus d'info ;))

-Écrire les algorithmes des fonctions décrites dans l'énoncé à savoir: tri, recherche, ajout, modification et suppression...etc

-Implémenter ton ficher d'entête (fonctions.h) qui comportera la définition des structures de données utilisées ainsi que la signature de chaque fonction/procédure utilisée. Tout doit être bien commenté, et n'oublie pas aussi de choisir des noms significatifs pr tes fonctions et tes variables. Ces 2 points sont appréciés par la plupart des profs,ils font parti d'ailleurs des bonnes pratiques de développement même au stade professionnel.

-Implémenter ton fichier (fonctions.c) qui comportera le corps des fonctions/procédures dont la signature a été définit dans le fichier d'entête (fonctions.h)

-Il te reste maintenant à coder ta fonction principale(main) qui va comporter le programme chargé de la gestion de ta petite colonie en faisant des appels aux fonctions implémentées dans ton fichiers (fonctions.h) selon ce qui est demandé par l'utilisateur final. Pense donc à présenter le fonctionnel de ton programme sous forme d'un menu convivial pour lui faciliter la vie surtt vu qu'il n'a aucun moyen d'interagir avec ton futur programme qu'à travers la black console qui fait souvent peur :)

Iwa je pense que tt est claire mnt.. courage! tu y arrivera surrement si tu le veux.
N'hésite surtt pas de poser des questions si tu affrontes des problèmes.
On est la pour vous aider.
 
Merci à tous pour vos contributions.

Je suis un débutant. Je n'ai pas de problème avec les algorithmes. C'est surtout la présentation de mon programme.
 
Bonjour chers amis.

Voici le début de mon projet. Je voulais tester le 1er choix fait par l'utilisateur. Seulement, avec ma procédure enregistrement, quand j'arrive à date de naissance, mon programme se plante. Ce qui veut dire qu'au niveau de la lecture ça ne passe pas. Je me demande si j'ai mal défini mes formats.

Merci.


typedef struct date date;
struct date {
long jj;
long mm;
long aaaa;
};



typedef struct Colonie Colonie;
struct Colonie {
long id;
char nom[15];
date dateNaiss;
double poidsNaiss;
double poidsActuel;
char sexe;
char etatSante;
char categ[8];
};



void afficherMenu()

{
printf("==========MENU===========\n\n");
printf("1- Nouvel enregistrement\n\n");
printf("2- Liste des souris dans l'ordre croissant de l'age\n\n");
printf("3- Liste des souris dans l'ordre décroissant du poids\n\n");
printf("4- Liste et nombre des souris par sexe\n\n");
printf("5- Liste et nombre des souris par categorie\n\n");
printf("6- Rechercher une souris\n\n");

}


void enregistrement(Colonie tab[], long taille)

{
long i;


for (i=0; i<taille; i++)
{
printf("Veuillez entrez les informations suivantes sur la souris\n\n");
printf("Identifiant ");
scanf ("%ld", tab.id);
printf("\n");
printf("Nom ");
scanf("%s", tab.nom);
printf("\n");
printf("Date de naissance (jj,mm,aaaa) ");
scanf("%lf %lf %lf", tab.dateNaiss.jj, tab.dateNaiss.mm, tab.dateNaiss.aaaa);
printf("\n");
printf("Poids a la naissance et poids actuel ");
scanf("%lf %lf", tab.poidsNaiss, tab.poidsActuel);
printf("\n");
printf("Sexe(M pour masculin, F pour feminin ");
scanf("%c", tab.sexe);
printf("\n");
printf("Etat de sante (B pour bien, C pour convalescent, M pour malade");
scanf("%c", tab.etatSante);
printf("\n");
printf("Categorie (jeune, adulte, vieux) ");
scanf("%s", tab.categ);
printf("\n");

}


for (i=0; i<taille; i++)
{
printf ("%ld %s %lf %lf %lf %lf %lf %c %c %s \n\n", tab.id, tab.nom, tab.dateNaiss.jj, tab.dateNaiss.mm, tab.dateNaiss.aaaa, tab.poidsNaiss, tab.poidsActuel, tab.sexe, tab.etatSante, tab.categ);
}

}


int main(int argc, char *argv[])
{
Colonie Souris[1];


int choix;

afficherMenu();
printf("Que voulez faire\n\n");
scanf("%ld", &choix);

switch (choix)
{
case 1:enregistrement(Souris, 1);
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
default: printf("Erreur");
}


system("PAUSE");
return 0;
}
 
Salam,

Tu n'a pas fait attention aux instructions SCANF de ton programme. En fait, scanf prend l'adresse de la variable ou on désire stocker l'information lue de l'entrée standard/clavier. Il faut ajouter le 'et' commercial (&) avant le nom de la variable qui va recevoir la valeur saisie, tu auras par exemple:

printf("Date de naissance (jj,mm,aaaa) ");
scanf("%lf %lf %lf", &tab.dateNaiss.jj, &tab.dateNaiss.mm, &tab.dateNaiss.aaaa);

n'oublie pas donc d'ajouter le fameux & dans toutes tes instructions scanf, je dis bien toutes, c une bonne pratique en développement C en effet ;)

Une autre chose cher NASON, ton programme est censé ajouter une souris d'une manière dynamique, càd à la demande de l'utilisateur. On ne sait pas au début combien de souris comportera la colonie. Le fait d'utiliser un tableau d'enregistrements colonie avec une taille figée (Colonie Souris[1]) est un mauvais choix pour assurer l'ajout dynamique. Même en utilisant l'allocation dynamique on aura toujours le même problème parce qu'on ne c pas la taille finale de la colonie avant de déclarer notre tableau d'enregistrements, c vrai qu'on peut opter pour une solution purement technique en utilisant l'instruction realloc qui fait la re-allocation de mémoire pour ajouter un nouveau enregistrement dans un tableau qui occupe un espace contigue de mémoire alloué dynamiquement avec l'une des instructions malloc(allocation uniquement) ou calloc(allocation + initialisation).

Comme je t'ai proposé la dernière fois, la structure de donnée la plus adaptée à ton cas c'est une liste chainée d'enregistrement. Cette structure va te permette l'ajout dynamique des souris à n'importe quel moment de l'exécution de ton programme. Tu peux jeter un œil sur ce tuto pour plus d'infos sur les listes chainées, ils sont indispensables pour faire ton projet:

http://www.siteduzero.com/tutoriel-3-36245-les-listes-chainees.html

Une dernière remarque, ton programme n'est pas tt à fait modulaire, vaux mieux mettre les déclarations des nouveaux types(structures) et les prototypes de tes fonctions dans un fichier d'entete *.h et le corps de tes fonction dans un fichier source *.c séparé du main, au moins juste pour avoir ta note complète ;) Déjà l'énoncé signale qu'une attention particulière sera accordée à la modularité de votre solution, c une raison de plus. Sinon, l'utilisation des fichiers d'entête est fortement recommandée dans la programmation en langage C, c'est une bonne pratique aussi.

Voila, bon courage pour le reste, j'attendrai la 2ème version de ton programme, si tu affronte des problèmes ou si tu veux des éclaircissement n'hésite surtt pas même en privé.

Tu fais quoi comme études en fait? ds quelle école?
 
Bonjour et grand merci pour ta réaction.

Au fait c'était tout juste pour tester ma fonction enregistrement que j'ai tout juste fait Colonie Souris[1].
Je croyais qu'avec les tableaux je n'ai pas besoin de mettre le fameux "&".

Pour la définition des structures et des fonctions dans le *.h, je l'ai fait, mais quand je fais le #include "fonctions.h" dans le main, la compilation refuse et m'indique une erreur à cette ligne. Ensuite j'ai le message suivant : (syntax befor "tab" ) en ce qui concerne ma fonction enregistrement.

Voudrais-tu essayer de mettre les structures et les fonctions dans un *.h et compiler pour me détecter le problème?

Merci
 
J'oubliais de te dire que je suis au Burkina Faso.

Pour les études j'ai opté pour l'informatique de gestion. Suis en première année dans une école appelé l'ISIG.
 
Merci pour ton code.

J'ai remarqué quelque chose que je voudrais comprendre.

Dans ton fichier fonction.c tu as mis les #include <stdio.h>, #include <stdlib.h> et tu as fais #include "fonction.h". C'est ce que je ne comprend pas. Je me disais que dans le fichier fonction.c on ne fait pas les #include et que le fonction.h ne peut être inclu dans le fonction.c. Aussi que les fichiers.h sont inclus seulement au niveau du main.c c'est à dire le programme principale?

J'ai créé un type enumération d'une variable, mais je n'arrive pas à afficher le contenu de la variable qui doit prendre soit masculin soit feminin. A l'affichage j'ai un truc comme ceci: <null>.

Voici une partie du code concernant le problème:

#include
#include


typedef struct Date Date;
struct Date {
long jj;
long mm;
long aaaa;
};

typedef enum genre genre;
enum genre
{
Masculin, Feminin
};



typedef struct Colonie Colonie;
struct Colonie {
long id;
char nom[15];
Date dateNaiss;
double poidsNaiss;
double poidsActuel;
genre sexe;
char etatSante[10];
char categ[8];
};


void afficherMenu()

{
printf("==========MENU===========\n\n");
printf("1- Nouvel enregistrement\n\n");
printf("2- Liste des Souris dans l'ordre croissant de l'age\n\n");
printf("3- Liste des Souris dans l'ordre décroissant du poids\n\n");
printf("4- Liste et nombre des Souris par sexe\n\n");
printf("5- Liste et nombre des Souris par categorie\n\n");
printf("6- Rechercher une Souris\n\n");

}


void enregistrement(Colonie Souris[], long taille)

{
long i, j;
char tmp;

for (i=0; i {
printf("Veuillez entrez les informations suivantes sur la Souris\n\n");
printf("Identifiant ");
scanf ("%ld", &Souris.id);
printf("\n");
printf("Nom ");
scanf("%s", &Souris.nom);
printf("\n");
printf("Date de naissance (jj,mm,aaaa) ");
scanf("%ld%ld%ld", &Souris.dateNaiss.jj, &Souris.dateNaiss.mm, &Souris.dateNaiss.aaaa);
printf("\n");
printf("Poids a la naissance et poids actuel ");
scanf("%lf%lf", &Souris.poidsNaiss, &Souris.poidsActuel);
printf("\n");

printf("Sexe(M pour masculin, F pour feminin) ");
scanf("%s", &tmp);

if(tmp!='m' && tmp!='M' && tmp!='f' && tmp!='F')
{
do
{
printf ("Erreur de saisie\n\n");
printf("Sexe(M pour masculin, F pour feminin) ");
scanf("%s", &tmp);
}

while (tmp!='m' && tmp!='M' && tmp!='f' && tmp!='F');
}

else if (tmp=='M' || tmp=='m')
{
Souris.sexe=Masculin;

}
else if (tmp=='F' || tmp=='f')
{
Souris.sexe=Feminin;
}

printf("\n");
printf("Etat de sante (B pour bien, C pour convalescent, M pour malade) ");
scanf("%s", &Souris.etatSante);
printf("\n");
printf("Categorie (Jeune, Adulte, Vieux) ");
scanf("%s", &Souris.categ);
printf("\n");

}


for (i=0; i {
printf("%ld %s %ld/%ld/%ld %lf %lf %s %s %s \n\n", Souris.id, Souris.nom, Souris.dateNaiss.jj, Souris.dateNaiss.mm, Souris.dateNaiss.aaaa, Souris.poidsNaiss, Souris.poidsActuel, Souris.sexe, Souris.etatSante, Souris.categ);
}

}


int main(int argc, char *argv[])
{


Colonie Souris[1];


int choix;

afficherMenu();
printf("Que voulez faire\n\n");
scanf("%ld", &choix);

switch (choix)
{
case 1:enregistrement(Souris, 1);
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
default: printf("Erreur\n");
}


system("PAUSE");
return 0;
}
 
Je suis un petit peu pri mnt, je reviendrai répondre à tes questions plus tard inchallah

Sinon, tu peux m'envoyer ton MSN en privé pour en discuter avec plus d'interactivité

cdlt
 
salut NASON,

dsl pour tout ce temps que j'ai mis pour répondre à tes questions, j'ai été un petit peu pris dernièrement, j'ai pas pu trouver du temps pour rédiger une réponse complète à tes questions. J'espère que tu as bien avancé sur ton projet si tu ne l'aurais pas déjà terminé.

Pour bien maitriser la programmation modulaire en langage C, il faut toujours garder en tête que pour qu'un programme puisse faire appel à une fonction quelconque; codée par toi même ou déjà pré-codée (malloc, printf, scanf, free,...) placée souvent dans un répertoire de ton IDE, il faut que le programme qui fait appel reconnait parfaitement cette fonction, il doit savoir sa signature(arguments + type de retour), son emplacement sur ton disque dure(chemin d'accès), le rôle des fichiers d'entête c'est justement de remplir ce besoin.

Lorsque tu appel la fonction scanf dans ton fichier fonctions.c, c'est normale que ton programme plante lamentablement là-dessus, sans inclure le stdio.h il ne connaitra pas une fonction qui s'appelle scanf, ni même comment l'utiliser, ni même aussi son emplacement. De même pour l'entête #include "fonctions.h". Mais la, cette entête placée dans le fichier source qui lui correspond, joue aussi un rôle aussi important, elle permet d'appeler des fonctions du même fichier source sans se soucier de l'ordre de leur déclaration, n'oublie pas qu'un programme C s'exécute d'une façon séquentielle, une fonction ne peut pas faire appel à une autre alors qu'elle a été déclaré avant elle. Maintenant lorsque tu utilise les fichiers d'entête, la première phase de compilation est de remplacer ces includes par le contenu des fichiers .h dont ils font référence. Du coup, avant la compilation de tout code, ton programme sait tout ce qu'il lui faut pour compiler les fonctions appelées. J'espère que tu vois mnt pourquoi j'ai utilisé cette structure dans "mon programme" et pourquoi tu as eu cet erreur bizarre lors de la phase de compilation.

Sinon pour les enums, franchement je savais pas qu'il y'a aussi des enums en C, à peine je les ai connu en java ya quelques semaines, tu vois NASON, j'apprends aussi de toi ;)

Bein, tu as null parce que tu veux afficher une chaine ce caractères à partir d'une enum (%s), alors que enum n'a rien à avoir avec les strings. D'après ce que j'ai trouvé sur le net, il n'y a pas un moyen pour afficher le contenu des enums(masculin feminin pour toi) tu ne peux afficher que l'index de l'enum pointée par ta variable, tu pourra peu être utiliser un switch/break pour tester l'index avant d'afficher le textes, mais franchement je comprends pas pourquoi tu utilise une enum ici. Une chaine de caractère voir même un char suffit pour jouer le tour:

char sexe[2];
do{
scanf("%s",sexe);
}while(sexe[0]!='m' && sexe[0]!='M' && sexe[0]!='f' && sexe[0]!='F');

et après affecte la valeur saisie et validée dans la structure colonie pointée. Fin, c'est juste une proposition, à toi de voir finalement.

Une dernière remarque cher NAZON, n'utilise jamais un char pour saisir un seul caractère(scanf(%c,&char)). C'est trop trop dangereux. Tu risque de récupérer du n'importe quoi, voir même récupérer une valeur alors que tu n'a rien saisie. En effet, l'entrée standard(clavier) a un buffer(mémoire tampon) dans lequel les caractères saisies sont stockés avant d'être fournies au programme qui demande un truc saisie à partir du clavier. Si par exemple j'exécute un programme qui demande 6 caractères de l'entrée standard alors que l'utilisateur saisie par exemple dix, il va fournir les 6 premiers caractères au programme en question et garder les quatre restants dans son buffer, lorsque un autre programme demande deux caractères du clavier il ne donnera pas la main à l'utilisateur pour les saisir, il va prendre automatiquement deux char de son buffer et les fournir à ce deuxième pauvre programme et ainsi de suite, l'utilisateur n'aura la main pour la saisie qu'avant l'épuisement de tout les caractères stockés dans le buffer, ça sera vraiment le chaos pour ton programme s'il lui arrive une chose pareille lors de son exécution. Pour plus d'infos sur la saisie sécurisée à partir du clavier je te recommande le tuto de Mateo sur le site du zéro, il est très bien fait comme tout ses autres tutos.

http://www.siteduzero.com/tutoriel-3-14185-la-saisie-de-texte-securisee.html

Voila, je te souhaite bon courage pour le reste, et désolé encore une fois pour tout le retard mis pour te répondre.

Bien cordialement,

PS: n'oublie pas de me tenir au courant de la version finale une fois terminée.
 
Bonjour

Je viens par là vous dire un grand merci pour votre collaboration.

Votre concours m'a beaucoup aidé dans la réalisation de mon code.

J'ai beaucoup tâtonné, mais je suis arrivé même si c'est programme
d'un débutant.

Merci
 
Bonjour

Je viens par là vous dire un grand merci pour votre collaboration.

Votre concours m'a beaucoup aidé dans la réalisation de mon code.

J'ai beaucoup tâtonné, mais je suis arrivé même si c'est programme
d'un débutant.

Merci

Je t'en prie, c'est un vrai plaisir pour moi

Sinon je suis curieux de voir le fruit de ton travail, tu n'a pas oublié de le joindre à ton dernier post par hasard ;)
 
Retour
Haut