0% found this document useful (0 votes)
5 views

Module-1Lesson3

lesson 3

Uploaded by

selwynamuan29
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
5 views

Module-1Lesson3

lesson 3

Uploaded by

selwynamuan29
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 18

Lesson 3: From Flowchart to Program

In this lesson, we will continue our journey into the world of C++
Language from the previous lesson. At this point, you will learn to
convert a flowchart into a functioning C++ program by translating
each symbol to its respective statement.

Along this line, we will focus to write the C++ program implementing
the decision-making and looping concept. Our goals are to develop a
flowchart, convert that flowchart into computer codes, encode the
codes and execute.

It is my hope that you will endeavor to understand the concepts as


these will be important preparations to the next lesson. Happy
coding!

Learning Outcomes

At the end of this lesson, you shall be able to:

 draw a flowchart using the correct symbols;


 review the concepts of decision-making such as the conditional
and logical operators,
 recall the looping implementations such as the for-next and
the do-while structures;
 translate the flowchart symbols to C++ statements;
 encode those statements into the emulator/editor;
 execute the codes; and
 appreciate how flowcharts can be used to write a well-
planned C++ programs.
CONDITIONAL PROCESSING

If/Else Statements and Relational Operators

This lesson introduces conditional processing. In previous lessons, all the code
in the examples executed, that is, from the first line of the program to the last,
every statement was executed in the order it appeared in the source code. This
may be correct for some programs, but others need a way to choose which
statements will be executed or run. Conditional processing extends the
usefulness of programs by allowing the use of simple logic or tests to determine
which blocks of code are executed. In this lesson, a simple guessing game will
be developed to illustrate the use of conditional execution.

The if statement is used to conditionally execute a block of code based on


whether a test condition is true. If the condition is true the block of code is
executed, otherwise it is skipped.

#include <iostream>
using namespace std;

int main()
{

int number = 5;
int guess;

cout << "I am thinking of a number between 1 and 10" << endl;
cout << "Enter your guess, please " << endl;
cin >> guess;
if (guess == number)
{
cout << "Incredible, you are correct" << endl;
}

return 0;
}

The "==" is called a relational operator. Relational operators, ==, !=, >, >=, <,
and <=, are used to compare two operands. If the user enters 5 as a choice, he
gets back a nice message, "Incredible, you are correct". But what happens if the
user puts in an incorrect choice? Nothing. No message, no suggestions,
nothing. Luckily, for our program user, C++ has a solution.
The else statement provides a way to execute one block of code if a condition
is true, another if it is false.

#include <iostream>
using namespace std;

int main()
{

int number = 5;
int guess;

cout << "I am thinking of a number between 1 and 10" << endl;
cout << "Enter your guess, please ";
cin >> guess;
if (guess == number)
{
cout << "Incredible, you are correct" << endl;
}
else
{
cout << "Sorry, try again" << endl;
}

return 0;
}

This is a big improvement. Regardless of whether the guess is correct or not,


the user gets some response. But let's try to really get the program to work in a
way that's even closer to the real game. When playing this highly enjoyable
game for hours with our friends and family, what do we say when an incorrect
guess is made? Higher or lower. C++ has an if/else if construct that can be
used to implement this functionality in our program.

#include <iostream>
using namespace std;

int main()
{

int number = 5;
int guess;

cout << "I am thinking of a number between 1 and 10" << endl;
cout << "Enter your guess, please ";
cin >> guess;
if (guess == number)
{
cout << "Incredible, you are correct" << endl;
}
else if (guess < number)
{
cout << "Higher, try again" << endl;
}
else // guess must be too high
{
cout << "Lower, try again" << endl;
}
return 0;
}

It is interesting to note that there is no C++ keyword "else if", as may exist in
other languages. For instance, Perl has a keyword "elsif". The if/else if
construct is created out of if and else statements. To see this, the above code
can be rewritten as follows:

if (guess == number)
{
cout << "Incredible, you are correct" << endl;
}
else
if (guess < number)
{
cout << "Higher, try again" << endl;
}
else // guess must be too high
{
cout << "Lower, try again" << endl;
}

This code is identical to the code in the program. Only the spacing has been
changed to illustrate how if/else if statements are constructed.
Table 4-1. Summary of Relational Operators

Operator Description Example Evaluation

== equal 5== 4 FALSE


5 == 5 TRUE

!= not equal 5 != 4 TRUE


5 != 5 FALSE

> greater than 5 >4 TRUE


5 >5 FALSE
>= greater than or equal 5 >= 4 TRUE
5 >= 5 TRUE

< less than 5<4 FALSE


5<5 FALSE

