视觉设计——王晓豪
数据结构与算法
走迷宫(广度优先算法)
题目描述:
Description
有一个N*M的格子迷宫,1代表该格子为墙,不能通过,0代表可以通过,另外,在迷宫中
有一些传送门,走到传送门的入口即会自动被传送到传送门的出口(一次传送算1步)。人在迷宫中可以尝试
上下左右四个方向移动。现在给定一个迷宫和所有传送门的出入口,以及起点和终点,
问最少多少步可以走出迷宫。如果不能走出迷宫输出“die”。
输入格式:
该程序为多CASE,第1行为CASE的数量
每一个CASE,第1行为两个数N(行)和M(列)
然后N行每行M个数
之后是一个数W,为传送门的数量
之后每行一个传送门的入口坐标c1(行),r1(列)和出口坐标c2,r2
之后是起点坐标和终点坐标sc(行) sr(列) ec(行) er(列)
做题思路:
建立多个二维数组,分别保存地图、出入口、传送门出入口,并需要设置一个标志变量确定是否到达终点
可以利用广度优先遍历模拟走迷宫的状态,那就需要用一个结构体保存当前位置在地图中的坐标,离起点所走的步数。
在走迷宫的过程中,对为“1”的格子,不对其进行遍历;对为传送门入口坐标的格子,需要将目前状态调整为传送门出口位置的坐标,并使步数加1;对为终点的格子,置到达终点的标志变量,并结束该case
需要注意的要点:
1.为多case
2.对走过的格子要设为“1”
3.起点和终点重合的情况
对广度优先遍历算法的理解
走迷宫用的广度优先遍历,用例子引入,可以理解为水的波纹,像周围荡开,但是不太能体现节点与节点间的关系,所以在这个基础上,我更想把其比作蜘蛛网,当有物体撞击蜘蛛网的时候,在物体撞击的位置(初始节点),这个撞击的力沿着与初始节点有连接的蛛丝传递到下一个结点,并重复此步骤,而且不会返回来。也就是在广度遍历时,会对节点周围相关联且未遍历的点先进行遍历,然后重复此步骤直至所有节点都被遍历。由于与一个节点相关联的节点有多个且不能同时进行遍历,我们可以用队列模拟这种“同时”的遍历。具体例子:
1.对起点进行遍历,发现周围四个方向都要进行遍历
2.将四个方向的状态压入队列
3.遍历起点
4.起点遍历结束,遍历起点的第一个方向上的点,并将与其相关联的点压入队列为,设第一个方向相关联的点组成的集合为 T1,第二个为T2,如此类推。
5.当前队列为:起点第二个方向,起点第三个方向,起点第四个方向,T1
6.循环4步骤直到队列状态为:
起点第四个方向,T1,T2,T3
7.当起点第四个方向被遍历并从队列中弹出,此时,队列完成了对起点四个方向“同时”遍历的模拟。
代码
#include <iostream>
#include <cstdio>
#include <malloc.h>
#include <queue>
using namespace std;
int d[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; //四个方向
char s[110][110]; //地图大小
int sr,sc; //初始地点
int er,ec; //目标地点
int In[110][2],Out[110][2]; //传送门入口和出口坐标
typedef struct{
int row;
int col; //位置
int step; //步数
}node; //每次走的记录
int main()
{
int k;
scanf("%d",&k); //多case
while(k--)
{
int m,n,flag=0,jump=0;
scanf("%d%d",&m,&n); //行列数
int i;
for(i=0;i<m;i++)
{
scanf("%s",s[i]); //每行迷宫
}
int num;
scanf("%d",&num); //传送门数量
for(i=0;i<num;i++)
{
scanf("%d%d%d%d",&In[i][0],&In[i][1],&Out[i][0],&Out[i][1]); //传送门入口坐标和出口坐标
}
scanf("%d%d%d%d",&sr,&sc,&er,&ec); //起点和终点坐标
node first;
first.row=sr;
first.col=sc;
first.step=0; //设置起点node
queue <node> Q;
Q.push(first);
while(!Q.empty())
{
node cur;
cur=Q.front();
Q.pop();
jump=0;
if(cur.row==er&&cur.col==ec) //是否是终点
{
printf("%d\n",cur.step);
flag=1; //已到达终点标志
break;
}
for(i=0;i<num;i++) //检测是不是传送门位置
{
if(cur.row==In[i][0]&&cur.col==In[i][1])
{
node newnode;
newnode.row=Out[i][0];
newnode.col=Out[i][1]; //传送后的坐标
newnode.step=cur.step+1; //步数+1
Q.push(newnode); //推入该坐标
jump=1; //传送门使用标志
break;
}
}
if(!jump) //未使用传送门
{
for(i=0;i<4;i++) //四个方向
{
int k=0;
node now;
now.row=cur.row+d[i][0];
now.col=cur.col+d[i][1];
now.step=cur.step+1; //步数+1
if(now.row<0||now.row>=m||now.col<0||now.col>=n) continue; //边界检测
if(s[now.row][now.col]=='0')
{
s[now.row][now.col]='1'; //走过的标志位
Q.push(now);
}
}
}
}//while
if(!flag) //flag未设置成终点标志,die
{
printf("die\n");
}
}//while
}
HTML5
meta
编码问题
1.将源文件保存为UTF-8的编码格式
2.在HTML文档中指定相应的编码
3.声明:<meta charset="UTF-8">
<!DOCTYPE html>
<html>
<head>
<title> 标题 </title>
<meta charset="UTF-8">
</head>
<body>
<p>热火总冠军</p>
</body>
</html>
HTML自适应
<meta name="viewport" content="width=device-width,initial-scale=1.0">
搜索引擎优化(网页内容描述,关键词)
<!DOCTYPE.html>
<html>
<head>
<title>第一个程序</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<meta name="keywords" content="王晓豪的网页">
<meta name="description" content="《蝙蝠侠:漫长的万圣夜》">
<meta name="author" content="扎克施耐德">
</head>
<body>
<h1>Hello World</h1>
<p>我是王晓豪</p>
</html>
style
<html>
<head>
<meta charset="UTF-8">
<title>鱼C-零基础入门学习Web(Html5+Css3)</title>
<style type="text/css">
h1 {color: red}
p {color: blue}
</style>
</head>
<body>
<h1>header 1</h1>
<p>A paragraph.</p>
</body>
</html>
| <!DOCTYPE html> |
| | <html> |
| | <head> |
| | <title>一只特立独行的猪</title> |
| | <meta charset="utf-8"> |
| | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| | <meta name="keywords" content="小甲鱼,Web开发,HTML5,CSS3,Web编程教学"> |
| | <meta name="description" content="《零基础入门学习Web开发》案例演示"> |
| | <meta name="author" content="小甲鱼"> |
| | |
| | <style> |
| | body { |
| | background-image: url("../img/bc.png") |
| | } |
| | h1 { |
| | text-align: center; |
| | color: white; |
| | } |
| | h2 { |
| | margin-left: 60%; |
| | color: white; |
| | } |
| | p { |
| | text-indent: 32px; |
| | font-size: 16px; |
| | line-height: 32px; |
| | color: white; |
| | } |
| | img { |
| | position: absolute; |
| | left: 50%; |
| | margin-left: -181px; |
| | } |
| | </style> |
| | |
| | <style media="print"> |
| | h1 { |
| | color: black; |
| | } |
| | h2 { |
| | color: black; |
| | } |
| | p { |
| | color: black; |
| | } |
| | </style> |
| | |
| | <style media="screen and (min-width:512px) and (max-width:1024px)"> |
| | body { |
| | background-image: url("../img/bc2.png"); |
| | } |
| | </style> |
| | </head> |
| | <body> |
| | <h1>一只特立独行的猪</h1> |
| | <h2>王小波</h2> |
| | <p>插队的时候,我喂过猪、也放过牛。假如没有人来管,这两种动物也完全知道该怎样生活。它们会自由自在地闲逛,饥则食渴则饮,春天来临时还要谈谈爱情;这样一来,它们的生活层次很低,完全乏善可陈。人来了以后,给它们的生活做出了安排:每一头牛和每一口猪的生活都有了主题。就它们中的大多数而言,这种生活主题是很悲惨的:前者的主题是干活,后者的主题是长肉。我不认为这有什么可抱怨的,因为我当时的生活也不见得丰富了多少,除了八个样板戏,也没有什么消遣。有极少数的猪和牛,它们的生活另有安排。以猪为例,种猪和母猪除了吃,还有别的事可干。就我所见,它们对这些安排也不大喜欢。种猪的任务是交配,换言之,我们的政策准许它当个花花公子。但是疲惫的种猪往往摆出一种肉猪(肉猪是阉过的)才有的正人君子架势,死活不肯跳到母猪背上去。母猪的任务是生崽儿,但有些母猪却要把猪崽儿吃掉。总的来说,人的安排使猪痛苦不堪。但它们还是接受了:猪总是猪啊。</p> |
| | <p>对生活做种种设置是人特有的品性。不光是设置动物,也设置自己。我们知道,在古希腊有个斯巴达,那里的生活被设置得了无生趣,其目的就是要使男人成为亡命战士,使女人成为生育机器,前者像些斗鸡,后者像些母猪。这两类动物是很特别的,但我以为,它们肯定不喜欢自己的生活。但不喜欢又能怎么样?人也好,动物也罢,都很难改变自己的命运。</p> |
| | <p>以下谈到的一只猪有些与众不同。我喂猪时,它已经有四五岁了,从名分上说,它是肉猪,但长得又黑又瘦,两眼炯炯有光。这家伙像山羊一样敏捷,一米高的猪栏一跳就过;它还能跳上猪圈的房顶,这一点又像是猫——所以它总是到处游逛,根本就不在圈里呆着。所有喂过猪的知青都把它当宠儿来对待,它也是我的宠儿——因为它只对知青好,容许他们走到三米之内,要是别的人,它早就跑了。它是公的,原本该劁掉。不过你去试试看,哪怕你把劁猪刀藏在身后,它也能嗅出来,朝你瞪大眼睛,噢噢地吼起来。我总是用细米糠熬的粥喂它,等它吃够了以后,才把糠对到野草里喂别的猪。其他猪看了嫉妒,一起嚷起来。这时候整个猪场一片鬼哭狼嚎,但我和它都不在乎。吃饱了以后,它就跳上房顶去晒太阳,或者模仿各种声音。它会学汽车响、拖拉机响,学得都很像;有时整天不见踪影,我估计它到附近的村寨里找母猪去了。我们这里也有母猪,都关在圈里,被过度的生育搞得走了形,又脏又臭,它对它们不感兴趣;村寨里的母猪好看一些。它有很多精彩的事迹,但我喂猪的时间短,知道得有限,索性就不写了。总而言之,所有喂过猪的知青都喜欢它,喜欢它特立独行的派头儿,还说它活得潇洒。但老乡们就不这么浪漫,他们说,这猪不正经。领导则痛恨它,这一点以后还要谈到。我对它则不止是喜欢——我尊敬它,常常不顾自己虚长十几岁这一现实,把它叫做“猪兄”。如前所述,这位猪兄会模仿各种声音。我想它也学过人说话,但没有学会——假如学会了,我们就可以做倾心之谈。但这不能怪它。人和猪的音色差得太远了。</p> |
| | <p>后来,猪兄学会了汽笛叫,这个本领给它招来了麻烦。我们那里有座糖厂,中午要鸣一次汽笛,让工人换班。我们队下地干活时,听见这次汽笛响就收工回来。我的猪兄每天上午十点钟总要跳到房上学汽笛,地里的人听见它叫就回来——这可比糖厂鸣笛早了一个半小时。坦白地说,这不能全怪猪兄,它毕竟不是锅炉,叫起来和汽笛还有些区别,但老乡们却硬说听不出来。领导上因此开了一个会,把它定成了破坏春耕的坏分子,要对它采取专政手段——会议的精神我已经知道了,但我不为它担忧——因为假如专政是指绳索和杀猪刀的话,那是一点门都没有的。以前的领导也不是没试过,一百人也治不住它。狗也没用:猪兄跑起来像颗鱼雷,能把狗撞出一丈开外。谁知这回是动了真格的,指导员带了二十几个人,手拿五四式手枪;副指导员带了十几人,手持看青的火枪,分两路在猪场外的空地上兜捕它。这就使我陷入了内心的矛盾:按我和它的交情,我该舞起两把杀猪刀冲出去,和它并肩战斗,但我又觉得这样做太过惊世骇俗——它毕竟是只猪啊;还有一个理由,我不敢对抗领导,我怀疑这才是问题之所在。总之,我在一边看着。猪兄的镇定使我佩服之极:它很冷静地躲在手枪和火枪的连线之内,任凭人喊狗咬,不离那条线。这样,拿手枪的人开火就会把拿火枪的打死,反之亦然;两头同时开火,两头都会被打死。至于它,因为目标小,多半没事。就这样连兜了几个圈子,它找到了一个空子,一头撞出去了;跑得潇洒之极。以后我在甘蔗地里还见过它一次,它长出了獠牙,还认识我,但已不容我走近了。这种冷淡使我痛心,但我也赞成它对心怀叵测的人保持距离。</p> |
| | <p>我已经四十岁了,除了这只猪,还没见过谁敢于如此无视对生活的设置。相反,我倒见过很多想要设置别人生活的人,还有对被设置的生活安之若素的人。因为这个原故,我一直怀念这只特立独行的猪。</p> |
| | <img src="[../img/pig.png](https://ilovefishc.com/html5/html5/lesson4/img/pig.png)"> |
| | </body> |
| | </html> |
思维导图
一些问题
1. 请问 <!DOCTYPE html> 标签是干啥用的呢?
答:<!DOCTYPE html> 标签可以告诉浏览器你的 HTML 文档是基于哪一个标准进行开发的(在这里,<!DOCTYPE html> 表示该文档是基于 HTML5 的标准进行开发)。通过使用 DOCTYPE,浏览器就能够更准确地选择用什么方式来解释和展现你的网页。另外要记住,DOCTYPE 定义需要放在 HTML 文档的最开头位置!
2. head 元素中必须要有的元素是?
答:head 元素中必须要有一个 title 元素。
3. 什么是UTF-8?
答:UTF-8 是一个字符编码,能够用最少的字节数表示所有 Unicode 字符。
Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
所以,在网络全球化的现在,UTF-8 已经被推选为新的统一标准。
4. meta 元素永远只能位于哪个元素的内部?
答:head 元素。
5. 操作系统是使用反斜杠(\)做分隔符,在 HTML 中,我们可以使用它来代替斜杠( /)吗?
答:不能!
在 HTML 中,路径只能使用斜杠(/)作为分隔符。
6.请按下面要求编写一个网页:
- 实现网页尺寸自适应
- 为该网页添加关键词,内容描述,作者等信息
- 实现一个带超链接的图片(即点击图片可跳转到新页面中)
<!DOCTYPE html>
<html>
<head>
<title>点击图片可以跳转</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="keywords" content="王晓豪,Web开发,HTML5,CSS3,Web编程教学">
<meta name="description" content="《零基础入门学习Web开发》课后作业">
<meta name="author" content="王晓豪">
</head>
<body>
<p>点击下图即可跳转到鱼C论坛</p>
<a href="http://bbs.fishc.com" target="_blank"><img src="11233.jpg" alt="鱼C论坛"></a>
</body>
</html>
链接外部样式
将css样式表单独抽取出来
1. 使用 link 链接外部样式表
除了可以在 style 元素中添加,我们还可以将 css 样式表保存为外部文件,然后使用 link 元素将其链接进来。如果你的样式表内容比较多,建议是存放为单独的文件。
link 元素也是支持 media 属性的,该属性指定被链接的资源将针对哪一种媒体或者设备进行优化。
link 元素的用法详解
<link rel="stylesheet" type="text/css" href="styles.css">
链接网站图标
link 最常见的另一个用法就是链接网站图标 —— favicon
各种浏览器处理图标的方式有所不同,常见的做法是将其显示在相应的标签页左侧的位置。
关联网站图标,只需要将 rel 属性设置为 "icon",然后设置 type 属性为 "image/x-icon",最后在 href 属性中指定图标的位置即可:
<link rel="icon" href="http://www.fishc.com/favicon.ico" type="image/x-icon">
思维导图
C语言
基础 typedef
typedef 是C语言最重要的关键字之一
举例1
#include<stdio.h>
typedef int integer;
int main(void)
{
integer a;
int b;
a = 520;
b = a;
printf("a = %d\n", a);
printf("b = d%\n", b);
printf("size of a = %d\n", sizeof(a));
return 0;
}
运行结果
a = 520
b = d
size of a = 4
定义指针
举例2
#include<stdio.h>
typedef int INTEGER;
typedef int *PTRINT;
int main(void)
{
INTEGER a = 520;
PTRINT b,c;
b = &a;
c = b;
printf("addr of a = %p\n",c);
return 0;
}
运行结果
addr of a = 000000000062FE0C
普通定义结构体
代码
#include<stdio.h>
#include<stdlib.h>
struct Date
{
int year;
int month;
int day;
};
int main(void)
{
struct Date *date;
date = (struct Date *)malloc(sizeof(struct Date));
if(date == NULL)
{
printf("内存分配失败!\n");
exit(1);
}
date->year = 1999;
date->month = 11;
date->day = 12;
printf("%d-%d-%d\n", date->year, date->month, date->day);
return 0;
}
运行结果
1999-11-12
使用 typedef 定义结构体
代码
#include<stdio.h>
#include<stdlib.h>
typedef struct Date
{
int year;
int month;
int day;
} DATE;
int main(void)
{
struct Date *date;
date = (DATE *)malloc(sizeof(DATE));
if(date == NULL)
{
printf("内存分配失败!\n");
exit(1);
}
date->year = 1999;
date->month = 11;
date->day = 12;
printf("%d-%d-%d\n", date->year, date->month, date->day);
return 0;
}
运行结果
1999-11-12
也可以顺便定义一个结构体指针
#include<stdlib.h>
typedef struct Date
{
int year;
int month;
int day;
} DATE, *PDATE;
int main(void)
{
struct Date *date;
date = (PDATE)malloc(sizeof(DATE));
if(date == NULL)
{
printf("内存分配失败!\n");
exit(1);
}
date->year = 1999;
date->month = 11;
date->day = 12;
printf("%d-%d-%d\n", date->year, date->month, date->day);
return 0;
}
进阶typedef
在编程中使用 typedef 的目的一般有两个:
1.一个是给变量起一个容易记住且意义明确的别名;
2.另一个是简化一些比较复杂的类型声明。
typedef 定义数组指针
代码
#include<stdio.h>
typedef int (*PTR_TO_ARRAY)[3];
int main(void)
{
int array[3] = {1,2,3};
PTR_TO_ARRAY ptr_to_array = &array;
int i;
for(i=0;i<3;i++)
{
printf("%d\n",(*ptr_to_array)[i]);
}
return 0;
}
运行结果
1
2
3
typedef 函数数组指针
代码
#include<stdio.h>
typedef int (*PTR_TO_FUN)(void);
int fun(void)
{
return 520;
}
int main(void)
{
PTR_TO_FUN ptr_to_fun = &fun;
printf("%d\n", (*ptr_to_fun)());
return 0;
}
结果
520
共用体
各个成员共用一个地址
代码
#include<stdio.h>
#include<string.h>
union Test
{
int i;
double pi;
char str[6];
};
int main(void)
{
union Test test;
test.i = 877;
test.pi = 3.14;
strcpy(test.str,"WangXiaohao");
printf("addr of test.i: %p\n",&test.i);
printf("addr of test.pi: %p\n",&test.pi);
printf("addr of test.str: %p\n",&test.str);
return 0;
}
运行结果
addr of test.i: 000000000062FE10
addr of test.pi: 000000000062FE10
addr of test.str: 000000000062FE10
定义共用体类型变量
初始化共用体
time 函数文档
函数摘要:
time 函数用于返回从标准计时点到当前时间的秒数,即从 1970 年 1 月 1 日的 UTC 时间 0 时 0 分 0 秒算起到现在所经过的秒数。
函数原型:
#include <time.h>
...
time_t time(time_t *t);
参数解析:
参数 含义
time_t //1. 一个指向 time_t 类型变量的指针,用于存放获得的结果 2. 可以将该参数指定为 NULL,通过函数的返回值获得结果
返回值:
如果函数调用成功,返回值是标准计时点到当前时间所经过的秒数;
如果函数调用失败,返回值是 -1,并设置 errno。
演示
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t seconds;
// 下面语句也可以写成:time(&seconds);
seconds = time(NULL);
printf("1970年1月1日零点到现在经过了%ld个小时!\n", seconds / 3600);
return 0;
}
localtime -- 获取当前的本地时间和日期
函数摘要:
localtime 函数用于获取当前的本地时间和日期。
其实 localtime 函数是将一个 time_t 类型的值转换成具体的本地时间和日期,所以需要先使用 time 函数来返回表示当前时间的 time_t。
函数原型:
#include <time.h>
...
struct tm *gmtime(const time_t *timep);
参数解析:
| 参数 | 含义 |
| timep | 1. 指向 time_t 类型的指针 2. 请使用 time 函数获取该指针需要指向的值 |
返回值:
返回值是一个指向 tm 结构体的指针。
tm 结构体包含了当地时间和日期:
struct tm
{
int tm_sec; /* 秒,范围为 0~59,60 的话表示闰秒 */
int tm_min; /* 分,范围是 0~59 */
int tm_hour; /* 时,范围是 0~23 */
int tm_mday; /* 一个月中的第几天,范围是 1~31 */
int tm_mon; /* 一年中的第几个月,范围是 0~11 */
int tm_year; /* 自 1900 年往后的第几年 */
int tm_wday; /* 星期几,自星期天开始计算,范围是 0~6 */
int tm_yday; /* 一年中的第几天,范围是 0~365 */
int tm_isdst; /* 指定日光节约时间是否生效,正数表示生效,0 表示不生效,负数表示该信息不可用 */
};
演示
#include <stdio.h>
#include <time.h>
#define SUN 0
#define MON 1
#define TUE 2
#define WED 3
#define THU 4
#define FRI 5
#define SAT 6
int main(void)
{
struct tm *p;
time_t t;
time(&t);
p = localtime(&t);
switch(p->tm_wday)
{
case MON:
case TUE:
case WED:
case THU:
case FRI:
printf("干活!T_T\n");
break;
case SAT:
case SUN:
printf("放假!^_^\n");
break;
default:
printf("Error!\n");
}
return 0;
}
枚举类型
enum 代码
#include<stdio.h>
#include<time.h>
int main(void)
{
enum Week {sun, mon, tue, wed, thu, fri, sat};//枚举类型
enum Week today;
struct tm *p;
time_t t;
time(&t);
p = localtime(&t);
today = p->tm_wday;
switch(today)
{
case mon:
case tue:
case wed:
case thu:
case fri:
printf("Do your jobs!\n");
break;
case sat:
case sun:
printf("Have a nice day!\n");
default:
printf("Error!\n");
}
return 0;
}
位域
使用卫浴的做法是在结构体定义时,在结构体成员后面使用冒号“ :”和数字来表示成员所占的位数。
代码
#include<stdio.h>
int main()
{
struct Test
{
unsigned int a:1;
unsigned int b:1;
unsigned int c:2;
};
struct Test test;
test.a = 0;
test.b = 1;
test.c = 2;
printf("a = %d, b=%d, c=%d\n",test.a,test.b,test.c);
printf("size of test = %d\n",sizeof(test));
return 0;
}
运行结果
a = 0, b=1, c=2
size of test = 4
无名位域
位域成员可以没有名称,只要给出数据类型和位宽即可
逻辑位运算符
演示代码
#include<stdio.h>
int main()
{
int mask = 0xFF;
int v1 = 0xABCDEF;
int v2 = 0xABCDEF;
int v3 = 0xABCDEF;
v1 &= mask;
v2 |= mask;
v3 ^= mask;
printf("v1 = 0x%X\n", v1);
printf("v2 = 0x%X\n", v2);
printf("v3 = 0x%X\n", v3);
return 0;
}
v1 = 0xEF
v2 = 0xABCDFF
v3 = 0xABCD10
移位操作符
演示代码
#include<stdio.h>
int main()
{
int value = 1;
while(value<1024)
{
value <<= 1;// value = value << 1;
printf("value = %d\n",value);
}
printf("------------------------------------------\n");
value = 1024;
while(value>0)
{
value >>= 2;
printf("value = %d\n",value);
}
return 0;
}
value = 2
value = 4
value = 8
value = 16
value = 32
value = 64
value = 128
value = 256
value = 512
value = 1024
------------------------------------------
value = 256
value = 64
value = 16
value = 4
value = 1
value = 0
文件
fopen 函数
函数概要:
fopen 函数用于打开一个文件并返回文件指针。
函数原型:
#include <stdio.h>
...
FILE *fopen(const char *path, const char *mode);
参数解析:
返回值:
- 如果文件打开成功,则返回一个指向 FILE 结构的文件指针;
- 如果文件打开失败,则返回 NULL 并设置 errno 为指定的错误。
备注:
- path 参数可以是相对路径(../fishc.txt)也可以是绝对路径(/home/FishC/fishc.txt),如果只给出文件名而不包含路径,则表示该文件在当前文件夹中
- 从本质上来说,文本文件也是属于二进制文件的,只不过它存放的是相应的字符编码值。
- 打开方式要区分文本模式和二进制模式的原因,主要是因为换行符的问题。C 语言用 \n 表示换行符,Unix 系统用 \n,Windows 系统用 \r\n,Mac 系统则用 \r。如果在 Windows 系统上以文本模式打开一个文件,从文件读到的 \r\n 将会自动转换成 \n,而写入文件则将 \n 替换为 \r\n。但如果以二进制模式打开则不会做这样的转换。Unix 系统的换行符跟 C 语言是一致的,所以不管以文本模式打开还是二进制模式打开,结果都是一样的。
演示
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
int ch;
if ((fp = fopen("hello.txt", "r")) == NULL)
{
printf("打开文件失败!\n");
exit(EXIT_FAILURE);
}
while ((ch = getc(fp)) != EOF)
{
putchar(ch);
}
fclose(fp);
return 0;
}
fgetc 函数
函数概要:
fgetc 函数用于从文件流中读取下一个字符并推进文件的位置指示器(用来指示接下来要读写的下一个字符的位置)。
函数原型:
#include <stdio.h>
...
int fgetc(FILE *stream);
参数解析:
返回值:
- 该函数将读取到的 unsigned char 类型转换为 int 类型并返回;
- 如果文件结束或者遇到错误则返回 EOF。
备注:
1. fgetc 函数和 getc 函数两个的功能和描述基本上是一模一样的,它们的区别主要在于实现上:fgetc 是一个函数;而 getc 则是一个宏的实现
2. 一般来说宏产生较大的代码,但是避免了函数调用的堆栈操作,所以速度会比较快。
3. 由于 getc 是由宏实现的,对其参数可能有不止一次的调用,所以不能使用带有副作用(side effects)的参数。
我知道上面第 3 点可能会让有些童鞋感到懵逼,我这里给大家简单解释下,所谓带有副作用的参数就是指 getc(fp++) 这类型的参数,因为参数在宏的实现中可能会被调用多次,所以你的想法是 fp++,而副作用下产生的结果可能是 fp++++++。
演示
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
int ch;
if ((fp = fopen("hello.txt", "r")) == NULL)
{
printf("打开文件失败!\n");
exit(EXIT_SUCCESS);
}
while ((ch = fgetc(fp)) != EOF)
{
putchar(ch);
}
fclose(fp);
return 0;
}
fputc 函数
函数概要:
fputc 函数用于将一个字符写入到指定的文件中并推进文件的位置指示器(用来指示接下来要读写的下一个字符的位置)。
函数原型:
#include <stdio.h>
...
int fputc(int c, FILE *stream);
参数解析:
返回值:
1. 如果函数没有错误,返回值是写入的字符;
2. 如果函数发生错误,返回值是 EOF。
备注:
1. fputc 函数和 putc 函数两个的功能和描述基本上是一模一样的,它们的区别主要在于实现上:fputc 是一个函数;而 putc 则是一个宏的实现
2. 一般来说宏产生较大的代码,但是避免了函数调用的堆栈操作,所以速度会比较快。
3. 由于 putc 是由宏实现的,对其参数可能有不止一次的调用,所以不能使用带有副作用(side effects)的参数。
我知道上面第 3 点可能会让有些童鞋感到懵逼,我这里给大家简单解释下,所谓带有副作用的参数就是指 putc('X', fp++) 这类型的参数,因为参数在宏的实现中可能会被调用多次,所以你的想法是 fp++,而副作用下产生的结果可能是 fp++++++。
演示
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
int ch;
if ((fp = fopen("file.txt", "w")) == NULL)
{
printf("打开文件失败!\n");
exit(EXIT_FAILURE);
}
for (ch = 33; ch <= 100; ch++)
{
fputc(ch, fp);
}
fputc('\n', fp);
fclose(fp);
return 0;
}
fgets 函数
演示
#include <stdio.h>
#define MAX 1024
int main()
{
char str[MAX];
printf("请输入一个字符串:");
fgets(str, MAX, stdin);
printf("您输入的内容是:%s", str);
return 0;
}
fputs 函数
演示
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
int ch;
if ((fp = fopen("file.txt", "w")) == NULL)
{
printf("打开文件失败!\n");
exit(EXIT_FAILURE);
}
fputs("I love FishC.com!\n", fp);
fclose(fp);
return 0;
}
Python
str.found()函数
描述
Python find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回-1。
语法
find()方法语法:
str.find(str, beg=0, end=len(string))
参数
str -- 指定检索的字符串
beg -- 开始索引,默认为0。
end -- 结束索引,默认为字符串的长度。
返回值
如果包含子字符串返回开始的索引值,否则返回-1。
实例
#!/usr/bin/python
str1 = "this is string example....wow!!!";
str2 = "exam";
print str1.find(str2);
print str1.find(str2, 10);
print str1.find(str2, 40);
以上实例输出结果如下:
15
15
-1
示例
info = 'abca'
print info.find('a') # 从下标0开始,查找在字符串里第一个出现的子串,返回结果:0
0
print info.find('a',1) # 从下标1开始,查找在字符串里第一个出现的子串:返回结果3
3
print info.find('3') # 查找不到返回-1
-1
>>>