Sie sind auf Seite 1von 46

CS F111

Lab 4:
Input/Output
Arithmetic Expressions
Advanced Output Formatting
• A few of many other things you can do:
– Control number of decimals
• 3.1 vs 3.100000
– Exponential (scientific) or decimal notation
• 3.1 vs 3.1E0
– Control total width (including spaces)
• _______3.1 vs __3.1

2
Output Format Examples

• %10.2f ____123.55 float


• %10.4f __123.5500
• %.2f 123.55
• %10d _______475 int
• %-10d 475_______
• %10c _________a char

3
Output Expressions
•Basic rule:
–% placeholders in the format must match variables
in the input list
– MUST! match on for-one in number, order, and
type.

int studentID ;
double grade ;
scanf (“%d %lf”, &studentID , &grade ) ;

4
Multiple Inputs

What happens if types don’t match?

printf -- garbled output


scanf -- unpredictable errors
and don’t forget the &

5
Exercise: print the values of a and b.
scanf(“%d %d”,a,b);
scanf(“ %d %d”,&a,&b);
scanf(“%d %d”,&a,&b);
scanf(“%d %d ”,&a,&b);
scanf(“%d %d ”,&a,&b);
scanf(“%d %d”,&a,&b,&c);
scanf(“%d %d”,&b);
scanf(“%d %d \n”,&a,&b);
scanf(“hello %d %d”,&a,&b);
scanf(“%d%d”,&a,&b);
scanf(“%f %f”,&a,&b);
Exercise: to study formatted input
int a,b,d; char c;
scanf(“%2d %5d”,&a &b);
printf(“%d %d\n”,a,b);

i/p 50 31426
o/p 50 31426

 i/p 31426 50
o/p 31 426
scanf(“%d ”,&d); /*What if there is this line: second input*/

scanf(“%d”,&c); /* c is char variable */


printf(“%d\n”,c);
i/p 25
o/p 50
Exercise: to study formatted input
scanf(“%d %*d %d”,&a, &b);
printf(“%d %d”,a,b);
i/p 123 456 789
o/p 123 789
printf(“%11.4e”,-a); /* “%w.p e” what should
be the minimum difference
w-p ?
*/
Whitespace
• space (‘ ’), tab (‘\t’), newline (‘\n’) are
“whitespace”

• Whitespace is skipped by scanf for int (“%d”),


and double (“%lf”)
– This means the user can type spaces before
a number and they are ignored

• Not skipped for char input “%c”


– each character typed, including spaces, is
used

9
Reading single characters
• Another important pair of functions for keyboard
input/output is getchar/putchar
• getchar reads a single character
• putchar writes a single character

#include <ctype.h>
char c;
c = getchar(); /* blocks until data is entered
if more than one char is entered only
first is read */
putchar(c); /* prints value of c to screen */
• Arithmetic expressions
• Integer and floating-point (double)
types
• Unary and binary operators
• Precedence
• Associativity
• Conversions and casts
• Symbolic constants
11
Why Study Expressions?
We need precise rules that define exactly what an
expression means:
What is the value of 4 - 4 * 4 + 4?

Arithmetic on a computer may differ from everyday


arithmetic or math:
(1.0 / 9.0) * 9.0 could be 0.99999998213

2 / 3 is zero in C, not .667 (!)


Assignment Statement: Review

double area, radius;


area = 3.14 * radius * radius;

assignment statement expression


Execution of an assignment statement:
Evaluate the expression on the right hand side
Store the value of the expression into the variable
named on the left hand side
Expressions
Expressions are things that have values
A variable by itself is an expression: radius
A constant by itself is an expression: 3.14
Often expressions are combinations of variables,
constants, and operators.

area = 3.14 * radius * radius;

14
Expression Evaluation
Some terminology:
– Data or operand means the integer or
floating-point constants and/or variables in
the expression.
– Operators are things like addition,
multiplication, etc.
• The value of an expression will depend on the
data types and values and on the operators
used
– Additionally, the final result of an
assignment statement will depend on the
type of the assignment variable.

15
Arithmetic Types: Review
C provides two different kinds of numeric values
• Integers (0, 12, -17, 142)
Type int
Values are exact
Constants have no decimal point or exponent

