Adloun

Voici un programme dans un langage que vous ne connaissez pas

Exercice d'entraînement · niveau 2 · NSI (première), chapitre 3 — Langages et programmation · Lire, comparer et traduire des langages

Énoncé

Voici un programme dans un langage que vous ne connaissez pas :


int f(int t[], int n) {
    int s = 0;
    for (int i = 0; i < n; i++) {
        s = s + t[i] * t[i];
    }
    return s;
}

Le lire à l'aide des quatre questions de la méthode du cours, dire ce qu'il calcule, le traduire en Python, et vérifier la traduction.

Corrigé

Les quatre questions. Blocs : accolades. Affectation : =. Types écrits : oui, int partout — le tableau, sa taille, l'accumulateur, le résultat. Déclaration : le type précède le nom (int s = 0).

Ce que le programme calcule. s part de ; à chaque tour on lui ajoute t[i] * t[i]. C'est la somme des carrés des premiers éléments. La boucle for (int i = 0; i &lt; n; i++) se lit « part de , tant que , et augmente de » : c'est exactement for i in range(n).

La traduction.


def somme_carres(t):
    """Somme des carres des elements de t.

    Postcondition : le resultat est >= 0 (somme de carres).
    """
    s = 0
    for x in t:
        s = s + x * x
    return s

On a traduit la boucle par indice en boucle par élément : la position ne sert à rien ici, et la méthode du cours conseille alors le parcours par élément. L'argument n disparaît, puisque le tableau Python connaît sa longueur.

La vérification.


assert somme_carres([1, 2, 3]) == 14
assert somme_carres([]) == 0
assert somme_carres([-2, 5]) == 29
for _ in range(500):
    t = [random.randint(-9, 9) for _ in range(random.randint(0, 8))]
    assert somme_carres(t) == sum(x * x for x in t)

Les trois cas nommés et les tableaux aléatoires passent. Le cas [-2, 5] n'est pas décoratif : il vérifie que ce sont bien les carrés qui sont sommés () et non les valeurs absolues.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.