Salut les amis!En fait je voudrais écrire un programme qui transmet toute chaîne de caractères en majuscules mais j'ai un problème car je ne sais comment y procéder.Merci
Version imprimable
Salut les amis!En fait je voudrais écrire un programme qui transmet toute chaîne de caractères en majuscules mais j'ai un problème car je ne sais comment y procéder.Merci
Bonjour
Pas de souci: tu boucles sur chaque caractère de la chaine. Et si ce caractère est compris entre 'a' et 'z' alors, puisqu'un caractère est en réalité la valeur numérique correspondant à sa valeur ascii, et que les calculs mathématiques sont possibles dessus, te suffit de lui enlever 'a' et lui rajouter 'A' pour avoir son équivalent majuscule.
Ex: char carac='f' - 'a' + 'A'; printf("%c", carac); // En final carac contient "F".
Plus de détails ici.
Hello,
Je ne me serais même pas fatigué à faire des tests ;) : toupper() fait le job sans que le programmeur ait à se poser des questions.
Ouais mais je suis parti de l'idée qu'il s'agissait d'un exercice d'apprentissage. Et dans ce cas, le prof préfère justement les tests et les opérations...
Pas forcément, au contraire, utiliser le bon outil est la meilleure des leçons qu'on devrait recevoir.
A vrai dire, la seule chose qui me semble importante, c'est qu'un futur collègue sache quand utiliser l'un ou l'autre, ou à défaut ne réinvente pas la roue.
Personne n'aime avoir à débugger une roue réinventée par un collègue.
Un bon cours présenterait les deux, d'abord l'appel de toupper, qui est la méthode générale, puis ouvrirai le capot.
La bonne réponse dépend de l'exercice précis, et du moment dans le cours.
Je suis d'accord avec cette dernière partie de phrase. C'est effectivement elle qui décide quand détailler la transformation ou quand passer par une fonction toute faite. Tout ce que je peux dire, c'est que mon sentiment, forgé par 7 années d'enseignement du C, m'incite à penser que le PO en est au tout début de l'apprentissage et qu'on lui apprend ce qu'il y a sous le capot en lui demandant de s'entrainer à manipuler le bouzin. Parce que si ça avait été moi son prof, et que j'en sois à ce moment que je décris, c'est typiquement un exo que j'aurais donné à faire en interdisant bien entendu tout appel aux fonctions déjà toutes faites. Mais bien sûr une fois l'exo fini, j'aurais alors basculé du côté inverse en donnant la fonction et en donnant aussi la directive de l'utiliser.
Toujours la même histoire de l'apprentissage humain: on ne peut apprendre un niveau "n+1" qu'en apprenant d'abord le niveau "n" (même si les lois et valeurs de ce niveau "n" sont incomplète ou fausses parce que trop grossières) puis en le désapprenant ensuite une fois que le cerveau a compris le concept. C'est tout aussi bien vrai pour l'enfant à qui on montre le Soleil tourner autour de la Terre et qui apprendra bien plus tard que c'est en fait la Terre qui tourne sur elle même, que pour le cosmologue supérieur qui commence par travailler sur les équations de Newton pour ensuite découvrir qu'elles sont fausses au voisinage des grosses masses et qu'il doit alors les oublier pour passer à celles d'Einstein.
Salut,A vrai dire, mon sentiment (bien que je ne sois pas prof, et encore moins prof de C) est que le gros problème vient qu'on tend trop souvent à cumuler deux cours en un, car, quel que soit le (premier) langage envisagé, on essaye de faire tenir dans le cours:
- un cours d'algorithmie qui forme l'esprit à concevoir la logique qu'il s'agira d'expliquer au processeur d'une part et
- un cours sur le langage lui-même, dont le but est d'apprendre à l'élève comment exprimer cette logique dans un langage donné.
Je connais toutes les objections qui peuvent être faites à une proposition qui consisterait à séparer clairement ces deux cours. Elles vont de "pas assez de temps/ de profs pour le faire" à "c'est pas motivant pour l'élève de ne pas pouvoir voir le résultat au travers d'un programme qui fonctionne", en passant par d'autres objections plus ou moins farfelues.
Mais, pour avoir moi-même eu l'occasion d'expérimenter cette séparation lors de mon apprentissage, je peux dire que la deuxième objection (celle qui a trait à la motivation de l'élève) peut s'avérer totalement fausse et que la méthode permet vraiment de clarifier les choses pour l'élève.
De plus, on ne se poserait dés lors plus l'éternelle question de savoir s'il faut aller "voir sous le capot" ou non: le cours d'algorithmie nous demanderait decoderdévelopper la logique d'une fonction proche de toupper, et le cours de langage que la fonction en question existe déjà dans la bibliothèque standard du langage ;)
Avouez que l'on aurait sans doute tout à y gagner, non :question:
Totalement d'accord , surtout que les cours actuel tend plus a apprendre un langage que l'algorithmie , ce qui est stupide parce que la programmation c'est facile 80% d'algo pour ma part , même en assembleur quand on a compris les rouages du CPU et de la machine cible , ben le reste du boulot c'est de l'algo :p
Je rajouterai que la plupart des débutants les soucis qu'ils ont sont plus d'ordre de l'algo que du langage lui même , un exemple assez concret si on regarde les question sur la lib SDL , la plupart des question se porte plus sur l'algo (comment obtenir un résultat) que la lib en elle même (comment faire ceci).
Et pour mon expérience personnelle , je considère que ma capacité a réussir a faire des algo correct est grâce a mes connaissances personnel qui est le syllogisme et le formalisme , si on arrive clairement dans sa langue maternelle de formaliser ces propos , c'est la moitié de l'algo deja fait :)
Pour cela que je trouve cela 'stupide' de vouloir enseigner des maths haut niveau en disant "ça permet de donner une logique a l’élève" , sachant que même si les maths sont logique , elle n’entraîne pas forcément son pratiquant a être formelle sur les langues , de plus a un certain niveau (enfin je que j'ai pu remarquer a la FAC) la plupart (enfin quasiment tout le monde) apprend les formules et les résolutions par cœur et donc être bon en math revient a avoir une bonne mémoires...
A vrai dire, je vais même beaucoup plus loin que cela :P
Pour moi, tout langage informatique n'est qu'un ensemble de conventions qui nous permettent d'expliquer ce que l'on veut à quelque chose d'aussi bête qu'un ordinateur.
Si bien que, dés que nous disposons d'une représentation correcte de la logique à appliquer, il suffit que "quelqu'un ou quelque chose" (pourquoi pas un singe ou carrément un ordinateur) soit en mesure d'appliquer les conventions en question pour rédiger le code.
Pour moi, l'écriture du code se résume le plus souvent à un "long et fastidieux travail de dactylographie" (même si j'adore cette étape) ;)
Le gros problème de ce réinventage de roue, c'est qu'il pond une roue carrée, qui marche en ASCII pur et peut-être dans certains ASCIIs étendus mais est totalement inappropriée pour le cas général.
La fonction toupper(), elle, marche pour tous les encodages mono-octet, et towupper() couvre le reste (encore que, je me demande comment elle réagit hors du BMP sur des plate-formes WTF-16... Edit: apparemment, elle réagit mal).
C'est bel et bien pour cela qu'il me semble important de séparer la partie algorithmie de la partie langage.
Car, quel que soit l'encodage, une logique qui serait proche dedevrait, a priori du moins, fonctionner. A moins (sait-on jamais) qu'il n'existe des encodages dans lesquels les différentes lettre de l'alphabet ne se suivent purement et simplement pas :question: (et, oui, je la pose réellement).Code:
1
2
3
4
5 pour chaque caractère dans la chaine de caractères temp = caractère - 'a' (minuscule) temp = caractère + 'A' (majuscule) remplacer le caractère original par temp fin pour
Cela me paraitrait pour le moins illogique, et je pense donc que c'est très improbable ;)
Ce serait plutôt :
A part ça, si on regarde la table des caractères Unicode, l'offset pour passer d'une lettre minuscule à la lettre majuscule correspondante dépend des plages :Code:
1
2
3
4
5
6
7 Pour chaque caractère dans la chaine de caractères Si le caractère est une lettre minuscule temp <- caractère - 'a' (minuscule) temp <- temp + 'A' (majuscule) Remplacer le caractère original par temp. FinSi FinPour
- Pour le latin de base et le latin-1, l'offset est -32.
- Pour le latin étendu A, l'offset est -1.
- Pour le latin étendu B, c'est plus compliqué. Par exemple, parfois, on a des trios (capitale, majuscule, minuscule) comme (NJ, Nj, nj).
Oui mais la finalité de ce réinventage de roue (toujours si on se place dans le cadre de l'apprentissage du langage et/ou de l'algorithmique comme l'a bien fait remarquer koala01) n'est pas d'inventer une roue destinée à être utilisée (enfin pas au delà de 15 minutes); mais d'inventer une roue pour apprendre à manipuler les outils de base de conception de roues (ici pointeurs, manipulation de caractères, boucle, condition, fonction, etc.). Il faut bien que les profs trouvent des idées de TP aussi. Déjà que ce n'est pas facile de trouver des trucs un tant soi peu intéressant (et adapté au débutant), si en plus ils doivent trouver des idées de trucs faisables mais n'ayant pas encore été faits... Oserais-tu dire que toi, quand tu débutais, tu n'as jamais écrit un clone de "toupper" ou "tolower" ou "strcpy" ou "strlen" ou strchr" ou toute autre fonction analogue de la librairie standard ? Je sais, dans ce TP (toujours bien entendu si on est dans un TP pour débutant) que cette fonction une fois créee ne sera jamais utilisée parce que son homologue officiel existe déjà et est bien plus performante. Mais sa création (d'elle ou d'une autre analogue parmis celles déjà citées) reste nécessaire. C'est pareil en maths quand on fait redémontrer Pythagore aux élèves du secondaire. Ce n'est certainement pas pour enrichir le monde mathématique qu'on leur fait faire ce travail...
En fait, ton algo fonctionne toujours dans ce cas là. Parce qu'il ne s'appuie pas sur l'ordonnancement des lettres de l'alphabet mais sur l'écart (sensé être toujours le même) entre une minuscule et sa majuscule.8-)
Il faut quand-même essayer de faire confiance à la façon dont sont construits certains fondements de l'informatique... Construire un encodage où l'écart entre 'a' et 'A' diffère de celui qu'il y aurait entre 'b' et 'B' n'apporterait aucun avantage (enfin à priori je n'en vois pas des masses 8O ) et ferait ch... pas mal de monde :lol: