def ecr_sc(parametre):
    from math import log10, floor
    question = ""
    exo = [u"Compléter par le nombre qui convient :",
           "\\begin{multicols}{3}", "  \\noindent%",
           "  \\begin{enumerate}"]
    cor = [u"Compléter par le nombre qui convient :",
           "\\begin{multicols}{3}", "  \\noindent%",
           "  \\begin{enumerate}"]
    for i in range(6):
        a = val_sc()
        exp = int(floor(log10(a)))
        a_sc = (a * 1.) / 10 ** exp
        s_a = decimaux(a, 1)
        s_a_sc = decimaux(a_sc, 1)
        if randrange(2):  # forme : a=a_sc*...
            exo.append("\\item $%s=%s\\times\\dotfill$" % (s_a,
                       s_a_sc))
            cor.append("\\item $%s=%s\\times\\mathbf{10^{%s}}$" % (s_a,
                       s_a_sc, decimaux(exp, 1)))
        else:

              # forme : a_sc*...=a

            exo.append("\\item $%s\\times\\dotfill=%s$" % (s_a_sc,
                       s_a))
            cor.append("\\item $%s\\times\\mathbf{10^{%s}}=%s$" % (s_a_sc,
                       decimaux(exp, 1), s_a))
    exo.append("\\end{enumerate}")
    exo.append("\\end{multicols}\n")
    cor.append("\\end{enumerate}")
    cor.append("\\end{multicols}\n")
    return (exo, cor, question)
def tex_proprietes_neg(parametre):
    question = ""
    exo = [u"Écrire sous la forme d'une puissance de 10 puis donner l'écriture",
           u" décimale de ces nombres :", "\\begin{multicols}{2}",
           "  \\noindent%", "  \\begin{enumerate}"]
    cor = [u"Écrire sous la forme d'une puissance de 10 puis donner l'écriture",
           u" décimale de ces nombres :", "\\begin{multicols}{2}",
           "  \\noindent%", "  \\begin{enumerate}"]
    lexos = [0, 1, 2, 3, 0, 1, 2, 3]

    #0: a^n*a^p ; 1: (a^n)^p ; 2:a^n/a^p

    for i in range(len(lexos)):
        lexp = [randrange(-6, 6) for i in range(2)]
        j = lexos.pop(randrange(len(lexos)))

        # FIXME : À finir

        if j == 0:
            while abs(lexp[0] + lexp[1]) > 10:
                lexp = [randrange(-6, 6) for i in range(2)]
            exo.append("\\item $10^{%s} \\times 10^{%s} = \\dotfill$" %
                       tuple(lexp))
            cor.append("\\item $10^{%s}\\times 10^{%s}=" % tuple(lexp))
            cor.append("10^{%s+%s}=" % (lexp[0], tex_coef(lexp[1],
                       '', bpn=1)))
            cor.append("10^{%s}=%s$" % (lexp[0] + lexp[1],
                       decimaux(10 ** (lexp[0] + lexp[1]), 1)))
        elif j == 1:
            while abs(lexp[0] * lexp[1]) > 10:
                lexp = [randrange(-6, 6) for i in range(2)]
            exo.append("\\item $(10^{%s})^{%s}=\\dotfill$" % (lexp[0],
                       lexp[1]))
            cor.append("\\item $(10^{%s})^{%s}=" % tuple(lexp))
            cor.append("10^{%s \\times %s}=" % (lexp[0], tex_coef(lexp[1],
                       '', bpn=1)))
            cor.append("10^{%s}=%s$" % (lexp[0] * lexp[1],
                       decimaux(10 ** (lexp[0] * lexp[1]), 1)))
        elif j == 2:
            while abs(lexp[0] - lexp[1]) > 10:
                lexp = [randrange(-6, 6) for i in range(2)]
            exo.append("\\item $\\dfrac{10^{%s}}{10^{%s}}=\\dotfill$" %
                       tuple(lexp))
            cor.append("\\item $\\dfrac{10^{%s}}{10^{%s}}=" % tuple(lexp))
            cor.append("10^{%s-%s}=" % (lexp[0], tex_coef(lexp[1],
                       '', bpn=1)))
            cor.append("10^{%s}=%s$" % (lexp[0] - lexp[1],
                       decimaux(10 ** (lexp[0] - lexp[1]), 1)))
    exo.append("\\end{enumerate}")
    exo.append("\\end{multicols}\n")
    cor.append("\\end{enumerate}")
    cor.append("\\end{multicols}\n")
    return (exo, cor, question)
