Transcript C Basics

Programming in C
Variables, Controls, Arrays, Functions
Different Kinds of Languages

Java is an object-oriented programming (OOP) language
 Problem solving centers on defining classes that model “things” like
Trucks, Persons, Marbles, Strings, and CandyMachine
 Classes encapsulate data (instance variables) and code (methods)
C is a procedural language
 Problem solving centers on defining functions that perform a single
service like getValidInt( ), search( ) and inputPersonData( ).
 Data is global or passed to functions as parameters
 No classes
7/28/09
Libraries
• Because Java is an OOP language, its libraries consist of
predefined classes that you can use in your applications
– ArrayList, Scanner, Color, Integer
• Because C is a procedural language, its library consists of
predefined functions.
– Char/string functions (strcpy, strcmp)
– Math functions (floor, ceil, sin)
– Input/Output functions (printf, scanf)
• On-line C/Unix manual -- the “man” command
– Description of many C library functions and Unix commands
– Usage: man <function name> for C library functions
or man <command name> for Unix commands
• man printf
• man dir
– Search for applicable man pages using the “apropos”
command or “man -k”
– Learn to use the man command using “man man”
7/28/09
The C Standard
• The first standard for C was published by the American
National Standards Institute (ANSI) in 1989 and is widely
referred to as “ANSI C” (or sometimes C89)
• A slightly modified version of the ANSI C standard was
adopted in 1990 and is referred to as “C90”. “C89" and
"C90" refer to essentially the same language.
• In March 2000, ANSI adopted the ISO/IEC 9899:1999
standard. This standard is commonly referred to as C99,
and it is the current standard for the C programming
language.
• The C99 standard is not fully implemented in all versions of
C compilers.
7/28/09
C99 on GL
• The GNU C compiler on the GL systems (gcc
version 4.1.2) appears to support several useful
C99 features.
• These notes include those C99 features
supported by gcc on GL since our course use
that compiler.
• These features will be noted as C99 features
when presented.
7/28/09
Hello World
This source code is in a file such as hello.c
/*
file header block comment
*/
#include <stdio.h>
int main( )
{
// print the greeing ( C99 )
printf( “Hello World\n”);
return 0;
}
7/27/10
Compiling on Unix
Traditionally the name of the C compiler that comes
with Unix is “cc”.
The UMBC GL systems use the “GNU Compiler
Collection” named “gcc” for compiling C (and
C++) programs.
The default name of the executable program that is
created by gcc is a.out
unix>
7/28/09
gcc hello.c
Compiler Options
• -c
– Compile only (create a .o file), don’t link (create an executable)
gcc -c hello.c
• -o filename
– Name the executable filename instead of a.out
gcc -o hello hello.c
• -Wall
– Report all warnings
gcc -Wall hello.c
• Use them together
gcc -Wall -o hello hello.c
• Note: the -ansi switch enforces the original ANSI C
standard and disables C99 features.
1/13/10
Compiling and Running
a C Program
unix> gcc -Wall -o hello hello.c
printf.o
hello.c
Source
program
(text)
Prehello.i
processor
(cpp)
Modified
source
program
(text)
Compiler hello.s Assembler hello.o
(cc1)
(as)
Assembly
program
(text)
Relocatable
object
programs
(binary)
Linker
(ld)
hello
Executable
object
program
(binary)
Execute your program by typing the name of the executable
at the Unix prompt
unix> hello
7/28/09
Language Commonality
• C and Java syntax have much in common
–
–
–
–
–
Some Data Types
Arithmetic operators
Logical Operators
Control structures
Other Operators
• We assume that you are proficient in Java
7/28/09
Integral Data Types
• C data types for storing integer values are
– int (the basic integer data type)
– short int (typically abbreviated just as short)
– long int (typically abbreviated just as long)
– long long int (C99)
– char (C does not have “byte”)
• int should be used unless there’s a very good
reason to use one of the others
• char is stored in 1 byte
• The number of bytes used by the other types
depends on the machine being used
7/26/10
Integral Type Sizes
• The C standard is specifically vague regarding
the size of the integral types
– A short int must not be larger than an int.
– An int must not be larger than a long int.
– A short int must be at least 16 bits long.
– An int must be at least 16 bits long.
– A long int must be at least 32 bits long.
– A long long int must be at least 64 bits long.
• The standard does not require that any of these
sizes be necessarily different.
7/27/10
Integral Specifiers
• Each of the integral types may be specified as
either
– signed (positive, negative, or zero)
– unsigned (positive or zero only)
• signed is the default qualifier
• Much more on this later
7/26/10
Integral Variables
• Each of the following is a valid variable
declaration
int age = 42;
signed int age = -33;
long area = 123456;
short int height = 4;
unsigned char IQ = 102;
unsigned int length = 8282;
unsigned long int SATscore = 800;
7/28/09
Floating Point Data Types
• C data types for storing floating point values
(those with a decimal part) are
– float, the smallest floating point type
– double, a larger type with a larger range of values
– long double, an even larger type with an even large
range of values
• double is typically used for all floating point
values unless there’s a compelling need to use
one of the others
• Floating point variables may store integer values
7/26/10
Size of Floating Point Type
• A double variable can be marked as being a long
double, which the compiler may use to select a
larger floating point representation than a plain
double.
• The standard is unspecific on the relative sizes of
the floating point values, and only requires a
float not to be larger than a double, which
should not be larger than a long double.
7/28/09
Floating Point Declarations
• Each of the following is a valid floating point
variable declaration
float avg = 10.6;
double median = 88.54;
double homeCost = 10000;
7/28/09
Character Data Types
• C has just one data type for storing characters
– char, which is just one byte
• Because a char is just one byte, C only supports
the ASCII character set (more on this later)
7/28/09
sizeof( )
• Because the sizes (number of bits/bytes) of the C
data types are vaguely specified, C provides the
sizeof( ) operator to determine the size of any
data type (in bytes).
• sizeof( ) should be used everywhere the size
of a data type is required so that your code is
portable to other hardware on which the size of
the data types may be different.
• On GL,
–
–
–
–
–
sizeof( short ) = 2
sizeof( int ) = sizeof( long ) = 4
sizeof (long long) = 8
sizeof( float ) = 4
sizeof( double ) = 8
const Qualifier
• Any of the variable types found above may be
qualified as const.
• const variables may not be modified by your
code. Any attempt to do so will result in a
compiler error.
• Since they may not be modified, const variables
must be initialized when declared
const double PI = 3.1415;
const int myAge = 39;
7/28/09
Variable Declaration
• ANSI C requires that all variables be declared at
the beginning of the “block” in which they are
defined, before any executable line of code.
• C99 allows variables to be declared anywhere in
the code (like Java and C++)
• In any case, variables must be declared before
they can be used.
7/28/09
Arithmetic Operators
Arithmetic operators are the same
= is used for assignment
+, -, (plus, minus)
*, /, % (times, divide, mod)
++, -- (increment, decrement (pre and post))
Combinations are the same
+=, -=, (plus equal, minus equal)
*=, /=, %= (times equal, divide equal, mod equal)
 Arithmetic Practice
 Assignment Practice
