Using if Statements to Make Decisions


Using if Statements to Make Decisions

You use an if statement when you want to choose between executing two different blocks of code depending on the result of a Boolean expression.

Understanding if Statement Syntax

The syntax of an if statement is as follows (if and else are keywords):

if ( booleanExpression )      statement-1;  else      statement-2;

If booleanExpression evaluates to true, then statement-1 runs; otherwise booleanExpression is false, and statement-2 runs. The else keyword and the following statement-2 are optional. If there is no else clause, nothing happens when the booleanExpression is false.

For example, here's an if statement that increments the seconds hand of a stopwatch (minutes are ignored for now). If the value of the seconds variable is 59, it is reset to 0, otherwise it is incremented using the ++ operator:

int seconds;  ...  if (seconds == 59)      seconds = 0;  else      seconds++;

Boolean Expressions Only Please!

The expression in an if statement must be enclosed in parentheses. Additionally, the expression must be a Boolean expression. In some other languages (notably C and C++), you can write an integer expression, and the compiler will silently convert the integer value to true (nonzero) or false (zero). C# does not support this behavior, and the compiler reports an error if you write such an expression.

If you accidentally write an assignment instead of an equality test in an if statement, the C# compiler recognizes your mistake. For example:

int seconds;  ...  if (seconds = 59)  // compile-time error  ...  if (seconds == 59) // ok

Accidental assignments were another common source of bugs in C and C++ programs, which would silently convert the value assigned (59) into a Boolean expression (anything non-zero was considered to be true), with the result that the code following the if statement would be performed every time.

Finally, you can use a Boolean variable as the expression, as in this example:

bool inWord;  ...  if (inWord == true) // ok, but not commonly used  ...  if (inWord)         // better

Using Blocks to Group Statements

Sometimes you'll want to run two or more statements when a Boolean expression is true. You could group the statements inside a new method and then call the new method, but a simpler solution is to group the statements inside a block. A block is simply a sequence of statements grouped between an opening and a closing curly brace. In the following example, two statements that reset the seconds variable to zero and increment the minutes variable are grouped inside a block, and the whole block executes if the value of seconds is equal to 59:

int seconds = 0;  int minutes = 0;  ...  if (seconds == 59)  {      seconds = 0;      minutes++;  }  else      seconds++;

IMPORTANT
If you omit the curly braces, the C# compiler associates only the first statement (seconds = 0) with the if statement. The subsequent statement (minutes++) will not be recognized by the compiler as part of the if statement when the program is compiled. Furthermore, when the compiler reaches the else keyword, it will not associate it with the previous if statement, so it reports a syntax error instead.

Cascading if Statements

You can nest if statements inside other if statements. In this way, you can chain together a sequence of Boolean expressions, which are tested one after the other until one of them evaluates to true. In the following example, if the value of day is 0, the first test evaluates to true and dayName is assigned Sunday. If the value of day is not 0, the first test fails and control passes to the else clause, which runs the second if statement and compares the value of day with 1. The second if statement is reached only if the first test is false. Similarly, the third if statement is reached only if the first and second tests are false.

if (day == 0)      dayName = "Sunday";  else if (day == 1)      dayName = "Monday";  else if (day == 2)      dayName = "Tuesday";  else if (day == 3)      dayName = "Wednesday";  else if (day == 4)      dayName = "Thursday";  else if (day == 5)      dayName = "Friday";  else if (day == 6)      dayName = "Saturday";  else      dayName = "unknown";

In the following exercise, you'll write a method that uses a cascading if statement to compare two dates.

