"", , ( , ), . - COMON EXTERNAL PL/1. , , - , . , , . - , , . , , - , . , , 1, - , . . , . . - . - - ; - . , , - . , - . , , , - , . . , , . +,-,*,/ = ( ). - , . ; - (1-2)*(4+5)= 12-45+*= . - ; , ( ) , - . 1 2 , -1. 4 5 - ,9. -1 9 , -9.- = , ( ). ,, , - . , - . , . , - : WHILE( , IF ( ) LSE IF ( ) ELSE , , - , , . . . - MAIN , . MAIN , - ; - . , PUSH ( ) POP ( ), MAIN. . - ; , -, - , , - 3. #DEFINE MAXOP 20 /* MAX SIZE OF OPERAND, OPERTOR * #DEFINE NUMBER '0' /* SIGNAL THAT NUMBER FOUND */ #DEFINE TOOBIG '9' /* SIGNAL THAT STRING IS TOO BIG * MAIN() /* REVERSE POLISH DESK CALCULATOR */ /( INT TUPE; CHAR S[MAXOP]; DOUBLE OP2,ATOF(),POP(),PUSH(); WHILE ((TUPE=GETOP(S,MAXOP)) !=EOF); SWITCH(TUPE) /( CASE NUMBER: PUSH(ATOF(S)); BREAK; CASE '+': PUSH(POP()+POP()); BREAK; CASE '*': PUSH(POP()*POP()); BREAK; CASE '-': OP2=POP(); PUSH(POP()-OP2); BREAK; CASE '/': OP2=POP(); IF (OP2 != 0.0) PUSH(POP()/OP2); ELSE PRINTF("ZERO DIVISOR POPPED\N"); BREAK; CASE '=': PRINTF("\T%F\N",PUSH(POP())); BREAK; CASE 'C': CLEAR(); BREAK; CASE TOOBIG: PRINTF("%.20S ... IS TOO LONG\N",S) BREAK; /) /) #DEFINE MAXVAL 100 /* MAXIMUM DEPTH OF VAL STACK */ INT SP = 0; /* STACK POINTER */ DOUBLE VAL[MAXVAL]; /*VALUE STACK */ DOUBLE PUSH(F) /* PUSH F ONTO VALUE STACK */ DOUBLE F; /( IF (SP < MAXVAL) RETURN(VAL[SP++] =F); ELSE /( PRINTF("ERROR: STACK FULL\N"); CLEAR(); RETURN(0); /) /) DOUBLE POP() /* POP TOP VALUE FROM STEACK */ /( IF (SP > 0) RETURN(VAL[--SP]); ELSE /( PRINTF("ERROR: STACK EMPTY\N"); CLEAR(); RETURN(0); /) /) CLEAR() /* CLEAR STACK */ /( SP=0; /) C CLEAR, PUSH POP. GETOP . 1, - , - . , - PUSH, POP CLEAR, . MAIN , - . , = , - PUSH(POP()); , , . , + * , , , - , - / .  4-3 --------------- . - /%/ . "- ", . - . / , - /. 4.5. ,  , "C"-, ; , . : , - ? , - ? 4.5.1.  , . , , , , , , - . . - , , . , VAL, SP, PUSH, POP CLEAR , , : INT SP = 0; DOUBLE VAL[MAXVAL]; DOUBLE PUSH(F) {...} DOUBLE POP() {...} CLEAR() {...} VAL SP PUSH, POP CLEAR ; . , - , - , , , EXTERN. - . / , - ../; . INT SP; DOUBLE VAL[MAXVAL]; SP VAL, - - . EXTERN INT SP; EXTERN DOUBLE VAL[]; SP INT, VAL DOUBLE / /, - . , , ; - EXTERN . / EXTERN , /. - . , EXTERN . , VAL SP - , PUSH, POP CLEAR - . : 1: ---------- INT SP = 0; /* STACK POINTER */ DOUBLE VAL[MAXVAL]; /* VALUE STACK */ 2: ---------- EXTERN INT SP; EXTERN DOUBLE VAL[]; DOUBLE PUSH(F) {...} DOUBLE POP() {...} CLEAR() {...} EXTERN ' 1' , ; ' 2'. , #INCLUDE, EXTERN . GETOP, . - : , . , . / / NUMBER , . , - , - . GETOP / / , - . , NUMBER . , GETOP - , - ; TOOBIG . GETOP(S, LIM) /* GET NEXT OPRERATOR OR OPERAND */ CHAR S[]; INT LIM; { INT I, C; WHILE((C=GETCH())==' '\!\! C=='\T' \!\! C=='\N') ; IF (C != '.' && (C < '0' \!\! C > '9')) RETURN(C); S[0] = C; FOR(I=1; (C=GETCHAR()) >='0' && C <= '9'; I++) IF (I < LIM) S[I] = C; IF (C == '.') { /* COLLECT FRACTION */ IF (I < LIM) S[I] = C; FOR(I++;(C=GETCHAR()) >='0' && C<='9';I++) IF (I < LIM) S[I] =C; } IF (I < LIM) { /* NUMBER IS OK */ UNGETCH(C); S[I] = '\0'; RETURN (NUMBER); } ELSE { /* IT'S TOO BIG; SKIP REST OF LINE */ WHILE (C != '\N' && C != EOF) C = GETCHAR(); S[LIM-1] = '\0'; RETURN (TOOBIG); } } 'GETCH' 'UNGETCH'? , , , , , . , : , - , . , , . , " " . , , - , - , . , - , . - GETCH , - ; UNGETCH , GETCH . , , . UNGETCH - , . GETCH , - ; , GETCHAR. , . - GETCH UNGETCH - , . , GETCH, UNGETCH : #DEFINE BUFSIZE 100 CHAR BUF[BUFSIZE]; /* BUFFER FOR UNGETCH */ INT BUFP = 0; /* NEXT FREE POSITION IN BUF */ GETCH() /* GET A (POSSIBLY PUSHED BACK) CHARACTER */ { RETURN((BUFP > 0) ? BUF[--BUFP] : GETCHAR()); } UNGETCH(C) /* PUSH CHARACTER BACK ON INPUT */ INT C; { IF (BUFP > BUFSIZE) PRINTF("UNGETCH: TOO MANY CHARACTERS\N"); ELSE BUF [BUFP++] = C; } , , - .  4-4 ---------------- UNGETS(S) , . UNGETS BUF BUFP UNGETCH ?  4-5 ---------------- , . - GETCH UNGETCH .  4-6 ---------------- GETCH UNGETCH - EOF . , , EOF, . 4.6.  , EXTERN, . , . , , - , , , - , . , - , . , - , , , PRINTF , . , , - . , , BUF BUFP GETCH-UNGETCH, , - GETCH UNGETCH , - . STATIC CHAR BUF[BUFSIZE]; /* BUFFER FOR UNGETCH */ STATIC INT BUFP=0; /*NEXT FREE POSITION IN BUF */ GETCH() {...} UNGETCH() {...} BUF BUFP; , . , , , - STATIC , - . , , , . ; . , , STATIC ; , . "C" "STATIC" , , "". ; / / - , , - . , . - , GETCH UNGETCH "" ; BUF BUFP , . PUSH, POP CLEAR ; VAR SP . 4.7.  - . REGISTER , - . , - , REGISTER, , . REGISTER REGISTER INT X; REGISTER CHAR C; ..; INT . REGISTER - - . : F(C,N) REGISTER INT C,N; { REGISTER INT I; ... } - , . - , - . - REGISTER . ( 5). - . , , PDP-11 REGISTER , INT, CHAR . 4.8.  "C" - PL/1 ; . , , . (- ) - , , , - . , - , , , . IF (N > 0) { INT I; /* DECLARE A NEW I */ FOR (I = 0; I < N; I++) ... } I "" IF; I I - . . INT X; F() { DOUBLE X; ... } X F - DOUBLE, F - . : INT X; F(X) DOUBLE X; { ... } F X , . 4.9.  , , . , , , . , - ; - - (). ( ) - , : INT X = 1; CHAR SQUOTE = '\''; LONG DAY = 60 * 24; /* MINUTES IN A DAY */ - , . . - : , - . , 3 BINARY(X, V, N) INT X, V[], N; { INT LOW = 0; INT HIGH = N - 1; INT MID; ... } BINARY(X, V, N) INT X, V[], N; { INT LOW, HIGH, MID; LOW = 0; HIGH = N - 1; ... } , - . - . , . . - , - , . 1, MAIN() /* COUNT DIGITS, WHITE SPACE, OTHERS */ ( INT C, I, NWHITE, NOTHER; INT NDIGIT[10]; NWHITE = NOTHER = 0; FOR (I = 0; I < 10; I++) NDIGIT[I] = 0; ... ) INT NWHITE = 0; INT NOTHER = 0; INT NDIGIT[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; MAIN() /* COUNT DIGITS, WHITE SPACE, OTHERS */ ( INT C, I; ... ) , - , - . , - , - . . , , , - . ; - : CHAR PATTERN[] = "THE"; , : CHAR PATTERN[] = { 'T', 'H', 'E', '\0' }; , - , . ( \0). 4.10.  "C" ; , . . , - : , . . - , 3 ITOA, - . PRINTD . PRINTD(N) /* PRINT N IN DECIMAL */ INT N; { CHAR S[10]; INT I; IF (N < 0) { PUTCHAR('-'); N = -N; } I = 0; DO { S[I++] = N % 10 + '0'; /* GET NEXT CHAR */ } WHILE ((N /= 10) > 0); /* DISCARD IT */ WHILE (--I >= 0) PUTCHAR(S[I]); } - , PRINTD , , - . PRINTD(N) /* PRINT N IN DECIMAL (RECURSIVE)*/ INT N; ( INT I; IF (N < 0) { PUTCHAR('-'); N = -N; } IF ((I = N/10) != 0) PRINTD(I); PUTCHAR(N % 10 + '0'); ) , - , . - , PRINTD(123) PRINTD N = 123. 12 PRINTD, , 3. PRINTD 1 ( ), 2. , - - . - . , - . - , , ; 6.  4-7 -------------- , PRINTD - ITOA; .. - .  4-8 -------------- REVERSE(S), S. 4.11. "C" "" . - , , #DEFINE; . 4.11.1.  #DEFINE ( ) "" . #INCLUDE "FILENAME" FILENAME. ( - ). , #DEFINE EXTERN . #INCLUDE. #INCLUDE . - , - , , , - . , - -TO , . 4.11.2.  #DEFINE TES 1 - . #DEFINE , ""; - . - ; , \ . " " , #DEFINE, - . - , , - . , , , YES - , PRINTF("YES") - . #DEFINE K, , , . , , #DEFINE THEN #DEFINE BEGIN { #DEFINE END ;} IF (I > 0) THEN BEGIN A = 1; B = 2 END - , - . , , MAX : #DEFINE MAX(A, B) ((A) > (B) ? (A) : (B)) X = MAX(P+Q, R+S); X = ((P+Q) > (R+S) ? (P+Q) : (R+S)); " ", , - . - ; MAX , . , MAX, . - ; , , , , - . - , - . (- #DEFINE SQUARE(X) X * X , SQUARE(Z+1)). : , , . . 7 - -, GETCHAR PUTCHAR ( PUTCHAR - ), . .  4-9 --------------- SWAP(X, Y), - INT. ( ).  * 5. *  - , - . "C". , - , - , , , - . GOTO, - , . A, ; , - - . , , - . - . 5.1.  , - "" - . , - , , INT, - , . & , = &; ; , "- " . & , &(-1) &3 - . - . * , . , Y INT, Y = *; Y , . - = &; Y = *; Y , Y = X; , : INT X, Y; INT *PX; X Y . INT *PX; ; , *PX INT. , PX *PX, INT. - , . , . , DOUBLE ATOF(), *DP; , ATOF() *DP DOUBLE. , - , . . , PX X, *PX - , X. Y = *PX + 1 Y , 1 X; PRINTF("%D\N", *PX) X; D = SQRT((DOUBLE) *PX) D X, - SQRT X DOUBLE. ( 2). Y = *PX + 1 * & , , , PX, 1 Y. - , Y = *(PX + 1) . PX X, *PX = 0 X , *PX += 1 , (*PX)++ ; - , , * ++, - , PX, - , . , , , . PY - INT, PY = PX PX PY, PY , PX. 5.2.  "" - " ", - - . , ? , - SWAP. SWAP(A, B); SWAP : SWAP(X, Y) /* WRONG */ INT X, Y; { INT TEMP; TEMP = X; X = Y; Y = TEMP; } - SWAP A B . , . : SWAP(&A, &B); & , &A A. SWAP - . SWAP(PX, PY) /* INTERCHANGE *PX AND *PY */ INT *PX, *PY; { INT TEMP; TEMP = *PX; *PX = *PY; *PY = TEMP; } , . ( , SWAP O , - ). GETINT, , , . GETINT , - , . - , EOF, . , 7 SCANF, , - GETINT EOF ; - . , . - . - GETINT: INT N, V, ARRAY[SIZE]; FOR (N = 0; N < SIZE && GETINT(&V) != EOF; N++) ARRAY[N] = V; V - , . , GETINT &V V. V , GETINT , - . GETINT ATOI: GETINT(PN) /* GET NEXT INTEGER FROM INPUT */ INT *PN; { INT C,SIGN; WHILE ((C = GETCH()) == ' ' \!\! C == '\N' \!\! C == '\T'); /* SKIP WHITE SPACE */ SIGN = 1; IF (C == '+' \!\! C == '-') { /* RECORD SIGN */ SIGN = (C == '+') ? 1 : -1; C = GETCH(); } FOR (*PN = 0; C >= '0' && C <= '9'; C = GETCH()) *PN = 10 * *PN + C - '0'; *PN *= SIGN; IF (C != EOF) UNGETCH(C); RETURN(C); } *PN GETINT - INT. GETCH UNGETCH ( 4) , , , .  5-1 --------------- GETFLOAT, GETINT . GETFLOAT - ? 5.3.  "C" - , , - . , - , . - , , . INT A[10] 10, .. 10 - , A[0], A[1], ..., A[9]. A[I] I - . PA - , INT *PA PA = &A[0] , PA A; , PA A[0]. X = *PA A[0] X. PA - A, PA+1 - , PA-I , I - , PA, PA+I , I .