Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h> // untuk strlen(), memmove(), strstr(), strncpy
- #include <math.h> //untuk pow()
- #include <ctype.h> // untuk isspace, isdigit
- #include <stdlib.h> // untuk system("clear")
- void home()
- {
- printf("\n \n");
- printf("=================================================================== \n");
- printf("KALKULATOR MINI\n");
- printf("<-->\n");
- printf("Operator yang diperbolehkan: + - * / ()\n");
- printf("Special Commands: cls[Clear Screen], x[Stop Program]\n");
- printf("<-->\n");
- printf("=================================================================== \n");
- printf("\n \n");
- }
- // Function to replace a string with another
- // string
- char* replace(char* source, size_t sourceSize, char* substring, char* with) {
- char* substring_source = strstr(source, substring);
- if (substring_source == NULL) {
- return NULL;
- }
- if (sourceSize < strlen(source) + (strlen(with) - strlen(substring)) + 1) {
- printf("Buffer size is too small\n");
- return NULL;
- }
- memmove(
- substring_source + strlen(with),
- substring_source + strlen(substring),
- strlen(substring_source) - strlen(substring) + 1
- );
- memcpy(substring_source, with, strlen(with));
- return substring_source + strlen(with);
- }
- // Following function extracts characters present in `src`
- // between `m` and `n` (excluding `n`)
- char* substr(const char *src, int m, int n)
- {
- // get the length of the destination string
- int len = n - m;
- // allocate (len + 1) chars for destination (+1 for extra null character)
- char *dest = (char*)malloc(sizeof(char) * (len + 1));
- // start with m'th char and copy `len` chars into the destination
- strncpy(dest, (src + m), len);
- // return the destination string
- return dest;
- }
- void hilangSpasi(char * input){
- //menghitung panjang string
- int len = strlen(input);
- // printf("%d", len);
- //Checks for space character in array if its there then ignores it and swap str[i] to str[i+1];
- for(int i = 0; i < len; i++){
- if(isspace(input[i])){
- for(int j=i;j<len;j++)
- {
- input[j]=input[j+1];
- }
- len--;
- }
- }
- // printf("%s", input);
- }
- char * Hitung(char * input){
- int j=0;
- int len = strlen(input);
- // printf("len = %d\n", len);
- for(int i = 0 ; i< len; ++i){
- //cek setiap char, apakah ada yg bukan angka/operator
- if(!isdigit(input[i]) && !ispunct(input[i])) break;
- // printf("lewat break");
- // mulai kalkulasi saat sudah char terakhir
- if(i == len - 1){
- for (int i = 0; i < len; ++i)
- {
- //cek kalau ada tanda kurung ()
- if(input[i] == '('){
- j = i;
- for (int i = 1; i > 0; --i){
- while (input[j]!=')')
- {
- ++j;
- if(input[j]=='(') ++i;
- }
- //kalau tanda '(' ada ditengah-tengah
- //posisi j ditambah 1 untuk penyesuaian
- if(i > 1) ++j;
- }
- //ambil substring dari string, di posisi i+1, dengen panjang j - i - 1
- char* temp_substr = substr(input, i + 1, j);
- // hitung hasil substring
- Hitung(temp_substr);
- // ambil bagian yang akan ditukar dengan substring
- char* temp_to_change = substr(input, i, j+1);
- // melakukan replace dari operasi() dengan substring hasil
- replace(input, len, temp_to_change, temp_substr);
- }
- }
- //mulai perhitungan
- //step 1 untuk perkalian & pembagian
- //step 2 untuk penjumlahan & pembagian
- for(int step =1 ; step<=2; ++step){
- // printf("step = %d\n", step);
- // printf("input = %s\n", input);
- //jadi penanda operator
- char x, y;
- if (step == 1)
- x = '*', y = '/';
- else
- x = '+', y = '-';
- //mulai memeriksa setiap isi input
- for (int i = 0; i < strlen(input); ){
- // printf("len dalam step = %d\n", strlen(input));
- // printf("input[%d] = %c\n",i, input[i]);
- //jika ada input[i] yang menjadi operator
- if (input[i] == x || input[i] == y){
- //masuk operasi
- // printf("input[%d] = %c\n",i, input[i]);
- long double leftOp = 0, rightOp = 0;
- int rightIterator = i, s = i;
- short sign = 1;
- int flag = 0;
- // mulai iterasi untuk mencari bilangan sebelum operator/input[i-1]
- for (int k = 0; i > 0 && (isdigit(input[i - 1]) || input[i - 1] == '-' || input[i - 1] == '.'); ++k){
- flag = 1;
- // printf("k: %d\nleftOp: %Lf\n", k, leftOp);
- // printf("%d - input[i - 1] = %c\ninput[i - 2]: %c\n", i, input[i - 1] , input[i - 2] );
- if (input[i - 1] == '-'){
- if ((i - 2) >= 0 && (input[i - 2] == '*' || input[i - 2] == '+' || input[i - 2] == '-' || input[i - 2] == '/') || i == 1){
- leftOp *= -1;
- --i;
- }
- break;
- }
- // untuk merubah bilangan dibelakang koma yg diperoleh dari leftOp
- //bilangan 2.154, maka diproses terlebih dahulu bilangan dibelakang koma
- //diperoleh leftOp 154. ini masih bentuk ratusan, maka di rubah dari desimal
- //menjadi 0.154 dengan cara 154/10 hingga
- else if (input[i - 1] == '.'){
- if (leftOp == 0)
- {
- --i;
- continue;
- } else {
- while ((int)leftOp > 0) leftOp /= 10;
- int temp = i;
- while (input[temp++] == '0') leftOp /= 10;
- k = -1;
- }
- }else{
- // untuk menambahkan bilangan sebelumnya dengan yang sekrang
- // misal sudah ada 5, baru ada angka "4", maka "4" dirubah menjadi int
- // dan dikali dengan 10^k. k = urutan bilangan(satuan, puluhan, dst)
- // (input[i - 1] - 48) untuk konver char menjadi int
- // printf("input[%d-1] = %d\n",i, input[i-1]-48);
- leftOp += (input[i - 1] - 48) * pow(10, k);
- }
- --i;
- // printf("%d - leftOp = %Lf\n", k, leftOp );
- }
- short floatCounter = 0;
- for (rightIterator; rightIterator < strlen(input) && (isdigit(input[rightIterator + 1]) || input[rightIterator + 1] == '-' || input[rightIterator + 1] == '.'); ++rightIterator){
- // printf("%d - input[rightIterator-1] = %c\n",rightIterator, input[rightIterator-1]);
- if (input[rightIterator + 1] == '-' && (input[rightIterator] == '*' || input[rightIterator] == '+' || input[rightIterator] == '-' || input[rightIterator] == '/'))
- sign = -1;//merubah nilai menjadi negatif/sebaliknya. misal ada case seperti 1*-2
- else if (input[rightIterator + 1] == '-')
- break;
- else if (input[rightIterator + 1] == '.')
- floatCounter = 1;//penanda adanya bilang desimal disebelah kanan operator
- else if (floatCounter == 0)
- //jika tidak ada bilangan desimal, maka dapat mementuk nilai dari sebelah kanan operator
- //yg kemudian disimpan di rightOp
- rightOp = rightOp * 10 + input[rightIterator + 1] - 48;
- else
- //jika ada bilangan desimal, maka nilai rightOP sebelumnya
- //cukup ditambahkan dengan char yg berikutnya
- //(input[rightIterator + 1] - 48) * pow(10, -1 * floatCounter++) untuk merubah char menjadi
- //bilangan di belakang "."
- rightOp += (input[rightIterator + 1] - 48) * pow(10, -1 * floatCounter++);
- }
- rightOp *= sign;
- // printf("rightOP = %Lf\n", rightOp);
- if (flag == 0){
- ++i;
- continue;
- }
- if (step == 2)
- //perhitungan untuk penjumlahan dan pengurangan
- if(input[s] == '+'){
- leftOp += rightOp;
- // printf("leftOp+ = %Lf\n", leftOp);
- } else leftOp -= rightOp;
- else if (input[s] == '*')
- //perhitungan untuk perkalian
- leftOp *= rightOp;
- else if (rightOp != 0)
- //perhitungan untuk pembagian
- leftOp /= rightOp;
- else{
- //kalau dibagi 0
- puts("Exception! Division by zero.\n");
- return input;
- }
- //bagian string temp
- printf("leftOp = %Lf\n", leftOp);
- char temp[50]={'\0'};
- sprintf(temp, "%Lf", leftOp);//merubah isi leftOP jadi string dan disimpan ke temp
- // printf("%s - dari temp\n", temp);
- //untuk menghilangkan nol pada setelah semua bilangan desimal
- if(temp[strlen(temp)-1] == '0'){
- printf("%c - isi temp\n", temp[strlen(temp)-1]);
- for (int i = strlen(temp) - 1; temp[i] == '0'; i--){
- // printf("%c - isi temp[i]\n", temp[i]);
- // printf("%c - isi temp[i+1]\n", temp[i+1]);
- memmove(&temp[i], &temp[i + 1], strlen(temp) - i);
- }
- memmove(&temp[i], &temp[i + 1], strlen(temp) - i);
- if (temp[strlen(temp) - 1] == '.')
- memmove(&temp[strlen(temp) - 1], &temp[strlen(temp)], strlen(temp) - i);
- }
- // printf("rightIterator: = %d\n", rightIterator);
- char* temp_to_change = substr(input, i, rightIterator+1);
- // puts(temp_to_change); printf("- temp_to_change\n");
- // melakukan replace dari operasi() dengan substring hasil
- replace(input, 100, temp_to_change, temp);
- // puts(input); printf("- dari input hasil temp\n");
- }
- else ++i;
- }
- }
- return input;
- }
- }
- return "salah Input!";
- }
- int main(){
- char input[100]={'\0'};
- home();
- do
- {
- printf("Masukkan soal matematikamu deh~\n");
- printf(">>");
- fgets(input, sizeof(input), stdin);
- // scanf("%[^\n]s",input);
- // printf("%s - input\n", input);
- if (strcmp(input, "cls\n") == 0) {
- system("clear");
- home();
- }
- if (strcmp(input, "x\n") == 0) break;
- hilangSpasi(input);
- // printf("%s - input\n", input);
- printf("Hasil = %s\n", Hitung(input));
- // printf(" - input\n");
- } while (1);
- return 0;
- }
Add Comment
Please, Sign In to add comment