命名空间一个极强烈的目标就是是缓解重名问题,PHP中未同意两独函数或者类现身一样之名字,否则会来一个致命之荒唐。

08:石头剪刀布

总归时范围: 
1000ms

内存限制: 
65536kB

描述
石头剪刀布是周边的猜拳游戏。石头强剪刀,剪刀胜布,布胜石头。倘诺少单人口出拳一样,则不分胜负。

无异于上,小A及小B正好在玩石头剪刀布。已解他们之出拳都是来周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期不断循环的。请问,小A及小B比了N轮之后,什么人胜之轮数多?

输入
输入包含三行。
先是实践包含五个整数:N,NA,NB,分别代表于了N轮,小A出拳的周期长,小B出拳的周期长。0
< N,NA,NB < 100。
仲履行包含NA个整数,表示小A出拳的规律。
其三实践包含NB个整数,表示小B出拳的规律。
中,0代表“石头”,2意味着“剪刀”,5意味着“布”。相邻两独整数之间用么空格隔开。

输出
出口一行,假若小A赢的轮数多,输出A;即便小B赢之轮数多,输出B;倘若少丁抗衡,输出draw。

样例输入
10 3 4
0 2 5
0 5 0 2

样例输出
A

提示
对此测试数据,猜拳过程也:
A:0 2 5 0 2 5 0 2 5 0
B:0 5 0 2 0 5 0 2 0 5
A赢了4轱辘,B赢了2轮,双方打平4车轮,所以A赢的轮数多。

 1 #include<iostream>
 2 #include<cmath>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 int a[10001];
 8 int b[10001];
 9 int now_a[100001];
10 int now_b[100001];
11 int ying_a;
12 int ying_b;
13 int ping;
14 int main()
15 {
16     int n;//总共进行了n轮
17     int a_z,b_z;//a,b的出拳周期
18     cin>>n>>a_z>>b_z;
19     for(int i=1;i<=a_z;i++)
20     {
21     cin>>a[i];
22     now_a[i]=a[i];
23     }
24     for(int i=1;i<=b_z;i++)
25     {
26         cin>>b[i];    
27         now_b[i]=b[i];
28     }
29     int now=1;
30     for(int i=a_z+1;i<=n;i++)
31     {
32         a[i]=now_a[now];
33         if(now==a_z)
34         {
35             now=1;
36         }
37         else now++;
38     }
39     for(int i=a_z+1;i<=n;i++)
40     {
41         a[i]=now_a[now];
42         if(now==a_z)
43         {
44             now=1;
45         }
46         else now++;
47     }
48     for(int i=b_z+1;i<=n;i++)
49     {
50         b[i]=now_b[now];
51         if(now==b_z)
52         {
53             now=1;
54         }
55         else now++;
56     }
57     for(int i=1;i<=n;i++)// 0石头 2剪刀 5布 
58     {
59         if(a[i]==0&&b[i]==0)
60         ping++;
61         if(a[i]==0&&b[i]==2)
62         ying_a++;
63         if(a[i]==0&&b[i]==5)
64         ying_b++;
65         if(a[i]==2&&b[i]==0)
66         ying_b++;
67         if(a[i]==2&&b[i]==2)
68         ping++;
69         if(a[i]==2&&b[i]==5)
70         ying_a++;
71         if(a[i]==5&&b[i]==0)
72         ying_a++;
73         if(a[i]==5&&b[i]==2)
74         ying_b++;
75         if(a[i]==5&&b[i]==5)
76         ping++;
77     }
78     if(ying_a>ying_b)
79     {
80         cout<<"A";
81     }
82     else if(ying_a<ying_b)
83     {
84         cout<<"B";
85     }
86     else cout<<"draw";
87     return 0;
88 }

 

本身顾到,如若导入元素的下,当前空中有同一之讳元素将会面怎么着?显明结果会来致命错误。

官空间 自己暴发一个common_inc.php脚本文件,里面来一些好用的函数和接近:

  1. 非限定名称,或无含有前缀的接近名称,例如 $comment = new
    Comment();。即便手上命名空间是Blog\Article,Comment将给分析为Blog\Article\Comment。假诺利用Comment的代码不包含在另命名空间受到之代码(全局空间被),则Comment会受解析为Comment。

  2. 限定名称,或含前缀的号,例如 $comment = new
    Article\Comment();。假如手上之命名空间是Blog,则Comment会于解析为Blog\Article\Comment。倘诺用Comment的代码不带有在此外命名空间受到的代码(全局空间被),则Comment会为解析为Comment。

  3. 全然限定名称,或含了全局前缀操作符的名号,例如 $comment = new
    \Article\Comment();。在这种情状下,Comment总是被解析为代码中的字称(literal
    name)Article\Comment。
     

 如下也是反映命名空间的援格局:

<?php
namespace Article;
class Comment { }

namespace MessageBoard;
class Comment { }

//调用当前空间(MessageBoard)的Comment类
$comment = new Comment();

//调用Article空间的Comment类
$article_comment = new \Article\Comment();
?>

名术语

 

以一个命名空间里引入这剧本,脚本里的元素不碰面落到是命名空间。如若这个剧本里没有定义此外命名空间,它的要素就一贯处于公共空间受到:

