Bonjour,
pourriez-vous écrire un code en C qui lit un nombre depuis le clavier et affiche à l’écran le carré de ce dernier, sans utiliser le point-virgule ?
Merci d'avance pour vos participations.
Bonjour,
pourriez-vous écrire un code en C qui lit un nombre depuis le clavier et affiche à l’écran le carré de ce dernier, sans utiliser le point-virgule ?
Merci d'avance pour vos participations.
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie.
Valable a priori aussi pour zéro et les nombres négatifs
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 int main(void) { for(int i=0;i<1;i=i+2){ if(printf("Entrez un nombre\n")){} if(scanf("%d",&i)){} if(i=i*i){} if(printf("Le carre vaut %d\n",i)){} } }
C'est bien mais vous avez utilisé quand même le point-virgule dans la boucle for en plus, le code doit être capable de calculer le carré de n'importe quel nombre, même si c'est un réel.
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie.
Sans vérification d'erreur, je verrais un truc du genre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #include <math.h> #define BIG_ENOUGH_FOR_DOUBLE 80 int main(void) { if(printf("Entrer nombre:\n") && printf("Le carre vaut %f\n", pow( strtod(fgets(malloc(BIG_ENOUGH_FOR_DOUBLE), BIG_ENOUGH_FOR_DOUBLE, stdin), NULL), 2.0 ))) { } }
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
C'est presque la solution mais il y a des petites erreurs au niveau du calcul du carré :
gcc code.c -o test
./test
Entrer nombre :
4
Le carre vaut 0.000000
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie.
Je ne reproduis pas le problème sous Visual C++ 2010.
Entrer nombre:
4
Le carre vaut 16.000000
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
peut être c'est à cause du malloc.
ma solution est la suivante :
en attendant d'autres solutions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #include <stdio.h> main(int x) { if (printf("x = "), scanf("%d", &x), printf("carré de x = %d", x * x)) { } }
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie.
Ah en effet, j'ai oublié les headers et sans, ça ne compile pas sous Code::Blocks.
Je les ai rajoutés, et ça marche sans bug.
La version finale est donc:
Et ça supporte les flottants.
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 #include <math.h> #include <stdlib.h> #include <stdio.h> #define BIG_ENOUGH_FOR_DOUBLE 80 int main(void) { if(printf("Entrer nombre:\n") && printf("Le carre vaut %f\n", pow( strtod(fgets(malloc(BIG_ENOUGH_FOR_DOUBLE), BIG_ENOUGH_FOR_DOUBLE, stdin), NULL), 2.0 ))) { } }
Euh non, il me semble que la norme dit toujours que int main(void) { /*pas de return*/ } est supporté...Mais, bon rien qu’avec la gueule de main le compilateur a carte blanche pour faire n’importe quoi.
Le seul problème ici est le comportement indéfini en cas d'échec de malloc() ou d'EOF sur le fgets().
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Ah oui, je n'avais pas fait attention aux points virgule dans la boucle for!
Voici alors un truc un peu mieux.
J'avoue que les autres solutions apportées sont plus courtes!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 int _tmain(int argc, _TCHAR* argv[]) { if(float i=1){ if(printf("Entrez un nombre\n")){} if(scanf("%f",&i)){} if(printf("Le carre vaut %f\n",i*i)){} } }
Ta solution ne respecte pas la norme C, qui precise que le prototype de main a soit 0 soit 2 arguments :
5.1.2.2.1 Program startup
1 The function called at program startup is named main. The implementation declares no
prototype for this function. It shall be defined with a return type of int and with no
parameters:
int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names may be
used, as they are local to the function in which they are declared):
int main(int argc, char *argv[]) { /* ... */ }
or equivalent(9) or in some other implementation-defined manner.
Vous avez raison, mais de la même façon on peut utiliser la variable argc de main :
c'est vrai que j'ai violé un peu les règles du standard mais c'est pas gênant quand même.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #include <stdio.h> main(int argc, char* argv[]) { if (printf("x = "), scanf("%d", &argc), printf("carré de x = %d", argc * argc)) { } }
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie.
Dans tous les cas, ça ne remplit pas le critère de marcher avec les nombres à virgule flottante.
@snack3r: Mon code final foire-t-il toujours sur ta plate-forme?
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Oui, ton code répond parfaitement à la question, l'idée aussi est excellente
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie.
As-tu testé le code ? a-t-il donné lieu à un résultat "imprédictible" quelconque ?Si ça ne te dérange pas d’avoir un code au comportement totalement imprédictible, non ce n’est pas gênant…
Sachant que le dernier code respecte bien le standard !
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie.
Pas besoin. Le lire est suffisant.
Le problème d’un comportement imprédictible c’est que tout peut arriver? Y compris une exécution correcte. Donc l’exécuter ne va rien m’apporter de plus.
Ce n’est pas parce que le compilateur est dans son bon jour et décide de générer un code qui correspond à tes attentes qu’il n’est pas autorisé à faire absolument tout ce qu’il veut (ça va de faire un code qui semble fonctionner jusqu’à te faire sortir des démons du pif, en passant par générer un code qui affiche 42).
Ton dernier code ?
Non.
Ça ne respecte pas le C89 car tu n’as pas de return (pas de return implicite pour le main avant C99, il manque aussi le type de retour mais on va dire que la règle de l’implicit int s’applique)
Ça ne respecte pas plus le C99 ou le C11 car il manque le type de retour du main (la règle du implicit int ayant été supprimé depuis C99)
Un simple "int" résout bien le problème du standard, non ?Ça ne respecte pas le C89 car tu n’as pas de return (pas de return implicite pour le main avant C99, il manque aussi le type de retour mais on va dire que la règle de l’implicit int s’applique)
Ça ne respecte pas plus le C99 ou le C11 car il manque le type de retour du main (la règle du implicit int ayant été supprimé depuis C99)
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager