+ All Categories
Home > Documents > Gramming An Introduction to C Programming (assuming that you already know Java; this is not an...

Gramming An Introduction to C Programming (assuming that you already know Java; this is not an...

Date post: 18-Jan-2018
Category:
Upload: holly-curtis
View: 220 times
Download: 0 times
Share this document with a friend
Description:
Java’s main public static void main ( String args[] ) { }
50
An Introduction to C Pro gramming gramming (assuming that you already know Java; this is not an introduction to C++)
Transcript
Page 1: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

An Introduction to C Programminggramming

(assuming that you already know Java;this is not an introduction to C++)

Page 2: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

Minimal C programgramint main ( int argc, char** argv ) {

return 0; //comment just like Java}

Or

int main ( int argc, char* argv[] ) {return 0; /* comment just like Java */

}

Or (typically, you aren’t going to change them)

int main ( const int argc, const char* const argv[] ) {return 0;

}

What does main look like in Java? What is used as ‘const’ in Java?

Page 3: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

Java’s main

public static void main ( String args[] ) {

}

Page 4: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

C vs. Java types• C

– doesn’t init vars (with a few exceptions)

– bool, char, short, int, long

– float, double– unsigned char– unsigned short– unsigned int– long long– long double

• Java– does init vars

(specifically objects which are defined to be an instance of a class OR arrays; primitive types are NOT initialized and require initialization)

– boolean, byte, short, int, long

– float, double

Page 5: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

ASCII output in C (using the standard I/O library)#include <stdio.h> //needed for defns

int main ( int argc, char* argv[] ) {puts( “hello, world.” );printf( “hello, world.” );printf( “hello, world.\n” );return 0;

}

Page 6: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

ASCII output in C#include <stdio.h> //header file w/ definitions

int main ( int argc, char* argv[] ) {printf( “hello, %s. \n”, “fred” );

int i = 12;printf( “I am %d years old. \n”, i );

double d = 12.9;printf( “d is equal to %f (d is not equal to %d). \n”,d, d );

return 0;}

How can d be both %f and %d?

Page 7: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

ASCII file output in C (using the standard I/O library)

#include <assert.h>#include <stdio.h>

int main ( int argc, char* argc[] ) {//open the file for output (erase anything already there!)FILE* fp = fopen( “fred.dat”, “wb” );assert( fp!=NULL );//write to the filefprintf( fp, “hello, world.\n” );//close the filefclose( fp );fp = NULL;return 0;

}

Hint: Always open b/binary or binary I/O will act strangely under Windows.

Page 8: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

ASCII file I/O format specs• %d – an int• %c – a char• %x – an int in hex• %f – a double• %s – string• Many, many, many others and

variations.

Page 9: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

Binary file output in C

• We will discuss binary file I/O after we discuss pointers.

• We will discuss input after we discuss pointers as well.

Page 10: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

I/O in C

• printf, scanf, gets, and puts perform buffered I/O (to stdin and stdout).

• fopen, fread, fwrite, fprintf, fseek, fscanf, fgets, fputs, and fclose perform buffered I/O.

• open, read, write, seek, and close perform unbuffered I/O.

Page 11: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

C pointers int i=12;

– i is a variable. It exists in some memory location. At that memory location is the value of 12.

– What is the size of i (in bytes)?printf( “An int is %d bytes. \n”, sizeof(int) );printf( “i=%d, i occupies %d bytes. \n”,

i, sizeof(i) );– What is the virtual address of i, i.e.,

where is i in memory?

Page 12: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

C pointers

Let’s introduce an operator (&) that yields the address of a variable.

int i = 12;printf( “the address of i is %d. \n”, &i );printf( “the address of i is %x. \n”, &i );

Page 13: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

C pointers

How do we declare variables that hold pointers (instead of values)?

int i=12, j=52;int* ptr = &i; //ptr points to iptr = &j; //ptr now points to j

Page 14: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

C pointers

Derefencing pointers (getting at what they point to):

int i = 12;int* iptr = &i;printf( “i=%d, *iptr=%d. \n”, i, *iptr );

Is *iptr the same as iptr?

Page 15: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

C pointers

Derefencing pointers (getting at what they point to):

int i = 12;int* iptr = &i;*iptr = 52;printf( “i=%d. \n”, i ); //What is i’s value?

Page 16: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

C pointers

• C pointers can be treated as arrays.

#define N 100int ray[ N ];int* ptr = ray; //same as ptr=&ray[0]for (int i=0; i<N; i++) {

ptr[i] = 0; //same as ray[i] = 0}

Page 17: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

C pointers

• C pointers can be treated as arrays.

#define N 100int ray[ N ];int* ptr = ray; //same as ptr=&ray[0]for (int i=0; i<N; i++) {

*ptr = 0;++ptr;

}

Page 18: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

C pointers

• C pointers can be treated as arrays.

#define N 100int ray[ N ];int* ptr = ray; //same as ptr=&ray[0]for (int i=0; i<N; i++) {

*ptr++ = 0;}

Page 19: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

C pointers

• C pointers can be treated as arrays (most of the time).

#define N 100int ray[ N ];int* ptr = ray; //same as ptr=&ray[0]for (int i=0; i<N; i++) {

*ptr++ = 0;}

