Auteur |
Message |
JHansel
|
|
Sujet du message: Question sur une résolution dun calcul en langage C? Publié: 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 |
|
|
jnefis
|
|
Sujet du message: Question sur une résolution dun calcul en langage C? Publié: 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 |
|
|
SDanvers
|
|
Sujet du message: Question sur une résolution dun calcul en langage C? Publié: Mar Août 30, 2011 2:53 am |
|
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 |
|
|
RaphaëlE
|
|
Sujet du message: Question sur une résolution dun calcul en langage C? Publié: 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 |
|
|
RLaroche
|
|
Sujet du message: Question sur une résolution dun calcul en langage C? Publié: 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 |
|
|