CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

exercice langage C

[spartan-be]
[spartan-be]
Niveau 8
28 septembre 2006 à 13:30:08

Bien le bonjour :) .

Je suis un noob total en programmation, je viens de suivre mon 1er cours et je dois écrire un petit programme basique en langage C.
Voici l´énnoncé et ma réponse. J´aimerais bien que quelqu´un y jette un coup d´oeil et me dise si je suis dans le bon ou si je m´égare!

Exercice; L´instruction scanf("%f",&x); permet de saisir un nombre flottant dans une variable (ici, la variable x). Ecrire un programme qui demande le rayon d´un cercle et calcule et affiche sa circonférence et son aire.

Ma réponse:

  1. include <stdio.h>

int main()
{
float c;
float a;
c = 2*3.14.r;
a = 3.14*r²;
scanf("%f",&r);
printf("c=%f,a=%f\n",c,a);
}

Je pense que c´est incorrect car je n´arrive pas à le compiler. Si quelqu´un pouvait me corriger, ça me ferait plaisir. Merci d´avance. :ok:

Pseudo supprimé
Pseudo supprimé 28 septembre 2006 à 13:51:58
  1. include <stdio.h>

/* Oui, je sais que Pi est déjà dans math.h, mais je ne vais pas l´embrouiller le pauvre */

  1. define PI 3.14

/*Autant faire un beau main */
int main(int argc, char **argv) {
/* C´est bien gentil, mais il faut le déclarer, r */
float r;
/* L´opérateur ² n´existe pas en C */
scanf("%f",&r);

printf("Circonférence=%f\nAire=%f\n",2*PI*r,PI*r*r
);
/* Tu as déclaré que main retournait un entier */
/* On pourrait mettre un return 0 */
/* Mais plus spécifiquement, pour main on utilise l´instruction suivante */
/* Je te passe les détails */
exit(0);
}

DantePC
DantePC
Niveau 10
28 septembre 2006 à 15:29:28

Salut. Il y a un petit point où je ne suis pas d´accord avec toi hitman :

/*Autant faire un beau main */
int main(int argc, char **argv) {

Pourquoi ? On utilise par argc et argv, autant donc ne pas les mettre. Personnellement voici ce que j´aurai fait :

  1. include <stdio.h>
  2. define PI 3.14

int main(void)
{
float r;
printf("Quel est le rayon du cercle: ");
fflush(stdout);
printf("Sa circonference est donc %f et son aire %f\n", 2 * PI * r, PI * r * r);
return 0;
}

Sinon, je pense que scanf est une fonction vicieuse car il faut bien la connaître pour bien l´utiliser. Elle a l´air très simple mais au contraire, est très compliquée d´utilisation. Néanmoins, tu l´utilises au début puis normalement par la suite, tu vérifies le retour de scanf et tu agis en conséquence :
- Soit la saisie est bonne et on agit normalement
- Soit elle est mauvaise et on "purge" le buffer.
Pour plus d´information sur scanf voir développez.com, article Scanf démythifiée.

Une autre alternative à l´utilisation de scanf est l´emploi de fgets + fonctions de conversions stro*

Bonne continuation :ok:

DantePC
DantePC
Niveau 10
28 septembre 2006 à 15:31:28

Arf j´ai justement omis le scanf. Code corrigé :

  1. include <stdio.h>
  2. define PI 3.14

int main(void)
{
float r;
printf("Quel est le rayon du cercle: ");
fflush(stdout);
scanf("%f",&r);
printf("Sa circonference est donc %f et son aire %f\n", 2 * PI * r, PI * r * r);
return 0;
}

[spartan-be]
[spartan-be]
Niveau 8
28 septembre 2006 à 17:29:19

Merci beaucoup :ok:

Fvirtman
Fvirtman
Niveau 10
28 septembre 2006 à 17:57:01

"je n´arrive pas à le compiler"
--> Ne jamais dire cela sans nous préciser ce qu´il dit (pour la 1ere erreur), et sur quelle ligne :)

En effet, la ou il devait gueuler, c´était sur le "²"

godrik
godrik
Niveau 30
28 septembre 2006 à 18:33:49

Je voudrais ajouter quelquechose, tu as fais:
float c;
float a;
c = 2*3.14.r;
a = 3.14*r²;
scanf("%f",&r);

Plusieurs chose n´allait pas.
Dans un premier temps la variable r n´était pas déclarée.
Mais en plus l´ordre des opération est important! La variable r n´a pas de valeur (en fait une valeure imprévisible) tant que tu ne lui en a pas donné.
la valeure de la variable c apres ´c = 2*3.14.r;´ n´est donc pas prévisible non plus.

[spartan-be]
[spartan-be]
Niveau 8
28 septembre 2006 à 19:36:28

Voilà, suite à vos remarques et conseils, j´ai réussi a compiler ce programme qui fonctionne parfaitement maintenant. C´est ultra-basique, j´ai sûrement fait des choses bizarres ou inutiles mais ça fonctionne, c´est le principal pour moi dans un premier temps. :p)

Voici ce que j´ai fais:

  1. include <stdio.h>

