2012-09-18 4 views
1

Je suis évidemment un débutant en ce qui concerne C# et le programme suivant provient d'un livre de Charles Petzold que je ne comprends pas entièrement. Le paramètre de la méthode GetDouble est une chaîne appelée invite. Nulle part cela n'est déclaré et je pense que c'est ce qui me déconcerte. Je vois que la méthode Main appelle GetDouble et imprime trois chaînes à la console, mais tout cela me semble bizarre. Est-ce typique de la conception de la programmation, ou n'est-ce pas la norme de l'industrie, mais dans le but de montrer comment les choses peuvent être faites? Le livre ne donne pas de réponse de toute façon. Ma nouvelle programmation ne passerait pas une chaîne à la méthode Main. Quelqu'un peut-il m'aider à me redresser?Paramètres de méthode avec gestion des exceptions

using System; 

class InputDoubles 
{ 
    static void Main() 
    { 
     double dbase = GetDouble("Enter the base: "); 
     double exp = GetDouble("enter the exponent: "); 
     Console.WriteLine("{0} to the power of {1} is {2}", dbase, exp, Math.Pow(dbase, exp)); 
    } 

    static double GetDouble(string prompt) 
    { 
     double value = Double.NaN; 
     do 
     { 
      Console.Write(prompt); 
      try 
      { 
       value = Double.Parse(Console.ReadLine()); 
      } 
      catch 
      { 
       Console.WriteLine(); 
       Console.WriteLine("you enter an invalid number!"); 
       Console.WriteLine("please try again"); 
       Console.WriteLine(); 

      } 
     } 

     while (Double.IsNaN(value)); 
     return value; 

    } 
} 
+3

L'invite est un paramètre et doit être fournie lors de l'appel de GetDouble. Et dans votre méthode principale, GetDouble est en effet appelé avec un paramètre de chaîne. Le paramètre chaîne n'est pas déclaré à l'avance, mais dans l'appel de la méthode. Vous pouvez également déclarer une variable de chaîne locale, lui attribuer une valeur, puis transmettre cette variable à GetDouble(). –

+0

ceci est un dans le sens de ce que je connais, et je pense que le programme m'a semblé si drôle en premier lieu. L'invite – wootscootinboogie

+0

est le paramètre de la méthode GetDouble(). "Entrez la base:" etc. sont les arguments de l'invocation de la méthode actuelle. –

Répondre

3

Nulle part cela n'est déclaré et je pense que c'est ce qui me dérange.

Attendez, il a déclaré là - dans l'en-tête de la méthode:

static double GetDouble(string prompt) 
//      ^^^^^^^^^^^^^ This is the declaration of prompt 

prompt est différent des autres variables que vous avez vu en ce qu'elle est pas une variable normale: il est un paramètre formel d'une méthode.

Contrairement aux variables régulières que vous initialize et assignez explicitement avec l'opérateur d'affectation =, paramètres formels sont affectés implicitement en vertu d'appeler une méthode. Lorsque vous appelez la méthode, vous lui transmettez une expression avec le paramètre réel , qui agit comme une affectation de cette expression au paramètre formel. Imaginons que la variable prompt soit affectée "Enter the base: " avant le premier appel, et que "enter the exponent: " lui soit affecté avant le second appel pour comprendre ce qui se passe lorsque vous appelez GetDouble.

+0

c'est le genre de perspicacité que je cherchais. quand vous vous enseignez et que vous voyez plusieurs exemples disparates de la façon de faire la même chose, cela devient un peu flou. J'apprends depuis environ une semaine, donc merci :) – wootscootinboogie

+0

Je le relis et je pense que c'est une excellente explication de ce qui se passe. ++! – wootscootinboogie

1

La méthode GetDouble(string) exactement ce que fait - elle obtient un double de l'entrée.
Le texte qui est demandé à l'utilisateur est un paramètre, car il y a deux valeurs différentes à entrer: d'abord le numéro de base, ensuite l'exposant.
En faisant de l'invite un paramètre, la méthode GetDouble(string) peut gérer tout ce qui suit: inviter l'utilisateur à entrer la valeur. L'alternative serait d'inviter l'utilisateur en dehors de GetDouble(string). Laquelle de ces deux options est préférable est une question de goût. Oh, et comme vous l'avez probablement déjà compris, cela n'a rien à voir avec la gestion des exceptions dans la méthode.

+0

cette partie que je connaissais :), mais je ne voulais pas faire une question inanément nébuleuse et je pensais que l'ajout d'un contexte pourrait accélérer le processus d'aide de la communauté. – wootscootinboogie

0

Vous pouvez le modifier de cette façon. Il fait la même chose mais je pense que plus compréhensible:

static void Main() 
{ 
    string messageForDbaseParam="Enter the base: "; 
    double dbase = GetDouble(messageForDbaseParam); 
    string messageForExpParam ="enter the exponent: "; 
    double exp = GetDouble(messageForExpParam); 
    Console.WriteLine("{0} to the power of {1} is {2}", dbase, exp, Math.Pow(dbase, exp)); 
} 


static double GetDouble(string prompt) 
{ 
    double value = Double.NaN; 
    Boolean incorrectValue=true; 
    while(incorrectValue) 
    { 
     Console.Write(prompt); 
     try 
     { 
      value = Double.Parse(Console.ReadLine()); 
      incorrectValue=false; 
     } 
     catch 
     { 
      Console.WriteLine("error"); 
     } 
    }   
    return value; 

}