24小时热门版块排行榜    

查看: 639  |  回复: 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 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 时间戳又变了8-15 +5 archvillain 2026-08-15 9/450 2026-08-15 12:06 by archvillain
[公派出国] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +3 k0dTPqJtl0jt 2026-08-14 5/250 2026-08-15 07:09 by 4wMiSEwB6436
[基金申请] filecode +7 cratir 2026-08-14 11/550 2026-08-15 06:19 by 学员8dgXkO
[考博] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 +4 k0dTPqJtl0jt 2026-08-14 5/250 2026-08-15 04:45 by 4wMiSEwB6436
[基金申请] 小木虫上这么多卖论文的,真有人买论文么?感觉没必要啊 +11 Tide man 2026-08-10 12/600 2026-08-15 02:12 by home3163
[论文投稿] 售SCI一区文章,我:8O5.5.1.O5.4,科目全,可伽急 +3 HFw0lei2R37i 2026-08-14 5/250 2026-08-15 00:16 by 4wMiSEwB6436
[基金申请] 咱们一起用铁证分析2026国家社科基金中标与否 +7 启萌科技 2026-08-12 22/1100 2026-08-14 23:45 by Noways
[基金申请] 应该是93bebmhtak前后十一个字符比较关键 +23 Lanmanbaby 2026-08-09 37/1850 2026-08-14 13:40 by Equinoxhua
[硕博家园] 读博的好处 +4 lnee 2026-08-11 4/200 2026-08-14 10:20 by ahsoarli
[基金申请] FileCode能看出啥? +10 要乐观耀哥 2026-08-10 32/1600 2026-08-14 09:37 by 要乐观耀哥
[文学芳草园] 阿姨 +4 汪汪锅 2026-08-09 4/200 2026-08-13 19:43 by arzu_hma
[基金申请] 重要来源:本周末出结果 +10 瞬息宇宙 2026-08-12 10/500 2026-08-13 15:46 by likettle
[基金申请] 不应该看fileCode +7 且听虎啸 2026-08-12 9/450 2026-08-13 14:27 by flydreamws
[基金申请] Filecode 又变了,巨变 +3 WH3796 2026-08-12 4/200 2026-08-13 14:13 by 小木虫6752397
[基金申请] 分享一下我之前已中青C的计划书的filecode +4 布布和一二 2026-08-11 5/250 2026-08-13 12:56 by cratir
[基金申请] 2019年青年基金涵评意见,大家看看几个A,几个B? +11 Tide man 2026-08-11 11/550 2026-08-13 07:35 by 撸猫猫
[基金申请] 为什么网上很多人说本周 12号出结果 +6 瞬息宇宙 2026-08-10 7/350 2026-08-11 19:25 by Tide man
[基金申请] 据悉今年马上要出结果了 +7 瞬息宇宙 2026-08-10 8/400 2026-08-10 12:42 by Vivilian
[基金申请] 2026国自然放榜时间 +9 布布和一二 2026-08-08 9/450 2026-08-10 11:22 by xxxx2020
[基金申请] 面上项目filecode邪修 +5 西山十月 2026-08-09 7/350 2026-08-10 07:32 by 仁砚薪传
信息提示
请填处理意见