2020-09-29 周記錄(四)

視覺設(shè)計(jì)——王曉豪

數(shù)據(jù)結(jié)構(gòu)與算法

走迷宮(廣度優(yōu)先算法)

題目描述:

Description
有一個(gè)N*M的格子迷宮困肩,1代表該格子為墻,不能通過腹鹉,0代表可以通過棺蛛,另外怔蚌,在迷宮中
有一些傳送門,走到傳送門的入口即會自動被傳送到傳送門的出口(一次傳送算1步)鞠值。人在迷宮中可以嘗試
上下左右四個(gè)方向移動∶拇矗現(xiàn)在給定一個(gè)迷宮和所有傳送門的出入口渗钉,以及起點(diǎn)和終點(diǎn)彤恶,
問最少多少步可以走出迷宮钞钙。如果不能走出迷宮輸出“die”。

輸入格式:

該程序?yàn)槎郈ASE声离,第1行為CASE的數(shù)量
每一個(gè)CASE芒炼,第1行為兩個(gè)數(shù)N(行)和M(列)
然后N行每行M個(gè)數(shù)
之后是一個(gè)數(shù)W,為傳送門的數(shù)量
之后每行一個(gè)傳送門的入口坐標(biāo)c1(行),r1(列)和出口坐標(biāo)c2,r2
之后是起點(diǎn)坐標(biāo)和終點(diǎn)坐標(biāo)sc(行) sr(列) ec(行) er(列)


image.png

做題思路:

建立多個(gè)二維數(shù)組术徊,分別保存地圖本刽、出入口、傳送門出入口赠涮,并需要設(shè)置一個(gè)標(biāo)志變量確定是否到達(dá)終點(diǎn)

可以利用廣度優(yōu)先遍歷模擬走迷宮的狀態(tài)子寓,那就需要用一個(gè)結(jié)構(gòu)體保存當(dāng)前位置在地圖中的坐標(biāo),離起點(diǎn)所走的步數(shù)笋除。

在走迷宮的過程中斜友,對為“1”的格子,不對其進(jìn)行遍歷垃它;對為傳送門入口坐標(biāo)的格子鲜屏,需要將目前狀態(tài)調(diào)整為傳送門出口位置的坐標(biāo),并使步數(shù)加1国拇;對為終點(diǎn)的格子洛史,置到達(dá)終點(diǎn)的標(biāo)志變量,并結(jié)束該case

需要注意的要點(diǎn):

1.為多case
2.對走過的格子要設(shè)為“1”
3.起點(diǎn)和終點(diǎn)重合的情況

對廣度優(yōu)先遍歷算法的理解

走迷宮用的廣度優(yōu)先遍歷酱吝,用例子引入也殖,可以理解為水的波紋,像周圍蕩開务热,但是不太能體現(xiàn)節(jié)點(diǎn)與節(jié)點(diǎn)間的關(guān)系毕源,所以在這個(gè)基礎(chǔ)上,我更想把其比作蜘蛛網(wǎng)陕习,當(dāng)有物體撞擊蜘蛛網(wǎng)的時(shí)候霎褐,在物體撞擊的位置(初始節(jié)點(diǎn)),這個(gè)撞擊的力沿著與初始節(jié)點(diǎn)有連接的蛛絲傳遞到下一個(gè)結(jié)點(diǎn)该镣,并重復(fù)此步驟冻璃,而且不會返回來。也就是在廣度遍歷時(shí)损合,會對節(jié)點(diǎn)周圍相關(guān)聯(lián)且未遍歷的點(diǎn)先進(jìn)行遍歷省艳,然后重復(fù)此步驟直至所有節(jié)點(diǎn)都被遍歷。由于與一個(gè)節(jié)點(diǎn)相關(guān)聯(lián)的節(jié)點(diǎn)有多個(gè)且不能同時(shí)進(jìn)行遍歷嫁审,我們可以用隊(duì)列模擬這種“同時(shí)”的遍歷跋炕。具體例子:

1.對起點(diǎn)進(jìn)行遍歷,發(fā)現(xiàn)周圍四個(gè)方向都要進(jìn)行遍歷

2.將四個(gè)方向的狀態(tài)壓入隊(duì)列

3.遍歷起點(diǎn)

4.起點(diǎn)遍歷結(jié)束律适,遍歷起點(diǎn)的第一個(gè)方向上的點(diǎn)辐烂,并將與其相關(guān)聯(lián)的點(diǎn)壓入隊(duì)列為遏插,設(shè)第一個(gè)方向相關(guān)聯(lián)的點(diǎn)組成的集合為 T1,第二個(gè)為T2纠修,如此類推胳嘲。

