2023年3月

一、问题描述

就是我们现在有一个字符串,我们需要实现一个功能,就是选择在字符串中字符的ASCII码最大的地方,插入字符串。

二、解决思路

我们直接循环,获取字符串中所有的字符,然后判断这个字符,并且获得这个字符所处的地址,在这个地方,我们进行插入。

三、代码实现

importjava.util.Scanner;public classstr_insert1 {public static voidmain(String[] args){
Scanner sc
=newScanner(System.in);
String str
=sc.next(),str2=sc.next();int j=0;for(int i=0;i<str.length();i++){if(str.charAt(i)>str.charAt(j)){
j
=i;
}
}
System.out.println(str.substring(
0, j+1)+str2+str.substring(j+1));
}
}

然后我们可能还会碰到别的需求。比方说我们需要在字符串中最长的连续出现的字符后插入。

然后这个问题实际上入手点就和上面一样,找到字符串中最长的连续出现的字符。那么这个应如何找呢?

思路就是我们选到一个字符,将这个字符和后面的数值相比较,如果相同,就记下相同的数目,然后和后面的字符数量进行比较。实现代码如下:

importjava.util.Scanner;public classstr_insert2 {public static inti,m;public static voidmain(String[] args){
Scanner sc
=newScanner(System.in);
String str
=sc.next(),str1=sc.next();int cnt=0;for(i=0;(i+1)<str.length();){int j=i+1;while(str.charAt(i)==str.charAt(j)&&j<str.length())
{
j
++;
}
if((j-i)>cnt){
cnt
=j-i;
m
=j;
}
i
=j;
}
System.out.println(str.substring(
0,m)+str1+str.substring(m));
}
}

上面有了字符串中最长的连续出现的字符的代码。然后我们可能会想去尝试一下如果我们是要把字符出现只出现一次,或是出现最少的后面再加呢。然后我们就去实现它把。

这个实现方式我们按照上面的方式实际上也是可以的,然后我们可以试着另外的一种方式。

只出现一次的情况:

importjava.lang.reflect.Array;importjava.util.Collections;importjava.util.Scanner;public classstr_insert3 {public static voidmain(String[] args){
Scanner sc
=newScanner(System.in);
String str
=sc.next(),str1=sc.next();int[] arr=new int[26];for(int i=0;i<str.length();i++){int num=str.charAt(i)-'a';
arr[num]
++;
}
for(int i=0;i<str.length();i++){if(arr[i]==1)
{
System.out.print(str.substring(
0, i+1)+str1+str.substring(i+1));break;
}
}
}
}

如果是出现最少的情况,就在我们出现最多的情况下修改就行了,这里就不再赘述了。

一、对标题的解释:

什么叫做层叠?什么又叫做继承?
就是在我们实际写项目的时候,我们会常常会写一些样式,这些样式会被应用于我们的元素中。但是如果我们的项目比较大的话,或者我们一个元素在不同的位置想要使用不同的样式,这个时候,我们会发现我们写的样式显示出来的样子不是我们想要的。这个时候,就涉及到层叠与继承了。

首先:层叠是一个定义了如何合并来自多个源的属性值的算法。然后浏览器根据优先级来决定当多个规则有不同选择器对应相同的元素的时候需要使用哪个规则。将层叠与优先级结合在一起,就可以比较好理解。如果我们对一个元素写了多个样式,谁的优先级高那么它就应用那个样式了。与此同时,我们可能也会想到另外一个点,就是如果我们整个页面中的字体都一样的,然后里面运用的选择器数量有很多,那么我们并不想在每个选择器中都写相同的字体样式,这个时候,就引出了我们i第二个概念,就是继承。有了继承,我们可以不写那么多的字体样式。

二、它们三个是如何工作的呢?
首先,我们得记得元素的优先级中id选择器>类选择器>元素选择器。如果我们选择器都是一样的情况下,后面的优先级会高于前面。然后我们继承的话,我们子元素会继承父元素的样式(除了width margin padding border)当我们想在这个元素下使用新的元素样式,那么我们可以使用id选择器,重新写一个样式。

然后我们在继承中也可以使用如下的元素,获得不同的继承样式:
inherit ——
设置该属性会使子元素属性和父元素相同。实际上,就是“开启继承”。

initial ——
将应用于选定元素的属性值设置为该属性的
初始值

revert
(en-US)
——

将应用于选定元素的属性值重置为浏览器的默认样式,而不是应用于该属性的默认值。在许多情况下,此值的作用类似于
unset

revert-layer
(en-US)
——

将应用于选定元素的属性值重置为在上一个
层叠层
中建立的值。

unset ——
将属性重置为自然值,也就是如果属性是自然继承那么就是
inherit
,否则和
initial
一样