def ecritureScientifique(parametre):
    question = u"Compléter l\'écriture scientifique :"
    exo = [ ]
    cor = [ ]
    a = val_sc()
    exp = int(floor(log10(a)))
    a_sc = (a * 1.) / 10 ** exp
    s_a = decimaux(a, 1)
    s_a_sc = decimaux(a_sc, 1)
    if randrange(2):  # forme : a=a_sc*...
        exo.append("$$%s=%s\\times\\ldots$$" % (s_a, s_a_sc))
        cor.append("$$%s=%s\\times\\boxed{10^{%s}}$$" % (s_a, s_a_sc, decimaux(exp, 1)))
    else:  # forme : a_sc*...=a
        exo.append("$$%s\\times\\ldots=%s$$" % (s_a_sc, s_a))
        cor.append("$$%s\\times\\boxed{10^{%s}}=%s$$" % (s_a_sc, decimaux(exp, 1), s_a))
    return (exo, cor, question)
def anteimage(fonc,A,B):
    #Génère la 1ère question et sa réponse

    l=[' l\'image de ',' un nombre qui a pour image ',u' un antécédent de ']
    lcor=[' est l\'image de ',' a pour image ',u' est un antécédent de '] #liste pour le corrigé
    i=random.randrange(0,2)
    j=i
    if i==1:
        j=i+random.randrange(0,2)
    res=[]
    res.append('Donner '+l[j]+'$'+decimaux(str(A[i]))+'$'+' par la fonction '+'\\textit{'+fonc+'}.')
    res.append('$'+decimaux(str(A[abs(i-1)]))+'$' + lcor[j]+'$'+decimaux(str(A[i]))+'$'+' par la \\hbox{fonction '+'\\textit{'+fonc+'}}.')
    if i==0:
        res.append(doublefleche((A[0],0),A))
        res.append(doublefleche(A,(0,A[1])))

    else:
        res.append(doublefleche((0,A[1]),A))
        res.append(doublefleche(A,(A[0],0)))
    i=abs(i-1)
    j=i
    if i==1:
        j=i+random.randrange(0,2)
    res.append('Donner '+l[j]+'$'+decimaux(str(B[i]))+'$'+' par la fonction '+'\\textit{'+fonc+'}.')
    res.append('$'+decimaux(str(B[abs(i-1)]))+'$'+lcor[j]+'$'+decimaux(str(B[i]))+'$'+' par la \\hbox{fonction '+'\\textit{'+fonc+'}}.')
    if i==0:
        res.append(doublefleche((B[0],0),B))
        res.append(doublefleche(B,(0,B[1])))
    else:
        res.append(doublefleche((0,B[1]),B))
        res.append(doublefleche(B,(B[0],0)))
    return res
def ArrondirDecimal(parametre):
    question = "Arrondir :"
    exo = []
    cor = []
    # Génération des variables
    (nombre, index_precision, defaut, exces, arrondi) = valeurs(parametre[0], parametre[1])
    # Choix du type d'arrondi
    type = randrange(3)
    if type == 0:
        solution = arrondi
    elif type == 1:
        solution = defaut
    elif type == 2:
        solution = exces
    # Affichage
    exo.append("\\begin{center}")
    exo.append("%s %s %s" % (decimaux(nombre),nom_precision[index_precision],nom_type[type]))
    exo.append("\\end{center}")
    cor.append("$$ %s < %s < %s $$" % (decimaux(defaut),decimaux(nombre),decimaux(exces)))
    cor.append("\\begin{center}")
    cor.append("L\'arrondi %s %s est $ \\boxed{%s} $" % (nom_precision[index_precision], nom_type[type], decimaux(solution)))
    cor.append("\\end{center}")
    return (exo, cor, question)
def IntercalerDecimal(parametre):
    question = "Intercaler un nombre entre :"
    exo = []
    cor = []
    # Génération des variables
    (nombre, index_precision, defaut, exces, arrondi) = valeurs(parametre[0], parametre[1])
    # Affichage
    exo.append("\\begin{center}")
    exo.append("%s et %s" % (decimaux(defaut),decimaux(exces)))
    exo.append("\\end{center}")
    exo.append("$$ %s < \\ldots < %s $$" % (decimaux(defaut),decimaux(exces)))
    cor.append("$$ %s < \\boxed{%s} < %s $$" % (decimaux(defaut),decimaux(nombre),decimaux(exces)))
    return (exo, cor, question)
