視覺設(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(列)
做題思路:
建立多個(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">
鏈接網(wǎng)站圖標(biāo)
link 最常見的另一個(gè)用法就是鏈接網(wǎng)站圖標(biāo) —— favicon
各種瀏覽器處理圖標(biāo)的方式有所不同慰丛,常見的做法是將其顯示在相應(yīng)的標(biāo)簽頁左側(cè)的位置捕虽。
關(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è)地址
代碼
#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
定義共用體類型變量
初始化共用體
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;
}
枚舉類型
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ù)類型和位寬即可
邏輯位運(yùn)算符
演示代碼
#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ù)解析:
返回值:
- 如果文件打開成功女淑,則返回一個(gè)指向 FILE 結(jié)構(gòu)的文件指針;
- 如果文件打開失敗辜御,則返回 NULL 并設(shè)置 errno 為指定的錯(cuò)誤鸭你。
備注:
- path 參數(shù)可以是相對路徑(../fishc.txt)也可以是絕對路徑(/home/FishC/fishc.txt),如果只給出文件名而不包含路徑我抠,則表示該文件在當(dāng)前文件夾中
- 從本質(zhì)上來說苇本,文本文件也是屬于二進(jìn)制文件的袜茧,只不過它存放的是相應(yīng)的字符編碼值菜拓。
- 打開方式要區(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ù)解析:
返回值:
- 該函數(shù)將讀取到的 unsigned char 類型轉(zhuǎn)換為 int 類型并返回;
- 如果文件結(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ù)解析:
返回值:
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;
}
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;
}
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
>>>