diff options
author | Joursoir <chat@joursoir.net> | 2021-02-04 13:07:46 +0000 |
---|---|---|
committer | Joursoir <chat@joursoir.net> | 2021-02-04 13:07:46 +0000 |
commit | 9cabdb383f18e0e1b8dd0d66f19aa62cf498899b (patch) | |
tree | ab4a8438907f5a4081fcc4c09a45e523f7eb8e2e | |
download | snc-9cabdb383f18e0e1b8dd0d66f19aa62cf498899b.tar.gz snc-9cabdb383f18e0e1b8dd0d66f19aa62cf498899b.tar.bz2 snc-9cabdb383f18e0e1b8dd0d66f19aa62cf498899b.zip |
roman -> arabic
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | snc.c | 69 | ||||
-rw-r--r-- | snc.h | 14 |
3 files changed, 85 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..51fd697 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +snc +*.o @@ -0,0 +1,69 @@ +#include <stdio.h> + +#include "snc.h" + +int getRomanValue(char symbol) +{ + switch(symbol) { + case 'I': return SNC_ROMAN_I; // have triple notation + case 'V': return SNC_ROMAN_V; + case 'X': return SNC_ROMAN_X; // have triple notation + case 'L': return SNC_ROMAN_L; + case 'C': return SNC_ROMAN_C; // have triple notation + case 'D': return SNC_ROMAN_D; + case 'M': return SNC_ROMAN_M; // have triple notation + } + return 0; +} + +int romanToArabic(char *str) +{ + int answer = 0; + int last_value = 0; + int amount_char = 0; + while(*str) + { + int cur_value = getRomanValue(*str); + if(cur_value == 0) + return -1; + else if(last_value == cur_value || last_value == 0) { + answer += cur_value; + amount_char++; + } + else if(last_value > cur_value) { + answer += cur_value; + amount_char = 1; + } + else if(last_value < cur_value) { + answer += cur_value - 2 * last_value; + if(amount_char > 1) return -1; + amount_char = 1; + } + last_value = cur_value; + + if(amount_char > 3) + return -1; + else if(cur_value == SNC_ROMAN_V || + cur_value == SNC_ROMAN_L || cur_value == SNC_ROMAN_D) { + if(amount_char > 1) return -1; + } + + str++; + } + + return answer; +} + +int main(int argc, char *argv[]) +{ + if(argc < 2) + return printf("Simple numbers converter\n" + "\n" + "Synopsis: snc [number]\n"); + + int answer = romanToArabic(argv[1]); + if(answer == -1) printf("ERROR! %s is not roman number\n", argv[1]); + else printf("answer: %d\n", answer); + + return 0; +}
\ No newline at end of file @@ -0,0 +1,14 @@ +#ifndef SNC_NUMBERS_H +#define SNC_NUMBERS_H + +enum { + SNC_ROMAN_I = 1, + SNC_ROMAN_V = 5, + SNC_ROMAN_X = 10, + SNC_ROMAN_L = 50, + SNC_ROMAN_C = 100, + SNC_ROMAN_D = 500, + SNC_ROMAN_M = 1000 +}; + +#endif /* SNC_NUMBERS_H */ |