<= less than or equal 5 <= 4 FALSE


5 <= 5 TRUE

Switch Statements and Logical Operators

This second lesson on conditional processing introduces both the switch


statement and logical operators. The switch statement is a construct that is
used to replace deeply nested or chained if/else statements. Nested if/else
statements arise when there are multiple alternative threads of execution
based on some condition.

Here's an example. Suppose that an ice cream store has asked us to write a
program that will automate the taking of orders. We will need to present a
menu and then based on the customer's choice take an appropriate action.

#include <iostream>
using namespace std;

int main()
{
int choice;

cout << "What flavor ice cream do want?" << endl;


cout << "Enter 1 for chocolate" << endl;
cout << "Enter 2 for vanilla" << endl;
cout << "Enter 3 for strawberry" << endl;
cout << "Enter 4 for green tea flavor, yuck" << endl;
cout << "Enter you choice: ";

cin >> choice;


if (choice == 1) {
cout << "Chocolate, good choice" << endl;
}
else if (choice == 2) {
cout << "Vanillarific" << endl;
}
else if (choice == 3) {
cout << "Berry Good" << endl;
}
else if (choice == 4) {
cout << "Big Mistake" << endl;
}
else {
cout << "We don't have any" << endl;
cout << "Make another selection" << endl;
}

return 0;
}

This program will work fine, but the if/else block is cumbersome. It would be
easy, particularly if there were more choices and maybe sub choices involving
more if/else's to end up with program that doesn't perform the actions
intended. Here's the same program with a switch.

#include <iostream>
using namespace std;

int main()
{
int choice;

cout << "What flavor ice cream do want?" << endl;


cout << "Enter 1 for chocolate" << endl;
cout << "Enter 2 for vanilla" << endl;
cout << "Enter 3 for strawberry" << endl;
cout << "Enter 4 for green tea flavor, yuck" << endl;
cout << "Enter you choice: ";

cin >> choice;

switch (choice) {
case 1:
cout << "Chocolate, good choice" << endl;
break;
case 2:
cout << "Vanillarific" << endl;
break;
case 3:
cout << "Berry Good" << endl;
break;
case 4:
cout << "Big Mistake" << endl;
break;
default:
cout << "We don't have any" << endl;
cout << "Make another selection" << endl;
}

return 0;
}

The general form of a switch statement is:

switch (variable) {
case expression1:
do something 1;
break;
case expression2:
do something 2;
break;
....
default:
do default processing;
}

Each expression must be a constant. The variable is compared for equality


against each expression. It is not possible to use the other relational operators
discussed in the last lesson or the logical operators that will be introduced
latter in this lesson. When an expression is found that is equal to the tested
variable, execution continues until a break statement is encountered. It is
possible to have a case without a break. This causes execution to fall through
into the next case. This is sometimes very useful. Suppose we need to
determine if a letter stored in a variable is a vowel or consonant.

switch (myLetter) {
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
vowelCnt++; // increments vowel count
// same as, vowelCnt = vowelCnt + 1;
break;
default:
consonantCnt = consonantCnt + 1;
}

If any vowels are found execution drops through each case until the count is
incremented and the "break" is encountered. For some coding practice, how
could the same logic be implemented using if and else's?

ANSWER

In more realistic examples, it is probably necessary to evaluate multiple


conditions to determine what parts of code should execute. For instance, if
condition 1 is true and condition 2 is true process one way, if condition 1 is
true and condition two is false process another way. C++ provides several
logical operators that allow more complex relational expressions to be formed
and evaluated.

Table 4-2. Summary of Logical Operators

Operator Description Example Evaluation

&& AND (5 > 3) AND (5 > 6) FALSE


(5 > 3) AND (5 > 4) TRUE

|| OR (5 > 3) OR (5 > 6) TRUE


(5 > 3) OR (5 > 4) TRUE

! NOT !(5 > 3) FALSE


!(5 > 6) TRUE