5.當(dāng)前隊(duì)列為:起點(diǎn)第二個(gè)方向,起點(diǎn)第三個(gè)方向扣草,起點(diǎn)第四個(gè)方向了牛,T1

6.循環(huán)4步驟直到隊(duì)列狀態(tài)為:

? 起點(diǎn)第四個(gè)方向,T1辰妙,T2鹰祸,T3

7.當(dāng)起點(diǎn)第四個(gè)方向被遍歷并從隊(duì)列中彈出,此時(shí)密浑,隊(duì)列完成了對起點(diǎn)四個(gè)方向“同時(shí)”遍歷的模擬福荸。

代碼

#include <iostream>
#include <cstdio>
#include <malloc.h>
#include <queue>
using namespace std;
int d[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; //四個(gè)方向
char s[110][110];       //地圖大小
int sr,sc;      //初始地點(diǎn)
int er,ec;      //目標(biāo)地點(diǎn)
int In[110][2],Out[110][2]; //傳送門入口和出口坐標(biāo)

typedef struct{
int row;
int col;        //位置
int step;       //步數(shù)
}node;      //每次走的記錄


int main()
{
    int k;
    scanf("%d",&k); //多case
    while(k--)
    {
        int m,n,flag=0,jump=0;
        scanf("%d%d",&m,&n);        //行列數(shù)
        int i;
        for(i=0;i<m;i++)
        {
            scanf("%s",s[i]);       //每行迷宮
        }
        int num;
        scanf("%d",&num);       //傳送門數(shù)量
        for(i=0;i<num;i++)
        {
            scanf("%d%d%d%d",&In[i][0],&In[i][1],&Out[i][0],&Out[i][1]);        //傳送門入口坐標(biāo)和出口坐標(biāo)
        }
        scanf("%d%d%d%d",&sr,&sc,&er,&ec);      //起點(diǎn)和終點(diǎn)坐標(biāo)

         node first;
         first.row=sr;
         first.col=sc;
         first.step=0;      //設(shè)置起點(diǎn)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)   //是否是終點(diǎn)
             {
                 printf("%d\n",cur.step);
                 flag=1;        //已到達(dá)終點(diǎn)標(biāo)志
                 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];         //傳送后的坐標(biāo)
                     newnode.step=cur.step+1;       //步數(shù)+1
                     Q.push(newnode);       //推入該坐標(biāo)
                     jump=1;        //傳送門使用標(biāo)志
                     break;

                 }
             }
             if(!jump)      //未使用傳送門
             {

                 for(i=0;i<4;i++)       //四個(gè)方向
                 {
                     int k=0;
                     node now;
                     now.row=cur.row+d[i][0];
                     now.col=cur.col+d[i][1];
                     now.step=cur.step+1;       //步數(shù)+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';   //走過的標(biāo)志位
                         Q.push(now);
                     }
                 }
             }

         }//while
            if(!flag)  //flag未設(shè)置成終點(diǎn)標(biāo)志,die
            {
                printf("die\n");
            }
    }//while
}

HTML5

meta

編碼問題

1.將源文件保存為UTF-8的編碼格式
2.在HTML文檔中指定相應(yīng)的編碼
3.聲明:<meta charset="UTF-8">

<!DOCTYPE html>
<html>
<head>
    <title> 標(biāo)題 </title>
    <meta charset="UTF-8">
</head>
<body>
    <p>熱火總冠軍</p>
</body>
</html>

HTML自適應(yīng)

<meta name="viewport" content="width=device-width,initial-scale=1.0">

搜索引擎優(yōu)化(網(wǎng)頁內(nèi)容描述肴掷,關(guān)鍵詞)

<!DOCTYPE.html>
<html>
    <head>
        <title>第一個(gè)程序</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1.0">
        <meta name="keywords" content="王曉豪的網(wǎng)頁">
        <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-零基礎(chǔ)入門學(xué)習(xí)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>一只特立獨(dú)行的豬</title> |
