24小时热门版块排行榜    

查看: 640  |  回复: 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的回帖

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的回帖
查看全部 4 个回答

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的回帖
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 售SCI一区T0P文章,我:8.O55.1.O.54,科目全,可十急 +4 HFw0lei2R37i 2026-08-14 8/400 2026-08-15 14:41 by QXtWNz7PI7wZ
[基金申请] 有时候,自然基金真的不能太认真 (我的申报经验) +7 majunge000 2026-08-11 9/450 2026-08-15 13:34 by kiz2011
[考博] 售一区SCI文章T0P,我:8O.551.O54,科目全,可十急 +3 k0dTPqJtl0jt 2026-08-14 3/150 2026-08-15 12:33 by KxMI1BYBxWX1
[基金申请] 关于Filecode分析方法 +10 majunge000 2026-08-10 13/650 2026-08-15 12:26 by hanpeng972
[考博] 售一区SCI文章T0P,我:8O.551.O54,科目全,可十急 +3 HFw0lei2R37i 2026-08-14 5/250 2026-08-15 11:41 by KxMI1BYBxWX1
[基金申请] 哪位老哥知道今年的国自然具体哪一天放榜? +6 Ldrop2023 2026-08-13 6/300 2026-08-15 10:09 by tuanggou
[教师之家] 售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急 +5 7lpolszZVXgi 2026-08-14 6/300 2026-08-15 09:28 by sunzitan
[公派出国] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +3 k0dTPqJtl0jt 2026-08-14 5/250 2026-08-15 07:09 by 4wMiSEwB6436
[考博] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 +4 k0dTPqJtl0jt 2026-08-14 5/250 2026-08-15 04:45 by 4wMiSEwB6436
[硕博家园] 售SCI一区T0P文章,我:8.O55.1.O.54,科目全,可十急 +3 HFw0lei2R37i 2026-08-14 4/200 2026-08-15 04:17 by 4wMiSEwB6436
[硕博家园] 售SCI一区文章,我:8O5.5.1.O5.4,科目全,可伽急 +3 k0dTPqJtl0jt 2026-08-14 4/200 2026-08-15 01:28 by 4wMiSEwB6436
[论文投稿] 售SCI一区文章,我:8O5.5.1.O5.4,科目全,可伽急 +3 HFw0lei2R37i 2026-08-14 5/250 2026-08-15 00:16 by 4wMiSEwB6436
[基金申请] 奇怪,两个人的filecode固定段从头到尾一模一样 +8 布布和一二 2026-08-10 11/550 2026-08-14 14:58 by Equinoxhua
[硕博家园] 一作与独作在应聘高校教师时区别大吗 +3 mbygzh 2026-08-08 4/200 2026-08-13 19:31 by 龙-樱
[基金申请] 静等基金结果 +8 gjjjzhong 2026-08-10 21/1050 2026-08-13 17:56 by 且听虎啸
[基金申请] 重要来源:本周末出结果 +10 瞬息宇宙 2026-08-12 10/500 2026-08-13 15:46 by likettle
[基金申请] Filecode 又变了,巨变 +3 WH3796 2026-08-12 4/200 2026-08-13 14:13 by 小木虫6752397
[基金申请] 确定了,国自然21号放榜 +6 布布和一二 2026-08-10 7/350 2026-08-10 19:15 by 2000zf36392
[基金申请] 国自然结果 +4 Vierhys 2026-08-10 8/400 2026-08-10 15:06 by Vierhys
[基金申请] 面上项目filecode邪修 +5 西山十月 2026-08-09 7/350 2026-08-10 07:32 by 仁砚薪传
信息提示
请填处理意见