Probleme de main
Résolu
Kiira
-
Py_rex Messages postés 241 Date d'inscription Statut Membre Dernière intervention -
Py_rex Messages postés 241 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je suis en train de coder un programme qui prend en parametre une chaine de caractere et qui transforme chaque lettre de la chaine par la lettre suivante. Mon programme marche cependant j'ai toujours du mal a gerer le main. Voila mon code qui est completement faux je le sais deja et j'aurais besoin d'aide:
void rotone(char *str)
{
int i;
i = 0;
while (str[i] != '\0')
{
if (str[i] >= 'a' && str[i] < 'z' || str[i] >= 'A' && str[i] < 'Z')
str[i] = str[i] + 1;
if (str[i] == 'Z')
str[i] = 'A';
if (str[i] == 'z')
str[i] = 'a';
i++;
}
}
int main(int ac, char **av)
{
int i;
i = 0;
if (ac != 2)
my_putchar('\n');
else
{
while (i >= 1)
{
rotone(av[i]);
my_putstr(av[i]);
my_putchar('\n');
i++;
}
}
}
Je pense que l'erreur se tient au niveau du else dans le main mais je ne comprends pas comment faire pour passer autant de parametre que je veux et que le rotone se fasse sur chacun.
Merci d'avance.
Je suis en train de coder un programme qui prend en parametre une chaine de caractere et qui transforme chaque lettre de la chaine par la lettre suivante. Mon programme marche cependant j'ai toujours du mal a gerer le main. Voila mon code qui est completement faux je le sais deja et j'aurais besoin d'aide:
void rotone(char *str)
{
int i;
i = 0;
while (str[i] != '\0')
{
if (str[i] >= 'a' && str[i] < 'z' || str[i] >= 'A' && str[i] < 'Z')
str[i] = str[i] + 1;
if (str[i] == 'Z')
str[i] = 'A';
if (str[i] == 'z')
str[i] = 'a';
i++;
}
}
int main(int ac, char **av)
{
int i;
i = 0;
if (ac != 2)
my_putchar('\n');
else
{
while (i >= 1)
{
rotone(av[i]);
my_putstr(av[i]);
my_putchar('\n');
i++;
}
}
}
Je pense que l'erreur se tient au niveau du else dans le main mais je ne comprends pas comment faire pour passer autant de parametre que je veux et que le rotone se fasse sur chacun.
Merci d'avance.
A voir également:
- Probleme de main
- Scan ligne de la main gratuit - Télécharger - Photo & Graphisme
- Désactiver remise en main propre leboncoin - Forum Vos droits sur internet
- Main a cessé de fonctionner autocom ✓ - Forum Windows
- Main menu xiaomi - Forum Xiaomi
- La main de la titi popo - Forum Musique / Radio / Clip
6 réponses
Bonsoir,
Déjà, les fonctions que vous utilisez ne sont pas standard. Par exemple my_putchar, my_putstr. S'il s'agit de fonctions définies par vos soins, il est d'usage de les joindre au post. Les fonctions standards sont respectivement : int putchar(int), et int puts(const char*) tous deux définis dans stdio.h
Sinon l'algorithme du main est faux.
Vous initiiez i à 0 puis vous parcourez pour i>=1, ce qui ne fera aucune itération. Et quand bien même i était égal à 1, la boucle serait infini puisque i est incrémenté lors de chaque itération.
Pour récupérer le premier argument, il suffit de mettre rotone(av[1]); Si tu veux récupérer chaque paramètre, il faudra faire une condition sur la variable ac qui contient le nombre d'arguments passé en paramètre de ton programme augmenté de 1. De plus dans ce cas, il te faudra mettre dans le main : if(ac>1) au lieu de if(ac!=2).
Et enfin petite astuce pour ta fonction rotone, tu peux utiliser un petit coup de modulo ce qui t'évite de séparer le cas str[i]!='z' ou str[i]!='Z'.
Si tu as des questions, n'hésite pas.
Cordialement,
Déjà, les fonctions que vous utilisez ne sont pas standard. Par exemple my_putchar, my_putstr. S'il s'agit de fonctions définies par vos soins, il est d'usage de les joindre au post. Les fonctions standards sont respectivement : int putchar(int), et int puts(const char*) tous deux définis dans stdio.h
Sinon l'algorithme du main est faux.
Vous initiiez i à 0 puis vous parcourez pour i>=1, ce qui ne fera aucune itération. Et quand bien même i était égal à 1, la boucle serait infini puisque i est incrémenté lors de chaque itération.
Pour récupérer le premier argument, il suffit de mettre rotone(av[1]); Si tu veux récupérer chaque paramètre, il faudra faire une condition sur la variable ac qui contient le nombre d'arguments passé en paramètre de ton programme augmenté de 1. De plus dans ce cas, il te faudra mettre dans le main : if(ac>1) au lieu de if(ac!=2).
Et enfin petite astuce pour ta fonction rotone, tu peux utiliser un petit coup de modulo ce qui t'évite de séparer le cas str[i]!='z' ou str[i]!='Z'.
Si tu as des questions, n'hésite pas.
Cordialement,
Bonjour,
Comment voulez vous que cela marche ? Vous déclarez d'abord i = 0 et 4 lignes plus bas while (i >= 1). Ce n'est pas une erreur de programmation, mais de logique ... Et cette boucle while, elle doit s'arrêter quand ? Avec le i++ de le dernière ligne de la boucle, i sera toujours plus grand que 1 ... et deviendra vite plus grand que la taille de la chaîne de caractères !
Autre erreur logique : dans rotone vous changez un caractère et vous allez voir après s'il est égal à z ... ce qui aura comme résultat que y deviendra z qui deviendra a et que z deviendra z+1.
Le premier pas de la programmation, c'est l'analyse. Il faut se représenter l'enchaînement des opérations à faire. Ce n'est qu'après que vent la programmation strictu sensu : la traduction de cet enchaînement des opérations (l'algorithme) en code. Après viennent l'évaluation et l'optimisation. Mais apprenez d'abord à analyser un problème avant de coder. A la limite, faites les opérations les unes après les autres à la main en donnant une attention toute particulière aux limites (tel que l'histoire du z dans votre problème).
Comment voulez vous que cela marche ? Vous déclarez d'abord i = 0 et 4 lignes plus bas while (i >= 1). Ce n'est pas une erreur de programmation, mais de logique ... Et cette boucle while, elle doit s'arrêter quand ? Avec le i++ de le dernière ligne de la boucle, i sera toujours plus grand que 1 ... et deviendra vite plus grand que la taille de la chaîne de caractères !
Autre erreur logique : dans rotone vous changez un caractère et vous allez voir après s'il est égal à z ... ce qui aura comme résultat que y deviendra z qui deviendra a et que z deviendra z+1.
Le premier pas de la programmation, c'est l'analyse. Il faut se représenter l'enchaînement des opérations à faire. Ce n'est qu'après que vent la programmation strictu sensu : la traduction de cet enchaînement des opérations (l'algorithme) en code. Après viennent l'évaluation et l'optimisation. Mais apprenez d'abord à analyser un problème avant de coder. A la limite, faites les opérations les unes après les autres à la main en donnant une attention toute particulière aux limites (tel que l'histoire du z dans votre problème).
Justement, la fontion du rotone est qu'il transforme chaque lettre de ma chaine par le caractere suivant les minuscules restent des minuscules et les majuscules de majuscules et que 'z' devient 'a' et 'Z' devient 'A'. Mais je ne comprends pas l'erreur dans mon main. J'arrive a gerer le cas ou je ne passe pas de parametres et celui ou je n'en passe qu'un seul mais pas quand j'en passe plus.
Bonjour,
votre fonction rotone remplace en effet chaque lettre de la chaîne par la suivante, sauf pour le y, qui deviendra a et sauf pour le z qui ne sera plus compris entre a et z. Suivez votre algorithme à la main avec une chaine qui contient par exemple "xyz" et vous verrez.
Quand vous entrez dans la boucle while de la fonction main, la variable i a la valeur 0 (que vous avez attribué vous-même lors de son initialisation) et ne réponds donc pas à la condition i >= 0.
Si je vous ai bien compris, vous voulez transformer autant de chaînes que vous avez passé comme argument sur la ligne de commande. Ce nombre de chaînes est donné par la variable ac. Il faudrait donc utiliser cette variable pour traiter le nombre exact de chaînes.
Comme cette histoire ressemble à un exercice scolaire de programmation, je ne vais pas faire le programme à votre place ..
votre fonction rotone remplace en effet chaque lettre de la chaîne par la suivante, sauf pour le y, qui deviendra a et sauf pour le z qui ne sera plus compris entre a et z. Suivez votre algorithme à la main avec une chaine qui contient par exemple "xyz" et vous verrez.
Quand vous entrez dans la boucle while de la fonction main, la variable i a la valeur 0 (que vous avez attribué vous-même lors de son initialisation) et ne réponds donc pas à la condition i >= 0.
Si je vous ai bien compris, vous voulez transformer autant de chaînes que vous avez passé comme argument sur la ligne de commande. Ce nombre de chaînes est donné par la variable ac. Il faudrait donc utiliser cette variable pour traiter le nombre exact de chaînes.
Comme cette histoire ressemble à un exercice scolaire de programmation, je ne vais pas faire le programme à votre place ..
Bonsoir,
Désolé, j'ai mal lu votre fonction rotone ... j'avais vu <= z ... elle est correct avec < z !
Désolé, j'ai mal lu votre fonction rotone ... j'avais vu <= z ... elle est correct avec < z !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
J'ai trouve la solution a mon probleme de main:
int main(int ac, char **av)
{
int i;
i = 1;
if (ac < 2)
my_putchar('\n');
else
{
while (i < ac)
{
rotone(av[i]);
my_putstr(av[i]);
my_putchar('\n');
i++;
}
}
return (0);
}
J initialisais i a 0 au lieu de 1 et je ne faisais pas de return non plus du coup maintenant ca marche niquel. Merci en tout cas.
int main(int ac, char **av)
{
int i;
i = 1;
if (ac < 2)
my_putchar('\n');
else
{
while (i < ac)
{
rotone(av[i]);
my_putstr(av[i]);
my_putchar('\n');
i++;
}
}
return (0);
}
J initialisais i a 0 au lieu de 1 et je ne faisais pas de return non plus du coup maintenant ca marche niquel. Merci en tout cas.
Oui il y avait bien l'histoire du i, mais aussi de la condition sur le while qu'il fallait changer, ce que tu as fait.
Le return 0; n'était pas le responsable de ton problème, puisqu'il est facultatif en C99.
Et enfin, tu as toujours laissé les fonctions my_putchar et my_putstr au lieu de putchar et puts qui sont portables.
Le return 0; n'était pas le responsable de ton problème, puisqu'il est facultatif en C99.
Et enfin, tu as toujours laissé les fonctions my_putchar et my_putstr au lieu de putchar et puts qui sont portables.
Bonjour,
N'empêche qu'il y a toujours une erreur dans la fonction rotone. Prenons comme exemple qu'elle parcoure la chaîne "xyz" :
i = 0 premier if x deviendra y deuxième if pas applicable
i = 1 premier if y deviendra z deuxième if z qui deviendra a !!!
i = 2 premier if z deviendra a deuxième if pas applicable
"xyz" deviendra "yaa" au lieu de "yza"
N'empêche qu'il y a toujours une erreur dans la fonction rotone. Prenons comme exemple qu'elle parcoure la chaîne "xyz" :
i = 0 premier if x deviendra y deuxième if pas applicable
i = 1 premier if y deviendra z deuxième if z qui deviendra a !!!
i = 2 premier if z deviendra a deuxième if pas applicable
"xyz" deviendra "yaa" au lieu de "yza"