Nous sommes actuellement le Dim Déc 29, 2024 9:51 am
Publier un nouveau sujetPublier une réponse Page 1 sur 1   [ 5 messages ]
Auteur Message
 Sujet du message: Question sur une résolution dun calcul en langage C?
MessagePublié: Mar Juin 28, 2011 8:57 pm 

Inscrit le: Lun Avr 04, 2011 1:13 am
Messages: 855
Voici le pb: Jai besoin de trouvé une réponse pour écrire un programme qui calcule a exposant b et donne une réponse la sortie.


Haut
 Profil  
 
 Sujet du message: Question sur une résolution dun calcul en langage C?
MessagePublié: Dim Août 28, 2011 6:17 pm 

Inscrit le: Dim Avr 03, 2011 6:49 am
Messages: 19
Bonjour,

Les méthodes proposées jusqu présent sont bonnes mais il existe beaucoup plus efficace.
On peut effectuer une exponentiation rapide : http://fr.wikipedia.org/wiki/Exponentiation_rapide

Lidée est simple. Il suffit de remarquer que a^b = (a^2)^(b/2)
Voici lalgorithme en C, extrmement simple : http://pastebin.com/a31DuzX8
Sa complexité est O(log(b)) au lieu de O(b). Un gain non négligeable si tu souhaites utiliser des grands nombres (il faudra utiliser autre chose que le type int dans ce cas). Tu peux évidemment écrire cet algorithme de manire itérative.

Concernant la saisie des entrées, je te conseille daller voir ici pour utiliser des bonnes méthodes :
http://users.polytech.unice.fr/~dedale/cours/langages-programmation/c/FAQ_developpez.com/clavier_ecran.html#SCREEN_scanf_fgets

La fonction gets est fortement déconseillée.


Haut
 Profil  
 
 Sujet du message: Question sur une résolution dun calcul en langage C?
MessagePublié: Mar Août 30, 2011 2:53 am 
Avatar de l’utilisateur

Inscrit le: Jeu Mars 24, 2011 10:00 pm
Messages: 11
include

int a, b, r, i;
/* on suppose que les nombres a et b sont entiers */

int lisint()

char chaine[21];
gets(chaine);
return atoi(chaine);


main()


printf("Entrez le nombre a : ");
a = lisint();
printf("Entrez le nombre b : ");
choixr:
b = lisint();
if (b < 0)

printf("Ce nombre doit tre positif !\\nEntrez-le nouveau. ");
goto choixr;


for (r=1, i=1 ; i <= b ; i++) r *= a;
printf("Le résultat est : %d\\n", r);


Haut
 Profil  
 
 Sujet du message: Question sur une résolution dun calcul en langage C?
MessagePublié: Sam Sep 10, 2011 4:30 am 

Inscrit le: Sam Mars 26, 2011 10:59 pm
Messages: 12
@PEB: en parlant de rigueur,

char chaine[11];
gets(chaine);

Si on saisit une chaine un peu longue (>10 caractres...) ==> SPROUTCH !!

Et les multiplications sans précautions... on doit bien pouvoir réussir faire déborder les entiers...


Haut
 Profil  
 
 Sujet du message: Question sur une résolution dun calcul en langage C?
MessagePublié: Dim Sep 11, 2011 9:36 pm 

Inscrit le: Ven Mars 18, 2011 10:49 am
Messages: 4
La réponse dAriane fonctionne, mais je souhaiterais ajouter quelques remarques :
- Les variables globales, cest éviter autant que possible.
- Les goto, encore plus. Les goto cassent compltement la structure du programme.
- Les variables devraient avoir des noms plus parlants
- Un int (sur 32 bits), est compris entre -2 147 483 648 et 2 147 483 647. Donc maximum 10 chiffres. Il est donc inutile de faire un tableau de 21 cases dans ta fonction lisint(). 11 cases (10 + la fin de chaine) suffisent.
- Dans le nom de tes fonctions, commence chaque nouveau mot par une majuscule. a aide la compréhension : lisint() => lisInt()
- La fonction atoi est dépréciée. Il est conseillé dutiliser strtol la place.
- Un main sans type et sans retour ? Cest moche...

Voici donc la faon dont jaurais écrit le programme :

#include

int lisInt()

char chaine[11];
gets(chaine);
return strtol(chaine, NULL, 10);


int main(int argc, char* argv[])

/* Déclaration des variables */
int val, exposant, resultat;
int i:

/* Obtention des valeurs */
printf("Entrez la premire valeur : ");
val = lisInt();
do

printf("Entrez lexposant : ");
exposant = lisInt();
if(exposant < 0) printf("Lexposant doit tre positif ou nul.\\n");

while(exposant < 0);

/* Calcul de la puissance */
for(resultat = 1, i = 0; i < exposant; i++) resultat *= val;

/* Affichage du résultat */
printf("%d puissance %d = %d.", val, exposant, resultat);

/* Fin du programme */
return 0;


Attention, je ne dis pas que code dAriane nest pas bon, bien au contraire. Je dis juste quil manque légrement de rigueur, or celle-ci est indispensable quand on débute en C.

@Jako : En effet, je nai pas blindé la taille de la saisie. De mme, je ne prends pas en compte le fait que lutilisateur peut taper des lettres quand on lui demande un nombre. Je nai pas non plus fait le .h, avec la variable préproc pour éviter la redéfinition... Jai juste repris tel quel le programme dAriane et ai modifié certains points. Mais tu as raison de préciser que mon programme nest pas encore nickel.


Haut
 Profil  
 
Afficher les messages publiés depuis:  Trier par  
Publier un nouveau sujetPublier une réponse Page 1 sur 1   [ 5 messages ]


Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit and 11 invités


Vous ne pouvez pas publier de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas insérer de pièces jointes dans ce forum

Recherche de:
Aller vers:  
cron

Click me:
forum-français
Deutsch Forum
日本語フォーラム
中文论坛
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Style base twilightbb Thanks to Daniel St. Jules of Gamexe.net
MW2 Style by FanFanLaTuFlippe contact: fanfanlatuflippe@live.fr
Traduction réalisée par Maël Soucaze © 2010 phpBB.fr
Forum Romano
Forum Brasileiro
العربي%20المنتدى
Zone 3D
Politique de confidentialité