Il y a actuellement 386 visiteurs
Jeudi 25 Avril 2024
accueilactualitésdossierscomparer les prixtélécharger gratuitement vos logicielsoffres d'emploiforum informatique
Connexion
Créer un compte

Exercices de C

Besoin d'aide pour configurer un serveur ? Vous souhaitez obtenir des conseils pour référencer votre site ? Un petit souci pour accéder à votre FTP ? Des soucis de programmation en PHP / ASP / HTML / XHTML / XML / XSLT / CSS / ReactJS / AngularJS / VueJS / CGI / PERL / C / MySQL / PostgreSQL ??? Nous avons peut-être la solution dans ce forum ...

Exercices de C

Message le 08 Aoû 2005 11:11

Salut,
je suis en train de réviser pour les rattrapages de septembre en C.
J'aimerais s'il vous plait que quelq'un.
Merci d'avance.
Je mets l'énoncé en noir les questions en bleu



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);

Code: Tout sélectionner
int cmpLexico(const char *s, const char *t){
  int i=0, j=0;
  if(s[i]=='\0' && t[j]=='\0')
    while(s[i]!='\0' && t[j]!='\0'){
      if(s[i] == t[i]){
   i++;
   j++;
      }
      if(s[i] < t[j]) return -1;
      if (s[i] > t[j]) return 1;
    }
  return 0;
}


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

Code: Tout sélectionner
int cmpInvLexico(const char *s1,const char *s2){
int res = strcmp(s1,s2);
return (-res);
}


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);

Code: Tout sélectionner
int cmpMilitaire(const char *s1, const char *s2){
   size_t l1,l2;
   l1 = strlen(s1);
   l2 = strlen(s2);
   if(l1 < l2) return 1;
   if(l1 > l2) return -1;
   else return (cmpLexico(s1,s2));
}


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

Code: Tout sélectionner
int cmpInvMilitaire(const char *s1, const char *s2){
return (-cmpMilitaire(s1,s2));
}



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.

Code: Tout sélectionner
char *range(const char *s){
   char * tmp;
   int i, j=0, k=j;
   for(i=0; i<strlen(s1); i++){
    if(s[i]=='a' || s[i]=='e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u' || s[i] == 'y')
     tmp[j] = s[i];
     while(k != i){
       tmp[k+1] = s[k];
       k++;
    }
  }
return tmp;
}

int cmpVoyellesConsonnes(const char *s1, const char *s2){
return strcmp(range(s1),range(s2));
}



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
Morpheus77
Visiteur
Visiteur
 
Messages: 8
Inscription: 08 Aoû 2005 11:08
 


Message le 08 Aoû 2005 18:17

Bonjour & bienvenue,

Ce n'est pas vraiment mon domaine,mais voici quelques Liens
proposés sur un site tenu par un "caïd" qui m'a plusieurs fois sorti de
pièges.
Que ta requète aboutisse & M.... :oops: bonne chance pour ta réussite.
Avatar de l'utilisateur
Ask to Old Man
Moderateur
Moderateur
 
Messages: 19970
Inscription: 14 Mar 2004 10:06
Localisation: Argenteuil,Val d'Oise
 

Re: Exercices de C

Message le 12 Aoû 2005 16:49

Morpheus77 a écrit:Ecrire une fonction réalisant la comparaison de deux chaines de caractère ...

int cmpLexico(cont char *s1, const char *s2){
return(strcmp(s1,s2));
}

Celle-là, j'avoue qu'elle m'a bien fait rire... Gentiment, je précise.. ce n'est pas méchant.

C'est astucieux de ta part, mais... à mon avis, si on te demande "d'écrire" une fonction, ce n'est pas pour que tu utilise celle "déjà toute faite" de la librairie C.

Faut le faire un peu plus codé quoi... avec des tableaux, des indices et des comparaisons caractères à caractères :wink:

(idem pour la comparaison inverse)
Avatar de l'utilisateur
CaSa
PC-Infopraticien
PC-Infopraticien
 
Messages: 9041
Inscription: 13 Mai 2003 16:32
Localisation: Sisteron... et jamais loin d'une Debian
 

Re: Exercices de C

Message le 13 Aoû 2005 09:24

casa04 a écrit:
Morpheus77 a écrit:Ecrire une fonction réalisant la comparaison de deux chaines de caractère ...

int cmpLexico(cont char *s1, const char *s2){
return(strcmp(s1,s2));
}

Celle-là, j'avoue qu'elle m'a bien fait rire... Gentiment, je précise.. ce n'est pas méchant.

C'est astucieux de ta part, mais... à mon avis, si on te demande "d'écrire" une fonction, ce n'est pas pour que tu utilise celle "déjà toute faite" de la librairie C.

Faut le faire un peu plus codé quoi... avec des tableaux, des indices et des comparaisons caractères à caractères :wink:
(idem pour la comparaison inverse)

J'ai modifié la fonction peux-tu y jeter un oeil.
merci
Morpheus77
Visiteur
Visiteur
 
Messages: 8
Inscription: 08 Aoû 2005 11:08
 

Message le 13 Aoû 2005 12:30

Code: Tout sélectionner
int cmpLexico(const char *s, const char *t){
  int i=0, j=0;
  if(s[i]=='\0' && t[j]=='\0')
    while(s[i]!='\0' && t[j]!='\0'){
      if(s[i] == t[i]){
   i++;
   j++;
      }
      if(s[i] < t[j]) return -1;
      if (s[i] > t[j]) return 1;
    }
  return 0;
}


j'ai un soucis sur le premier if :
if(s[i]=='' && t[j]=='')

le correspond bien au caractére de fin de chaine (j'ai pas fai de c/c++ depuis des années) ... donc je comprends pas pourquoi le mettre là et juste en dessous mettre un while(s[i]!='' && t[j]!='')
qui sera faux immédiatement ... donc ca retourne soit 0 soit 0 (j'ai bon ?)


par ailleurs j'imagine que tes chaines font la même longueur, sinon je pense que tu vas sortir violllement d'un des tableaux et que le compilateur va pas aimer
Avatar de l'utilisateur
6r
Expert(e)
Expert(e)
 
Messages: 1488
Inscription: 14 Oct 2003 08:26
Localisation: Troyes
 

Message le 16 Aoû 2005 19:44

Ca fait longtemps que j'ai pas touché au C, mais 6r a raison je pense aussi.

Je verrais plutôt :

int cmpLexico(const char *s, const char *t)
{
int i=0;

while(s[i]!='\0' && t[i]!='\0' && s[i] == t[i]) ++i;

if (s[i] < t[i]) return -1;
if (s[i] > t[i]) return 1;

return 0;
}


Un truc comme ça peut-être...
Avatar de l'utilisateur
CaSa
PC-Infopraticien
PC-Infopraticien
 
Messages: 9041
Inscription: 13 Mai 2003 16:32
Localisation: Sisteron... et jamais loin d'une Debian
 



Sujets similaires

Message Exercices pour passer le permis de conduire
... moi c'était une Simca 1000 blanche ... sinon ras et ++
Réponses: 39

Message Exercices de base de données
Salut, je suis en train de réviser les bases de données pour les rattrapges de septembre que je dois faire. J'aimerais que quelqu'un m'indique s'il y a des erreurs et que quelqu'un m'aide pour les parties ou je bloque. L'énoncé est en noir, les questions en bleu et les réponses en rouge PS:Je mets l ...
Réponses: 7


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 8 invités


.: Nous contacter :: Flux RSS :: Données personnelles :.
cron