气象网络与技术实验报告

时间:2024.4.20

气象信息与网络技术课程设计

              地面/探空电码译码系统

 

                              

          学生姓名         邵元栋         

学    号       20131334055

          学    院     电子与信息工程学院    

专    业         通信工程

设计时间           16周  

二O一五年六月三十日

地面/探空电码译码系统

南京信息工程大学电子与信息工程学院通信工程专业,南京 210044

20131334055 邵元栋

摘要:随着经济发展和人们生活水平的不断提高气象对人类生活的影响程度也越来越大。

对事关防灾减灾和应对气候变化能力建设的气象服务需求日益增加。气象电码蕴含了丰富的原始

气象观测资料气象电码的质量关系到天气预报准确度关系到整个气象事业和人们的生活。科

学准确的气象信息可以提高防灾减灾服务的质量促进和谐社会的发展,提高应对气候变化能力

积极推进社会的科学发展。而这些都要求我们有一个稳定、高效的气象电码译码系统以适应发

展的要求。本文的目的是致力于设计一个小的气象地面/探空电码译码系统的研究与实现。本文

通过流程图设计和c语言编程的方法阐述了如何利用c语言设计一个小的气象地面/探空电码

译码系统及其内部各要素的电码译码。最后得出了结论此电码译码系统可以较准确的实现气象

地面/探空电码的译码及输出。

关键词:地面报文;探空报文;译码系统;气象要素;

一、    前言

气象地面报文电码具有地面各种气象要素和天气现象,如气温、湿度、风向、风速、海平面气压和雨、雪、雾,还具有记录云高、云状、天气演变如三小时变压、气压倾向等。近年来,随着计算机技术的快速发展以及卫星通信技术的研究深度的加深,地面气象报文系统的发展日益完善,报文电码的发展与计算机技术相关度越来越大,二者相结合为人类的日常生活产生了日益深远的影响。

    我国是自然灾害频发的国家,而气象灾害又是在自然灾害中损毁程度最严重的。 如我国最近几年发生几次大的寒潮,以及每年夏天发生的台风等同时每次自然灾害给人民的生产生活都带来了极大的不便甚至对一个地区的生产秩序起到破坏性的作用,因此国际国内对天气系统的变化情况越来越关注,而在气象领域对卫星观测资料的依赖度越来越大,天气资料在天气预报系统中占据越来越重要的作用,气象报文信息发挥了比以往更关键的角色,气象台根据气象信息预报寒潮、台风、暴雨等自然灾害出现的位置和强度,就可以直接为工农业生产和群众生活服务,通过应急准备及人员疏散等可以讲自然灾害带来的损害讲到最低。气象信息就成为现代社会不可缺少的重要信息。同时,气象信息的作用与气象代码翻译工作是分不开的,通过现代化的手段以及先进的通讯工具,气象电码的翻译工作效率大大提高,气象信息一经翻译,依赖于先进的通讯工具就能够及时地发布出去,具有很强的实时性,因而此代码翻译系统是具有重要意义的。在我们可接触到的各种电码翻译系统中,翻译系统的实现采用了多种语言,本文提供一种基于C语言的电码翻译系统,根据地面报文电码的特点通过相关的语句翻译出所表示的气象信息。

世界气象组织所属的天气监测网由一百多个成员国组成,其观测系统中包括十多颗卫星、三千多架飞机、一万多个陆上观测站、七千多个船舶观测站以及九百多个携带自动气象站的系统航标和浮标。世界天气观测网络就是通过这个观测系统提供最新的全球天气预报的。每天,高速电信链路通过三个世界级气象中心、34个区域性气象中心和187个国家级气象中心向全球传输气象资料和气象图。

气象资料是气象科学对天气过程进行的预测及对大气活动规律进行研究的主要依据,气象资料交换是气象业务的科研的基础。但是,由于各国文字的不一致性,和文字占据大容量存储空间的问题,决定将其以规定的编码形式在国际国内间进行交换。气象地面电码和探空电码就是其中的一种可供交换编码。

各个行业都有各自的国际电码。地面气象观测的天气电码,不但反映天气实况,而且也反映了天气的演变规律。因此,必须从天气学的角度去理解和选用天气报告电码。这是全面、准确反映测站天气实况和保证天气预报工作、减少人为失误的重要环节。电码需要按照一定的规则编写,这样,译码者才能按照那个规则译出电码所代表的通俗易懂的信息。

随着社会、经济的飞速发展和人民生活水平生活质量的大幅度提高,社会上各行各业对气象部门提出了全方位、多时效、针对性强、准确度高的天气预报服务要求。社会需求永远是天气预报发展的动力和压力。为了适应日益增长的社会需要,做好预报服务,预报员需要用到近年来许多新的知识和参考资料,尤其是各个地区的地面和探空气象资料分析,能够有效帮助预报员分析当地的天气现象,从而做出比较准确的天气预报。

二、    需求分析

1、提供给天气预报员实时天气资料,以便实时进行天气分析及准确预报。实时天气资料是天气分析和预报的基础,因为天气总在不断的变化,依据最接近所要预报的时间的实时天气资料所得出天气预报的准确程度最高,短期的天气预报总比长期和中长期的天气预报准确。所以想要得到较为准确的天气预报,必不可少的是方便及时地获得实时资料信息,这就需要电码译码系统来帮助实现。编写成电码的方式,能有效地节约信息传送的时间和空间,增加了天气预报的时效。

