Cours d'Algorithmique

Salut à tous,

Actuellement je lis des cours d'algorithmique d'une connaissance qui a commencé les cours dans un IUT.
Et je suis étonné de certaines choses.
Depuis le début on leur fait utiliser la plupart du temps le SELON - FIN SELON.
Par exemple dans un algorithme qui doit donner le maximum de 2 valeurs, l'algo est :

selon x,y
  x >=y : max <- x
  x < y  : max <- y
fin selon

Parallèlement, ils ont commencé le C, et voici la traduction de l'exercice précédent (logique on ne peut pas utiliser un Switch ici):

if ( x >=y) 
   max = x;
else 
   max = y;

Pourquoi ne pas utiliser un if dans l'algo ?

Pour un autre exercice qui permet de savoir si un nombre est pair ou impair, l'algo va utiliser un selon, mais le C va utiliser un if alors qu'on pourrait utiliser un Switch ! quel est l'intérêt ?

Réponses

  • DrakenDraken Membre
    septembre 2020 modifié #2

    Je n'ai jamais fait d'algorithmique, mais cela ne me choque pas.

    A ma connaissance, l'algorithmique est une manière universelle de décrire un processus, sans rapport avec un langage particulier. Des choses comme le if et le switch sont des syntaxes techniques utilisés par des langages de programmation spécifiques.

    Pour être universelle, la description d'un processus doit se faire de manière totalement indépendante d'un langage. Par exemple, le Switch n'existe pas partout.

    Il y a deux niveaux :

    • la description du processus de manière théorique
    • l'implémentation de ce processus dans un langage particulier en utilisant sa syntaxe
  • J'ai vu plusieurs cours d'algorithmique, j'ai eu plusieurs profs aussi (oui j'ai eu une scolarité difficile) et y'a une seule constante : le prof utilise sont propre pseudo-code et il est généralement basé sur un language qu'elle ou il connait bien, et parfois le seul...

    Ma dernière prof d'algorithmique ne connaissait QUE le Cobol, il fallait déclarer les variables et les données en début de code et les tableaux devaient (pas pouvaient, DEVAIENT) commencer par l'indice 1.

    L'autre prof avait basé son pseudo-code sur un mélange C/Java et on a pu utiliser l'objet dans les algorithmes 😎

  • @Pyroh a dit :
    J'ai vu plusieurs cours d'algorithmique, j'ai eu plusieurs profs aussi (oui j'ai eu une scolarité difficile) et y'a une seule constante : le prof utilise sont propre pseudo-code et il est généralement basé sur un language qu'elle ou il connait bien, et parfois le seul...

    C'est fou, ça.. Il n'y a aucune normalisation dans ce domaine, pour permettre une compatibilité entre les cours/profs/formation/livres ?

  • Bah visiblement non. Après c'est des petites variations.

    Certains utilisent le a = 42 pour l'assignation de variable, d'autres a ← 42.
    Certains utilisent l'anglais d'autres le langage national local.

    Ça reste de l'abstraction simple de processus de gestion de données ou d'évènements au fond. Tu retrouve toujours les boucles, les tableaux, les branchements conditionnels, le principe de fonctions/procédures, etc...
    Comme il n'y a pas d'API le pseudocode est assez inter-opérable.

  • Oui et non.

    Ce qu'il faut c'est comprendre la logique, c'est tout. C'est un cours d'algorithme. Le fait qu'il soit soit à la fois proche et éloigné d'un language est intéressant, car quand j'ai appris à coder, j'ai vu plusieurs languages différents, mais une boucle for reste un boucle for (pour simplifier), assigner des valeurs, gestion de la mémoire, etc. Donc une absence de language commun ne me gêne aucunement.

    Ce qui me dérange dans le switch, c'est que ce sont des if/elseif cachés, donc que ça doit être bien compris pour celui qui apprend quand il devra l'appliquer ensuite, et que certains languages ne sont pas aussi "compatibles".
    Je préfère des if/else.

    Je pense au Swift & Objective-C, où je pourrais faire un switch sur un String en Swift, mais pas de switch sur un NSString en Objective-C.

  • @Larme a dit :
    Oui et non.

    Ce qu'il faut c'est comprendre la logique, c'est tout. C'est un cours d'algorithme. Le fait qu'il soit soit à la fois proche et éloigné d'un language est intéressant, car quand j'ai appris à coder, j'ai vu plusieurs languages différents, mais une boucle for reste un boucle for (pour simplifier), assigner des valeurs, gestion de la mémoire, etc. Donc une absence de language commun ne me gêne aucunement.

    Ce qui me dérange dans le switch, c'est que ce sont des if/elseif cachés, donc que ça doit être bien compris pour celui qui apprend quand il devra l'appliquer ensuite, et que certains languages ne sont pas aussi "compatibles".
    Je préfère des if/else.

    Je pense au Swift & Objective-C, où je pourrais faire un switch sur un String en Swift, mais pas de switch sur un NSString en Objective-C.

    Possible avec des macros, exemple ici https://gist.github.com/axelarge/5990587

  • J'évite au maximum les macros.
    Mais je me rappelle d'avoir vu un CocoaHeads parler d'un switch en Objective-C plus "ouvert", mais beaucoup de boulot derrière je crois... 'fin bref.

  • DrakenDraken Membre
    septembre 2020 modifié #9

    @Larme a dit :
    J'évite au maximum les macros.
    Mais je me rappelle d'avoir vu un CocoaHeads parler d'un switch en Objective-C plus "ouvert", mais beaucoup de boulot derrière je crois... 'fin bref.

    🦕C🦟C++🦖Objective-C🦨🐛 .. le long cheminement de l'évolution !

  • CéroceCéroce Membre, Modérateur

    @helio a dit :

    Pourquoi ne pas utiliser un if dans l'algo ?
    Pour un autre exercice qui permet de savoir si un nombre est pair ou impair, l'algo va utiliser un selon, mais le C va utiliser un if alors qu'on pourrait utiliser un Switch ! quel est l'intérêt ?

    Comme dit plus haut, chaque prof utilise son propre pseudo-code, on se demande d'où ça sort… mais en même temps, si la syntaxe du C a «gagné» d'autres langages raisonnaient un peu différemment.

    Personnellement, même en C, à présent j'utilise plutôt l'opérateur ternaire:

    max = x > y ? x : y;
    

    parce que ça se rapproche de la programmation fonctionnelle.

    Le if sans else provoque des effets de bord parce qu'il y a un cas où on effectue une action et un cas laissé presque au hasard.

  • CéroceCéroce Membre, Modérateur
    septembre 2020 modifié #11

    @Larme a dit :
    Ce qui me dérange dans le switch, c'est que ce sont des if/elseif cachés, donc que ça doit être bien compris pour celui qui apprend quand il devra l'appliquer ensuite, et que certains languages ne sont pas aussi "compatibles".
    Je préfère des if/else.
    Je pense au Swift & Objective-C, où je pourrais faire un switch sur un String en Swift, mais pas de switch sur un NSString en Objective-C.

    En C et Objective-C, les switches ne sont que sucre syntaxique. Mais pas en Swift où switch est l'opérateur de «pattern matching». C'est un outil qui offre un niveau d'abstraction plus grand. Le C essaie toujours de coller au code machine qui va être généré, alors que Swift se la joue «langage fonctionnel».
    De la même manière, les struct et enum sont des types algébriques en Swift (fonctionnels), alors qu'en C, ça va coller directement à la représentation en mémoire.

    J'avoue ne pas trop savoir quelle est la bonne attitude pour un cours d'algorithmie. Je crois que ces jours-ci, les étudiants implémentent en Haskell et sont plus concernés par la complexité des algos que par le code machine généré.

Connectez-vous ou Inscrivez-vous pour répondre.