Dernière modification : 18/10/2022 à 17:53
Essayez de n’utiliser que le terminal pour créer vos répertoires et fichiers, compiler, et lancer vos programmes.
Créer un répertoire “4r-in1a” et un sous répertoire “tp1”.
Dans ce repertoire, mettre en place un “projet” avec quatre fichiers :
Votre makefile doit vous permettre de compiler sans erreur (tp1.c/tp1.h sont vides pour l’instant).
Commandes utiles : mkdir, cp, ls, touch.
Programmes d’éditions des fichiers : gedit, vim, nano, … si vous utilisez un programme qui occupe la fenetre du terminal, ouvrez en un autre pour ne pas avoir a fermer votre éditeur à chaque fois que vous souhaitez compiler / tester.
ajoutez aux fichiers tp1.c/tp1.h la fonction print_message(char*);
qui affiche la chaine passée en paramètre sur la sortie standard.
modifiez le main() dans test.c pour appeler la fonction avec la chaine “hello” dans un premier temps, testez, puis faites évoluer le programme pour qu’il affiche la première chaine de caractères passée en paramètre sur la ligne de commande si il y en a une, ou le message “Message par defaut” sinon. Vous ne devez pas modifier la fonction print_message() a ce stade, uniquement le main().
faites évoluer encore le programme pour qu’il demande à l’utilisateur de saisir une chaine de caractère si il n’y en a pas de passée sur la ligne de commande
si il y a plusieurs chaines de caractères passées sur la ligne de commande, le programme doit toutes les afficher (plusieurs appels à print_message())
ajoutez la fonction int calcule(int a, int b, char op);
qui teste la valeur de op (avec un switch), si c’est un des caractères + - * / la fonction réalise l’opération correspondante avec les deux opérandes a et b et renvoie le résultat. Sinon, le programme demande à l’utilisateur de saisir un caractère à l’aide de scanf. Si l’utilisateur ne saisi pas un caractère correct, le programme lui signifie et redemande la saisie d’un autre caractère et ainsi de suite.
l’affichage du résultat se fait dans la fonction main() : testez toutes les possibilités (un caractère valide, puis un caractère non valide)
modifiez le main() pour qu’il lise les paramètres de la fonction sur la ligne de commande. Utilisez sscanf pour lire des entiers dans des chaines de caractères.
Exemple d’appel correct du programme :
$> ./a.out test 33 404 + 437 $>
$> ./a.out test 33 404 +
437
$>
$> ./a.out test "33 + 404" 437 $>
$> ./a.out test "33 + 404"
437
$>
Écrivez la fonction nb_partition(int n, int t);
qui calcule récursivement le nombre de
décompositions additives d’un nombre n en utilisant les nombres de 1 à t.
Par exemple, il y 10 façons de faire 6 avec les nombres de 1 à 5 (5+1, 4+2, 4+1+1, 3+3, 3+2+1, 3+1+1+1, 2+2+2, 2+2+1+1, 2+1+1+1+1+1, 1+1+1+1+1+1). On utilisera le
principe suivant :
Écrivez les fonctions :
Testez les deux premières avec des tableaux déclarés sur la pile du main(), et pour la troisième faites afficher par votre programme la ligne de commande qui l’a lancé.
int* new_int_tab(int size);
qui prend en paramètre un entier, alloue un tableau de cette taille, et renvoie son adresse. La fonctino renvoie NULL en cas de problème d’allocation. Le main() devra donc tester le retour avant d’utiliser le tableau.void free_int_tab(int*);
qui libère la mémoire associée au tableau. À quoi sert cette fonction ? pourquoi ne pas utiliser directement free(); ?void swap(int* a, int* b);
qui échange les valeurs des variables (de type int) pointées par a et b.void swap(void* a, void* b, int size_t);
qui échange les valeurs des variables (de type inconnu) pointées par a et b. Pour la copie, vous utiliserez la fonction memcpy().Définir les types suivants :
t_Date
: représente une date avec trois entiers (jours, mois, an)t_Identite
: représenter une personne avec deux chaines de caractères (nom, prenom). La taille des tableaux stockant les chaines peut être fixée à 10 (définissez une constante avec #define).t_Adresse
: une adresse composée d’un entier (code postal) et d’une chaine de caractères (ville), limité à 9 lettres encore pour simlifier.Écrivez (et testez) les fonctions suivantes :
int est_bissextile(t_Date d1);
qui retourne 1 si l’année est bissextile, 0 sinonint nb_jours_par_an(t_Date d1);
qui calcule et retourne le nombre de jours de l’année de d1nb_jours_par_mois(t_Date d1);
qui retourne
char* nom_jour(t_Date d1);
qui retourne le nom du jour de la date d1. Il suffira d’appeler la fonction pour connaître le nom du jour d’une date.int cmp_dates( t_Date d1 , t_Date d2);
qui
int cmp_identites( t_Identite id1, t_Identite id2);
qui
int cmp_adresses(t_Adresse ad1, t_Adresse ad2);
qui
Créer une 1 ère structure t_Eleve pouvant contenir les informations
suivantes :
Créer une 2 ème structure qui va représenter l’annuaire. Cette structure Annuaire contiendra :
Créer une fonction t_Eleve* saisie_eleve(t_Identite id, t_Date naiss);
Le pointeur retouné par saisie_eleve sera rangé dans la première place libre du tableau de l’annuaire et le compteur cpt incrémenté de 1.
Créer ensuite une procédure afficher_eleve qui affiche les informations contenues dans une structure t_Eleve e1 passée en argument (pointeur pour éviter les copies) : void afficher_eleve(t_Eleve * e );
Créer une fonction qui recherche un t_Eleve e dans l’ annuaire selon le critère nom de l’élève donné en argument :int ceherche_eleve(char *nom );
. La fonction retourne
Créer une fonction int anniversaires(t_date d1);
qui retourne le nombre d’élèves dont l’anniversaire est d1