|  | <meta charset="utf-8"> |
|  | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|  | <meta name="keywords" content="小甲魚,Web開發(fā),HTML5,CSS3,Web編程教學(xué)"> |
|  | <meta name="description" content="《零基礎(chǔ)入門學(xué)習(xí)Web開發(fā)》案例演示"> |
|  | <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>一只特立獨(dú)行的豬</h1> |
|  | <h2>王小波</h2> |
|  | <p>插隊(duì)的時(shí)候敬锐,我喂過豬、也放過牛呆瞻。假如沒有人來管台夺,這兩種動物也完全知道該怎樣生活。它們會自由自在地閑逛痴脾,饑則食渴則飲颤介,春天來臨時(shí)還要談?wù)剱矍椋贿@樣一來赞赖,它們的生活層次很低滚朵,完全乏善可陳。人來了以后前域,給它們的生活做出了安排:每一頭牛和每一口豬的生活都有了主題辕近。就它們中的大多數(shù)而言,這種生活主題是很悲慘的:前者的主題是干活匿垄,后者的主題是長肉移宅。我不認(rèn)為這有什么可抱怨的,因?yàn)槲耶?dāng)時(shí)的生活也不見得豐富了多少椿疗,除了八個(gè)樣板戲漏峰,也沒有什么消遣。有極少數(shù)的豬和牛届榄,它們的生活另有安排浅乔。以豬為例,種豬和母豬除了吃铝条,還有別的事可干靖苇。就我所見席噩,它們對這些安排也不大喜歡。種豬的任務(wù)是交配顾复,換言之,我們的政策準(zhǔn)許它當(dāng)個(gè)花花公子鲁捏。但是疲憊的種豬往往擺出一種肉豬(肉豬是閹過的)才有的正人君子架勢芯砸,死活不肯跳到母豬背上去。母豬的任務(wù)是生崽兒给梅,但有些母豬卻要把豬崽兒吃掉假丧。總的來說动羽,人的安排使豬痛苦不堪包帚。但它們還是接受了:豬總是豬啊。</p> |
|  | <p>對生活做種種設(shè)置是人特有的品性运吓。不光是設(shè)置動物渴邦,也設(shè)置自己。我們知道拘哨,在古希臘有個(gè)斯巴達(dá)谋梭,那里的生活被設(shè)置得了無生趣,其目的就是要使男人成為亡命戰(zhàn)士倦青,使女人成為生育機(jī)器瓮床,前者像些斗雞,后者像些母豬产镐。這兩類動物是很特別的隘庄,但我以為,它們肯定不喜歡自己的生活癣亚。但不喜歡又能怎么樣丑掺?人也好,動物也罷述雾,都很難改變自己的命運(yùn)吼鱼。</p> |
|  | <p>以下談到的一只豬有些與眾不同。我喂豬時(shí)绰咽,它已經(jīng)有四五歲了菇肃,從名分上說,它是肉豬取募,但長得又黑又瘦琐谤,兩眼炯炯有光。這家伙像山羊一樣敏捷玩敏,一米高的豬欄一跳就過斗忌;它還能跳上豬圈的房頂质礼,這一點(diǎn)又像是貓——所以它總是到處游逛,根本就不在圈里呆著织阳。所有喂過豬的知青都把它當(dāng)寵兒來對待眶蕉,它也是我的寵兒——因?yàn)樗粚χ嗪茫菰S他們走到三米之內(nèi)唧躲,要是別的人造挽,它早就跑了。它是公的弄痹,原本該劁掉饭入。不過你去試試看,哪怕你把劁豬刀藏在身后肛真,它也能嗅出來谐丢,朝你瞪大眼睛,噢噢地吼起來蚓让。我總是用細(xì)米糠熬的粥喂它乾忱,等它吃夠了以后,才把糠對到野草里喂別的豬历极。其他豬看了嫉妒饭耳,一起嚷起來。這時(shí)候整個(gè)豬場一片鬼哭狼嚎执解,但我和它都不在乎寞肖。吃飽了以后,它就跳上房頂去曬太陽衰腌,或者模仿各種聲音新蟆。它會學(xué)汽車響、拖拉機(jī)響右蕊,學(xué)得都很像琼稻;有時(shí)整天不見蹤影,我估計(jì)它到附近的村寨里找母豬去了饶囚。我們這里也有母豬帕翻,都關(guān)在圈里,被過度的生育搞得走了形萝风,又臟又臭嘀掸,它對它們不感興趣;村寨里的母豬好看一些规惰。它有很多精彩的事跡睬塌,但我喂豬的時(shí)間短,知道得有限,索性就不寫了揩晴⊙悖總而言之,所有喂過豬的知青都喜歡它硫兰,喜歡它特立獨(dú)行的派頭兒诅愚,還說它活得瀟灑。但老鄉(xiāng)們就不這么浪漫劫映,他們說违孝,這豬不正經(jīng)。領(lǐng)導(dǎo)則痛恨它苏研,這一點(diǎn)以后還要談到等浊。我對它則不止是喜歡——我尊敬它腮郊,常常不顧自己虛長十幾歲這一現(xiàn)實(shí)摹蘑,把它叫做“豬兄”。如前所述轧飞,這位豬兄會模仿各種聲音衅鹿。我想它也學(xué)過人說話,但沒有學(xué)會——假如學(xué)會了过咬,我們就可以做傾心之談大渤。但這不能怪它。人和豬的音色差得太遠(yuǎn)了掸绞。</p> |
|  | <p>后來泵三,豬兄學(xué)會了汽笛叫,這個(gè)本領(lǐng)給它招來了麻煩衔掸。我們那里有座糖廠烫幕,中午要鳴一次汽笛,讓工人換班敞映。我們隊(duì)下地干活時(shí)较曼,聽見這次汽笛響就收工回來。我的豬兄每天上午十點(diǎn)鐘總要跳到房上學(xué)汽笛振愿,地里的人聽見它叫就回來——這可比糖廠鳴笛早了一個(gè)半小時(shí)捷犹。坦白地說,這不能全怪豬兄冕末,它畢竟不是鍋爐萍歉,叫起來和汽笛還有些區(qū)別,但老鄉(xiāng)們卻硬說聽不出來档桃。領(lǐng)導(dǎo)上因此開了一個(gè)會翠桦,把它定成了破壞春耕的壞分子,要對它采取專政手段——會議的精神我已經(jīng)知道了,但我不為它擔(dān)憂——因?yàn)榧偃鐚U侵咐K索和殺豬刀的話销凑,那是一點(diǎn)門都沒有的丛晌。以前的領(lǐng)導(dǎo)也不是沒試過,一百人也治不住它斗幼。狗也沒用:豬兄跑起來像顆魚雷澎蛛,能把狗撞出一丈開外。誰知這回是動了真格的蜕窿,指導(dǎo)員帶了二十幾個(gè)人谋逻,手拿五四式手槍;副指導(dǎo)員帶了十幾人桐经,手持看青的火槍毁兆,分兩路在豬場外的空地上兜捕它。這就使我陷入了內(nèi)心的矛盾:按我和它的交情阴挣,我該舞起兩把殺豬刀沖出去气堕,和它并肩戰(zhàn)斗,但我又覺得這樣做太過驚世駭俗——它畢竟是只豬芭线帧茎芭;還有一個(gè)理由,我不敢對抗領(lǐng)導(dǎo)誓沸,我懷疑這才是問題之所在梅桩。總之拜隧,我在一邊看著宿百。豬兄的鎮(zhèn)定使我佩服之極:它很冷靜地躲在手槍和火槍的連線之內(nèi),任憑人喊狗咬洪添,不離那條線垦页。這樣,拿手槍的人開火就會把拿火槍的打死薇组,反之亦然外臂;兩頭同時(shí)開火,兩頭都會被打死律胀。至于它宋光,因?yàn)槟繕?biāo)小,多半沒事炭菌。就這樣連兜了幾個(gè)圈子罪佳,它找到了一個(gè)空子,一頭撞出去了黑低;跑得瀟灑之極赘艳。以后我在甘蔗地里還見過它一次酌毡,它長出了獠牙,還認(rèn)識我蕾管,但已不容我走近了枷踏。這種冷淡使我痛心,但我也贊成它對心懷叵測的人保持距離掰曾。</p> |
|  | <p>我已經(jīng)四十歲了旭蠕,除了這只豬,還沒見過誰敢于如此無視對生活的設(shè)置旷坦。相反掏熬,我倒見過很多想要設(shè)置別人生活的人,還有對被設(shè)置的生活安之若素的人秒梅。因?yàn)檫@個(gè)原故旗芬,我一直懷念這只特立獨(dú)行的豬。</p> |
|  | <img src="[../img/pig.png](https://ilovefishc.com/html5/html5/lesson4/img/pig.png)"> |
|  | </body> |
|  | </html> |

