Title: Savitch Progr
1Problem Solving with C The Object of Programming
Walter Savitch Chapter 2 C Basics Slides by
David B Teague, Western Carolina University a
constituent institution of The University of
North Carolina
2C Basics
- Variables and Assignments
- Input and Output
- Data Types and Expressions
- Simple Flow of Control
- Program Style
3C Basics 2.1 Variables and Assignments
- A C variable can hold a number or other types.
- A C variable ALWAYS has a value stored in it.
- A C variable is implemented as a memory
location. Information stored is binary -- 0s and
1s. -
- We do not need to know nor do we care what
address a particular variable occupies in memory.
4Names Identifiers
- The name of a variable (or anything else in C
that needs naming) is called an identifier. - An identifier must be spelled starting with a
letter or an underscore symbol (_) followed by
any number of letters, digits, or underscore
symbols. - Valid Examples x x_1 _abc A2b
ThisIsAVeryLongIdentifier - Invalid Examples 12 3X change myFirst.c
data-1 - Why are these invalid?
- There are identifiers that are reserved to the
use of the C language, called keywords, or
reserved words. (A complete list is in Appendix 1
of the text.)
5Names Identifiers
- Invalid Examples 12 3X change myFirst.c
data-1 - Why are these invalid?
- 12 , change, and 3x do not start with a letter
- myFirst.c has a . character that is not
permitted - data-1 contains a - character that is not
permitted. - Identifier Spelling Rule
- Identifiers must start with a letter or
underscore and have only letters, digits or
underscores after the first.
6Display 2.1 A C Program (1 of 2)
- include ltiostreamgt
- using namespace std
- int main( )
-
- int number_of_bars
- double one_weight, total_weight
- cout ltlt "Enter the number of candy bars in a
package\n" - cout ltlt "and the weight in ounces of one
candy bar.\n" - cout ltlt "Then press return.\n"
- cin gtgt number_of_bars
- cin gtgt one_weight
- total_weight one_weight number_of_bars
- cout ltlt number_of_bars ltlt " candy bars\n"
- cout ltlt one_weight ltlt " ounces each\n"
- cout ltlt "Total weight is " ltlt total_weight ltlt
" ounces.\n"
7Display 2.1 A C Program (2 of 2)
- cout ltlt "Try another brand.\n"
- cout ltlt "Enter the number of candy bars in a
package\n" - cout ltlt "and the weight in ounces of one
candy bar.\n" - cout ltlt "Then press return.\n"
- cin gtgt number_of_bars
- cin gtgt one_weight
- total_weight one_weight number_of_bars
- cout ltlt number_of_bars ltlt " candy bars\n"
- cout ltlt one_weight ltlt " ounces each\n"
- cout ltlt "Total weight is " ltlt total_weight ltlt
" ounces.\n" - cout ltlt "Perhaps an apple would be
healthier.\n" - return 0
-
8Variable Declarations
- Every variable in C must be declared.
- A declaration introduces a name to the compiler
and specifies the type of data that is to be
stored in the variable. - A variable declaration has the form
- Type_name variable_name1, variable_name2,
- Example
- double distance
- The kind of data held in a variable is it type.
- You must declare all variables prior to use.
9Assignment Statements
- total_weight one_weight number_of_bars
- In an assignment statement, the right hand side
expression is evaluated, then the variable on the
left hand side is set to this value. - Syntax variable expression
- distance rate time
- count count 2
10Pitfall Uninitialized Variables
- A variable that has not been set by your program
will have the value left there by the last
program to use the memory associated with that
variable. This is an UNINITIALIZED variable. It
contains garbage in the root sense of the word. - This is illegal and incorrect but few compilers
will catch this error.
11Variable initialization
- How do we prevent use of uninitialized variables?
- Take great care with your program that all
variables receive a value prior to fetching a
value from them. - Initialize your variables when they are declared.
- Syntax Two different appearing but equivalent
initializations - int x 3 double pi 3.14159
- int x(3) double pi(3.14159)
12Programming Tip
- Use meaningful variable names.
- Names that tie your programs code to the problem
being solved will make your code easier to read
and easier to debug. - Anything that you can do to make your code
readable is worth days in debugging time.
132.2 Input and OutputOutput using cout
-
- cout ltlt number_bars ltlt candy bars \n
- ltlt is the insertion operator
- It is illegal to break a string constant across
two lines. This is ILLEGAL, though some compilers
happily accept it. - cout ltlt Mary had a little lamb. Its fleece was
white as snow.\n
13
14Include Directories and Namespaces
- include ltiostreamgt
- using namespace std
- These lines provide declarations necessary to
make iostream library available. - C divides collections of names into namespaces.
To access names in a namespace, the second line
above, the using directive, is sufficient. It
means that your program can use any name in the
namespace std. - A C namespace usually contains more than just
names. They usually contain code as well. - Older compilers will require the older style,
ltiostream.hgt, and such compilers may not like the
using directive. If your compiler doesnt like
the using directive, just omit it. -
14
15Escape sequences
- The \ (backslash) preceeding a character tells
the compiler that the next character does not
have the same meaning as the character by itself. - An escape sequence is types as two characters
with no space between them. - \\ is a real backslash character, not the escape
character, a backslash that does not have the
property of changing the meaning of the next
character. - \n newline
- \t tab character (same as control-h)
- \a alert, or bell
- \ double quote (that does not end a string
literal).
16Formatting for Numbers with a Decimal Point
- The following statements will cause your floating
point output to be displayed with 2 places of
decimals and will always show the decimal point
even when the output has a zero fractional part. - cout.setf(iosfixed)
- cout.setf(iosshowpoint)
- cout.precision(2)
- //Output format78.50
17Input using cin
- When a program reaches a cin gtgt statement, it
waits for input. You are responsible for
prompting the user of your program for proper
input. - Syntax
- cin gtgt number gtgt size
- cin gtgt time_to_go
- gtgt points_needed
18Designing input and output
- Echoing your input is frequently requested by
problem statements. Even when not requested, it
is usually better to echo your input.
192.3 Data Type and ExpressionsThe types int and
double
- From the C point of view, 2 and 2.0 are very
different. - 2 has type int has no fractional part
- 2.0 has type double has a fractional part,
even - if the
fractional part is 0. - An int and a float are stored differently.
20Other Number types
- Memory
- Type used Range
Precision - short 2 bytes -32,767
NA - (a.k.a. short int) to 32,767
- int 4 bytes -2,147483,647
NA - to
2,147483,647 - long 4 bytes same as int
NA - float 4 bytes approximately
7 digits - 10-38
to 1038 - double 8 bytes approximately
15 digits -
10-308 to 10308 - long double 10 bytes approximately
15 digits -
10-4932 to 104932
21The Types char and bool
- Memory
- char is a special type that is designed to hold
single members of the ASCII character set. - Some vendors have extended ASCII character
encoding to include more characters than upper
and lower case letters, digits and punctuation.
(Notably IBM, on the PC, which has been adopted
in nearly all Microsoft software.) - cstring (from C) and string (from the Standard
Library) are for more than one char value. More
on these in a later chapter. - bool is a type that was added to C in the1995
Draft ANSI Standard. There are only two values
true and false. Almost all compilers support the
bool type.
22Display 2.3 The Type char
- include ltiostreamgt // Blank lines removed to
fit code to space available. - using namespace std
- int main( )
-
- char symbol1, symbol2, symbol3
- cout ltlt "Enter two initials, without any
periods\n" - cin gtgt symbol1 gtgt symbol2
- cout ltlt "The two initials are\n"
- cout ltlt symbol1 ltlt symbol2 ltlt endl
- cout ltlt "Once more with a space\n"
- symbol3 ' '
- cout ltlt symbol1 ltlt symbol3 ltlt symbol2 ltlt
endl - cout ltlt "That's all."
- return 0
-
23Arithmetic Operators and Expressions
- Common arithmetic operators are encoded
- Addition Multiplication
- Subtraction - Division /
- These operators are used to make arithmetic
expressions - one_weight number_of_weights
- This expression is said to return a value that
automagically appears where the expression is,
and is used in an outside expression. Here the
sum is done, value returned, and this value is
used as a factor in the multiplication. - one_weight (number_of_weights off_set)
- (See precedence, later in the text.)
-
24Automagically
- Automagically means automatically, as if by
magic.
25Arithmetic Operators and Expressions
- Arithmetic with and behaves as expected for
both integer and floating point types. - Arithmetic for / behaves as expected for floating
point numbers. - Arithmetic for / behaves in a somewhat surprising
way for integer types (short, int, long) - Division for integers is TRUNCATING - it discards
the fractional part.
26Arithmetic Operators and Expressionsdivision /,
and modulus , for integer values
- Division /, and modulus are complementary
operations. Mod, or modulus, , works ONLY for
integer types. - 4 12 / 3 is the
quotient - 3 12
- 12
- 0 12 3 12 mod 3
is the remainder - 4 14 / 3 quotient 3
THIS IS NOT 4.66 - 3 14
- 12
- 2 14 3 remainder
after dividion - See the PITFALL - Whole Number Division, page 70.
27Arithmetic Operators and ExpressionsPrecedence
- When two operators appear in an arithmetic
expression, there are PRECEDENCE rules that tell
us what happens. - Evaluate the expression,
- X Y Z
- by multiplying Y and Z first then the result is
added to X. - Rule Do inside most parentheses first, then
- multiplication and division next,
- additions and subtractions next, and
- break all ties left to right.
28Arithmetic Operators and ExpressionsStyle
- Always follow your instructors style
requirements. - Our suggestion is that in writing an expression,
you should write the expression with spaces
either side of the operator - We suggest this
- X Y Z
- but not this
- XYZ
- Always follow your instructors style
requirements.
292.4 Simple Flow of ControlA simple branching
mechanism
- Making decision in computer programs requires
changing the execution from next instruction next
to some other instruction next. This is called
flow of control. - There are two types of flow of control selection
and looping. - Looping repeats an action, and will be discussed
a later. - Selection chooses between alternative actions.
- Selection
- if (expression) Control Expression
returns a bool value - action1 Affirmative clause.
Executed if Expression is true - else
- action2 Negative clause.
Executed if Expression is false
30 Comparison Operators
- C provides comparison operators for making
decisions in computer programs. These operators
return a value of type bool true or false. - Math C C
Math - Symbol English Notation Sample
Equivalent
- equal to x 7
2 y x 7 2y - ? not equal to ! ans
! n ans ? n - lt less than lt count lt m 3
cout lt m 3 - ? less than lt time
lt limit time ? limit - or equal to
- gt greater than gt time gt
limit time gt limit - ? greater than gt age gt
21 age ? 21 - or equal to
31 Logical Operators
- The and operator
- Syntax
- (Comparison_1) (Comparison_2)
- Example, in an assignment to a bool variable
- bool in_range
- in_range (0 lt score) (10 lt score)
-
- The or operator
- Example -- in an if-else statement
- if ( (x 1) (x y) )
- cout ltlt x is 1 or x equals y. \n
- else
- cout lt x is neither 1 nor equal to y.\n
-
32PITFALL strings of inequalities
- Suppose x, y and z are integer values.
- if (x lt y lt x) // Unfortunately, this is
WRONG BUT IT COMPILES. - cout ltlt z is between x and y
- Here is why the expression is WRONG.
- In mathematics x lt y lt z is short hand for x lt y
y lt z. - In C, this is not true. It is still valid C,
but isnt what you expect from the mathematics.
In C the precedence rules require x lt y lt z be
evaluated like this - (x lt y) lt z
- The parenthesized expression returns a bool
value. The lt requires the same type on both
sides. The bool value gets converted to the int
value 0 (for false) or 1 (for true). Then 0 ltz
or 1 lt z compiles. And gives (most of the time) a
wrong answer!
33PITFALL using instead of
- if (x 12) // The
should have been - cout ltlt x is equal to 12
- else
- cout ltlt x is not equal to 12
- The second expression is NEVER executed,
regardless of the value of x before this
statement is encountered. - WORSE, after this if statement executes, the
expression x 12 HAS ASSIGNED the value 12 to
x. - Why? The expression x 12 returns the value 12,
which is converted to the bool value true, which
is used by the if. - Always write
- if (12 x) // Compiler will say 12 x
non-lvalue on left - cout ltlt x is equal to 12
- else
- cout ltlt x is not equal to 12
34Simple Loop Mechanisms
- Most programs include a mechanism to repeat a
block of code multiple times. 30 Students, 30
grades on each test, 100 workers, pay check
generator block runs 100 times. - C provides loops named
- while
- for
- do while
- The piece of code the loop executes is called the
body. - Each loop execution of the body is called an
iteration.
35Display 2.10 A while loop
- include ltiostreamgt
- using namespace std
- int main( )
-
- int count_down
- cout ltlt "How many greetings do you want? "
- cin gtgt count_down
- while (count_down gt 0)
-
- cout ltlt "Hello "
- count_down count_down - 1
-
- cout ltlt endl
- cout ltlt "That's all!\n"
- return 0
36Display 2.13 A do-while loop
- include ltiostreamgt
- using namespace std
- int main( )
-
- char ans
- do
-
- cout ltlt "Hello\n"
- cout ltlt "Do you want another greeting?\n"
- ltlt "Press y for yes, n for no,\n"
- ltlt "and then press return "
- cin gtgt ans
- while (ans 'y' ans 'Y')
- cout ltlt "Good-Bye\n"
- return 0
37Pitfall Stray semicolons
- Loop body with several statements
- while(bool expression) Do not put a
semicolon here -
This usually causes an - several statements infinite
loop. (Next section) -
- Loop body with one statement
- while(bool expression) Do not put a
semicolon here - statement This
usually causes an -
infinite loop.
38Pitfall Stray semicolons
- Loop body with several statements
- do
-
- several statements
- while(bool expression) Dont
forget the semicolon -
here. - Loop body with one statement
- do
- statement
- while(bool expression) Dont forget
the semicolon -
here.
39Increment and decrement operators
- C provides the and -- operators, each in
each of two forms, prefix and postfix. - The text, for good teaching reasons, leaves the
use of expressions using and -- to provide a
value until later. - For now, we use n as a synonym for n n 1
- and n-- for a synonym n n - 1
40PITFALL Infinite Loops
- Any loop in which the Boolean control expression
remains true will never terminate. A loop that
does not terminate is called an infinite loop. - Infinite loops are wrong, and worse, can be hard
to find. - Examples
- This loop terminates This is an
infinite loop - x 2 x 1
- while (x ! 12) while (x ! 12)
-
- cout ltlt x ltlt endl cout ltlt x ltlt endl
- x x 2 x x 2
-
- WHY?
41Display 2.14 Charge Card Program (1 of 2)
- include ltiostreamgt
- using namespace std
- int main( )
-
- double balance 50.00
- int count 0
- cout ltlt "This program tells you how long it
takes\n" - ltlt "to accumulate a debt of 100,
starting with\n" - ltlt "an initial balance of 50 owed.\n"
- ltlt "The interest rate is 2 per
month.\n"
42Display 2.14 Charge Card Program (2 of 2)
- while (balance lt 100.00)
-
- balance balance 0.02 balance
- count
-
- cout ltlt "After " ltlt count ltlt " months,\n"
- cout.setf(iosfixed)
- cout.setf(iosshowpoint)
- cout.precision(2)
- cout ltlt "your balance due will be " ltlt balance
ltlt endl - return 0
-
432.5 Programming Style Comments
- The most difficult part of any programming
language to learn to use properly is the comment.
- A comment should always tie the code to the
problem being solved. In some circumstances, a
comment could explain tricky code. (It is
better to write clear code and omit the comment.) - / comment in this style / may span more than
one line. - // these comments run from the // to the end of
the line. - The text uses the // style comments exclusively.
If you do this too, then you can use
/comments/ to comment out code while developing
programs.
44Indenting
- Indenting elements considered a group should be
indented to look like a group. - if-else, while, and do-while should be indented
as in the sample code. - The affirmative clause and negative clause of
if-else statements should be indented more than
surrounding code. - The body of loops should be indented more than
surrounding code. - CONSISTENCY of style is more important than any
particular style standard.
45Program header comments
- Comments should be placed at the start of the
program that describes the essential information
about the program - The file name
- The author
- The address or other means to contact the author
- The purpose of the program
- What the program does
- The date written or version number
46Naming Constants
- Avoid magic numbers! Use declared constants.
- Example
- If the tax rate is 4 (0.04) today, it will go
up. Make such numbers declared constants unless
you want to hunt through your code to find and
replace all instances of 0.04 and try to decide
if it is a tax rate, then replace it by the new
tax rate, 0.05. - Name declared constants with the const keyword.
- Spell declared constant names with upper case
letters, - with successive words separated by underscores.
- Example
- const int BRANCH_COUNT 10
- const double TAX_RATE 0.04
47Summary (1 of 2)
- Use meaningful name for variables.
- Check that variables have been declared before
use, and have the correct data type. - Be sure variables have been assigned a value
before use. This can be done by initialization at
definition, or by assigning a value before first
use. - Use enough parentheses to make the order of
operations clear. Remember, code is meant to be
read, which implies writing for an audience. - Always have your program prompt the user for
expected input. Always echo users input. - An if-else statement chooses between two blocks
of code to execute. An if statement chooses
whether to execute a block of code.
48Summary (2 of 2)
- A do-while always executes its body at least
once. A while loop may not execute its body at
all. - Almost all numeric constants should be given
meaningful names to be used instead of the
numbers. Use the const modifier to do this. - Use indenting, spacing, and line break patterns
similar to the sample code to group sections of
code such as the body of a while statement, or
the affirmative and negative clauses of an
if-else statement. - Insert commentary to explain major subsections of
your code, or to explain any unclear part of your
program. - Make your code clear. Remember, a program is
meant to be read by programmers, not just
compilers.