int main()
{
float r;
scanf("%f",&r);
float c;
c = 2*3.14*r;
float a;
a = 3.14*r*r;
printf("c=%f,a=%f\n",2*3.14*r,3.14*r*r);
}

Si vous avez des remarques, n´hésitez pas!

Pseudo supprimé
Pseudo supprimé 28 septembre 2006 à 19:53:50

Oui, tu utilises une constante : si tu utilises Pi 100 000 000 de fois dans ton programme et que tu décides de changer sa précision, tu vas devoir changer toutes ses apparitions.
Tu peux soit définir une constante (Voir faire appel à celle de math.h), soit déclarer une variable. Cependant la constante sera plus efficace car le nombre est stoqué en dur à la compilation (Mais pour ça aussi je te passe les détails). Sinon, il est bon d´afficher un texte avant la saisie et tu déclares deux variables qui ne servent à rien puisque tu peux effectuer ces calculs directement dans le printf.
Tu peux aussi écrire deux fonctions (Mais bon, c´est bourin est gourmand pour un truc aussi simple qu´une directive préprocesseur fait aussi bien et ne consomme pas des sauts à l´exécution si ne place sur la pile, ..., mais une fois de plus, je te passe les détails).

DantePC
DantePC
Niveau 10
28 septembre 2006 à 20:04:27

J´ajouterai qu´en C89, les variables doivent être déclarées en début de bloc :ok:

dnob700
dnob700
Niveau 10
30 septembre 2006 à 22:05:49

hitman : ces variables servent peut-être "à rien", mais ne nuisent pas au programme (en fait, le code généré par le compilo sera probablement exactement le même avec ou sans variables, à l´ordre des instruction près).

par contre ça améliore la lisibilité de faire le calcul hors du printf, donc c´est plus sympa.

Pseudo supprimé
Pseudo supprimé 30 septembre 2006 à 22:22:42

Je trouve que ça encombre ! Autant faire une fonction dans ce cas, ou utiliser le préprocesseur.
Oui au code clair, non au code inutile.

[LoCkLeSs]
[LoCkLeSs]
Niveau 10
30 septembre 2006 à 22:57:58

Perso, avoir une expression de 3km dans un printf, je trouve que c´est bof bof niveau clarté.

Pseudo supprimé
Pseudo supprimé 01 octobre 2006 à 00:48:13

De toutes façons c´est de la sodomie de drosophiles : à ce niveau ce n´est pas la peine de se prendre la tête avec de tels détails sinon on pourrait aussi lui dire d´utiliser write plutôt que printf car le dernier n´est pas performant, etc.

Miles__Teg
Miles__Teg
Niveau 2
02 octobre 2006 à 22:52:09

Ya pas à dire, on repère le pro dans la bande. N´est-ce pas hitman :-)))

Vous aurez beau retourner l´affaire comme vous voulez, hitman a l´air de savoir ce qu´il raconte.

Scuzez moi, mais les expressions de 3km directement dans les fonctions c´est typique du C. Pour n´importe que programmeur C non débutant le code de hitman est très clair.

:bye:

dnob700
dnob700
Niveau 10
02 octobre 2006 à 23:22:56

absolument pas : un code avec des lignes courtes est plus clair quel que soit ton niveau de programmation.

Et ça n´a rien a voir avec de la "sodomie de drosophile" car leproblème est tout autre que celui de printf/write qui change le code.

Là, il s´agit uniquement de modifier la présentation d´un programme qui reste strictement le même.

godrik
godrik
Niveau 30
02 octobre 2006 à 23:44:58

cela permet egealement durant les phases de débuggage de ne pas avoir une constante en dure dans le code, ou encore d´avoir une vérification de type a la compilation.

En terme d´execution en -O2 on est bien d´accord que c´est pareil, mais mettre une variable a valeure constante n´a que des avantages par rapport a une macro du préprocesseur.

Miles__Teg
Miles__Teg
Niveau 2
02 octobre 2006 à 23:58:14

On est bien d´accord, un code avec des lignes courtes est + clair.

Mais enfin, on peut pas dire que le code de hitman est illisible.

Je peux vous assurer que quand vous pondez des milliers de ligne de code vous ne vous amusez pas à déclarer des variables juste pour le plaisir.

Et si vraiment on veut être clair, on met des commentaires !! !

Maintenant je dois admettre que quand on tombe sur un bug qui résiste, on fini par repasser par des variables qui pourront être "printfées" ou inspectée via un debugueur.

:bye:

godrik
godrik
Niveau 30
03 octobre 2006 à 00:12:57

"Je peux vous assurer que quand vous pondez des milliers de ligne de code vous ne vous amusez pas à déclarer des variables juste pour le plaisir."

Et pourquoi pas si ca rend le code plus clair.
De toute facon, si l´on "remplace" une variable par une autre, le compilatuer le verra bien et les fusionnera dnas le meme registre.

Il faut ecrire le code de la facon la plus clair possible. Tant que les algorthmes sous jacent ne changent pas, tant que l´on ne fait que des difference de nommage de variable ou ce genre de chose, on n´impacte pas le code binaire (ou tres faiblement)

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment