20160130.CCPP體系詳解(0009天)

程序片斷(01):hanoi.c+漢諾塔.c
內容概要:漢諾塔java

///hanoi.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main01(void)
{
    //int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };//一維數組,代碼塊兒初始化方式(指定)
    //for (int i = 0; i < 10; i++)
    //{
    // printf("%5d", a[i]);//數組的索引都是從0開始的
    //}

    int a[10][3] = { 0 };//二維數組,代碼塊兒初始化方式(統一)
    for (int i = 0; i < 10; i++)
    {//行
        for (int j = 0; j < 3; j++)
        {//列
            printf("%5d", a[i][j]);
        }
        printf("\n");
    }

    system("pause");
}

int main02(void)
{
    int n = 0;
    int a[10][3] = { 0 };//二維數組,代碼塊兒初始化方式(統一)

    scanf("%d", &n);
    for (int i = 0; i < n; i++)//控制
    {//-1的緣由是由於,索引最大爲9,索引最大,賦值卻最小-->索引逆向賦值i=0-->index=10-1-i-->sequence=10-0
        a[10 - 1 - i][0] = n - i;//佈局
    }
    for (int i = 0; i < 10; i++)//控制行
    {
        for (int j = 0; j < 3; j++)//控制列
        {
            printf("%5d", a[i][j]);
        }
        printf("\n");
    }

    system("pause");
}
///漢諾塔.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int hanoiTower[10][3] = { 0 };//二維數組,代碼塊兒初始化(統一形式)

//01.將二維數組的操做採用圖形化方式模擬出來:
// 1.設計操做流程:
// 漢諾塔邏輯實現-->顯示漢諾塔流程-->補充函數說明
// 2.所涉及到的設計模式:
// MVC設計模式(簡化版本)

//漢諾塔輔助程序
void movehanoiTower(char x, char y);//移動漢諾塔的過程中,保留移動痕跡到二維數組(邏輯&數據-->連接起來)
//漢諾塔邏輯實現
void hanoiTowerLogic(unsigned int n, char i, char j, char k);//漢諾塔主邏輯
//顯示漢諾塔流程
void showHanoiTower(int hanoiTower[10][3]);//顯示漢諾塔數據

void moveHanoiTower(char x, char y)
{
    //實質:就是數組當中兩個位置的字符數據之間的交換
    //hanoiTower[imove][m]<--->hanoiTower[jmove][n];
    int m = x - 65;//字符形式轉換爲整數相差形式(間接記憶字符)
    int n = y - 65;
    int imove = -1;
    int jmove = -1;

    for (int i = 0; i < 10; i++)
    {
        if (0 != hanoiTower[i][m])
        {//檢索第一個不爲0的
            imove = i;
            break;
        }
    }

    if (0 == hanoiTower[9][n])
    {
        jmove = 9;
    }
    else
    {
        jmove = 10;
        for (int i = 0; i < 10; i++)
        {
            if (0 != hanoiTower[i][n])
            {
                jmove = i;
                break;
            }
        }
        jmove -= 1;
    }

    //將用於間接記憶字符的整數形式進行交換
    int temp = hanoiTower[imove][m];
    hanoiTower[imove][m] = hanoiTower[jmove][n];
    hanoiTower[jmove][m] = temp;
}

void hanoiTowerLogic(unsigned int n, char i, char j, char k)
{
    if (0 == n)
        return;
    else if (1 == n)
    {
        //printf("%c-->%c \n", i, k);
        moveHanoiTower(i, k);
        showHanoiTower(hanoiTower);
        return;
    }
    hanoiTowerLogic(n - 1, i, k, j);
    //printf("%c-->%c \n", i, k);
    moveHanoiTower(i, k);
    showHanoiTower(hanoiTower);
    hanoiTowerLogic(n - 1, j, i, k);
}

void showHanoiTower(int hanoiTower[10][3])
{
    printf("%5c%5c%5c \n", 'A', 'B', 'C');
    printf("---------------\n");
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            printf("%5d", hanoiTower[i][j]);
        }
        printf("\n");
    }
}

int main(void)
{
    int n = 0;

    scanf("%d", &n);
    for (int i = 0; i < n; i++)//控制
    {
        hanoiTower[n - 1 - i][0] = n - i;//佈局
    }
    hanoiTowerLogic(n, 'A', 'B', 'C');
    showHanoiTower(hanoiTower);


    system("pause");
}

程序片斷(02):QQ.c
內容概要:調戲妹子上QQios

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

int main01(void)
{
    //HWND win = FindWindowA("TXGuiFoundation", "QQ");
    HWND    win = FindWindowA("StandardFrame", "阿里旺旺");

    int i = 0;
    POINT point;
    point.x = point.y = 0;
    time_t te;
    unsigned int seed = (unsigned int)time(&te);
    srand(seed);
    int rnum = 0;

    while (1)
    {
        GetCursorPos(&point);
        rnum = rand() % 4;
        switch (rnum)
        {
        case 0:
            SetWindowPos(win, NULL, point.x - 500, point.y - 500, 0, 0, 1);//1:禁止修改窗體尺寸
            break;
        case 1:
            SetWindowPos(win, NULL, point.x + 500, point.y - 500, 0, 0, 1);
            break;
        case 2:
            SetWindowPos(win, NULL, point.x - 500, point.y + 500, 0, 0, 1);
            break;
        case 3:
            SetWindowPos(win, NULL, point.x + 500, point.y + 500, 0, 0, 1);
            break;
        }

        Sleep(1000);
        ++i;
        if (1000 == i)
            //break;//跳出
            return;//結束
    }
    system("taskkill /f /im iexplore.exe");
    MessageBoxB(0, "發現病毒", "提示信息", 0);

    system("pause");
}

程序片斷(03):模塊.c
內容概要:鬼哭神嚎編程

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
#include <time.h>
#include <process.h>//多線程

//01.如何將一個控制檯應用程序轉換成爲Windows應用程序:
// 控制檯-->Windows:實質就是去掉黑窗口
// 控制檯應用程序-->連接爲-->Windows應用程序(可有Windows窗口,也能夠沒有)
#pragma comment (linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

void setDktopBkgroundPicture(char *path)
{
    SystemParametersInfoA(20, 0, path, 3);
}

void setBkgroundMusic(char *path)
{
    ShellExecuteA(0, "open", path, 0, 0, 0);//0:表明隱藏(最後一個)
}

void setFegroundText(int x, int y, char * text)
{
    HWND win = GetDesktopWindow();//獲取系統窗體(當前程序運行時所顯示的整個窗體)
    HDC dc = GetWindowDC(win);//獲取設備的上下文(以待用於進行設置)
    SetTextColor(dc, RGB(255, 0, 0));
    SetBkColor(dc, RGB(0, 0, 255));

    while (1)
    {
        TextOutA(dc, 300, 400, text, strlen(text));//顯示文本
        Sleep(2000);
    }
}

void bgJpgPicture(void *p)
{
    int rnum = 0;
    char *path[200] = { 0 };
    time_t te;
    unsigned int seed = (unsigned int)time(&te);
    srand(seed);


    while (1)
    {
        rnum = rand() % 9;
        sprintf(path, "C:\\Users\\ZHEN\\Desktop\\TestPictore\\%d.jpg", rnum);
        setDktopBkgroundPicture(path);
        Sleep(1000);
    }
}

void bgMp3Music(void *p)
{
    int rnum = 0;
    char *path[200] = { 0 };
    time_t te;
    unsigned int rseed = (unsigned int)time(&te);
    srand(rseed);

    while (1)
    {
        system("taskkill /f /im mediaplayer.exe");
        rnum = rand() % 4;
        sprintf(path, "C:\\Users\\ZHEN\\Desktop\\TestMp3\\%d.mpe", rnum);
        setBkgroundMusic(path);
        Sleep(10000);
    }
}

void feFontText(void *p)
{
    setFegroundText(50, 50, "i love you!!!");
}

