Manipulation des entiers de type char

Résolu
gnichiarsenal Messages postés 8 Date d'inscription dimanche 3 juillet 2011 Statut Membre Dernière intervention 3 juillet 2011 - 20 déc. 2009 à 17:55
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 23 déc. 2009 à 15:17
je prépare un miniprojet en c pour la manipulation des entiers de types char ,la conversion de char à int,faire un menu pour le choix des différentes fonctions.j'ai besoin de votre aide et merci d'avance

12 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
21 déc. 2009 à 16:30
C'est sans doute un très bon exercice. Mais où est le problème ?
Montre nous ton code, et l'endroit précis ou tu bloques.
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
20 déc. 2009 à 22:45
Bonjour.
Quelle est la question précise ?
0
gnichiarsenal Messages postés 8 Date d'inscription dimanche 3 juillet 2011 Statut Membre Dernière intervention 3 juillet 2011
21 déc. 2009 à 16:28
bonjour
il faut que je créé un menu pour la manipulation des entiers représentés sous la formes chaines de caractères.les fonctions sont:
1-une fonction qui à partir d'un entier construit sa représentation chaines de caratères
2-une fonction qui permet de lire/écrire des entiers de grandes tailles dans des fichiers texte
3-une fonctions permettant de manipuler des matrices contenants des entiers représentés sous la forme chaines de caractères(lecture/écriture en fichier,addition,produit des 2 matrices,etc.)
Et puis je doit comparer les performances avec les opérations sur les entiers en représentation propre au langage c.
merci d'avance
0
gnichiarsenal Messages postés 8 Date d'inscription dimanche 3 juillet 2011 Statut Membre Dernière intervention 3 juillet 2011
22 déc. 2009 à 17:40
bonjour
bon ,je suis débutant en programmation c
la représentation en chaine de caractères par exemple pour 13 est "13",j'ai un probleme d'extraire la chaine 13,surtout qu'on ne connait pas la taille de la représentation.
j'ai fait deux fonctions:la première est d'extraire une sous chaine
/*cette fonction permer d'éxraire une sous chaine d'une chaine de caractères*/
char *str_sub (const char *s, unsigned int start, unsigned int end)
{
char *new_s = NULL;
if (s != NULL && start < end)
{
/* (1)*/
new_s = malloc (sizeof (*new_s) * (end - start + 2));
if (new_s != NULL)
{
int i;
/* (2) */
for (i = start; i <= end; i++)
{
/* (3) */
new_s[i-start] = s[i];
}
new_s[i-start] = '\0';
}
else
{
fprintf (stderr, "Memoire insuffisante\n");
exit (EXIT_FAILURE);
}
}
return new_s;
}
il y a pas de problème là dans.
la seconde fonction permet de confirmer que l'entrée est une représentation en chaine de caractère et voila mon code


/*cette fonction permet de lire un entier représenté
sous forme chaine de caractère*/
void read ( char *x)
{

x = malloc(sizeof(*x)*256);//on ne sait pas sa taille
char *ch = malloc(sizeof(*x)-2);
printf("donner l'entier représenté sous sa forme chaine de caractères\n");
scanf("%s",x);
*ch=*str_sub(*x,1, strlen (x));
while(x[0]!="'"|x[strlen (x)]!="'"|isdigit(ch)!=1)
printf("donner l'entier représenté sous sa forme chaine de caractères\n");
}
et j'arrive pas à déterminer mes erreurs
bon je me bloque bien avec cette fonction qui semble facile à coder.
En plus je n'est pas d'idée pour faire la 2 eme fonction de ce mini-projet
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
22 déc. 2009 à 17:55
une fonction qui à partir d'un entier construit sa représentation chaines de caratères


Tu as deux solutions pour réaliser ceci:
1) Utiliser realloc, qui permet de modifier la taille d'un espace mémoire (donc d'un tableau).
2) Calculer le nombre de chiffre que possède un entier, afin d'allouer exactement la taille nécessaire.
Ex: 11243 => 5, 3 => 1, 98530234 => 8.

Je te conseil la seconde méthode, pas très compliqué, et qui évite de réallouer constamment ta mémoire.
Coupe ceci, en trois fonctions:

* int checkNum(char* s), qui vérifie que la chaîne passée est bien un nombre. Indice: juste vérifier que chacun des caractères est bien compris entre le caractère "0" et le caractère "9". Renvoyer vrai ou faux.
* int getNumSize(int nb), qui prend un nombre en argument, et retourne sa taille. Indice: il suffit de compter combien de fois on peut le diviser par 10 ;)
* char* intToString(int nb), qui convertit un entier en chaîne. Indice: réutilise checkNum pour vérifier que c'est bien un chiffre et getNumSize pour allouer pile la bonne taille via malloc.

Fais déjà ceci, et tu auras le premier point de fait. On verra la suite après.
0
gnichiarsenal Messages postés 8 Date d'inscription dimanche 3 juillet 2011 Statut Membre Dernière intervention 3 juillet 2011
22 déc. 2009 à 18:55
merci bien
mon problème n'est pas de faire la fonction qui à partir d'un entier construit sa représentation en chaine de caractère.
je viens de discuter avec des collègues le mini-projet,je vous écrit l'énoncé tel quel est:
considérons les nombres entiers représentés sous la forme des chaînes de caractères
1/construire une fonction qui permet d'ajouter deux entiers représentés sous forme des chaines de caractères.
ce que j'ai compris de cette question est que l'entrée est deux entiers représentés sous forme des chaines de caractères.alors là,je dois lire l'entrée et la convertir en entiers et puis faire l'instruction de somme
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
22 déc. 2009 à 20:44
mon problème n'est pas de faire la fonction qui à partir d'un entier construit sa représentation en chaine de caractère.

