Vous êtes sur la page 1sur 7

2018 ICNA 1/ 7

2018 ICNA - Informatique


1°) Intrus Réponse C
L’iso 8859-1 est un standard européen, plus connu sous le nom de latin1. Il intègre les
ASCII américains plus les lettres accentuées et ponctuations dont nous avons le secret.
Les amateurs de LATEX l’utilisaient fréquemment avant de passer à l’UTF-8.
L’ASCII est une des plus vielles références américaines et l’UTF-8 est la dernière tenta-
tive effectuée pour disposer d’une table de caractères universels, incluant tous les langages
connus.
2°) Réponse D pour l’essentiel.
Les logiciels libres sont souvent gratuits mais pas toujours.
Ils n’ont à priori pas de restriction temporelle d’exécution mais ils ne sont pas seuls à
posséder cette caractéristique.
3°) Réponse aucune.
Un tri par fusion est en pratique en O(n log(n)).
Note : La notation Big O souligne la majoration du processus par une fonction type. Á
ce titre un processus qui est O(n log(n)) est aussi O(n2 ), et O(n2 log(n)). Selon l’inter-
prétation les réponses A et D peuvent être considérées comme correctes.
4°) Aucune bonne réponse dans la distribution (cf. code ci-après).
Solution possible  res5
Code
1 aero="/Toulouse"
2 compagnie="-AirFrance"
3 oaci="(LFBO)-"
4 ville="-Blagnac"
5 # Suggestion
6 res1=(compagnie+aero+ville+oaci).replace("-","",1)
7 res2=(compagnie+aero+ville+oaci).replace("-","",1)
8 res3=res1[1:].replace("-","")
9 res4=(compagnie+aero+ville+oaci)[1:]
10 # Correction
11 res5=(compagnie+aero+ville+oaci)[1:-1]
12

13 print(res1,res2,res3,res4,"",res5,sep="\n")

Affichage
1 AirFrance/Toulouse-Blagnac(LFBO)-
2 AirFrance/Toulouse-Blagnac(LFBO)-
3 irFrance/ToulouseBlagnac(LFBO)
4 AirFrance/Toulouse-Blagnac(LFBO)-
5

6 AirFrance/Toulouse-Blagnac(LFBO)

5°) Réponse C → 20.


Le test sur main est vrai uniquement si le script est lancé comme programme principal
ce qui est ici le cas. On somme ensuite 5 × 4 = 20.

Christophe Caire 19 avril 2018 Corrigé du sujet Info


2018 ICNA 2/ 7

1 #Fichier icna5.py
2 n=0
3 if __name__=="__main__":
4 for i in range(5):
5 n=n+4
6 else:
7 for i in range(3,6):
8 n=n+4
9 print(n)

6°) Réponse A et D.
La convergence de la méthode de Newton n’est pas assurée, il faut donc prévoir une
sortie de boucle liée au nombre d’itérations.
7°) Réponse A certaine.
La validité de la réponse dépend toutefois de la fonction étudiée car la convergence dans
le cas général n’est pas assurée.

Réponse C et D possibles car la propriété très proche de zéro relève d’une qualification
adéquate au café du commerce et déplacée dans une épreuve de concours. Dans le cadre
du café du commerce, la D sera probablement considérée comme fausse.
1 def methodeNewton(f,pas,x):
2 for i in range(0,pas):
3 # Emploi du quotient f/f'
4 x1=x-f(x)/(3*x**2-(3/2))
5 x=x1
6 return x
7

8 def f(x):
9 return x**3-(3/2)*x-2
10

11 #Initialisation
12 x0=8
13 pas=10
14 # Execution
15 x=methodeNewton(f,pas,x0)
16 # Codes de formatage obsolètes
17 print("x=%0.6f"%x)
18 print("f(x)=%0.6f"%f(x))

8°) Réponses A et C.
Le programme présenté calcule l’aire d’une fonction dans un intervalle. C’est une ap-
proximation de la fonction f par la méthode des rectangles à gauche. Le résultat dépend
donc du nombre d’intervalles. Contrairement à ce que suggère la question il y a bien 100
itérations pour i variant de 0 à 99.