2、提供给科研人员过去和现在的天气各要素资料,从气温、气压、风、云、降水、能见度和空气湿度等,得出天气的性质,并且广泛地采用绘图,建表等分析方法,加上具体情况的具体分析,联系各个地方、各个时段的天气情况,找出天气变化规律,系统地进行研究,以便分析总结,研究天气的发展、演变,为揭示天气变化、研究大自然的奥妙,进而应用天气现象做出贡献。该系统对于这些大型的研究来说只是渺小的一小步,但确是不可或缺的一部分。

3、为二次天气应用开发提供天气资料,从而生产各种应用产品。天气应用十分广泛,天气信息可以直接应用播报天气情况,还可以应用在二次天气软件上,如可以设计出查询实时天气情况的软件,输入年月日时段和地点,即可显示出具体气象要素的信息,把软件安装在手机上,随身携带,方便快捷,符合大众的应用要求。

4、提供给开发人员一个译码工具,方便开发人员优化开发,充分利用译码的语句和设计流程,不需要开发人员重新设计,可以直接使用,如此简化了气象台的工作量,增加了其工作效率。此外,还给教师的教学提供了很大的方便,教师直接输入需要知道的时间站点信息即可得到对应的气象要素值,学生可以很好地了解具体的气象要素信息,能更好地学习气象知识。

5、提供给普通用户查询天气实时或过去天气资料,用户自己总结天气状况,决定自己在穿衣御寒防热还有度假出行等方面的生活。

6、提供给农民获取实时天气和过去天气资料,对比现在天气情况,从而比较好地进行播种、收割等农家活动。有了科学技术的支持,农业生产能取得迅速地发展,收获更多地粮食,养活更多的人口。

7、提供给工厂天气情况,有些产品的生产与天气的要素如温度、湿度等有着很大的关系,清楚地了解了具体的天气情况就能及时调整这些因素,这对产品的生产有很大的益处,工厂生产效率也能极大的提高。

三、    概要设计

1、  设计思路

读取气象电报电码文件,经过本电码译码系统,生产各气象要素。地面电码资料的气象要素有:温度、露点、本站气压、海平面气压、气压趋势、气压变化量、降水量、天气现象、云状、能见度,风向飞速、总云量等;高空电码资料的气象要素分13层:地面、1000hPa、925hPa、850hPa、700hPa、500hPa、400hPa、300hPa、250hPa、200hPa、150hPa、100hPa;高空电码资料的每层气象要素是:温度、温度露点差、气压、风向飞速。

编程思路是:由用户输入要译码的年、月、日、世界时次和台站号(注:有可能的话用地名),并选择地面或高空;由译码系统进行译码,生产出气象各要素,在屏幕上显示。

2、  地面/探空电报译码数据流图

地面/探空电报码以文件形式存放,固定为8.3格式。地面电报码文件格式是:AAXXmmdd.Thh,探空电报码文件格式是:TTAAmmdd.Thh。其中AAXX表示地面报;TTAA表示探空报;mm表示月份,用2位数字01~12;dd表示日,用2位数字01~31;hh表示时次,用2位数字,地面有00、03、06、09、12、15、18、21共8个时次,探空有00、06、12、18共4个时次,都用世界时。地面/探空电报译码数据流图如图1所示。

                             图1 电码译码系统数据流图

3、  地面/探空电报译码程序总流程图

根据电码文件名是8.3格式,并且与月日时次形成固定关系,因此可以采用输入年月日时次的数据来组合文件名。地面1~4位固定为“AAXX”,探空1~4位为“TTAA”,5~6位为2位数月份,7~8位为2位数日,9~10位为固定为“.T”,11~12位为2位数时次。

地面/探空电报译码程序流程图如图2所示,读取文件,找到指定台站的位置,并读取指定台站的电码到一个字符串数组中,然后传递给地面或探空处理程序继续处理,分解出天气各要素。最后显示结果。

                      图2 电码译码系统程序流程图

四、    详细设计

将已打开的电码文件数据分解,将第0-4个字符赋值给台站号,第6-10个字符赋值给iRiXhVV,iRiX指示码,本次不要译码,h——最低的云底部高度(米),VV—有效能见度(千米),第12~16字符赋值给Nddff,N—总云量,指观测时云遮蔽天空视野的总成数,dd —风向,以10度为单位编报。静风时,dd编报00。

ff—风速,以米/秒为单位进行编报。并将这些信息显示出来。

给K赋初值为16,利用数组分别对后面的数据进行译码,按照图示所示顺序,每次译码后K加6,直到K的值大于数组长度N结束地面译码。

                      图3译出地面各要素功能流程图

将已打开的报文资料进行分解,第0~11字符不用,第12~16字符赋值给台站号,并显示出来,给变量K赋初值为18,对气压进行译码,分别将数组第K和第K+1个字符与99,00,92……20,15,10进行比较,若相等则对第K+2-K+4个字符进行相应处理,得到相应的本组气压位势米,然后依次对气温,露点温度差,风向,风速译码,将变量K+18赋值给K,进行下一组译码,直到K〉n,结束本次探空译码。

                      图4译出探空各要素功能流程图

五、    编码设计

利用计算机高级语言对程序流程图进行编程,采用C语言编程。