思維導(dǎo)圖

image.png

image.png

一些問題

1. 請問 <!DOCTYPE html> 標(biāo)簽是干啥用的呢捆蜀?
答:<!DOCTYPE html> 標(biāo)簽可以告訴瀏覽器你的 HTML 文檔是基于哪一個(gè)標(biāo)準(zhǔn)進(jìn)行開發(fā)的(在這里疮丛,<!DOCTYPE html> 表示該文檔是基于 HTML5 的標(biāo)準(zhǔn)進(jìn)行開發(fā))。通過使用 DOCTYPE漱办,瀏覽器就能夠更準(zhǔn)確地選擇用什么方式來解釋和展現(xiàn)你的網(wǎng)頁这刷。另外要記住婉烟,DOCTYPE 定義需要放在 HTML 文檔的最開頭位置娩井!
2. head 元素中必須要有的元素是?
答:head 元素中必須要有一個(gè) title 元素似袁。
3. 什么是UTF-8洞辣?
答:UTF-8 是一個(gè)字符編碼,能夠用最少的字節(jié)數(shù)表示所有 Unicode 字符昙衅。
Unicode 是為了解決傳統(tǒng)的字符編碼方案的局限而產(chǎn)生的扬霜,它為每種語言中的每個(gè)字符設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼,以滿足跨語言而涉、跨平臺進(jìn)行文本轉(zhuǎn)換著瓶、處理的要求。
所以啼县,在網(wǎng)絡(luò)全球化的現(xiàn)在材原,UTF-8 已經(jīng)被推選為新的統(tǒng)一標(biāo)準(zhǔn)。
4. meta 元素永遠(yuǎn)只能位于哪個(gè)元素的內(nèi)部季眷?
答:head 元素余蟹。
5. 操作系統(tǒng)是使用反斜杠(\)做分隔符,在 HTML 中子刮,我們可以使用它來代替斜杠( /)嗎威酒?
答:不能!
在 HTML 中,路徑只能使用斜杠(/)作為分隔符葵孤。