int main01(void)
{
    setDktopBkgroundPicture("C:\\Users\\ZHEN\\Desktop\\TestPicture\\3.jpg");
    setBkgroundMusic("C:\\Users\\ZHEN\\Desktop\\TestMusic\\3.mp3");
    setFegroundText(30, 40, "測試文本");

    //02.開啓多線程執行某一段兒線程任務代碼:
    // _beginthread(arg1, arg2, arg3);
    // arg1:線程任務代碼
    // arg2:棧內存尺寸
    // arg3:線程任務參數
    _beginthread(bgJpgPicture, 0, NULL);
    _beginthread(bgMp3Music, 0, NULL);
    _beginthread(feFontText, 0, NULL);

    system("pause");
}

程序片斷(04):位運算.c
內容概要:打印整數原碼補碼反碼windows

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//01.位運算使用注意事項:
// 1.位運算只是適用於整數的,不適用於實數
// 2.因爲二者的存儲方式不同:
// 整數採起的是補碼進行存儲
// 實數採起的是階碼進行存儲
//02.如何不斷的獲取一個整數的二進制形式的最高位?
// 舉例:原理圖
// 10101010010100 
// & 10000000000000 
// ----------------------
// 10000000000000
// 步驟:執行體
// 0.不斷的判斷是否將整數的32位所有移完
// 1.不斷的將整數進行左移位(<<)運算
// 2.不斷的用1進行按位與(&)運算
//03.如何肯定兩個二進制位進行加法運算以後的對應的二進制位數是多少?
// 舉例:原理圖
// 00 0 0^0-->0
// 01 1 0^1-->1
// 10 1 1^0-->1
// 11 0 1^1-->0
// 異或運算符特性
// 能夠模擬兩個二進制位加法運算以後,所對應的具體二進制位是多少.
//04.正負整數的原碼反碼補碼使用規律:
// 1.內存當中全部的整數都是按照補碼進行存儲的!
// 因此打印全部整數的補碼就等同於直接打印整數的內存存儲形式
// 2.正整數的原碼反碼和補碼相同(就是直接的內存存儲形式)
// 3.負整數的原碼反碼和補碼不相同:
// 補碼:就是直接的內存存儲形式,能夠進行直接打印
// 反碼:就是補碼-1
// 原碼:補碼-->對補碼(求反,再+1)-->獲得原碼(符號位丟失,須要補充符號位)
int main01(void)
{//正整數的原碼
    int inum = 0;
    int num1L31 = 1 << 31;

    scanf("%d", &inum);
    for (int i = 1; i <= 32; i++)
    {
        if (inum & num1L31)
            putchar('1');
        else
            putchar('0');

        if (0 == i % 4)
            printf(" ");

        inum <<= 1;
    }

    system("pause");
}

int main02(void)
{//正負整數的原碼
    int inum = 0;
    int num1L31 = 1 << 31;

    scanf("%d", &inum);
    if (inum < 0)
    {
        //0000 0000 0000 0110 +6:原碼
        //1000 0000 0000 0110 -6:原碼
        //1111 1111 1111 1001 -6:反碼(取反)
        //1111 1111 1111 1010 -6:補碼(加一)
        //0000 0000 0000 0101 -6:補碼(再取反)
        //0000 0000 0000 0110 -6:補碼(再加一)
        //1000 0000 0000 0110 -6:補碼(補符號)
        inum = ~inum + 1;//負數的原碼(符號位丟失)
        inum = inum | num1L31;//補充符號位
    }
    for (int i = 1; i <= 32; i++)
    {
        if (inum & num1L31)
            putchar('1');
        else
            putchar('0');
        if (i % 4 == 0)
            printf(" ");
        inum <<= 1;
    }

    system("pause");
}

int main03(void)
{//正負整數的反碼
    int inum = 0;
    int num1L31 = 1 << 31;

    scanf("%d", &inum);
    if (inum < 0)
    {
        inum = inum - 1;//負整數的反碼
    }
    for (int i = 1; i <= 32; i++)
    {
        if (inum & num1L31)
            putchar('1');
        else
            putchar('0');
        if (0 == i % 4)
            printf(" ");
        inum <<= 1;
    }

    system("pause");
}

