Demande d'aide
Hors ligneMorpheus Le 08/08/2005 à 11:43 Profil de Morpheus Configuration de Morpheus

Salut,
je suis actuellement en train de réviser pour mes rattrappages de septembre en licence info.
Ayant complètement rater mes exams de juin,je voudrais savoir si quelqu'un pourrait m'aider à répondre aux questions qui m'avait été posés lors des examens.
Les matières concernées sont java,C et programmation système.
Je mettrais les questions en ligne,seulement s'il ya des personnes intéressées.
Merci d'avance à ceux qui m'aideront
Hors ligneAnthony Le 08/08/2005 à 15:14 Profil de Anthony Configuration de Anthony

Admin
Salut,

je pense que si tu mets les questions en ligne il sera plus simple de t'aider :-)
--

Hors ligneMorpheus Le 09/08/2005 à 11:22 Profil de Morpheus Configuration de Morpheus

Examen final de programmation C

I Question de cours

Exercice 1
Donnez le type de l'expression li+ui avec les déclarations suivantes:

long int li=1L;
unsigned int ui=1U;

Justifiez votre réponse.


Exercice 2
Que signifie l'avertissement du compilateur

warn.c: In function 'f':
warn.c:3: control reaches end of non-void function

Comment y remédier ?


II Lecture de code

Exercice 3
Que fait le programme suivant ? Est-il portable (justifiez votre réponse) ?

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

int g(unsigned int n,char *res){
  if(n>9) return 1;
  *res = '0'+n;
  return 0;
}


int f(unsigned int n, char *s, size_t *l){
  char c; size_t cl=*l;
  if(n==0)
    return 0;
  g(n%10U, s);
  c=*s;
  ++*l;
  f(n/10U, s+1, l);
  if(cl<*l/2){
    *s=s[*l-cl-1-cl];
    s[*l-cl-1-cl]=c;
  }
  return 0;
}


int main (void){
  unsigned int n;
  char buf[BUFSIZ];/*Suppose assez grand*/
  size_t l=0;
  printf("Entrez un nombre:");
  if (scanf("%u",&n)==1){
    if(n!=0)
      f(n,buf,&l);
    else{
      buf[0]='0';
      ++l;
    }
    buf[l]='\0';
    fprintf(stdout,"%s %u\n",buf,l);
    return EXIT_SUCCESS;
  }
  else return EXIT_FAILURE;
}

Que se passe t-il si la saisie n'est pas correcte ? Comment détecter ,au niveau du shell,si cette saisie était correcte ou non (donnez un petit exemple ,en shell) ?


Exercie 4
L'éxécution du programme suivant produit une erreur de segmentation.Expilquer pourquoi.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void bubbleSort(char **tab,int (*cmp)(void *,void *)){
  char **p1,**p2;
  for(p1=tab; *p1!=NULL; ++p1)
    for(p2=p1+1; *p2!=NULL; ++p2)
      if((*cmp)(*p1,*p2)>0){
     char buf[BUFSIZ];/*Suppose assez grand*/
     strcpy(buf,*p1);
     strcpy(*p1,*p2);
     strcpy(*p2,buf);
      }
}



void printTable(FILE *fdo, char **tab){
  for( ; *tab!=NULL; ++tab)
    fprintf(fdo, "%s\n", *tab);
}



int main (int argc, char * argv[]){
  char **t;
  unsigned int i,l;
  if((t=(char **)malloc(sizeof(char *)*argc))==NULL){
    fprintf(stderr,"Error in memory allocation\n");
    return EXIT_FAILURE;
  }
  l=(unsigned int)argc-1U;
  for(i=0; i<l; ++i){
    if((t[i]=(char*)malloc(strlen(argv[i+1])+1))==NULL){
      fprintf(stderr,"Error in memory allocation\n");
      return EXIT_FAILURE;
    }
    strcpy(t[i],argv[i+1]);
  }
  t[l]=NULL;
  printTable(stdout, t);
  bubbleSort(t, (int (*)(void *,void *)) &strcmp);
  printTable(stdout, t);
  return EXIT_SUCCESS;
}


III Problème
Dans le problème nous manipulons des tas.Un tas est un conteneur de données,qu'on peut représenter comme un arbre dont la racine contient à chaque instant le plus petit élément du conteneur (on note que cela suppose qu'il existe une relation d'ordre sue les éléments).Ainsi ,l'opération retrouver le plus petit élément se réalise toujours en temps constant .Nous allons nous servir des tas pour réaliser des tris sur des donnéés.

Pour ne pas implémenter les tas ,on récupère ( sur le Web,par exemple), un module C permettant de les manipuler.Ce module est composé d'un fichier heap.c contenant les définitions de fonctions de manipulation d'un tas,et d'un fichier heap.h dont le contenu est:

#ifndef _HEAP_H
#define _HEAP_H

typedef struct _heap {
   /*On se moque du contenu de la structure*/
} Heap;

/*Toutes ces fonctions retournent 0 ssi pas d'erreur,
un code d'erreur sinon*/