1、编写主控程序,通过输入年月日时次,然后选择地面或高空,再输入要处理的台站号。根据输入信息,自动组成相应的文件名,从文件中读出指定台站电码资料,存入字符串数组ch中,然后调度地面dmdisp子程序或高空updisp子程序进行相应的处理。

   #include <stdio.h>          // 程序中要用到输入/输出函数

   #include <string.h>         // 程序中要用到字符串处理函数,如strlen、strcpy等

int str2int(char *ch,int k,int n); //  对字符串从k位置开始,长度为n的子字符串转

//  换为整型值。对于含有非数字字符,则返回-1

    void dmdisp(char *ch);     //  对字符串ch进行地面译码的功能函数

    void updisp(char *ch);     //  对字符串ch进行高空译码的功能函数

    void main(void)          //  主控程序入口

     { int year,month,day,hour;   // 定义年year、月month、日day、时次hour

    int n,p;                 // 定义位置计数器n,临时变量p

      char station[6],ch[400];    // 定义台站号station、存放电码字符串数组ch

      FILE *fp; char name[30];  // 定义读文件指针,文件名name

      int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};  // 定义每月天数

        printf("请输入年、月、日\n");

while(1)

 { scanf("%d%d%d",&year,&month,&day);  // 输入年月日用空格隔开

        if (year % 4 == 0) days[2]=29; else days[2]=28;

        if (month>=1 && month <=12 && day>=1 && day<=days[month]) break;

 else printf ("输入有错,请重新输入年、月、日\n");

       }

      printf("请选择:1-地面;2-高空\n");

while(1)

{ scanf("%d",&p); 

        if (p==1 || p==2) break;

else printf ("输入有错,请重新选择:1-地面;2-高空\n");

       }

if (p!=1)

       { strcpy(name,"..\\探空资料\\TTAA0000.T00");  p=13;

        printf("请输入高空世界时,供选择:0、6、12、18\n");

while(1)

{ scanf("%d",&hour); 

         if (hour==0 || hour ==6 || hour ==12 || hour ==18) break;

else printf ("输入有错,请重新输入高空世界时,供选择:0、6、12、18\n");

        }

      }

       else

       { strcpy(name,"..\\地面资料\\AAXX0000.T00");

        printf("请输入地面世界时,供选择:0、3、6、9、12、15、18、21\n");

while(1)

{ scanf("%d",&hour); 

         if (hour>=0 && hour <=21 && hour % 3 ==0) break;

else printf ("输入有错,请重新输入地面世界时:0~21,间隔为3\n");

        }

     }

       n=strlen(name);  //  以下生成电码文件名,存放在name中

      name[n-2]='0'+hour/10;   name[n-1]='0'+hour%10;  // 加入时次,2位数

      name[n-8]='0'+month/10;  name[n-7]='0'+month%10; // 加入月份,2位数

      name[n-6]='0'+day/10;    name[n-5]='0'+day%10;   // 加入日期,2位数

       printf("请输入台站号,南京为58238,北京为54511,上海为58362\n");

      scanf("%s",station);   // 台站号存放入station中

      if (fp=fopen(name,"rt"))   //  打开name电码文件,以便读入资料

      {       fgets(ch,80,fp);   //  跳空一行

            fgets(ch,80,fp);   //  跳空一行

            if (p==1) fgets(ch,80,fp);  //  如果处理地面,则跳空一行

        while(!feof(fp))   //  如未找到指定台站号,则一直到文件结束

            { fgets(ch,80,fp);  //  读入一行,存放到ch字符串数组中

              n=strlen(ch)-1;  //  计算ch字符串实际读入个数

              while (n<300 && ch[n-1] != '=' && !feof(fp))  // 一直到读完退出循环

              { ch[n]= ' ';       // 在ch字符串尾留出一个空格,预备后续存放

            fgets(&ch[n+1],80,fp); //  继续读入一行,存放到ch字符串数组后面中

            n=strlen(ch)-1;       //  重新计算ch字符串实际读入个

              }

          if (!strncmp(&ch[p-1],station,5))  // 是否找到指定台站号,未找到继续循环

              { if (p==1) dmdisp(ch); else updisp(ch); // 找到,则作相应的调度处理

                   p=0; break;  //  退出循环,准备结束程序运行

              }

            }

        fclose(fp);  // 关闭文件

            if (p!=0) printf("你指定的%s--台站未找到,请检查!!!\n",station);

       }

      else  printf("你指定的%s--文件不存在,请检查!!!\n" ,name);

     }

      int str2int(char *ch,int k,int n)  //  字符串转换成整数值函数

        { int i,m=0;  // 循环变量i,中间变量m,用于存放结果整数值

          for(i=0;i<n;i++)

           { if (ch[k+i]< '0' || ch[k+i]> '9') break;  // 字符串中含非数字,中途跳出

             m=m*10+ch[k+i]-'0';   //  字符串转换成整数值

          }

         if (i==n) return m;  else return -1;  // 返回结果值

        }

 void updisp(char *ch)   //  对ch进行探空译码

 {  int n,i,p,y;   // n表示当前字符串位置,p表示转换出的整数值

printf("=================读出的探空电码========================\n");

 puts(ch);  // 显示读到的字符串电码内容

 printf("=================探空译码结果==========================\n");

   n=(ch[10]==' ') ? 11 : 12 ;  // 调整好当前位置,如果"TTAA"后只有一个空格,

                         // 则n取11;若有两个空格,则n取12

   y=str2int(ch,n-6,2);   // 取出月份给y保存,处理风速时要用到

   printf("区站号:");  // n已指出台站号位置

   for(i=0;i<5;i++) printf("%c",ch[n+i]);  // 输出台站号

   printf("\n");  //  换行

   while(1)  //  死循环,中途必须用break跳出循环

     { n+=6 ;  // 调整好当前位置,准备处理hhPPP

     p=str2int(ch,n+2,3);  // p←PPP电码,处理气压,位势米

     if (ch[n]=='9' && ch[n+1]=='9')  //  99:地面气压

 //此处输出地面气压的位势米高度p,若p≤100,则加1000;否则p就是位势米。

     { printf("地面气压:");

          if(p<=100) p+=1000;

          printf("%d位势米",p);

        }

     else if (ch[n]=='0' && ch[n+1]=='0')   //  00:1000hPa气压

 //此处输出1000hPa气压的位势米高度p,若p>500,则500-p;否则p就是位势米。

      { printf("1000hPa气压:");

           if(p>500) p=500-p;

           printf("%d位势米",p);

        }

     else if (ch[n]=='9' && ch[n+1]=='2')   //  92:925hPa气压

       //此处输出925hPa气压的位势米高度p,p就是位势米。

      { printf("925hPa气压:");

          printf("%d位势米",p);

        }

     else if (ch[n]=='8' && ch[n+1]=='5')  //  85:850hPa气压

        //此处输出850hPa气压的位势米高度p,p加1000。

        { printf("850hPa气压:");

       printf("%d位势米",p+1000);

        }

     else if (ch[n]=='7' && ch[n+1]=='0')  //  70:700hPa气压

       //此处输出700hPa气压的位势米高度p,若p>300,加2000;否则加3000。

        {  printf("700hPa气压:");

           if(p>300)p=p+2000;

p+=3000;

printf("%d位势米",p);

        }

    else if ((ch[n]=='5'|| ch[n]=='4') && ch[n+1]=='0')  // 500hPa或400hPa气压

     //此处输出500hPa或400hPa气压的位势米高度p,p乘以10。

        { printf("%c00hPa气压:",ch[n]);

       printf("%d位势米",p*10);

        }

     else if ((ch[n]=='3' && ch[n+1]=='0') || (ch[n]=='2' && ch[n+1]=='5'))

   //  此处输出300hPa或250hPa气压的位势米高度p,

//  若p<500,则加1000后乘以10;否则p乘以10。

  { printf("%c%c00hPa气压:",ch[n],ch[n+1]);

     if(p<500)p+=1000;

     p*=10;

     printf("%d位势米",p);

        }

     else if (((ch[n]=='2'|| ch[n]=='1') && ch[n+1]=='0') ||

(ch[n]=='1' && ch[n+1]=='5'))

      //此处输出200hPa或150hPa或100hPa气压的位势米高度p,p加1000后乘以10。

        { printf("%c%c00hPa气压:",ch[n],ch[n+1]);

printf("%d位势米",(p+1000)*10);

        }

     else break;  // 处理结束,跳出死循环

     n+=6 ;  // 调整好当前位置,准备处理TTTDD

     p=str2int(ch,n,3); // p←TTT电码,处理温度,单位0.1℃

     if (p>=0)  //此处输出温度p,p为偶数表示零上,否则为零下

        { printf(",温度:");

         if(p%2==0)

printf("%.1f℃",p/10.0);

        }

     p=str2int(ch,n+3,2); // p←DD电码,处理露点差,单位℃,。

     if (p>=0)  // 此处输出露点差p,若p>50,则减去50;否则除以10

        { printf(",露点差:");

if(p%2) p=-p;

printf("%.1f℃",p/10.0);

       

        }

     n+=6; // 调整好当前位置,准备处理dddff

     p=str2int(ch,n,3);  // p←ddd电码,处理风向

     if (p%5==0)  // 此处输出风向p,必须是5的倍数,否则缺测

        { printf(",风向:%d度",p) ;

         p=str2int(ch,n+3,2);  // p←ff电码,处理风速

         if (p>=0)  // 此处输出风速p,注意风速的单位与y有关?

             { if (y>50) printf(",风速:%.1f米/秒",p*0.5);

               else printf(",风速:%d米/秒",p);

             }

        }

        printf("\n");

      }

    }

void dmdisp(char *ch)   //  对ch进行地面译码

