Examen d`algorithmique/C Exercice 1 : critère de divisibilité par 3

publicité
Algorithmique et Langage C
I NFORMATIQUE
Année 2010-2011
—–
Examen d’algorithmique/C
Seuls documents autorisés : poly de cours et C dans la poche
Durée de l’épreuve : 2 heures
Consignes générales :
– Si le protoype d’une fonction n’est pas imposé, vous êtes libre de coder la fonction comme vous l’entendez, et donc d’utiliser le prototype qui vous semble le plus aproprié. En revanche, si le prototype
est donné par l’énoncé, vous devez l’utiliser.
– Vous avez le droit de réutiliser toute fonction déjà codée dans un des exercices de l’examen.
– Les trois exercices sont indépendants. Dans un même exercice, vous pouvez supposer connu le résultats d’une question à laquelle vous ne savez pas répondre, afin de traiter les questions suivantes.
– Afin d’assurer l’impartialité entre tous, aucune question ne peut être posée pendant toute la durée de
l’épreuve. Si vous avez un doute sur une question, signalez le sur la copie et répondez en conséquence.
Exercice 1 : critère de divisibilité par 3
On veut écrire un programme qui teste, sans utiliser la fonction modulo, si un entier est divisible par 3 :
la somme des chiffres d’un nombre divisible par trois est divisible par trois.
1. Écrire une fonction int somme_chiffres(int nombre) qui renvoie la somme des chiffres
de l’entier nombre (exemple : somme_chiffres(275) doit renvoyer 14).
2. Écrire la fonction main qui effectue les opérations suivantes :
– demander de saisir un entier au clavier ;
– faire la somme des chiffres du nombre à l’aide de la fonction de la question 1 ;
– relancer le calcul de la somme jusqu’à ce que cette somme ne comporte qu’un chiffre ;
– tester si ce nombre est bien un multiple de 3 sans utiliser l’opérateur modulo % ;
– afficher si le nombre entré est ou n’est pas un multiple de 3.
Exercice 2 : chiffre de César
On rappelle qu’en C, les caractères de type char sont codés par un entier correspondant à leur code
ASCII. Le code ASCII des minuscules utilise les entiers de 97 (pour ’a’) à 122 (pour ’z’). L’espace est codé
par 32. On pourra éventuellement se reporter à la table de correspondance fournie en annexe.
Ainsi, il est possible d’utiliser sur les caractères toutes opérations habituelles définies sur les entiers
(addition, multiplication, comparaison, etc.) : cela revient à appliquer l’opération sur le code ASCII du
caractère.
Exemple :
int main(){
char c1, c2;
c1 = ’a’;
c2 = ’a’ + 3;
printf(’c1: \%c, \%d ; c2: \%c, \%d \n’,c1,c1,c2,c2);
return 0;
}
Examen d’algorithmique/C
2
Après compilation, le code affichera :
c1: a, 97 ; c2: d, 100
Le but de cet exercice est d’implémenter le célèbre chiffrement utilisé par Jules César dans ses correspondances secrètes. Le principe est le suivant : chaque lettre est remplacée par une lettre décalée d’un
nombre de pas fixe dans l’alphabet, l’alphabet étant considéré comme circulaire. Par exemple, pour un décalage de 4, ’a’ est remplacé par ’e’, ’b’ par ’f’, . . ., ’v’ par ’z’, ’w’ par ’a’, ’x’ par ’b’, ’y’ par ’c’ et ’z’ par
’d’.
1. Écrire une fonction de prototype void Chiffrer(char *clair, char *pas_clair, int
N, int nb_char), permettant de chiffrer une phrase comportant nb_char caractères, stockée
dans la chaîne de caractères clair, par un décallage de N caractères et de récupérer la phrase chiffrée
dans la chaine de caractères pas_clair.
La fonction devra chiffrer uniquement les caractères minuscules et devra laisser inchangés les espaces, la ponctuation et les autres caractères (accents, chiffres, majuscules, etc.).
2. Écrire la fonction de prototype void Dechiffrer(char *pas_clair, char *clair,
int N, int nb_char), permettant de faire l’opération inverse, i.e. récupérer le message clair à
partir d’un message chiffré par un décallage de N caractères.
Exercice 3 : ADN
Introduction générale 1
L’acide désoxyribonucléique, ou ADN, est une molécule, présente dans toutes les cellules vivantes, qui
renferme l’ensemble des informations nécessaires au développement et au fonctionnement d’un organisme.
L’ADN détermine la synthèse des protéines, par l’intermédiaire de l’ARN (acide ribonucléique).
L’ADN est composé de deux brins ADN1 , ADN2 se faisant face, et formant une double hélice. Chaque
brin est formé de la répétition ordonnée de quatre nucléotides : l’adénine (A), la cytosine (C), la thymine (T )
et la guanine (G). Les deux brins d’ADN sont dit complémentaires : en face d’une adénine, il y a toujours
une thymine ; en face d’une cytosine, il y a toujours une guanine. On a donc les interactions (ADN1 −
ADN2 ) possibles suivantes : A − T , T − A, G − C et C − G.
L’ARN se traduit de l’ADN, par la transcription d’un des deux brins. L’ARN est composé aussi de
quatre nucléotides, mais la thymine est remplacée par l’uracile (U ). Le brin d’ARN résultant de la transcription d’un brin d’ADN est alors le complémentaire de ce brin, où la thymine est remplacée par l’uracile.
Dans ce cas, en notant ADNt le brin d’ADN transcrit, les interactions (ADNt − ARN ) possibles sont
alors : A − U , T − A, G − C et C − G.
De l’ARN peut alors se traduire les protéines, représentables aussi pour une lettre. Une protéine se
traduit de l’ARN par les triplets de nucléotides (A, C, U ou G), qu’on appelle codon. Il existe 43 =
64 combinaisons possibles de ces quatre lettres en triplets. Trois codons, parmi ces 64 codes possibles,
signifient la fin de la traduction et sont appelés codon stop. Ces trois codons sont les séquences : U AG,
U GA et U AA. Aux 61 autres codons ne correspondent que 20 acides aminés.
Un exemple résumant les étapes de transcription puis de traduction est donné sur la figure 1.
Travail à faire
Dans cet exercice, la seule fonction de la bibliothèque string.h autorisée est la fonction int
strlen(const char* s) qui renvoie la longueur de la chaine de caractères pointée par s, sans
compter le caractère de fin de chaine ’\0’.
Les fonctions ne devront pas être sensible à la casse, c’est-à-dire qu’elles doivent pouvoir traiter
indifférement les majuscules des minuscules. On pourra éventuellement s’aider du tableau ASCII donné en
annexe.
1. Écrire une fonction int brin_valide(char *brin) qui renvoie 1 si la chaine de caractères
brin passée en argument correspond bien à un brin d’ADN, i.e. est composée uniquement des caractères A, C, T, G (et bien évidemment du caractère de fin de chaine ’\0’). Rappel : A et a doivent
être traité indifférement (et de même pour les autres caractères).
1. Les informations et la figure sont reprises de wikipedia.
Examen d’algorithmique/C
3
F IGURE 1 – Étapes de transcription puis de traduction de l’ADN en ARN puis en séquence d’acides aminés.
2. Écrire une fonction qui compare deux brins d’ADN, sans utiliser strcmp, qui renvoie 1 si les deux
chaines sont les mêmes, et 0 sinon.
3. Écrire une fonction qui vérifie si deux brins d’ADN sont complémentaires.
4. L’ADN étant composé de deux brins complémentaires, proposer une structure C struct s_ADN
permettant de représenter l’ADN.
5. Écrire une fonction int ADN_valide(struct s_ADN my_adn) qui vérifie si la structure
d’ADN passée en paramètre est valide, c’est-à-dire formée de deux brins complémentaires valides.
6. Écrire une fonction qui à partir d’un brin d’ADN fait la transcription en ARN.
7. Écrire une fonction qui prend un codon (i.e. une chaine de trois caractères) en paramètre, et renvoie 1
si c’est un codon stop, −1 si ça ne correspond pas à un codon et 0 sinon.
8. Écrire une fonction qui traduit les codons de l’ARN en protéines, c’est-à-dire en chaines d’acides aminés. Une protéine est alors codé par l’ARN entre deux codons stop. La fonction doit donc permettre
de récupérer les différentes chaines de caractères correspondant aux protéines. On suppose pour cela
qu’on dispose déjà d’une fonction void codon2acide(char *codon, char *aa) qui renvoie dans le pointeur aa le caractère correspondant à l’acide aminé codé par le codon condon passé
en paramètre. Si le codon correspond à un codon stop, alors *aa correspond à la lettre X.
Examen d’algorithmique/C
Annexe
F IGURE 2 – Table ASCII. Le caractère NULL est le caractère de fin de chaine ’\0’.
4
Téléchargement