/*Création d'un tas .Le paramètre cmp permet de préciser
la relation d'ordre sur ces éléments. Cplx : 0(1)*/
extern int newHeap(Heap **h, int (*cmp)(void *,void *));
/*Ajouter l'élément désigné par newElt au tas désigné par h.
Fait une copie à usage interne de l'élément.
Cplx : 0(log(nb d'éléments du tas)+taille élément)*/
extern int addToHeap(Heap *h, void *newElt);
/*Retirer le plus petit élément du tas ,le recopier dans la zone
désignée par res ,qu'on suppose suffisament grande.
Cplx: 0(log(nb d'éléments du tas)+taille élément)*/
extern int removeSmallestFromHeap(Heap *h, void *res);
/*Libérer les ressources occupées par le tas. au retour de la fonction,
*h vaut NULL.Cplx: 0(nb d'éléments du tas)*/
extern int freeHeap(Heap **h);

/*Ici ,le fichier contient d'autres déclarations de fonctions,
qui ne nous intérressent pas
*/
...

#endif

Nous nous intedisons de mofifier ces fichiers: nous ne pouvons pas les utiliser.

Dans les fonctions de comparaisons qu'on vous demande d'écrire dans le problème ,
les conventions pour la valeur sont les memes que pour strcmp.

Exercice 5
Ecrire une fonction réalisant la comparaison de deux chaines de caractères suivant l'ordre lexicographique.Votre fonction devra avoir la signature suivante:

int cmpLexico(const char *s1, const char * s2);

Meme chose,mais pour  l'ordre lexicographique inverse (cette fois-ci le nom de la fonction sera cmpInvLexico)


Exercice 6
L'ordre militaire sur les mots est donné par le nombre des lettres des mots: moins un mot a de lettres ,plus il est petit pour l'ordre militaire.
Ecrivez une fonction réalisant la comparaison de deux chaines de caractères suivant l'ordre militaire.Votre fonction devra avoir la signature suivante:

int cmpMilitaire(const char *s1, const char * s2);

Meme chose,mais pour  l'ordre militaire inverse (cette fois-ci le nom de la fonction sera cmpInvMilitaire)


Exercice 7
On définit maintenant une relation d'ordre sur les chaines de caractères de la façon suivante. Soit u un mot. A partir de u, on calcule u' en ramenant les voyelles au début du mot ,sans en changer l'ordre. Par exemple,si u = xbygeak,alors u' = yeaxbgk. Soient deux mots u1 et u2 . On dit que u1 est plus petit que u2 si et seulement si u1' est plus petit,pour l'odre lexicographique que u2'. Par exemple u1 = xbegyak est plus petit que u2 = xbygeak, car u1' = eyaxbgk est plus petit,pour l'ordre lexicographique , que u2' = yeaxbgk. Nous appellerons cette relation d'ordre voyelles-consonnes. Ecrire une fonction réalisant la comparaison de deux chaines de caractères suivant la relation voyelles-consonnes.Attention :au sortir de la fonction ,les chaines de caractères doivent etre telles qu' elles étaient au départ de la fonction.


Exercice 8
Soit un flot texte, ouvert en lecture , dont nous supposerons qu'il ne contient que des lignes composées de consonnes et de voyelles (pas de chiffres,espacements,ponctuations,etc..).Ecrire une fonction

int triFlots(FILE *flotLecture, FILE *flotEcriture,
                  int (*cmp)(const char *s1, const char *s2))

prenant un tel flot en paramètre ,avec un autre flot texte ,ouvert en écriture ,et qui met dans le second toutes les lignes du premier, triées par l'ordre donné par la fonction désignée par cmp. Vous n'avez pas le droit de faire le tri directement : vous devez utiliser un tas ,dans lequel vous mettrez les lignes du flot en lecture,puis vous en retirerez les éléments un par un pour pour les mettre dans le flot en écriture.La fonction retourne 0 si tout se passe bien ,un code d'erreur sinon. N'oubliez pas de libérer toutes les ressources intermédiaires quand vous n'en avez plus besoin.


Exercice 9
Ecrire un programme dans lequel vous utilisez triFlots pour trier l'entrée standart par l'ordre voyelles-consonnes, en mettant le résultat sur la sortie standart.


Exercice 10
On va maitenant trier un tableau de chaines de caractères .
Ecrire une fonction

int triTab(char **tab, int (*cmp)(const char *s1, const char *s2))

ou tab désigne le premier élément d'une suite de chaines de caratères qu'il fau trier ,la suite se terminant par NULL ,et cmp permet de spécifier la relation d'ordre à utiliser pour le tri. Au sortir de la fonction , la suite désignée par tab sera triée par l'ordre spécifié. Encore, une fois ,vous n'avez pas le droit de réaliser le tri à proprement parler vous-meme,vous devez passer par un tas. La fonction retourne 0 si tout se passe bien un code d'erreur sinon. N'oubliez pas de libérer toutes les ressources intemédiaires quand vous n'en avez plus besoin.


Exercice 11
Ecrire un programme prenant en premier paramètre
   -a: ordre lexicographique
   -b: ordre lexicographique inverse
   -c: ordre militaire
   -d: ordre militaire inverse
   -e: ordre voyelles consonnes

puis des mots quelconques, et affichant sur sa sortie standart ces mots triés par l'ordre spécifié. Par exemple

% tri -c sdf rgtrt sddd d g reffr y
d
g
y
sdf
sddd
rgtrt
reffr

Vous devez utiliser ce que vous avez déjà écrit dans les exercices précédents
Vous avez résolu votre problème avec VIC ? Faites-le savoir sur les réseaux sociaux !
Vulgarisation-informatique.com
Cours en informatique & tutoriels