diff options
author | bnewbold <bnewbold@robocracy.org> | 2011-03-04 18:40:07 -0500 |
---|---|---|
committer | bnewbold <bnewbold@robocracy.org> | 2011-03-04 18:40:07 -0500 |
commit | ce9248385c8d02141fb9eee7ea14894d4f323686 (patch) | |
tree | 1a2476301c90686ddb9095227e45abacb646e3fb | |
parent | d5e1adf060a23e6c739d0dd78fe9321fb0eb7582 (diff) | |
download | learning_c-master.tar.gz learning_c-master.zip |
-rw-r--r-- | libraries | 11 | ||||
-rw-r--r-- | notes | 10 | ||||
-rw-r--r-- | rpn.c | 129 | ||||
-rw-r--r-- | test_ascii_enum.c | 21 |
4 files changed, 171 insertions, 0 deletions
diff --git a/libraries b/libraries new file mode 100644 index 0000000..e570fe0 --- /dev/null +++ b/libraries @@ -0,0 +1,11 @@ + +diet libc +http://www.fefe.de/dietlibc/ + +libowfat (is libdjb...) +http://www.fefe.de/libowfat/ + +"standard function library" + +glibc + @@ -0,0 +1,10 @@ + +Can use 'const' in function parameters to indicate to the compiler that a +variable will not be modified. + +The order of evaluation (function calls) in an expression is undefined. Eg: + + push(pop() + pop()) is ok + push(pop() - pop()) is NOT ok + + @@ -0,0 +1,129 @@ +/* rpn.c + * + * Takes a string of reverse polish notation math and pretty-prints it with + * parenthesis. Recognizes the {*, +, -, /} operators and ignores everything + * else. + * + */ + +/* +- tree data structure +- read in integer function (std?) + +*/ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#define LINE_LEN 1024 + +struct rpn_node { + char val; + struct rpn_node *left; + struct rpn_node *right; +}; + +int rpn_parse(char s[], struct rpn_node *node); +void rpn_print(struct rpn_node *node); +int rpn_eval(struct rpn_node *node); +int isoper(char c); + +int main(void) { + char line[LINE_LEN] = ""; + struct rpn_node root_node; + char tc; + int i,j; + + // read string + fgets(line, LINE_LEN, stdin); + + // reverse it + j = strlen(line) - 1; + for(i = 0; i <= j/2; i++) { + tc = line[i]; + line[i] = line[j-i]; + line[j-i] = tc; + } + + // parse it down to single char numbers and opers + for(i = j = 0; i < strlen(line); i++) { + if(isdigit(line[i]) || isoper(line[i])) + line[j++] = line[i]; + } + line[j] = '\0'; + //printf("Compressed: %s\n", line); + + // recursively parse down and store result in right; then recursively parse + // down and store result in left + rpn_parse(line, &root_node); + + // spider down the tree to the left, printing + rpn_print(&root_node); + printf(" = %d\n", rpn_eval(&root_node)); + return; + // &new_node = malloc(sizeof(struct node)) +} + +// returns the number of characters that got chomped up +int rpn_parse(char s[], struct rpn_node *node) { + int i=0; + + node->val = s[0]; + i++; + //printf("Got len=%d, isoper=%d: %s\n", (int)strlen(s), isoper(s[0]), s); + + if(isoper(s[0])) { + //printf("Got an oper: %c\n", s[0]); + // load up right and left + node->right = malloc(sizeof(struct rpn_node)); + node->left = malloc(sizeof(struct rpn_node)); + i += rpn_parse(&s[i], node->right); + i += rpn_parse(&s[i], node->left); + } + return i; +} + +void rpn_print(struct rpn_node *node) { + if(isoper(node->val)) { + printf("("); + rpn_print(node->left); + printf(" %c ", node->val); + rpn_print(node->right); + printf(")"); + } else { + printf("%c", node->val); + } +} + +int isoper(char c) { + switch(c) { + case '+': + case '-': + case '*': + case '/': + return 1; + break; + default: + return 0; + } +} + +int rpn_eval(struct rpn_node *node) { + if(isdigit(node->val)) { + return node->val - '0'; + } + switch(node->val) { + case '+': + return rpn_eval(node->left) + rpn_eval(node->right); + case '-': + return rpn_eval(node->left) - rpn_eval(node->right); + case '*': + return rpn_eval(node->left) * rpn_eval(node->right); + case '/': + return rpn_eval(node->left) / rpn_eval(node->right); + default: + printf("ERROR: unexpected character '%c'.", node->val); + exit(-1); + } +} diff --git a/test_ascii_enum.c b/test_ascii_enum.c new file mode 100644 index 0000000..55a5724 --- /dev/null +++ b/test_ascii_enum.c @@ -0,0 +1,21 @@ + +#include <stdio.h> +#include <string.h> + +enum { FIRST, SECOND, THIRD }; + +char list[] = "abcABC123(){}"; + +void main(void) { + int i; + printf("EOF: 0x%X\n", EOF); + printf("FIRST: 0x%X\n", FIRST); + printf("SECOND: 0x%X\n", SECOND); + printf("THIRD: 0x%X\n", THIRD); + for(i = 0; i <= strlen(list); i++) + printf("list[%d]: %c = 0x%X\n", i, list[i], list[i]); + + printf("Does list[%d] == FIRST? %s!\n", (int)strlen(list), + list[strlen(list)] == FIRST ? "YES" : "NO"); +} + |