def EncadrerDecimal(parametre):
    question = u"Compléter l\'encadrement de :"
    exo = []
    cor = []
    # Génération des variables
    (nombre, index_precision, defaut, exces, arrondi) = valeurs(parametre[0], parametre[1])
    # Affichage
    exo.append("\\begin{center}")
    exo.append("%s %s" % (decimaux(nombre),nom_precision[index_precision]))
    exo.append("\\end{center}")
    if randrange(2):
        exo.append("$$ \\ldots < %s < %s $$" % (decimaux(nombre),decimaux(exces)))
        cor.append("$$ \\boxed{%s} < %s < %s $$" % (decimaux(defaut),decimaux(nombre),decimaux(exces)))
        cor.append("\\begin{center}")
        cor.append(u"La valeur par défaut %s est $ \\boxed{%s} $" % (nom_precision[index_precision],decimaux(defaut)))
        cor.append("\\end{center}")
    else:
        exo.append("$$ %s < %s <  \\ldots $$" % (decimaux(defaut),decimaux(nombre)))
        cor.append("$$ %s < %s < \\boxed{%s} $$" % (decimaux(defaut),decimaux(nombre),decimaux(exces)))
        cor.append("\\begin{center}")
        cor.append(u"La valeur par excès %s est $ \\boxed{%s} $" % (nom_precision[index_precision],decimaux(exces)))
        cor.append("\\end{center}")
    return (exo, cor, question)
def tex_coord(coord):  #Affiche les coordonnées des points au format LaTeX
    return '\\hbox{$('+decimaux(str(coord[0]), 1) + '~;~' + decimaux(str(coord[1]), 1)+')$}'
def main(parametre):
    nbpts = 13
    noms_pts=(noms_sommets(nbpts))
    coord_pts=coordo_pts(nbpts)
    voc=['abscisse',u'ordonnée']
    rg1=random.randrange(0,2)
    rg2=abs(rg1-1)
    while len(coord_pts)<nbpts:
        coord_pts=coordo_pts(nbpts)
    question = ""
    exo=["\\parbox{0.4\\linewidth}{",
         "\\begin{enumerate}",
         u"\\item Donner les coordonnées des points %s, %s, %s, %s, %s et %s." % tuple(noms_pts[0:6]),
         u"\\item Placer dans le repère les points %s, %s, %s, %s, %s et %s" %noms_pts[6:12] +u" de coordonnées respectives %s, %s, %s, %s, %s et %s. " %tuple(tex_liste_co(coord_pts[6:12])),
         u"\\item Placer dans le repère le point %s d'%s %s et d'%s %s" %(noms_pts[12],voc[rg1],decimaux(str(coord_pts[12][rg1])),voc[rg2],decimaux(str(coord_pts[12][rg2]))),
         "\\end{enumerate}}\\hfill ",
         "\\parbox{0.55\\linewidth}{",
         "\\psset{unit=0.8cm}",
         "\\begin{pspicture}(-4.95,-4.95)(4.95,4.95)",
         "\\psgrid[subgriddiv=2, subgridcolor=lightgray, gridlabels=8pt](0,0)(-5,-5)(5,5)",
         "\\psline[linewidth=1.2pt]{->}(-5,0)(5,0)",
         "\\psline[linewidth=1.2pt]{->}(0,-5)(0,5)",
         place_points(coord_pts[0:6],noms_pts[0:6]),
         "\\end{pspicture}}"]
    cor=["\\parbox{0.4\\linewidth}{",
         "\\psset{unit=0.8cm}",
         "\\begin{pspicture}(-5,-5)(5,5)",
         "\\psgrid[subgriddiv=2, subgridcolor=lightgray, gridlabels=8pt](0,0)(-5,-5)(5,5)",
         "\\psline[linewidth=1.2pt]{->}(-5,0)(5,0)",
         "\\psline[linewidth=1.2pt]{->}(0,-5)(0,5)",
         place_points(coord_pts[0:13],noms_pts[0:13]),
         "\\end{pspicture}}\\hfill",
         "\\parbox{0.5\\linewidth}{",
         "\\begin{enumerate}",
         u"\\item Donner les coordonnées des points %s, %s, %s, %s, %s et %s." % tuple(noms_pts[0:6])]
    i=0
    while i<6:
        cor.append(u"Les coordonnées du point %s sont %s \n"%(noms_pts[i],affiche_coord(coord_pts[i])))
        i=i+1
    cor[len(cor):len(cor)]=[u"\\item Placer dans le repère les points %s, %s, %s, %s, %s et %s" %noms_pts[6:12] +u" de coordonnées respectives %s, %s, %s, %s, %s et %s. " %tuple(tex_liste_co(coord_pts[6:12])),
         u"\\item Placer dans le repère le point %s d'%s %s et d'%s %s" %(noms_pts[12],voc[rg1],decimaux(str(coord_pts[12][rg1])),voc[rg2],decimaux(str(coord_pts[12][rg2]))),
         "\\end{enumerate}"]
    cor.append("}")
    return(exo,cor,question)
