24小时热门版块排行榜    

北京石油化工学院2026年研究生招生接收调剂公告
查看: 583  |  回复: 3

13659938271

铁虫 (初入文坛)

[求助] 谁能帮我看一下这个程序是什么意思啊,谢谢 已有1人参与

/*
  

   This file is part of Astrochem.

   Astrochem is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published
   by the Free Software Foundation, either version 3 of the License,
   or (at your option) any later version.

   Astrochem is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with Astrochem.  If not, see <http://www.gnu.org/licenses/>.
*/


#include <config.h>
#endiflm,[

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "astrochem.h"

void add_specie (char *new_specie, char *species[], int *n_species);

void read_network (const char *chem_file, struct react reactions[],
                                int *n_reactions, char *species[],
                                int *n_species, int verbose)
{
        FILE *f;
        char line[MAX_LINE];
        int  line_number = 0;
        char reactant1[MAX_CHAR_SPECIES];
        char reactant2[MAX_CHAR_SPECIES];
        char reactant3[MAX_CHAR_SPECIES];
        char product1[MAX_CHAR_SPECIES];
        char product2[MAX_CHAR_SPECIES];
        char product3[MAX_CHAR_SPECIES];
        char product4[MAX_CHAR_SPECIES];
        double alpha;
        double beta;
        double gamma;
        int reaction_type;
        int reaction_no;
  
        *n_species = 0;
        *n_reactions = 0;

        if (verbose >= 1)
        {
                fprintf (stdout, "Reading reactions network from %s... ", chem_file);
                fflush (stdout);
        }

  /* Open the input file. We first look in the current directory, and
     then in the PKGDATADIR directory. Exit if we can't find it. */
  
        f = fopen (chem_file, "r");
        if ( !f )
        {
                char chem_file1[MAX_LINE];
      
                strncpy (chem_file1, PKGDATADIR, sizeof (chem_file1) - 1);
                strncat (chem_file1, "/", sizeof (chem_file1) - strlen (chem_file1) - 1);
                strncat (chem_file1, chem_file, sizeof (chem_file1) - strlen (chem_file1) - 1);
                f = fopen (chem_file1, "r");
                if ( !f )
                {
                        fprintf (stderr, "astrochem: error: can't find %s.\n", chem_file);
                        exit (1);
                }
        }
  
  /* Loop over the lines, and look for the reactants and products, and
     the parameters of the reactions. */
  
        while (fgets (line, MAX_LINE, f) != NULL)
        {
                line_number++;
                if (line[0] == '#') continue; /* Skip comments. */
      
      /* Initialize reactants, products, and reaction parameters. */
   
                strcpy (reactant1, "");
                strcpy (reactant2, "");
                strcpy (reactant3, "");
                strcpy (product1, "");
                strcpy (product2, "");
                strcpy (product3, "");
                strcpy (product4, "");
                alpha = 0;
                beta = 0;
                gamma = 0;
                reaction_type = 0;
                reaction_no = 0;
      
      /* Read the reactants, products, and reaction parameters. */
      
                if ((sscanf (line, "%s -> %s %lf %lf %lf %d %d",
                        reactant1, product1,
                        &alpha, &beta, &gamma, &reaction_type, &reaction_no) == 7)
                        || (sscanf (line, "%s + %s -> %s %lf %lf %lf %d %d",
                                reactant1, reactant2, product1,
                                &alpha, &beta, &gamma, &reaction_type, &reaction_no) == 8)
                        || (sscanf (line, "%s + %s -> %s + %s %lf %lf %lf %d %d",
                                reactant1, reactant2, product1, product2,
                                &alpha, &beta, &gamma, &reaction_type, &reaction_no) == 9)
                        || (sscanf (line, "%s + %s -> %s + %s + %s %lf %lf %lf %d %d",
                                reactant1, reactant2, product1, product2, product3,
                                &alpha, &beta, &gamma, &reaction_type, &reaction_no) == 10)
                        || (sscanf (line, "%s + %s -> %s + %s + %s + %s %lf %lf %lf %d %d",
                                reactant1, reactant2, product1, product2, product3, product4,
                                &alpha, &beta, &gamma, &reaction_type, &reaction_no) == 11)
                        || (sscanf (line, "%s + %s + %s -> %s + %s %lf %lf %lf %d %d",
                                reactant1, reactant2, reactant3, product1, product2,
                                &alpha, &beta, &gamma, &reaction_type, &reaction_no) == 10))
                        ;
                else
                {
                        input_error (chem_file, line_number);
                }

      /* Ignore the following species: cosmic-ray, uv-photon,
         photon. Replace them by an empty string, and re-sort
         species. */
      
                if ((strcmp (reactant1, "cosmic-ray") == 0)
                        || (strcmp (reactant1, "uv-photon") == 0)
                        || (strcmp (reactant1, "photon") == 0))
                {
                        strcpy (reactant1, reactant2);
                        strcpy (reactant2, reactant3);
                        strcpy (reactant3, "");
                }
                if ((strcmp (reactant2, "cosmic-ray") == 0)
                        || (strcmp (reactant2, "uv-photon") == 0)
                        || (strcmp (reactant2, "photon") == 0))
                {
                        strcpy (reactant2, reactant3);
                        strcpy (reactant3, "");
                }
                if ((strcmp (reactant3, "cosmic-ray") == 0)
                        || (strcmp (reactant3, "uv-photon") == 0)
                        || (strcmp (reactant3, "photon") == 0))
                {
                        strcpy (reactant3, "");
                }
                if ((strcmp (product1, "cosmic-ray") == 0)
                        ||(strcmp (product1, "uv-photon") == 0)
                        || (strcmp (product1, "photon") == 0))
                {
                        strcpy (product1, product2);
                        strcpy (product2, product3);
                        strcpy (product3, "");
                }
                if ((strcmp (product2, "cosmic-ray") == 0)
                        || (strcmp (product2, "uv-photon") == 0)
                        || (strcmp (product2, "photon") == 0))
                {
                        strcpy (product2, product3);
                        strcpy (product3, "");
                }
                if ((strcmp (product3, "cosmic-ray") == 0)
                        || (strcmp (product3, "uv-photon") == 0)
                        || (strcmp (product3, "photon") == 0))
                {
                        strcpy (product3, "");
                }
                if ((strcmp (product4, "cosmic-ray") == 0)
                        || (strcmp (product4, "uv-photon") == 0)
                        || (strcmp (product4, "photon") == 0))
                {
                        strcpy (product4, "");
                }

      /* Fill the array of species. */
   
                add_specie (reactant1, species, n_species);
                add_specie (reactant2, species, n_species);
                add_specie (reactant3, species, n_species);
                add_specie (product1, species, n_species);
                add_specie (product2, species, n_species);
                add_specie (product3, species, n_species);
                add_specie (product4, species, n_species);

      /* Fill the array of reactions. Exit if of the reactant and
         product is not in the specie array. */
      
                if (*n_reactions < MAX_REACTIONS)
                {
                        if (((reactions[*n_reactions].reactant1 =
                                specie_index (reactant1, species, *n_species)) == -2)
                                || ((reactions[*n_reactions].reactant2 =
                                        specie_index (reactant2, species, *n_species)) == -2)
                                || ((reactions[*n_reactions].reactant3 =
                                        specie_index (reactant3, species, *n_species)) == -2)
                                || ((reactions[*n_reactions].product1 =
                                        specie_index (product1, species, *n_species)) == -2)
                                || ((reactions[*n_reactions].product2 =
                                        specie_index (product2, species, *n_species)) == -2)
                                || ((reactions[*n_reactions].product3 =
                                        specie_index (product3, species, *n_species)) == -2)
                                || ((reactions[*n_reactions].product4 =
                                        specie_index (product4, species, *n_species)) == -2))
                        {
                                fprintf (stderr, "astrochem: %s:%d: can't find specie index.\n",
                                                __FILE__, __LINE__);
                                exit(1);
                        }
                        reactions[*n_reactions].alpha = alpha;
                        reactions[*n_reactions].beta = beta;
                        reactions[*n_reactions].gamma = gamma;
                        reactions[*n_reactions].reaction_type = reaction_type;
                        reactions[*n_reactions].reaction_no = reaction_no;
                        (*n_reactions)++;
                }
                else
                {
                        fprintf (stderr, "astrochem: error: the number of reactions exceed %i.\n",
                                        MAX_REACTIONS);
                        exit(1);
                }
        }
  
        if (verbose >= 1)
        {
                fprintf (stdout, "done.\n");  
                fprintf (stdout, "Found %d reactions involving %d species.\n",
                                *n_reactions, *n_species);
        }

  /* Close the file. */

        fclose (f);
}