{ int n,i,p; // n表示当前字符串位置,p表示转换出的整数值

char cl[10][5]={"无低","淡积","浓积","积雨","积层","层积","碎雨","碎雨","积","鬃积"};

 char cm[10][5]={"无中","高层","雨层","高积","荚状","层积","积雨","积层","积","散积"};

 char chh[10][5]={"无高","毛卷","密卷","伪卷","钩卷","卷","辐卷","卷层","层","卷积"};

 char cw[7][9]={"沙尘暴","雾","毛毛雨","非阵性雨","固体降水","阵雨","雷暴"};

char vv[11][6]={"≥7万","<50","50","2百","5百","1千","2千","4千","1万","2万","≥5万"};

char nh[10][6]= {"无云","1成","2-3成","4成","5成","6成","7-8成","9成","10成","有雾"};

char ww[96][15]= {"烟","霾","霾","霾","霾","霾","轻雾","片状浅雾","连续浅雾","闪电",

"高空有降水","远处有降水","附近有降水","雷暴无雨","飑","龙卷", "毛毛雨", "雨",

"雪、米雪","雨夹雪", "雨夹雨淞","阵雨", "阵雪","冰雹","大雾","雨夹雷暴",

"较轻沙尘暴","轻沙尘暴","中沙尘暴","中强沙尘暴","强沙尘暴","增强沙尘暴",

"轻低吹雪","强低吹雪","轻高吹雪","强高吹雪","雾散开","散片雾","可辨雾变薄",

"不可辨轻雾变薄","可辨雾","不可辨雾","可辨雾变浓","不可辨雾变浓","可辨雾淞",

"不可辨雾淞","间歇轻毛毛雨","连续轻毛毛雨","间歇中毛毛雨","连续中毛毛雨",

"间歇浓毛毛雨","连续浓毛毛雨","轻毛毛雨","浓毛毛雨","轻毛毛雨夹雨",

"浓毛毛雨夹雨","间歇小雨","连续小雨","间歇中雨","连续中雨","间歇大雨",

"连续大雨","小雨夹雨淞","大雨夹雨淞","小雨夹雪","中雨夹雪","间歇小雪",

"连续小雪","间歇中雪","连续中雪","间歇大雪","连续大雪","冰针","米雪","雪晶",

"冰粒","小阵雨","中阵雨","大阵雨","小阵性雨夹雪","大阵性雨夹雪","小阵雪",

"中或大阵雪","小阵性霰","中或大阵性霰","轻冰雹","中或强冰雹","雷暴后小雨",

"雷暴后中雨","雷暴后小雪","雷暴后大雪","小雷暴伴雨雪","小雷暴伴冰雹",

"大雷暴伴雨雪","雷暴及沙尘暴","大雷暴伴冰雹"};       

printf("=================读出的地面电码========================\n");

 puts(ch);  // 显示读到的字符串电码内容

 printf("=================地面译码结果==========================\n");

  printf("区站号:") ;  // 准备处理IIiii

  for(i=0;i<5;i++) printf("%c",ch[i]) ;  // 输出台站号

  printf("\n") ;  // 换行,准备处理iRiXhVV

  switch(ch[8]) // 处理云底高度h

{ case '0' : printf("云高<50米"); break;

   case '1' : printf("云高50--<100米"); break;

   case '2' : printf("云高100--<200米"); break;

   case '3' : printf("云高200--<300米"); break;

   case '4' : printf("云高300--<600米"); break;

   case '5' : printf("云高600--<1000米"); break;

   case '6' : printf("云高1000--<1500米"); break;

   case '7' : printf("云高1500--<2000米"); break;

   case '8' : printf("云高20##--<2500米"); break;

   case '9' : if (ch[12]=='0') printf("无云高");else printf("云高≥2500米"); break;

 }

  p=str2int(ch,9,2);  // 处理能见度VV,p←VV电码,单位米或千米

printf(",能见度为:");

  // 此处根据p输出能见度资料,注:p<=88未处理;p>88 已处理

if(p==0)printf("%s米", "<100");

if(p>=1&&p<=50)printf("%d米",1000*p/10);

if(p>=51&&p<=79)printf("%d米", 1000*(p-50));

if(p==80)printf("%s米", ">=30000");

if(p>=81&&p<=88)printf("%d米"), (1000*(5*(p-80)+30));

if (p>88) printf("%s米",vv[p-89]);

 //  准备处理Nddff:总云量N、风向dd、风速ff

 if (ch[12]!= '/') printf(",总云量:%s",nh[ch[12]- '0']);  // 处理总云量N

 p=str2int(ch,13,2);  // 处理风向dd,要放大10倍,单位度

 if (p==0) printf(",静风");

 if (p>0) printf(",风向:%d度",p*10);

 p=str2int(ch,15,2);  // 处理风速ff,单位米/秒

 if (p>0) printf(",风速:%d米/秒",p);

 printf("\n");  // 换行

 n=18;   // 调整好当前位置,准备处理温度、露点温度等资料

 if (ch[n]== '1') // 处理温度 1sTTT   单位0.1℃   已处理好

{ p=str2int(ch,n+2,3);   //  p←TTT电码,即温度资料

 if (p>=0) //此处根据p输出温度资料,ch[n+1]为零表示正,否则为负。

      {  if (ch[n+1]=='1') p= -p;

       printf("气温:%.1f℃",p/10.0);

      }

   n+=6; // 调整好当前位置

 }

 if (ch[n]== '2') //处理露点温度  2sTdTdTd    单位0.1℃

 { p=str2int(ch,n+2,3);  //  p←TdTdTd电码,即露点温度资料

  if (p>=0) //此处根据p输出露点温度资料,ch[n+1]为零表示正,否则为负。

  {

printf(",露点温度:");

if (ch[n+1]=='1') p=-p;

   printf("%.1f℃",p/10.0);

   }

   n+=6; // 调整好当前位置

 }

 if (ch[n]== '3') //处理本站气压 3P0P0P0P0,单位0.1hPa。

 { p=str2int(ch,n+1,4);   //  p←P0P0P0P0电码,即本站气压资料

   if (p>=0) //此处根据p输出本站气压资料。

 {

    printf(",本站气压:");

if (p<1000)p+=10000;

    printf("本站气压:%.1fhPa",p/10.0);

   }

   n+=6;  // 调整好当前位置

 }

 if (ch[n]== '4') //处理海平面气压 4PPPP,单位0.1hPa。

 { p=str2int(ch,n+1,4);   //  p←PPPP电码,即海平面气压资料

  if (p>=0)   //  此处根据p输出海平面气压资料

   {

     printf(",海平面气压:");

if (p<5000)p+=10000;

    printf("海平面气压:%.1fhPa",p/10.0);

   }

   n+=6;  // 调整好当前位置

 }

 printf("\n") ;

 if (ch[n]== '5') //处理过去三小时气压变化 5appp

 { p=str2int(ch,n+2,3);  //  p←ppp电码,即过去三小时气压变化资料

  if (p>=0)  // 此处根据p输出过去三小时气压变化,单位0.1hPa。

   {

     printf("过去三小时气压变化:");

     if (ch[n+1]>'4')p=-p;

printf("%.1fhPa",p/10.0);

   }

  n+=6; // 调整好当前位置

 }

if (ch[n]== '6') //处理降水量,单位毫米。 6RRR1

 { p=str2int(ch,n+1,3);  //  p←RRR电码,即降水量资料

  if (p>=0)  //  此处根据p输出降水量

   {

printf(",降水量:");

if (p==0) printf("不用");

if (p<=988&&p>1) printf("%d毫米",p);

if (p==990) printf("微量");

if (p<=999&&p>=991) printf("%.1f毫米",(p-990)/10.0);

   }

   n+=6;  // 调整好当前位置

 }

printf("\n") ;

if (ch[n]== '7')  // 处理天气现象   7wwW1W2

 { p=str2int(ch,n+1,2);  //  p←ww电码,即天气现象资料

  if (p>=4) printf("现在天气现象为:%s",ww[p-4]);  // 请把电码翻译出来!!!

//  过去天气现象,ch[n+3]表示W1,ch[n+4]表示W2

  if (ch[n+3]>='3' && ch[n+3]<='9') printf(",六小时内出现有%s",cw[ch[n+3]- '3' ]);

  if (ch[n+4]>='3' && ch[n+4]<='9') printf("和%s",cw[ch[n+4]- '3' ]);

  n+=6;  // 调整好当前位置

 }

 printf("\n") ;

 if (ch[n]== '8') //处理云资料   8NhCLCMCH

 { if (ch[n+1]!= '/')  // 低云或中云总云量

  { if (ch[n+2]!= '0') printf("低云"); else printf("中云");

    printf("总云量:%s",nh[ch[n+1]- '0']);

   }

   if (ch[n+2]!= '/') printf(",低云状:%s云",cl[ch[n+2]- '0']);

   if (ch[n+3]!= '/') printf(",中云状:%s云",cm[ch[n+3]- '0']);

   if (ch[n+4]!= '/') printf(",高云状:%s云",chh[ch[n+4]- '0']);

 }

 printf("\n") ;

}

