Thursday, 3 May 2018

Séance de cours supplémentaire


Une séance de cours PSD MI (programmation et struct. de données) supplémentaire 

est programmée pour ce samedi 05 mai 2018:

Horaire 08:00
Lieu amphi B physique

On abordera les variables dynamiques ainsi qu'une intro. aux listes chaînées.

 

Sunday, 7 May 2017

TP14, codes sources

Programme 1:
#include <stdio.h>
#include <stdlib.h>
typedef struct objet {int inf;char sentinel;  struct objet *suiv;} tplace;
tplace *tete,*ptr;
int i,n;
int main(){
    printf(" Nbr elem : ");
    scanf("%d",&n);
    if(n>0){
        tete=malloc(sizeof(tplace));
        if(tete){
            printf(" elem 1: ");
            scanf("%d",&(tete->inf));
            tete->sentinel='@';
            tete->suiv=NULL;
        }else{printf(" memoire insuf, arret!"); return 1;}
    };
    ptr=tete;
    for(i=1;i<n;i++){
        ptr->suiv=malloc(sizeof(tplace));
        if(ptr->suiv){
            ptr=ptr->suiv;
            printf(" elem %d: ",i+1);
            scanf("%d",&(ptr->inf));
            ptr->sentinel='@';
            ptr->suiv=NULL;
        }else{printf(" memoire insuf, arret!"); return 1;}
    }
    printf("tete:");
    while(tete!=0){
        ptr=tete;
        tete=tete->suiv;
        printf("[%d]-->",ptr->inf);
        ptr->suiv=0;
        free(ptr);
        ptr=0;
    }
    printf("<NUL>");
    return 0;
}

Programme 2:
#include <stdio.h>
#include <stdlib.h>

typedef struct objet {int inf;char sentinel;struct objet *suiv;} tPlace;
int creatList(tPlace **,int),
    affichLiberList(tPlace *);
tPlace *tete,*ptr;
int n;

int main()
{
    printf(" Nbr d'elements a creer : ");
    scanf("%d",&n);

    creatList(&tete,n);
    affichLiberList(tete);
    tete=NULL;

    return 0;
}
//Affichage et liberation;
int affichLiberList(tPlace *tete){
    printf("tete:");
    while(tete){
        ptr=tete;
        tete=tete->suiv;
        printf("[%d]-->",ptr->inf);
        ptr->suiv=0;
        free(ptr);
        ptr=0;
    }
    printf("<NUL>");
    return 0;
}
//creation
int creatList(tPlace **tete,int n){
    int i;
    if(n>0){
        *tete=malloc(sizeof(tPlace));
        if(*tete){
            printf(" elem 1: ");
            scanf("%d",&((*tete)->inf));
            (*tete)->sentinel='@';
            (*tete)->suiv=NULL;
        }
        else{printf(" memoire insuf, arret!"); return 1;}
    }
    ptr=*tete;
    for(i=1;i<n;i++){
        ptr1=ptr->suiv=malloc(sizeof(tPlace));
        if(ptr->suiv){
            ptr=ptr->suiv;
            printf(" elem %d: ",i+1);
            scanf("%d",&(ptr->inf));
            ptr->sentinel='@';
            ptr->suiv=NULL;
        }
        else{printf(" memoire insuf, arret!"); return 1;}
    }
    return 0;
}

Programme 3: 
int creatList(tPlace **,int),
    affichList(tPlace *),
    inserWrong(tPlace *,int val,int pos);
