2015-11-09 31 views
-1

我需要做一個計算項目,計算用戶輸入的任何分子的摩爾質量。 例如,如果用戶鍵入CO2,我的程序需要識別C(與質量相關的矩陣),然後確定O(與其質量相關)並將其乘以2,然後將它們相加。C中的分子質量計算器程序

我正在考慮爲每個元素使用字符串。

我在編程方面很新穎,而且我已經非常瞭解基礎知識。

你們會如何推薦我這麼做? Im相當失去

非常感謝您

+2

1.合適原子名稱及其質量的表格 - 一個'struct'。 2.掃描大寫字母,然後選擇多個小寫字母。 3.掃描數字。 4.相乘並添加。 5.沖洗並重復,直到繩子結束。 6.利潤。 – usr2564301

回答

1

這似乎是很大的挑戰這裏解析文本,這樣你就可以通過全要素的功能做你的計數。你需要一個字符串來接受輸入,但我強烈建議你遠離std字符串。

而是嘗試一個字符數組。

有些事情要考慮:

  • 多大確實陣列需要是什麼?

  • 我會接受什麼樣的角色? (空格?)

  • 如何知道用戶何時完成輸入? (東西以null結尾......)

  • 我將如何移動數組?

  • 什麼定義了一個元素? (如果是大寫字母,請查看ASCII值以便比較它們)

  • 當我找到它時,如何處理元素?

你問了一個出發的地方,所以我不願意給出任何特定的代碼。看看Jongware的評論,爲您的程序需要做的一個很好的概述。一次處理它一塊(回答這篇文章中的問題,你會很好的輸入),當你完成後檢查你的輪廓。祝你好運!

1

雖然您有一個答案,但我會建議您仔細看看您的問題後發佈的第一條評論。不管你如何分片,你都必須以字符串的形式解析用戶輸入。雖然解析類似"Li3Co4CO2"的東西來得到每個元素的原子權重似乎令人望而生畏,但將其乘以正確的乘數並保持運行總和,可以用2個指針和一個嵌套的while循環完成。

就拿在argv[1]用戶輸入並指定爲指針p

char *p = argv[1]; 

你現在需要的是一個while循環來檢查字符串中的每個字符:

while (*p) { 

在循環,您需要做的就是識別每個元素大寫字母后跟任意小寫終止數字(如果有)在下一個Cap或空終止字符(字符串的結尾)之前。因此,分配一個結束指針ep並處理與嵌套while循環的字符串。 (我們將添加乘數來保存數字,以及稍後使用的符號長度)我們跳過pchar *ep = p + 1;)中的第一個字符,所以我們將初始化符號長度爲1(乘數始終始於1 ):

char *ep = p + 1;  /* end pointer */ 
    char m = 1;    /* multiplier */ 
    size_t symlen = 1;  /* symbol len */ 
    ... 
    /* for each char in p until next CAP */ 
    while (*ep && (*ep < 'A' || 'Z' < *ep)) { 

     /* if digit */ 
     if ('0' <= *ep && *ep <= '9') 
      m = *ep - '0'; /* set multiplier */ 
     else 
      symlen++;  /* increment len */ 
     ep++; 
    } 

您現在擁有所有需要複製/搜索符號的信息,然後將權重添加到運行總和。要完成隔離的符號,你可以簡單地使用你的symlen隨着strncpy的符號複製到一個臨時數組/字符串:

char srchsym[8] = {0}; /* search sym */ 
    strncpy (srchsym, p, symlen); 
    srchsym[symlen] = 0; /* null-terminate */ 

(在技術上不是因爲你初始化srchsym[8] = {0};需要手動空終止,但它是一種好習慣)

現在剩下的就是在週期表(結構數組)中搜索srchsym,並返回一個指向與匹配搜索符號的元素對應的數組的元素的指針(原子符號)。一旦你有一個數據指針在週期表中,保持運行總和wt很簡單,只要:

 wt += (float)m * ptp->atwt; 

(其中ptp - 指針元素週期表及結構atwt的元素是原子量)。隨着計算完成的第一個元素,只需提前指針p的字符串中的下蓋,並重復:

p = ep; 
} 

完成後,可以打印結果:

printf ("\n %s (atomic weight) : %.3f\n\n", argv[1], wt); 

如果您願意,還可以讓循環打印輸出的每個元素,因爲它是通過srchsym搜索返回的。對於假設"Li3Co4CO2"一個例子是:

$ ./bin/ptable Li3Co4CO2 

element : Lithium 
symbol  : Li 
atomic num : 3 
atomic wt. : 6.941 

element : Cobalt 
symbol  : Co 
atomic num : 27 
atomic wt. : 58.933 

element : Carbon 
symbol  : C 
atomic num : 6 
atomic wt. : 12.011 

element : Oxygen 
symbol  : O 
atomic num : 8 
atomic wt. : 15.999 

Li3Co4CO2 (atomic weight) : 300.565 

祝你好運,讓我知道你是否需要額外的幫助件裝配在一起。