运行与调试

1、20##年5月30日0时,北京气象站地面原始电报码和译码如图5所示。

                       图5北京气象站地面原始电报码和译码

分析:如上图所示程序首先通过对日期的读取,地面或高空的选择,以及时次的选择和地区的选择,读出正确的地面代码,并输出正确的译码结果。如北京气象站地面原始资料的译码需输入正确时间,选择地面1,并输入北京台站号54511。译码结果输出的内容有区站号、云高、能见度、总云量、风向、风速、气温、露点温度、本站气压、海平面气压、气压变化情况、以及现在天气现象、和当前具体云的类型。如上图所示,北京气象站的地面译码结果,正确显示了区站号,以及当前日期及时次北京正确的天气现象的数值和单位,结果较为全面,译码结果较为理想。

2、20##年5月30日0时,上海气象站地面原始电报码和译码如图6所示。

                       图6上海气象站地面原始电报码和译码

分析:如上图所示程序首先通过对日期的读取,地面或高空的选择,以及时次的选择和地区的选择,读出正确的地面代码,并输出正确的译码结果。如上海气象站地面原始资料的译码需输入正确时间,选择地面1,并输入上海台站号58362。译码结果输出的内容有区站号、云高、能见度、总云量、风向、风速、气温、露点温度、本站气压、海平面气压、气压变化情况、以及现在天气现象、和当前具体云的类型。如上图所示,上海气象站的地面译码结果,正确显示了区站号,以及当前日期及时次上海正确的天气现象的数值和单位,结果较为全面,译码结果较为理想。

3、20##年5月30日0时,南京气象站地面原始电报码和译码如图7所示。

                       图7南京气象站地面原始电报码和译码

分析:如上图所示程序首先通过对日期的读取,地面或高空的选择,以及时次的选择和地区的选择,读出正确的地面代码,并输出正确的译码结果。如南京气象站地面原始资料的译码需输入正确时间,选择地面1,并输入南京台站号58238。译码结果输出的内容有区站号、云高、能见度、总云量、风向、风速、气温、露点温度、本站气压、海平面气压、气压变化情况、以及现在天气现象、和当前具体云的类型。如上图所示,南京气象站的地面译码结果,正确显示了区站号,以及当前日期及时次南京正确的天气现象的数值和单位,结果较为全面,译码结果较为理想。

4、20##年5月30日12时,北京气象站高空原始电报码和译码如图8所示。\

                       图8北京气象站探空原始电报码和译码

分析:如上图所示程序首先通过对日期的读取,地面或高空的选择,以及时次的选择和地区的选择,读出正确的地面代码,并输出正确的译码结果。如北京气象站探空原始资料的译码需输入正确时间,选择高空2,并输入北京台站号54511。译码结果输出的内容有区站号、气压及其位势米、温度、露点差、风速、风向。如上图所示,北京气象站的探空译码结果,正确显示了区站号,以及当前日期及时次北京正确的高空气象元素的数值和单位,结果较为全面,译码结果较为理想。