As can be seen in this table, && will return true only if both expressions are
true, while || will be true if either expression is true. The operator "!" provides
logical negation. One very important consideration when forming expressions is
the order of precedence of the relational and logical operators. Relational
operators are of higher precedence than the logical and the order of evaluation
is from left to right. Here are some examples that illustrate what this means.
if (myChoice == 'A' and myAge < 25) is evaluated as
if ((myChoice == 'A') and (myAge < 25))
Suppose x = 8, y = 49, z = 1.
if (x < 7 && y > 50 || z < 2) is evaluated as
if (((x < 7) && (y > 50)) || (z < 2)) which is TRUE, not as
if ((x < 7) && ((y > 50) || (z < 2)) which is FALSE.

Now, here are a few final points to wrap up this lesson. First, even if you are
sure about the order of precedence of an expression, use explicit parenthesis.
This serves to increase readability and will help avoid errors. Second, there is
such a thing as green tea ice cream and I recommend that you not buy it.
LOOPING
Do, While and For Constructs

This lesson covers three constructs that are used to create loops in C++
programs. Loops can be created to execute a block of code for a fixed number of
times. Alternatively, loops can be created to repetitively execute a block of code
until a boolean condition changes state. For instance, the loop may continue
until a condition changes from false to true, or from true to false. In this case,
the block of code being executed must update the condition being tested in
order for the loop to terminate at some point. If the test condition is not
modified somehow within the loop, the loop will never terminate. This creates a
programming bug known as an infinite loop.

While

The while loop is used to execute a block of code as long as some condition is
true. If the condition is false from the start the block of code is not executed at
all. Its syntax is as follows.

while (tested condition is satisfied) {


block of code
}

Here is a simple example of the use of while. This program counts from 1 to
100.

#include <iostream>
using namespace std;

int main()
{
int count = 1;

while (count <= 100)


{
cout << count << endl;
count += 1; //Shorthand for count = count + 1
}

return 0;
}
Here is a more realistic use of while. This program determines the minimum
number of bits needed to store a positive integer. The largest unsigned number
that can be stored in N bits is (2N - 1).

#include <iostream>
using namespace std;

int main()
{
int bitsRequired = 1; //the power of 2
int largest = 1; //largest number that can be stored
int powerOf2 = 2;
int number;

cout << "Enter a positive integer: ";


cin >> number;

while (number > largest)


{
bitsRequired += 1; //Shorthand for bitsRequired = bitsRequired +
1
powerOf2 = powerOf2 * 2;
largest = powerOf2 - 1;
}

cout << "To store " << number << " requires ";
cout << bitsRequired << " bits" << endl;

return 0;
}

Do

The do loop also executes a block of code as long as a condition is satisfied.


The difference between a "do" loop and a "while" loop is that the while loop tests
its condition at the top of its loop; the "do" loop tests its condition at the bottom
of its loop. As noted above, if the test condition is false as the while loop is
entered the block of code is skipped. Since the condition is tested at the bottom
of a do loop, its block of code is always executed at least once. The "do" loops
syntax is as follows

do {
block of code
} while (condition is satisfied)
Here is an example of the use of a do loop. The following program is a game
that allows a user to guess a number between 1 and 100. A "do" loop is
appropriate since we know that winning the game always requires at least one
guess.

#include <iostream>
using namespace std;

int main()
{

int number = 44;


int guess;

cout << "Guess a number between 1 and 100" << endl;


do {
cout << "Enter your guess: ";
cin >> guess;

if (guess > number) {


cout << "Too high" << endl;
}
if (guess < number) {
cout << "Too low" << endl;
}
} while (guess != number);

cout << "You win. The answer is " << number << endl;

return 0;
}

For

The third looping construct in C++ is the for loop. The for loop can execute a
block of code for a fixed number of repetitions. Its syntax is as follows.

for (initializations;test conditions;actions)


{
block of code
}

The simplest way to understand for loops is to study several examples.


First, here is a for loop that counts from 1 to 10.

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


{
cout << count << endl;
}

The test conditions may be unrelated to the variables being initialized and
updated (assigned). Here is a loop that counts until a user response terminates
the loop.

for (count = 1; response != 'N'; count++)


{
cout << count << endl;
cout << "Continue (Y/N): ";
cin >> response;
}

More complicated test conditions are also allowed. Suppose the user of the last
example never enters "N", but the loop should terminate when 100 is reached,
regardless.

for (count = 1; (response != 'N') && (count <= 100); count++)


{
cout << count << endl;
cout << "Continue (Y/N): ";
cin >> response;
}

It is also possible to have multiple initializations and multiple actions. This


loop starts one counter at 0 and another at 100, and finds a midpoint between
them.

for (i = 0, j = 100; j != i; i++, j--)


{
cout << i << " " << j << endl;
}
cout << i << " " << j << endl;

Initializations are optional. For instance, suppose we need to count from a user
specified number to 100. The first semicolon is still required as a place keeper.

cout << "Enter a number to start the count: ";


cin >> count;
for ( ; count < 100 ; count++)
{
cout << count << endl;
}

The actions are also optional. Here is a silly example that will repeatedly echo a
single number until a user terminates the loop;

for (number = 5; response != 'Y';) {


cout << number;
cout << "Had Enough (Y/N) " << endl;
cin >> response;
}

Examples Using the For Statement


Example for Do, While

Example for Switch Statement

You might also like