7/28/09
Boolean Data Type
• ANSI C has no Boolean type
• The C99 standard supports the Boolean data type
• To use bool, true, and false, your code must
include <stdbool.h>
#include <stdbool.h>
bool isRaining = false;
if ( isRaining )
printf( “Bring your umbrella\n”);
7/28/09
Logical Operators
Logical operators are the same in C and Java and result in a
Boolean value.





&& (and)
|| (or)
==, != (equal and not equal)
<, <= (less than, less than or equal)
>, >= (greater than, greater than or equal)
• Integral types may also be treated as Boolean expressions
– Zero is considered “false”
– Any non-zero value is considered “true”
 Boolean Logic Practice
7/28/09
Control Structures
Both languages support these control structures
which function the same way in C and Java
 for loops
 But NOT -- for (int i = 0; i < size; i++)
 while loops
 do-while loops
 switch statements
 if and if-else statements
 braces ( {, } ) are used to begin and end blocks
 Loop Practice
7/28/09
Other Operators
These other operators are the same in C and Java
 ?: (tri-nary “hook colon”)
int larger = (x > y ? x : y);




<<, >>, &, |, ^ (bit operators*)
<<=, >>=, &=, |=,^=
[ ] (brackets for arrays)
( ) parenthesis for functions and type casting
*much more on these later
7/28/09
Arrays
• Like most languages, C supports arrays as a
basic data structure.
• Array indexing starts with 0.
• ANSI C requires that the size of the array be a
constant (if specified)
• Declaring and initializing arrays
int grades[44];
int areas[10] = {1, 2, 3};
long widths[12] = {0};
int IQs[ ] = {120, 121, 99, 154};
7/28/09
Variable Size Arrays
• C99 allows the size of an array to be a variable
int nrStudents = 30;
...
int grades[nrStudents];
7/28/09
2-D Arrays
• Like most languages, C supports multidimensional array
• Subscripting is provided for each dimension
• For 2-d arrays, the first dimension is the number
of “rows”, the second is the number of
“columns” in each row
int board[ 4 ] [ 5 ];
// 4 rows, 5 columns
int x = board[ 0 ][ 0 ]; // 1st row, 1st column
int y = board[ 3 ][ 4 ]; // 4th (last) row, 5th (last) column
7/28/09
#defines
• The #define directive can be used to give names to
important constants in your code. This makes your code
more readable and more easily changeable.
• The compiler’s preprocessor replaces every instance of the
#define name with the text that it represents.
• Note that there is no terminating semi-colon
#define MIN_AGE 21
...
if (myAge > MIN_AGE)
...
#define PI 3.1415
...
double area = PI * radius * radius;
...
1/13/10
#define vs const
• #define
– Pro: no memory is used for the constant
– Con: cannot be seen when code is compiled since they
are removed by the pre-compiler
– Con: are not real variables and have no type
• const variables
– Pro: are real variables with a type
– Pro: can be examined by a debugger
– Con: take up memory
7/28/09
typedefs
• C allows you to define new names for existing
data types (NOT new data types)
• This feature can be used to give applicationspecific names to simple types
typedef int Temperature;
typedef int[3] Row;
• Or to give simple names to complex types
- more on this later
• Using typedefs makes future changes easier
and makes the code more relevant to the
application
1/13/10
Enumeration Constants
• C provides the enum as a list of named constant integer
values (starting a 0 by default)
• Behave like integers
• Names in enum must be distinct
• Often a better alternative to #defines
• Example
enum months { JAN = 1, FEB, MAR, APR, MAY, JUN,
JUL, AUG,
...
enum months
thisMonth =
thisMonth =
7/28/09
SEP, OCT, NOV, DEC };
thisMonth;
SEP;
// ok
42;
// unfortunately, also ok
Functions vs. Methods
• Java classes include methods which can be called from any code
with appropriate access (recall public methods)
• C functions are like Java methods, but they don’t belong to any
class. Functions are defined in a file and may be either global to
your program or local to the file in which they are defined*.
• Like Java methods, C functions
– Have a name
– Have a return type
– May have parameters
*more on this later
7/28/09
More Functions
• Before a function may be called, its “prototype” (aka
signature -- name and parameters) must be known to the
compiler so that it can verify that your code is calling the
function correctly.
• This is accomplished in one of two ways
– Provide the entire function definition prior to the calling code
– Provide the function prototype prior to the calling code and
provide the function definition elsewhere
• Unlike Java methods, a function in C is uniquely identified
by its name. Therefore, there is no concept of method
overloading in C as there is in Java. There can be only one
main( ) function in a C application.
• Our standards dictate that function names begin with and
UPPERCASE letter
7/28/09
A Simple C Program
#include <stdio.h>
typedef double Radius;
#define PI 3.1415
/* given the radius, calculates the area of a circle */
double CircleArea( Radius radius )
{
return ( PI * radius * radius );
}
// given the radius, calcs the circumference of a circle
double Circumference( Radius radius )
{
return (2 * PI * radius );
}
int main(
{
Radius
double
double
7/27/10
}
)
radius = 4.5;
area = circleArea( radius );
circumference = Circumference( radius );
// print the results
return 0;
Alternate Sample
#include <stdio.h>
typedef double Radius;
#define PI 3.1415
/* function prototypes */
double CircleArea( Radius radius );
double Circumference( Radius radius );
int main( )
{
Radius radius = 4.5;
double area = circleArea( radius );
double circumference = Circumference( radius );
// print the results
return 0;
}
/* given the radius, calculates the area of a circle */
double CircleArea( Radius radius )
{
return ( PI * radius * radius );
}
// given the radius, calcs the circumference of a circle
double Circumference( Radius radius )
{
return (2 * PI * radius );
}
7/28/09
Typical C Program
includes
#include <stdio.h>
typedef double Radius;
#define PI 3.1415
defines, typedefs, data
type definitions, global
variable declarations
function prototypes
/* function prototypes */
double CircleArea( Radius radius );
double Circumference( Radius radius );
int main( )
{
Radius radius = 4.5;
double area = circleArea( radius );
double circumference = Circumference( radius );
// print the results
return 0;
}
main()
function definitions
7/28/09
/* given the radius, calculates the area of a circle */
double CircleArea( Radius radius )
{
return ( PI * radius * radius );
}
// given the radius, calcs the circumference of a circle
double Circumference( Radius radius )
{
return (2 * PI * radius );
}