DataTypes

advertisement
C Data Types
Chapter 7
And other material
Representation

long (or int on linux)




Two’s complement
representation of
value.
4 bytes used.
(Where n = 32)
#include limits.h
INT_MIN
2
n 1
INT_MAX
 2
to
[ -2147483648, 2147483647]
n 1
1
Representation (cont.)

float
4 bytes used.
 #include float.h
On my machine, linux:

FLT_MIN=0.000000
FLT_MAX=340282346638528859811704183484516925440.000000
On my laptop, Windows Xp Pro:
FLT_MIN=0.000000
FLT_MAX=340282346638528860000000000000000000000.000000
Representation (cont.)

double
8 bytes used.
 #include float.h
On my machine, linux:

DBL_MIN=2.225074e-308
DBL_MAX=1.797693e+308
On my laptop, Windows Xp Pro:
DBL_MIN=2.225074e-308
DBL_MAX=1.797693e+308
C Scalar Types

Simple types





char
int
float
double
Scalar, because only one value can be
stored in a variable of each type.
Check Inside Your Program



Don’t depend on your assumptions for size.
Use the internal variables INT_MAX,
INT_MIN to verify what you believe to be
true.
Otherwise, you’ll overflow a variable.
i = INT_MAX;
printf(“%d %d\n”, i, i+1);
// What prints?
Check Inside Your Program



Don’t depend on your assumptions for size.
Use the internal variables INT_MAX,
INT_MIN to verify what you believe to be
true.
Otherwise, you’ll overflow a variable.
i = INT_MAX;
printf(“%d %d\n”, i, i+1);
2147483647 -2147483648
// What prints?
Numerical Inaccuracies
int sum = 0;
for(i=0; i<1000; i++) sum = sum + 1.55;
printf("sum 1.55 1000 times = %f\n", sum);
What prints?
Numerical Inaccuracies
float sum = 0.0;
What prints?
for(i=0; i<1000; i++) sum = sum + 1.55;
printf("sum 1.55 1000 times = %f\n", sum);
sum 1.55 1000 times = 1550.010864
???
Floating Point


Must contain a
decimal point (0.0,
12.0, -0.01)
Can use scientific
notation
12
1
.
1254
x
10
 1.1254e+12

-4.0932e-18
 4.0932 x10 18
char data type


One byte per character.
Collating sequence




‘a’ < ‘b’ < ‘c’ < ‘d’ < …
‘A’ < ‘B’ < ‘C’ < ‘D’ < …
‘0’ < ‘1’ < ‘2’ < ‘3’ < …
But ‘a’ < ‘A’ or ‘A’ < ‘a’ ??? Not for sure!
User Defined Types (typedef)



This is how you can expand the types
available to a particular program.
typedef type-declaration;
E.g. typedef int count;



Defines a new type named count that is
the same as int.
count flag = 0; <- legal
int flag = 0;
<- same as
User Defined Types (typedef)

Many more uses (later)
Enumerated Types



In the old days, we would make an
assignment like 1 means Monday, 2
means Tuesday, 3 means Wednesday…
But this way, you could have Sunday+1
and this would be meaningless.
A better way is using enumerated
types.
Enumerated Types (cont.)

Example:
typedef enum
{monday, tuesday, wednesday, thursday, friday,
saturday, sunday} DayOfWeek_t
• Some default identification for user defined types
• _t
• Explicitly specify the values!
Enumerated (cont.)






Now, you can define a new variable
DayOfWeek_t WeekDays;
WeekDays = monday;
<- legal
WeekDays = 12;
<- illegal
WeekDays = someday;
<- illegal
Now, internally, the computer associates
0,1,2,… with monday, tuesday,… But you
don’t have to worry!
Enumerated rules



Enumerated constants must be
identifiers, NOT numeric (1,3,-4),
character (‘s’, ‘t’, ‘p’), or string (“This is
a string”) literals.
An identifier cannot appear in more
than one enumerated type definition.
Relational, assignment, and even
arithmetic operators can be used.
Enumerated (cont.)