以上内容来源:

https://developer.mozilla.org/zh-CN/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance#%E7%90%86%E8%A7%A3%E7%BB%A7%E6%89%BF

案例:

<!DOCTYPE html>
<html>
    <head>
        <title>test1</title>
        <styletype="text/css">body{color:green;
}.my-class-1 a{color:inherit;
}.my-class-2 a{color:initial;
}.my-class-3 a{color:unset;
}
        </style>
    </head>
    <body>
        <ul>
            <li>Default <ahref="#">link</a> color</li>
            <liclass="my-class-1">Inherit the <ahref="#">link</a> color</li>
            <liclass="my-class-2">Reset the <ahref="#">link</a> color</li>
            <liclass="my-class-3">Unset the <ahref="#">link</a> color</li>
        </ul>
    </body>
</html>

输出结果:

1、什么是伪类?

首先伪类是选择器的一种,它用于选择处于特定状态的元素。

2、伪类的表现状态时什么样子的?

伪类就是开头为冒号的关键字。

例如::last-child

3、常见的伪类有哪些?

:last-child
——它用于选择一组兄弟元素中的最后一个元素。

:first-child
——它用于选择在一个页面中的第一个子元素,然后在这个子元素上面进行装饰,这使得我们将不再需要编辑 HTML

:only-child
——它用于匹配没有任何兄弟元素的元素。

:invalid
——表示任意内容未通过验证的<input>或其他<form> 元素

然后也有一些别的伪类,这些伪类只有当用户以某种方式和文档交互的时候应用。它被称为用户行为伪类或者动态伪类。

这些伪类包括:

:hover
——只会在用户将鼠标挪到上面的时候激活。

:focus
——在会在用户使用键盘控制,选定元素的时候激活。

4、能给出上面说到的元素的案例方便理解吗?

——:last-child 如下:

<!DOCTYPE html>
<html>
    <head>
        <title>test1</title>
        <styletype="text/css">.uu{font-size:large;font-style:italic;color:greenyellow;
            }.mm:last-child{color:blue;font-size:larger;
            }.kk{color:greenyellow;
            }
        </style>
    </head>
    <body>
        <pclass="uu">curriculum</p>
        <ul>
            <liclass="mm">math</li>
            <liclass="uu">chinese</li>
            <liclass="mm">english</li>
        </ul>
    </body>
</html>

输出

这个案例比较典型,就是我们的last-child他会自动寻找到相同类选择器名(其他id或元素选择器一样参考),然后找到最后面的那个选择器,然后在上面应用样式。当然,如果我们将上面第一个<li>标签的class值赋为kk,结果还是最后一个元素会应用mm样式,(排行第一个实际上也是最后一个)

——:first-child 案例如下:

<!DOCTYPE html>
<html>
    <head>
        <title>test1</title>
        <styletype="text/css">article p:first-child{font-size:large;color:aqua;
            }p{color:red;
            }article p:last-child{color:blueviolet;
            }
        </style>
    </head>
    <body>
        <article>
            <p>the day is sunny</p>
            <p>tom and henry run to school because they were sleep late last night.although the weather is so 
great.they did not have time to enjoying.
</p> </article> <p>although they try themselve to run faster.they still late,and penalty station for it.</p> </body> </html>

输出样式:

上面的例子中,使用了first-chid和last-child。

从案例输出的结果,我们会发现一个有意思的现象,就是我们那个first-child,last-child样式全写在article的<p>元素内,然后样式也就只用在这里面。

这可以用于我们每次将文章第一段加粗或其他样式情况下。

——:only-child 案例如下:

<!DOCTYPE html>
<html>
    <head>
        <title>test1</title>
        <styletype="text/css">.hh :only-child{color:red;
            }
        </style>
    </head>
    <body>
            <main>
                <divclass="hh">
                  <i>I am a lonely only child.</i>
                </div>
              
                <divclass="hh">
                  <i>I have siblings.</i></br>
                  <b>So do I!</b></br>
                  <span>I also have siblings, <span>but this is an only child.</span></span>
                </div>
            </main>
</html>

显示样式:

上面的例子中,就把无兄弟的样式表示出来了。

——:invalid 案例如下

<!DOCTYPE html>
<html>
    <head>
        <title>test1</title>
        <styletype="text/css">input:invalid{background-color:#ffdddd;
}form:invalid{border:5px solid #ffdddd;
}input:valid{background-color:#ddffdd;
}form:valid{border:5px solid #ddffdd;
}input:required{border-color:#800000;border-width:3px;
}input:required:invalid{border-color:#C00000;
}

        </style>
    </head>
    <body>
        <form>
            <labelfor="url_input">Enter a URL:</label>
            <inputtype="url"id="url_input" />
            <br/>
            <br/>
            <labelfor="email_input">Enter an email address:</label>
            <inputtype="email"id="email_input"required/>
        </form>
    </body>