/*
  Add a specie in the species array, if not already present.
*/

void  
add_specie (char *new_specie, char *species[],
                        int *n_species)
{
        int i;
     
        if (strcmp (new_specie, "") == 0)
                return;
        for (i = 0; i < *n_species; i++)
        {
                if (strcmp (species, new_specie) == 0)
                        return;
        }
        i = *n_species;
        if (i < MAX_SPECIES)
        {
                if ((species = malloc (sizeof (char) * MAX_CHAR_SPECIES)) == NULL)
                {
                        fprintf (stderr, "astrochem: %s:%d: %s\n", __FILE__, __LINE__,
                                        "array allocation failed.\n");
                        exit (1);
                }
                if (strlen (new_specie) < MAX_CHAR_SPECIES - 1)
                {
                        strcpy (species, new_specie);
                        (*n_species)++;
                }
                else
                {
                        fprintf (stderr, "astrochem: error: the number of characters of some "
                                        "species of the chemical network file exceeds %i.\n",
                                        MAX_CHAR_SPECIES);
                        exit (1);
                }
        }
        else
        {
                fprintf (stderr, "astrochem: error: the number of species in the chemical"
                                "network file exceeds %i.\n", MAX_SPECIES);
                exit (1);
        }
  
        return;
}

/*
  Look up the index of a given specie in the species array.
*/

