**本程式由C語言實作元素資訊的查詢和分子相對分子質量的計算,**
這是我第一次寫博客,(==本人C語言小白==)由于明天我就要期末考了,代碼寫得很匆忙,
計算分子式時最好不要輸入帶有括號的分子式,
等我期末考完,我會進一步完善這個程式,
最后期待的功能:
1.根據分子量計算化學式 2.進行化學方程式的配平
3.計算溶液的PH,Ka 4.計算質量分數等等
謝謝你的觀看和點評,
#define _CRT_SECURE_NO_WARNINGS //這行代碼確保vs可以使用scanf
#include<stdio.h>
#include<string.h>
#include<ctype.h>
//宣告元素結構體
typedef struct Element {
char symbol[4];
char name[4];
float aram;
float ram;
}Element;
Element element[37];
//存盤元素的有關資訊
char s[37][4] = { "","H","He","Li","Be","B","C","N","O","F","Ne","Na","Mg","Al","Si","P","S",\
"Cl","Ar","K","Ca","Sc","Ti","V","Cr","Mn","Fe","Co","Ni","Cu","Zn","Ga","Ge","As","Se","Br","Kr" };
char n[37][4] = { "","氫","氦","鋰","鈹","硼","碳","氮","氧","氟","氖","鈉","鎂","鋁","硅","磷",\
"硫","氯","氬","鉀","鈣","鈧","鈦" ,"釩","鉻","錳","鐵","鈷","鎳","銅","鋅","鎵","鍺","砷","硒","溴","氪" };
float am[37] = { 0,1.008,4.003,6.941,9.012,10.81,12.01,14.01,16.00,19.00,20.18,22.99,24.31,26.98,28.09,30.97,32.06,\
35.45,39.95,39.10,40.08,44.96,47.87,50.94,52.00,54.94,55.85,58.93,58.69,63.55,65.41,69.72,72.64,74.92,78.96,79.90,83.80 };
float m[37] = { 0,1,4,7,9,10.8,12,14,16,19,20,23,24,27,28,31,32,35.5,40,39,40,45,48,51,52,55,56,59,59,64,65,70,73,75,79,80,84 };
//宣告函式
int search_num(char sym[]); //根據元素符號回傳原子序數
void print_info(void); //列印元素資訊
void count_mass(void); //計算分子質量
int main(void)
{
//將元素資訊輸入結構體變數
for (int i = 1; i <= 36; i++)
{
strcpy(element[i].symbol, s[i]);
strcpy(element[i].name, n[i]);
element[i].aram = am[i];
element[i].ram = m[i];
}
int w;
printf("************歡迎你使用ZCX元素計算器*************\n");
printf("************輸入1進入元素查詢******************\n");
printf("************輸入2進入分子量計算****************\n");
printf("************輸入0退出程式*********************\n");
while (1 == scanf("%d", &w)) {
switch (w)
{
case 1:
print_info();
break;
case 2:
count_mass();
break;
case 0:
printf("謝謝使用!\n");
return 0;
default:
printf("輸入有誤!請重新輸入:\n");
break;
}
printf("請繼續按主選單輸入:\n");
}
}
int search_num(char sym[])
{
for (int i = 1; i <= 36; i++)
if (!strcmp(element[i].symbol, sym))
return i;
return 0;
}
void print_info(void)
{
int k = 1, num = 0;
char sym[4];
while (k) {
int j = 1;
printf("請輸入你要查詢的元素的英文符號\n");
scanf("%s", sym);
num = search_num(sym);
if (num)printf("你輸入的元素已找到!\n");
else {
printf("你輸入的元素不存在!\n請再次輸入!\n");
continue;
}
printf("請輸入你要查詢的資訊:\n");
printf("************1.元素名稱***************\n");
printf("************2.精確相對原子質量*******\n");
printf("************3.相對原子質量***********\n");
printf("************4.退出該元素查詢*********\n");
printf("************0.退出查詢系統***********\n");
while (j) {
if (1 == scanf("%d", &k) && k >= 0 && k <= 4) {
switch (k)
{
case 1:
printf("元素名稱:%s\n", element[num].name);
break;
case 2:
printf("精確相對原子質量:%g\n", element[num].aram);
break;
case 3:
printf("相對原子質量:%g\n", element[num].ram);
break;
case 4:
printf("\n");
j = 0;
break;
default:
printf("謝謝使用!請您慢走!\n");
goto help;
break;
}
}
else
{
printf("輸入錯誤!請重新輸入!\n");
}
}
help:
printf("已成功退出!\n");
}
}
void count_mass(void)
{
int k = 1;
while (k) {
int n = 0, q = 0; //q表示括號的狀態
float m = 0, m1 = 0; //m是分子量,m1是括號內分子量和
char molecular[20], molecular_symbol[4], ch, th, * p = molecular;
printf("請正確輸入分子式:\n");
scanf("%s", molecular);
while (ch = *p++) {
th = *p;
if (ch == '(') {
q = 1;
continue;
}
if (ch == ')') {
q = 2;
continue;
}
if (q == 2) {
m += m1 * (ch - '0');
m1 = 0;
continue;
}
molecular_symbol[0] = ch;
molecular_symbol[1] = th;
molecular_symbol[2] = '\0';
n = search_num(molecular_symbol);
if (n)
{
th = *(p + 1);
if (!q) {
if (isdigit(th)) {
m += element[n].ram * (th - '0') + m1;
m1 = 0;
p += 2;
}
else {
m += element[n].ram + m1;
m1 = 0;
p++;
}
}
else {
if (isdigit(th)) {
m1 += element[n].ram * (th - '0');
p += 2;
}
else {
m1 += element[n].ram;
p++;
}
}
}
else
{
molecular_symbol[1] = '\0';
n = search_num(molecular_symbol);
if (n)
{
if (!q) {
if (isdigit(th)) {
m += element[n].ram * (th - '0') + m1;
m1 = 0;
p++;
}
else {
m += element[n].ram + m1;
m1 = 0;
}
}
else {
if (isdigit(th)) {
m1 += element[n].ram * (th - '0');
p++;
}
else
m1 += element[n].ram;
}
}
else {
printf("輸入有誤!請重新輸入:\n");
break;
}
}
}
printf("%s的相對分子質量為: %g\n", molecular, m);
printf("您想計算下一個分子嗎?輸入1表示是,0表示否");
scanf("%d", &k);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/243882.html
標籤:其他
