金融软件工程作业六:代码分析一

程序名:Webbench

来源:http://home.tiscali.cz/~cz210552/webbench.html

代码行:452行

程序语言:C

序言性注释:

/*

 * (C) Radim Kolar 1997-2004

 * This is free software, see GNU Public License version 2 for

 * details.

 *

 * Simple forking WWW Server benchmark:

 *

 * Usage:

 *   webbench --help

 *

 * Return codes:

 *    0 - sucess

 *    1 - benchmark failed (server is not on-line)

 *    2 - bad param

 *    3 - internal error, fork failed

 * 

 */ 

 

功能性注释:

  if(http10>1)

     strcat(request,"Connection: close\r\n");

  /* add empty line at end */

  if(http10>0) strcat(request,"\r\n"); 

  // printf("Req=%s\n",request);

}

   // printf("Host=%s\n",host);

   strcat(request+strlen(request),url+i+strcspn(url+i,"/"));

  } else

  {

   // printf("ProxyHost=%s\nProxyPort=%d\n",proxyhost,proxyport);

   strcat(request,url);

  }

 

基本成分:

(1)数据成分:

int proxyport=80;

char *proxyhost=NULL;

int mypipe[2];

char host[MAXHOSTNAMELEN];

 

  int i,j,k;   

  pid_t pid=0;

  FILE *f;

 

  /* check avaibility of target server */

  i=Socket(proxyhost==NULL?host:proxyhost,proxyport);

 

这里给出的示例中包括了各数据的名称、类型,也给出何时何处能对数据做出修改,较遗憾的是,Webbench程序代码中没有明确说明各个数据的作用域,也就是说对于一些特定的数据没有给出其合适的作用域,这一点是可以改进的。

(2)运算成分:

        speed+=i;

        failed+=j;

        bytes+=k;

 

             if(i==0) break;

             else

                bytes+=i;

 

(3)控制成分:

     while(1)

     {

        pid=fscanf(f,"%d %d %d",&i,&j,&k);

        if(pid<2)

                  {

                       fprintf(stderr,"Some of our childrens died.\n");

                       break;

                  }

        speed+=i;

        failed+=j;

        bytes+=k;

        /* fprintf(stderr,"*Knock* %d %d read=%d\n",speed,failed,pid); */

        if(--clients==0) break;

     }

 

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

  {

      pid=fork();

      if(pid <= (pid_t) 0)

      {

         /* child process or error*/

              sleep(1); /* make childs faster */

         break;

      }

  }

 

 switch(opt)

  {

   case  0 : break;

   case 'f': force=1;break;

   case 'r': force_reload=1;break

   case '9': http10=0;break;

   case '1': http10=1;break;

   case '2': http10=2;break;

   case 'V': printf(PROGRAM_VERSION"\n");exit(0);

  }

Webbench程序中主要使用的控制成分有顺序控制结构、条件选择结构(这里有if语句和switch语句)、重复结构(这里有while型和for型)

(4)传输成分:

fprintf(stderr,"Error in option --proxy %s: Missing hostname.\n",optarg);

printf("\nBenchmarking: ");

pid=fscanf(f,"%d %d %d",&i,&j,&k);

 

语言特性:

(1)心理特性:Webbench程序在紧致型上实现了关键字的使用,算术和逻辑操作符的数目均合理且实现了在逻辑正确的前提下尽可能少地使用。但局部性做的并不完美,有些部分可以单独设成新的模块。但线性满足较好,没有GOTO语句,循环语句数量也是合理的。程序使用C语言,相比之下更为传统。

(2)工程特性:Webbench程序使用c语言,可维护性和可复用性都较为优秀。代码使用的均为c语言的标准使用,可移植性更好。

(3)应用特性:Webbench程序使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。可以测试各种类型的网站,应用型较好。

 

对代码的修改

(1)消除switch语句

   if(method==METHOD_GET)

strcpy(request,"GET");

if(method==METHOD_HEAD)

       strcpy(request,"HEAD");

if(method==METHOD_OPTIONS)

       strcpy(request,"OPTIONS");

if(method==METHOD_TRACE)                             

        strcpy(request,"TRACE");

(2)注释中不能包含版本控制

  /*

  cas=time(NULL);

  while(time(NULL)==cas)

        sched_yield();

  */

这些不应该存在于此,而应在版本控制中。

 

程序名:贪吃蛇小游戏

来源:https://gitee.com/zhang-bo123/northern-tang-dynasty?_from=gitee_search

代码行:839行

程序语言:C++

序言性注释:

/******字符画一蛇******/

void printsnake()

/******游戏右边的得分和小提示*****/