5、20##年5月30日12时,上海气象站高空原始电报码和译码如图9所示。

                       图9上海气象站探空原始电报码和译码

分析:如上图所示程序首先通过对日期的读取,地面或高空的选择,以及时次的选择和地区的选择,读出正确的地面代码,并输出正确的译码结果。如上海气象站探空原始资料的译码需输入正确时间,选择高空2,并输入上海台站号58362。译码结果输出的内容有区站号、气压及其位势米、温度、露点差、风速、风向。如上图所示,上海气象站的探空译码结果,正确显示了区站号,以及当前日期及时次上海正确的高空气象元素的数值和单位,结果较为全面,译码结果较为理想。

6、20##年5月30日12时,南京气象站探空原始电报码和译码如图10所示。

                       图10南京气象站探空原始电报码和译码

分析:如上图所示程序首先通过对日期的读取,地面或高空的选择,以及时次的选择和地区的选择,读出正确的地面代码,并输出正确的译码结果。如南京气象站探空原始资料的译码需输入正确时间,选择高空2,并输入南京台站号58238。译码结果输出的内容有区站号、气压及其位势米、温度、露点差、风速、风向。如上图所示,南京气象站的探空译码结果,正确显示了区站号,以及当前日期及时次南京正确的高空气象元素的数值和单位,结果较为全面,译码结果较为理想。

 7、系统对错误处理的情况

 错误一:输入错误的日期,会显示输入有错,请重新输入。

图11

错误二:当正确输入日期时,选择地面或高空时,输入与之不符的选择,则提示出错,请重新输入。

图12

错误三:当正确输入日期和正确选择了地面或高空后,选择时次时,输入与之不同的时间,则会提示出错,请重新输入。

图13

六、    总结

气象信息与我们的生活息息相关,我们的许多日常活动受到天气的影响,所以及时了解气象信息对我们的的日常生活来说是至关重要的。

气象信息不仅与我们的生活息息相关,对于我们通信工程专业的学生来讲这跟我们的专业也有一定的关系,信息编码、传输、译码等工作正是我们专业所学内容的一部分。所以学习这门课程,学习气象信息的编码译码等知识,对于通信工程专业来说也是比较重要的。

本文主要介绍对对气象信息编码的翻译,因为我们在传递气象信息的时候总是希望内容是适应传输信道的,所以把气象信息翻译成一连串数字组成的编码是有必要的,但是当我们接收到这些编码后我们并不能直接获知气象信息,因此必须对已经接收到的编码使用C语言进行译码。根据编码的规则进行译码,不同的气象信息编码规则不同,所以译码规则也是不同的。

设计一个小的气象地面探空电码译码系统,通过上面的运行结果的调试之后发现所设计的这个系统已经基本达到了这个设计目的,可以比较准确的翻译出特定的时间和地点的地面及高空资料。当然这个系统还有许多要改进的地方,包括程序代码也有很多地方可以简化,比如输入方式可以采用一段一段的输入,也可以采用循环的方式输入,程序结构上,可以采用顺序结构设计,也可以采用循环结计,可以一个主程序完成所有的设计,也可以采用较简洁明了的分支结构设计。同时我发现这个系统在报错方面并不理想,必须要到最后一步输入站台号之后才会有报错情况出现,这一点可以优化。当然如果拓宽点思路,完全可以讲这个系统设计成完整的气象预报系统当然这样的工作量非常大,暂时我还不能完成,但这也可以算是一个努力的方向。说实话这算是我第一次编写比较大的程序,当然是在老师帮助的情况下,中间因为没编写过比较大的程序,所以在程序结构的设计上总是出问题,当然还有很多的小错误,总之编写这个程序的过程中遇到了很多的问题,但通过询问老师,和同学之间的交流,最终算是把这些问题都给解决了。通过这次课程设计我觉得自己c语言的编程能力得到了比较大的强化,对c语言这门高级语言有了更理解,也认识到自己的编程能力很差还需要更多的努力。当然通过这次的课程设计我也对气象地面和探空电码有了一定的了解,熟悉了电码译码的基础知识,我相信这对我的将来也会有帮助的。另外这个系统作为气象信息的翻译,我觉得在气象预测和预警方面也有一定应用,随着智能手机的普及,手机天气预报也越来越受欢迎,我觉得可以以这个程序为基础开发出一个手机天气预报系统,而不是简单的将气象信息发送到手机里面,当然这只是一个设想,具体的实施肯定会碰到很多的问题

例如日期中的日的编码大于50的时候我们就需要注意了,除了在翻译日期的时候我们需要减去50以外,我们还要在翻译风速编码的时候注意风速的单位是0.5m/s而不再是1m/s。所以我们要在意这些编码的细节,译码的规则一定要是根据编码规则来设置。除此之外我们还应该注意C语言编程时的一些细节,例如对于温度的译码,因为单位是0.1℃,所以我们应该讲编码除以10,这是用C语言输出的时候就不能用整形型据输出,而应该是浮点型,即应该用printf(”   %.1f”,p/10)表示(保留一位小数),而不是printf(“  %d”,p/10)。只要注意这些细节就没有什么问题。

