Connaissances Informatiques >> programmation >> C /C + + Programming >> Content
  Derniers articles
  • Comment créer auto_ptr Syntaxe 
  • Comment faire pour convertir des num…
  • Comment utiliser la fonction strspn …
  • Lorsqu'une instruction est exécuté…
  • Comment rechercher une chaîne dans …
  • Comment utiliser le Microsoft Visual…
  • Qu’est-ce que l’attribution de plusi…
  • Comment faire une chaîne d'accepter…
  • Comment afficher une virgule dans C …
  • Ajout d'un nœud de TreeView 
  •   C /C + + Programming
  • C /C + + Programming

  • Computer Programming Languages

  • Delphi Programming

  • Programmation Java

  • Programmation JavaScript

  • PHP /MySQL Programmation

  • programmation Perl

  • Programmation Python

  • Ruby Programming

  • Visual Basics programmation
  •  
    C /C + + Programming

    Quelle est la différence entre une précondition et une postcondition en programmation C ?

    En programmation C (et en programmation en général), les préconditions et postconditions sont des assertions sur l'état des variables ou des structures de données d'un programme qui devraient être valables avant et après l'exécution d'une fonction, respectivement. Ils sont importants pour concevoir du code robuste et fiable, en particulier dans les systèmes complexes. Bien que C n'ait pas de prise en charge intégrée des mots clés pour les préconditions et postconditions formelles comme certains autres langages (par exemple, les contrats dans Eiffel), les concepts restent cruciaux et peuvent être implémentés à l'aide d'assertions et de commentaires.

    Voici un aperçu de la différence :

    1. Condition :

    * Définition : Une condition qui doit être vraie *avant* qu'une fonction soit appelée pour qu'elle fonctionne correctement et garantisse son comportement. Il est de la responsabilité de *l'appelant* de s'assurer que les conditions préalables sont remplies. Si une condition préalable n'est pas respectée, le comportement de la fonction n'est pas défini ; il peut planter, produire des résultats incorrects ou se comporter de manière imprévisible.

    * Objectif :

    * Clarifier les entrées et l'environnement attendus : Les conditions préalables documentent ce qu'une fonction attend. Cela rend la fonction plus facile à comprendre et à utiliser.

    * Prévenir les erreurs et les bugs : En vérifiant les conditions préalables (à l'aide d'assertions), vous pouvez détecter et prévenir les erreurs dès le début du processus de développement.

    Activer l'optimisation : Si une fonction sait que certaines conditions seront toujours vraies, elle peut effectuer des optimisations qui ne seraient pas sûres autrement.

    * Documentation : Une documentation claire permet aux autres développeurs d'utiliser la fonction correctement.

    * Responsabilité : L'*appelant* de la fonction est chargé de s'assurer que toutes les conditions préalables sont vraies avant d'appeler la fonction.

    * Exemple :

    ```c

    #include

    #include

    // Fonction pour calculer la factorielle d'un nombre

    int factoriel(int n) {

    // Précondition :n doit être non négatif

    affirmer (n>=0);

    si (n ==0) {

    renvoyer 1 ;

    } autre {

    return n * factoriel(n - 1);

    }

    }

    int main() {

    int résultat =factoriel(5); // Précondition satisfaite

    printf("Factorial de 5 :%d\n", résultat);

    // factorielle(-1); // Précondition violée ! Cela entraînera un échec d’assertion.

    renvoie 0 ;

    }

    ```

    Dans cet exemple, la fonction « factorielle » a une condition préalable selon laquelle « n » doit être non négatif. L'instruction `assert(n>=0)` vérifie cette condition préalable. Si « n » est négatif, l'assertion échouera et le programme se terminera (dans une version de débogage).

    2. Postcondition :

    * Définition : Une condition qui doit être vraie *après* qu'une fonction ait été exécutée avec succès. Il décrit l'état du programme (variables, structures de données, valeur de retour) une fois que la fonction a terminé sa tâche. Il est de la responsabilité de la *fonction* de s'assurer que les postconditions sont remplies, *en supposant* que les conditions préalables soient remplies.

    * Objectif :

    * Garantir l'effet de la fonction : Les postconditions documentent ce que la fonction *promet* de faire.

    * Vérifier l'exactitude : En vérifiant les postconditions (à l'aide d'assertions), vous pouvez vérifier que la fonction produit les résultats attendus.

    * Faciliter le débogage : Si une postcondition est violée, cela indique un bug dans la fonction elle-même.

    * Documentation : Une documentation claire permet aux autres développeurs de comprendre le comportement de la fonction.

    * Responsabilité : La *fonction elle-même* est chargée de s'assurer que toutes les postconditions sont vraies avant de revenir.

    * Exemple :

    ```c

    #include

    #include

    // Fonction pour calculer le carré d'un nombre

    int carré (int x) {

    int résultat =x * x;

    // Postcondition :le résultat doit être non négatif (si x est un entier)

    assert(résultat>=0); // Cela pourrait échouer en raison d'un dépassement d'entier si x est très grand.

    renvoyer le résultat ;

    }

    int main() {

    int résultat =carré(5);

    printf("Carré de 5 :%d\n", résultat);

    int grand_nombre =100 000 ; //Pourrait provoquer un débordement

    résultat =carré (grand_nombre); // La postcondition peut échouer en raison d'un débordement.

    printf("Carré de %d :%d\n",grand_nombre, résultat);

    renvoie 0 ;

    }

    ```

    Dans cet exemple, la fonction « carré » a une postcondition selon laquelle « résultat » doit être non négatif (en supposant que « x » soit un nombre entier). L'instruction `assert(result>=0)` vérifie cette postcondition. Si le résultat est négatif (en raison d'un dépassement d'entier, par exemple), l'assertion échouera.

    Résumé des principales différences :

    | Fonctionnalité | Condition préalable | Postcondition |

    | ---------------- | ---------------------------------------------- | ------------------------------------------------ |

    | Calendrier | Vérifié *avant* que la fonction s'exécute | Coché *après* l'exécution de la fonction |

    | Responsabilité | Appelant de la fonction | Fonction elle-même |

    | Objectif | Définir l'entrée et l'environnement attendus | Définir le comportement et l'effet garantis de la fonction |

    | Violation | Indique un problème dans le *code d'appel* | Indique un problème *au sein de la fonction* |

    | Garanties | La fonction peut fonctionner correctement | La fonction aura atteint l'effet escompté |

    Comment implémenter en C :

    Étant donné que C n'a pas de support intégré pour les préconditions et postconditions, l'approche standard consiste à utiliser :

    1. Macro `assert()` (à partir de ``) :C'est la manière la plus courante de vérifier les conditions. Les assertions sont généralement activées dans les versions de débogage (par exemple, avec l'indicateur du compilateur `-DDEBUG`) et désactivées dans les versions de version. Cela signifie que les contrôles ont lieu pendant le développement mais sont optimisés dans le produit final pour éviter une surcharge de performances.

    2. Blocs `#ifdef DEBUG` :Vous pouvez également utiliser `#ifdef DEBUG` pour inclure de manière conditionnelle des vérifications de précondition et de postcondition plus complexes qui peuvent impliquer plus qu'une simple comparaison.

    3. Commentaires :Même si vous n'utilisez pas d'assertions, il est crucial de documenter les préconditions et postconditions dans les commentaires pour rendre votre code plus compréhensible.

    4. Cadres de test : Envisagez d'utiliser des frameworks de test qui prennent en charge les vérifications pré/post-condition pour faciliter les tests unitaires.

    Exemple avec des préconditions, des postconditions et des commentaires combinés :

    ```c

    #include

    #include

    /**

    * @brief Calcule la puissance d'un nombre (base élevée en exposant).

    *

    * @param base Le numéro de base (entier).

    * @param exponent L'exposant (entier non négatif).

    *

    * @pre exposant>=0 (l'exposant doit être non négatif).

    * @pre base !=0 || exposant !=0 (base et exposant pas tous les deux 0 - évite un comportement indéfini)

    *

    * @post Renvoie la base élevée à la puissance de l'exposant.

    * @post Si l'exposant est 0, le résultat est 1 (sauf pour base =0, qui n'est pas autorisé).

    *

    * @return Le résultat de la base élevée à la puissance de l'exposant.

    * Renvoie 1 si l'exposant est 0.

    */

    int puissance (int base, int exposant) {

    // Conditions préalables :

    assert (exposant>=0);

    assert(base !=0 || exposant !=0); //Empêcher un comportement non défini avec 0^0

    résultat entier =1 ;

    pour (int i =0; i résultat *=base ;

    }

    // Postconditions :

    si (exposant ==0) {

    assert(résultat ==1); // Vérification du cas de base

    }

    renvoyer le résultat ;

    }

    int main() {

    int résultat =puissance (2, 3); // 2 ^ 3 =8

    printf("2^3 =%d\n", résultat);

    résultat =puissance (5, 0); // 5^0 =1

    printf("5^0 =%d\n", résultat);

    //puissance(0,0); // Cela déclenchera l'assertion.

    renvoie 0 ;

    }

    ```

    Avantages de l'utilisation des préconditions et des postconditions :

    Qualité du code améliorée : Ils vous obligent à bien réfléchir aux hypothèses et garanties de vos fonctions.

    * Débogage plus facile : Les assertions permettent de détecter rapidement les erreurs et d'identifier la source des problèmes.

    * Meilleure documentation : Ils documentent clairement le comportement attendu de vos fonctions.

    * Maintenabilité accrue : Ils rendent votre code plus facile à comprendre et à modifier, ce qui réduit le risque d'introduction de bugs.

    * Vérification formelle : Dans certains cas, les conditions préalables et postconditions peuvent être utilisées avec des outils de vérification formelle pour prouver l'exactitude de votre code.

    En incorporant des préconditions et des postconditions dans votre code C (même en utilisant uniquement des commentaires et des assertions), vous pouvez écrire un logiciel plus robuste, fiable et maintenable.

     
    Article précédent:
    Article suivant:
    Articles recommandés
  • Comment utiliser des tableaux pour réaliser des matrices en C + + 
  • Qu'est-ce que le modèle LMCC dans le modèle de calcul parallèle ? 
  • Comment créer un CAB dans Windows Mobile 
  • Comment compiler C + + sous Linux 
  • Fonction récursive en C 
  • Comment ajouter une DLL dans Visual C 
  • Comment lire un fichier Hex Avec ANSI C 
  • Comment faire un graphique en mouvement en C # 
  • Comment afficher plusieurs colonnes dans GridView 
  • Comment utiliser des bannières et des autocollants dans GTK Radiant 
  • Connaissances Informatiques © http://www.ordinateur.cc