int specie_index (const char *specie, char *species[], int n_species)
{
        int i;
  
  /* Return -1 if the specie name is empty. */
        if (strcmp (specie, "") == 0)
        {
                return -1;
        }
        for (i = 0; i < n_species; i++)
        {
                if (strncmp (species, specie, sizeof (char) * MAX_CHAR_SPECIES) == 0)
                {
                        return i;
                }
        }

  /* Return -2 if we can not find the specie */
        return -2;
}
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

选择性所得税
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ll550

木虫 (职业作家)

【答案】应助回帖

感谢参与,应助指数 +1
估计很难有人回应,你应该自己先看懂然后问大家你不懂的部分,这么贴一大段程序,估计很难有人能回答你

[ 发自小木虫客户端 ]
livelong
2楼2015-07-21 19:21:13
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

13659938271

铁虫 (初入文坛)

引用回帖:
2楼: Originally posted by ll550 at 2015-07-21 19:21:13
估计很难有人回应,你应该自己先看懂然后问大家你不懂的部分,这么贴一大段程序,估计很难有人能回答你

有三分之二的是在判断。你肯定没有看。需要理解只有一点点
选择性所得税
3楼2015-07-22 10:49:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

baghnac

金虫 (小有名气)

引用回帖:
3楼: Originally posted by 13659938271 at 2015-07-22 10:49:34
有三分之二的是在判断。你肯定没有看。需要理解只有一点点...

一个普通程序员按200/天,看这么长程序的成本是很大的
顶下@ll550

#include <config.h>
#endiflm,[ 这句是有问题的,不符合C语言的要求
至少得保证你复制的程序是可靠的!可靠的!可靠的!(重要的事情说三遍)

总的来说,就是把文件按指定格式解析成结构体,就是数据格式化!

既然楼主说,需要理解的只有一点点,那到底是哪一点点楼主不理解????
Beagreathackernotacracker!
4楼2015-07-27 22:41:20
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 13659938271 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 315求调剂 +7 小羊小羊_ 2026-04-02 7/350 2026-04-02 17:35 by wxiongid
[考研] 085601一志愿北理325分求调剂 +3 找调剂,, 2026-04-02 3/150 2026-04-02 16:42 by asdfzly
[考研] 318求调剂,计算材料方向 +10 吸喵有害笙命 2026-04-01 11/550 2026-04-02 16:29 by oooqiao
[考研] 调剂 +3 好好读书。 2026-04-01 6/300 2026-04-02 15:49 by liumengping
[考研] 275学硕081000服从调剂到其他专业,保不住本专业了 +7 一只小小水牛 2026-04-02 8/400 2026-04-02 14:23 by alice-2022
[考研] 一志愿北京理工大学本科211材料工程294求调剂 +8 mikasa的围巾 2026-03-28 9/450 2026-04-02 12:09 by ms629
[考研] 0856初试324分求调剂 +6 想上学求调 2026-04-01 6/300 2026-04-02 11:42 by 星空星月
[考研] 材料专硕322分 +11 哈哈哈吼吼吼哈 2026-04-01 11/550 2026-04-02 10:52 by lnilvy
[考研] 材料调剂 +12 一样YWY 2026-04-01 12/600 2026-04-02 00:21 by 百秒光年
[考研] 一志愿南昌大学324求调剂 +12 hanamiko 2026-03-27 12/600 2026-04-01 22:34 by 运气yunqi
[考研] 273求调剂 +19 李芷新1 2026-03-31 19/950 2026-04-01 21:49 by chyhaha
[考研] 求调剂推荐 材料 304 +21 荷包蛋hyj 2026-03-26 21/1050 2026-04-01 21:09 by lijunpoly
[考研] 材料与化工(0856)304求B区调剂 +8 邱gl 2026-03-30 16/800 2026-04-01 17:58 by 邱gl
[考研] 085600,321分求调剂 +13 大馋小子 2026-03-31 13/650 2026-04-01 12:35 by chemdavid
[考研] 085410人工智能 初试316分 求调剂 +3 残星拂曙 2026-03-31 3/150 2026-04-01 11:09 by 小熊raider
[考研] 08工科,295,接受跨专业调剂 +6 lmnlzy 2026-03-31 6/300 2026-04-01 11:02 by 逆水乘风
[考研] 267求调剂 +13 uiybh 2026-03-31 13/650 2026-04-01 10:25 by 探123
[考研] 276求调剂 +3 赵久华 2026-03-29 3/150 2026-03-31 10:06 by cal0306
[考研] 吉大生物学326分求调剂 +3 sunnyupup 2026-03-31 3/150 2026-03-31 09:28 by longlotian
[考研] 材料专硕 085600求调剂 +7 BBQ233 2026-03-30 7/350 2026-03-30 17:44 by oooqiao
信息提示
请填处理意见