Vérification exercice structure de données

Résolu
Steve17_ Messages postés 1 Date d'inscription samedi 4 novembre 2023 Statut Membre Dernière intervention 4 novembre 2023 - Modifié le 6 nov. 2023 à 19:37
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 7 nov. 2023 à 19:18

Bonjour

J'ai fait cet exercice et j'ai besoin de vos remarques s'il vous plaît.

Merci !

Un nombre rationnel est un nombre s'exprimant sous la forme d'un ration n/d où n et d sont des entiers, tels que d !=0  ; n est le numérateur et d le dénominateur. On voudrait implémenter une bibliothèque de fonction, appelé rational.h qui propose des opérations d'addition et de soustraction, entre nombres rationnels ; elle devra également proposer des fonctions pour la lecture et l'affichage des nombres rationnels.

En rappel :

1/2 + 2/3 = ( 1*3 + 2*2)/(2*3) =7/6

1/2 * 2/5 =2/10 qui peut se normaliser en 1/5

(1/2)/(3/5) = 1/2 * 5/3 = 5/6

Le type rationnal est défini par la structure :

struct rational {
  int n;
  int d;
};

On voudrait par la suite declarer les variables directement à l'aide de l'identificateur de type rational

1. Proposer une instruction permettant de définir rational comme synonyme de *struct rational*

Réponse :

typedef struct {
  int n;
  int d;
} rational ;

2. Ecrire la fonction d'entête *rational read ()* de lire un nombre rationnel.

Réponse :

rational read() {
  rational r;
  printf("Entrer le numérateur et le dénominateur :\n")
  scanf("%d%d", &r.n, &r.d);
  return r;
}

3. Écrire la fonction *void printf(rational r)* permettant d'afficher un nombre rationnel.

Réponse :

void printf(rationnal r) {
  printf("%d%d\n", r.n, r.d);
}

4. Pour normaliser un nombre rationnel, on recherche le plus grand commun diviseur (pgcd) entre les valeurs absolues du numérateur et du dénominateur par cette valeur. Les fonctions *int abs(int x)*  qui renvoie la valeur absolue d'un nombre entier et *int pgcd (int n, int d) qui renvoie le plus grand commun diviseur vous étant fournies, écrire la fonction  *rational normaliser (rational r) permettant de normaliser un nombre rationnel.

Réponse :

rational normaliser (rational r) {
  int d = pgcd(abs(r.n), abs(r.d));
  r.n = d;
  r.d = d;
  return r:
}

5. Écrire la fonction   *rationnal add(rationnal r1 , rationnal r2)* permettant d'additionner deux nombres rationnels.

Réponse :

rational add(rational r1, rational r2){
  rational r;
  r.n = r1.n * r2.d  + r2.n * r1.d;
  r.d = r1.d * r2.d ;
  return r;
}

6. Écrire la fonction  *rational sub(rational r1, rational r2)*  permettant de soustraire deux nombres rationnels.

Réponse :

rational sub(rational r1, rational r2){
  rational r;
  r.n = r1.n * r2.d - r2.n * r1.d;
  r.d = r1.d * r2.d; 
  return r;
}

7. On voudrait créer un type  *Trational* pour stocker 10 nombres rationnels à la fois.

  1. Proposer une définition du type *Trational*

Réponse :

typedef rational Trational[10];

   2. Écrire la fonction  *void readT (T rationnal t, int n) qui se sert de la fonction précédente, pour lire et stocker n nombres rationnels.

Réponse :

void readT(Trational t, int n) {
  int i;
  for (i = 0; i<n; i++) t[i] = read();
}

   3. Écrire la fonction rational  *maxT(T rational t, int n) qui renvoie le plus grand nombre rationnel du tableau.

Réponse :

