2017-03-17 1 views
-4

Code Fonction: C'est une calculatrice russe de multiplication paysanne.
code:Le code ne sort pas, mais il est en cours d'exécution. [c]

#include <stdio.h> 
#include <math.h> 

main(){ 
    int ier, product = 0, check, i = 1; //var to store numbers 
    float cand; //Var to store decimal numbers 

    while(i != 0){ 
    printf("\nInput only whole numbers!"); //Ask user for number to be multiplied 
    printf("\nMultiplier: "); 
    scanf("%d", &ier); 
    printf("Multiplicand: "); 
    scanf("%d", &cand); 

    while(i != 0){ 
     if((ier == 0 && cand > 0) || (ier > 0 && cand == 0) || (ier == 0 && cand < 0) || (ier < 0 && cand == 0)){//Regulations for the code 
     printf("Product: 0"); 
     printf("\n\nInput only whole numbers!"); 
     printf("\nMultiplier: "); 
     scanf("%d", &ier); 
     printf("Multiplicand: "); 
     scanf("%d", &cand); 
     } 
     if((ier > 0 && cand > 0) || (ier < 0 && cand > 0) || (ier > 0 && cand < 0) || (ier < 0 && cand < 0)){ 
     break; 
     } 
     if(ier == 0 && cand == 0){//If user inputs 0 and 0, end code 
     return 0; 
     } 
    } 

    while(i != 0){ 
     if((ier < 0 && cand > 0) || (ier > 0 && cand < 0) || (ier < 0 && cand < 0)){//Regulations for the code 
     printf("Values must not be negative"); 
     printf("\n\nInput only whole numbers!"); 
     printf("\nMultiplier: "); 
     scanf("%d", &ier); 
     printf("Multiplicand: "); 
     scanf("%d", &cand); 
     } 
     if((ier > 0 && cand > 0) || (ier == 0 && cand > 0) || (ier > 0 && cand == 0) || (ier == 0 && cand < 0) || (ier < 0 && cand == 0)){ 
     break; 
     } 
     if(ier == 0 && cand == 0){//If user inputs 0 and 0, end code 
     return 0; 
     } 
    } 

    if(ier > 0 && cand > 0){ 
     printf("Calculating Product:");//It should print this, but it isn't for some reason. 
     while(i != 0){ 
     if(fmod(cand, 2) != 0){ 
      if(fmod(cand, 1) != 0){ 
      product = product + floor(cand); 
      cand = floor(cand); 
      printf("%d \t%f", ier, cand); 
      } 
      else{ 
      product = product + cand; 
      printf("%d \t%f", ier, cand); 
      } 
     } 
     if(cand == 1){ 
      printf("Product: %d", product); 
      break; 
     } 
     ier *= 2; 
     cand /= 2; 
     } 
    } 
    } 
} 

Problème: Quand je lance le code et je entrée 5 et 2 par exemple, il continue à fonctionner sans sortir quoi que ce soit. Je pense que le problème dans le code est le fmod(). J'utilise seulement fmod parce que vous ne pouvez pas utiliser l'opérateur de module % sur des variables flottantes.
Chose que j'ai fait: J'ai changé le fmod à l'opérateur de module % et fait cand dans un nombre entier. Cela a fonctionné, mais maintenant j'ai un problème avec la décimale puisque les entiers arrondissent le nombre décimal. Je suis donc retourné à fmod.
Entrée:

gcc version 4.6.3 
Input only whole numbers! 
Multiplier: 5 
Multiplicand: 2 
/*Runtime: infinite*/ 

sortie Je veux

Multiplier: 57 
Multiplicand: 86 
Calculating product: 
114 43 
228 21  
912 5  
3648 1 
Product: 4902 
Multiplier: 48 
Multiplicand: -36 
Values must not be negative 
Multiplier: 27 
Multiplicand: 0 
Product: 0 
Multiplier: 0 
Multiplicand: 0 

P.S: Il est ma première fois en utilisant fmod et floor().

+0

Les commentaires ne sont pas pour une discussion prolongée; cette conversation a été [déplacée pour discuter] (http://chat.stackoverflow.com/rooms/138405/discussion-on-question-by-manav-dubey-streetsville-ss-the-code-isnt-outputti). –

Répondre

1

Après avoir lu votre code, j'ai constaté que vous avez utilisé la fonction scanf de manière incorrecte. Dans votre code après la première boucle while, vous avez fait ce qui suit:

while(i != 0){ 
    printf("\nInput only whole numbers!"); //Ask user for number to be multiplied 
    printf("\nMultiplier: "); 
    scanf("%d", &ier); 
    printf("Multiplicand: "); 
    scanf("%d", &cand); 

Si vous regardez le scanf ci-dessus cette phrase, vous pouvez voir que vous avez fait (Comme @MartinR souligné):

scanf("%d", &cand); 

Vous devez modifier le code suivant:

scanf("%f", &cand); 

Cela va corriger votre exécution infinie. En outre, @ABusyProgrammer peut avoir écrit la réponse en premier (ce qui est correct), il/elle n'a pas lu le message correctement. Vous utilisez le fmod qui nécessite un flotteur. Par conséquent, vous devez utiliser le scanf que j'ai écrit [email protected] ne serait correct que si vous utilisez l'opérateur %.

+0

Aussi, regardez votre code, ce sera une bonne habitude. –

1

La raison pour laquelle votre code va dans une boucle infinie est pas à cause de la fonction fmod(), mais plutôt parce que vous avez initialisé cand comme valeur float, et non comme une valeur int. Changement cand à une valeur int permet au code de continuer à travailler pour imprimer le résultat:

Ainsi, le changement:

float cand; 

Pour:

int cand; 

Cela évite au moins le code de la pendaison , et, tout comme @WeatherVane pointé, il corrige également un avertissement que votre compilateur devrait produire pour la ligne suivante:

scanf("%d", &cand); // "cand" is a float, but your format specifier says that it is an int. 
+0

Qui traitera également des avertissements du compilateur à propos de 'scanf ("% d ", &cand);' où 'cand' était un' float' –

+0

@WeatherVane Vraiment, je n'ai pas remarqué cela. qui causait ce coup était assez dur.Je mettrai à jour mon poste.Merci pour ce point! –

+0

@ABusyProgrammer, lisez le poste correctement.L'utilisateur utilise le 'fmod', là, il nécessite un flotteur –