tPlace *tete; int n,val,pos;
int main(){
    printf(" Nbr d'elements a creer : ");
    scanf("%d",&n);
    printf(" Val a inserer : ");
    scanf("%d",&val);
    printf(" Position : ");
    scanf("%d",&pos);
    creatList(&tete,n);
    inserWrong(tete,val,pos);
    affichList(tete);
    tete=NULL;

    return 0;
}
int inserWrong(tPlace *tete,int val,int pos){
    tPlace *ptr,*ptr1,*ptrVal; int comp=1;
    while(tete && (comp<pos)){
        ptr=tete;
        tete=tete->suiv;
        comp++;
    }
    ptrVal=(tPlace *)malloc(sizeof(tPlace));
    if(ptrVal){
       ptrVal->inf=val;
       ptrVal->sentinel='@';
       ptr->suiv=ptrVal;
       ptrVal->suiv=tete;
    }else{printf("L'insertion a echouee, memoire insuf"); return 1;}
    return 0;
}
//Affichage
int affichList(tPlace *tete){
    //A definir
}
//creation
int creatList(tPlace **tete,int n){
    //voir programme 2
}

Programme 4: creatList() evitant int** 
(de toute façon vous devez maitriser int** car des fois incontournable)
#include <stdio.h>
#include <stdlib.h>

typedef struct objet {int inf;char sentinel;struct objet *suiv;} tPlace;
int affichList(tPlace *);
tPlace *creatList(tPlace *,int);
tPlace *tete; int n,val,pos;
int main(){
    printf(" Nbr d'elements a creer : ");
    scanf("%d",&n);
    tete=creatList(tete,n);
    affichList(tete);
    tete=NULL;

    return 0;
}
int affichList(tPlace *tete){
    //a definir

}
//creation
tPlace *creatList(tPlace *tete,int n){
    tPlace *ptr; int i;
    tete=0;
    if(n>0){
        tete=malloc(sizeof(tPlace));
        if(tete){
            printf(" elem 1: ");
            scanf("%d",&(tete->inf));
            tete->sentinel='@';
            tete->suiv=NULL;
        }
        else{printf(" memoire insuf, arret!"); return NULL;}
    }
    ptr=tete;
    for(i=1;i<n;i++){
        ptr->suiv=malloc(sizeof(tPlace));
        if(ptr->suiv){
            ptr=ptr->suiv;
            printf(" elem %d: ",i+1);
            scanf("%d",&(ptr->inf));
            ptr->sentinel='@';
            ptr->suiv=NULL;
        }
        else{printf(" memoire insuf, arret!"); return NULL;}
    }
    return tete;
}

Tuesday, 2 May 2017

TP13, codes sources

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

int main()
{
    int x=1,y=5,*pt1,*pt2;

    pt1=&x;
    *pt1=2;
    pt1=&y;
    *pt1=3;
    pt2=pt1+1;
    printf("adresse de x en hexa:%p \n celle de y:%p \n pt1 contient: %p"
           "\n adresse de pt1:%p \n pt2 contient: %p \n adresse de pt2:%p",
           &x,&y,pt1,&pt1,pt2,&pt2);
    printf("\n taille d'une variable pointeur dans ma machine:%d",sizeof(pt1));
    return 0;
}

Programme 2:
#include <stdio.h>
#include <stdlib.h>
#define MAX 7
//Ne pas changer la valeur de MAX
int tab[MAX];

int main(){
    int *ptr,i,val;
    //tab unidim
    val=0;
    ptr=tab;     *ptr=(val+=10);
    ptr++;       *ptr=(val+=10);
    ptr=&tab[3];  ptr--; *ptr=(val+=10);
    ptr=tab+3;   *ptr=(val+=10);
    ptr=tab;     *(ptr+4)=(val+=10);
    ptr[5]=(val+=10);   *(tab+6)=(val+=10);
    printf("\n Tableau :\n");
    for(i=0;i<MAX;i++)printf("\t %d",tab[i]);

    return 0;
}

Programme 3:
#include <stdio.h>
#include <stdlib.h>
#define MAX 7
//Ne pas changer la valeur de MAX
int mat[2][MAX];