6.請按下面要求編寫一個(gè)網(wǎng)頁:

  • 實(shí)現(xiàn)網(wǎng)頁尺寸自適應(yīng)
  • 為該網(wǎng)頁添加關(guān)鍵詞担钮,內(nèi)容描述,作者等信息
  • 實(shí)現(xiàn)一個(gè)帶超鏈接的圖片(即點(diǎn)擊圖片可跳轉(zhuǎn)到新頁面中)
<!DOCTYPE html>
<html>
<head>
    <title>點(diǎn)擊圖片可以跳轉(zhuǎn)</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="keywords" content="王曉豪,Web開發(fā),HTML5,CSS3,Web編程教學(xué)">
    <meta name="description" content="《零基礎(chǔ)入門學(xué)習(xí)Web開發(fā)》課后作業(yè)">
    <meta name="author" content="王曉豪">
</head>
<body>
    <p>點(diǎn)擊下圖即可跳轉(zhuǎn)到魚C論壇</p>
    <a  target="_blank"><img src="11233.jpg" alt="魚C論壇"></a>
</body>
</html>

鏈接外部樣式

將css樣式表單獨(dú)抽取出來

1. 使用 link 鏈接外部樣式表
除了可以在 style 元素中添加尤仍,我們還可以將 css 樣式表保存為外部文件裳朋,然后使用 link 元素將其鏈接進(jìn)來。如果你的樣式表內(nèi)容比較多吓著,建議是存放為單獨(dú)的文件鲤嫡。
link 元素也是支持 media 屬性的,該屬性指定被鏈接的資源將針對哪一種媒體或者設(shè)備進(jìn)行優(yōu)化。
link 元素的用法詳解

<link rel="stylesheet" type="text/css" href="styles.css">
image.png

image.png

鏈接網(wǎng)站圖標(biāo)

link 最常見的另一個(gè)用法就是鏈接網(wǎng)站圖標(biāo) —— favicon
各種瀏覽器處理圖標(biāo)的方式有所不同慰丛,常見的做法是將其顯示在相應(yīng)的標(biāo)簽頁左側(cè)的位置捕虽。

image.png

關(guān)聯(lián)網(wǎng)站圖標(biāo),只需要將 rel 屬性設(shè)置為 "icon"诫肠,然后設(shè)置 type 屬性為 "image/x-icon",最后在 href 屬性中指定圖標(biāo)的位置即可:

<link rel="icon"  type="image/x-icon">

思維導(dǎo)圖

image.png

C語言

基礎(chǔ) typedef

typedef 是C語言最重要的關(guān)鍵字之一

舉例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;
}

運(yùn)行結(jié)果

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;
} 

運(yùn)行結(jié)果

addr of a = 000000000062FE0C

普通定義結(jié)構(gòu)體

代碼

#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èi)存分配失斊墼怠栋豫!\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;   
}

運(yùn)行結(jié)果

1999-11-12
使用 typedef 定義結(jié)構(gòu)體