关于对不同天气现象处理时译码语句结构选择的问题,对于一些气象信息的译码,可以使用条件语句if, else if,也可以使用分支语句switch, case 。例如对于温度,气压等气象信息的译码我使用了if语句,而在对天气现象的译码时,因为各类天气现象比较多,所以我使用的是分支语句。两种语句结构的使用都是可行的,根据处理情况的不同选择合适的语句结构可能会使结构更简单清晰。

通过对《气象信息与网络技术》课程的学习,我们加深了对天气现象的了解,也巩固了对有关信息知识的学习;掌握了气象信息的译码,对我们的生活以及以后的工作都是有相应的帮助的。

参考文献

[1] 李集明,高学浩等,《气象台站信息技术应用》,气象出版社,2011.11.

[2] 姚学祥,高学浩等,《天气预报技术与方法》,气象出版社,2011.8.

[3] 姜世中,《气象学与气候学气象学与气候学》,科学出版社,2010.11.

[4] 王晓莉,《面向公众需求的气象影视服务改进策略》,中国会议,2012.9.

[5] 中国气象局监测网络司编,《地面气象电码手册》,气象出版社,20##年版

[6] 谭浩强,《C语言程序设计教程》,高等教育出版社,20##年版

The ground / upper-air code decoding system

Nanjing University of Information Science and Technology communication engineering, Nanjing 210044

20131334055 shaoyuandong

ABSTRACTAlong with the economic development and people living standard unceasing

enhancement, meteorological influence degree of human life is becoming more and more  big.To address climate change in disaster prevention and mitigation and capacity building of meteorological service demand is increasing. Weather code contains a wealth of meteorological data in the original, the quality of the meteorological code is related to the weather forecast accuracy, is related to the meteorological service and people's life. Scientific and accurate weather information can improve the quality of service of disaster prevention and mitigation,

promote the development of a harmonious society, improve the ability to cope with climate change actively promote the scientific development of society. Which requires us to have a  stable and efficient weather code decoding system, to adapt the demand of development. The   purpose of this paper is to design a small ground/meteorological sounding code decoding system research and implementation. In this paper, through the flow chart of design and the method of c language programming, expounds how to use c language to design a small ground/meteorological sounding code decoding system and its internal code decoding of each factor. Finally reached the conclusion that this code decoding system can accurately realize the ground/ meteorological sounding code decoding and output..

 

Key word: ground; upper-air; decoding system; meteorological factors;

更多相关推荐:
计算机网络实训报告

1绪论11项目的背景及意义我校以亚运村小营的校本部为中心共有14个校区辐射分布在北京市城近郊区每个校区的网络单独来看是一个相对独立的园区网基本都实现了千兆到楼宇百兆到桌面的网络连接各校区的园区网以校本部校区为中...

网络实训报告

实训报告网络设备组装与配置20xx年6月5日黄河科技学院实训报告第I页摘要21世纪是信息的时代在信息化风起云涌的今天企业内部网络的搭建已经成为了提升企业可信竞争力的关键因素企业网已被越来越多的人所提及网络信息技...

计算机网络实验实验报告1

计算机网络实验实验报告1,内容附图。

计算机网络实验报告

计算机网络实验报告学号0604305015姓名杨宁班级06计算机专业计算机科学与技术指导教师刘海雄实验名称IE及Outlook设置与应用实验目的使学生学会设置和使用IE浏览器以及outlook收发邮件实验内容与...

计算机网络实训报告

信息工程系综合实训报告姓名:XXXX学号:0000000专业:计算机网络实训地点:指导教师:XXXXX20xx年x月x日目录一、项目简介及客户需求........................错误!未定义书…

网络实验报告--常用网络命令

计算机网络课程-常用网络命令实验报告

网络监测实验报告

南京邮电大学课程设计II报告20xx20xx学年第一学期题目专业信息安全学生姓名赢猛班级学号Q11010330指导教师孙国梓指导单位计算机学院信息安全系日期20xx年1月7日课程设计II报告网络服务监测系统一课...

网络编程实验报告

网络编程实验报告指导老师姓名学号班级实验题目网络文件传输实验目的了解网络文件传输的方法了解FTP协议基础学习使用WinSock实现网络文件的传输了解点对点P2P网络文件传输的方法学习使用WinSock实现P2P...

网络嗅探实验报告

一实验目的掌握Sniffer嗅探器工具的使用方法实现FTPHTTP数据包的捕捉掌握对捕获数据包的分析方法了解FTPHTTP数据包的数据结构和连接过程了解FTPHTTP协议明文传输的特性以建立安全意识二实验原理网...

网络命令实验报告

实验报告题目学院专业班级小组成绩指导教师完成日期网络工具实践应用计算机学院网络工程网络工具应用实践实验报告1实验概要用PC对下面几个常见的网络命令进行测试分析和诊断PingIpConfigNbtstat2实验环...

实验报告_网络基本概念

实验一网络基本概念姓名学号实验班号42机器号3一实验目的1初步了解计算机网络的相关概念熟练掌握Windows环境下网络配置的方法了解基本的网络命令的功能并能够检测基本的网络问题熟练掌握Windows环境下用户配...

网络管理实验报告

学生实验报告书实验课程名称开课学院指导教师姓名学生姓名学生专业班级网络管理实验计算机科学与技术学院20xx20xx学年第一学期实验课程名称计算机网络管理实验课程名称计算机网络管理实验课程名称计算机网络管理实验课...

网络实验报告(26篇)