int main(){
    int *ptr,i,j,val,*ptrDebutMat;

    //tab bidim
    val=0;
    ptr=ptrDebutMat=(int*)mat;
    *ptr=(val+=10);
    ptr++;             *ptr=(val+=10);
    ptr=&mat[0][3];     ptr--; *ptr=(val+=10);
    ptr=ptrDebutMat+3;  *ptr=(val+=10);
    ptr=ptrDebutMat;    *(ptr+4)=(val+=10);
    ptr[5]=(val+=10);
    *(ptrDebutMat+6)=(val+=10);   //On est arrive au bord de la 1iere ligne ...
    *(ptrDebutMat+MAX)=(val+=10); //Mais ceci est permis. Why?
    for(j=8;j<2*MAX;j++)*(ptrDebutMat+j)=(val+=10);
    printf("\n Matrice :\n");
    for(i=0;i<2;i++){
        for(j=0;j<MAX;j++){
           printf("\t %4d",mat[i][j]);
        }
        printf("\n");
    }
    return 0;
}

Programme 4: Je n'ai pas eu le temps de l'ajouter. Executer puis comprendre comment il fait ce qu'il fait.
#include <stdio.h>
#include <stdlib.h>
void permut(int**,int**);
int x=1,y=5,*pt1=&x,*pt2=&y;
int main()
{
    printf("\nAvant permut : *pt1=%d et *pt2=%d",*pt1,*pt2);
    permut(&pt1,&pt2);
    printf("\nApres permut : *pt1=%d et *pt2=%d",*pt1,*pt2);
    return 0;
}
void permut(int **ptr1,int **ptr2){
 int *ptr;
 ptr=*ptr1;*ptr1=*ptr2;*ptr2=ptr;
}

 

Monday, 10 April 2017

TP 12, Codes sources

  • Programme 1: Création
#include <stdio.h>
#include <stdlib.h>
typedef struct {int jour,mois,annee;} tDate;
typedef struct {char nom[20],prenom[20],poste[20]; tDate date; } tEmploye;
typedef struct {char poste[20]; float salaire; } tPoste;
int getFichEmploye(char *);
int main(){
    getFichEmploye("listEmploye.txt");
    return 0;
}
int getFichEmploye(char *nomFichier){
   FILE *ptFichier;
   tEmploye employe;
   int  comp,nbrEmploye;

   printf("Donner le nbr d'employes : ");
   scanf("%d",&nbrEmploye);
   ptFichier=fopen(nomFichier,"wt");
   if(!ptFichier){printf("\n La creation de fichier a echouee!");return 1;}
   for(comp=0;comp<nbrEmploye;comp++){
      printf("Entrez le nom de la personne N%d: ",comp+1);
      scanf("%s", employe.nom); // sans espaces
      fprintf(ptFichier, "%s\t", employe.nom);
      printf("Entrez le prenom de %s : ",employe.nom);
      scanf("%s", employe.prenom);
      fprintf(ptFichier, "%s\t",employe.prenom);
      printf("Donner le poste de %s %s:",employe.nom,employe.prenom);
      scanf("%s",employe.poste);
      fprintf(ptFichier, "%s\t",employe.poste);
      printf("Donner la date de recrut de %s %s (jj/mm/yyyy):",employe.nom,employe.prenom);
      scanf("%d/%d/%d",&(employe.date.jour),&(employe.date.mois),&(employe.date.annee));
      fprintf(ptFichier, "%d/%d/%d\n",employe.date.jour,employe.date.mois,employe.date.annee);
    }
    fclose(ptFichier);
    return 0;
}


  • Programme 2: Lecture