</html>

——:focus的案例:

<!DOCTYPE html>
<html>
<head>
<title>test1</title>
<style type="text/css">
.red-input:focus {
background-color: yellowgreen;
color: red;
}


.blue-input:focus{
background-color: pink;
color: blue;
}
</style>
</head>
<body>
<form>
<input class="red-input" value="I'll be red when focused."><br>
<input class="blue-input" value="I'll be blue when focused"
</form>
</body>
</html>

——:hover案例:

为了确保生效,:hover 规则需要放在 :link 和 :visited 规则之后,但是在:active 规则之前,按照 LVHA 的顺序声明 :link-:visited-:hover-:active。

<!DOCTYPE html>
<html>
    <head>
        <title>test1</title>
        <styletype="text/css">div.menu-bar ul ul{display:none;
        }div.menu-bar li:hover>ul{display:block;
        }
        </style>
    </head>
    <body>
        <divclass="menu-bar">
            <ul>
              <li>
                <ahref="#">Menu</a>
                <ul>
                  <li>
                    <ahref="#">Link</a>
                  </li>
                  <li>
                    <aclass="menu-nav"href="#">Submenu</a>
                    <ul>
                      <li>
                        <aclass="menu-nav"href="#">Submenu</a>
                        <ul>
                          <li><ahref="#">Link</a></li>
                          <li><ahref="#">Link</a></li>
                          <li><ahref="#">Link</a></li>
                          <li><ahref="#">Link</a></li>
                        </ul>
                      </li>
                      <li><ahref="#">Link</a></li>
                    </ul>
                  </li>
                </ul>
              </li>
            </ul>
          </div>          
    </body>
</html>

输出样式:

1、什么叫做伪元素?

我们可以回忆一下我们之前使用的伪类的样子,较之于伪类,伪元素是像往标记文本中加入全新的 HTML 元素一样,而不是向现有的元素上应用类。也就是说我们直接在文本上使用span标签还是作用于span 标签。

2、伪类的表现形式是什么?

::伪类名

3、介绍一下常用的伪元素名字及其样式。

——::first-line  这个可以选择我们页面中的第一行进行更改样式。

案例如下:

<!DOCTYPE html>
<html>
    <head>
        <title>test1</title>
        <styletype="text/css">p::first-line{color:red;

          }
        </style>
    </head>
    <body>
        <p>SHANGHAI, China (AP) China extended its crackdown on dissent into cyberspace for the first time Wednesday, sentencing a software entrepreneur to two years in prison for giving e-mail addresses to dissidents abroad.
Lin Hai, 30, was convicted of subversion in a case that highlighted China's conflicting efforts to promote Internet use for business and education at the same time it is stamping out political activity.
Subversion is among China's most serious crimes and is normally used against political dissidents.
The conviction of Mr. Lin is no more than a brutal act of suppression of dissent, and China will certainly be severely criticized,'' said Albert Ho, secretary-general of the Hong Kong Alliance for the Promotion of the Democratic Movement in China.
</p> </body> </html>

结果:

——::before和::after 案例

<!DOCTYPE html>
<html>
    <head>
        <title>test1</title>
        <styletype="text/css">p::first-line{color:red;
          }p::before{content:"balabala";color:greenyellow;
          }p::after{content:"henry";color:blue;
          }
        </style>
    </head>
    <body>
        <p>SHANGHAI, China (AP) China extended its crackdown on dissent into cyberspace for the first time Wednesday, sentencing a software entrepreneur to two years in prison for giving e-mail addresses to dissidents abroad.
Lin Hai, 30, was convicted of subversion in a case that highlighted China's conflicting efforts to promote Internet use for business and education at the same time it is stamping out political activity.
Subversion is among China's most serious crimes and is normally used against political dissidents.
The conviction of Mr. Lin is no more than a brutal act of suppression of dissent, and China will certainly be severely criticized,'' said Albert Ho, secretary-general of the Hong Kong Alliance for the Promotion of the Democratic Movement in China.
</p> </body> </html>

显示结果:

也就是说实际上这些伪元素都是可以加样式的,就是我们通常情况下最后面一下仅仅是加一些指向性的图标,加文字意义不是很大。

4、那么使用::after如何加图标呢?

案例:

p::after{
content: "";
display: block;
width: 100px;
height:100px;
background-image: url("html_test/img/zhaojinmai.jpg");
border: 1px solid black;
}

输出结果:

用C#编写ActiveX控件(一)


