Friday, 24 February 2017

TP10, codes sources

Prg1:
#include <stdio.h>
#include <stdlib.h>

int multIter(int x,int y)
{
   int prod=0;
   for(;y>0;y--)prod+=x;
   return prod;
}
int multRec(int x,int y)
{
   if(y==0) return 0;       //critere d'arret
   return x+multRec(x,y-1); //sinon recursion
}
int main()
{
    int a=11,b=3; //par exemple
    char tmp;
    printf("\nCode Iteratif: %d x %d = %d",a,b,multIter(a,b));
    printf("\nTapez Entree SVP");scanf("%c",&tmp);
    printf("\nCode Recursif: %d x %d = %d\n",a,b,multRec(a,b));
    return 0;
}


Prg2:
#include <stdio.h>
#include <stdlib.h>
unsigned int nbrDisq;
void Hanoi(unsigned n, char x, char y,char z,unsigned matSocles[][3]),
     deplacer (char x,char y, unsigned matSocles[][3]),
     initMatSocles(unsigned matSocles[][3],unsigned nbrDisq),
     modifMatSocles(char x,char y,unsigned matSocles[][3],unsigned nbrDisq),
     affichMat(unsigned mat[][3],unsigned,unsigned);
int main()
{
    printf("NbrDisques :");
    scanf("%u",&nbrDisq);
    unsigned matSocles[nbrDisq][3];
    initMatSocles(matSocles,nbrDisq);
    Hanoi(nbrDisq,'A','B','C',matSocles);
    return 0;
}

void deplacer (char x, char y, unsigned matSocles[][3])
{
    static unsigned mouvNbr=1;
    printf("\n Mouvement %u : Deplacer un disque du socle %c vers le socle %c \n",mouvNbr++,x,y);
    modifMatSocles(x,y,matSocles,nbrDisq);
    affichMat(matSocles,nbrDisq,3);
}
void Hanoi(unsigned n,char x,char y,char z,unsigned matSocles[][3])
{
    if (n>0){
        Hanoi(n-1,x,z,y,matSocles);
        deplacer(x,y,matSocles);
        Hanoi(n-1,z,y,x,matSocles);
    }
}
void initMatSocles(unsigned matSocles[][3],unsigned nbrDisq)
{
   unsigned i;
   for(i=0;i<nbrDisq;i++)matSocles[i][0]=i+1;
   for(i=0;i<nbrDisq;i++){matSocles[i][1]=0;matSocles[i][2]=0;}
   affichMat(matSocles,nbrDisq,3);
}

void modifMatSocles(char x,char y,unsigned matSocles[][3],unsigned nbrDisq)
{
   unsigned i1,i2;


   for(i1=0;(i1<nbrDisq)&&(matSocles[i1][x-65]==0);i1++){} //recherche du sommet du socle de depart

   for(i2=0;(i2<nbrDisq)&&(matSocles[i2][y-65]==0);i2++){} //recherche du sommet d'arrivee


   //transfert du disque
   matSocles[i2-1][y-65]=matSocles[i1][x-65];//ajout dans l'arrivee
   matSocles[i1][x-65]=0;//suppression dans le depart
}
 void affichMat(unsigned mat[][3],unsigned n,unsigned m)
 {
    unsigned i,j;
    for(i=0;i<n;i++){
        for(j=0;j<m;j++)printf("%4d",mat[i][j]);
        printf("\n");
    }
 }

Thursday, 16 February 2017

Resumé du Chapitre 4, Actions Paramétrées

Syntaxe de défintion/déclaration


A la place de Action, on peut mettre Procedure.

Exemples de procedures :
1.
Action Additionner (E / X,Y : Entier ; S / Som : Entier) ;
Début
Som ← X + Y ;
Fin ;
Algorithme Addition ;{algorithme principal}
Var
A,B,somme : Entier ;
Début
Lire(A,B) ;
Additionner(A,B,somme) ;{appel de l’action paramétrée Addition}
Ecrire(somme) ;
Fin.
2.
Action Addit (E / N : Entier ; S / Som : Entier) ;
Var
I : Entier ;
Début
Som ← 0 ;
Pour i ← 1 à N Faire
Som ← Som + i ;
Fait ;
Fin ;
Algorithme Addition ;{algorithme principal}
Var
N,somme : Entier ;
Début
Lire(n) ;
Addit(n,somme) ;{appel de l’action paramétrée Addit}
Ecrire(somme) ;
Fin.

Exemples de fonctions :
1. Somme de deux nombres :
Fonction Somme(E/ a,b : Entier) : Entier ;
Début
    retourner a+b ;
Fin ;
Algorithme sommation ;{algorithme principal}
Var
A,B,Som : Entier ;
Début
    Lire(A,B) ;
    Som ← Somme(A,B) ;
    Ecrire(Som) ;
