Thursday, May 7, 2009

ANSWER NO. I.1-I.4

I.1: What is a local block?

Answer:

  • A local block is any portion of a C program that is enclosed by the left brace ({) and the right brace (}).
  • A C function contains left and right braces, and therefore anything between the two braces is contained in a local block.
  • An if statement or a switch statement can also contain braces, so the portion of code between these two braces would be considered a local block.
  • Additionally, you might want to create your own local block without the aid of a C function or keyword construct. This is perfectly legal.
  • Variables can be declared within local blocks, but they must be declared only at the beginning of a local block. Variables declared in this manner are visible only within the local block.
  • Duplicate variable names declared within a local block take precedence over variables with the same name declared outside the local block.
  • Here is an example of a program that uses local blocks:


     

#include <stdio.h>

void main(void);

void main()

{

/* Begin local block for function main() */

int test_var = 10;

printf("Test variable before the if statement: %d\n", test_var);

if (test_var > 5)

{

/* Begin local block for "if" statement */

int test_var = 5;

printf("Test variable within the if statement: %d\n",test_var);

{

/* Begin independent local block (not tied to

any function or keyword) */

int test_var = 0;

printf(

"Test variable within the independent local block:%d\n",test_var);

}

/* End independent local block */

}

/* End local block for "if" statement */

printf("Test variable after the if statement: %d\n", test_var);

}

/* End local block for function main() */

  • This example program produces the following output:

Test variable before the if statement: 10

Test variable within the if statement: 5

Test variable within the independent local block: 0

Test variable after the if statement: 10

  • Notice that as each test_var was defined, it took precedence over the previously defined test_var. Also notice that when the if statement local block had ended, the program had reentered the scope of the original test_var, and its value was 10.


     

I.2: Should variables be stored in local blocks?

Answer:

  • The use of local blocks for storing variables is unusual and therefore should be avoided, with only rare exceptions.
  • One of these exceptions would be for debugging purposes, when you might want to declare a local instance of a global variable to test within your function.
  • You also might want to use a local block when you want to make your program more readable in the current context.
  • Sometimes having the variable declared closer to where it is used makes your program more readable.
  • However, well-written programs usually do not have to resort to declaring variables in this manner, and you should avoid using local blocks.

I.3: When is a switch statement better than multiple if statements?

Answer:

  • A switch statement is generally best to use when you have more than two conditional expressions based on a single variable of numeric type.
  • For instance, rather than the code

    if (x == 1)

    printf("x is equal to one.\n");

    else if (x == 2)

    printf("x is equal to two.\n");

    else if (x == 3)

    printf("x is equal to three.\n");

    else

    printf("x is not equal to one, two, or three.\n");


     

    • the following code is easier to read and maintain:

    switch (x)

    {

    case 1: printf("x is equal to one.\n");

    break;

    case 2: printf("x is equal to two.\n");

    break;

    case 3: printf("x is equal to three.\n");

    break;

    default: printf("x is not equal to one, two, or three.\n");

    break;

    }

  • Notice that for this method to work, the conditional expression must be based on a variable of numeric type in order to use the switch statement.
  • Also, the conditional expression must be based on a single variable.
  • For instance, even though the following if statement contains more than two conditions, it is not a candidate for using a switch statement because it is based on string comparisons and not numeric comparisons:

char* name = "Lupto";

if (!stricmp(name, "Isaac"))

printf("Your name means 'Laughter'.\n");

else if (!stricmp(name, "Amy"))

printf("Your name means 'Beloved'.\n ");

else if (!stricmp(name, "Lloyd"))

printf("Your name means 'Mysterious'.\n ");

else

printf("I haven't a clue as to what your name means.\n");


 

I.4: Is a default case necessary in a switch statement?

Answer:

  • No, but it is not a bad idea to put default statements in switch statements for error- or logic-checking purposes.
  • For instance, the following switch statement is perfectly normal:

switch (char_code)

{

case 'Y':

case 'y': printf("You answered YES!\n");

break;

case 'N':

case 'n': printf("You answered NO!\n");

break;

}

  • Consider, however, what would happen if an unknown character code were passed to this switch statement.
  • The program would not print anything. It would be a good idea, therefore, to insert a default case where this condition would be taken care of:

default: printf("Unknown response: %d\n", char_code);

break;

  • Additionally, default cases come in handy for logic checking.
  • For instance, if your switch statement handled a fixed number of conditions and you considered any value outside those conditions to be a logic error, you could insert a default case which would flag that condition.
  • Consider the following example:

void move_cursor(int direction)

{

switch (direction)

{

case UP: cursor_up();

break;

case DOWN: cursor_down();

break;

case LEFT: cursor_left();

break;

case RIGHT: cursor_right();

break;

default: printf("Logic error on line number %ld!!!\n",__LINE__);

break;

}

}