#include <stdio.h>
#include <stdlib.h>
typedef struct {int jour,mois,annee;} tDate;
typedef struct {char nom[20],prenom[20],poste[20];tDate date;} tEmploye;
int affichListEmploye(char *);
int main(){
    affichListEmploye("listEmploye.txt");
//ajouter le chemin    
    return 0;
}
int affichListEmploye(char *fichEmploye)
{
    FILE *ptFichEmploye;
    tEmploye employe={"","","",{0,0,0}};int i=1;

    ptFichEmploye = fopen(fichEmploye,"rt");
    if(!ptFichEmploye){
        printf("Impossible d'ouvrir le ficher %s, arret d'execution",fichEmploye);
        return 1;
    }
    while(!feof(ptFichEmploye)){ //on suppose le fichier non vide
        fscanf(ptFichEmploye,"%s\t",employe.nom);
        fscanf(ptFichEmploye,"%s\t",employe.prenom);
        fscanf(ptFichEmploye,"%s\t",employe.poste);
        fscanf(ptFichEmploye,"%d/%d/%d\n",&(employe.date.jour),&(employe.date.mois),&(employe.date.annee));
        printf("\nNom%3d:%s\tPrenom:%s\tPoste:%s",i++, employe.nom,employe.prenom,employe.poste);
        printf("\tdate recrut:%d/%d/%d",employe.date.jour,employe.date.mois,employe.date.annee);
    }
    fclose(ptFichEmploye);
    return 0;
}

  • Remarks/Further reading
1. Ajouter le chemin du fichier listEmploye.txt en lecture:
  • Sous linux: affichListEmploye("/votre/chemin/listEmploye.txt");
  • Sous Windows : dans le chemin, ne pas oublier de doubler les \ (corrigé suite a la remarque de IcyRaceHoeses)
2. Resolution du pb de fichier existant mais vide: On remplace les lignes 20 à 27 par:
while(1){
        fscanf(ptFichEmploye,"%s\t",employe.nom);
        if(feof(ptFichEmploye)){printf("\n fichier vide, arret d'execution"); fclose(ptFichEmploye);return 1;}
        fscanf(ptFichEmploye,"%s\t",employe.prenom);
        fscanf(ptFichEmploye,"%s\t",employe.poste);
        fscanf(ptFichEmploye,"%d/%d/%d\n",&(employe.date.jour),&(employe.date.mois), &(employe.date.annee));
        printf("\nNom%3d:%s\tPrenom:%s\tPoste:%s",i++, employe.nom,employe.prenom,employe.poste);
        printf("\tdate recrut:%d/%d/%d",employe.date.jour,employe.date.mois,employe.date.annee);
    }

3. EOF bien expliqué:
https://latedev.wordpress.com/2012/12/04/all-about-eof/
4. Gestion de repertoires en C (hors programme MI)
http://www.thegeekstuff.com/2012/06/c-directory/

Thursday, 9 March 2017

TP 11, codes sources

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

typedef struct {int x;int y;}tPoint;

tPoint p1,p2={0,300},p3;

int main(){
  p1.x=150;
  p1.y=103;
  printf("Les coordonnees du point p1 sont (%d,%d)\n",p1.x,p1.y);
  printf("Les coordonnees du point p2 sont (%d,%d)\n",p2.x,p2.y);
  printf("Saisir les coordonnees du point p3\n");
  scanf("%d %d",&(p3.x),&(p3.y));
  printf("Les coordonnees du point p3 sont donc (%d,%d)\n",p3.x,p3.y);
  return 0;
}

Programme 2:
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int jour;
    int mois;
    int annee;
    }tDate;
typedef struct {
    int id;
    char nom[21];
    tDate ddn;
    float note[3];
    float moy;
    }tEtudiant;
tEtudiant student;

void getInfoEtudiant(tEtudiant *etudiant);
void affichInfoEtudiant(tEtudiant etudiant);

int main(){
  getInfoEtudiant(&student);
  affichInfoEtudiant(student);
  //getListEtudiant()
  //affichListEtudiant()
  //getInfoEtudFromList()
  //bestStudent()
  return 0;
}
void getInfoEtudiant(tEtudiant *etudiant){
   int i;
   printf("\nIdentifiant:");
   scanf("%d",&(*etudiant).id);
   printf("Nom:");
   scanf("%s",(*etudiant).nom);
   printf("jour de naissance:");
   scanf("%d",&(*etudiant).ddn.jour);
   printf("mois de naissance:");
   scanf("%d",&(*etudiant).ddn.mois);
   printf("annee de naissance:");
   scanf("%d",&(*etudiant).ddn.annee);
   (*etudiant).moy=0;
   for(i=0;i<3;i++){
      printf("Note%d:",i+1);
      scanf("%f",&((*etudiant).note[i]));
      (*etudiant).moy+=(*etudiant).note[i]/3;
   }
}
void affichInfoEtudiant(tEtudiant etudiant){
   int i;
   printf("\nIdentifiant:%d",etudiant.id);
   printf("\nNom:%s",etudiant.nom);
   printf("\njour de naissance:%d",etudiant.ddn.jour);
   printf("\nmois de naissance:%d",etudiant.ddn.mois);
   printf("\nannee de naissance:%d",etudiant.ddn.annee);
   for(i=0;i<3;i++){
      printf("\nNote%d:%.2f",i+1,(etudiant.note[i]));
   }
   printf("\nMoyenne:%.2f",etudiant.moy);
}

