主頁 > 後端開發 > 編程代碼:用C語言來實作下雪效果,這個冬天,雪花很美

編程代碼:用C語言來實作下雪效果,這個冬天,雪花很美

2020-11-02 20:35:36 後端開發

前言

1.本文主要圍繞 如何 在 控制臺上 下起 一場 只有自己能看見的雪

2.是個簡易跨平臺的,主要是C語言

3.影片 采用 1s 40幀, 雪花具有 x軸速度和y軸速度

4.比較簡單,可以給學生作為C語言結課作業吧. 

 


 

正文

1.1 先簡單處理跨平臺

   本文寫作動機,還是感謝一下大學的啟蒙老師,讓我知道了有條路叫做程式員,可以作為作業生存下去.那就上代碼了.

首先代碼定位 是 面向 簡單跨平臺,至少讓 gcc 和 vs 能夠跑起來.

其實跨平臺都是嚼頭, 說白了就是一些丑陋的宏. 真希望所有系統合二為一,采用統一的標準api 設計,但這是不可能的,就相當于很早之前的電視制式一樣.

那么我們先看 圍繞跨平臺的宏


 
#include #include #include #include /** 時間 : 2015年12月26日11:43:22

* 描述 : 應該算過節吧,今天,寫了個雪花特效 代碼,           

* *//** 清除螢屏的shell 命令/控制臺命令,還有一些依賴平臺的實作

* 如果定義了 __GNUC__ 就假定是 使用gcc 編譯器,為Linux平臺

*    否則 認為是 Window 平臺*/#ifdefined(__GNUC__)//下面是依賴 Linux 實作#include #definesleep_ms(m) \        usleep(m *1000)//向上移動游標函式 Linuxstaticvoid__curup(int height)