maxT(Trational t, int n) {
  int i;
  do{
  for (i = 0, i <n, i++)
  while t[i]=n;
  return r;

3 réponses

Puisqu'on te fournit les fonctions abs() et pgcd(), tu devrais pouvoir écrire toi-même un programme de test pour savoir si ça fonctionne.
Quelle est la règle qui te permet d'écrire:
1/2 + 2/3 = ( 1*3 + 2*2)/(2*3) =7/6

Comment calcule-t-on le ppcm (plus petit commun multiple)?

edit: pas besoin du ppcm si on normalise à la fin. Ce que tu ne fais pas.
Revérifies ta fonction normaliser()

Tu ne parles pas des fractions négatives. Comment traites-tu le nombre 0?

0
mamiemando Messages postés 33064 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 12 avril 2024 7 744
6 nov. 2023 à 19:44

Bonjour,

Dans les réponses que tu as données, il y a plein de petites erreurs que j'ai corrigé dans ton message :

  • En anglais : rational, en français : rationnel
  • Les types en C s'écrivent en minuscule (int, pas Int)
  • Les clauses d'une boucle for sont séparées par des points-virgules, pas des virgules.
  • L'instruction return n'est pas une fonction, donc pas besoin de parenthèses
  • Attention à l'indentation et aux espaces pour rendre ton code plus lisible.

Les réponses proposées semblent correctes (une fois ces corrections apportées) exceptée celle de la dernière question qui n'a aucun sens.

Par rapport au message de Pierrot :

  • Je ne pense pas que les fractions négatives soient un problèmes. Cependant tu peux avoir des représentations un peu bizarres (par exemple un numérateur et un dénominateur négatif). C'est parfaitement correct sur le plan mathématique, mais un peu inhabituel. Généralement seul le numérateur est un entier relatif.
  • Cependant, comme le dit Pierrot, tu dois contrôler que le dénominateur est non nul, sinon tu représentes des fractions qui n'ont aucun sens mathématiques.
  • Concernant ta dernière question, l'idéal serait d'avoir une variable temporaire qui maintient la meilleure valeur trouvé aux cours des itérations, et la corrigée à chaque itération.

Bonne chance

0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 7 nov. 2023 à 18:23

Salut Steve17_,

Aux remarques de Pierrot et de mamiemando, j'ajouterai que ton message est posté comme si tu n'avais même pas essayé de compiler et d'exécuter ton code.

Tu dois avoir un compilateur C, et tu dois donc t'en servir pour vérifier que :

  • ton code compile proprement sans erreurs ni avertissements (avec gcc tu peux lui passer au moins les options -Wall et -Wextra pour obtenir des avertissements utiles)
  • ton code fonctionne et se comporte comme tu l'attends

Les membres du forum ne sont pas là pour compiler et te signaler les erreurs ou avertissements générés lors de la compilation (ton compilateur le fait mieux que nous), ni pour observer le comportement du programme par rapport à ce que tu attends (tu le sais mieux que nous).

Une fois que tu as fait cela, si tu as toujours un problème que tu n'arrives pas à résoudre après avoir tenté de le résoudre, indique précisément quel est le problème en question :

  • une erreur de compilation ou un avertissement que tu n'arrives pas à corriger : copie colle ces erreurs ou avertissements et le code qui les génère et poste ta question
  • un code qui ne se comporte pas comme tu l'attends : poste le code concerné, ce que tu attends en termes de comportement, et le comportement erroné que tu constates

0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
7 nov. 2023 à 19:18

Sinon, à mon sens, tu fais un mauvais usage de l'instruction typedef en réponse à la question 1.

on te dit :

Le type rationnal est défini par la structure :

struct rational {
  int n;
  int d;
};

et on te demande :  1. Proposer une instruction permettant de définir rational comme synonyme de *struct rational*

Ce que tu fais dans ta réponse :

typedef struct {
  int n;
  int d;
} rational;

c'est que tu crées un nouveau type struct (sans étiquette) dans une instruction typedef chaînant la création du type et celle de son alias. Or, ce qu'on te demande, c'est d'utiliser le type "struct rational" existant pour créer un alias de ce type avec typedef.

Un programme qui fait ceci serait :

struct rational {
  int n;
  int d;
};
typedef struct rational rational;

int main(void) {
        return 0;
}
0