#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>

int c;

// ฟังก์ชันคำนวณน้ำหนักโมเลกุล
double calculate_molecular_weight(const char *formula) {
    double molecular_weight = 0.0;
    int i = 0;
    while (formula[i] != '\0') {
    double weight = 0.0;

        // ตรวจสอบธาตุที่มีสัญลักษณ์ 1 ตัว
        if (formula[i] == 'H') weight = 1.008;
        else if (formula[i] == 'B') weight = 10.81;
        else if (formula[i] == 'C') weight = 12.01;
        else if (formula[i] == 'N') weight = 14.01;
        else if (formula[i] == 'O') weight = 16.00;
        else if (formula[i] == 'F') weight = 19.00;
        else if (formula[i] == 'P') weight = 30.97;
        else if (formula[i] == 'S') weight = 32.07;
        else if (formula[i] == 'K') weight = 39.10;
        else if (formula[i] == 'V') weight = 50.94;

        // ตรวจสอบธาตุที่มี 2 ตัวอักษร

        if (i + 1 < strlen(formula)) {
            // ตรวจสอบธาตุสองตัวที่มีการใช้ตัวอักษรทั้งสองตัว เช่น 'Na', 'Mg', 'Cl'

            if (formula[i] == 'H' && formula[i + 1] == 'e') { weight = 4.00; i++; }
            else if (formula[i] == 'L' && formula[i + 1] == 'i') { weight = 6.94; i++; }
            else if (formula[i] == 'B' && formula[i + 1] == 'e') { weight = 9.01; i++; }
            else if (formula[i] == 'N' && formula[i + 1] == 'e') { weight = 20.18; i++; }
            else if (formula[i] == 'N' && formula[i + 1] == 'a') { weight = 23.00; i++; }
            else if (formula[i] == 'M' && formula[i + 1] == 'g') { weight = 24.31; i++; }
            else if (formula[i] == 'A' && formula[i + 1] == 'l') { weight = 26.98; i++; }
            else if (formula[i] == 'S' && formula[i + 1] == 'i') { weight = 28.09; i++; }
            else if (formula[i] == 'C' && formula[i + 1] == 'l') { weight = 35.45; i++; }
            else if (formula[i] == 'A' && formula[i + 1] == 'r') { weight = 39.95; i++; }
            else if (formula[i] == 'C' && formula[i + 1] == 'a') { weight = 40.08; i++; }
            else if (formula[i] == 'S' && formula[i + 1] == 'c') { weight = 44.96; i++; }
            else if (formula[i] == 'T' && formula[i + 1] == 'i') { weight = 47.87; i++; }
            else if (formula[i] == 'C' && formula[i + 1] == 'r') { weight = 52.00; i++; }
            else if (formula[i] == 'M' && formula[i + 1] == 'n') { weight = 54.94; i++; }
            else if (formula[i] == 'F' && formula[i + 1] == 'e') { weight = 55.85; i++; }
            else if (formula[i] == 'C' && formula[i + 1] == 'o') { weight = 58.93; i++; }
            else if (formula[i] == 'N' && formula[i + 1] == 'i') { weight = 58.69; i++; }
            else if (formula[i] == 'C' && formula[i + 1] == 'u') { weight = 63.55; i++; }
            else if (formula[i] == 'Z' && formula[i + 1] == 'n') { weight = 65.39; i++; }
            else continue;  // ถ้าธาตุไม่รู้จักให้ข้ามไป
        }

        // ถ้าธาตุไม่รู้จักให้ข้ามไป
        if (weight == 0.0) {
            printf("\t Unknown element detected: %c%c\n", formula[i], formula[i + 1]!= '\0' ? formula[i + 1] : ' ');
            return -1;  // แสดงว่ามีธาตุที่ไม่รู้จัก
        }

        // ตรวจสอบจำนวนของอะตอม
        int count = 0;
        while (isdigit(formula[i + 1])) {
            count = count * 10 + (formula[++i] - '0');
        }
        if (count == 0) count = 1;
        molecular_weight += weight * count;
        i++;
    }

    return molecular_weight;
}

int main() {
    float g, Mw, Mol, N, V;
    char formula[100];

    printf("\t Please select choice to Find Mol \n");
    printf("\t *****************\n");
    printf("\t 1.If want to find Mol from g/Mw #\n");
    printf("\t 2.If want to find Mol from N/(6.02*pow(10,23)) #\n");
    printf("\t 3.If want to find Mol from V/22.4 #\n");
    printf("\t Select : ");
    scanf("%d", &c);

    switch (c) {
    case 1:

        printf("\t Please enter g : ");
        scanf("%f", &g);

        printf("\t Please enter chemical formula (e.g., H2O): ");
        scanf("%s", formula);

        double Mw = calculate_molecular_weight(formula);
        if (Mw == -1) {
            printf("\t Invalid formula or unknown element.\n");
            break;
        }

        printf("\t Molecular weight of %s is %.2f g/mol\n", formula, Mw);
        printf("\t Mol of Substance is %.2f / %.2f = %.2f\n", g, Mw, g / Mw);
        break;

    case 2:
        printf("\t Please enter N : ");
        scanf("%f", &N);
        printf("\t Mol of Substance is %.2f / (6.02*pow(10,23)) = %.2f\n", N, N / (6.02 * pow(10, 23)));
        break;

    case 3:
        printf("\t Please enter V : ");
        scanf("%f", &V);
        printf("\t Mol of Substance is %.2f / 22.4 = %.2f\n", V, V / 22.4);
        break;

    default:
        printf("Please select 1-3 only\n");
        break;
    }

    return 0;
}


