Étude expérimentale de l’objet « trinôme »

TP en seconde sur les trinômes
mardi 4 janvier 2011
par  Alain BUSSER

Voici le sujet du TP (on remarquera que les élèves étaient en situation d’autonomie, le choix de l’outil leur étant plus ou moins laissé, avec 4 suggestions) :

le sujet du TP en pdf

Sans doute influencés par la préférence de leur professeur, les élèves ont presque tous choisi CaRMetal, la seule exception étant un élève doté d’une calculatrice Ti82Stats, et qui a d’ailleurs assez vainement tenté de s’en servir en lieu et place de JavaScript.

Plusieurs élèves ont d’emblée entré ceci :

var a;
var b;
var c;

Réflexe d’algorithmiciens... Puis la situation a évolué en

var a=Input("Entrez a");
var b=Input("Entrez b");
var c=Input("Entrez c");

Après c’est devenu moins facile, en particulier parce que devant un clavier, les élèves n’acceptent d’ouvrir un cahier, fût-ce celui du cours, que si on les y force...

Alors un élève a tenté de regarder comment était fait le fichier du cours. Un autre a tenté un

var a=Input("Entrez a");
var b=Input("Entrez b");
var c=Input("Entrez c");



var x=Input("x");

qui revient à demander à l’utilisateur de calculer l’abscisse du sommet de la parabole et de l’entrer à la main ! C’est très analogue à ces élèves qui, lors de l’épreuve expérimentale du Bac S, remplissent le tableur cellule après cellule grâce à la calculatrice !

Voici quelques copies d’élèves (souvent incomplets, il semble y avoir eu peu de travail à la maison) :

Copie 1

var a=Input("Entrez a");
var b=Input("Entrez b");
var c=Input("Entrez c");
Println(-b/(2*a));

Plusieurs élèves ont d’abord entré -b/2*a au lieu de -b/(2*a) ce qui les a parfois mené jusqu’au bout de l’heure pour comprendre pourquoi « ça ne marche pas » (non conformité avec l’exemple du livre : L’erreur est-elle dans le livre, dans la formule du cours ou dans celle du script ?).

Copie 2

var a=Input("Entrez a");
var b=Input("Entrez b");
var c=Input("Entrez c");
Println(-b/(2*a));
Println(c-b*b/(4*a));

Cette version a été assez répandue ; on constate la laconicité des affichages et le blocage sur les tests.

Copie 3

var a=Input("Entrez a");
var b=Input("Entrez b");
var c=Input("Entrez c");

var x=c-Math.pow(b,2)/(4*a);
Println("la valeur extrême de la fonction x est "+x);

La réponse à la question 3 sans passer par la question 2 témoigne d’une confusion entre x et y. Là encore, pas de tests (certains ont essayé de faire les tests à la main sans passer par le JavaScript).

Copie 4

//function trinômes et paraboles(a,b,c){
   var a=Input(" a ");
   var b=Input(" b ");
   var c=Input(" c ");
   if (a==0) {Println(" la fonction est affine ");
   } else {
      //d=a*(x*x)+b*x+c;
      e=-(b/(2*a));
      f=c-((b*b)/(4*a));
   }
   Println(" la fonction atteint son extremum en un point de coordonnée ("+e);
   Print(";"+f);
   Print(")");
   if(a<0) {Println(" l'extremum est le maximum de la fonction ");
   }
   if (a>0) {Println(" l'extremum est le minimum de la fonction ");
   }
//}

On constate

  1. L’absence du else : Ignorance de cette instruction ou choix délibéré pour éviter le cas a=0 ?
  2. Cet élève est le seul à avoir pensé au cas a=0 qui ne donne pas un trinôme ;
  3. Une ébauche de définition d’un objet trinôme au sens de la programmation objet (lignes devenues des commentaires).

Écrire un objet trinôme est possible, et même très probablement à la portée d’un élève de Seconde :

En JavaScript

function trinome(a,b,c){
	this.expression=a+"x²+("+b+")x+("+c+")";
	this.coeffx2=a;
	this.coeffx=b;
	this.coeffconstant=c;
	this.sommetx=-b/(2*a);
	this.sommety=c-b*b/(4*a);
	if(a>0){this.extremum="minimum";
	} else {
		this.extremum="maximum";
	}
	this.reponse=function(){
		if (this.coeffx2==0){
			Println(this.expression+" n'est pas un trinôme,");
			Println("c'est une fonction ");
			if (this.coeffx==0){
				Println("constante!");
			} else {
				Println("affine!");
			}
		} else {
			Println("Trinôme "+this.expression+" :");
			Println("Le "+this.extremum+" est atteint en "+this.sommetx+" et vaut "+this.sommety+".");
		}
	}
}
f=new trinome(-2,12,-16);
f.reponse();

En Python

class Trinome:
    def __init__(self,a,b,c):
        self.a=a
        self.b=b
        self.c=c
        
        self.sx=-b/(2*a)
        self.sy=c-b**2/(4*a)
        
        if(a>0):
            self.extr='minimum'
        else:
            self.extr='maximum'

    def affichage(self):
        print(str(self.a)+u'x\u00b2+('+str(self.b)+')x+('+str(self.c)+')')

    def verdict(self):
        print('Pour le trinome')
        self.affichage()
        print('le '+self.extr+' est atteint en '+str(self.sx))
        print('et vaut '+str(self.sy))
        

t=Trinome(-2,12,-16)
t.verdict()

Très concis...

En Ruby

class Trinome

    def initialize(a,b,c)
        #crée 3 variables et les affecte
        @a, @b, @c = a, b, c
    end

    def abscisse
        -@b/(2*@a)
    end

    def ordonnee
        @c-@b**2/(4*@a)
    end

    def extremum
        if @a>0 then 
            'minimum'
        else
            'maximum'
        end
    end
    
    def to_s
        @a.to_s+'x²+('+@b.to_s+')x+('+@c.to_s+')'
    end

    def verdict()
        puts('Pour le trinôme')
        puts(self.to_s)
        puts('le '+self.extremum+' est atteint en '+self.abscisse.to_s)
        puts('et vaut '+self.ordonnee.to_s)
    end

end

t=Trinome.new(-2,12,-16)
t.verdict()

Bien entendu, cette copie qui est la seule complète, a eu la note de 20 ; en plus l’élève a fini avant la fin de l’heure.

Une fois de plus, obliger les élèves à réinvestir dans une situation active (de programmation) plutôt que dans des exercices répétitifs (mais nécessaires : Il y aura aussi quelques séances Wims là-dessus) est très rentable, le cours pouvant servir à aider les élèves à réussir le TP, ce qui a au moins l’avantage d’aider les élèves à le regarder, ce cours, ce qui en milieu d’année scolaire, est loin d’être automatique !


Commentaires