def affiche_coord(coord):
    """Affiche les coordonnées des points au format LaTeX"""
    return '\\hbox{$('+decimaux(str(coord[0]), 1) + '~;~' + \
                                             decimaux(str(coord[1]), 1)+')$}'
def exprfonc(f,i,A,B):
#Génère la 3e question.
#A est sur l'axe des ordonnées, f est le nom de la fonction
    u=coefdir(A,B)
    if A[1]>=0:
        b='+'+decimaux(str(A[1]))
    else:
        b=decimaux(str(A[1]))
    if u[1]==1:
        coef=decimaux(str(u[0]))
        if u[0]==-1:
            coef='-' #utilisé dans l'expression de la fonction
        if u[0]==1:
            coef=''
        coefres=decimaux(str(u[0]))  #résultat utilisé pour a
    else:
        if u[0]>0:
            coef='\\dfrac{'+decimaux(str(u[0]))+'}{'+decimaux(str(u[1]))+'}'
        else:
            coef='-\\dfrac{'+decimaux(str(abs(u[0])))+'}{'+decimaux(str(u[1]))+'}'
        coefres=coef

    if A[1]-B[1]>0:
        deltay='+'+decimaux(str(A[1]-B[1]))
    else :
        deltay=decimaux(str(A[1]-B[1]))
    if A[0]-B[0]>0:
        deltax='+'+decimaux(str(A[0]-B[0]))
    else:
        deltax=decimaux(str(A[0]-B[0]))

    if float(B[0])<0 :
       mid11=float(B[0])-0.75
       mid12=float((B[1]+A[1]))/2   #milieu de la flèche verticale
    else:
        mid11=float(B[0])+0.75
        mid12=float((B[1]+A[1]))/2
    if float(B[0])*float(u[1]/u[0])>0 :
        mid21=float((A[0]+B[0]))/2
        mid22=A[1]-0.6               #milieu de la flèche horizontale
    else :
        mid21=float((A[0]+B[0]))/2
        mid22=A[1]+0.5
    if mid12 < 0 and mid12 >-0.8:
        mid12=-1
    if mid12 >= 0 and mid12 < 0.5:
        mid12=0.5
    if mid11 < 0 and mid11 >-0.8:
        mid11=-1
    if mid11 >=0 and mid11 < 0.5:
        mid11=0.5
    if mid21 < 0 and mid21 >-0.8:
        mid21=-1
    if mid21 >=0 and mid21 < 0.5:
        mid21=0.5
    if mid22 < 0 and mid22 >-0.8:
        mid22=-1
    if mid22 >= 0 and mid22 < 0.5:
        mid22=0.5
    mid1=(mid11,mid12)
    mid2=(mid21,mid22)

    l=[u'Déterminer l\'expression de la fonction $'+f+u'$ représentée ci-contre par la droite ($d_'+str(i)+'$).',
       u'On lit l\'ordonnée à l\'origine et le coefficient de la fonction affine sur le graphique.\\\ ',
       '$'+f+'(x)=ax+b$ ' +'avec $b='+ decimaux(str(A[1]))+'$ et $a='+'\\dfrac{'+deltay+'}{'+deltax+'}='+coefres+'$.\\\ ',
       'L\'expression de la fonction $'+f+'$ est $'+f+'(x)='+coef+'x'+b+'$.',
       doublefleche(B,(B[0],A[1])),
       doublefleche((B[0],A[1]),A),
       '\\rput'+str(mid1)+'{('+deltay+')}',
       '\\rput'+str(mid2)+'{('+deltax+')}']

    return l