代碼

#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èi)存分配失敗谚殊!\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;   
}

運(yùn)行結(jié)果

1999-11-12
也可以順便定義一個(gè)結(jié)構(gòu)體指針
#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èi)存分配失斏パ臁!\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;   
}

進(jìn)階typedef

在編程中使用 typedef 的目的一般有兩個(gè):
1.一個(gè)是給變量起一個(gè)容易記住且意義明確的別名嫩絮;
2.另一個(gè)是簡化一些比較復(fù)雜的類型聲明丛肢。

typedef 定義數(shù)組指針

代碼

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

運(yùn)行結(jié)果

1
2
3

typedef 函數(shù)數(shù)組指針

代碼

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

結(jié)果

520

共用體

各個(gè)成員共用一個(gè)地址

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;
}

運(yùn)行結(jié)果

addr of test.i: 000000000062FE10
addr of test.pi: 000000000062FE10
addr of test.str: 000000000062FE10

定義共用體類型變量

image.png

image.png

初始化共用體

image.png

time 函數(shù)文檔

函數(shù)摘要:
time 函數(shù)用于返回從標(biāo)準(zhǔn)計(jì)時(shí)點(diǎn)到當(dāng)前時(shí)間的秒數(shù),即從 1970 年 1 月 1 日的 UTC 時(shí)間 0 時(shí) 0 分 0 秒算起到現(xiàn)在所經(jīng)過的秒數(shù)剿干。
函數(shù)原型:

#include <time.h>
...
time_t time(time_t *t);

參數(shù)解析:
參數(shù) 含義
time_t //1. 一個(gè)指向 time_t 類型變量的指針蜂怎,用于存放獲得的結(jié)果 2. 可以將該參數(shù)指定為 NULL,通過函數(shù)的返回值獲得結(jié)果

返回值:
如果函數(shù)調(diào)用成功置尔,返回值是標(biāo)準(zhǔn)計(jì)時(shí)點(diǎn)到當(dāng)前時(shí)間所經(jīng)過的秒數(shù)杠步;
如果函數(shù)調(diào)用失敗,返回值是 -1榜轿,并設(shè)置 errno幽歼。

演示

#include <stdio.h>
#include <time.h>

int main(void)
{
        time_t seconds;

        // 下面語句也可以寫成:time(&seconds);
        seconds = time(NULL);

        printf("1970年1月1日零點(diǎn)到現(xiàn)在經(jīng)過了%ld個(gè)小時(shí)!\n", seconds / 3600);

        return 0;
}

localtime -- 獲取當(dāng)前的本地時(shí)間和日期

函數(shù)摘要:

localtime 函數(shù)用于獲取當(dāng)前的本地時(shí)間和日期差导。

其實(shí) localtime 函數(shù)是將一個(gè) time_t 類型的值轉(zhuǎn)換成具體的本地時(shí)間和日期试躏,所以需要先使用 time 函數(shù)來返回表示當(dāng)前時(shí)間的 time_t。

函數(shù)原型:

#include <time.h>
...
struct tm *gmtime(const time_t *timep);

參數(shù)解析:

| 參數(shù) | 含義 |
| timep | 1. 指向 time_t 類型的指針 2. 請使用 time 函數(shù)獲取該指針需要指向的值 |

返回值:
返回值是一個(gè)指向 tm 結(jié)構(gòu)體的指針设褐。
tm 結(jié)構(gòu)體包含了當(dāng)?shù)貢r(shí)間和日期:

struct tm 
{
           int tm_sec;     /* 秒颠蕴,范圍為 0~59泣刹,60 的話表示閏秒 */
           int tm_min;     /* 分,范圍是 0~59 */
           int tm_hour;    /* 時(shí)犀被,范圍是 0~23 */
           int tm_mday;    /* 一個(gè)月中的第幾天椅您,范圍是 1~31 */
           int tm_mon;     /* 一年中的第幾個(gè)月,范圍是 0~11 */
           int tm_year;    /* 自 1900 年往后的第幾年 */
           int tm_wday;    /* 星期幾寡键,自星期天開始計(jì)算掀泳,范圍是 0~6 */
           int tm_yday;    /* 一年中的第幾天,范圍是 0~365 */
           int tm_isdst;   /* 指定日光節(jié)約時(shí)間是否生效西轩,正數(shù)表示生效员舵,0 表示不生效,負(fù)數(shù)表示該信息不可用 */
};

演示

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

位域

