LOOPS AND ITERATION




LOOPING AND ITERATION


This chapter will look at C's mechanisms for controlling looping and

iteration. Even though some of these mechanisms may look familiar and indeed

will operate in standard fashion most of the time.

NOTE:


some non-standard features are available.

IF STATEMENTS


The ability to control the flow of your program, letting it make decisions on

what code to execute, is valuable to the programmer.

The if statement allows you to control if a program enters a section of code

or not based on whether a given condition is true or false.

One of the important functions of the if statement is that it allows the

program to select an action based upon the user's input.

For example, by using an if statement to check a user-entered password, your

program can decide whether a user is allowed access to the program.

Without a conditional statement such as the if statement, programs would run

almost the exact same way every time, always following the same sequence of

function calls.

If statements allow the flow of the program to be changed, which leads to more

interesting code.

Before discussing the actual structure of the if statement, let us examine the

meaning of TRUE and FALSE in computer terminology.

A true statement is one that evaluates to a nonzero number. A false statement

evaluates to zero. When you perform comparison with the relational operators,

the operator will return 1 if the comparison is true, or 0 if the comparison

is false.

For example, the check 0 == 2 evaluates to 0. The check 2 == 2 evaluates to a

1. If this confuses you, try to use a printf statement to output the result of

those various comparisons (for example printf ( "%d", 2 == 1 );)

When programming, the aim of the program will often require the checking of

one value stored by a variable against another value to determine whether one

is larger, smaller, or equal to the other.

There are a number of operators that allow these checks.


Here are the relational operators, as they are known, along with examples:


> GREATER THAN 5 > 4 IS TRUE
< LESS THAN 4 < 5 IS TRUE >= GREATER THAN OR EQUAL 4 >= 4 IS TRUE
<= LESS THAN OR EQUAL 3 <= 4 IS TRUE == EQUAL TO 5 == 5 IS TRUE != NOT EQUAL TO 5 != 4 IS TRUE


It is highly probable that you have seen these before, probably with slightly

different symbols. They should not present any hindrance to understanding.
Now that you understand TRUE and FALSE well as the comparison operators, let

us look at the actual structure of if statements.


BASIC IF SYNTAX


The structure of an if statement is as follows:


IF ( STATEMENT IS TRUE )
EXECUTE THIS LINE OF CODE



Here is a simple example that shows the syntax:


IF ( 5 < 10 ) PRINTF( "FIVE IS NOW LESS THAN TEN, THAT'S A BIG SURPRISE" );





Here, we're just evaluating the statement, "is five less than ten", to see if

it is true or not; with any luck, it is! If you want, you can write your own

full program including stdio.h and put this in the main function and run it to

test.
To have more than one statement execute after an if statement that evaluates

to true, use braces, like we did with the body of the main function.

Anything inside braces is called a compound statement, or a block. When using

if statements, the code that depends on the if statement is called the "body"

of the if statement.


For example:



IF ( TRUE ) {
/* BETWEEN THE BRACES IS THE BODY OF THE IF STATEMENT */
EXECUTE ALL STATEMENTS INSIDE THE BODY
}



I recommend always putting braces following if statements. If you do this, you

never have to remember to put them in when you want more than one statement to

be executed, and you make the body of the if statement more visually clear.


ELSE


Sometimes when the condition in an if statement evaluates to false, it would

be nice to execute some code instead of the code executed when the statement

evaluates to true.



The "else" statement effectively says that whatever code after it (whether a

single line or code between brackets) is executed if the if statement is

FALSE.


It can look like this:



IF ( TRUE ) {
/* EXECUTE THESE STATEMENTS IF TRUE */
}
ELSE {
/* EXECUTE THESE STATEMENTS IF FALSE */
}



ELSE IF



Another use of else is when there are multiple conditional statements that may

all evaluate to true, yet you want only one if statement's body to execute.


You can use an "else if" statement following an if statement and its body;

that way, if the first statement is true, the "else if" will be ignored, but

if the if statement is false, it will then check the condition for the else if

statement.


If the if statement was true the else statement will not be checked. It is

possible to use numerous else if statements to ensure that only one block of

code is executed.


Let's look at a simple program for you to try out on your own.


#INCLUDE

INT MAIN() /* MOST IMPORTANT PART OF THE PROGRAM!
*/
{
INT AGE; /* NEED A VARIABLE... */

PRINTF( "PLEASE ENTER YOUR AGE" ); /* ASKS FOR AGE */
SCANF( "%D", &AGE ); /* THE INPUT IS PUT IN AGE */
IF ( AGE < 100 ) { /* IF THE AGE IS LESS THAN 100 */ PRINTF ("YOU ARE PRETTY YOUNG!\N" ); /* JUST TO SHOW YOU IT WORKS... */ } ELSE IF ( AGE == 100 ) { /* I USE ELSE JUST TO SHOW AN EXAMPLE */ PRINTF( "YOU ARE OLD\N" ); } ELSE { PRINTF( "YOU ARE REALLY OLD\N" ); /* EXECUTED IF NO OTHER STATEMENT IS */ } RETURN 0; }