L’intégrale vaut :
1 1
x4 3 2
Z 
5
f (x) dx = − x − 2x =−
0 4 4 0 2

Christophe Caire 19 avril 2018 Corrigé du sujet Info


2018 ICNA 3/ 7

Code commenté
1 def rectangle(f,xA,xB,intervalles):
2 resultat,i=0,0
3 base=(xB-xA)/intervalles
4 # très maladroit - boucle itérative préférable
5 while i <intervalles:
6 resultat=resultat+f(xA+i*base)*base
7 i+=1
8 return resultat
9

10 def f(x) :
11 return x**3-(3/2)*x-2
12

13 #Initialisation
14 xA,xB=0.0,1.0
15 intervalles=100
16 # méthode d'intégration
17 resultat=rectangle(f,xA,xB,intervalles)
18 print("resultat=%0.6f"%resultat)

Résultat affiché
1 resultat=-2.497475

9°) Réponse C.
Le code précédent est légèrement modifié pour prendre en compte la valeur de la fonction
au milieu d’un intervalle. C’est encore une méthode d’intégration de f approchée par
des rectangles mais au centre.

Si la fonction peut s’approximer par un développement limité sur l’intervalle considéré,


la méthode est plus précise que la version précédente car l’ordre un est sommé sur un
intervalle symétrique et s’annule.

Dans le cas général, on ne peut conclure aussi trivialement. Elle est en fait égale à la
précédente décalée d’un demi-intervalle.
Réponse B éventuellement.

Christophe Caire 19 avril 2018 Corrigé du sujet Info


2018 ICNA 4/ 7

Code commenté
1 def median(f,xA,xB,intervalles):
2 resultat,i=0,0
3 base=(xB-xA)/intervalles
4 # très maladroit - boucle itérative préférable
5 while i <intervalles:
6 resultat=resultat+f(xA+(2*i+1)/2*base)*base
7 i+=1
8 return resultat
9

10 def f(x) :
11 return x**3-(3/2)*x-2
12

13 #Initialisation
14 xA,xB=0.0,1.0
15 intervalles=100
16 # méthode d'intégration
17 resultat=median(f,xA,xB,intervalles)
18 print("resultat=%0.6f"%resultat)

Résultat affiché
1 resultat=-2.500012

10°) Année Bissextile.


Réponse B.
— L’instruction de la ligne a permet de convertir le nombre saisie sous forme de
chaine de caractère en entier. L’opération provoquera une exception ValueError
si la conversion de la chaine en entier n’est pas évidente. Pas de nombre ou nombre
flottant par exemple.
— L’instruction de la ligne b permet de lever une exception si l’entier saisi est négatif.
— Le except ValueError est activé lorsque la chaine de caractère saisie n’est pas un
entier.
— L’instruction de la ligne c serait inutile si l’affectation d’année se limitait à cette
seule instruction car l’exception est levée pour le cast "int", l’affectation qui rafrai-
chirait la valeur d’année n’est donc pas exécutée.
Mais comme année est actualisée par le retour d’input, il faut assurer la permanence
de la boucle en la remettant à −1.

Christophe Caire 19 avril 2018 Corrigé du sujet Info


2018 ICNA 5/ 7

1 annee=-1
2 while annee<=0:
3 annee=input("Entrez une année :")
4 try:
5 annee=int(annee) #ligne a
6 assert annee>0 #ligne b
7 except ValueError:
8 print("Erreur de saisie\n")
9 annee=-1 #ligne c
10 except AssertionError:
11 print("Erreur de saisie\n")
12 annee=-1

11°) Rappel : l’année est bissextile si elle est divisible par 4 et non divisible par 100 ou si elle
est divisible par 400.
— 1900 n’est pas bissextile car elle est divisible par 4 mais aussi par 100, sans être
divisible par 400.
— 2018 n’est pas bissextile car non divisible par 4.
— 2000 est divisible par 400, elle est donc bissextile.
— 1802 n’est pas divisible par 4, elle n’est donc pas bissextile.
Si le code 1 est correct, les réponses B et C sont justes.
Notons par a, b, c les prédicats logiques respectifs correpondant à annee divisible par
4, 100, 400. L’équation logique vérifiée par le prédicat r "année est bissextile" s’écrit :

