Download presentation
Presentation is loading. Please wait.
Published byEleanor Gaines Modified over 9 years ago
1
Programming Language C Tutorial Introduction 主講人:虞台文
2
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
3
Programming Language C Tutorial Introduction Background
4
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.
5
Grading 1. Homework40% 2. Midterm30% 3. Final30% 4. Other10%
6
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
7
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
8
Computer Architecture ALU Control CPU Input Output Memory Input Device Output Device
9
Programming Language C Tutorial Introduction Getting Started
10
Setting Program Development Environment
15
%SystemRoot%\system32\cmd.exe /K "F:\VS6\VC98\Bin\VCVARS32.BAT" %SystemRoot%\system32\cmd.exe /K "F:\VS6\VC98\Bin\VCVARS32.BAT"
16
Setting Program Development Environment
17
Our First C Program Hello World
18
#include main() { printf("hello, world\n"); } #include main() { printf("hello, world\n"); }
19
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
20
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
21
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
22
Our First C Program Hello World #include main() { printf("hello, world\n"); } #include main() { printf("hello, world\n"); } main calls library function printf
23
Our First C Program Hello World
24
Compiling and Linking
30
Execution
32
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.
33
Programming Language C Tutorial Introduction IDE
34
Visual C++ 6.0
37
Win32 Console Application
40
Hello_IDE
46
Hello.c
47
Building Application
49
Execution
51
Files Generated by IDE
52
Programming Language C Tutorial Introduction Main Parts of C Programs
53
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"); }
54
Example Identify the three parts in the following program
55
Remark C++ also uses // to comment a single line.
56
The Syntax of C Language
57
Programming Language C Tutorial Introduction Variables and Arithmetic Expressions
58
Example: Fahrenheit-Celsius table
59
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; }
60
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; }
61
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.
62
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.
63
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?
64
Integer The range of integer depends on machine – 16-bit machine 32768 +32767 – 32-bit machine 2147483646 +2147483647 int fahr, celsius; int lower, upper, step; int fahr, celsius; int lower, upper, step;
65
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;
66
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;
67
Float A float number is typically a 32-bit quantity, with at least six significant digits and magnitude generally between about 10 -38 and 10 38 float fahr, celsius; float lower, upper, step; float fahr, celsius; float lower, upper, step; FLT_MIN FLT_MAX
68
Fundamental Types TypeSize char 1 byte short 2 bytes int 4 bytes long 4 bytes float 4 bytes double 8 bytes Machine Dependent
69
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++
70
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.
71
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
72
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?
73
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; } }
74
printf General-Purpose Output Formatting Function printf("%d\t%d\n", fahr, celsius); format string decimaltabdecimalnewline
75
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
76
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.
77
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
78
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; } }
79
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; } }
80
More on printf
81
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
82
While Statements while( cond_expression ) statement The statement can be: a simple statement a null statement a compound statements
83
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; }
84
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
85
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
86
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
87
Programming Language C Tutorial Introduction The for Statement
88
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.
89
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)); }
90
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
91
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.
92
Exercises 3. Modify the temperature conversion program to print the table in reverse order, that is, from 300 degrees to 0.
93
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 000 111 248 3927 41664 525125 636216 749343 864512 981719 101001000
94
Programming Language C Tutorial Introduction Symbolic Constants
95
#define Text Substitution #define name replacement list #define PI 3.1415926 Example:
96
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)); }
97
Programming Language C Tutorial Introduction Character Input and Output
98
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)
99
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
100
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
101
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.
102
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
103
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
104
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
105
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); }
106
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
107
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
108
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?
109
Example: Word Counting OUTIN visible non-visible visible > non-visible This is a test case. OIIIIOIIOIOOOIIIIO OIIIII
110
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
111
Exercises 7. Write a program to print a histogram of the frequencies of different characters in its input.
112
Programming Language C Tutorial Introduction Arrays
113
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
114
Arrays Examples: intscore[50]; char address[50]; double distance[50]; score address distance...... score[0] score[1] score[49]
115
Arrays Examples: intscore[50]; char address[50]; double distance[50]; score address distance address[0] address[1] address[2] address[49]......
116
Arrays Examples: intscore[50]; char address[50]; double distance[50]; score address distance...... distance[0] distance[49]
117
#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
118
#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
119
#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
120
#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
121
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
122
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.
123
Exercises 7. Write a program to print a histogram of the frequencies of different characters in its input.
124
Programming Language C Tutorial Introduction Functions
125
Functions we have used printf getchar putchar
126
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
127
Function Definition return-type function-name(parameter declarations, if any) { declarations statements } return-type function-name(parameter declarations, if any) { declarations statements }
128
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
129
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
130
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; }
131
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; }
132
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=?
133
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?
134
Programming Language C Tutorial Introduction Character Arrays
135
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
136
Strings in C
137
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
138
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.
139
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
140
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;
141
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
142
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; }
143
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; }......
144
Example: Print the Longest Line
147
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.
148
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.
149
Programming Language C Tutorial Introduction External Variables and Scope
150
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; }
151
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.
152
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.
153
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
154
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; }
155
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; }
156
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; }
157
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.
158
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) {............ }
159
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.
160
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 */
161
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; }
162
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.
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.