使用衛(wèi)浴的做法是在結(jié)構(gòu)體定義時(shí)注服,在結(jié)構(gòu)體成員后面使用冒號“ :”和數(shù)字來表示成員所占的位數(shù)韭邓。

代碼

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

運(yùn)行結(jié)果

a = 0, b=1, c=2
size of test = 4

無名位域

位域成員可以沒有名稱,只要給出數(shù)據(jù)類型和位寬即可

image.png

邏輯位運(yùn)算符

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 函數(shù)

函數(shù)概要:
fopen 函數(shù)用于打開一個(gè)文件并返回文件指針溶弟。

函數(shù)原型:

#include <stdio.h>
...
FILE *fopen(const char *path, const char *mode);

參數(shù)解析:

image.png

返回值:

  1. 如果文件打開成功女淑,則返回一個(gè)指向 FILE 結(jié)構(gòu)的文件指針;
  2. 如果文件打開失敗辜御,則返回 NULL 并設(shè)置 errno 為指定的錯(cuò)誤鸭你。

備注:

  1. path 參數(shù)可以是相對路徑(../fishc.txt)也可以是絕對路徑(/home/FishC/fishc.txt),如果只給出文件名而不包含路徑我抠,則表示該文件在當(dāng)前文件夾中
  2. 從本質(zhì)上來說苇本,文本文件也是屬于二進(jìn)制文件的袜茧,只不過它存放的是相應(yīng)的字符編碼值菜拓。
  3. 打開方式要區(qū)分文本模式和二進(jìn)制模式的原因,主要是因?yàn)閾Q行符的問題笛厦。C 語言用 \n 表示換行符纳鼎,Unix 系統(tǒng)用 \n,Windows 系統(tǒng)用 \r\n裳凸,Mac 系統(tǒng)則用 \r贱鄙。如果在 Windows 系統(tǒng)上以文本模式打開一個(gè)文件,從文件讀到的 \r\n 將會自動轉(zhuǎn)換成 \n姨谷,而寫入文件則將 \n 替換為 \r\n逗宁。但如果以二進(jìn)制模式打開則不會做這樣的轉(zhuǎn)換。Unix 系統(tǒng)的換行符跟 C 語言是一致的梦湘,所以不管以文本模式打開還是二進(jìn)制模式打開瞎颗,結(jié)果都是一樣的件甥。

演示

#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 函數(shù)

函數(shù)概要:
fgetc 函數(shù)用于從文件流中讀取下一個(gè)字符并推進(jìn)文件的位置指示器(用來指示接下來要讀寫的下一個(gè)字符的位置)引有。

函數(shù)原型:

#include <stdio.h>
...
int fgetc(FILE *stream);

參數(shù)解析:

image.png

返回值:

  1. 該函數(shù)將讀取到的 unsigned char 類型轉(zhuǎn)換為 int 類型并返回;
  2. 如果文件結(jié)束或者遇到錯(cuò)誤則返回 EOF倦逐。

備注:
1. fgetc 函數(shù)和 getc 函數(shù)兩個(gè)的功能和描述基本上是一模一樣的譬正,它們的區(qū)別主要在于實(shí)現(xiàn)上:fgetc 是一個(gè)函數(shù);而 getc 則是一個(gè)宏的實(shí)現(xiàn)
2. 一般來說宏產(chǎn)生較大的代碼檬姥,但是避免了函數(shù)調(diào)用的堆棧操作曾我,所以速度會比較快。
3. 由于 getc 是由宏實(shí)現(xiàn)的健民,對其參數(shù)可能有不止一次的調(diào)用您单,所以不能使用帶有副作用(side effects)的參數(shù)。
我知道上面第 3 點(diǎn)可能會讓有些童鞋感到懵逼荞雏,我這里給大家簡單解釋下虐秦,所謂帶有副作用的參數(shù)就是指 getc(fp++) 這類型的參數(shù),因?yàn)閰?shù)在宏的實(shí)現(xiàn)中可能會被調(diào)用多次凤优,所以你的想法是 fp++悦陋,而副作用下產(chǎn)生的結(jié)果可能是 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 函數(shù)

函數(shù)概要:
fputc 函數(shù)用于將一個(gè)字符寫入到指定的文件中并推進(jìn)文件的位置指示器(用來指示接下來要讀寫的下一個(gè)字符的位置)。

函數(shù)原型:

#include <stdio.h>
...
int fputc(int c, FILE *stream);

參數(shù)解析:

image.png

