Top Banner
if-else, switch, while, for, do-while Control Statements
61
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Control All

if-else, switch, while, for, do-while

Control Statements

Page 2: Control All

Conditional StatementsSo far statements of our programs execute sequentially

one after another.What happens when

we want to execute a statement depending on a condition?e.g. If there is enough money in the bank account, give the money

we want to execute one statement when a condition holds and another statement when a condition does not hold?e.g. If dollar is high, sell dollar. Otherwise, buy dollar.

we want to select from many statements according to one or more criteria (selection). e.g. If dollar is high and euro is low, sell dollar and buy euro. If dollar is low

and euro is high, sell euro and buy dollar. If both of them are high, sell both and buy YTL.

You achieve conditional execution with if-else statements

Page 3: Control All

Syntaxif (<condition>) {<statement_true_1>;...<statement_true_N>;

}else{<statement_false_1>;...<statement_false_N>;

}

If condition is TRUE then statement_true_1 … statement_true_N are executed, if condition is FALSE statement_false_1 … statement_false_N are executed.

if (<condition>) {<statement_true_1>;...<statement_true_N>;

}

else and statement_false’s are optional if condition is FALSE then

nothing will be executed and execution continues with the next statement in the program

<condition> must be in brackets

Page 4: Control All

Another Syntax (without { })

if (<condition>)<statement_true>;

else<statement_false>;

if (<condition>) <statement_true>;

• Can be used when there is only one statement• Not suggested (we will see why)

Page 5: Control All

Flow diagram of if-else

test condition

truestatements

true

nextstatement

false

falsestatements

Page 6: Control All

if-else example

Write a program that inputs two integer numbers and displays the maximum one.

Two solutionsusing if and else together (Maximum1.cs)using only if (no else) (Maximum2.cs)

Page 7: Control All

Boolean type and expressions

The condition in an if statement must be a Boolean expression (named for George Boole)Values are true or falsebool is a built-in value type like int, double

int degrees;

bool isHot = false;