C'est pourtant ce que tu m'as décris dans ton précédent post !


ce que j'ai compris de cette question est que l'entrée est deux entiers représentés sous forme des chaines de caractères.alors là,je dois lire l'entrée et la convertir en entiers et puis faire l'instruction de somme

Surtout pas ! L'exercice qu'on te demande, s'appelle une bistromathique. C'est une technique qui permet de gérer des nombres d'une taille très grande (taille qui ne rentrerait pas dans un entier). Si tu convertis en entier, tu perds tout l'intérêt !

Pour additionner deux chaînes de caractères représentant des entiers, il va falloir que tu te souviennes de tes cours de primaires. Quand tu étais petit, tu posais sûrement tes additions sur papiers. Tu partais de la droite, tu additionnais les chiffres, un à un, et tu gardais une retenu, si nécessaire.

Et bien pour réaliser cet exercice, c'est le même principe. Tu pars vers la fin de tes chaînes de caractères, et tu additionnes les éléments un à un, en gardant une retenue, si nécessaire. Le résultat tiendra dans un tableau, dont la taille est forcément comprise entre (taille de la plus grande chaîne) et (taille de la plus grande chaîne + 1).

Ex:
"1234" + "859"

Etape 1:

"1234" => premier tableau (taille 4)
"859" => deuxième tableau (taille 3)
-------
"....." => tableau de résultat (taille 5)
ret 0> retenu

Etape 2:

tab1[3] + tab2[2] + ret = 4 + 9 + 0 = 13, soit 3 retient 1

"1234" => premier tableau (taille 4)
"859" => deuxième tableau (taille 3)
-------
"....3" => tableau de résultat (taille 5)
ret 1> retenu

Etape 3:

tab1[2] + tab2[1] + ret = 3 + 5 + 1 = 9, soit 9 retient 0

"1234" => premier tableau (taille 4)
"859" => deuxième tableau (taille 3)
-------
"...93" => tableau de résultat (taille 5)
ret 0> retenu

Etape 4:

tab1[1] + tab2[0] + ret = 8 + 2 + 0 = 10, soit 0 retient 1

"1234" => premier tableau (taille 4)
"859" => deuxième tableau (taille 3)
-------
"..093" => tableau de résultat (taille 5)
ret 1> retenu

Etape 5:

Ici on est arrivé au début du tableau 2. Donc:
On change la méthode qui devient:

tab1[0] + ret = 1 + 1 = 2, soit 2 retient 0

"1234" => premier tableau (taille 4)
"859" => deuxième tableau (taille 3)
-------
".2093" => tableau de résultat (taille 5)
ret 0> retenu

Etape 6:

Ici on a terminé. On vérifie juste qu'il n'y ait pas de case inutilisé dans le tableau résultat.
Ici, on voit que c'est le cas, dont on décale toute les caractères vers la gauche:
".2093" => "2093."

Enfin, on peut au choix:
- Raccourcir la chaîne de caractère de 1, via realloc
- Considérer qu'une case de gaché ce n'est pas bien grave, et juste mettre un 0 terminal à la case 4 (à la place du .)

Bonne chance !
0
gnichiarsenal Messages postés 8 Date d'inscription dimanche 3 juillet 2011 Statut Membre Dernière intervention 3 juillet 2011
23 déc. 2009 à 14:57
vraiment,merci beaucoup
Même le prof du cours de programmation n'a pas pu comprendre l'objet du miniprojet.
en fait je viens juste de comprendre de quoi il s'agit.Bon ce qui est maintenant difficile à faire c'est comment lire des entiers de grandes taille.vraiment c'est pas destiné au debutant,je vais peut être recherché un code-sources complet.ci quel qu'un peut m'envoyer un lien qui peut m'aider
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
23 déc. 2009 à 15:02
Même le prof du cours de programmation n'a pas pu comprendre l'objet du miniprojet.

Bizarre pour un prof de ne pas comprendre ce qu'il donne...

en fait je viens juste de comprendre de quoi il s'agit.Bon ce qui est maintenant difficile à faire c'est comment lire des entiers de grandes taille.vraiment c'est pas destiné au debutant,

Ce n'est pas très compliqué, et c'est souvent donné comme exercice aux débutants. Regarde l'explication que je t'ai donné, et tu verras qu'il n'y a rien de vraiment difficile.

je vais peut être recherché un code-sources complet.ci quel qu'un peut m'envoyer un lien qui peut m'aider

Si c'est un miniprojet, c'est à faire par toi même. Allez chercher un exercice tout fait ne t'apprendra rien.
0
gnichiarsenal Messages postés 8 Date d'inscription dimanche 3 juillet 2011 Statut Membre Dernière intervention 3 juillet 2011
23 déc. 2009 à 15:08
ok,je vais essayer.ce qui est sur le prof du mini-projet il ne va pas me faciliter la vie lors de la soutenance
0
gnichiarsenal Messages postés 8 Date d'inscription dimanche 3 juillet 2011 Statut Membre Dernière intervention 3 juillet 2011
23 déc. 2009 à 15:11
j'ai plein d'erreurs :compairing pointer to integer without a cast
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
23 déc. 2009 à 15:17
j'ai plein d'erreurs :compairing pointer to integer without a cast


La comme ça, je ne suis pas devin. Donc il faut que tu me montres ton code :)
0
Rejoignez-nous