2020-09-29 周记录(四)

视觉设计——王晓豪

数据结构与算法

走迷宫(广度优先算法)

题目描述:

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(列)


image.png

做题思路:

建立多个二维数组,分别保存地图、出入口、传送门出入口,并需要设置一个标志变量确定是否到达终点

可以利用广度优先遍历模拟走迷宫的状态,那就需要用一个结构体保存当前位置在地图中的坐标,离起点所走的步数。

在走迷宫的过程中,对为“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> |

思维导图

image.png

image.png

一些问题

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">
image.png

image.png

链接网站图标

link 最常见的另一个用法就是链接网站图标 —— favicon
各种浏览器处理图标的方式有所不同,常见的做法是将其显示在相应的标签页左侧的位置。

image.png

关联网站图标,只需要将 rel 属性设置为 "icon",然后设置 type 属性为 "image/x-icon",最后在 href 属性中指定图标的位置即可:

<link rel="icon" href="http://www.fishc.com/favicon.ico" type="image/x-icon">

思维导图

image.png

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

共用体

各个成员共用一个地址

image.png

代码

#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

定义共用体类型变量

image.png

image.png

初始化共用体

image.png

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;
}
image.png

枚举类型

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

无名位域

位域成员可以没有名称,只要给出数据类型和位宽即可

image.png

逻辑位运算符

image.png

演示代码

#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);

参数解析:

image.png

返回值:

  1. 如果文件打开成功,则返回一个指向 FILE 结构的文件指针;
  2. 如果文件打开失败,则返回 NULL 并设置 errno 为指定的错误。

备注:

  1. path 参数可以是相对路径(../fishc.txt)也可以是绝对路径(/home/FishC/fishc.txt),如果只给出文件名而不包含路径,则表示该文件在当前文件夹中
  2. 从本质上来说,文本文件也是属于二进制文件的,只不过它存放的是相应的字符编码值。
  3. 打开方式要区分文本模式和二进制模式的原因,主要是因为换行符的问题。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);

参数解析:

image.png

返回值:

  1. 该函数将读取到的 unsigned char 类型转换为 int 类型并返回;
  2. 如果文件结束或者遇到错误则返回 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);

参数解析:

image.png

返回值:
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;
}
image.png

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;
}
image.png

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
>>>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352