程序片斷(05):補碼原碼反碼.c
內容概要:補碼原碼反碼轉換工具設計模式

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//獲取整數(正負整數)的補碼(機器存儲形式)
void binBCode(int inum, char binStr[33])
{
    int num1L31 = 1 << 31;
    for (int i = 1; i <= 32; i++)
    {//1:進來的哪一次就是1-->1~32-->共32個映射對
        if (inum & num1L31)
            binStr[i - 1] = '1';
        else
            binStr[i - 1] = '0';
        inum <<= 1;
    }
}

//獲取整數(正負整數)的反碼
void binFCode(int inum, char binStr[33])
{
    int num1L31 = 1 << 31;

    if (inum < 0)
    {
        --inum;
    }
    for (int i = 1; i <= 32; i++)
    {
        if (inum & num1L31)
            binStr[i - 1] = '1';
        else
            binStr[i - 1] = '0';
        inum <<= 1;
    }
}

//數組的副本(實體數據)拷貝浪費內存,因此數組默認採用傳址(地址)
//獲取整數(正負整數)的原碼
void binYCode(int inum, char binStr[33])
{
    int num1L31 = 1 << 31;

    if (inum < 0)
    {
        inum = ~inum + 1;//負整數的原碼(丟失符號位)
        inum = inum | num1L31;//(補充符號位)
    }
    for (int i = 1; i <= 32; i++)
    {
        if (inum & num1L31)
            binStr[i - 1] = '1';
        else
            binStr[i - 1] = '0';
        inum <<= 1;
    }
}

int main(void)
{
    int inum = 0;
    char strBinY[33] = { 0 };
    char strBinF[33] = { 0 };
    char strBinB[33] = { 0 };

    scanf("%d", &inum);
    binYCode(inum, strBinY);
    printf("%s \n", strBinY);
    binFCode(inum, strBinF);
    printf("%s \n", strBinF);                                                   
    binBCode(inum, strBinB);
    printf("%s \n", strBinB);


    system("pause");
}

程序片斷(06):進制.c
內容概要:進制轉換工具數組

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//01.十進制轉任意進制的原理:
// 十進制 二進制 八進制 十六進制
// 10 /2=5 %2=0 %8=2 %16=10
// 5 /2=2 %2=1 %8=1 0xA
// 2 /2=1 %2=0 012
// 1 /2=0 %2=1
// 1010
// 原理解析完畢:
//02.二進制轉任意進制的原理:
// 十進制:每一個位進行運算
// 八進制:將二進制當中的每3個二進制位當中一個8進制位處理
// 十六進:將二進制當中的每4個二進制位當中一個16進制位處理
void decToBin(int inum, char binStr[33], int i)
{
    if (0 == inum)
        return;
    binStr[i] = inum % 2;
    decToBin(inum / 2, binStr, ++i);
}

int main(void)
{
    char binStr[33] = { 0 };
    decToBin(10, binStr, 1);
    printf("%s", binStr);

    system("pause");
}

//void to2str(int num, int i, char str2[32])
//{
// to2str(num / 2,i+1,str2);//位數向前
// //printf("%d", num % 2);
// str2[i] = (num % 2) + '0';//字符整數的轉換
// }
//
//}
//void to8str(int num, int i, char str8[32])
//{
// if (num == 0)
// {
// return;
// }
// else
// {
// to8str(num / 8,i+1,str8);
// str8[i] = (num % 8) + '0';//字符整數的轉換
// }
//}
//
//void to16str(int num, int i, char str16[32])
//{
// if (num == 0)
// {
// return;
// }
// else
// {
//
// to16str(num / 16,i+1,str16);
// //printf("%x", num % 16);
// if (num % 16<10)
// {
// str16[i] = (num % 16) + '0';//字符整數的轉換
// } 
// else
// {
// //10,11,12,13,14,15
// str16[i] = (num % 16) - 10 + 'A';
// }
//
// 
// //'A' 10
// }
//
//}
//
//void main()
//{
//
// int num = 0;
// char str2[32] = { 0 };
// char str8[32] = {0};
// char str16[32] = {0};
//
//
// scanf("%d", &num);
//
//
// to2str(num,0,str2);
// _strrev(str2);
// printf("\n%s", str2);
//
//
// to8str(num, 0, str8);
// _strrev(str8);
// printf("\n%s", str8);
//
// to16str(num, 0, str16);
// _strrev(str16);
// printf("\n%s", str16);
//
//
// getchar();
// getchar();
//}
//
//void to2(int num)
//{
// if (num==0)
// {
// return;
// } 
// else
// {
//
// to2(num / 2);
// printf("%d", num % 2);
// }
//
//}
//
//void to8(int num)
//{
// if (num == 0)
// {
// return;
// }
// else
// {
//
// to8(num / 8);
// printf("%d", num % 8);
// }
//
//}
//
//void to16(int num)
//{
// if (num == 0)
// {
// return;
// }
// else
// {
/**重點內容**/
// to16(num / 16);
// printf("%x", num % 16);
// }
//
//}
//
//
//void main1()
//{
// int num = 0;
// scanf("%d", &num);
// to2(num);
// printf("\n");
// to8(num);
// printf("\n");
// to16(num);
// getchar();
// getchar();
//}