if(today == saturday)
tomorrow = sunday;
else
tomorrow =
(DayOfWeek_t)(today+1);
Enumerated (cont.)




for(today=monday;
today <= friday;
++today)
{…}
Passing a Function Name as a
Parameter



In C it is possible to pass a function
name as a parameter.
Gives the called function the ability to
do something using different functions
each time it’s called.
Let’s look at a simple example similar to
the evaluate example in the text.
E.G. Passing a function
#include <stdio.h>
#include <math.h>
double evaluate(double f( ), double);
int main (void)
{
double sqrtvalue, sinvalue;
sqrtvalue = evaluate(sqrt, 12.5);
printf("%f \n", sqrtvalue);
sinvalue = evaluate(sin, 0.5);
printf("%f \n", sinvalue);
}
double evaluate ( double f(double f_arg), double pt1)
{
return (f(pt1));
}
E.G. Passing a function
#include <stdio.h>
#include <math.h>
double evaluate(double f( ), double);
int main (void)
{
double sqrtvalue, sinvalue;
sqrtvalue = evaluate(sqrt, 12.5);
printf("%f \n", sqrtvalue);
sinvalue = evaluate(sin, 0.5);
printf("%f \n", sinvalue);
}
double evaluate ( double f(double f_arg), double pt1)
{
3.535534
return (f(pt1));
0.479426
}
E.G. Passing a function
#include <stdio.h>
#include <math.h>
double evaluate(double f( ), double);
int main (void)
{
double sqrtvalue, sinvalue;
sqrtvalue = evaluate(sqrt, 12.5);
printf("%f \n", sqrtvalue);
sinvalue = evaluate(sin, 0.5);
printf("%f \n", sinvalue);
}
double evaluate ( double f(double f_arg), double pt1)
{
3.535534
return (f(pt1));
0.479426
}
E.G. Passing a function
#include <stdio.h>
#include <math.h>
double evaluate(double f( ), double);
int main (void)
{
double sqrtvalue, sinvalue;
sqrtvalue = evaluate(sqrt, 12.5);
printf("%f \n", sqrtvalue);
sinvalue = evaluate(sin, 0.5);
printf("%f \n", sinvalue);
}
double evaluate ( double f(double f_arg), double pt1)
{
3.535534
return (f(pt1));
0.479426
}
Lab #6 : Trapezoidal Rule


Write a program to solve for the area
under a curve y = f(x) between the
lines x=a and x=b. (See figure 7.13 on
page 364.
Approximate this area by summing
trapezoids (Formed by a line from x0
vertical up to the function, to f(x0),
then straight line to f(x1), back down to
the x-axis, and left to original.)
Simple version of fig 7.13
y
(x1,y1)
(x2,y2)
y = f(x)
(x3,y3)
(x0,y0)
(x4,y4)
x0=a
x1
x2
x3
X4
n=4
x
Lab #6 : assumptions


Function is positive
over the interval
[a,b].
(for n subintervals of
length h) h=(b-a)/n
Trapezoidal rule is:
n 1
h
T  ( f (a)  f (b)  2 f ( xi ))
2
i 1
Lab #6 (cont.)


Write a function trap
with input
parameters a,b,n
and f that
implements the
trapezoidal rule.
Call trap with values
for n of
2,4,8,16,32,64, and
128 on functions
g ( x)  x 2 sin( x)
for(a  0, b  3.14159)
h( x)  4  x
2
for(a  2, b  2)
Lab #6 : (cont.)


Function h defines a half-circle of radius 2.
Compare your approximation to the actual
area of this half-circle.
Note: the trapezoidal rule approximates
b

a
f ( x)dx
Exam #1 On Wednesday








Closed Book!
One 8-1/2x11 paper, both sides allowed.
Sit with a space on either side of you.
Only 4 function calculators allowed.
Chapters 1-6.
Linux.
Makefiles.
Introduction to Pointers.
Download