r = a.b + c

Le code 1 correspond à l’équation logique :

r = (a ⊕ b) ⊕ c

Il fait usage du ou exclusif sur les chaines d’octets. Cet opérateur est représenté en
python par le symbole ˆ. Il n’est pas à priori parmi les plus pratiqués en CPGE.
Nous pouvons montrer vu les conditions que ces deux codes sont équivalents.

1 # ________ Code n°1


2 if (annee%4==0)^(annee%100==0)^(annee%400==0):
3 print("C'est une année bissextile")
4 else:
5 print("C'est une année non bissextile")

12°) Réponse A.
Le code est correct mais pas très habile.
La maladresse est sans doute voulue pour des raisons "pédagogiques", elles m’échappent
comme de coutume.

Christophe Caire 19 avril 2018 Corrigé du sujet Info


2018 ICNA 6/ 7

Code commenté
1 # ________ Code n°2
2 # Etat faux par défaut
3 bissextile=False
4 if annee%400==0:
5 # Vrai si divisible par 400
6 bissextile=True
7 elif annee%100==0:
8 # Faux si non divisible par 4OO
9 # mais divisible par 100
10 bissextile=False
11 elif annee%4==0:
12 # Vrai si non divisible par 4OO
13 # et non divisible par 100
14 # mais divisible par 4
15 bissextile=True
16

17 # Aucune erreur bissextile est un booléen


18 if bissextile:
19 print("C'est une année bissextile")
20 else:
21 print("C'est une année non bissextile")

13°) Réponse B.
cf équation logique évoquée à la Q11.
Et réponse A par complémentarité
1 # ________ Code n°3
2 if annee%400==0 or (annee%4==0 and annee%100!=0): # ligne d
3 print("C'est une année bissextile")
4 else:
5 print("C'est une année non bissextile")

14°) Réponse C naturellement.


Voir le code commenté ci-après.

Christophe Caire 19 avril 2018 Corrigé du sujet Info


2018 ICNA 7/ 7

1 import numpy as np
2

3 def matrice(n):
4 # définit une matrice 4x4 et la remplit de zéro
5 A=np.zeros((n,n))
6 for i in range(1,n+1):
7 # remplit la diagonale de 1
8 A[i-1,i-1]=1
9 # remplit la première colonne de range(1,5)
10 A[i-1,0]=i
11 # remplit la première ligne de range(1,5)
12 A[0,i-1]=i
13 # remplit la dernière ligne de 5-range(1,5)
14 A[n-1,i-1]=n+1-i
15 # remplit la dernière colonne de 5-range(1,5)
16 A[i-1,n-1]=n+1-i
17 return A
18 print(matrice(4))

Affichage obtenu
[[ 1. 2. 3. 4.]
[ 2. 1. 0. 3.]
[ 3. 0. 1. 2.]
[ 4. 3. 2. 1.]]

15°) Aucune bonne réponse.


SGBD est l’acronyme français de système de gestion de base de données. DB2 et SQL
Server sont des systèmes de gestion de base de données et BIG DATA est un mot très à
la mode.
16°) Réponse C. L’index permet de retrouver facilement un enregistrement. Lors des modifi-
cations ou suppressions, il faut parfois reconstituer la table des index.
17°) Réponse C.
DELETE permet de supprimer un enregistrement.
18°) Réponse B.
ORDER BY demande le tri explicite sur la base d’un champ.
19°) La requête recherche les passagers qui ont payé plus de 130€ et qui étaient sur le vol 15
ou les passagers qui étaient sur le vol 24. C’est donc la réponse D.
Le tout repose sur la priorité de traitement du "et" par rapport au "ou".
20°) Réponse C,
et réponse A si le "=" glissé dans l’ordre est considéré comme une erreur.
(le IN multiple est traité comme une association de "OU")
et réponse D si on considère qu’un avion qui décolle de Toulouse n’y arrive pas et
inversement.
(Xor - ou exclusif reconnu par plusieurs SGDB SQL)

Christophe Caire 19 avril 2018 Corrigé du sujet Info

Vous aimerez peut-être aussi