MORE INTERESTING CONDITIONS USING BOOLEAN OPERATORS



Boolean operators allow you to create more complex conditional statements. For

example, if you wish to check if a variable is both greater than five and less

than ten, you could use the Boolean AND to ensure both var > 5 and var < 10 are true. In the following discussion of Boolean operators, I will capitalize the Boolean operators in order to distinguish them from normal English. The actual C operators of equivalent function will be described further along into the tutorial - the C symbols are not: OR, AND, NOT, although they are of equivalent function. When using if statements, you will often wish to check multiple different conditions. You must understand the Boolean operators OR, NOT, and AND. The boolean operators function in a similar way to the comparison operators: each returns 0 if evaluates to FALSE or 1 if it evaluates to TRUE. NOT:



The NOT operator accepts one input. If that input is TRUE, it returns FALSE,

and if that input is FALSE, it returns TRUE.
For example, NOT (1) evaluates to 0, and NOT (0) evaluates to 1. NOT (any

number but zero) evaluates to 0. In C NOT is written as !. NOT is evaluated

prior to both AND and OR.




AND:



This is another important command. AND returns TRUE if both inputs are TRUE

(if 'this' AND 'that' are true).



(1) AND (0) would evaluate to zero because one of the inputs is false (both

must be TRUE for it to evaluate to TRUE). (1) AND (1) evaluates to 1. (any

number but 0) AND (0) evaluates to 0. The AND operator is written && in C.


Do not be confused by thinking it checks equality between numbers: it does

not. Keep in mind that the AND operator is evaluated before the OR operator.



OR:



Very useful is the OR statement! If either (or both) of the two values it

checks are TRUE then it returns TRUE.

For example, (1) OR (0) evaluates to 1. (0) OR (0) evaluates to 0. The OR is

written as || in C. Those are the pipe characters.

On your keyboard, they may look like a stretched colon. On my computer the

pipe shares its key with \. Keep in mind that OR will be evaluated after AND.

It is possible to combine several Boolean operators in a single statement;

often you will find doing so to be of great value when creating complex

expressions for if statements.

What is !(1 && 0)? Of course, it would be TRUE. It is true is because 1 && 0

evaluates to 0 and !0 evaluates to TRUE (i.e., 1).

Try some of these - they're not too hard. If you have questions about them,

feel free to stop by our forums.


A. !( 1 || 0 ) ANSWER: 0
B. !( 1 || 1 && 0 ) ANSWER: 0 (AND IS EVALUATED BEFORE OR)
C. !( ( 1 || 0 ) && 0 ) ANSWER: 1 (PARENTHESIS ARE USEFUL)




FOR STATEMENT



The C for statement has the following form:



FOR (EXPRESSION1; 2; EXPRESSION3)
STATEMENT;
OR {BLOCK OF STATEMENTS}


expression1 initialises;
expression2 is the terminate test;
expression3 is the modifier (which may be more than just simple increment);



NOTE:



C basically treats for statements as while type loops


For example:


INT X;

MAIN()
{
FOR (X=3;X>0;X-)
{
PRINTF("X=%D?N",X);
}
}


...outputs:



X=3
X=2
X=1



...to the screen


All the following are legal for statements in C. The practical application of

such statements is not important here, we are just trying to illustrate

peculiar features of C for that may be useful:-


FOR (X=0;((X>3) && (X<9)); X++) FOR (X=0,Y=4;((X>3) && (Y<9)); X++,Y+=2) FOR (X=0,Y=4,Z=4000;Z; Z/=10)




The second example shows that multiple expressions can be separated a ,.

In the third example the loop will continue to iterate until z becomes 0;

BREAK AND CONTINUE



C provides two commands to control how we loop:


break -- exit form loop or switch.


continue -- skip 1 iteration of loop.


Consider the following example where we read in integer values and process

them according to the following conditions.

If the value we have read is negative, we wish to print an error message and

abandon the loop.
If the value read is great than 100, we wish to ignore it and continue to the

next value in the data. If the value is zero, we wish to terminate the loop.

WHILE (SCANF( ``%D'', &VALUE ) == 1 && VALUE != 0) {
IF (VALUE < 0) { PRINTF(``ILLEGAL VALUE?N''); BREAK; /* ABANDON THE LOOP */ } IF (VALUE > 100) {
PRINTF(``INVALID VALUE?N'');
CONTINUE;
/* SKIP TO START LOOP AGAIN */
}

/* PROCESS THE VALUE READ */
/* GUARANTEED BETWEEN 1 AND 100 */
....;

....;
} /* END WHILE VALUE != 0 */


THE WHILE STATEMENT


The while statement is similar to those used in other languages although more

can be done with the expression statement -- a standard feature of C.


The while has the form:


WHILE (EXPRESSION)
STATEMENT