Fin.
2. Algorithme déterminant la valeur de la formule 2Min(A,B)+1 :
Fonction Minimum(E/ a,b : Entier) : Entier ;
Var Min : Entier ;
Début
    Si a<b Alors Min ← a ;
    Sinon Min ← b ;
    Fsi ;
    retourner Min ;
Fin ;
Algorithme Formule ;
Var A,B,form : Entier ;
Début
    Lire(A,B) ;
    form  2Min(A,B)+1 ;
    Ecrire(form) ;
Fin.

Modes de transmission
3+1 modes : E, S, ES et REF.

Visibilité
Exemple :
Action suivant(ES/ z:entier) ;
debut z ← z+1 ; fin ;
Action addit(E/x,y:entier ; S/som :entier) ;
var val:entier ;
debut
   som ← x ;
   val ← 0 ;
   Tant que val<y faire
     suivant(som) ;
     suivant(val) ;
   ftq ;
fin ;
Algorithme Additionner ;
var A,B,somme:entier ;
debut
    lire(A,B) ; 
    addit(A,B,somme);
    ecrire(somme) ;
fin.

Objets déclarés dans
Portée
A : Additionner
A, SA1, SA2
SA1 : Addit
SA1, SA2
SA2 : suivant
SA2

Monday, 13 February 2017

TP 9, codes sources

Programme 1:
#include <stdio.h>
#include <stdlib.h>
void afficheTab(int[],int);
int vect[10],taille;
int main()
{
    afficheTab(vect,taille);
    return 0;
}
void afficheTab(int vect[],int taille){
    int i;
    printf("\n les elements de votre tableau sont:\n");
    for(i=0;i<taille;i++){
       printf("\t%d",vect[i]);
    }
}

Programme 2:
#include <stdio.h>
#include <stdlib.h>
void remplirMat(int [][10],int*,int*),
     affichMat(int [][10],int,int);
int mat[10][10],N,M;
int main(){
    remplirMat(mat,&N,&M);
    affichMat(mat,N,M);
    return 0;
}
void remplirMat(int tab[][10],int*N,int*M){
int i,j;
printf("\nDonner le nombre de lignes <=10: ");
scanf("%d",N);
printf("\nDonner le nombre de colonnes <=10: ");
scanf("%d",M);
for(i=0;i<*N;i++){
     for(j=0;j<*M;j++){
        printf("\ndonner l'element %d,%d :",i+1,j+1);
        scanf("%d",&tab[i][j]);
     }
 }
}
void affichMat(int tab[][10],int N,int M){
   int i,j;
   for(i=0;i<N;i++){
     for(j=0;j<M;j++){
        printf("%5d",tab[i][j]);
     }
     printf("\n");
   }
}

Les autres prgs je ne les ai pas. Il faut les réécrire.

Monday, 6 February 2017

TP 8, codes sources

Programme 1:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int fin,debut=0,droite,gauche;
    char mot[100],tmp;
    printf(" donner un mot \n");
    scanf("%s",mot);
    fin=strlen(mot)-1;

    for(droite=fin,gauche=debut;gauche<droite;gauche++,droite--){
       tmp=mot[droite];
       mot[droite]=mot[gauche];
       mot[gauche]=tmp;
    }

    printf(" le mot miroir est %s \n",mot);
    return 0;
}

L'execution de ce programme donne :

Programme 2: A deboguer

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int fin,debut,gauche;
char mot[100];
int main()
{
    char tmp;
    printf(" Donner un mot ");
    scanf("%s",mot);
    debut=0;
    fin=strlen(mot);

    for(gauche=debut;gauche<fin/2;gauche++){
        tmp=mot[fin-gauche];
        mot[fin-gauche]=mot[gauche];
        mot[gauche]=tmp;
    }

    printf(" le mot miroir est %s \n",mot);
    return 0;
}

Wednesday, 4 January 2017

correction ETLD d'informatique1 (codes source)

Ex2:
#include <stdio.h>
#include <stdlib.h>
#define taille 20

int vect[taille];

int main()
{
   int i,N,indMax,indPairMax,indImpairMax,tmp,k,j;

   printf("\n Donner le nbr d'elements (<=%d)",taille);
   scanf("%d",&N);
   printf("\n Donner les elements un par un");
   for(i=0;i<N;i++){
     printf("\n Donner l'element n°%d: ",i+1);
     scanf("%d",&vect[i]);
   }

   printf("\n Avant tri paritaire:");
   for(i=0;i<N;i++){
     printf("\t%d",vect[i]);
   }

   indImpairMax=(N%2 ?N-1:N-2);
   indPairMax=(N%2 ?N-2:N-1);
   for(k=0;k<2;k++){
      indMax=(k?indPairMax:indImpairMax);
      for(i=k;i<=indMax-2;i+=2){
         for(j=i+2;j<=indMax;j+=2){
             if(vect[j]<vect[i]){tmp=vect[i];vect[i]=vect[j];vect[j]=tmp;}
         }
      }
    }

   printf("\n Apres tri paritaire:");
   for(i=0;i<N;i++){
     printf("\t%d",vect[i]);
   }
   return 0;
}

