SNT4U16 - Initiation à la programmation Licence SVT 2 ème année 2014-2015 TD - Dynamique de POP III - Fichiers sources contacts : mathias.gauduchon@univ-amu.fr, melika.baklouti@univ-amu.fr, xavier.giraud@univ-amu.fr, nicolas.barrier@univ-amu.fr PROGRAM exo4 IMPLICIT NONE CHARACTER(len=500) :: filename CHARACTER(len=10000) :: phrase, phrase_code INTEGER :: i, decal, icarac, icarac_code! Ouverture du fichier contenant le message à coder WRITE (, ) "Entrez le nom du fichier qui contient le message a coder" READ (, ) filename OPEN(10,file=filename)! Ouverture du fichier de sauvegarde WRITE (, ) "Entrez le nom du fichier de sauvegarde du message code" READ (, ) filename OPEN(11,file=filename)! Parametre du codage WRITE (, ) "Entrez la valeur de decallage du code SVP : " READ (, ) decal! On renormalise la reponse pour obtenir une valeur entre 0 et 25 DO WHILE (decal<0) decal = decal + 26 DO WHILE (decal>25) decal = decal 26! Lecture de la premiere ligne du fichier contenant le message READ (10, (a) ) phrase CLOSE (10)! initialisation de la chaine de caracteres phrase_code :! on ne met rien dans la chaine (=""), mais cette affectation a pour effet de remplir automatiquement la chaine de caracteres espace
2 phrase_code = "" DO i=1,len(trim(phrase)) icarac = ICHAR(phrase(i:i))! code ascii du ieme caractere de phrase IF (( icarac >=ICHAR( A ).AND. icarac<=ichar( Z ) decal).or. (icarac>=ichar( a ). AND. icarac<=ichar( z ) decal)) THEN! phrase( i : i ) est une lettre minuscule ou majuscule qu on fait avancer de decal dans l alphabet icarac_code = icarac + decal ELSE IF (( icarac >=ICHAR( Z ) decal+1.and. icarac<=ichar( Z )).OR. (icarac>=ichar( z ) decal+1.and. icarac<=ichar( z ))) THEN! phrase( i : i ) est une lettre minuscule ou majuscule pour laquelle il faut repartir au debut de l alphabet icarac_code = icarac + decal 26 ELSE! phrase( i : i ) n est pas une lettre icarac_code = icarac phrase_code(i: i ) = CHAR(icarac_code) WRITE (, ) "Le message code avec le decallage ", decal, "est :" WRITE (, ) trim(phrase_code)! sauvegarde du message code dans le fichier WRITE (11, ) trim(phrase_code) CLOSE (11) END PROGRAM exo4
3 PROGRAM exo5! En applicant ce programme au fichier secret. txt, on trouve X avec 146 occurences! On en deduit que pour decoder ce fichier, il fait transformer X en E, qui est la lettre! statistiquement la plus utilisee, ce qui correspond a un decallage de 7.! On reutilise le programme exo4 avec cette valeur de decallage. IMPLICIT NONE CHARACTER(len=500) :: filename CHARACTER(len=10000) :: phrase INTEGER :: icarac, icarac_max, i, compt, compt_max! Ouverture du fichier contenant le message à coder WRITE (, ) "Entrez le nom du fichier qui contient le message" READ (, ) filename OPEN(10,file=filename)! Lecture de la premiere ligne du fichier contenant le message READ (10, (a) ) phrase CLOSE (10) compt_max = 1 DO icarac=ichar( A ),ICHAR( Z )! DEBUT : compter le nombre d occurence du caractere de code ASCII icarar dans phrase compt = 0 DO i=1,len(trim(phrase)) IF ( ICHAR(phrase(i:i))==icarac.OR. ICHAR(phrase(i:i))==icarac+ICHAR( a ) ICHAR( A ) ) THEN! phrase( i : i ) correspond a la lettre de code ASCII icarac ou a la version minuscule de cette lettre compt = compt + 1! FIN : compter le nombre d occurence du caractere de code ASCII icarar dans phrase! Mise a jour eventuelle de compt_max et icarac_max IF (compt>compt_max) THEN compt_max = compt icarac_max = icarac WRITE (, ) "La lettre la plus presente dans le texte est ", CHAR(icarac_max), " avec ",
4 compt_max," occurences." END PROGRAM exo5
5 PROGRAM exo6 IMPLICIT NONE CHARACTER(len=500) :: filename CHARACTER(len=10000) :: phrase CHARACTER(len=100) :: mot INTEGER :: i, j, lmot LOGICAL :: mot_coincide! Ouverture du fichier contenant le message à coder WRITE (, ) "Entrez le nom du fichier qui contient le message" READ (, ) filename OPEN(10,file=filename)! Lecture de la premiere ligne du fichier contenant le message READ (10, (a) ) phrase CLOSE (10)! Mot a chercher WRITE (, ) "Entrez le mot a chercher" READ (, ) mot lmot = LEN(TRIM(mot)) mot_coincide =.FALSE. i = 1 DO WHILE (i<=len(trim(phrase)) lmot + 1.AND..NOT. mot_coincide)! on presupose que le mot coincide avec la phrase a la position i mot_coincide =.TRUE. DO j=1,lmot IF (. NOT. ICHAR(mot(j:j))==ICHAR(phrase(i+j 1:i+j 1))) THEN! on a detecte une difference, le mot ne coincide plus mot_coincide =.FALSE. i = i + 1! on reboucle uniquement si mot_coincide est toujours faux ET si on n a pas depasse la fin de la phrase! cad on sort si on a trouve le mot OU si on atteint la fin de phrase IF (mot_coincide) THEN WRITE (, ) "Le mot ", TRIM(mot), " a été trouvé à la position", i 1 ELSE WRITE (, ) "Le mot n a pas ete trouve"
6 END PROGRAM exo6
7 PROGRAM exo7! Le programme liste les mots de la phrase et les compte.!! Pour chaque caractere de la phrase, le programme determine si le caractere est dans un mot ou non ( variable booleenne est_dans_mot).! On considere qu un caractere ne fait pas partie d un mot s il s agit d un separateur, c est a dire un des caracteres recense dans la chaine de caractere separateurs.! Sinon, le caractere est considere comme faisant partie d un mot.!! Le nombre de mots dans la phrase est determine en comptant le nombre de débuts de mot, c est a dire le nombre de transitions hors mot > dans mot IMPLICIT NONE CHARACTER(len=500) :: filename CHARACTER(len=10000) :: phrase CHARACTER(len=50) :: separateurs INTEGER :: i, ideb, j, compt, nseparateurs LOGICAL :: est_separateur, est_dans_mot separateurs =",;:!?./ "// " nseparateurs = LEN(TRIM(separateurs))! Ouverture du fichier contenant le message à coder WRITE (, ) "Entrez le nom du fichier qui contient le message" READ (, ) filename OPEN(10,file=filename)! Lecture de la premiere ligne du fichier contenant le message READ (10, (a) ) phrase CLOSE (10) write (, ) " Liste des mots :"! Initialisation du compteur de mot compt = 0! On est initialement "hors mot" est_dans_mot =.FALSE. DO i=1,len(trim(phrase))! le caractere phrase( i : i ) est il un separateur? est_separateur =.FALSE.! a priori non DO j=1,nseparateurs IF (ICHAR(phrase(i:i))==ICHAR(separateurs(j:j))) THEN est_separateur =.TRUE.! sauf s il correspond au moins une fois a un des caracteres de separateurs
8 IF (. NOT. est_separateur) THEN! phrase( i : i ) est un caractere dans un mot IF (. NOT. est_dans_mot) THEN! on etait en dehors d un mot, donc on a detecte une transition hors mot > dans mot ideb = i! on memorise cette position de debut de mot compt = compt + 1 est_dans_mot =.TRUE. ELSE! phrase( i : i ) est un caractere separateur, donc hors mot IF (est_dans_mot) THEN! on etait dans un mot, donc on detecte une fin de mot : on affiche ce mot est_dans_mot =.FALSE. WRITE (, ) phrase(ideb:i 1)! Si la phrase se termine par un caractere dans un mot, on affiche ce dernier mot if (est_dans_mot) then WRITE (, ) phrase(ideb:len(trim(phrase))) end if WRITE (, ) "La phrase comporte ",compt,"mots." END PROGRAM exo7
9 PROGRAM javanais! Le principe de ce programme est d ajouter "av" au milieu de chaque syllabe d un mot.! Pour reperer un milieu de syllabe, on detecte les transitions consomne > voyelle et on insere "av" avant la voyelle! Ce programme presuppose que l utilisateur a entre un vrai mot, sans caractères spéciaux ni lettres accentuees.! En effet, tout caractere qui ne correspond pas a une voyelle est considere comme etant une lettre consomne. IMPLICIT NONE CHARACTER(len=10) :: voyelles CHARACTER(len=100) :: mot, motjav INTEGER :: i, j, k, nvoyelles LOGICAL :: est_voyelle, etait_voyelle! definition des voyelles voyelles = "aeiouaeiou" nvoyelles = LEN(TRIM(voyelles)) WRITE (, ) "Entrez un mot SVP" READ (, ) mot motjav=""! cf exo4, permet d initialiser motjav en le remplissant d espaces k=1! position intiale dans la chaine motjav etait_voyelle =.TRUE.! a pour effet de ne pas ajouter "av" au debut d un mot qui commencerait par une voyelle DO i=1,len(trim(mot))! le caractere mot(i: i ) est il une voyelle? est_voyelle =.FALSE.! a priori non DO j=1,nvoyelles IF (ICHAR(mot(i:i))==ICHAR(voyelles(j:j))) THEN est_voyelle =.TRUE.! sauf s il correspond a au moins un des caracteres de la chaine voyelles IF (. NOT. etait_voyelle.and. est_voyelle) THEN! c est une voyelle derrière une consonne motjav(k:k+1)="av"! on insere "av" dans motjav avant la voyelle k=k+2! on met a jour l indice de position dans motjav
10 motjav(k:k)=mot(i:i)! dans tous les cas on recopie le caractere i de mot dans motjav k = k+1! on met a jour l indice de position dans motjav etait_voyelle = est_voyelle WRITE (, ) trim(mot), " en javanais se dit : ",trim(motjav) END PROGRAM javanais