void scoreandtips()

int HighScore = 0;//最高分

int status,sleeptime=300;//蛇前进状态,每次运行的时间

snake *head, *food;//蛇头指针,食物指针

snake *q;//遍历蛇身的指针

int endgamestatus=0;//游戏结束的情况。1:撞到墙 2:咬到自己 3:主动退出游戏

HANDLE hOut;//控制台句柄

 

功能性注释:

    COORD c;//COORDWindows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标。

File_out(); //调用File _out(), 读取文件save.txt 中的

gotoxy(64,4);//确定打印输出的位置

color(11);//设置颜色

scoreandtips();//游戏界面右侧的得分和小提示

        //GetAsyncKeyState函数用来判断函数调用时指定虚拟键的状态

基本成分:

(1)数据成分

int status,sleeptime=300;//蛇前进状态,每次运行的时间

snake *head, *food;/

 

    COORD c;//COORDWindows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标。

    c.X=x;

(2)运算成分

sleeptime=sleeptime+30;//时间间隔加上30

add=add-2;/

(3)控制成分

    if(nexthead->x==food->x && nexthead->y==food->y) //有食物

    {

      while(q!=NULL)

      {

        gotoxy(q->x,q->y);

        color(14);

        printf("★");

        q=q->next;

      }

      score=score+add;

      speedup();

      createfood();

    }

for(j=27;j<=74;j++)

            {

                gotoxy(j,i);

                if(i==20||i==26)

                {

                    printf("-");

                }

                else if(j==27||j==74)

                {

                    printf("|");

                }

            }

switch (n)//3个选项

{

    case 1://选项1,还没有添加选项内容,之后添加

    system("cls");//清屏

    createMap();

    initsnake();

    createfood();

    break;

}

 

(4)传输成分

    printf("请输入1~3之间的数!");

    fp=fopen("save.txt","a+");//打开文件

    fscanf(fp,"%d",&HighScore);//读取最高分

    scanf("%d", &n); 

 

语言特性:

(1)心理特性       

该程序在局部性上所作并不优良,很多的模块出现了冗杂的情况,一部分功能可以集成为另一全新的模块,避免代码块的重复大量使用。程序在线性上做的较好,各个功能模块均可以较好的按次序理解语义。程序使用C++语言,更加符合传统。

(2)工程特性

源代码的可移植性较好,该程序使用c++语言规范,在代码的可移植性上实现得较好,但是由于程序的特殊用途,程序的可复用性算不上优秀。但源代码所体现出的代码的可维护性较好,读者可以较好的理解、测试,并且合理的修改也能被接受。

(3)应用特性

C++支持结构化,在这种特性下,所写程序的复杂性不高,而且更加容易测试,这对于这种小游戏类的程序有较大的优势,因此适合使用。

 

对代码的修改

(1)结构化设计

gotoxy(64,14);

printf("每个食物得分: %d分",add); 

gotoxy(64,16);

printf("不能穿墙,不能咬到自己");

gotoxy(64,18);

printf("用1↓←一分别控制蛇的移动");

gotoxy(64,20);

printf("F1为加速,F2为减速");

gotoxy(64,22);

printf("space:暂停游戏");

gotoxy(64,24);

printf("ESC : 退出游戏");

应该对以上代码块实现结构化改性,集成成为一个整体模块,避免代码大量复用

void speedup();//加速

void speeddown();//减速

void snakemove();//控制蛇前进方向

void keyboardControl();//控制键盘按键

void Lostdraw();//游戏结束界面

void endgame();//游戏结束

这里的一些函数的功能可以被其他函数使用,不需要单独有一个新的函数,比如说,加速函数和减速函数在功能上有重复的部分,单独有新的函数使得代码冗余。

(2)switch语句修改

以下switch语句在软件工程上并不是完善的编码方式,应该转化成if语句

 switch (n)

    {

       case 1:

       system("cls");//清屏

       score=0;//分数归零

       sleeptime=200;//设定初始速度

       add = 10;//使add设定为初值,吃一个食物得10分,然后累加

       printsnake();//返回欢迎界面

       welcometogame();

       break;

 

       case 2:

       exit(0); //退出游戏

       break

 

       default://输入12以外的数字

       gotoxy(35,27);

       color(12); 

       printf("※※您的输入有误,请重新输入※※");

       system("pause >nul"); //按任意键 

       endgame();//就是将显示的内容重定向到nul 就是 不显示按任意键退出

       choose();//边框下面的分支选项

       break;

    }

 

 

 

 

 

posted @ 2021-04-25 18:18  kkkcmd  阅读(195)  评论(0)    收藏  举报