• Floating-point numbers (3.14, -6.023e23)


Type float, double
Values are approximate (12-14 digits precision typical)
Constants must have decimal point and/or exponent

16
Operator Jargon
• Binary: operates on two operands
• 3.0 * b
• zebra + giraffe
• Unary: operates on one operand
• -23.4
• C operators are unary or binary
• Puzzle: what about expressions like a+b+c?
– Answer: this is two binary ops, in sequence

17
Expressions with doubles
•Constants of type double:
–0.0, 3.14, -2.1, 5.0, 6.02e23, 1.0 3
–not 0 or 17
•Operators on doubles:
–unary: -
–binary: +, -, *, /
–Note: no exponentiation operator in C

18
Example Expressions with doubles
•Declarations
• double height, base, radius, x, c1, c2;

•Sample expressions (not statements):


• 0.5 * height * base
• ( 4.0 / 3.0 ) * 3.14 * radius * radius * radius
• - 3.0 + c1 * x - c2 * x * x

19
Expressions with ints
•Constants of type int:
–0, 1, -17, 42
–not 0.0 or 1e3
•Operators on ints:
–unary: -
–binary: +, -, *, /, %

20
int Division and Remainder
•Integer operators include integer division and
integer remainder:
• symbols / and %

•Caution: division looks like an old friend, but


there is a new wrinkle!

2 rem 99
1
100 ) 299
200
99

21
int Division and Remainder
/ is integer division: no remainder, no rounding
299 / 100
6/4
5/6
2
1
0

% is mod or remainder:
299 % 100 99
6%4 2
5%6 5
22
Expressions with ints:
Time Example
•Given: total_minutes 359
•Find: hours 5
• minutes 59

•Solution in C:
hours = total_minutes / 60 ;
minutes = total_minutes % 60 ;

23
A Cautionary Example
•int radius;
•double volume;
•double pi = 3.141596;
•volume = ( 4/3 ) * pi * radius *radius * radius;

24
Why Use ints? Why
Not doubles Always?
Sometimes only ints make sense
the 15th spreadsheet cell, not the 14.997th cell
Doubles may be inaccurate representing “ints”
In mathematics 3 • 15 • (1/3) = 15
But, 3.0 * 15.0 * (1.0 / 3.0) might be 14.9999997
Last, and least
operations with doubles is slower on some
computers
doubles often require more memory

25
Resolving Complex Expressions
• C has precedence, associativity rules it uses to
determine the order operators are evaluated
• Precedence: some operators are executed
before others
• Associativity: when more than one operator in
an expression has the same precedence then
associativity rules are used to order
Order of Evaluation
•Precedence determines the order of evaluation
of operators.
•Is a + b * a - b equal to ( a + b ) * ( a - b ) or
a + ( b * a ) - b ??
And does it matter?
•Try this:
• 4+3*2-1

(4 + 3) * (2 - 1) = 7

4 + (3 * 2) - 1 = 9

27
Operator Precedence Rules
Precedence rules:
–1. do ( )’s first, starting with innermost
–2. then do unary minus (negation): -
–3. then do “multiplicative” ops: *, /, %
–4. lastly do “additive” ops: binary +, -

28
Precedence Isn’t Enough
•Precedence doesn’t help if all the operators have
the same precedence
•Is a / b * c equal to
• a / ( b * c ) or ( a / b ) * c ??
•Associativity determines the order among
consecutive operators of equal precedence
•Does it matter? Try this: 15 / 4 * 2

29
Associativity Matters

•Associativity determines the order among


consecutive operators of equal precedence
•Does it matter? Try this: 15 / 4 * 2
• (15 / 4) * 2 = 3 * 2 = 6
• 15 / (4 * 2) = 15 / 8 = 1

30
Associativity Rules
•Most C arithmetic operators are “left
associative”, within the same precedence
level
• a / b * c equals (a / b) * c
• a + b - c + d equals ( ( a + b ) - c ) + d

•C also has a few operators that are right


associative.
•HW- Which are they?