{

    inti = -1;

    while(++i

        printf("\033[1A");//先回到上一行  }#else// 創建等待函式 1s 60 幀 相當于 16.7ms => 1幀, 我們取16ms// 咱么的這螢屏 推薦 1s 25幀吧 40ms// 這里創建等待函式 以毫秒為單位 , 需要依賴作業系統實作#include #definesleep_ms(m) \        Sleep(m)//向上移動游標staticvoid__curup(int height)

{

    COORD cr = {0,0};

    // GetStdHandle(STD_OUTPUT_HANDLE) 獲取螢屏物件, 設定游標    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cr);

}#endif/*__GNUC__ 跨平臺的代碼都很丑陋 */

 

首先是 sleep_ms 這個宏, 傳入一個毫秒數,讓作業系統等待.

對于__curup 實作的不好. 功能是 讓 控制臺當前游標移動到 上面的 height 位置,對于 window直接移動到第一行(0,0)位置.

上面一共用了 5個頭檔案 還是容易的代碼. string.h 主要用的是 memset 函式, 讓一段記憶體初始化,用0填充.

對于time.h 主要是為了 初始化時間種子,方便每次運行都不一樣.

// 初始化亂數種子,改變雪花軌跡srand((unsigned)time(NULL));

 

1.2 再說主業務代碼

      這里程式員運行的主業務,先說一說這里用的資料結構 如下

// 定義初始螢屏的寬高像素宏#define_INT_WIDTH        (100)#define_INT_HEIGHT        (50)// 螢屏重繪幀的速率#define_INT_FRATE        (40)// 雪花飄落的速率,相對于 螢屏重繪幀 的倍數#define_INT_VSNOW        (10)/** 錯誤處理宏,msg必須是""括起來的字串常量

* __FILE__        : 檔案全路徑

* __func__        : 函式名

* __LINE__        : 行數行

* __VA_ARGS__    : 可變引數宏,

* ##表示直接連接, 例如 a##b <=> ab*/#definecerr(msg,...) \    fprintf(stderr, "[%s:%s:%d]"msg"\n",__FILE__,__func__,__LINE__,##__VA_ARGS__);/**  螢屏結構體, 具有 寬高

*  frate  : 繪制一幀的周期, 單位是 毫秒

*  width  : 螢屏的寬,基于視窗的左上角(0,0)

*  height : 螢屏的高

*  pix    : 用一維模擬二維 主要結構如下

*            0 0 0 1 0 0 1 0 1 0

*            0 1 0 1 0 1 0 1 2 0

*            . . .

*            => 0表示沒像素, 1表示1個像素,2表示2個像素....*/struct screen {

    intfrate;// 也可以用 unsigned 結構int width;

    int height;

    char*pix;

};

 

創建了一個繪圖物件 struct screen 這里 構建這個結構體的時候用了下面一個技巧

//后面是 為 scr->pix 分配的記憶體 width*heightscr =malloc(sizeof(structscreen) +sizeof(char)*width*height);

一次分配兩個記憶體空間.下面是主要實作的api 物件

/** 創建一個 螢屏結構指標 回傳

*

* int frate    : 繪制一幀的周期

* int width    : 螢屏寬度

* int height    : 螢屏高度

* return        : 指向螢屏結構的指標

* */structscreen* screen_create(intfrate,intwidth,int height);/** 銷毀一個 螢屏結構指標, 并為其置空

* struct screen** : 指向 螢屏結構指標的指標, 二級銷毀一級的

* */voidscreen_destory(structscreen** pscr);/**

* 螢屏繪制函式,主要生成一個雪花效果

*

* struct screen* : 螢屏資料

* return          : 0表示可以繪制了,1表示圖案不變*/intscreen_draw_snow(structscreen* scr);/**

* 螢屏繪制影片效果, 繪制雪花影片

*

* struct screen* : 螢屏結構指標*/voidscreen_flash_snow(structscreen* scr);

 

創建銷毀, 繪制一個雪花界面, 繪制雪花影片效果的api. 其實都很相似,用opengl 庫, 主要讓我們省略了需要單獨和作業系統顯示層打交道作業.

這里介紹一下,個人 一個 簡單避免 野指標的 的方法, 具體看下面實作

/** 銷毀一個 螢屏結構指標, 并為其置空

* struct screen** : 指向 螢屏結構指標的指標, 二級銷毀一級的

* */voidscreen_destory(structscreen** pscr)

{

    if(NULL == pscr || NULL == *pscr)

        return;

    free(*pscr);

    // 避免野指標*pscr = NULL;

}

 

在執行之后置空,因為C程式員對NULL一定要敏感,形成條件反射. 和大家開個玩笑 ,

 

請問 :

      C 語言中, NULL , 0,'\0',"0",false有什么異同 ?

 

歡迎同行,在招聘的時候問問,應聘初級開發作業者. 為什么C需要扣的那么細. 因為其它語言.你不明白是什么,

你可以用的很好. 但是C你寫的代碼,如果不知道會有怎樣的結果,那么 線上就一大片服務器直接崩掉.而且還很難找出

問題所在. 因為C很簡單,越簡單就是越復雜.就越需要專業的維護人員.導致它成了'玩具'.

最后看一下 主業務

 

// 主函式,主業務在此運行intmain(intargc,char*argv[])

{

    structscreen* scr = NULL;

    //創建一個螢屏物件scr = screen_create(_INT_FRATE, _INT_WIDTH, _INT_HEIGHT);

    if(NULL == scr)

        exit(EXIT_FAILURE);

    //繪制雪花影片    screen_flash_snow(scr);

    //銷毀這個螢屏物件screen_destory(&scr);

    return0;

}

 

還是非常容易看懂的, 創建一個螢屏物件,繪制雪花效果.銷毀螢屏物件.

 

1.3 說一寫 介面的實作細節

先看幾個簡單的api 實作,創建和銷魂代碼如下,很直白.

/** 創建一個 螢屏結構指標 回傳

*

* int frate    : 繪制一幀的周期

* int width    : 螢屏寬度

* int height    : 螢屏高度

* return        : 指向螢屏結構的指標

* */structscreen*    screen_create(intfrate,intwidth,int height)

{

    structscreen *scr = NULL;

    if(frate<0|| width <=0|| height <=0) {

        cerr("[WARNING]check is frate<0 || width<=0 || height<=0 err!");

        return NULL;

    }

    //后面是 為 scr->pix 分配的記憶體 width*heightscr =malloc(sizeof(structscreen) +sizeof(char)*width*height);

    if(NULL == scr) {

        cerr("[FATALG]Out of memory!");

        return NULL;

    }

    scr->frate = frate;

    scr->width = width;

    scr->height = height;

    //減少malloc次數,malloc消耗很大,記憶體泄露呀,記憶體碎片呀scr->pix = ((char*)scr) +sizeof(struct screen);

    return scr;

}/** 銷毀一個 螢屏結構指標, 并為其置空

* struct screen** : 指向 螢屏結構指標的指標, 二級銷毀一級的

* */voidscreen_destory(structscreen** pscr)

{

    if(NULL == pscr || NULL == *pscr)

        return;

    free(*pscr);

    // 避免野指標*pscr = NULL;

}

 

后面說一下 如何 繪制 螢屏中雪花

主要演算法 是

a.有個螢屏 w x h

b.螢屏從上面第一行 出雪花 , 出雪花 位置是隨機的[0,w], 但是有個距離,這個距離內只有一個雪花

c.下一行 雪花 依賴上一行雪花的生成, 每個雪花在可以飄動的時候, 只能 在[-1,1] 范圍內

d.實作影片 效果 就是 每畫一幀就等待 一段時間

 

下面看具體一點的 a

//創建一個螢屏物件scr = screen_create(_INT_FRATE, _INT_WIDTH, _INT_HEIGHT);

scr物件就是我們的創建螢屏. _INT_WIDTH 和 _INT_HEIGHT 就是螢屏大小. 對于_INT_FRATE 表示繪制一幀時間.

 

b實作 代碼如下:

//構建開頭 的雪花,下面宏表示每 _INT_SHEAD 個步長,一個雪花,需要是2的冪//static 可以理解為 private, 宏,位操作代碼多了確實難讀#define_INT_SHEAD (1<<2)staticvoid__snow_head(char* snow,int len)

{

    intr =0;

    //資料需要清空memset(snow,0, len);

    for (;;) {

        //取余一個技巧 2^3 - 1 = 7 => 111 , 并就是取余數intt = rand() & (_INT_SHEAD -1);

        if(r + t >= len)

            break;

        snow[r + t] =1;

        r += _INT_SHEAD;

    }

}#undef_INT_SHEAD

 

技巧如上,可以看說明. 這里 科普一下, 對于 for(;;) {} 和 while(true) {} 異同.

for(;;) {} 和 while(true) {} 這兩段代碼轉成匯編是一樣的, 不一樣 的是 強加的意愿. 第一個 希望 跳過 檢測步驟 速度更快一點.

再擴展一點.

//另一種 回圈陳述句, goto 還是 很強大實用的__for_loop:

    if(false)

        goto __for_break;     

goto __for_loop;

__for_break:

 

可以再擴展深一點, 還有一種 api 比 這個goto 還NB. 有機會分享. 特別強大, 是例外處理程式本質.

 

對于c.

//通過 上一個 scr->pix[scr->width*(idx-1)] => scr->pix[scr->width*idx]//下面的宏 規定 雪花左右搖擺 0 向左一個像素, 1 表示 不變, 2表示向右一個像素#define_INT_SWING (3)staticvoid__snow_next(structscreen* scr,int idx)

{

    intwidth = scr->width;

    char* psnow = scr->pix + width*(idx -1);

    char* snow = psnow + width;

    inti, j, t;// i索引, j保存下一個瞬間雪花的位置,t 臨時補得,解決雪花重疊問題

                //為當前行重置memset(snow,0, width);

    //通過上一次雪花位置 計算下一次雪花位置for(i =0; i

        for(t = psnow[i]; t>0; --t) {// 雪花可以重疊

                                      // rand()%_INT_SWING - 1 表示 雪花 橫軸的偏移量,相對上一次位置j = i + rand() % _INT_SWING -1;

            j = j<0? width -1: j >= width ?0: j;// j如果越界了,左邊越界讓它到右邊,右邊越界到左邊++snow[j];

        }

    }

}

 

下一行雪花 依賴 上一行雪花, 這里 有點像插入排序.

整體的繪制代碼 如下

/**

* 螢屏繪制函式,主要生成一個雪花效果

*

* struct screen* : 螢屏資料

* return          : 0表示可以繪制了,1表示圖案不變*/intscreen_draw_snow(structscreen* scr)

{

    // 靜態變數,默認初始化為0,每次都共用staticint__speed =0;

    int idx;

    if(++__speed != _INT_VSNOW)

        return1;

    //下面 就是 到了雪花飄落的時刻了 既 __speed == _INT_VSNOW__speed =0;

    //這里重新構建雪花界面,先構建頭部,再從尾部開始構建for(idx = scr->height -1; idx >0; --idx)

        __snow_next(scr, idx);

    //構建頭部__snow_head(scr->pix, scr->width);

    return0;

}

 

繪制了一個螢屏物件的雪花. __speed 記錄 繪制次數, _INT_VSNOW 控制繪制速率

 

d 的實作代碼 如下

首先實作一個 銷毀螢屏代碼和 繪制代碼

 

//buf 保存scr 中pix 資料,構建后為 (width+1)*height, 后面宏是雪花圖案#define_CHAR_SNOW '*'staticvoid__flash_snow_buffer(structscreen* scr,char* buf)

{

    int i, j, rt;

    intheight = scr->height, width = scr->width;

    intfrate = scr->frate;//重繪的幀頻率   

                            //每次都等一下for (;;sleep_ms(frate)) {

        //開始繪制螢屏rt = screen_draw_snow(scr);

        if (rt)

            continue;

        for(i =0;i

            char* snow = scr->pix + i*width;

            for(j =0; j

                buf[rt++] = snow[j] ? _CHAR_SNOW :'';

            buf[rt++] ='\n';

        }

        buf[rt -1] ='\0';

        //正式繪制到螢屏上        puts(buf);

        //清空老螢屏,螢屏游標回到最上面        __curup(height);

    }

}#undef_CHAR_SNOW

 

這里 sleep_ms(frate); 是等待時間,否則太快, 人眼看不見.

繪制原理是 讓螢屏轉成控制臺能夠認識的字符. 塞入到buf 中.

__curup(height); 讓繪制游標回到開頭.

后面還有一段 代碼實作

/**

* 螢屏繪制影片效果, 繪制雪花影片

*

* struct screen* : 螢屏結構指標*/voidscreen_flash_snow(structscreen* scr)

{

    char* buf = NULL;

    // 初始化亂數種子,改變雪花軌跡    srand((unsigned)time(NULL));

    buf =malloc(sizeof(char)*(scr->width +1)*scr->height);

    if(NULL == buf) {

        cerr("[FATAL]Out of memory!");

        exit(EXIT_FAILURE);

    }

    __flash_snow_buffer(scr, buf);

    //1.這里理論上不會執行到這,沒加控制器. 2.對于buf=NULL,這種代碼 可以省掉,看編程習慣free(buf);

    buf = NULL;

}

 

這種雙函式實作一個功能技巧用的也很多. 例如寫快速排序代碼, 就是這樣.

到這里 我們 設計和實作都完成了.

 

2.代碼效果展示

2.1 window 上展示

使用VS新建一個控制臺專案,F5就可以了效果如下


 

是動態的.

 

2.2 對于Linux

直接使用

gcc -g -Wall snow.c -o snow.out./snow.out

運行效果如下


 

 

到這里, C語言實作雪花效果就如上了.

 

2.3 完整的代碼展示. 感謝 有你,一路同行.

#include #include #include #include /** 時間 : 2015年12月26日11:43:22

* 描述 : 應該算過節吧,今天,寫了個雪花特效 代碼,

*            送給 大學啟蒙 蘆老師

*                        學生王志 祝福上

* *//** 清除螢屏的shell 命令/控制臺命令,還有一些依賴平臺的實作

* 如果定義了 __GNUC__ 就假定是 使用gcc 編譯器,為Linux平臺

*    否則 認為是 Window 平臺*/#ifdefined(__GNUC__)//下面是依賴 Linux 實作#include #definesleep_ms(m) \        usleep(m *1000)//向上移動游標函式 Linuxstaticvoid__curup(int height)

{

    inti = -1;

    while(++i

        printf("\033[1A");//先回到上一行  }#else// 創建等待函式 1s 60 幀 相當于 16.7ms => 1幀, 我們取16ms// 咱么的這螢屏 推薦 1s 25幀吧 40ms// 這里創建等待函式 以毫秒為單位 , 需要依賴作業系統實作#include #definesleep_ms(m) \        Sleep(m)//向上移動游標staticvoid__curup(int height)

{

    COORD cr = {0,0};

    // GetStdHandle(STD_OUTPUT_HANDLE) 獲取螢屏物件, 設定游標    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cr);

}#endif/*__GNUC__ 跨平臺的代碼都很丑陋 */// 定義初始螢屏的寬高像素宏#define_INT_WIDTH        (100)#define_INT_HEIGHT        (50)// 螢屏重繪幀的速率#define_INT_FRATE        (40)// 雪花飄落的速率,相對于 螢屏重繪幀 的倍數#define_INT_VSNOW        (10)/** 錯誤處理宏,msg必須是""括起來的字串常量

* __FILE__        : 檔案全路徑

* __func__        : 函式名

* __LINE__        : 行數行

* __VA_ARGS__    : 可變引數宏,

* ##表示直接連接, 例如 a##b <=> ab*/#definecerr(msg,...) \    fprintf(stderr, "[%s:%s:%d]"msg"\n",__FILE__,__func__,__LINE__,##__VA_ARGS__);/**  螢屏結構體, 具有 寬高

*  frate  : 繪制一幀的周期, 單位是 毫秒

*  width  : 螢屏的寬,基于視窗的左上角(0,0)

*  height : 螢屏的高

*  pix    : 用一維模擬二維 主要結構如下

*            0 0 0 1 0 0 1 0 1 0

*            0 1 0 1 0 1 0 1 2 0

*            . . .

*            => 0表示沒像素, 1表示1個像素,2表示2個像素....*/struct screen {

    intfrate;// 也可以用 unsigned 結構int width;

    int height;

    char*pix;

};/** 創建一個 螢屏結構指標 回傳

*

* int frate    : 繪制一幀的周期

* int width    : 螢屏寬度

* int height    : 螢屏高度

* return        : 指向螢屏結構的指標

* */structscreen* screen_create(intfrate,intwidth,int height);/** 銷毀一個 螢屏結構指標, 并為其置空

* struct screen** : 指向 螢屏結構指標的指標, 二級銷毀一級的

* */voidscreen_destory(structscreen** pscr);/**

* 螢屏繪制函式,主要生成一個雪花效果

*

* struct screen* : 螢屏資料

* return          : 0表示可以繪制了,1表示圖案不變*/intscreen_draw_snow(structscreen* scr);/**

* 螢屏繪制影片效果, 繪制雪花影片

*

* struct screen* : 螢屏結構指標*/voidscreen_flash_snow(structscreen* scr);// 主函式,主業務在此運行intmain(intargc,char*argv[])

{

    structscreen* scr = NULL;

    //創建一個螢屏物件scr = screen_create(_INT_FRATE, _INT_WIDTH, _INT_HEIGHT);

    if(NULL == scr)

        exit(EXIT_FAILURE);

    //繪制雪花影片    screen_flash_snow(scr);

    //銷毀這個螢屏物件screen_destory(&scr);

    return0;

}/** 創建一個 螢屏結構指標 回傳

*

* int frate    : 繪制一幀的周期

* int width    : 螢屏寬度

* int height    : 螢屏高度

* return        : 指向螢屏結構的指標

* */structscreen*    screen_create(intfrate,intwidth,int height)

{

    structscreen *scr = NULL;

    if(frate<0|| width <=0|| height <=0) {

        cerr("[WARNING]check is frate<0 || width<=0 || height<=0 err!");

        return NULL;

    }

    //后面是 為 scr->pix 分配的記憶體 width*heightscr =malloc(sizeof(structscreen) +sizeof(char)*width*height);

    if(NULL == scr) {

        cerr("[FATALG]Out of memory!");

        return NULL;

    }

    scr->frate = frate;

    scr->width = width;

    scr->height = height;

    //減少malloc次數,malloc消耗很大,記憶體泄露呀,記憶體碎片呀scr->pix = ((char*)scr) +sizeof(struct screen);

    return scr;

}/** 銷毀一個 螢屏結構指標, 并為其置空

* struct screen** : 指向 螢屏結構指標的指標, 二級銷毀一級的

* */voidscreen_destory(structscreen** pscr)

{

    if(NULL == pscr || NULL == *pscr)

        return;

    free(*pscr);

    // 避免野指標*pscr = NULL;

}//構建開頭 的雪花,下面宏表示每 _INT_SHEAD 個步長,一個雪花,需要是2的冪//static 可以理解為 private, 宏,位操作代碼多了確實難讀#define_INT_SHEAD (1<<2)staticvoid__snow_head(char* snow,int len)

{

    intr =0;

    //資料需要清空memset(snow,0, len);

    for (;;) {

        //取余一個技巧 2^3 - 1 = 7 => 111 , 并就是取余數intt = rand() & (_INT_SHEAD -1);

        if(r + t >= len)

            break;

        snow[r + t] =1;

        r += _INT_SHEAD;

    }

}#undef_INT_SHEAD//通過 上一個 scr->pix[scr->width*(idx-1)] => scr->pix[scr->width*idx]//下面的宏 規定 雪花左右搖擺 0 向左一個像素, 1 表示 不變, 2表示向右一個像素#define_INT_SWING (3)staticvoid__snow_next(structscreen* scr,int idx)

{

    intwidth = scr->width;

    char* psnow = scr->pix + width*(idx -1);

    char* snow = psnow + width;

    inti, j, t;// i索引, j保存下一個瞬間雪花的位置,t 臨時補得,解決雪花重疊問題

                //為當前行重置memset(snow,0, width);

    //通過上一次雪花位置 計算下一次雪花位置for(i =0; i

        for(t = psnow[i]; t>0; --t) {// 雪花可以重疊

                                      // rand()%_INT_SWING - 1 表示 雪花 橫軸的偏移量,相對上一次位置j = i + rand() % _INT_SWING -1;

            j = j<0? width -1: j >= width ?0: j;// j如果越界了,左邊越界讓它到右邊,右邊越界到左邊++snow[j];

        }

    }

}/**

* 螢屏繪制函式,主要生成一個雪花效果

*

* struct screen* : 螢屏資料

* return          : 0表示可以繪制了,1表示圖案不變*/intscreen_draw_snow(structscreen* scr)

{

    // 靜態變數,默認初始化為0,每次都共用staticint__speed =0;

    int idx;

    if(++__speed != _INT_VSNOW)

        return1;

    //下面 就是 到了雪花飄落的時刻了 既 __speed == _INT_VSNOW__speed =0;

    //這里重新構建雪花界面,先構建頭部,再從尾部開始構建for(idx = scr->height -1; idx >0; --idx)

        __snow_next(scr, idx);

    //構建頭部__snow_head(scr->pix, scr->width);

    return0;

}//buf 保存scr 中pix 資料,構建后為 (width+1)*height, 后面宏是雪花圖案#define_CHAR_SNOW '*'staticvoid__flash_snow_buffer(structscreen* scr,char* buf)

{

    int i, j, rt;

    intheight = scr->height, width = scr->width;

    intfrate = scr->frate;//重繪的幀頻率   

                            //每次都等一下for (;;sleep_ms(frate)) {

        //開始繪制螢屏rt = screen_draw_snow(scr);

        if (rt)

            continue;

        for(i =0;i

            char* snow = scr->pix + i*width;

            for(j =0; j

                buf[rt++] = snow[j] ? _CHAR_SNOW :'';

            buf[rt++] ='\n';

        }

        buf[rt -1] ='\0';

        //正式繪制到螢屏上        puts(buf);

        //清空老螢屏,螢屏游標回到最上面        __curup(height);

    }

}#undef_CHAR_SNOW/**

* 螢屏繪制影片效果, 繪制雪花影片

*

* struct screen* : 螢屏結構指標*/voidscreen_flash_snow(structscreen* scr)

{

    char* buf = NULL;

    // 初始化亂數種子,改變雪花軌跡    srand((unsigned)time(NULL));

    buf =malloc(sizeof(char)*(scr->width +1)*scr->height);

    if(NULL == buf) {

        cerr("[FATAL]Out of memory!");

        exit(EXIT_FAILURE);

    }

    __flash_snow_buffer(scr, buf);

    //1.這里理論上不會執行到這,沒加控制器. 2.對于buf=NULL,這種代碼 可以省掉,看編程習慣free(buf);

    buf = NULL;

}

 

 

后記

     到這里就結束了,這次分享的比較簡單,有興趣的同學可以 看看, 推薦寫一遍. 代碼看不懂的時候,多歇歇,看得懂的時候,多寫寫,

就有套路了. 歡迎吐槽. 錯誤是在所難免的.

     這個冬天,雪花很美,(,⌒?⌒)

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/199990.html

標籤:C++

上一篇:Django筆記:Redis鍵值對資料庫

下一篇:知識點回顧——C語言知識點復習梳理,看看你是不是都完全掌握了

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more