程序片斷(07):add.c
內容概要:時間編程markdown

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

//01.register&volatile關鍵的使用:
// 1.使用意義不一樣:
// register:標識寄存器變量
// volatile:標識內存變量,強制讀取內存變量
// 特色:register寄存器變量運算較快於volatile內存變量
// 由於其減小了沒必要要的讀取內存時間(讀取過程時間)
// 2.編譯器的優化特色不一樣:
// 若是一個內存變量被頻繁的進行使用,那麼:
// VC編譯器:會自動進行優化操做
// GCC編譯器:不會進行自動優化操做
// 特色:register對GCC有效,對VC可能無效,VC不聽話
// 3.內容總結:
// (1).在程序運行過程中,根據須要到內存中的相應變量存儲
// 單元中進行調用,若是一個變量在程序中頻繁使用,例如循環變量
// 那麼,系統就必須屢次訪問該內存中的變量單元,影響程序的執行效率
// 所以,CCPP語言當中還定義了一種變量,不是保存在內存之中的變量
// 而是直接存儲於CPU內部的寄存器當中,這種變量被稱之爲寄存器變量
// (2).寄存器變量的定義形式爲:
// register 類型標識符 變量名;
// (3).寄存器與機器硬件密切相關,不一樣類型的計算機,寄存器的數目是不同的
// 一般爲2到3個,對於在一個函數中說明的多餘2到3個的寄存器變量,C編譯
// 程序會自動的將寄存器變量變爲自動變量
// (4).寄存器說明符只能用於說明函數中的局部變量和函數中的形參變量,所以
// 不容許將全局變量或者靜態變量說明爲"register"形式.
// VC會自動進行寄存器變量的優化,不能夠對寄存器變量進行取內存地址操做
// GCC須要手動指定,MINGW是GCC編譯器移植到Windows的版本
// C語言寄存器變量不能夠進行取內存地址操做,C++能夠,由於C++會
// 在內存當中給C語言寄存器變量保存一個副本
// 4.特殊特色總結:
// 某些狀況之下的變量必須強制讀內存,由於寄存器變量若是隨時都在變化,而多線程
// 狀況之下每條線程訪問的都是同一個內存變量,若是遲遲不進行讀取內存的操做
// 那麼,寄存器變量的變量不會被映射到內存變量當中,致使數據變化不能及時生效
int main01(void)
{
    time_t start, end;
    time(&start);//獲取開始時刻的時間

    //進行浮點數運算的模擬
    volatile double result = 0;
    //VC會自動將頻繁使用的內存變量優化爲寄存器變量
    for (volatile double i = 0; i < 100000000; i++)
    {
        result += i*1.0;
    }

    time(&end);//獲取結束時刻的時間
    printf("消耗的時間爲:%f \n", difftime(end, start));
}

int main02(void)
{
    time_t start, end;
    time(&start);

    register double result = 0;
    for(register double i = 0; i < 100000000; i++)
    {
        result += i *1.0;
    }

    time(&end);
    printf("消耗時間爲:%f \n", difftime(end, start));
}

