Programmation en C - Aide aux devoirs - Emploi & Etudes
Marsh Posté le 07-10-2004 à 22:23:51
Puisque l'exercice nécessite d'utiliser printf, je me sens obligé de répondre
Il y a une toute petite chose à savoir pour remplacer chaque lettre par celle qui la suit dans l'alphabet, à savoir que les caractères ne sont rien d'autre que des nombres entiers consécutifs (c'est à dire que pour l'ASCII*, 'a'=97, 'b'=98, etc.).
Le coup des macros c'est franchement dégueulasse, mais je suppose que c'est parce que vous n'avez pas encore vu les fonctions.
Le mieux est de poster ce que tu as déjà fait, sinon ça va pas être facile d'aider
* par contre si c'est de l'EBCDIC y'a comme qui dirait des coupures
Marsh Posté le 07-10-2004 à 22:42:22
printf a écrit : Puisque l'exercice nécessite d'utiliser printf, je me sens obligé de répondre |
Bonjour,
Merci de m'avoir répondu aussi vite.
Je vais te montrer où j'en suis mais tu vas rire parce que franchement j'ai pas fait grand chose...
#include <stdio.h>
#include <string.h>
#define MAX 100
void remplace(char tab[])
{
int i;
for (i= 0;i<MAX;i++)
{if (tab[i]=48)
tab[i] = tab[i]+9;
else
{
if ((tab[i]> 48) && (tab[i]<58))
tab[i]=tab[i]-1;
else
tab[i]=tab[i]+1;
}
}
}
main()
{
char text[MAX];
printf("entrez un texte\n" );
scanf("%[a-z,A-Z,0-9]40c",text);
remplace(text);
printf("\t Texte entre:\t %40c",text);
}
Voilà
Merci encore
Marsh Posté le 07-10-2004 à 22:52:39
Tu as fait le plus dur.
Mais tu es tombée dans un gros piège qui est assez classique en C (et qui normalement génère un warning si je ne m'abuse...).
L'opérateur de comparaison est ==, pas = qui est l'opérateur d'affectation
Code :
|
Le genre de trucs qui fait bien mal aux dents
Pour éviter ça, essaie de toujours inverser les opérandes (c'est à dire 48==tab[i]), comme ça si tu oublie un = le compilateur génère une erreur.
EDIT: je regarde le reste du programme et j'éditerai au fur et à mesure.
Donc :
- en C, toute fonction, y compris main, doit avoir un type de retour explicite. Un prototype standard de main est "int main(void)" (et pas "void main()" comme on peut parfois le voir);
- comme main retourne un entier, il faut un "return 0;" à la fin;
- tu peux utiliser '0' (mais pas 0) au lieu de 48, etc.
- en C, une chaîne de caractère se termine par le caractère nul '\0' (qui est fait le nombre 0)
- une variable auto (comme text) n'est pas initialisée. Son contenu est indéfini (il correspond à ce qu'il y avait éventuellement sur la pile avant l'appel de la fonction). Donc le mieux est de faire :
char text[MAX] = {0};
pour initialiser son contenu à zéro.
Marsh Posté le 07-10-2004 à 22:58:43
Merci beaucoup pour tes conseils printf
Concernant les macros, pourrais tu m'aider?
Marsh Posté le 07-10-2004 à 23:00:38
Emploi & Etudes?
edit : poste dans le forum programmation
Marsh Posté le 07-10-2004 à 23:07:42
i$@ a écrit : |
Euh, je viens de commencer moi aussi le C donc je suis un newbie dans ce domaine, mais à tout hasard ca serait pas plutot :
scanf("%[a-z,A-Z,0-9]40c",&text); ?
Marsh Posté le 07-10-2004 à 23:08:49
Non car text est déjà un pointeur.
(par contre c'est ultra-dégueu de lire des chaînes comme ça avec un scanf).
Marsh Posté le 07-10-2004 à 23:10:45
printf a écrit : Non car text est déjà un pointeur. |
Ok autant pour moi j'aurais mieux fait de rien dire
Marsh Posté le 07-10-2004 à 23:13:12
Code :
|
ça doit aussi pouvoir s'écrire comme ça :
Code :
|
Marsh Posté le 07-10-2004 à 23:18:59
Quand on débute c'est sûr ça peut sembler bizarre mais je trouve que ça file moins mal au crâne*
Une ligne est plus facile à comprendre que 4, même écrite comme ça.
* bon OK c'est peut-être les 60 Hz
Marsh Posté le 08-10-2004 à 08:10:58
printf a écrit :
|
Je préfère LARGEMENT la première version que la seconde entre nous hein...
Marsh Posté le 08-10-2004 à 08:43:15
Oui mais non.
Seul le résultat du test est conditionnel, pas l'opération. Donc cette construction est beaucoup plus appropriée.
Et c'est toujours bon de réduire la taille du code (dans cet exemple, tu gagne 5 lignes), car ça permet de faire tenir une fonction sur l'écran par exemple. Et dans le cas où c'est du code imbriqué, ça évite de rajouter des if et des else à n'en plus finir.
Donc y'a pas photo.
Après, c'est vrai que pour un TP c'est probablement de l'overkill et qu'il y a plus important pour l'instant que le style
Marsh Posté le 08-10-2004 à 11:56:16
printf a écrit : Oui mais non. |
C'est surtout que si tu connais pas lastructure de cet engin ( je l'ai pas rencontré souvent ), ton code, qui fait une opération simple, devient rapidement illisible et inmaintenable.
Je préfère scroller sur 4 lignes que me taper du code de ce type .
Marsh Posté le 08-10-2004 à 12:05:02
i$@ a écrit : Bonjour, |
et on parle du manque de pédagogie de mon école
Marsh Posté le 08-10-2004 à 12:06:01
printf a écrit :
|
la ca devient du snobisme quand même...
Marsh Posté le 08-10-2004 à 12:07:14
Tetedeiench a écrit : C'est surtout que si tu connais pas lastructure de cet engin ( je l'ai pas rencontré souvent ), ton code, qui fait une opération simple, devient rapidement illisible et inmaintenable. |
illisible et inmaintenable ? atta c kan même pas super compliqué comme "structure"
Marsh Posté le 08-10-2004 à 14:08:00
Dion a écrit : la ca devient du snobisme quand même... |
Si l'élégance est du snobisme, alors je dois avouer que je suis snob
Marsh Posté le 08-10-2004 à 14:29:41
+ pour Tetedeiench
pour avoir souvent fait le pompier sur des usines à gaz écrites dans des langages que je ne maîtrisais pas forcement à 100% ... un bon vieux if else est quand même bien plus intuitif et claire
les syntaxes compressives, quelque soit le langage, je conseil toujours d'éviter. Entre la simplicité et se la péter il faut choisir, et un être bon codeur ce n'est pas exploiter la plus minime des bidouilles offerte par le langage
Marsh Posté le 08-10-2004 à 14:35:11
Dion a écrit : illisible et inmaintenable ? atta c kan même pas super compliqué comme "structure" |
L'exemple est simple. Lemec qui te file ca partout sur tes 10 000 lignes de code, laisse tomber.
Marsh Posté le 08-10-2004 à 14:40:30
Le C est un assembleur portable, si vous voulez faire de l'art faites du Java et faites pas chier
Et de toutes façons, il est recommandé par les Prophètes, page 51 et 52 de la Bible, d'utiliser cette construction alors je vous merde
Marsh Posté le 08-10-2004 à 14:42:00
Tetedeiench a écrit : L'exemple est simple. Lemec qui te file ca partout sur tes |
Ben non justement
Dans des if else imbriqués ou dans un printf c'est mieux d'utiliser ce genre de trucs.
Et puis on va pas débattre pendant 40 pages de ça. Je développe comme ça, et l'important c'est que les collègues comprennent...
Marsh Posté le 08-10-2004 à 14:45:05
printf a écrit : Ben non justement |
je plussoie, une fois que tu l'as découverte cette syntaxe est bien plus agréable
d'un autre côté je pense pas que ce soit le meilleur conseil à un étudiant qui débute
Marsh Posté le 08-10-2004 à 15:25:30
printf a écrit : Si l'élégance est du snobisme, alors je dois avouer que je suis snob |
c'est pas une critique, je te rappelle que je dois faire des progs en C a base de fonction qui font moins de 25 lignes de 80 colonnes chacunes
Marsh Posté le 08-10-2004 à 15:26:13
Tetedeiench a écrit : L'exemple est simple. Lemec qui te file ca partout sur tes 10 000 lignes de code, laisse tomber. |
je parle pas non plus d'en imbriquer 4....
(koi ke, deja fait )
Marsh Posté le 08-10-2004 à 16:30:45
Désolé printf mais je dois intervenir : l'opérateur ternaire en plus de sa lisibilité moindre est également moins performant que le if-then-else car il oblige le compilateur à retourner une valeur.
Marsh Posté le 08-10-2004 à 16:54:14
pains-aux-raisins a écrit : Désolé printf mais je dois intervenir : l'opérateur ternaire en plus de sa lisibilité moindre est également moins performant que le if-then-else car il oblige le compilateur à retourner une valeur. |
Ca veut dire quoi qu'il oblige le compilateur à retourner une valeur ?
Marsh Posté le 08-10-2004 à 17:25:48
Prenons un exemple,
i?4:7 pour l'opérateur ternaire.
if i then 4 else 7 pour le if-then-else.
Dans les deux cas, i, 4, et 7 sont des expressions à calculer.
Mais pour l'opérateur ternaire, (i?4:7) est également une expression à calculer contrairement au if i then 4 else 7;
d'où le surcoût.
Marsh Posté le 08-10-2004 à 17:31:04
c'est comme l'histoire du ++i meilleur que i++, enfin, bon je m'égare là
Marsh Posté le 08-10-2004 à 17:31:17
printf a écrit : Ben non justement |
Bah y a matière à débattre vu que tu le balances comme le messie sur ce topic à la base, et à un débutant en plus.
Bref. J'ai horreur des codes illisibles, des gens qui pour faire "lisibles" utilisent des constructions nécessitant un moment d'appréhension...
le if then else, en lecture, il se dit. ton ()?: je suis pas persuadé, t'vois. Alors que peut être que le gars habitué le lira vite. Mais le gars qui, comme moi, utilise pas ces ghorreurs ( et dieu sait queje dois pas être le seul), il préfère 100 fois un if then else que ce vieux truc.
Sincèrement, c'est du snobisme, une volonté, peut etre, de se rendre indispensable en rendant la compréhension de ce type de code difficile à quelqu'un de l'extérieur.
Bref, à éviter totalement. le if est plus verbeux, mais beaucoup plus lisible, et je préfère erdre du temps à scroller ou a taper 20 caractères et rendre mon code lisible ( bon pas jusqu'au niveau du COBOL hein ) plutot que de me la jouer geek qui maitrise et pondre un truc chiant à relire et à débugguer.
Marsh Posté le 08-10-2004 à 17:37:46
vancra, on est hors sujet n'est-ce pas ?
Marsh Posté le 08-10-2004 à 19:41:40
pains-aux-raisins a écrit : Prenons un exemple, |
Ça veut dire quoi que "i ? 4 : 7" est une expression à calculer ? Le "i ? 4 : 7" il va être lu comme ça : si i est vrai alors on évalue 4 et on n'évalue pas 7, sinon on évalue 7 et on n'évalue pas 4. Je ne vois pas où est-ce qu'on "calcule" autre chose que "i" et "4" ou "7". Mais si t'as une référence précise comme un passage de la norme ou sur le comportement des compilateurs pour traduire cette expression en langage machine, ça m'intéresse (pour le dernier cas, ça se teste facilement en regardant le code assembleur produit, mais j'ai pas le courage de le faire ).
PS: comme on est HC, le modérateur pourrait déplacer le sujet vers Programmation.
Marsh Posté le 08-10-2004 à 22:45:22
alerim a écrit : Ça veut dire quoi que "i ? 4 : 7" est une expression à calculer ? Le "i ? 4 : 7" il va être lu comme ça : si i est vrai alors on évalue 4 et on n'évalue pas 7, sinon on évalue 7 et on n'évalue pas 4. Je ne vois pas où est-ce qu'on "calcule" autre chose que "i" et "4" ou "7". Mais si t'as une référence précise comme un passage de la norme ou sur le comportement des compilateurs pour traduire cette expression en langage machine, ça m'intéresse (pour le dernier cas, ça se teste facilement en regardant le code assembleur produit, mais j'ai pas le courage de le faire ). |
Le passage de la norme en question (6.5.15, Conditional operator) indique ceci :
Citation : |
Sinon, j'aimerais un petit morceau de code machine, parce que j'ai comme un très très gros doute vis-à-vis de ce que tu raconte pains-aux-raisins
Pour les courageux, dans gcc/gcc/expr.c, fonction store_expr(), il y a le code qui génère du RTL à partir d'une telle opération.
Notez au passage ô combien les programmeurs de gcc sont des salopiots qui usent et abusent de cette syntaxe maléfique <-- Tetedeiench tu devrais aller leur dire que c'est pas lisible.
Marsh Posté le 09-10-2004 à 00:52:08
printf a écrit : Le passage de la norme en question (6.5.15, Conditional operator) indique ceci :
|
Ca correspond donc à ce que j'ai dit.
Citation : Sinon, j'aimerais un petit morceau de code machine, parce que j'ai comme un très très gros doute vis-à-vis de ce que tu raconte pains-aux-raisins |
Moi aussi j'ai un doute.
$ diff ifelse.s ternaire.s |
avec le code de i$@.
Maintenant, il faut m'exposer un cas où le code assembleur produit n'est pas le même ET où il y a perte de performance dans le cas de l'utilisation de "? :".
Citation : |
Moi je trouve ça très lisible si c'est bien utilisé et bien aéré (comme le reste du code d'ailleur). Et c'est aussi bien pratique.
Marsh Posté le 09-10-2004 à 00:54:27
pains-aux-raisins a écrit : c'est comme l'histoire du ++i meilleur que i++, enfin, bon je m'égare là |
Euh, ca n'a un peu rien à voir, hein
i = 2;
toto[++i] <=> toto[3];
et toto[i++] <=> toto[2] et apres i = 3;
Marsh Posté le 09-10-2004 à 01:15:52
skylight a écrit : Euh, ca n'a un peu rien à voir, hein |
Il devait parler de cas où ça ne fait pas de différence a priori comme dans :
for (i = 0; i < j; ++i) { ... } |
par exemple. En C++ on préfère ++i à i++ si la valeur de i n'est pas utilisée dans l'expression car le jour où "i" est un objet autre qu'un simple entier, on peut avoir une perte de performance non négligeable. Mais sinon, dans le cas de C en particulier, ça ne fait pas différence.
Marsh Posté le 09-10-2004 à 02:23:51
Tetedeiench a écrit : C'est surtout que si tu connais pas lastructure de cet engin ( je l'ai pas rencontré souvent ), ton code, qui fait une opération simple, devient rapidement illisible et inmaintenable. |
Marsh Posté le 09-10-2004 à 09:49:09
tu peux remplacer le bloc
void remplace(char tab[])
{
int i;
for (i= 0;i<MAX;i++)
{if (tab[i]=48)
tab[i] = tab[i]+9;
else
{
if ((tab[i]> 48) && (tab[i]<58))
tab[i]=tab[i]-1;
else
tab[i]=tab[i]+1;
}
}
}
par le bloc :
void remplace(char tab[])
{
int i;
for (i= 0;i<strlen(tab);i++)
{if (tab[i]=='0')
tab[i] = tab[i]+9;
else
{
if ((tab[i]> '0') && (tab[i]<='9'))
tab[i]=tab[i]-1;
else
tab[i]=tab[i]+1;
}
}
}
c'est plus lisible, peu de monde lise couramment la correspondance caractère ascii et valeur décimale
sinon la fonction strlen() permet de connaître la longueur de ta chaîne de caractère, cela t'évite de parcourir entièrement jusqu'à la longueur maximale
Marsh Posté le 09-10-2004 à 15:31:28
alerim a écrit : Il devait parler de cas où ça ne fait pas de différence a priori comme dans :
|
L'assembleur n'est pas (plus) mon truc, mais la literrature informatique peut être intéressante. Dans l'art de la programmation, il y a des chapelles... A savourer !
Best Practices for Programming in C : http://www-106.ibm.com/developerwo [...] nxw02BestC
Morceau choisi :
Citation : |
Plus en rapport avec l'opérateur ternaire :
Optimal C Constructs for 8051 Microprocessors : http://www.embedded.com/story/OEG20021015S0046
Où l'auteur dit :
Citation : |
Conclusion : l'opérateur ternaire est à utiliser en connaissance de cause.
Bon WE
Marsh Posté le 07-10-2004 à 22:12:14
Bonjour,
Je viens de commencer la programmation en C à la fac et je me sens un peu perdue... J'ai eu un exo à faire et je ne m'en sors pas. Pourtant il n'a pas l'air si dur. Donc si quelqu'un pouvait m'aider et me donner des conseils, je lui en serai très reconnaissante.
Voici l'énnoncé:
Ecrire un programme qui :
saisit (en utilisant scanf) un texte, ligne par ligne,
remplace dans la ligne chaque lettre par la lettre qui la suit dans l'alphabet (a suit z).
et chaque chiffre par le chiffre qui le précéde (9 précéde 0).
puis l'affiche (en utilisant printf) en faisant précéder chaque ligne par son numéro suivi de 2 points ( et d'un espace.
On supposera que le nombre maximal des lignes de textes à traiter est de 10, et que le nombre maximal de caractères par ligne est de 80. La fin de ligne est indiquée par \n et la fin de texte par un point (.).
Indication:
Une macro qui permet CHIFFRE(X) qui renvoie vrai si X est un CHIFFRE
Une macro LETTRE_MAJ(X) qui renvoie vrai si X est une lettre majuscule
Une macro LETTRE_MIN(X) qui renvoie vrai si X est une lettre minuscule
Une macro LETTRE(X) qui renvoie vrai si X est une lettre
Une macro SUIVANT(X,INF,SUP) qui donne le suivant de X, si INF<=X<=SUP
Une macro PRECEDENT(X,INF,SUP) qui donne le precedent de X, si INF<=X<=SUP
Une macro LIRE_LIGNE(X) qui lit une ligne (par scanf) et la stocke sous forme de chaine dans X
Merci