Programme 3:
#include <stdio.h>
#include <stdlib.h>
/*variante1:declaration de structure seulement (ajouter / au debut pour de-commenter)
struct tPoint{int x;int y;}; //
//puis instanciation
struct tPoint p1,p2={0,300},p3; //Enlever struct genere une erreur en C
//*/
/*variante2:declaration de structure et en meme temps instanciation de p1 et p2 (idem)
struct tPoint{int x;int y;} p1,p2={0,300};
//puis instanciation de p3
struct tPoint p3;
//*/
/*variante3:declaration de structure anonyme et en meme temps instanciation des point (idem)
struct {int x;int y;} p1,p2={0,300},p3;
//*/
/*variante4:declaration en associant un nom de type a une structure non anonyme (idem)
typedef struct stPoint{int x;int y;}tPoint;
//puis instanciation avec 2 possibilites
tPoint p1,p2={0,300}; //on n'a pas besoin de struct car tpoint est un alias de struct stPoint
struct stPoint p3;    //ici on en a
//*/
//Je vous conseille de maitriser au moin cette derniere version
//*variante5:declaration en associant un nom de type a une structure anonyme (enlever / au debut pour commenter)
typedef struct {int x;int y;}tPoint;
//puis instanciation
tPoint p1,p2={0,300},p3;
//*/
int main(){
  p1.x=150;p1.y=103;
  printf("Les coordonnees du point p1 sont (%d,%d)\n",p1.x,p1.y);
  printf("Les coordonnees du point p2 sont (%d,%d)\n",p2.x,p2.y);
  printf("Saisir les coordonnees du point p3\n");
  scanf("%d %d",&(p3.x),&(p3.y));
  printf("Les coordonnees du point p3 sont donc (%d,%d)\n",p3.x,p3.y);
  return 0;
}

Programme 4:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct {
       char titre_livre[16];
       char auteur[16];
       char editeur[16];
       int annee;
       int nbr_page;
       } tRef;

tRef listRef[50];

void remplir(int n,tRef listRef[50]),
    affiche(int n,tRef listRef[50]),
    triRef(int n,tRef listRef[n],int  choix);

int main(){
        int n,choix;
        printf("Donnez le nombre de references biblio <50");
        scanf("%d",&n);
        remplir(n,listRef);
        affiche(n,listRef);
        do{
           printf("\nEntrer : \n 1 pour le tri par titre"
                  "\n 2 pour le tri par auteur"
                  "\n 3 pour le tri par editeur"
                  "\n 4 pour le tri par annee"
                  "\n 5 pour le tri par nbr de page "
                  "\n 6 quitter "
                  "\n votre choix --------------------------->");
           scanf("%d",&choix);
           if(choix!=6){
                triRef(n,listRef,choix);
                affiche(n,listRef);
           }
        }while(choix!=6);

        return 0;
}

void remplir(int n,tRef listRef[50]){
          int i;
          printf("\n Introduire des chaines de caracteres <15 et sans espace \n");
          for(i=0;i<n;i++){
          printf("Donnez le titre N°%d:",i+1);
          scanf("%s",listRef[i].titre_livre);
          printf("donnez le nom de l'auteur ");
          scanf("%s",listRef[i].auteur);
          printf("donnez le nom de l'editeur ");
          scanf("%s",listRef[i].editeur);
          printf("donnez l'annee de publication ");
          scanf("%d",&(listRef[i].annee));
          printf("donnez le nbr de page ");
          scanf("%d",&(listRef[i].nbr_page));
          }
}

