19 ( ) 019.4.0 CS 1 (comand line arguments) Unix./a.out aa bbb ccc ( ) C main void... argc argv argc ( ) argv (C char ) ( 1) argc 4 argv NULL. / a. o u t \0 a a \0 b b b \0 c c c \0 1: // argdemo1.c --- print argc/argv as string for(int i = 0; i < argc; ++i) { printf("%s\n", argv[i]); 0... "..." 1 (C "..." Ruby... ) 1
%./a.out aa bbb ccc./a.out aa bbb ccc 1 (stdlib.h ) int atoi(char *s) double atof(char *s) 1 // argdemo.c --- sum of argument strings (as int) int sum = 0; for(int i = 1; i < argc; ++i) { sum += atof(argv[i]); printf("sum = %d\n", sum); %./a.out 4 5 sum = 1 scanf.1 (stack) LIFO(last-in, first-out) 1 1 1 push pop top 1 isempty : push pop ( ) isempty ( ) top (push pop )
? push pop ( ). 1 arr ptr push pop (ptr 0 ) arr[ptr++] = value; // same as: arr[ptr] = value; ++ptr; value = arr[--ptr]; // same as: --ptr; value = arr[ptr]; arr push arr ptr pop ptr : push 1 pop 1 ( ) ptr ptr 1 push pop // istack.h --- int type stack interface #include <stdbool.h> struct istack; typedef struct istack *istackp; istackp istack_new(int size); // allocate new stack bool istack_isempty(istackp p); // test if the stack is empty void istack_push(istackp p, int v); // push a value int istack_pop(istackp p); // pop a value and return it int istack_top(istackp p); // peek the topmost value typedef istackp struct istack* top ptr 1 // istack.c --- int type stack impl. with array struct istack { int ptr; int *arr; ; istackp istack_new(int size) { istackp p = (istackp)malloc(sizeof(struct istack)); 1 typedef int *intp intp 1
p->ptr = 0; p->arr = (int*)malloc(size * sizeof(int)); return p; bool istack_isempty(istackp p) { return p->ptr <= 0; void istack_push(istackp p, int v) { p->arr[p->ptr++] = v; int istack_pop(istackp p) { return p->arr[--(p->ptr)]; int istack_top(istackp p) { return p->arr[p->ptr - 1]; // reversestr.c --- print argv[1] in reverse order istackp s = istack_new(00); char *t = argv[1]; for(int i = 0; t[i]!= \0 ; ++i) { istack_push(s, t[i]); while(!istack_isempty(s)) { putchar(istack_pop(s)); putchar( \n );./a.out argv[1] t ( \0 ) putchar( 1 %./a.out.nep a si siht expect int // test_istack.c --- unit test for istack. void expect_int(int i1, int i, char *msg) { printf("%s %d:%d %s\n", (i1==i)?"ok":"ng", i1, i, msg); struct istack *s = istack_new(00); istack_push(s, 1); istack_push(s, ); istack_push(s, ); expect_int(istack_pop(s),, "push 1 ; pop"); expect_int(istack_pop(s),, "pop"); istack_push(s, 4); expect_int(istack_pop(s), 4, "push 4; pop"); expect_int(istack_pop(s), 1, "pop"); 4
%./a.out OK : push 1 ; pop OK : pop OK 4:4 push 4; pop OK 1:1 pop.1 (1) () () ( 4) OK [ { ( ) ( ( ) ) ] NG ) ( { { [ ( ] ) 4: 5 ( ) ( ) stack ( 1 + ) * ( ( - 1 ) / ) ( ) * ( ( - 1 ) / ) ( ( - 1 ) / ) ( ( - 1 ) / ) ( ( ) / ) ( ) 5: ( ) C balance1 c ( ) 5
( ( ) ) ( ( ) main 1 balance1 OK NG // barance1.c --- see if parentheses are balanced in input bool balance1(char *t) { istackp s = istack_new(00); for(int i = 0; t[i]!= \0 ; ++i) { char c = t[i]; if(c == ( ) { istack_push(s, c); else if(c == ) ) { if(istack_isempty(s)) { return false; istack_pop(s); return istack_isempty(s); for(int i = 1; i < argc; ++i) { printf("%s : %s\n", argv[i], balance1(argv[i])?"ok":"ng"); %./a.out ((a)) (a)) ((a)) : OK (a)) : NG boolstr expect bool // test_barance1.c --- unit test for balance1 char *boolstr(bool b) { return b? "true" : "false"; void expect_bool(bool b1, bool b, char *msg) { printf("%s %s:%s %s\n", (b1==b)?"ok":"ng", boolstr(b1), boolstr(b), msg); (balance1 here) 6
int main(void) { expect_bool(balance1("((a)())"), true, "((a)())"); expect_bool(balance1(")(a)()("), false, ")(a)()("); expect_bool(balance1("((a)()"), false, "((a)()"); expect_bool(balance1("(a)())"), false, "(a)())"); expect_bool(balance1("(((())))"), true, "(((())))"); %./a.out OK true:true ((a)()) OK false:false )(a)()( OK false:false ((a)() OK false:false (a)()) OK true:true (((()))) 1 a. () [] { ( [(] OK ) b. ( [(] [()] OK ) c. ( ) ( [(]) OK [{)] ) : d. ( : -1 1 ) e.. ( ) (infix notation) * + 4 + * 4 * (postfix notation) ( ) 7
* 4 + 6 4 + 10 4 4 * + 8 + 11 4 4 4 8 6 6 10 11 * 4 + 4 * + 6: (1) () ( 6) output stack input + * 4 + 1 + * 4 + 1 + * 4 + 1 + * 4 + 1 + * 4 + 1 4 + * + 1 4 * + + 1 4 * + + 1 4 * + + 1 4 * + 1 + 7: C + - 1 * / % ^ ( C ^ ) postfix1 ( ) C *u++ = ; // postfix1.c -- convert infix to postfix (w/o parentheses) #include <ctype.h> 8
int operprec(int c) { switch(c) { case + : case - : return 1; case * : case / : case % : return ; case ^ : return ; default: void postfix1(char *t, char *u) { istackp s = istack_new(00); for(int i = 0; t[i]!= \0 ; ++i) { char c = t[i]; if(isdigit(c)) { *u++ = c; continue; while(!istack_isempty(s) && operprec(istack_top(s)) >= operprec(c)) { *u++ = istack_pop(s); istack_push(s, c); while(!istack_isempty(s)) { *u++ = istack_pop(s); *u++ = \0 ; char buf[00]; for(int i = 1; i < argc; ++i) { postfix1(argv[i], buf); printf("%s => %s\n", argv[i], buf); isdigit ctype.h include (0 9) continue %./a.out 1+*+4 1+*+4 => 1*+4+ expect str strcmp string.h include strcmp 0 OK NG // test_postfix1.c --- unit test of postfix1 #include <ctype.h> #include <string.h> 9
(operprec, postfix1 here) void expect_str(char *s1, char *s, char *msg) { printf("%s %s : %s %s\n", strcmp(s1, s)?"ng":"ok", s1, s, msg); int main(void) { char buf[00]; postfix1("1+*", buf); expect_str(buf, "1*+", "1+* => 1*+"); postfix1("*+1", buf); expect_str(buf, "*1+", "*+1 => *1+"); a. ^^4 ( ) 4 (4) ( ) b. ( : ) c. 1 d. ( ) e. 4 4.1 // pstack.h --- pointer type stack interface #include <stdbool.h> struct pstack; typedef struct pstack *pstackp; pstackp pstack_new(int size); bool pstack_isempty(pstackp p); bool pstack_isfull(pstackp p); void pstack_push(pstackp p, void *v); void *pstack_pop(pstackp p); void *pstack_top(pstackp p); void* void* 10
// pstack.c --- pointer type stack impl. with array #include "pstack.h" struct pstack { int ptr, lim; void **arr; ; pstackp pstack_new(int size) { pstackp p = (pstackp)malloc(sizeof(struct pstack)); p->ptr = 0; p->lim = size; p->arr = (void**)malloc(size * sizeof(void*)); return p; bool pstack_isempty(pstackp p) { return p->ptr <= 0; bool pstack_isfull(pstackp p) { return p->ptr >= p->lim; void pstack_push(pstackp p, void *v) { p->arr[p->ptr++] = v; void *pstack_pop(pstackp p) { return p->arr[--(p->ptr)]; void *pstack_top(pstackp p) { return p->arr[p->ptr - 1]; void* void** // reversefile.c --- input a flie and output upside-down #include <string.h> #include "pstack.h" bool getl(char s[], int lim) { int c, i = 0; for(c = getchar(); c!= EOF && c!= \n ; c = getchar()) { s[i++] = c; if(i+1 >= lim) { break; s[i] = \0 ; return c!= EOF; int main(void) { char buf[00]; pstackp s = pstack_new(00); while(getl(buf, 00)) { char *t = (char*)malloc(strlen(buf)+1); strcpy(t, buf); pstack_push(s, t); while(!pstack_isempty(s)) { char *t = (char*)pstack_pop(s); printf("%s\n", t); free(t); getl 1 EOF( ) main getl buf +1( ) for c i for 11
free %./a.out that is a dog. how are you? ^D Ctrl-D how are you? that is a dog. 4. 1 1 1 --- current position --- that is a dog backward upper stack insert that is a dog how are you? today is fine. --- current position --- yeserday snowed that is a dog today is fine. --- current position --- yeserday snowed today is fine. that is a dog yeserday snowed today is fine. --- current position --- forward lower stack delete that is a dog --- current position --- yeserday snowed yeserday snowed 8: 4 5 6 1
A 1 6 1 ( :59 ) 1. sol CED /home/staff/ka00689/prog19upload a. ( ) @@@. 1 4. ( ) ( ) 5. Q1. Q. Q. ( ) B 1 6 ( A ) ( ) :59 1. sol CED /home/staff/ka00689/prog19upload b. ( ) @@@. 1 ( ) ( ) 4. 5. Q1. Q. Q. ( ) 1