programming language c tutorial introduction 主講人:虞台文
TRANSCRIPT
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
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.
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
ALUALU
ControlControl
CPU
InputInput OutputOutput
MemoryMemory
InputDevice
OutputDevice
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"
Our First C Program Hello World
#include <stdio.h>
main(){
printf("hello, world\n");}
#include <stdio.h>
main(){
printf("hello, world\n");}
Our First C Program Hello World
#include <stdio.h>
main(){
printf("hello, world\n");}
#include <stdio.h>
main(){
printf("hello, world\n");}
include information about standard
library
include information about standard
library
define a function called mainthat received no argument
values
define a function called mainthat received no argument
values
Our First C Program Hello World
#include <stdio.h>
main(){
printf("hello, world\n");}
#include <stdio.h>
main(){
printf("hello, world\n");}
define a function called mainthat received no argument
values
define a function called mainthat received no argument
values
Our First C Program Hello World
#include <stdio.h>
main(){
printf("hello, world\n");}
#include <stdio.h>
main(){
printf("hello, world\n");}
statements of main are enclosed in
braces
statements of main are enclosed in
braces
Our First C Program Hello World
#include <stdio.h>
main(){
printf("hello, world\n");}
#include <stdio.h>
main(){
printf("hello, world\n");}
main calls library function printf
main calls library function printf
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.
Main Parts
Headers/Comments/Expressions
#include <stdio.h>
/* Our first C Program */
main(){
printf("hello, world\n");}
#include <stdio.h>
/* Our first C Program */
main(){
printf("hello, world\n");}
Example:Fahrenheit-Celsius Table
59 ( 32)C F
#include <stdio.h>/* 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 <stdio.h>/* 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
59 ( 32)C F
#include <stdio.h>/* 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 <stdio.h>/* 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;
}}
Statements59 ( 32)C F
#include <stdio.h>/* 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 <stdio.h>/* 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.
Individual statements are terminated by semicolons.
Variable Declarations
#include <stdio.h>/* 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 <stdio.h>/* 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.
59 ( 32)C F
Variable Declarations
#include <stdio.h>/* 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 <stdio.h>/* 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;
}}
59 ( 32)C F
• 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
32768 +32767
– 32-bit machine
2147483646 +2147483647
int fahr, celsius;int lower, upper, step;
int fahr, celsius;int lower, upper, step;
Integer
The range of integer depends on
machineINT_MIN INT_MAX
int fahr, celsius;int lower, upper, step;
int fahr, celsius;int lower, upper, step;
Integer
The range of integer depends on
machineINT_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 10-38 and 1038
float fahr, celsius;float lower, upper, step;
float fahr, celsius;float lower, upper, step;
FLT_MIN FLT_MAX
Fundamental Types
Type Size
char 1 byte
short 2 bytes
int 4 bytes
long 4 bytes
float 4 bytes
double 8 bytes
Machine Dependent
Type Size
char 1 byte
short 2 bytes
int 4 bytes
long 4 bytes
float 4 bytes
double 8 bytes
Type Size
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 <stdio.h>/* 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 <stdio.h>/* 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 <stdio.h>/* 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 <stdio.h>/* 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.
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 <stdio.h>/* 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 <stdio.h>/* 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;
}}
59 ( 32)C F
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 <stdio.h>/* 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 <stdio.h>/* 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
decimal tab decimal newline
printf General-Purpose Output Formatting Function
#include <stdio.h>/* 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 <stdio.h>/* 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 alignedLeft aligned
printf General-Purpose Output Formatting Function
Synopsis
#include <stdio.h>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 <stdio.h>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 <stdio.h>/* 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 <stdio.h>/* 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 alignedRight aligned
Example:Fahrenheit-Celsius Table (Float)
59 ( 32)C F
#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;
}}
#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;
}}
Example:Fahrenheit-Celsius Table (Float)
59 ( 32)C F
#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;
}}
#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;
}}
Statements
Simple Statementslower = 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 <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;
}}
#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;
}}
Program Indentation
#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;
}}
#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;
}}
StatementStatementStatementStatementStatementStatement
Statement
Program Indentation
#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;
}}
#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;
}}
StatementStatementStatementStatementStatementStatement
StatementStatementStatement
Program Indentation
#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;
}}
#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;
}}
StatementStatementStatementStatementStatementStatement
Compound Statement
Example:Fahrenheit-Celsius Table
59 ( 32)C F
#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;
}}
#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;
}}
There are many ways to do the same task.
Example:Fahrenheit-Celsius Table
59 ( 32)C F
#include <stdio.h>
/* 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 <stdio.h>
/* 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 <stdio.h>
/* 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 <stdio.h>
/* 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.
Exercises3. Modify the temperature conversion program to print
the table in reverse order, that is, from 300 degrees to 0.
Exercises4. 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.
number square cube0 0 01 1 12 4 83 9 274 16 645 25 1256 36 2167 49 3438 64 5129 81 71910 100 1000
Example:Fahrenheit-Celsius Table
#include <stdio.h>
#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 <stdio.h>
#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));
}
getchar() & putchar()
Synopsis#include <stdio.h>int getchar(void);
Descriptiongetchar 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 <stdio.h>int getchar(void);
Descriptiongetchar 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 <stdio.h>int putchar(int c);
Descriptionputchar writes the character c to the standard output stream. putchar returns the character written. If a write error occurs, putchar returns EOF.
Synopsis#include <stdio.h>int putchar(int c);
Descriptionputchar 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 <stdio.h>/* copy input to output; 1st version */
main(){ int c; c = getchar(); while (c != EOF) {
putchar(c); c = getchar();
}}
#include <stdio.h>/* 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 <stdio.h>/* 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.
simple stateme
nt
Example: Typewriter (Version 2)
#include <stdio.h>/* 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 <stdio.h>/* 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
simple stateme
nt
Example: Character Counting (Version 1)
#include <stdio.h>
/* 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 <stdio.h>
/* 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);}
null stateme
nt
Example: Character Counting (Version 2)
#include <stdio.h>
/* 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 <stdio.h>
/* 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);}
== equals to
if ( expression ) statement
if ( expression ) statement else statement
if ( expression ) statement
if ( expression ) statement else statement
simple stateme
nt
Example: Line Counting
#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);}
#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 stateme
nt
Example: Line Counting
#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);}
#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 stateme
nt
Can we move to here?
Example: Word Counting
OUT IN
visible
non-visible
visible
>
non-visible
This is a test case.OIIIIOIIOIOOOIIIIO OIIIII
Example: Word Counting
#include <stdio.h>#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 <stdio.h>#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);}
OUT INvisible
non-visible
visible
>non-visible
Exercises
7. Write a program to print a histogram of the frequencies of different characters in its input.
Arrays
Array is a data structure that stores contiguous data elements of the same type.
Examples:int score[50];char address[50];double distance[50];
score
address
distance
200
byte
s50
byte
s400
byte
s
ArraysExamples:int score[50];char address[50];double distance[50];
score
address
distance
...
score[0]
score[1]
score[49]
ArraysExamples:int score[50];char address[50];double distance[50];
score
address
distance
address[0]address[1]address[2]
address[49]
...
ArraysExamples:int score[50];char address[50];double distance[50];
score
address
distance ...
distance[0]
distance[49]
#include <stdio.h>
/* 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 <stdio.h>
/* 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 <stdio.h>
/* 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 <stdio.h>
/* 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 <stdio.h>
/* 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 <stdio.h>
/* 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 <stdio.h>
/* 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 <stdio.h>
/* 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 (condition1)statement1
else if (condition2) statement2
else if (condition3) statement3
...else
statementn
if (condition1)statement1
else if (condition2) statement2
else if (condition3) statement3
...else
statementn
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.
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 an
y)
{
declarations
statements
}
return-type function-name(parameter declarations, if an
y)
{
declarations
statements
}
Function Definition
return-type function-name(parameter declarations, if an
y)
{
declarations
statements
}
return-type function-name(parameter declarations, if an
y)
{
declarations
statements
}
If absent, return type is considered int.
If absent, return type is considered int.
Called formal
parameters
Called formal
parameters
Example: Power#include <stdio.h>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 <stdio.h>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 <stdio.h>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 <stdio.h>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=?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?
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)
l (6C)
o (6F)
\n (0A)
\0 (00)
str
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 getline() function which returns the length of the line read.
Implement a copy() function to save string.
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;
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 <stdio.h>#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 <stdio.h>#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;
}. . . . . . . . . . . .
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.
Local (Private) Variables
#include <stdio.h>#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 <stdio.h>#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 <stdio.h>#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 <stdio.h>#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 <stdio.h>
#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 <stdio.h>
#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 <stdio.h>
#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 <stdio.h>
#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 <stdio.h>
#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 <stdio.h>
#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 <stdio.h>
#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 <stdio.h>
#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 <stdio.h>
#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 <stdio.h>
#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 .
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 <stdio.h>
#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 <stdio.h>
#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 <stdio.h>
#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 <stdio.h>
#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.Must be kept.
Must be kept.Must be kept.
Example: Print the Longest Line (Multiple Source Files) II
/* main.c */#include <stdio.h>
#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 <stdio.h>
#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 <stdio.h>#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 <stdio.h>
#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 <stdio.h>
#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 <stdio.h>#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 */
/* 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;}