void affiche(int n, tRef listRef[50]){
        int i;
        printf("\n____________________________________________________________________");
        printf("\n|Titre          |Auteur         |Editeur        |Annee  |Nbr pages |");
        printf("\n--------------------------------------------------------------------");
        for(i=0;i<n;i++){
          printf("\n|%15s|",listRef[i].titre_livre);
          printf("%15s|",listRef[i].auteur);
          printf("%15s|",listRef[i].editeur);
          printf("%5d  |",listRef[i].annee);
          printf("%6d    |",listRef[i].nbr_page);
        }
         printf("\n--------------------------------------------------------------------");
}

void triRef(int n,tRef listRef[50],int choix){
    int i,j;
    tRef tmp;

        switch (choix){
            case 1:
                for(i=0;i<n-1;i++){
                    for(j=i+1;j<n;j++){
                        if(strcmp(listRef[i].titre_livre,listRef[j].titre_livre)>0){
                                tmp=listRef[i];listRef[i]=listRef[j];listRef[j]=tmp;
                        }
                    }
                }
            break;
            case 2:
                for(i=0;i<n-1;i++){
                    for(j=i+1;j<n;j++){
                        if(strcmp(listRef[i].auteur,listRef[j].auteur)>0){
                            tmp=listRef[i];listRef[i]=listRef[j];listRef[j]=tmp;
                        }
                    }
                }
            break;
            case 3:
                for(i=0;i<n-1;i++){
                    for(j=i+1;j<n;j++){
                        if(strcmp(listRef[i].editeur,listRef[j].editeur)>0){
                            tmp=listRef[i];listRef[i]=listRef[j];listRef[j]=tmp;
                        }
                    }
                }
            break;
            case 4:
                for(i=0;i<n-1;i++){
                    for(j=i+1;j<n;j++){
                        if (listRef[i].annee>listRef[j].annee){
                            tmp=listRef[i];listRef[i]=listRef[j];listRef[j]=tmp;
                        }
                    }
                }
          break;
          case 5:
            for(i=0;i<n-1;i++){
                    for(j=i+1;j<n;j++){
                        if(listRef[i].nbr_page>listRef[j].nbr_page){
                            tmp=listRef[i];listRef[i]=listRef[j];listRef[j]=tmp;
                        }
                    }
                }
          break;
          default:printf("le choix n'est pas valide");
        }
}



Une autre version de triRef a verifier.

void permutRef(tRef *ref1,tRef *ref2){
  tRef tmpRef;
  tmpRef=*ref1;*ref1=*ref2;*ref2=tmpRef;
}
void triRefV2(int n,tRef listRef[50],int choix){
    int i,j;
    if((choix>5)||(choix<1)){printf("le choix n'est pas valide");}
    else{
    for(i=0;i<n-1;i++){
        for(j=i+1;j<n;j++){
            switch (choix){
               case 1:
                  if(strcmp(listRef[i].titre_livre,listRef[j].titre_livre)>0){permutRef(&listRef[i],&listRef[j]);}

               break;
               case 2:
                  if(strcmp(listRef[i].auteur,listRef[j].auteur)>0){permutRef(&listRef[i],&listRef[j]);}
               break;
               case 3:
                 if(strcmp(listRef[i].editeur,listRef[j].editeur)>0){permutRef(&listRef[i],&listRef[j]);}
               break;
               case 4:
                 if (listRef[i].annee>listRef[j].annee){permutRef(&listRef[i],&listRef[j]);}
               break;
               case 5:
                 if(listRef[i].nbr_page>listRef[j].nbr_page){permutRef(&listRef[i],&listRef[j]);}
           }
        }
    }
    }
}