//02.測試寄存器變量和內存變量的最佳方式:是經過相同階段的CPU進行測試才能最準確:
// 原理:讓一條線程經過一條執行流處理內存變量和寄存器變量-->這樣的偏差最小
// 省得CPU運算赫茲忽高忽低
int main03(void)
{
    main01();
    main02();//一樣的代碼段兒被加載進內存,若是執行相同的操做CPU也會進行優化操做

    system("pause");
}

程序片斷(08):main.c
內容概要:TestTime多線程

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

int main01(void)
{
  time_t start, end;
  time(&start);

  volatile double result = 0.0;
  volatile int i;//GCC當中的循環變量必須申明在for循環外部
  for (i = 0; i < 100000000; i++)
  {//沒有優化double是內存變量,13s;採起優化double是寄存器變量,3s
    result+=i*1.0;
  }

  time(&end);
  printf("消耗時間爲:%f \n", difftime(end, start));
}

int main02(void)
{
  time_t start, end;
  time(&start);

  register double result = 0.0;
  register int i;
  for (i = 1; i < 100000000; i++)
  {
    result += i*1.0;
  }

  time(&end);
  printf("消耗時間爲:%f \n", difftime(end, start));
}

int main(void)
{
  main01();
  main02();
}

程序片斷(09):run.c+test.c
內容概要:dll調用函數

///run.c
#include <Windows.h>

_declspec(dllexport)  void go()
{
    MessageBoxA(0, "World", "Hello", 0);
}

_declspec(dllexport) int add(int a, int b)
{
    return a + b;
}
///test.c
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

//01.如何獲取函數指針類型?
// 將函數聲明頭的函數名稱替換爲(*函數指針名稱)
// 舉例:void fp();-->void (*fp)();
// fp的類型就是void (*)();
// void go()---->void (*fp1)();
// int add(int a, int b)---->int (*fp2)(int a, int b);
//02.如何使用動態庫?
// 動態庫加載LoadLibraryA();
// 動態庫函數GetProcAddress();
// 動態庫釋放FreeLibrary();

int main01(void)
{
    HMODULE hmod = LoadLibraryA("01.DLL調用.dll");//動態庫加載
    if (NULL == hmod)
    {
        system("echo error load! \n");
    }
    void(*fp1)() = (void(*)())GetProcAddress(hmod, "go");
    int(*fp2)(int a, int b) = (int(*)(int a, int b))GetProcAddress(hmod, "add");
    if (NULL == fp1 || NULL == fp2)
    {
        system("echo error find! \n");
    }
    else
    {
        fp1();
        printf("%d \n", fp2(10, 20));
    }
    FreeLibrary(hmod);//動態庫釋放

    system("pause");
}

程序片斷(10):add.c
內容概要:計算器工具

#include <stdio.h>
#include <stdlib.h>

//01.規律說明:
// 100%7=2
// 100求餘7以後爲2
// 100-(100/7)*7=2
// 100減去整除數*7=2
// 5%3=2
// 73%4=1 73%5=3
// 74%4=2 74%5=4
// 75%4=3 75%5=0
// 73---->0100 1001
// % 4---->0000 0100
//------------------------
// 1 0000 0001

// 74---->0100 1010
// % 4---->0000 0100
//------------------------
// 2 0000 0010

//10-->2
//100-->4
//1000-->8
//10000---16

// 73---->0100 1001
// % 5---->0000 0101
//------------------------
// 3---->0000 0011
int main(void)
{
    unsigned int num = 73;//餘數
    printf("%d \n", num - (num & ~3));

    system("pause");
}

////11 0 1
////10 1 0
////01 1 0
////00 0 0
//
////0011 3 15
////0101 5 16
// //21 +10
////0010 進位
//
////0110 ^ 6
//
////1000 8
//
//int add(int a,int b)
//{
// int wei = 0;
// int jinwei = 0;
//
// do 
// {
// wei = a^b;//處理位加法
// jinwei = (a&b) << 1;//進位
//
// a = wei;//沒有進位的加法
// b = jinwei;//進位
// } while (b!=0);
// return a;
//}
//
//
//int dadd(int a, int b)
//{
// if (b==0)
// {
// return a;
// } 
// else
// {
// int wei = a^b;
// int jinwei = (a&b) << 1;
// dadd(wei, jinwei);
// }
//}
//
//
//void main1()
//{
// printf("%d", dadd(113, 15));
// getchar();
//}