Console.WriteLine("enter temperature: “);

degrees = Convert.ToInt32(Console.ReadLine());

if (degrees > 35)

{

isHot = true; }

Page 8: Control All

8

The conditional operator (?:) can be used in place of an if…else statement.

Console.WriteLine( grade >= 60 ? "Passed" : "Failed" );

– The first operand is a boolean expression that evaluates to trueor false.

– The second operand is the value if the expression is true– The third operand is the value if the expression is false.

Conditional operator (?:)

Page 9: Control All

< less than number < 5

<= less than or equal number <= 0

> greater than num1 > num2

>= greater than or equal num1 >= num2

== equality check num1 == 0

!= inequality check num1 != num2

Relational Operators Relational operators are used to compare values:

They take two operands operands can be literals, variables or expressions

Used for many types numeric comparisons string comparisons (alphabetical)

Page 10: Control All

Logical operatorsBoolean expressions can be combined using logical

operators: AND, OR, NOTIn C# we use && || ! respectively

A B A || B A && B

true true true true

true false true false

false true true false

false false false false

A ! A

true false

false true

Page 11: Control All

Example• Range check: between 0 and 100 (includes 0 and 100), or not?

If so, display a message saying that the number is in the range. If not, the message should say “out of the range”.

• Solution 1: using logical AND operatorif (num >= 0 && num <= 100) Console.Write("number is in the range");else Console.Write("number is out of range");

• Solution 2: using logical AND and NOT operators

if ( ! (num >= 0 && num <= 100) ) Console.Write("number is out of range");

else Console.Write("number is in the range");

• Solution 3: using logical OR operatorif (num < 0 || num > 100)

Console.Write("number is out of range");else

Console.Write("number is in the range");

Page 12: Control All

De Morgan’s Rules Compare solution 2 and 3

two conditions are equivalent

( ! (num >= 0 && num <= 100) )

( num < 0 || num > 100 )

De Morgan’s Rules (assume a and b are two boolean expressions)! (a && b) = !a || !b! (a || b) = !a && !b

De Morgan’a Rules can be generalized to several expressions (e.g. 4 boolean expressions case)! (a && b && c && d) = !a || !b || !c || !d! (a || b || c || d) = !a && !b && !c && !d

Page 13: Control All

Operator Precedence - RevisitedUpper operator groups have precedence

Operator Explanation Associativity+ - ! plus and minus signs, logical NOT right-to-left

* / % multiplication, division and modulus left-to-right

+ - addition, subtraction left-to-right

< <= > >= inequality comparison operators left-to-right

== != equal, not equal comparison left-to-right

&& logical and left-to-right

|| logical or left-to-right

= += -= *= /= %=

assignment operators right-to-left

Page 14: Control All

Nested if statementsif/else statements are inside other if/else statementsMethod to select from multiple choicesExample: input a numeric grade and convert to letter grade

90 .. 100 A80 .. 89 B70 .. 79 C60 .. 69 D0 .. 59 Fotherwise F

Page 15: Control All

15

This may be written in C# as

if ( grade >= 90 ) Console.WriteLine( "A" );else if ( grade >= 80 ) Console.WriteLine( "B" ); else if ( grade >= 70 ) Console.WriteLine( "C" ); else if ( grade >= 60 ) Console.WriteLine( "D" ); else Console.WriteLine( "F" );

Nested if statements

Page 16: Control All

16

Most C# programmers prefer to use else if:

if ( grade >= 90 ) Console.WriteLine( "A" );else if ( grade >= 80 ) Console.WriteLine( "B" );else if ( grade >= 70 ) Console.WriteLine( "C" );else if ( grade >= 60 ) Console.WriteLine( "D" );else Console.WriteLine( "F" );

Nested if statements (Cont.)

Page 17: Control All

Short-circuit Evaluation Some subexpressions in Boolean expressions are not evaluated if the entire

expression’s value is already known using the subexpression evaluated so far. Rule: Evaluate the first (leftmost) boolean subexpression. If its value is

enough to judge about the value of the entire expression, then stop there. Otherwise continue evaluation towards right.

if (count != 0 && scores/count < 60) {

Console.WriteLine("low average"); } In this example, if the value of count is zero, then first subexpression becomes false

and the second one is not evaluated. In this way, we avoid “division by zero” error (that would cause to stop the

execution of the program) Alternative method to avoid division by zero without using short-circuit evaluation:

if (count != 0) {

if (scores/count < 60) {

Console.WriteLine("low average"); } }

Page 18: Control All

Dangling Else Problem

if ( x % 2 == 0) if ( x < 0 )

Console.WriteLine("{0} is an even, negative number“, x);

else Console.WriteLine("{0} is an odd number“, x);

What does it display for x=4?The problem is that it displays “odd number” message for positive

even numbers and zero.Reason is that, although indentation says the reverse, else belongs

to second (inner) ifelse belongs to the most recent if

Solution: use braces (see next slide)

Page 19: Control All

Solution to Dangling Else Problem if ( x % 2 == 0) { if ( x < 0 ) Console.WriteLine("{0} is an even, negative number“, x);

}else { Console.WriteLine("{0} is an odd number“, x);

}

Now else belongs to the first ifif – else matching rule

Each else belongs to the nearest if for which there is no else and in the same compound block

Page 20: Control All

switch statement

The switch multiple-selection statement performs different actions based on the value of an expression.

Each action is associated with the value of a constant integral expression or a constant string expression that the expression may assume.

Let’s see an example: GradeBookswitch.cs

Page 21: Control All

private void IncrementLetterGradeCounter( int grade )

{

switch ( grade / 10 )

{

case 9: // grade was in the 90s

case 10: // grade was 100

++aCount;

break; // necessary to exit switch

case 8: // grade was between 80 and 89

++bCount;

break; // exit switch

case 7: // grade was between 70 and 79

++cCount;

break; // exit switch

case 6: // grade was between 60 and 69

++dCount;

break; // exit switch

default: // grade was less than 60

++fCount;

break; // exit switch

}

} // end method IncrementLetterGradeCounter

Page 22: Control All

Flow diagram of switch

Page 23: Control All

23

The expression after each case can be only a constant integral expression or a constant string expression.

You can also use null and character constants which represent the integer values of characters.

The expression also can be a constant that contains a value which does not change for the entire application.

switch statement

Page 24: Control All

From Selection to Repetition The if statement and if/else statement allow a block of statements to be

executed selectively: based on a conditionConsole.WriteLine("Please enter a non-negative number");inputnumber = Convert.ToInt32(Console.ReadLine()); if (inputnumber < 0){ Console.WriteLine(inputnumber + " is negative. Wrong Input");}

This piece of code does not ask another input number if the number is negative.

The while statement repeatedly executes a block of statements while the condition is trueConsole.WriteLine("Please enter a non-negative number");inputnumber = Convert.ToInt32(Console.ReadLine()); while (inputnumber < 0){ Console.WriteLine(inputnumber + " is negative! Try again"); inputnumber = Convert.ToInt32(Console.ReadLine());}

Page 25: Control All

Flow diagram of while loopif (test) while (test){ { statement list; statement list;} }

test

Statement list

Next statement

true

false

test

Statement list

Next statement

true

false

Page 26: Control All

Sum Example: why we need loops?We want to find the sum of 10 positive valuesWe can write:

int num1, num2, num3, num4, num5;int sum;cin >> num1 >> num2 >> num3 >> num4 >> num5;sum = num1 + num2 + num3 + num4 + num5;cin >> num1 >> num2 >> num3 >> num4 >> num5;sum += num1 + num2 + num3 + num4 + num5;

Page 27: Control All

Sum Example (not in book)

What if we want to compute the sum of 100 values an undetermined number of values

What we need is a program to be able to read as many values as we want and then compute the sum

This is possible with loopsGood solution is to use loops.

Code is developed on board. See sum10nums.csThis type of loops are called counting loops

number of iterations is known

Page 28: Control All

Another simple exampleCalculate the sum of the integer numbers between 1 and 10

int sum = 0; // this program piece int i = 1; // calculates the sum of

while (i <= 10) // integers between and { // including 1 and 10 sum = sum + i; i += 1; }

Page 29: Control All

Walkthrough of the example

int sum = 0;

int i = 1;

while (i <= 10)

{

sum = sum + i;

i = i + 1;

}

Console.Write(sum);

i<=10

sum=sum+i;i=i+1;

true

Console.Write(sum);

false

1i

sum 0

2

1

Page 30: Control All

Walkthrough of the example

int sum = 0;

int i = 1;

while (i <= 10)

{

sum = sum + i;

i = i + 1;

}

Console.Write(sum);

i<=10

sum=sum+i;i=i+1;

true false

2i

sum 1

3

3

Console.Write(sum);

Page 31: Control All

Walkthrough of the example

int sum = 0;

int i = 1;

while (i <= 10)

{

sum = sum + i;

i = i + 1;

}

Console.Write(sum);

i<=10

sum=sum+i;i=i+1;

true

cout<<sum;

false

3i

sum 3

4

6

Console.Write(sum);

Page 32: Control All

Walkthrough of the example

int sum = 0;

int i = 1;

while (i <= 10)

{

sum = sum + i;

i = i + 1;

}

Console.Write(sum);

i<=10

sum=sum+i;i=i+1;

true

cout<<sum;

false

10i

sum 45

11

55

Console.Write(sum);

Page 33: Control All

while loop syntax

<initialization> while (<test>) {

<statement1>;...<statementN>;

<update>}

Page 34: Control All

while loop sum example

Sum of numbers from 1..10

int sum = 0;int i = 1;while (i <= 10){

sum = sum + i;i = i + 1;

}Console.Write(sum);

initialization

body statements

update

test

Page 35: Control All

Counter-controlled loop example

Consider the following problem statement:A class of 10 students took a quiz. The grades (integers inthe range 0 to 100) for this quiz are available to you.Determine the class average on the quiz.

The algorithm must input each grade, keep track of the total of all grades input, perform the averaging calculation and display the result.

Page 36: Control All

Another Counter-controlled loop algorithm

set total to zeroset grade counter to one

while grade counter is less than or equal to 10 prompt the user to enter the next grade input the next grade add the grade into the total add one to the grade counter

set the class average to the total divided by 10display the class average

Page 37: Control All

Counter-controlled loop code (Counting_While.sln)

// initialization

total = 0; // initialize the total

gradeCounter = 1; // initialize the loop counter

while ( gradeCounter <= 10 ) // test

{

Console.Write( "Enter grade: " ); // prompt the user

grade = Convert.ToInt32( Console.ReadLine() ); // read grade

total = total + grade; // add the grade to total

gradeCounter = gradeCounter + 1; // update

}

// termination phase

average = total / 10; // integer division yields integer result

Page 38: Control All

Sentinel-controlled loop example

Consider the following problem:Develop a class-averaging application that processes grades for an arbitrary number of students each time it is run.

In this example, no indication is given of how many grades the user will enter during the application’s execution.

Page 39: Control All

Sentinel-controlled algorithminitialize total to zeroinitialize counter to zero

prompt the user to enter the first gradeinput the first grade (possibly the sentinel)

while the user has not yet entered the sentinel add this grade into the running total add one to the grade counter prompt the user to enter the next grade input the next grade (possibly the sentinel)

if the counter is not equal to zero set the average to the total divided by the counter display the average

else display “No grades were entered”

Page 40: Control All

Let’s see Sentinel_While.sln// initialization phase

total = 0; // initialize total

gradeCounter = 0; // initialize loop counter

// prompt for and read a grade from the user

Console.Write("Enter grade or -1 to quit: ");

grade = Convert.ToInt32(Console.ReadLine());

// loop until sentinel value is read from the user

while (grade != -1)

{

total = total + grade; // add grade to total

gradeCounter = gradeCounter + 1; // increment counter

// prompt for and read the next grade from the user

Console.Write("Enter grade or -1 to quit: ");

grade = Convert.ToInt32(Console.ReadLine());

}

Page 41: Control All

for loop syntax compared with while

<initialization>

while (<test>)

{

<statement1>;

...

<statementN>;

<update>

}

for (<initialization>;

<test>;

<update> )

{

<statement1>;...

   <statementN>;

}

Page 42: Control All

ExampleCalculate the sum of the integer numbers between 1 and 10

int sum = 0; // this program piece int i = 1; // calculates the sum of

while (i <= 10) // integers between and { // including 1 and 10 sum = sum + i; i = i + 1; }

Page 43: Control All

Same example with for loop

int sum = 0;

int i = 1;

while (i <= 10)

{

sum = sum + i;

i = i + 1;

}

int sum = 0;

for (int i=1; i <= 10; i=i+1)

{

sum = sum + i;

}

Page 44: Control All

Scope of the counter variable in for

for (int i=1; i <= 10; i=i+1)

If the initialization expression declares the control variable, the control variable will not exist outside the for statement.

This restriction is known as the variable’s scope.Similarly, a local variable can be used only in the method that

declares the variable and only from the point of declaration.

int i;

for (i=1; i <= 10; i=i+1)

Page 45: Control All

for loop syntaxComma-separated lists that enable you to use multiple

initialization expressions or multiple increment expressions:

for ( int i = 2; i <= 20; total += i, i += 2 ) ; // empty statement

Page 46: Control All

46

Operator Called Sample expression

Explanation

++ prefix

increment

++a Increments a by 1, then uses the new value of a in the expression.

++ postfix

increment

a++ Uses the current value of a, then increments a by 1.

-- prefix

decrement

--b Decrements b by 1, then uses the new value of b.

-- postfix

decrement

b-- Uses the current value of b, then decrements b by 1.

Increment and Decrement OperatorsC# provides operators for adding or subtracting 1 from a

numeric variableThe unary increment operator, ++The unary decrement operator, --.

Page 47: Control All

Bad loops1. for (int i = 10; i < 5; i=i+1) { Console.WriteLine("How many times do I print?"); }

2. for (int i = 10; i >= 1; i=i+1) { Console.WriteLine("How many times do I print?");

}

3. int i = 1; while (i < 20) { Console.WriteLine("How many times do I print?");

}

Page 48: Control All

What is the problem with the code below?cannot say infinite loop for sure, depends on input number

for example, if num is an odd number, then the loop is infinite

int num = Convert.ToInt32(Console.ReadLine()); int start = 0; while (start != num) {

start += 2; Console.WriteLine(start);

}

How to fix? You can check whether num is even before starting the loop.

if (num % 2 == 0){ while (start != num) { start += 2;

Console.WriteLine(start); }}

Infinite loops

Page 49: Control All

Other Common ProblemsEasy to iterate one more or one less timesTest each loop with the inputs that cause:

zero iterations of the loop bodyone iteration of the loop bodymaximum number of iterationsone less than the maximum number of iterations

Use the debugger and watch the variables.

Page 50: Control All

Developing LoopsSome loops are easy to develop, others are notSometimes the proper loop test and body are hard to

designPractice helps, but remember:

Good design comes from experience, experience comes from bad design

Page 51: Control All

Factorialn! = 1x2x…xn is “n factorial”; used in math, statistics

long factorial(long n) // pre: 0 <= n // post: returns n! (1 x 2 x … x n)

Similar to sum, but this time we will calculate a product within the loop. At the end we will return the final product. The loop will iterate n times, multiplying by 1, 2, …, nSuppose we use a variable called product to hold the result,

then product is n! when the loop terminates. Then we will return it at the end.

Page 52: Control All

Factoriallong Factorial(int num){ long product = 1; int count = 0; while (count < num) { count += 1; product *= count; } return product;}

IssuesWhy did we use long? What happens if we use int instead?What happens if we initialize count to 1?

See factorial.cpp

Page 53: Control All

Downward-counting loopCalculate n to the power of m: nm=nxnx…xnExample: 25=2x2x2x2x2=32

int power = 1;int n, m;

for (int i = m; i <= 1; i--){

power = power * n;}

Page 54: Control All

Exercise:Determining if a number is Prime

1 is NOT prime, 2 is prime, 3 is prime, 5 is prime, 17 is prime, … 137, 193?We do not need to check even numbers other than 2 (2 is a special case)To check 193, divide it by 3, 5, 7, 9, 11, 13

Note that 14x14 = 196, so 13 largest potential factor? We can use modulus operator to check divisibility

Check odd numbers as potential divisorsWatch out for 2, it is a special caseHow far should we go to check potential divisors?

up to and including Math.Sqrt(number) + 1 If there was a bigger factor, a smaller factor would exist. And this smaller one

must have been checked before. So we do not need to go beyond this limit. +1 is there to make sure that there will be no problems with precision

Write code as exercise at home

Page 55: Control All

Nested loops – ExampleWrite a function to display a perpendicular isosceles

triangle of stars (perpendicular side length is parameter)e.g. if side length is 6 , the output should look like

*********************

See drawtriangle.csExercise: write the same loops downward-counting this time.

Page 56: Control All

Exercise: Multiplication TableOn ith line print, i*1, i*2, i*3, ... , i*i

Total number of lines is an input. Display lines starting with 1.

Please enter the number of lines in the multiplication table: 9

1 2 4 3 6 9 4 8 12 16 5 10 15 20 25 6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81

Page 57: Control All

The do-while loop Similar to while loop, but the test is after the execution of the loop body The while loop may never execute, do-while loop executes at least once

<initialization>do {

<statement1>;   ...  <statementN>;

<update>} while (<condition>);

Example: Prompt for a number between 0 and 100, loop until such a number is entered (user should enter at least one number)

do{

Console.WriteLine("enter number in range [0..100]");

num = Convert.ToInt32(Console.ReadLine());} while (num < 0 || num > 100 );

Don’t forget

Page 58: Control All

foreach

Good with arrays or collections, we will revisit

Page 59: Control All

59

1 // Fig. 6.12: BreakTest.cs

2 // break statement exiting a for statement.

3 using System;

4

5 public class BreakTest

6 {

7 public static void Main( string[] args )

8 {

9 int count; // control variable also used after loop terminates

10

11 for ( count = 1; count <= 10; count++ ) // loop 10 times

12 {

13 if ( count == 5 ) // if count is 5,

14 break; // terminate loop

15

16 Console.Write( "{0} ", count );

17 } // end for

18

19 Console.WriteLine( "\nBroke out of loop at count = {0}", count );

20 } // end Main

21 } // end class BreakTest

1 2 3 4 Broke out of loop at count = 5

• The break statement causes immediate exit from a statement.

When count is 5, the break statement terminates the for statement.

break

Page 60: Control All

60

break and continue

• The continue statement skips the remaining statements in the loop body and tests whether to proceed with the next iteration of the loop.

• In a for statement, the increment expression executes, then the application evaluates the loop-continuation test.

Software EngineeringSome programmers feel that break and continue statements violate structured programming, since the same effects are achievable with structured programming techniques.

Page 61: Control All

61

1 // Fig. 6.13: ContinueTest.cs

2 // continue statement terminating an iteration of a for statement.

3 using System;

4

5 public class ContinueTest

6 {

7 public static void Main( string[] args )

8 {

9 for ( int count = 1; count <= 10; count++ ) // loop 10 times

10 {

11 if ( count == 5 ) // if count is 5,

12 continue; // skip remaining code in loop

13

14 Console.Write( "{0} ", count );

15 } // end for

16

17 Console.WriteLine( "\nUsed continue to skip displaying 5" );

18 } // end Main

19 } // end class ContinueTest

1 2 3 4 6 7 8 9 10 Used continue to skip displaying 5

Skipping to the next iteration when count is 5.

Console.Write skips 5 because of the continue statement.

continue