31
The Full Story...
• C has about 50 operators & 18 precedence
levels…
• A "Precedence Table" shows all the operators,
their precedence and associativity.

– Look in any C reference manual


• When in doubt: check the table
• When faced with an unknown operator: check
the table

32
Precedence Table
Highest on top
++ -- (Postfix)
++ -- (Prefix)
* / %
+ -
<< >>
< >
&
|
&&
33
||
Precedence and
Associativity: Example
•Mathematical formula:
________
- b +  b2 - 4 a c
----------------------
2a

#include <math.h>
(- b + sqrt ( b * b - 4.0 * a * c) ) / ( 2.0 * a )

Compiling requires
gcc squareroot.c -lm
34
Depicting Expressions
b * b - 4.0 * a * c
2.5 2.5 -1.0 15.2
* *
6.25 -4.0
*
-60.8
-
67.05

35
Mixed Type Expressions

•What is 2 * 3.14 ?
•Compiler will implicitly (automatically) convert int to double
when they occur together:
•int + double double + double (likewise -, *, /)

•2*3 * 3.14 (2*3) * 3.14 6 * 3.14 6.0 * 3.14 18.84


•2/3 * 3.14 (2/3) * 3.14 0 * 3.14 0.0 * 3.14 0.0

• Strongly recommend you avoid mixed types:


e.g., use 2.0 / 3.0 * 3.14 instead.
36
Promotion Hierarchy
double • Operands of the lower type
can be implicitly converted to
float
the higher type
long int • Occurs when an operator
int
expects the higher type
(adding together two floats
short when one is an int)
char
Conversions in Assignments
•int total, count, value;
•double avg;
•total = 97 ; count = 10;
•avg = total / count ; /*avg is 9.0!*/
•value = total*2.2; /*bad news*/

implicit
implicit
conversion to
conversion to int
double
– drops fraction
with no warning
38
Explicit Conversions: cast
Use a cast to explicitly convert the result of an
expression to a different type
Format: (type) expression
Examples (double) myage
(int) (balance + deposit)
This does not change the rules for evaluating the
expression itself (types, etc.)
Good style, because it shows the reader that the
conversion was intentional, not an accident

39
Using Casts
•int total, count ;
•double avg;
•total = 97 ; count = 10 ;

• /* explicit conversion to double (right way)*/
•avg = (double) total / (double) count); /*avg is 9.7 */

/* explicit conversion to double (wrong way)*/

avg = (double) (total / count) ;


/*avg is 9.0*/

40
#define - Symbolic Constants

•Named constants:
•#define PI 3.14159265
•#define HEIGHT 50
•#define WIDTH 80
•#define AREA (HEIGHT * WIDTH)
–...
•circle_area = PI * radius * radius ;
•volume = length * AREA;
Note: = and ; are not used for #define
() can be used in #define

41
Why #define?
Centralize changes
No "magic numbers" (unexplained constants)
use good names instead
Avoid typing errors
Avoid accidental assignments to constants

double pi ; vs.
pi = 3.14 ; #define PI 3.14
... ...
pi = 17.2 ; PI = 17.2 ; syntax error

42
Types are Important
•Every variable, value, and expression in C has a type
•Types matter - they control how things behave (results of
expressions, etc.)
•Lots of cases where types have to match up
•Start now: be constantly aware of the type of everything in
your programs!

43
Advice on Writing Expressions
• Write in the clearest way possible to help the reader
• Keep it simple; break very complex expressions into
multiple assignment statements
• Use parentheses to indicate your desired precedence
for operators when it is not clear
• Use explicit casts to avoid (hidden) implicit
conversions in mixed mode expressions and
assignments
• Be aware of types

44
Home Work
•Meaning of
– Syntax
– Semantics of a programming language
•Find the Output:
– value=value++ + value++;
– value=++value + ++value;
– value=value++ + ++value;

45
Does Terminology Matter?
Lots of new terminology today!
"variable", "reserved word", "initialization",
"declaration", “statement”, "assignment", etc.,
etc.
You can write a complicated program without using
these words
But you can't talk about your programs without
them!
Learn the exact terminology as you go, and get in the
habit of using it.

C-46

Das könnte Ihnen auch gefallen