Exo3:
#include <stdio.h>
int main(){
  int i,N,vect[20];

  printf("\n Donner le nbr de chiffres (<=20)");
  scanf("%d",&N);
  printf("\n Donner les chiffres un par un");
  for(i=0;i<N;i++){
     printf("\n Donner le chiffre n°%d: ",i+1);
     scanf("%d",&vect[N-i-1]);
  }
  printf("\n Les nbr generes sont:");
  for(i=0;i<N;i++){
    if(vect[i]%2){
      printf("\n%d",vect[i]);
      if(i+1<=N-1)printf("\n%d",vect[i]+10*vect[i+1]);
      if(i+2<=N-1)printf("\n%d",vect[i]+10*vect[i+1]+100*vect[i+2]);
    }
  }
  return 0;
}

Wednesday, 14 December 2016

Representation des caracteres


1. CODE ASCII
1.1 Description

Le code ASCII représente les caractères sur 7 bits. Utilisé initialement par les  téléscripteurs, il est adopté par les systèmes informatiques pour coder les caractères.


                                                               Téléscripteur

La table ASCII est composée de 2 parties :

a) La première de 0 a 31 regroupe les caractères non imprimables utilisés pour le contrôle. Par exemple le caractère 12 ordonne a l'imprimante de passer au début d'une nouvelle page ;  7 cause un beep sonore dans le téléscripteur récepteur.



Table ASCII des caractères de contrôle non imprimables



b) La deuxième regroupe les caractères imprimables ASCII et leur affecte les nombres de 32 à 126. Le nombre 127 représente la commande SUPPRESSION.

                                          Table des caractères imprimables ASCII





1.2 Table ASCII étendue
ISO-8859-1 : ou Latin-1 langues de l'Europe de l'Ouest (caractères accentués).
windows-1252 : une variation Microsoft sur le ISO-Latin-1;
ISO-8859-2 : langues de l'Europe Centrale et de l'Est ;
ISO-8859-3 : langues turcs ;
ISO-8859-4 : langues baltes (Lituanie, Biélorussie, ...) ;
ISO-8859-5 : alphabet cyrillique (russe, bulgare, ...) ;
ISO-8859-6 : arabe ;
ISO-8859-7 : grec moderne ;
ISO-8859-8 : hébreu ;
…, etc.


2. UNICODE

Avec la généralisation de l'internet, les ordinateurs, et plus particulièrement les serveurs, doivent supporter plusieurs systèmes de codage de caractères pour pouvoir voir cohabiter, par exemple, Arabe et Chinois sur la même page web.
2.1 Code point
Unicode utilise la notation hexadécimale préfixée par « U+ » pour représenter un code point.
Exemple : le caractère A est codé U+0041.
2.2 Formes d'encodage
  • UTF-16 : Utilise généralement deux octets pour représenter les caractères. (problème (pour qui ? Non, on ne fait pas de politique ici!) : incompatible avec ASCII et un texte codable en ASCII occupera le double de sa taille).
  • UTF-8: Utilise un nombre variable de bits selon le code point du caractère :
Exemple :
On considère la chaîne ''hé !''.
En ISO-Latin-1 les codes sont 104-233-32-33 en decimal ou 0110 1000-1110 1001-0010 0000-0010 0001 en binaire.
En UTF-8, le code point de é est U+00E9 ou (233)10 (voir tables ci-apres) donc on utilise le motif
110x xxxx 10xx xxxx
Sur 11 bits 233 s’écrit 000 1110 1001 qui distribués sur le motif donnent :
1100 0011 1010 1001
Enfin la chaîne ''hé !'' sera donc encodée en UTF-8 par :
0110 1000-1100 0011 1010 1001-0010 0000-0010 0001.
Pour l'operation inverse, on essaye de décoder cette chaîne (voir tables ci-apres).
Le 1ier octet commence par zéro donc ASCII, le deuxième par 110 donc double octets et le 2ieme doit commencer par 10 ce qui est le cas. On peut alors tirer du motif double octets les bits du code point :
xxx0 0011 xx10 1001 → 000 1110 1001 → U+00E9
qui est le code point du é. Le reste c'est du code sur 1 octet (ASCII).
Annexe


Bibliographie
  1. wikipedia
  2. cours de Fabien Torre, Université de Lille

Suggestions de lecture (pour aller loin)
  1. http://www.unicode.org/versions/Unicode7.0.0/UnicodeStandard-7.0.pdf
  2. http://programmers.stackexchange.com/questions/102205/should-utf-16-be-considered-harmful
  3. http://stackoverflow.com/questions/526430/c-programming-how-to-program-for-unicode