前些日子做一个Web项目,必须自己编写一个ActiveX控件。如今的ActiveX控件大多是使用VB/C++来开发的,而我对他们并不熟悉,因此考虑使用熟悉的C#编写ActiveX控件。

首先,建立一个WinForm控件项目HelloWorld,并拖入一个Label控件,文字设为HelloWorld,如图:

UserControl1.cs内容如下:


using
System;

using
System.Collections;

using
System.ComponentModel;

using
System.Drawing;

using
System.Data;

using
System.Windows.Forms;


namespace
HelloWorld



{



///

<summary>


///
UserControl1 的摘要说明。

///

</summary>



public

class
Demo : System.Windows.Forms.UserControl



{

private
System.Windows.Forms.Label label1;



///

<summary>


///
必需的设计器变量。

///

</summary>



private
System.ComponentModel.Container components
=

null
;


public
Demo()



{

//
该调用是 Windows.Forms 窗体设计器所必需的。


InitializeComponent();


//
TODO: 在 InitComponent 调用后添加任何初始化




}






///

<summary>


///
清理所有正在使用的资源。

///

</summary>



protected

override

void
Dispose(
bool
disposing )



{

if
( disposing )



{

if
( components
!=

null
)

components.Dispose();

}



base
.Dispose( disposing );

}





组件设计器生成的代码



}



}



此时编译项目,可以生成HelloWorld.dll。将此dll拷贝到IIS的虚拟根目录下,然后建立一个helloworld.htm的文件,html代码如下:


<
body
bgcolor
='#223344'>

<object id
="helloworld"
classid
=’http://localhost/HelloWorld.dll#HelloWorld.Demo’
Width
="184"
Height
="96"
VIEWASTEXT
>

</
object
>


</
body
>

在IE地址栏中输入以下地址:
http://localhost/helloworld.htm
,出现界面:

如图,控件已经成功在页面上显示了。OK,我们已经完成了第一步。

但是问题到这里还没有解决。不相信?你可以试试在另外一台机器上测试,注意需要修改对应的html代码和URL地址。你可以看到这个在原来显示控件的地方是一个红色的叉,或者还会弹出一个对话框,表示这个控件没有任何权限。出现这个结果是微软的默认设置造成的,作者必须在控件所在的控件的 AssemblyInfo.cs/vb 中执行一个安全声明,声明这个控件必须使用赋予的权限,才可以显示出界面。我们在AssemblyInfo.cs中引用System.Security命名空间,并添加一句:


[assembly : AllowPartiallyTrustedCallers()]

现在重新编译,并且替换以前的dll,界面又可以显示出来了。

需要提醒的是,到现在为止,我们编写的还不是真正的ActiveX控件。这个控件到现在为止,还只是能够实现自身的显示,并且不能实现更多的功能,比如实现与脚本的交互或者操作客户端的注册表或者磁盘。这是由于.Net Framework的安全模型所限制的。如果我们希望这个控件突破.Net Framework安全模型的限制,实现与脚本的交互或者操作客户端的注册表或者磁盘的话,必须要让它成为真正的ActiveX控件。下面,我们把刚才的控件变成真正的ActiveX控件。

首先使用 工具—〉创建GUID 生成一个GUID,并修改UserControl1.cs文件。首先增加引用System.Runtime.InteropServices命名空间,并在Demo前面加入一条语句:

注意Guid中的字符串,就是你生成的Guid字符串。它是你所生成的ActiveX控件的唯一标识符。然后修改项目属性,如图:

注意面板中的最后一项,我们唯一需要修改的是将其值改为True。

重新编译。我们使用 工具—〉OLE/COM对象查看器 查看,如图:

可以看到,我们写的HelloWorld.Demo已经被正确识别为COM组件。现在,我们已经可以像使用其它ActiveX控件一样在网页中显示了。在HelloWorld.Demo点击鼠标右键,如图:

选择Copy HTML <object> Tag to Clipboard,可以将代码拷入剪贴板。

现在,我们改写helloworld.htm,html代码如下:


<
body
bgcolor
='#223344'>

<object id
="helloworld"


classid

="clsid:9551B223-6188-4387-B293-C7D9D8173E3A"
Width
="184"
Height
="96"
>


</
object
>


</
body
>

使用IE查看,我们的控件又可以在网页中显示了。不过,这个时候它已经不再是以前的.net WinForm控件了,而是货真价实的ActiveX控件了。

不过,编写ActiveX控件的任务还没有完成。我们还没有实现脚本互动或者读写I/O,也没有实现ActiveX控件的自动分发。在下一篇Blog中,我会完成ActiveX控件的编写。

PS:这是我在博客园上的第一个Post,希望得到大家的支持。