程序片斷(11):go.c
內容概要:最小公倍數最大公約數

#include <stdio.h>
#include <stdlib.h>

//01.最小公倍數和最大公約數:
// 條件:現有兩個整數num1和num2
// 那麼:num1*num2=minGB*maxGY;
// 編程:
// 方式一:
// 假設num1<num2
// 最小公倍數:
// 從兩個整數當中較大的那個整數開始向大數遍歷
// 若是(0==num/num2)&&(0==num/num1)
// 最大公約數:
// 從兩個整數當中較小的那個整數開始向小數遍歷
// 若是(0==num1/num)&&(0==num2/num)
// 方式二:
// 利用:num1*num2=minGB*maxGY

//02.舉例說明特色:
// num1=10;num2=25;
// 10 25 50-->minGB
// 10 25 5--->maxGY
// 原理:展轉相除法
// 10 % 25 = 10; //被除數/除數=餘數
// 25 % 10 = 5; //除數/餘數
// 10 % 5 = 0; //除數/餘數
int maxGY(int i, int j)
{
    if (0 == i % j)
        return j;//跳出
    else
        return maxGY(j, i % j);//遞歸
}

int main01(void)
{
    int a = 25;
    int b = 110;

    printf("%d, %d \n", maxGY(25, 110), 25 * 110 / maxGY(25, 110));

    system("pause");
}

程序片斷(12):猜數字.c
內容概要:猜數字

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <time.h>

//01.健壯的應用程序當中常用abort提示錯誤:
// 1.至關於其它語言當中的異常處理機制模擬
// 2.區分編譯錯誤和運行時異常
// 編譯錯誤:代碼自己存在語法錯誤
// 運行時異常:實在編譯沒有錯誤的狀況之下發生的
int main01(void)
{
    int a, b;

    scanf("%d%d", &a, &b);
    if (b == 0)
    {
        abort();//提示錯誤
    }
    else
    {
        int c = a / b;
    }

    system("pause");
}

int main02(void)
{
    time_t te;
    unsigned int rseed = (unsigned int)time(&te);
    srand(rseed);
    int rnum = rand() % 100 + 1;//1~100
    int gnum = 0;

    while (1)
    {
        scanf("%d", &gnum);
        if (rnum > gnum)
            puts("小了");
        else if (rnum < gnum)
            puts("大了");
        else
        {
            puts("小夥子纔對了! ");
            break;
        }
    }

    //這後面的代碼須要放置於多線程當中運行才行
    int i = 0;//不然限時功能不會生效
    while (1)
    {

        Sleep(1000);
        ++i;
        if (5 == i)
            //abort();//提示錯誤
            //break;//終止循環
            exit(0);//結束程序
    }

    system("pause");
}

程序片斷(13):type.cpp
內容概要:typedef

#include <stdio.h>
#include <stdlib.h>

#include <iostream>//CPP輸入輸入
using namespace std;//使用名稱空間

//01.給任意類型取別名的方式:typedef使用
// 規律:在聲明變量的基礎之上前置typedef關鍵字
// 爲已經存在的類型另起一個別名(原名和別名都有進行使用)
// 只不過typedef具備簡化類型名稱的做用,並且某些地方必須
// 爲類型定義別名,不然沒法進行後續操做
typedef unsigned short int USI;
typedef unsigned long int ULI;

//02.C語言重要知識點歸納:
// 補碼-->遞歸-->邏輯
// 數組-->二維數組地圖-->排序
// 指針-->外掛(函數指針)
// 字符串-->結構體-->內存四區-->文件
//03.CPP語言當中獲取類型的方式:
// typeid(var).name();
// 根據變量名稱獲取變量的所屬類型;
// 而且將該數據類型以字符串的形式打印出來
int main01(void)
{
    unsigned long int num = 10;
    ULI ulinum = 10;
    printf("%s \n", typeid(ulinum).name());//typedef(x).name();根據變量名稱獲取變量所屬的數據類型(字符串表現形式)

    system("pause");
}
相關文章
相關標籤/搜索