Every time we ++ ptr, how much is added to ptr? 1?

Page 20: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

C pointers

• Common pitfall

int* ptr1, ptr2; //what (type) is ptr2?

Page 21: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

C pointers

• Common pitfall

int* ptr1, ptr2;

This is actually the same asint *ptr1, ptr2;

Which means that ptr2 is an int (not an int*)!

Page 22: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

C pointers and arrays

• Common pitfalls

#define N 100int ray[ N ];int* ptr = ray;

printf( “%d %d \n”, ray[N], ptr[1000] );

Page 23: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

C pointers and arrays

• Common pitfalls

#define N 100int ray[ N ];int* ptr = ray;

printf( “%d %d \n”, ray[N], ptr[1000] );

Page 24: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

More C pointers

Cast = change from one type to another.

double d = 0.7;int i = (int)(d+0.5); //round dint j = (int)d; //don’t round d

Sometimes we need to change (cast) from one pointer type to another.

Page 25: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

ASCII input

Use scanf (from stdin) and fscanf.

printf( “enter two integers: “ );int n1, n2;scanf( “%d %d”, &n1, &n2 );

Why is ‘&’ necessary?

Page 26: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

ASCII input

Use fscanf to read from ASCII files.

FILE* fp = fopen( “input.txt”, “rb” );assert( fp!=NULL );int n1, n2;fscanf( fp, “%d %d”, &n1, &n2 );…How do we know if anything was

read?

Page 27: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

How do we know if anything was read?int scanf ( const char *format, ... );

int fscanf ( FILE *stream,const char *format, ... );

Page 28: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

ASCII input

Use fscanf to read from ASCII files.

FILE* fp = fopen( “input.txt”, “rb” );assert( fp!=NULL );int n1, n2, count;count=fscanf( fp, “%d %d”, &n1, &n2 );if (count!=2) {

…}

Page 29: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

Notes about I/O

• stdin, stdout, and stderr are predefined for you and available for every program to use.– You do not need to define them

and you should not open them.– They are already defined for you

when you #include <stdio.h>

Page 30: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

More notes about I/O

fprintf( stdout, “hello \n” );is the same as

printf( “hello \n” );

scanf( “%d”, &n1 );is the same as

fscanf( stdin, “%d”, &n1 );

Page 31: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

More notes about I/O

• Read in a line of input.char *gets ( char *s );

char *fgets ( char *s, int size, FILE *stream );

• What’s the difference between:char buff[ 255 ];gets( buff );

fgets( buff, sizeof(buff), stdin );

Page 32: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

More C pointers

• Dynamic memory allocation (and deallocation).– malloc

int* iptr = (int*)malloc( 10*sizeof(int) );assert( iptr!=NULL );

– freefree( iptr );iptr = NULL; //good idea, not required

• Must #include <stdlib.h> at top.

cast

Page 33: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

Binary I/O

• Buffered– fread and fwrite

• Unbuffered– read and write– We will skip unbuffered I/O (but

you are free to use it).

Page 34: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

Binary input: fread

size_t fread ( void* ptr, size_t size,size_t nitems, FILE* stream );

• Returns nitems if OK.FILE* fp = fopen( “junk.in”, “rb” );#define N 100int buffer[ N ];int k=fread( buffer, sizeof( int ), N, fp );• What is k?

Page 35: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

Binary input: fread

size_t fread ( void* ptr, size_t size,size_t nitems, FILE* stream );