For example:


INT X=3;

MAIN()
{ WHILE (X>0)
{ PRINTF("X=%D?N",X);
X-;
}
}


...outputs:

X=3
X=2
X=1


...to the screen.




Because the while loop can accept expressions, not just conditions, the

following are all legal:-



WHILE (X-);
WHILE (X=X+1);
WHILE (X+=5);




Using this type of expression, only when the result of x-, x=x+1, or x+=5,

evaluates to 0 will the while condition fail and the loop be exited.
We can go further still and perform complete operations within the while

expression:



WHILE (I++ < 10); WHILE ( (CH = GETCHAR()) != `Q') PUTCHAR(CH);




The first example counts i up to 10.


The second example uses C standard library functions getchar() - reads a

character from the keyboard - and putchar() - writes a given char to screen.


The while loop will proceed to read from the keyboard and echo characters to

the screen until a 'q' character is read.

NOTE:




This type of operation is used a lot in C and not just with character

reading!! (See Exercises).



THE DO-WHILE STATEMENT



C's do-while statement has the form:

DO
STATEMENT;
WHILE (EXPRESSION);



It is similar to PASCAL's repeat ... until except do while expression is true.



For example:



INT X=3;
MAIN()
{ DO {
PRINTF("X=%D?N",X-);
}
WHILE (X>0);
}



..outputs:-




X=3
X=2
X=1


NOTE:




THE POSTFIX X- OPERATOR WHICH USES THE CURRENT VALUE OF X WHILE PRINTING AND

THEN DECREMENTS X.

SWITCH CASE IN C




Switch case statements are a substitute for long if statements that compare a

variable to several "integral" values ("integral" values are simply values

that can be expressed as an integer, such as the value of a char).

The basic format for using switch case is outlined below.

The value of the variable given into switch is compared to the value following

each of the cases, and when one value matches the value of the variable, the

computer continues executing the program from that point.


SWITCH ( ) {
CASE THIS-VALUE:
CODE TO EXECUTE IF == THIS-VALUE
BREAK;
CASE THAT-VALUE:
CODE TO EXECUTE IF == THAT-VALUE
BREAK;
...


DEFAULT:


CODE TO EXECUTE IF DOES NOT EQUAL THE VALUE FOLLOWING ANY OF THE

CASES
BREAK;
}


The condition of a switch statement is a value.


The case says that if it has the value of whatever is after that case then do

whatever follows the colon.


The break is used to break out of the case statements.


Break is a keyword that breaks out of the code block, usually surrounded by

braces, which it is in. In this case, break prevents the program from falling

through and executing the code in all the other case statements.


An important thing to note about the switch statement is that the case values

may only be constant integral expressions. Sadly, it isn't legal to use case

like this:


INT A = 10;
INT B = 10;
INT C = 20;

SWITCH ( A ) {
CASE B:
/* CODE */
BREAK;
CASE C:
/* CODE */
BREAK;
DEFAULT:
/* CODE */
BREAK;
}


The default case is optional, but it is wise to include it as it handles any

unexpected cases. It can be useful to put some kind of output to alert you to

the code entering the default case if you don't expect it to.


Switch statements serve as a simple way to write long if statements when the

requirements are met. Often it can be used to process input from a user.


Below is a sample program, in which not all of the proper functions are

actually declared, but which shows how one would use switch in a program.


#INCLUDE

VOID PLAYGAME()
{
PRINTF( "PLAY GAME CALLED" );
}
VOID LOADGAME()
{
PRINTF( "LOAD GAME CALLED" );
}
VOID PLAYMULTIPLAYER()
{
PRINTF( "PLAY MULTIPLAYER GAME CALLED" );
}

INT MAIN()
{
INT INPUT;

PRINTF( "1. PLAY GAME\N" );
PRINTF( "2. LOAD GAME\N" );
PRINTF( "3. PLAY MULTIPLAYER\N" );
PRINTF( "4. EXIT\N" );
PRINTF( "SELECTION: " );
SCANF( "%D", &INPUT );
SWITCH ( INPUT ) {
CASE 1: /* NOTE THE COLON, NOT A SEMICOLON */
PLAYGAME();
BREAK;
CASE 2:
LOADGAME();
BREAK;
CASE 3:
PLAYMULTIPLAYER();
BREAK;
CASE 4:
PRINTF( "THANKS FOR PLAYING!\N" );
BREAK;
DEFAULT:
PRINTF( "BAD INPUT, QUITTING!\N" );
BREAK;
}
GETCHAR();

}




This program will compile, but cannot be run until the undefined functions are

given bodies, but it serves as a model (albeit simple) for processing input.


If you do not understand this then try mentally putting in if statements for

the case statements. Default simply skips out of the switch case construction

and allows the program to terminate naturally.


If you do not like that, then you can make a loop around the whole thing to

have it wait for valid input.


You could easily make a few small functions if you wish to test the code.


No comments:

Post a Comment