返回值:
1. 如果函數(shù)沒有錯(cuò)誤棍辕,返回值是寫入的字符暮现;
2. 如果函數(shù)發(fā)生錯(cuò)誤,返回值是 EOF楚昭。

備注:
1. fputc 函數(shù)和 putc 函數(shù)兩個(gè)的功能和描述基本上是一模一樣的栖袋,它們的區(qū)別主要在于實(shí)現(xiàn)上:fputc 是一個(gè)函數(shù);而 putc 則是一個(gè)宏的實(shí)現(xiàn)
2. 一般來說宏產(chǎn)生較大的代碼抚太,但是避免了函數(shù)調(diào)用的堆棧操作塘幅,所以速度會比較快。
3. 由于 putc 是由宏實(shí)現(xiàn)的尿贫,對其參數(shù)可能有不止一次的調(diào)用电媳,所以不能使用帶有副作用(side effects)的參數(shù)。
我知道上面第 3 點(diǎn)可能會讓有些童鞋感到懵逼庆亡,我這里給大家簡單解釋下匾乓,所謂帶有副作用的參數(shù)就是指 putc('X', fp++) 這類型的參數(shù),因?yàn)閰?shù)在宏的實(shí)現(xiàn)中可能會被調(diào)用多次又谋,所以你的想法是 fp++拼缝,而副作用下產(chǎn)生的結(jié)果可能是 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 函數(shù)

詳解

演示

#include <stdio.h>

#define MAX 1024

int main()
{
        char str[MAX];

        printf("請輸入一個(gè)字符串:");
        fgets(str, MAX, stdin);

        printf("您輸入的內(nèi)容是:%s", str);

        return 0;
}
image.png

fputs 函數(shù)

詳解

演示

#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()函數(shù)

描述
Python find() 方法檢測字符串中是否包含子字符串 str 猪叙,如果指定 beg(開始) 和 end(結(jié)束) 范圍娇斩,則檢查是否包含在指定范圍內(nèi),如果包含子字符串返回開始的索引值穴翩,否則返回-1犬第。
語法
find()方法語法:

str.find(str, beg=0, end=len(string))

參數(shù)
str -- 指定檢索的字符串
beg -- 開始索引,默認(rèn)為0芒帕。
end -- 結(jié)束索引歉嗓,默認(rèn)為字符串的長度。
返回值
如果包含子字符串返回開始的索引值背蟆,否則返回-1鉴分。

實(shí)例

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

以上實(shí)例輸出結(jié)果如下:

15
15
-1

示例

info = 'abca'
print info.find('a')    # 從下標(biāo)0開始,查找在字符串里第一個(gè)出現(xiàn)的子串带膀,返回結(jié)果:0
0
print info.find('a',1)  # 從下標(biāo)1開始志珍,查找在字符串里第一個(gè)出現(xiàn)的子串:返回結(jié)果3
3
print info.find('3')    # 查找不到返回-1
-1
>>>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市垛叨,隨后出現(xiàn)的幾起案子伦糯,更是在濱河造成了極大的恐慌,老刑警劉巖嗽元,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敛纲,死亡現(xiàn)場離奇詭異,居然都是意外死亡剂癌,警方通過查閱死者的電腦和手機(jī)淤翔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來珍手,“玉大人办铡,你說我怎么就攤上這事×找” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵秤茅,是天一觀的道長稚补。 經(jīng)常有香客問我,道長框喳,這世上最難降的妖魔是什么课幕? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任厦坛,我火速辦了婚禮,結(jié)果婚禮上乍惊,老公的妹妹穿的比我還像新娘杜秸。我一直安慰自己,他們只是感情好润绎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布撬碟。 她就那樣靜靜地躺著,像睡著了一般莉撇。 火紅的嫁衣襯著肌膚如雪呢蛤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天棍郎,我揣著相機(jī)與錄音其障,去河邊找鬼。 笑死涂佃,一個(gè)胖子當(dāng)著我的面吹牛励翼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辜荠,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼抚笔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了侨拦?” 一聲冷哼從身側(cè)響起殊橙,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狱从,沒想到半個(gè)月后膨蛮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡季研,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年敞葛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片与涡。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惹谐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出驼卖,到底是詐尸還是另有隱情氨肌,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布酌畜,位于F島的核電站怎囚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏桥胞。R本人自食惡果不足惜恳守,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一考婴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧催烘,春花似錦沥阱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至在岂,卻和暖如春奔则,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蔽午。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工易茬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人及老。 一個(gè)月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓抽莱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骄恶。 傳聞我的和親對象是個(gè)殘疾皇子食铐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354