调用公共空间的章程是一直当要素名称前加 \
就可以了,否则PHP解析器会认为我眷恋调用当前空中下之素。除了由定义之因素,还包PHP自带的要素,都属国有空间。


<?php
function getIP() { }

class FilterXSS { }
?>

file1.php 文件代码

当不同空间内无得以一向调用此外元素,需要以命名空间的语法:

 

1. 约定一个前缀。

<?php
namespace Foo\Bar;
include 'file1.php';

const FOO = 2;
function foo() {}
class foo
{
    static function staticmethod() {}
}

/* 非限定名称 */
foo(); // 解析为 Foo\Bar\foo resolves to function Foo\Bar\foo
foo::staticmethod(); // 解析为类 Foo\Bar\foo的静态方法staticmethod。resolves to class Foo\Bar\foo, method staticmethod
echo FOO; // resolves to constant Foo\Bar\FOO

/* 限定名称 */
subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo,
                                  // 以及类的方法 staticmethod
echo subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO

/* 完全限定名称 */
\Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod
echo \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO
?>

file2.php 文件代码

<?php

//创建空间Blog
namespace Blog;
class Comment { }

//非限定名称,表示当前Blog空间
//这个调用将被解析成 Blog\Comment();
$blog_comment = new Comment();

//限定名称,表示相对于Blog空间
//这个调用将被解析成 Blog\Article\Comment();
$article_comment = new Article\Comment(); //类前面没有反斜杆\

//完全限定名称,表示绝对于Blog空间
//这个调用将被解析成 Blog\Comment();
$article_comment = new \Blog\Comment(); //类前面有反斜杆\

//完全限定名称,表示绝对于Blog空间
//这个调用将被解析成 Blog\Article\Comment();
$article_comment = new \Blog\Article\Comment(); //类前面有反斜杆\

//创建Blog的子空间Article
namespace Blog\Article;
class Comment { }

?>

条例:项目中出有限单模块:article和message
board,它们各自爆发一个甩卖用户留言的类Comment。之后我或许想只要增对富有用户留言的一对信总结效率,比如说我惦记取有留言的多寡。这时候调用它们Comment提供的章程是颇好的做法,不过又引入各自的Comment类显著是挺的,代码会出错,在其它一个地点还写任何一个Comment也会减低维护性。这这只可以重构类名,我预约了一个命名规则,在类名后面加上模块名,像这样:Article_Comment、MessageBoard_Comment

<?php
namespace Blog\Article;
class Comment { }

//创建一个BBS空间(我有打算开个论坛)
namespace BBS;

//导入一个命名空间
use Blog\Article;
//导入命名空间后可使用限定名称调用元素
$article_comment = new Article\Comment();

//为命名空间使用别名
use Blog\Article as Arte;
//使用别名代替空间名
$article_comment = new Arte\Comment();

//导入一个类
use Blog\Article\Comment;
//导入类后可使用非限定名称调用元素
$article_comment = new Comment();

//为类使用别名
use Blog\Article\Comment as Comt;
//使用别名代替空间名
$article_comment = new Comt();
?>

 

2. 应用命名空间。

<html></html>
<?php
namespace Article;
?>
//file1.php 文件代码

<?php

namespace Foo\Bar\subnamespace; 
const FOO = 1;
function foo() {}
class foo
{
    static function staticmethod() {}
}
?>

其都是透过应用use操作符来促成:

创建一个命名空间要用namespace要字,要留意的凡,当前剧本文件的率先独命名空间前边不克来任何代码如下是荒唐的:

号和导入 号和导入赏心悦目作是调动用命名空间元素的同一栽迅速模式。PHP并无帮忙导入函数或常量。

实质上可以将当下三种植名称类比为文件称(例如 comment.php)、相对路径名(例如
./article/comment.php)、相对路径名(例如 /blog/article/comment.php)。

【参考】PHP命名空间(Namespace)的下详解官方文档菜鸟教程

一经提一下,其实官空间的函数和常量不用加 \
也得健康调用(不晓得PHP为何要这么做),可是为了正确区分元素,依然提出调用函数的时增长
\

<?php
namespace Blog\Article;

//引入脚本文件
include './common_inc.php';

$filter_XSS = new FilterXSS(); //出现致命错误:找不到Blog\Article\FilterXSS类

$filter_XSS = new \FilterXSS(); //正确

?>

及时几上没再,是因上同样篇翻译尽充裕了,233333,其实并不曾刹车,明天关押了产啊PHP命名空间,如下:

可见到,名字变得死充裕,这表示从此采用Comment的时会写及再多之代码(至少字符多了)。并且,以后要一旦指向各种模块扩展又多之有结合功效,或者是相互调用,暴发重名的时节就是需重构名字。当然在品种开的早晚便注意到是题材,并规定命名规则就是能够生好之免此问题。

<?php
namespace Blog\Article;
class Comment { }

namespace BBS;
class Comment { }
Class Comt { }

//导入一个类
use Blog\Article\Comment;
$article_comment = new Comment(); //与当前空间的Comment发生冲突,程序产生致命错误

//为类使用别名
use Blog\Article\Comment as Comt;
$article_comment = new Comt(); //与当前空间的Comt发生冲突,程序产生致命错误
?>