Write if statements

  1. Start Microsoft Visual Studio 2005.

  2. Open the Selection project, located in the \Microsoft Press\Visual CSharp Step by Step\Chapter 4\Selection folder in your My Documents folder.

  3. On the Debug menu, click Start Without Debugging.

    Visual Studio 2005 builds and runs the application. There are two DateTimePicker controls on the form called first and second. (These controls display a calendar allowing you to select a date when you click the drop-down arrow.) Both controls are currently set to today's date.

  4. Click Compare.

    The following text appears in the text box:

    first == second : False  first != second : True  first <  second : False  first <= second : False  first >  second : True  first >= second : True

    The Boolean expression first == second should be true because both first and second are set to today's date. In fact, only the less than operator and the greater than or equal to operator seem to be correct!

    graphic

  5. Click Quit.

    You return to the Visual Studio 2005 programming environment.

  6. Display the code for Form1.cs in the Code and Text Editor window. Locate the compare_Click method, which looks like this:

    private int compare_Click(object sender, System.EventArgs e)  {      int diff = dateCompare(first.Value, second.Value);

        info.Text = "";

        show("first == second", diff == 0);

        show("first != second", diff != 0);

        show("first < second", diff < 0);

        show("first <= second", diff <= 0);

        show("first > second", diff > 0);

        show("first >= second", diff >= 0);  }

    This method runs whenever the user clicks the Compare button on the form. It retrieves the values of the dates displayed in the first and second DateTimePicker controls on the form and calls another method called dateCompare to compare them. You will examine the dateCompare method in the next step, but its purpose is to examine its arguments and return an integer value based on their relative values; it returns zero if they have the same value, -1 if the value of first is less than the value of second, and +1 if the value if first is greater than the value of second. (A date is considered greater than another date if it comes after it chronologically.)

    The show method summarizes the results of the comparison in the info TextBox control on the form.

  7. Locate the dateCompare method, which looks like this:

    private int dateCompare(DateTime leftHandSide, DateTime rightHandSide)  {      // TO DO      return 42;  }

    This method currently returns the same value whenever it is called, rather than 0, -1, or +1 depending on the values of its parameters. This explains why the application is not working as expected! You need to implement this method to correctly compare two dates.

  8. Remove the // TO DO comment and the return statement from the dateCompare method.

  9. Type the following statements in the body of the dateCompare method:

    int result;  if (leftHandSide.Year < rightHandSide.Year)      result = -1;  else if (leftHandSide.Year > rightHandSide.Year)      result = +1;  else if (leftHandSide.Month < rightHandSide.Month)      result = -1;  else if (leftHandSide.Month > rightHandSide.Month)      result = +1;  else if (leftHandSide.Day < rightHandSide.Day)      result = -1;  else if (leftHandSide.Day > rightHandSide.Day)      result = +1;  else      result = 0;  return result;

    If the expressions leftHandSide.Year < rightHandSide.Year and leftHandSide.Year > rightHandSide.Year are false, then leftHandSide.Year == rightHandSide.Year must be true, and the program flow correctly moves on to compare the Month property of lhs and rhs. Similarly, if leftHandSide.Month < rightHandSide.Month and leftHandSide.Month > rightHandSide.Month are false, then leftHandSide.Month == rightHandSide.Month must be true, and the program flow again correctly moves on to compare the Day property of lhs and rhs. Lastly, if leftHandSide.Day < rightHandSide.Day and leftHandSide.Day > rightHandSide.Day are false, then leftHandSide.Day == rightHandSide.Day must be true, and, because the Month and Year properties must also be true, the two dates must be the same.

  10. On the Debug menu, click Start Without Debugging.

    The application is rebuilt and restarted. Once again, the two DateTimePicker controls, first and second, are set to today's date.

  11. Click Compare.

    The following text appears in the text box:

    first == second : True  first != second : False  first <  second : False  first <= second : True  first >  second : False  first >= second : True

    These are the correct results.

  12. Move the second DateTimePicker control onto tomorrow's date.

  13. Click Compare.

    The following text appears in the text box:

    first == second : False  first != second : True  first <  second : True  first <= second : True  first >  second : False  first >= second : False

    Again, these are the correct results.

  14. Click Quit.




Microsoft Visual C# 2005 Step by Step
Microsoft® Visual C#® 2005 Step by Step (Step By Step (Microsoft))
ISBN: B002CKYPPM
EAN: N/A
Year: 2005
Pages: 183
Authors: John Sharp

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net