Programming Language C Tutorial Introduction 主講人:虞台文
Content Background Getting Started IDE (Integrated Development Environment) Main Parts of C Programs Variables and Arithmetic Expressions The for statement Symbolic Constants Character Input and Output Arrays Functions Character Arrays External Variables and Scope
Programming Language C Tutorial Introduction Background
Textbooks 1. C How to Program, 5th Edition, by Harvey M. Deitel, Paul J. Deitel. 2. The C programming Language, 2nd Editon, by Brian W. Kernighan and Dennis M. Ritchie, Prentice-Hall in 1988.
Grading 1. Homework40% 2. Midterm30% 3. Final30% 4. Other10%
The C Language Currently, the most commonly-used language for embedded systems – High-level assembly Very portable – compilers exist for virtually every processor Easy-to-understand compilation Produces efficient code Fairly concise
C History Developed between 1969 and 1973 along with Unix Due mostly to Dennis Ritchie Designed for systems programming – Operating systems – Utility programs – Compilers – Filters Evolved from B, which evolved from BCPL The Development of the C Language
Computer Architecture ALU Control CPU Input Output Memory Input Device Output Device
Programming Language C Tutorial Introduction Getting Started
Setting Program Development Environment
%SystemRoot%\system32\cmd.exe /K "F:\VS6\VC98\Bin\VCVARS32.BAT" %SystemRoot%\system32\cmd.exe /K "F:\VS6\VC98\Bin\VCVARS32.BAT"
Setting Program Development Environment
Our First C Program Hello World
#include main() { printf("hello, world\n"); } #include main() { printf("hello, world\n"); }
Our First C Program Hello World #include main() { printf("hello, world\n"); } #include main() { printf("hello, world\n"); } include information about standard library define a function called main that received no argument values define a function called main that received no argument values
Our First C Program Hello World #include main() { printf("hello, world\n"); } #include main() { printf("hello, world\n"); } define a function called main that received no argument values define a function called main that received no argument values
Our First C Program Hello World #include main() { printf("hello, world\n"); } #include main() { printf("hello, world\n"); } statements of main are enclosed in braces
Our First C Program Hello World #include main() { printf("hello, world\n"); } #include main() { printf("hello, world\n"); } main calls library function printf
Our First C Program Hello World
Compiling and Linking
Execution
Exercises 1. Create some typo errors for Hello.c, and redo the compiling/linking process. Watch and understand the screen output reported by cl. 2. Add more printf statements in Hello.c and redo the compiling/linking/execution process.
Programming Language C Tutorial Introduction IDE
Visual C++ 6.0
Win32 Console Application
Hello_IDE
Hello.c
Building Application
Execution
Files Generated by IDE
Programming Language C Tutorial Introduction Main Parts of C Programs
Main Parts Headers/Comments/Expressions #include /* Our first C Program */ main() { printf("hello, world\n"); } #include /* Our first C Program */ main() { printf("hello, world\n"); }
Example Identify the three parts in the following program
Remark C++ also uses // to comment a single line.
The Syntax of C Language
Programming Language C Tutorial Introduction Variables and Arithmetic Expressions
Example: Fahrenheit-Celsius table
Example: Fahrenheit-Celsius Table #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; }
Example: Fahrenheit-Celsius Table #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; }
Statements #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } Individual statements are terminated by semicolons.
Variable Declarations #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } } In C, all variables must be declared before they are used. – Usually declared at the beginning of the function before any executable statements. A declaration announces the properties of variables; it consists of a name and a list of variables. In C, all variables must be declared before they are used. – Usually declared at the beginning of the function before any executable statements. A declaration announces the properties of variables; it consists of a name and a list of variables.
Variable Declarations #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } } The integer data type. What is its range? The integer data type. What is its range?
Integer The range of integer depends on machine – 16-bit machine – 32-bit machine int fahr, celsius; int lower, upper, step; int fahr, celsius; int lower, upper, step;
Integer The range of integer depends on machine INT_MIN INT_MAX int fahr, celsius; int lower, upper, step; int fahr, celsius; int lower, upper, step;
Integer The range of integer depends on machine INT_MIN INT_MAX int fahr, celsius; int lower, upper, step; int fahr, celsius; int lower, upper, step;
Float A float number is typically a 32-bit quantity, with at least six significant digits and magnitude generally between about and float fahr, celsius; float lower, upper, step; float fahr, celsius; float lower, upper, step; FLT_MIN FLT_MAX
Fundamental Types TypeSize char 1 byte short 2 bytes int 4 bytes long 4 bytes float 4 bytes double 8 bytes Machine Dependent
TypeSize char 1 byte short 2 bytes int 4 bytes long 4 bytes float 4 bytes double 8 bytes TypeSize char 1 byte short 2 bytes int 4 bytes long 4 bytes float 4 bytes double 8 bytes Fundamental Types in Microsoft C++
Assignment Statements #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } } Assign a value computed from an expression to a variable.
While Loop #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } } The body of a while loop is repeatedly executed as long as the condition expression is tested true. while( cond_expression ) statement
Arithmetical Operations #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } } Can it be “ celsius = 5/9*(fahr-32); ”? Why? Can it be “ celsius = 5/9*(fahr-32); ”? Why?
printf General-Purpose Output Formatting Function #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } }
printf General-Purpose Output Formatting Function printf("%d\t%d\n", fahr, celsius); format string decimaltabdecimalnewline
printf General-Purpose Output Formatting Function #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + step; } } Left aligned
printf General-Purpose Output Formatting Function Synopsis #include int printf(const char *format,...); Description printf writes to the standard output stream using putchar, under control of the string pointed to by format that specifies how subsequent arguments are converted for output. If there are insufficient arguments for the format, the behavior is undefined. If the format is exhausted while arguments remain, the excess arguments are evaluated but are otherwise ignored. printf returns number of characters transmitted, or a negative value if an output or encoding error occurred. Synopsis #include int printf(const char *format,...); Description printf writes to the standard output stream using putchar, under control of the string pointed to by format that specifies how subsequent arguments are converted for output. If there are insufficient arguments for the format, the behavior is undefined. If the format is exhausted while arguments remain, the excess arguments are evaluated but are otherwise ignored. printf returns number of characters transmitted, or a negative value if an output or encoding error occurred.
printf General-Purpose Output Formatting Function #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%3d %6d\n", fahr, celsius); fahr = fahr + step; } #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf("%3d %6d\n", fahr, celsius); fahr = fahr + step; } } Right aligned
Example: Fahrenheit-Celsius Table (Float) #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { float fahr, celsius; float lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { float fahr, celsius; float lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } }
Example: Fahrenheit-Celsius Table (Float) #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { float fahr, celsius; float lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } #include <stdio.h> /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { float fahr, celsius; float lower, upper, step; lower = 0;/* lower limit of temperature scale */ upper = 300;/* upper limit */ step = 20;/* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } }
More on printf
Statements Simple Statements lower = 0; upper = 300; step = 20; fahr = lower; Null Statement ; // a null statement Compound Statements { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } 4 simple statements 1 compound statement
While Statements while( cond_expression ) statement The statement can be: a simple statement a null statement a compound statements
Program Indentation #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { float fahr, celsius; float lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { float fahr, celsius; float lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; }
Program Indentation #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { float fahr, celsius; float lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { float fahr, celsius; float lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } Statement
Program Indentation #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { float fahr, celsius; float lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { float fahr, celsius; float lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } Statement
Program Indentation #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { float fahr, celsius; float lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { float fahr, celsius; float lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } Statement Compound Statement
Programming Language C Tutorial Introduction The for Statement
Example: Fahrenheit-Celsius Table #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { float fahr, celsius; float lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } #include /* print Fahrenheit-Celsius table for fahr = 0, 20,..., 300 */ main() { float fahr, celsius; float lower, upper, step; lower = 0; /* lower limit of temperature scale */ upper = 300; /* upper limit */ step = 20; /* step size */ fahr = lower; while (fahr <= upper) { celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f %6.1f\n", fahr, celsius); fahr = fahr + step; } There are many ways to do the same task.
Example: Fahrenheit-Celsius Table #include /* print Fahrenheit-Celsius table */ main() { int fahr; for (fahr = 0; fahr <= 300; fahr = fahr + 20) printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32)); } #include /* print Fahrenheit-Celsius table */ main() { int fahr; for (fahr = 0; fahr <= 300; fahr = fahr + 20) printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32)); }
The for Statement #include /* print Fahrenheit-Celsius table */ main() { int fahr; for (fahr = 0; fahr <= 300; fahr = fahr + 20) printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32)); } #include /* print Fahrenheit-Celsius table */ main() { int fahr; for (fahr = 0; fahr <= 300; fahr = fahr + 20) printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32)); } for ( init-exp ; cond-exp ; loop-exp ) statement for ( init-exp ; cond-exp ; loop-exp ) statement
for vs. while The choice between while and for is arbitrary, based on which seems clearer. The for is usually appropriate for loops in which the initialization and increment are single statements and logically related.
Exercises 3. Modify the temperature conversion program to print the table in reverse order, that is, from 300 degrees to 0.
Exercises 4. Using only the techniques you learned, write a program that calculates the squares and cubes of the number from 0 to 10 and used tabs to print the following table of values. numbersquarecube
Programming Language C Tutorial Introduction Symbolic Constants
#define Text Substitution #define name replacement list #define PI Example:
Example: Fahrenheit-Celsius Table #include #define LOWER 0 /* lower limit of table */ #define UPPER 300 /* upper limit */ #define STEP 20 /* step size */ /* print Fahrenheit-Celsius table */ main() { int fahr; for (fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP) printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32)); } #include #define LOWER 0 /* lower limit of table */ #define UPPER 300 /* upper limit */ #define STEP 20 /* step size */ /* print Fahrenheit-Celsius table */ main() { int fahr; for (fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP) printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32)); }
Programming Language C Tutorial Introduction Character Input and Output
getchar() & putchar() Synopsis #include int getchar(void); Description getchar reads a single character from the standard input stream. If the stream is at end-of-file or a read error occurs, getchar returns EOF. Synopsis #include int getchar(void); Description getchar reads a single character from the standard input stream. If the stream is at end-of-file or a read error occurs, getchar returns EOF. Synopsis #include int putchar(int c); Description putchar writes the character c to the standard output stream. putchar returns the character written. If a write error occurs, putchar returns EOF. Synopsis #include int putchar(int c); Description putchar writes the character c to the standard output stream. putchar returns the character written. If a write error occurs, putchar returns EOF. #define EOF (-1)
Example: Typewriter (Version 1) #include /* copy input to output; 1st version */ main() { int c; c = getchar(); while (c != EOF) { putchar(c); c = getchar(); } #include /* copy input to output; 1st version */ main() { int c; c = getchar(); while (c != EOF) { putchar(c); c = getchar(); } } != not equal
Example: Typewriter (Version 2) #include /* copy input to output; 2st version */ main() { int c; c = getchar(); while ((c = getchar()) != EOF) putchar(c); } #include /* copy input to output; 2st version */ main() { int c; c = getchar(); while ((c = getchar()) != EOF) putchar(c); } The return value of an assignment statement is value of the variable after the assignment. simple statement
Example: Typewriter (Version 2) #include /* copy input to output; 2st version */ main() { int c; c = getchar(); while ((c = getchar()) != EOF) putchar(c); } #include <stdio.h> /* copy input to output; 2st version */ main() { int c; c = getchar(); while ((c = getchar()) != EOF) putchar(c); } The return value of an assignment statement is value of the variable after the assignment.
Example: Character Counting (Version 1) #include /* count characters in input; 1st version */ main() { long nc; nc = 0; while (getchar() != EOF) ++nc; printf("%ld\n", nc); } #include /* count characters in input; 1st version */ main() { long nc; nc = 0; while (getchar() != EOF) ++nc; printf("%ld\n", nc); } ++ increment simple statement
Example: Character Counting (Version 1) #include /* count characters in input; 1st version */ main() { long nc; nc = 0; while (getchar() != EOF) ++nc; printf("%ld\n", nc); } #include <stdio.h> /* count characters in input; 1st version */ main() { long nc; nc = 0; while (getchar() != EOF) ++nc; printf("%ld\n", nc); } ++ increment
Example: Character Counting (Version 2) #include /* count characters in input; 2nd version */ main() { double nc; for (nc = 0; getchar() != EOF; ++nc) ; printf("%.0f\n", nc); } #include /* count characters in input; 2nd version */ main() { double nc; for (nc = 0; getchar() != EOF; ++nc) ; printf("%.0f\n", nc); } null statement
Example: Character Counting (Version 2) #include /* count characters in input; 2nd version */ main() { double nc; for (nc = 0; getchar() != EOF; ++nc); printf("%.0f\n", nc); } #include <stdio.h> /* count characters in input; 2nd version */ main() { double nc; for (nc = 0; getchar() != EOF; ++nc); printf("%.0f\n", nc); }
Example: Line Counting #include /* count lines in input */ main() { int c, nl; nl = 0; while ((c = getchar()) != EOF) if (c == '\n') ++nl; printf("%d\n", nl); } #include /* count lines in input */ main() { int c, nl; nl = 0; while ((c = getchar()) != EOF) if (c == '\n') ++nl; printf("%d\n", nl); } == equals to if ( expression ) statement if ( expression ) statement else statement if ( expression ) statement if ( expression ) statement else statement simple statement
Example: Line Counting #include /* count lines in input */ main() { int c, nl; nl = 0; while ((c = getchar()) != EOF) if (c == '\n') ++nl; printf("%d\n", nl); } #include <stdio.h> /* count lines in input */ main() { int c, nl; nl = 0; while ((c = getchar()) != EOF) if (c == '\n') ++nl; printf("%d\n", nl); } simple statement
Example: Line Counting #include /* count lines in input */ main() { int c, nl; nl = 0; while ((c = getchar()) != EOF) if (c == '\n') ++nl; printf("%d\n", nl); } #include /* count lines in input */ main() { int c, nl; nl = 0; while ((c = getchar()) != EOF) if (c == '\n') ++nl; printf("%d\n", nl); } simple statement Can we move to here?
Example: Word Counting OUTIN visible non-visible visible > non-visible This is a test case. OIIIIOIIOIOOOIIIIO OIIIII
Example: Word Counting #include #define IN 1 /* inside a word */ #define OUT 0 /* outside a word */ /* count lines, words, and characters in input */ main() { int c, nl, nw, nc, state; state = OUT; nl = nw = nc = 0; while ((c = getchar()) != EOF) { ++nc; if (c == '\n') ++nl; if (c == ' ' || c == '\n' || c = '\t') state = OUT; else if (state == OUT) { state = IN; ++nw; } printf("%d %d %d\n", nl, nw, nc); } #include #define IN 1 /* inside a word */ #define OUT 0 /* outside a word */ /* count lines, words, and characters in input */ main() { int c, nl, nw, nc, state; state = OUT; nl = nw = nc = 0; while ((c = getchar()) != EOF) { ++nc; if (c == '\n') ++nl; if (c == ' ' || c == '\n' || c = '\t') state = OUT; else if (state == OUT) { state = IN; ++nw; } } printf("%d %d %d\n", nl, nw, nc); } OUTIN visible non-visible visible > non-visible
Exercises 7. Write a program to print a histogram of the frequencies of different characters in its input.
Programming Language C Tutorial Introduction Arrays
Array is a data structure that stores contiguous data elements of the same type. Examples: intscore[50]; char address[50]; double distance[50]; score address distance 200 bytes 50 bytes 400 bytes
Arrays Examples: intscore[50]; char address[50]; double distance[50]; score address distance score[0] score[1] score[49]
Arrays Examples: intscore[50]; char address[50]; double distance[50]; score address distance address[0] address[1] address[2] address[49]......
Arrays Examples: intscore[50]; char address[50]; double distance[50]; score address distance distance[0] distance[49]
#include /* count digits, white space, others */ main() { int c, i, nwhite, nother; int ndigit[10]; nwhite = nother = 0; for (i = 0; i < 10; ++i) ndigit[i] = 0; while ((c = getchar()) != EOF) if (c >= '0' && c <= '9')++ndigit[c-'0']; else if (c == ' ' || c == '\n' || c == '\t') ++nwhite; else ++nother; printf("digits ="); for (i = 0; i < 10; ++i) printf(" %d", ndigit[i]); printf(", white space = %d, other = %d\n", nwhite, nother); } #include /* count digits, white space, others */ main() { int c, i, nwhite, nother; int ndigit[10]; nwhite = nother = 0; for (i = 0; i < 10; ++i) ndigit[i] = 0; while ((c = getchar()) != EOF) if (c >= '0' && c <= '9')++ndigit[c-'0']; else if (c == ' ' || c == '\n' || c == '\t') ++nwhite; else ++nother; printf("digits ="); for (i = 0; i < 10; ++i) printf(" %d", ndigit[i]); printf(", white space = %d, other = %d\n", nwhite, nother); } Example: Digit Counting && logical and operator || logical or operator
#include /* count digits, white space, others */ main() { int c, i, nwhite, nother; int ndigit[10]; nwhite = nother = 0; for (i = 0; i < 10; ++i) ndigit[i] = 0; while ((c = getchar()) != EOF) if (c >= '0' && c <= '9')++ndigit[c-'0']; else if (c == ' ' || c == '\n' || c == '\t') ++nwhite; else ++nother; printf("digits ="); for (i = 0; i < 10; ++i) printf(" %d", ndigit[i]); printf(", white space = %d, other = %d\n", nwhite, nother); } #include /* count digits, white space, others */ main() { int c, i, nwhite, nother; int ndigit[10]; nwhite = nother = 0; for (i = 0; i < 10; ++i) ndigit[i] = 0; while ((c = getchar()) != EOF) if (c >= '0' && c <= '9')++ndigit[c-'0']; else if (c == ' ' || c == '\n' || c == '\t') ++nwhite; else ++nother; printf("digits ="); for (i = 0; i < 10; ++i) printf(" %d", ndigit[i]); printf(", white space = %d, other = %d\n", nwhite, nother); } Example: Digit Counting
#include /* count digits, white space, others */ main() { int c, i, nwhite, nother; int ndigit[10]; nwhite = nother = 0; for (i = 0; i < 10; ++i) ndigit[i] = 0; while ((c = getchar()) != EOF) if (c >= '0' && c <= '9')++ndigit[c-'0']; else if (c == ' ' || c == '\n' || c == '\t') ++nwhite; else ++nother; printf("digits ="); for (i = 0; i < 10; ++i) printf(" %d", ndigit[i]); printf(", white space = %d, other = %d\n", nwhite, nother); } #include /* count digits, white space, others */ main() { int c, i, nwhite, nother; int ndigit[10]; nwhite = nother = 0; for (i = 0; i < 10; ++i) ndigit[i] = 0; while ((c = getchar()) != EOF) if (c >= '0' && c <= '9')++ndigit[c-'0']; else if (c == ' ' || c == '\n' || c == '\t') ++nwhite; else ++nother; printf("digits ="); for (i = 0; i < 10; ++i) printf(" %d", ndigit[i]); printf(", white space = %d, other = %d\n", nwhite, nother); } Example: Digit Counting
#include /* count digits, white space, others */ main() { int c, i, nwhite, nother; int ndigit[10]; nwhite = nother = 0; for (i = 0; i < 10; ++i) ndigit[i] = 0; while ((c = getchar()) != EOF) if (c >= '0' && c <= '9')++ndigit[c-'0']; else if (c == ' ' || c == '\n' || c == '\t') ++nwhite; else ++nother; printf("digits ="); for (i = 0; i < 10; ++i) printf(" %d", ndigit[i]); printf(", white space = %d, other = %d\n", nwhite, nother); } #include /* count digits, white space, others */ main() { int c, i, nwhite, nother; int ndigit[10]; nwhite = nother = 0; for (i = 0; i < 10; ++i) ndigit[i] = 0; while ((c = getchar()) != EOF) if (c >= '0' && c <= '9')++ndigit[c-'0']; else if (c == ' ' || c == '\n' || c == '\t') ++nwhite; else ++nother; printf("digits ="); for (i = 0; i < 10; ++i) printf(" %d", ndigit[i]); printf(", white space = %d, other = %d\n", nwhite, nother); } Example: Digit Counting
if Statement if (condition 1 ) statement 1 else if (condition 2 ) statement 2 else if (condition 3 ) statement 3... else statement n if (condition 1 ) statement 1 else if (condition 2 ) statement 2 else if (condition 3 ) statement 3... else statement n The dangling else problem
Exercises 5. Write a program that prints its input one word per line. 6. Write a program that prints only a single white character between words.
Exercises 7. Write a program to print a histogram of the frequencies of different characters in its input.
Programming Language C Tutorial Introduction Functions
Functions we have used printf getchar putchar
Functions A way to encapsulate some computation. Similar to a subroutine or function in Fortran, or a procedure or function in Pascal. A properly designed function allow us to – know what is done, but – ignore how a job is done
Function Definition return-type function-name(parameter declarations, if any) { declarations statements } return-type function-name(parameter declarations, if any) { declarations statements }
Function Definition return-type function-name(parameter declarations, if any) { declarations statements } return-type function-name(parameter declarations, if any) { declarations statements } If absent, return type is considered int. Called formal parameters Called formal parameters
Example: Power #include int power(int m, int n); /* test power function */ main() { int i; for (i = 0; i < 10; ++i) printf("%d %d %d\n", i, power(2,i), power(-3,i)); return 0; } /* power: raise base to n-th power; n >= 0 */ int power(int base, int n) { int i, p; p = 1; for (i = 1; i <= n; ++i) p = p * base; return p; } #include int power(int m, int n); /* test power function */ main() { int i; for (i = 0; i < 10; ++i) printf("%d %d %d\n", i, power(2,i), power(-3,i)); return 0; } /* power: raise base to n-th power; n >= 0 */ int power(int base, int n) { int i, p; p = 1; for (i = 1; i <= n; ++i) p = p * base; return p; } forward reference
Example: Power #include int power(int m, int n); /* test power function */ main() { int i; for (i = 0; i < 10; ++i) printf("%d %d %d\n", i, power(2,i), power(-3,i)); return 0; } /* power: raise base to n-th power; n >= 0 */ int power(int base, int n) { int i, p; p = 1; for (i = 1; i <= n; ++i) p = p * base; return p; } #include int power(int m, int n); /* test power function */ main() { int i; for (i = 0; i < 10; ++i) printf("%d %d %d\n", i, power(2,i), power(-3,i)); return 0; } /* power: raise base to n-th power; n >= 0 */ int power(int base, int n) { int i, p; p = 1; for (i = 1; i <= n; ++i) p = p * base; return p; }
Example: Power (Version 2) /* power: raise base to n-th power; n >= 0 */ int power(int base, int n) { int i, p; p = 1; for (i = 1; i <= n; ++i) p = p * base; return p; } /* power: raise base to n-th power; n >= 0 */ int power(int base, int n) { int i, p; p = 1; for (i = 1; i <= n; ++i) p = p * base; return p; } /* power: raise base to n-th power; n >= 0; version 2 */ int power(int base, int n) { int i, p; for (p = 1; n < 0; --n) p = p * base; return p; } /* power: raise base to n-th power; n >= 0; version 2 */ int power(int base, int n) { int i, p; for (p = 1; n < 0; --n) p = p * base; return p; }
Example: Power (Version 2) /* power: raise base to n-th power; n >= 0; version 2 */ int power(int base, int n) { int i, p; for (p = 1; n < 0; --n) p = p * base; return p; } /* power: raise base to n-th power; n >= 0; version 2 */ int power(int base, int n) { int i, p; for (p = 1; n < 0; --n) p = p * base; return p; }..... main() { int n, val; n = 5; val = power(2, n); printf("val=%d n=%d %d\n", val, n); }..... main() { int n, val; n = 5; val = power(2, n); printf("val=%d n=%d %d\n", val, n); }..... n=?
Call by Value In C, all function arguments are passed “by value.” – the called function is given the values of its arguments in temporary variables rather than the originals. – Modifying the values of formal parameters doesn’t effect the value of originals How about if a function has arrays as its parameters?
Programming Language C Tutorial Introduction Character Arrays
Strings in C Null-terminated string In C, a string is stored as an array of characters containing the characters in the string and terminated with a ' \0 ' to mark the end. char str[]="hello\n"; Example: h (68) e (65) l (6C) o (6F) \n (0A) \0 (00) str
Strings in C
Example: Print the Longest Line while (there's another line) if (it's longer than the previous longest) (save it) (save its length) print longest line while (there's another line) if (it's longer than the previous longest) (save it) (save its length) print longest line
Example: Print the Longest Line while (there's another line) if (it's longer than the previous longest) (save it) (save its length) print longest line while (there's another line) if (it's longer than the previous longest) (save it) (save its length) print longest line Implement a getline() function which returns the length of the line read. Implement a copy() function to save string.
Example: Print the Longest Line /* getline: read a line into s, return length */ int getline(char s[],int lim) { int c, i; for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) s[i] = c; if (c == '\n') { s[i] = c; ++i; } s[i] = '\0'; return i; } /* getline: read a line into s, return length */ int getline(char s[],int lim) { int c, i; for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) s[i] = c; if (c == '\n') { s[i] = c; ++i; } s[i] = '\0'; return i; } && logical and operator
Example: Print the Longest Line /* getline: read a line into s, return length */ int getline(char s[],int lim) { int c, i; for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) s[i] = c; if (c == '\n') { s[i] = c; ++i; } s[i] = '\0'; return i; } /* getline: read a line into s, return length */ int getline(char s[],int lim) { int c, i; for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) s[i] = c; if (c == '\n') { s[i] = c; ++i; } s[i] = '\0'; return i; } && logical and operator Simplification s[i++] = c;
Example: Print the Longest Line /* getline: read a line into s, return length */ /* simplified version */ int getline(char s[],int lim) { int c, i; for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n';) s[i++] = c; if (c == '\n') s[i++] = c; s[i] = '\0'; return i; } /* getline: read a line into s, return length */ /* simplified version */ int getline(char s[],int lim) { int c, i; for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n';) s[i++] = c; if (c == '\n') s[i++] = c; s[i] = '\0'; return i; } && logical and operator
Example: Print the Longest Line /* copy: copy 'from' into 'to'; assume to is big enough */ void copy(char to[], char from[]) { int i; i = 0; while ((to[i] = from[i]) != '\0') ++i; } /* copy: copy 'from' into 'to'; assume to is big enough */ void copy(char to[], char from[]) { int i; i = 0; while ((to[i] = from[i]) != '\0') ++i; }
Example: Print the Longest Line #include #define MAXLINE 1000 /* maximum input line length */ int getline(char line[], int maxline); void copy(char to[], char from[]); /* print the longest input line */ main() { int len; /* current line length */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ max = 0; while ((len = getline(line, MAXLINE)) > 0) if (len > max) { max = len; copy(longest, line); } if (max > 0) /* there was a line */ printf("%s", longest); return 0; } #include #define MAXLINE 1000 /* maximum input line length */ int getline(char line[], int maxline); void copy(char to[], char from[]); /* print the longest input line */ main() { int len; /* current line length */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ max = 0; while ((len = getline(line, MAXLINE)) > 0) if (len > max) { max = len; copy(longest, line); } if (max > 0) /* there was a line */ printf("%s", longest); return 0; }......
Example: Print the Longest Line
Exercises 8. Write a function getlinestr() by modifying getline() described above so that the string read doesn’t include '\n'. 9. Write a function reverse(char s[]) that reverses the character string s. 10. Write a function int strlen(char s[]) that returns the number of characters in string s. 11. Write a program to demonstrate that the about three functions you wrote are correct.
Exercises 12. Write a function int atoi(char s[]) that converts a signed decimal numeric string, assumed the syntax is correct, to an integer, and write a program to verify the correctness of your program. 13. Write a program that reads two integers from the standard input stream and output their minimum and maximum to the standard output stream. You can’t use library function scanf() to read data. 14. (Take home) Write a function void itoa(int n, char s[]) that converts a signed integer to a signed decimal numeric string, and write a program to verify the correctness of your program.
Programming Language C Tutorial Introduction External Variables and Scope
Local (Private) Variables #include #define MAXLINE 1000 /* maximum input line length */ int getline(char line[], int maxline); void copy(char to[], char from[]); /* print the longest input line */ main() { int len; /* current line length */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ max = 0; while ((len = getline(line, MAXLINE)) > 0) if (len > max) { max = len; copy(longest, line); } if (max > 0) /* there was a line */ printf("%s", longest); return 0; } #include #define MAXLINE 1000 /* maximum input line length */ int getline(char line[], int maxline); void copy(char to[], char from[]); /* print the longest input line */ main() { int len; /* current line length */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ max = 0; while ((len = getline(line, MAXLINE)) > 0) if (len > max) { max = len; copy(longest, line); } if (max > 0) /* there was a line */ printf("%s", longest); return 0; } /* getline: read a line into s, return length */ /* simplified version */ int getline(char s[],int lim) { int c, i; for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n';) s[i++] = c; if (c == '\n') s[i++] = c; s[i] = '\0'; return i; } /* copy: copy 'from' into 'to'; assume to is big enough */ void copy(char to[], char from[]) { int i; i = 0; while ((to[i] = from[i]) != '\0') ++i; } /* getline: read a line into s, return length */ /* simplified version */ int getline(char s[],int lim) { int c, i; for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n';) s[i++] = c; if (c == '\n') s[i++] = c; s[i] = '\0'; return i; } /* copy: copy 'from' into 'to'; assume to is big enough */ void copy(char to[], char from[]) { int i; i = 0; while ((to[i] = from[i]) != '\0') ++i; }
Local (Private) Variables #include #define MAXLINE 1000 /* maximum input line length */ int getline(char line[], int maxline); void copy(char to[], char from[]); /* print the longest input line */ main() { int len; /* current line length */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ max = 0; while ((len = getline(line, MAXLINE)) > 0) if (len > max) { max = len; copy(longest, line); } if (max > 0) /* there was a line */ printf("%s", longest); return 0; } #include #define MAXLINE 1000 /* maximum input line length */ int getline(char line[], int maxline); void copy(char to[], char from[]); /* print the longest input line */ main() { int len; /* current line length */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ max = 0; while ((len = getline(line, MAXLINE)) > 0) if (len > max) { max = len; copy(longest, line); } if (max > 0) /* there was a line */ printf("%s", longest); return 0; } /* getline: read a line into s, return length */ /* simplified version */ int getline(char s[],int lim) { int c, i; for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n';) s[i++] = c; if (c == '\n') s[i++] = c; s[i] = '\0'; return i; } /* copy: copy 'from' into 'to'; assume to is big enough */ void copy(char to[], char from[]) { int i; i = 0; while ((to[i] = from[i]) != '\0') ++i; } /* getline: read a line into s, return length */ /* simplified version */ int getline(char s[],int lim) { int c, i; for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n';) s[i++] = c; if (c == '\n') s[i++] = c; s[i] = '\0'; return i; } /* copy: copy 'from' into 'to'; assume to is big enough */ void copy(char to[], char from[]) { int i; i = 0; while ((to[i] = from[i]) != '\0') ++i; } Each local variable comes into existence only when the function is called, and disappears when the function is exited. Hence, also known as automatic variables. Each local variable comes into existence only when the function is called, and disappears when the function is exited. Hence, also known as automatic variables.
Global (Extern) Variables Global variables that are defined external to all functions can be accessed by name by any function. Furthermore, they remain in existence permanently.
Example: Print the Longest Line #include #define MAXLINE 1000 /* maximum input line size */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ int getline(void); void copy(void); /* print longest input line; specialized version */ main() { } /* getline: specialized version */ int getline(void) { } /* copy: specialized version */ void copy(void) { } #include #define MAXLINE 1000 /* maximum input line size */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ int getline(void); void copy(void); /* print longest input line; specialized version */ main() { } /* getline: specialized version */ int getline(void) { } /* copy: specialized version */ void copy(void) { } defined external to all functions
Example: Print the Longest Line #include #define MAXLINE 1000 /* maximum input line size */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ int getline(void); void copy(void); /* print longest input line; specialized version */ main() { } /* getline: specialized version */ int getline(void) { } /* copy: specialized version */ void copy(void) { } #include #define MAXLINE 1000 /* maximum input line size */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ int getline(void); void copy(void); /* print longest input line; specialized version */ main() { } /* getline: specialized version */ int getline(void) { } /* copy: specialized version */ void copy(void) { } defined external to all functions /* print longest input line; specialized version */ main() { int len; extern int max; extern char longest[]; max = 0; while ((len = getline()) > 0) if (len > max) { max = len; copy(); } if (max > 0) /* there was a line */ printf("%s", longest); return 0; } /* print longest input line; specialized version */ main() { int len; extern int max; extern char longest[]; max = 0; while ((len = getline()) > 0) if (len > max) { max = len; copy(); } if (max > 0) /* there was a line */ printf("%s", longest); return 0; }
Example: Print the Longest Line #include #define MAXLINE 1000 /* maximum input line size */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ int getline(void); void copy(void); /* print longest input line; specialized version */ main() { } /* getline: specialized version */ int getline(void) { } /* copy: specialized version */ void copy(void) { } #include #define MAXLINE 1000 /* maximum input line size */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ int getline(void); void copy(void); /* print longest input line; specialized version */ main() { } /* getline: specialized version */ int getline(void) { } /* copy: specialized version */ void copy(void) { } defined external to all functions /* getline: specialized version */ int getline(void) { int c, i; extern char line[]; for (i = 0; i < MAXLINE - 1 && (c=getchar()) != EOF && c != '\n'; ++i) line[i] = c; if (c == '\n') { line[i] = c; ++i; } line[i] = '\0'; return i; } /* getline: specialized version */ int getline(void) { int c, i; extern char line[]; for (i = 0; i < MAXLINE - 1 && (c=getchar()) != EOF && c != '\n'; ++i) line[i] = c; if (c == '\n') { line[i] = c; ++i; } line[i] = '\0'; return i; }
Example: Print the Longest Line #include #define MAXLINE 1000 /* maximum input line size */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ int getline(void); void copy(void); /* print longest input line; specialized version */ main() { } /* getline: specialized version */ int getline(void) { } /* copy: specialized version */ void copy(void) { } #include #define MAXLINE 1000 /* maximum input line size */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ int getline(void); void copy(void); /* print longest input line; specialized version */ main() { } /* getline: specialized version */ int getline(void) { } /* copy: specialized version */ void copy(void) { } defined external to all functions /* copy: specialized version */ void copy(void) { int i; extern char line[], longest[]; i = 0; while ((longest[i] = line[i]) != '\0') ++i; } /* copy: specialized version */ void copy(void) { int i; extern char line[], longest[]; i = 0; while ((longest[i] = line[i]) != '\0') ++i; }
Example: Print the Longest Line #include #define MAXLINE 1000 /* maximum input line size */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ int getline(void); void copy(void); /* print longest input line; specialized version */ main() { } /* getline: specialized version */ int getline(void) { } /* copy: specialized version */ void copy(void) { } #include #define MAXLINE 1000 /* maximum input line size */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ int getline(void); void copy(void); /* print longest input line; specialized version */ main() { } /* getline: specialized version */ int getline(void) { } /* copy: specialized version */ void copy(void) { } defined external to all functions /* print longest input line; specialized version */ main() { int len; extern int max; extern char longest[]; max = 0; while ((len = getline()) > 0) if (len > max) { max = len; copy(); } if (max > 0) /* there was a line */ printf("%s", longest); return 0; } /* print longest input line; specialized version */ main() { int len; extern int max; extern char longest[]; max = 0; while ((len = getline()) > 0) if (len > max) { max = len; copy(); } if (max > 0) /* there was a line */ printf("%s", longest); return 0; } /* getline: specialized version */ int getline(void) { int c, i; extern char line[]; for (i = 0; i < MAXLINE - 1 && (c=getchar()) != EOF && c != '\n'; ++i) line[i] = c; if (c == '\n') { line[i] = c; ++i; } line[i] = '\0'; return i; } /* getline: specialized version */ int getline(void) { int c, i; extern char line[]; for (i = 0; i < MAXLINE - 1 && (c=getchar()) != EOF && c != '\n'; ++i) line[i] = c; if (c == '\n') { line[i] = c; ++i; } line[i] = '\0'; return i; } /* copy: specialized version */ void copy(void) { int i; extern char line[], longest[]; i = 0; while ((longest[i] = line[i]) != '\0') ++i; } /* copy: specialized version */ void copy(void) { int i; extern char line[], longest[]; i = 0; while ((longest[i] = line[i]) != '\0') ++i; } The declarations for referencing external variables are redundant if they are defined in the header part of the same file.
Example: Print the Longest Line (Multiple Source Files) I /* main.c */ #include #define MAXLINE 1000 /* maximum input line size */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ int getline(void); void copy(void); /* print longest input line; specialized version */ main() { } /* main.c */ #include #define MAXLINE 1000 /* maximum input line size */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ int getline(void); void copy(void); /* print longest input line; specialized version */ main() { } /* functions.c */ /* getline: specialized version */ int getline(void) { } /* copy: specialized version */ void copy(void) { } /* functions.c */ /* getline: specialized version */ int getline(void) { } /* copy: specialized version */ void copy(void) { }
Example: Print the Longest Line (Multiple Source Files) I /* main.c */ #include #define MAXLINE 1000 /* maximum input line size */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ int getline(void); void copy(void); /* print longest input line; specialized version */ main() { } /* main.c */ #include #define MAXLINE 1000 /* maximum input line size */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ int getline(void); void copy(void); /* print longest input line; specialized version */ main() { } /* functions.c */ /* getline: specialized version */ int getline(void) { } /* copy: specialized version */ void copy(void) { } /* functions.c */ /* getline: specialized version */ int getline(void) { } /* copy: specialized version */ void copy(void) { } /* print longest input line; specialized version */ main() { int len; extern int max; extern char longest[]; max = 0; while ((len = getline()) > 0) if (len > max) { max = len; copy(); } if (max > 0) /* there was a line */ printf("%s", longest); return 0; } /* print longest input line; specialized version */ main() { int len; extern int max; extern char longest[]; max = 0; while ((len = getline()) > 0) if (len > max) { max = len; copy(); } if (max > 0) /* there was a line */ printf("%s", longest); return 0; } /* getline: specialized version */ int getline(void) { int c, i; extern char line[]; for (i = 0; i < MAXLINE - 1 && (c=getchar()) != EOF && c != '\n'; ++i) line[i] = c; if (c == '\n') { line[i] = c; ++i; } line[i] = '\0'; return i; } /* getline: specialized version */ int getline(void) { int c, i; extern char line[]; for (i = 0; i < MAXLINE - 1 && (c=getchar()) != EOF && c != '\n'; ++i) line[i] = c; if (c == '\n') { line[i] = c; ++i; } line[i] = '\0'; return i; } /* copy: specialized version */ void copy(void) { int i; extern char line[], longest[]; i = 0; while ((longest[i] = line[i]) != '\0') ++i; } /* copy: specialized version */ void copy(void) { int i; extern char line[], longest[]; i = 0; while ((longest[i] = line[i]) != '\0') ++i; } Must be kept.
Example: Print the Longest Line (Multiple Source Files) II /* main.c */ #include #define MAXLINE 1000 /* maximum input line size */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ int getline(void); void copy(void); /* print longest input line; specialized version */ main() { } /* main.c */ #include #define MAXLINE 1000 /* maximum input line size */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ int getline(void); void copy(void); /* print longest input line; specialized version */ main() { } /* functions.c */ #include #include "externdef.h" /* getline: specialized version */ int getline(void) { } /* copy: specialized version */ void copy(void) { } /* functions.c */ #include <stdio.h> #include "externdef.h" /* getline: specialized version */ int getline(void) { } /* copy: specialized version */ void copy(void) { } /* externdef.h */ #define MAXLINE 1000 /* maximum input line size */ extern int max; /* maximum length seen so far */ extern char line[]; /* current input line */ extern char longest[]; /* longest line saved here */ /* externdef.h */ #define MAXLINE 1000 /* maximum input line size */ extern int max; /* maximum length seen so far */ extern char line[]; /* current input line */ extern char longest[]; /* longest line saved here */
Example: Print the Longest Line (Multiple Source Files) II /* main.c */ #include #define MAXLINE 1000 /* maximum input line size */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ int getline(void); void copy(void); /* print longest input line; specialized version */ main() { } /* main.c */ #include #define MAXLINE 1000 /* maximum input line size */ int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */ int getline(void); void copy(void); /* print longest input line; specialized version */ main() { } /* functions.c */ #include #include "externdef.h" /* getline: specialized version */ int getline(void) { } /* copy: specialized version */ void copy(void) { } /* functions.c */ #include #include "externdef.h" /* getline: specialized version */ int getline(void) { } /* copy: specialized version */ void copy(void) { } /* externdef.h */ #define MAXLINE 1000 /* maximum input line size */ extern int max; /* maximum length seen so far */ extern char line[]; /* current input line */ extern char longest[]; /* longest line saved here */ /* externdef.h */ #define MAXLINE 1000 /* maximum input line size */ extern int max; /* maximum length seen so far */ extern char line[]; /* current input line */ extern char longest[]; /* longest line saved here */ /* getline: specialized version */ int getline(void) { int c, i; extern char line[]; for (i = 0; i < MAXLINE - 1 && (c=getchar()) != EOF && c != '\n'; ++i) line[i] = c; if (c == '\n') { line[i] = c; ++i; } line[i] = '\0'; return i; } /* getline: specialized version */ int getline(void) { int c, i; extern char line[]; for (i = 0; i < MAXLINE - 1 && (c=getchar()) != EOF && c != '\n'; ++i) line[i] = c; if (c == '\n') { line[i] = c; ++i; } line[i] = '\0'; return i; } /* copy: specialized version */ void copy(void) { int i; extern char line[], longest[]; i = 0; while ((longest[i] = line[i]) != '\0') ++i; } /* copy: specialized version */ void copy(void) { int i; extern char line[], longest[]; i = 0; while ((longest[i] = line[i]) != '\0') ++i; }
Exercise 15. (Take home) Write a program to remove all comments from a C program. Don't forget to handle quoted strings and character constants properly. C comments don't nest.