, , (*, +, &, ^, ), , . - ; , - , - . "C", , . - X = F() + G(); F, G, ; - , F, G , , X . - . , PRINTF("%D %D\N",++N,POWER(2,N)); ( ) , N POWER. , - , ++N; PRINTF("%D %D\N",N,POWER(2,N)); , , " " - . , , , . - A[I] = I++; , I - . - . , ( ), - - , - . : , , . , , , , - , . ( - LINT , - .  * 3. *  - . - "C"; , . 3.1.  , X=0, I++, PRINTF(...), , - , , , X = 0; I++; PRINTF(...); "C" - , , - . /( /) , . , - , , - IF, ELSE, WHILE FOR.( - ; 4). , . 3.2. IF - ELSE IF - ELSE - . IF () -1 ELSE -2, ELSE . - ; "" /.. /, -1. / /, ELSE, -1 -2. IF - , . - IF () IF ( !=0) , - . , ELSE IF - ELSE - , , ELSE IF. - ELSE - IF, ELSE. , IF ( N > 0 ) IF( A > B ) Z = A; ELSE Z = B; ELSE IF, - , ELSE IF. , , - : IF (N > 0) { IF (A > B) Z = A; } ELSE Z = B; T IF (N > 0) FOR (I = 0; I < N; I++) IF (S[I] > 0) { PRINTF("..."); RETURN(I); } ELSE /* WRONG */ PRINTF("ERROR - N IS ZERO\N"); ELSE IF , , - ELSE IF. - . , , IF (A > B) Z = A; ELSE Z = B; Z=A . , IF , Z=A, , - . 3.3. ELSE - IF IF () ELSE IF () ELSE IF () ELSE , . IF - . ; - , - , . - , . ELSE , . ; ELSE , , "" . - , , V. V - . ( 0 N-1), V, -1, V. BINARY(X, V, N) /* FIND X IN V[0]...V[N-1] */ INT X, V[], N; { INT LOW, HIGH, MID; LOW = 0; HIGH = N - 1; WHILE (LOW <= HIGH) { MID = (LOW + HIGH) / 2; IF (X < V[MID]) HIGH = MID - 1; ELSE IF (X > V[MID]) LOW = MID + 1; ELSE /* FOUND MATCH */ RETURN(MID); } RETURN(-1); } - , , V[MID]; ELSE - IF - . 3.4.  SWITCH , . 1 , - , - IF...ELSE IF...ELSE. . MAIN() /* COUNT DIGITS,WHITE SPACE, OTHERS */ { INT C, I, NWHITE, NOTHER, NDIGIT[10]; NWHITE = NOTHER = 0; FOR (I = 0; I < 10; I++) NDIGIT[I] = 0; WHILE ((C = GETCHAR()) != EOF) SWITCH (C) { CASE '0': CASE '1': CASE '2': CASE '3': CASE '4': CASE '5': CASE '6': CASE '7': CASE '8': CASE '9': NDIGIT[C-'0']++; BREAK; CASE ' ': CASE '\N': CASE '\T': NWHITE++; BREAK; DEFAULT : NOTHER++; BREAK; } PRINTF("DIGITS ="); FOR (I = 0; I < 10; I++) PRINTF(" %D", NDIGIT[I]); PRINTF("\NWHITE SPACE = %D, OTHER = %D\N", NWHITE, NOTHER); - ( - ) (CASE). , , . - , CASE, , . , DEFAULT. DEFAULT , , - , . - . . BREAK - . , , , . BREAK RETURN . , BREA WHILE, FOR DO. , . , - , , . - BREAK, . , . - , , . BREAK - ( DEFAULT), . , - , .  3-1 -------------- EXPAND(S, T), - S , , \N \. . 3.5. - WHILE FOR WHILE FOR. WHILE () . , . , , . FOR ( 1; 2; 3) 1; WHILE ( 2) { 3; } FOR . , 1 3 - , 2 - . , . 1 - 3, . - , 2, , , FOR (;;) { ... } , , ( BREAK RETURN). WHILE FOR - , . WHILE ((C = GETCHAR()) == ' ' \!\! C == '\N' \!\! C == '\T') ; /* SKIP WHITE SPACE CHARACTERS */ , , WHIL . FOR, , , , . FOR (I = 0; I < N; I++) "C" N , DO PL/1. , , , , , . FOR , . FOR , - , . ATOI, . ; + -. ( 4 ATOF, ). : - , - , - . , . ATOI(S) /* CONVERT S TO INTEGER */ CHAR S[]; { INT I, N, SIGN; FOR(I=0;S[I]==' ' \!\! S[I]=='\N' \!\! S[I]=='\T';I++) ; /* SKIP WHITE SPACE */ SIGN = 1; IF(S[I] == '+' \!\! S[I] == '-') /* SIGN */ SIGN = (S[I++]=='+') ? 1 : - 1; FOR( N = 0; S[I] >= '0' && S[I] <= '9'; I++) N = 10 * N + S[I] - '0'; RETURN(SIGN * N); } , - . - . , , - , . - . , - . SHELL(V, N) /* SORT V[0]...V[N-1] INTO INCREASING ORDER */ INT V[], N; { INT GAP, I, J, TEMP; FOR (GAP = N/2; GAP > 0; GAP /= 2) FOR (I = GAP; I < N; I++) FOR (J=I-GAP; J>=0 && V[J]>V[J+GAP]; J-=GAP) { TEMP = V[J]; V[J] = V[J+GAP]; V[J+GAP] = TEMP; } } . - , N/2 , . , - ; - . , - . , - FOR , , . "C" ",", - FOR. - , , , . , FOR , , - . REVERSE(S), S . REVERSE(S) /* REVERSE STRING S IN PLACE */ CHAR S[]; { INT C, I, J; FOR(I = 0, J = STRLEN(S) - 1; I < J; I++, J--) { C = S[I]; S[I] = S[J]; S[J] = C; } } , , .., .  3-2 --------------- EXPAND(S1,S2), -Z S1 ...XYZ S2. - . --, -Z0-9 --Z. ( , -, , ). 3.6. DO - WHILE 1, WHILE FOR , - , . "C", DO-WHILE, , ; . - : DO WHILE () , . , .. , . , DO-WHILE , WHILE FOR, . , - , , , ITOA, - ( ATOI). , . , - . - , . ITOA(N,S) /*CONVERT N TO CHARACTERS IN S */ CHAR S[]; INT N; { INT I, SIGN; IF ((SIGN = N) < 0) /* RECORD SIGN */ N = -N; /* MAKE N POSITIVE */ I = 0; DO { /* GENERATE DIGITS IN REVERSE ORDER */ S[I++] = N % 10 + '0';/* GET NEXT DIGIT */ } WHILE ((N /=10) > 0); /* DELETE IT */ IF (SIGN < 0) S[I++] = '-' S[I] = '\0'; REVERSE(S); } DO-WHILE , , , N, S - . , DO-WHIL, , , WHILE WHILE.  3-3 -------------- ITOA , .. N A -2 -1, - . . , - .  3-4 -------------- ITOB(N,S), - N - S. ITOH, .  3-5 --------------- I, , - . - ; - , , , . 3.7. BREAK - , . BR FOR, WHILE DO , - . BR ( - ). - . - BR , . #DEFINE MAXLINE 1000 MAIN() /* REMOVE TRAILING BLANKS AND TABS */ { INT N; CHAR LINE[MAXLINE]; WHILE ((N = GETLINE(LINE,MAXLINE)) > 0) { WHILE (--N >= 0) IF (LINE[N] != ' ' && LINE[N] != '\T' && LINE[N] != '\N') BREAK; LINE[N+1] = '\0'; PRINTF("%S\N",LINE); } } GETLINE . LINE (, --N N ) - , - , . - , , N - (.., ). , , . BR : WHILE ((N = GETLINE(LINE,MAXLINE)) > 0) { WHILE (--N >= 0 && (LINE[N] == ' ' \!\! LINE[N] == '\T' \!\! LINE[N] == '\N')) ; ... } , - . , - &&, \!\!, ! , - . 3.8. CONTINUE CONTINUE BR, - ; - (FOR, WHILE, DO ). WHILE DO - ; FOR - . ( CONTINUE , . CONTINUE ). , - ; . FOR (I = 0; I < N; I++) { IF (A[I] < 0) /* SKIP NEGATIVE ELEMENTS */ CONTINUE; ... /* DO POSITIVE ELEMENTS */ } CONTINUE , , - , , - .  3-6 -------------- , - , . ( UNIQ UNIX). 3.9. GOTO  "C" GOTO, - , . GOTO , . GOTO . , , GOTO . , , , . BR, . : FOR ( ... ) FOR ( ... ) { ... IF (DISASTER) GOTO ERROR; } ... ERROR: CLEAN UP THE MESS , - . , - , . , - GOTO. . (- 5). - : FOR (I = 0; I < N; I++) FOR (J = 0; J < M; J++) IF (V[I][J] < 0) GOTO FOUND; /* DIDN'T FIND */ ... FOUND: /* FOUND ONE AT POSITION I, J */ ... , GOTO, , , , - . - , : FOUND = 0; FOR (I = 0; I < N && !FOUND; I++) FOR (J = 0; J < M && !FOUND; J++) FOUND = V[I][J] < 0; IF (FOUND) /* IT WAS AT I-1, J-1 */ ... ELSE /* NOT FOUND */ ... , , GOTO, .  * 4. *  - , , - . - , , , , . "C" ; "C"- , . ; . , . "- " /GETCHAR , PUTCHAR/ /SIN, COS, SQRT/. . 4.1.  - , - . / - GREP "UNIX"/. , "THE" - NOW IS THE TIME FOR ALL GOOD MEN TO COME TO THE AID OF THEIR PARTY NOW IS THE TIME MEN TO COME TO THE AID OF THEIR PARTY : WHILE ( ) IF ( ) , , . , , - - . , . " " - GETLINE, , - 1, " " - PRINTF, - . , , . , - PL/1: INDEX(S,) , , S, T, -1, S . 0, 1, "C" . - , - INDEX; . , - , - . , - , . - , , INDEX, . - 5 , , . GETLINE; 1. #DEFINE MAXLINE 1000 MAIN() /* FIND ALL LINES MATCHING A PATTERN */ { CHAR LINE[MAXLINE]; WHILE (GETLINE(LINE, MAXLINE) > 0) IF (INDEX(LINE, "THE") >= 0) PRINTF("%S", LINE); } GETLINE(S, LIM) /* GET LINE INTO S, RETURN LENGTH * CHAR S[]; INT LIM; { INT C, I; I = 0; WHILE(--LIM>0 && (C=GETCHAR()) != EOF && C != '\N') S[I++] = C; IF (C == '\N') S[I++] = C; S[I] = '\0'; RETURN(I); } INDEX(S,T) /* RETURN INDEX OF T IN S,-1 IF NONE */ CHAR S[], T[]; { INT I, J, K; FOR (I = 0; S[I] != '\0'; I++) { FOR(J=I, K=0; T[K] !='\0' && S[J] == T[K]; J++; K++) ; IF (T[K] == '\0') RETURN(I); } RETURN(-1); } ( , ) , { , } , - ; DUMMY () { } . / - /. - , ; . . - / /; . , , , . RETURN - , - . RETURN : RETURN () , . , RETURN ; - . - - , "" , . E , , - . "" , , . - LINT . "C"-, - , . "UNIX", , 'CC', 1. , MAIN., GETLINE.C INDEX. . CC MAIN.C GETLINE.C INDEX.C , MAIN.O, GETLINE.O INDEX.O - , A.OUT . - , MAIN.C, CC MAIN.C GETLIN.O INDEX.O 'CC' "." "." , .  4-1 ---------------- RINDEX(S,T), S -1, S T. 4.2. ,  - - . , , , , WHILE (GETLINE(LINE, MAXLINE) > 0) , , - , . , , - INT. CHAR - INT, , - CHAR. , . , - - ? , SQRT, SIN COS DOUBLE; . , , ATF(S), S - . ATF - I, 2 3; - , , , ./ - ; , /. -, ATF , INT. - FLOAT DOUBLE, - , ATOF FLOAT; - , , DOUBLE. , : DOUBLE ATOF(S) /* CONVERT STRING S TO DOUBLE */ CHAR S[]; { DOUBLE VAL, POWER; INT I, SIGN; FOR(I=0; S[I]==' ' \!\! S[I]=='\N' \!\! S[I]=='\T'; I++) ; /* SKIP WHITE SPACE */ SIGN = 1; IF (S[I] == '+' \!\! S[I] == '-') /* SIGN */ SIGN = (S[I++] == '+') ? 1 : -1; FOR (VAL = 0; S[I] >= '0' && S[I] <= '9'; I++) VAL = 10 * VAL + S[I] - '0'; IF (S[I] == '.') I++; FOR (POWER = 1; S[I] >= '0' && S[I] <= '9'; I++) { VAL = 10 * VAL + S[I] - '0'; POWER *= 10; } RETURN(SIGN * VAL / POWER); } , , , , ATOF , INT . / /, , - , , . #DEFINE MAXLINE 100 MAIN() /* RUDIMENTARY DESK CALKULATOR */ { DOUBLE SUM, ATOF(); CHAR LINE[MAXLINE]; SUM = 0; WHILE (GETLINE(LINE, MAXLINE) > 0) PRINTF("\T%.2F\N",SUM+=ATOF(LINE)); DOUBLE SUM, ATOF(); , SUM DOUBLE , ATOF , DOUBLE . , SUM, ATOF(...) . ATOF , "C" , , . ATOF - MAIN - , . ATOF / /, , ATOF DOUBLE, MAIN , INT , - . / LINT /. ATOF, , , - ATOI ( INT): ATOI(S) /* CONVERT STRING S TO INTEGER */ CHAR S[]; { DOUBLE ATOF(); RETURN(ATOF(S)); } RETURN. RETURN () . RETURN - F, DOUBLE, - INT, ATOI INT. ( 2, INT ).  4-2 ---------------- ATOF , 123.45-6 'E' - , . 4.3.  1 , - , .. , . , . - , - , - . , ; . , - . , - . 5 , - . , . , , - , - - . , , , - , - , MAX PL/1. , , , - . "C" - - PRINTF . , - . PRINTF - , , - , . . , - , - ; - , , ( ) . 4.4.  "C" - , , . - "" - "", , . - , - , . , "C" .