def tracefonc(f,i,A,B,xmin,xmax,ymin,ymax):
#A est sur l'axe des ordonnées, f est le nom de la fonction
#Génère la 2e queston et sa réponse
    u=coefdir(A,B)
    if A[1]>=0:
        b='+'+decimaux(str(A[1]))
    else:
        b=decimaux(str(A[1]))
    if u[1]==1:
        coef=decimaux(str(u[0]))
        if u[0]==-1:
            coef='-'
        if u[0]==1:
            coef=''
        x1=decimaux(str(B[0]))
        y1=decimaux(str(B[1]))
        u[0]=u[0]*B[0]
    else:
        B=(u[1],u[0]+float(A[1]))
        if not dansrep(B,xmin,xmax,ymin,ymax):
            B=(-u[1],-u[0]+float(A[1]))

        x1=decimaux(str(B[0]))
        y1=decimaux(str(B[1]))
        if u[0]>0:
            coef='\\dfrac{'+decimaux(str(u[0]))+'}{'+decimaux(str(u[1]))+'}'
        else:
            coef='-\\dfrac{'+decimaux(str(abs(u[0])))+'}{'+decimaux(str(u[1]))+'}'

    x0='0'
    y0=b
    if coef=='' or (coef=='-' and B[0]>0) :
        st='On sait que $'+f+'(0)='+decimaux(str(A[1]))+'$ et $'+f+'('+x1+')='+coef+x1+b+'='+y1+'$.'
    elif coef=='-' and B[0]<0:
        st='On sait que $'+f+'(0)='+decimaux(str(A[1]))+'$ et $'+f+'('+x1+')='+coef+'('+x1+')'+b+'='+y1+'$.'
    elif B[0]<0:
        st='On sait que $'+f+'(0)='+decimaux(str(A[1]))+'$ et $'+f+'('+x1+')='+coef+' \\times ('+x1+')'+b+'='+decimaux(str(u[0]))+b+'='+y1+'$.'
    else:
        st='On sait que $'+f+'(0)='+decimaux(str(A[1]))+'$ et $'+f+'('+x1+')='+coef+' \\times '+x1+b+'='+decimaux(str(u[0]))+b+'='+y1+'$.'

    l=[u'Tracer la droite représentative ($d_'+str(i)+'$) de la fonction $'+f+':x\\longmapsto '+coef+'x'+b+'$.',
       st,
       '\\psdot [dotsize=4.5pt,dotstyle=x]'+str(A),
       '\\psdot [dotsize=4.5pt,dotstyle=x]'+str(B),
       ]

    return l
def ArrondirNombreDecimal(parametre):
    """Crée et corrige un exercice d'arrondis avec les encadrements."""
    hasard = [valide_hasard() for i in range(4)]

    precision = [
        u"au millième",
        u"au centième",
        u"au dixième",
        u"à l'unité",
        u"à la dizaine",
        u"à la centaine",
        "au millier",
        u"à la dizaine de milliers",
    ]

    choix = [(i, j) for i in range(7) for j in range(3)]
    shuffle(choix)

    choix_precision = [choix[i][0] for i in range(4)]
    choix_supinf = [choix[i][1] for i in range(4)]

    ##    choix_precision = [randint(0, 7), randint(0, 7), randint(0, 7),
    ##            randint(0, 7)]

    ##    choix_supinf = [randint(0, 2), randint(0, 2), randint(0, 2), randint(0, 2)]

    supinf = ["", u" par défaut", u" par excès"]
    # FIXME
    # Arrondir n'est pas synonyme de valeur approchée
    # Valeur approchée par excès 
    # Valeur approchée par défaut 
    # Arrondi = la « meilleure » valeur approchée
    # et ne paraît employé ici correctement

    nombres = [
        (hasard[0]) / (10 ** (-choix_precision[0] + 4)),
        (hasard[1]) / (10 ** (-choix_precision[1] + 4)),
        (hasard[2]) / (10 ** (-choix_precision[2] + 4)),
        (hasard[3]) / (10 ** (-choix_precision[3] + 4)),
    ]

    question = ""
    exo = ["\\begin{enumerate}"]
    cor = ["\\begin{enumerate}"]

    for k in range(4):
        exo.append(
            "\\item Arrondir "
            + decimaux(nombres[k])
            + " "
            + precision[choix_precision[k]]
            + supinf[choix_supinf[k]]
            + "."
        )

        arrondi = round(nombres[k], -choix_precision[k] + 3)

        if arrondi > nombres[k]:
            defaut = arrondi - 10 ** (choix_precision[k] - 3)
            exc = arrondi

        if arrondi <= nombres[k]:
            defaut = arrondi
            exc = arrondi + 10 ** (choix_precision[k] - 3)

        if choix_supinf[k] == 0:
            solution = arrondi
        elif choix_supinf[k] == 1:
            solution = defaut
        elif choix_supinf[k] == 2:
            solution = exc

        cor.append(
            "\\item L'encadrement de " + decimaux(nombres[k]) + " " + precision[choix_precision[k]] + " est :\\par"
        )
        cor.append(decimaux(defaut) + " < " + decimaux(nombres[k]) + " < " + decimaux(exc) + "\\par")
        cor.append(
            u"On en déduit que son arrondi "
            + precision[choix_precision[k]]
            + " "
            + supinf[choix_supinf[k]]
            + " est : "
            + decimaux(solution)
            + "."
        )

    exo.append("\\end{enumerate}")
    cor.append("\\end{enumerate}")

    return (exo, cor, question)