• Returns nitems if OK.#define N 100int buffer[ N ];int k=fread( buffer, sizeof( int ), N, fp );k = fread( buffer, 1, sizeof( buffer ), fp );k = fread( buffer, sizeof( buffer ), 1, fp );

Page 36: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

Binary input: fread

int buffer[ N ];

int k=fread( buffer, 1, sizeof( buffer ), fp );

k = fread( buffer, sizeof( buffer ), 1, fp );

This (sizeof(buffer)) is an example of where arrays and pointers are NOT the same in C.

Page 37: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

Binary output: fwrite

size_t fwrite ( void* ptr, size_t size,size_t nitems, FILE* stream );

• Returns nitems if OK.FILE* fp = fopen( “junk.in”, “wb” );#define N 100int buffer[ N ];int k=fwrite( buffer, sizeof( int ), N, fp );• What is k?

Page 38: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

0utput in C (using the standard C++ library)#include <iostream>

using namespace std;

int main ( int argc, char* argc[] ) {cout << “hello, world.” << endl;return 0;

}

You are free to use the standard C++ library but we won’t discuss it in this class.

Page 39: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

C structures

• Collection of data (only).– precursor to object– similar to a FORTRAN record

• Especially useful for message passing.– Ex. { do this operation, here is the

data }

Page 40: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

C structures

struct message {enum { OP_CALCULATE,

OP_RESULT,OP_EXIT };

int operation;int parameters[100];double result;

};Tip: don’t forget ;

Page 41: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

C structures

int main ( int argc, char* argv[] ) { struct message m; m.operation = m.OP_CALCULATE;

return 0;}

Page 42: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

C structures (w/ pointers)

int main ( int argc, char* argv[] ) { struct message* m; m = (struct message*) malloc (sizeof(struct message) ); assert( m!=NULL );

m->operation = m->OP_CALCULATE; //most often used

(*m).operation = (*m).OP_CALCULATE; //same thing

return 0;} Why not sizeof(struct

message*)?

Page 43: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

C++ classes (not required for this course)

class Simple3D : public DistanceTransform3D { public:

//define public members (data) and methods (functions) here...

private:...

protected:...

};

Page 44: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

Useful header files

#include <assert.h>#include <stdio.h>#include <stdlib.h>

Page 45: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

Compiling C/C++ programs on Linux• g++ compiles both C and C++

– Always use g++ for C or C++.• (Don’t use gcc. It only compiles C and C

programs that compile with gcc may not compile with g++.)

• g++ won’t compile 1978 K&R C code but you shouldn’t be coding in that anyway.

• File name extensions– Always use .cpp for C or C++.

• (Don’t use .c. It is only for C programs which may compile with gcc but not with g++.)

• Enter ‘man g++’ for help.

Page 46: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

Compiling and running C programs on Linuxg++ command options

-g, -O, -O2, -O3• Optimization level – debug to optimized.

-c• Compile (making a .o file) but don’t link.

-o• Specify output file name.

-l• (el=lower case L) Specify link library name.

Note: use mpic++ to compile mpi-based C/C++ programs.

Page 47: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

Example of compiling C programsg++ junk.cpp

• Compile and link producing a.out.

g++ -c junk.cpp• Compile (but don’t link) producing

junk.o.

g++ -o junk.exe junk.o• Link junk.o and produce junk.exe.

g++ -o junk.exe junk.cpp• Compile and link producing junk.exe.

Page 48: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

Example of compiling C programs

g++ -g -o junk.exe junk.cpp• Compile and link producing junk.exe w/ debug

information.

g++ -O3 -o junk.exe junk.cpp• Compile and link producing an optimized version

called junk.exe.

g++ -O -o fred.exe junk1.cpp junk2.o \ junk3.cpp -lm

• Compile junk.1pp and junk3.cpp (but not junk2.o) and link producing fred.exe which is somewhat optimized and linked to the math library.

Page 49: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

Handling C command g C command line argumentsline arguments• argc

– count/number of arguments• argv

– array of strings (the actual arguments)• Java doesn’t have argc. Why?• In Java, argv[0] is the first argument.

In C, argv[0] is the name of the program/command and argv[1] is the first argument.

Page 50: Gramming An Introduction to C Programming (assuming that you already know Java; this is not an introduction to C++)

End of C for Java programmers


Recommended