很酷的c語言,有意思的C語言

本文目錄一覽:

超酷的C語言

C語言常常讓人覺得它所能表達的東西非常有限。它不具有類似第一級函數和模式匹配這樣的高級功能。但是C非常簡單,並且仍然有一些非常有用的語法技巧和功能,只是沒有多少人知道罷了。

一、指定的初始化

很多人都知道像這樣來靜態地初始化數組:

C99標準實際上支持一種更為直觀簡單的方式來初始化各種不同的集合類數據(如:結構體,聯合體和數組)。

二、數組

我們可以指定數組的元素來進行初始化。這非常有用,特別是當我們需要根據一組#define來保持某種映射關係的同步更新時。來看看一組錯誤碼的定義,如:

現在,假設我們想為每個錯誤碼提供一個錯誤描述的字元串。為了確保數組保持了最新的定義,無論頭文件做了任何修改或增補,我們都可以用這個數組指定的語法。

這樣就可以靜態分配足夠的空間,且保證最大的索引是合法的,同時將特殊的索引初始化為指定的值,並將剩下的索引初始化為0。

三、結構體與聯合體

用結構體與聯合體的欄位名稱來初始化數據是非常有用的。假設我們定義:

然後我們這樣初始化struct point:

當我們不想將所有欄位都初始化為0時,這種作法可以很容易的在編譯時就生成結構體,而不需要專門調用一個初始化函數。

對聯合體來說,我們可以使用相同的辦法,只是我們只用初始化一個欄位。

四、宏列表

C中的一個慣用方法,是說有一個已命名的實體列表,需要為它們中的每一個建立函數,將它們中的每一個初始化,並在不同的代碼模塊中擴展它們的名字。這在Mozilla的源碼中經常用到,我就是在那時學到這個技巧的。例如,在我去年夏天工作的那個項目中,我們有一個針對每個命令進行標記的宏列表。其工 作方式如下:

它定義了一個FLAG_LIST宏,這個宏有一個參數稱之為 _ ,這個參數本身是一個宏,它能夠調用列表中的每個參數。舉一個實際使用的例子可能更能直觀地說明問題。假設我們定義了一個宏DEFINE_FLAG,如:

對FLAG_LIST(DEFINE_FLAG)做擴展能夠得到如下代碼:

接著,對每個參數都擴展DEFINE_FLAG宏,這樣我們就得到了enum如下:

接著,我們可能要定義一些訪問函數,這樣才能更好的使用flag列表:

一步步的展示其過程是非常有啟發性的,如果對它的使用還有不解,可以花一些時間在gcc –E上。

五、編譯時斷言

這其實是使用C語言的宏來實現的非常有「創意」的一個功能。有些時候,特別是在進行內核編程時,在編譯時就能夠進行條件檢查的斷言,而不是在運行時進行,這非常有用。不幸的是, C99標準還不支持任何編譯時的斷言。

但是,我們可以利用預處理來生成代碼,這些代碼只有在某些條件成立時才會通過編譯(最好是那種不做實際功能的命令)。有各種各樣不同的方式都可以做到這一點,通常都是建立一個大小為負的數組或結構體。最常用的方式如下:

如果(condition)計算結果為一個非零值(即C中的真值),即! (condition)為零值,那麼代碼將能順利地編譯,並生成一個大小為零的結構體。如果(condition)結果為0(在C真為假),那麼在試圖生成一個負大小的結構體時,就會產生編譯錯誤。

它的使用非常簡單,如果任何某假設條件能夠靜態地檢查,那麼它就可以在編譯時斷言。例如,在上面提到的標誌列表中,標誌集合的類型為uint32_t,所以,我們可以做以下斷言:

它擴展為:

現在,假設Total=32。那麼-!(Total = 32)等於0,所以這行代碼相當於:

這是一個合法的C代碼。現在假設標誌不止32個,那麼-!(Total = 32)等於-1,所以這時代碼就相當於:

因為位寬為負,所以可以確定,如果標誌的數量超過了我們指派的空間,那麼編譯將會失敗。

C語言程序。

#include “stdio.h”

int main()

{int c;

 scanf(“%d”,c);

 switch(c)

 {

  case 1:printf(“我很酷\n”);break;

  case 2:printf(“我是超級賽亞人\n”);break;

  case 3:printf(“我是最棒的\n”);break;

  case 4:printf(“我們都是善良的好孩子\n”);break;

  default:printf(“Error\n”);

 }

 return 0;

}

用C語言如何編寫推箱子,給個思路唄

#includestdio.h

#include conio.h

#include windows.h

#define R 2//小人

#define B 4//箱子

#define O 3//目的地

#define W 43//牆

#define RO 5//箱子與人重合

#define BO 6//箱子與目的地重合

#define Size 13//數組大小

int main ()

{

printf (“推箱子(1~10關):\nwasd或↑↓←→控制方向。n下一關。r重新開始。\n請注意輸入法是否為小寫英文輸入\n”);

system (“pause”);

MessageBox (NULL,”第一關”,” “,MB_OK);//第一關

int move (char a[Size][Size]);

char a[Size][Size]={0};

int i,j;

void all0 (char a[Size][Size]);

NO1:

all0 (a);

for (i=3;i6;i++)

a[0][i]=W;

a[1][3]=W;

a[1][5]=W;

for (i=0;i4;i++)

a[2][i]=W;

a[2][5]=W;

a[3][0]=W;

for (i=0;i3;i++)

a[4][i]=W;

a[4][7]=W;

for (i=5;i8;i++)

{

a[3][i]=W;

a[i][2]=W;

a[i][4]=W;

a[5][i]=W;

}

a[7][3]=W;

a[1][4]=O;

a[3][1]=O;

a[4][6]=O;

a[6][3]=O;

a[3][2]=B;

a[3][4]=B;

a[4][4]=B;

a[5][3]=B;

a[4][3]=R;

if (move (a))

{

printf (“WIN\n”);

system (“pause”);

}

else

goto NO1;

MessageBox (NULL,”第二關”,” “,MB_OK);//第二關

NO2:

all0 (a);

for (i=0;i5;i++)

{

a[i][0]=W;

a[0][i]=W;

a[i][4]=W;

}

a[5][2]=W;

a[4][2]=W;

for (i=4;i9;i++)

a[i][1]=W;

for (i=2;i6;i++)

a[8][i]=W;

a[6][5]=W;

for (i=5;i9;i++)

a[7][i]=W;

for (i=2;i8;i++)

a[i][8]=W;

a[2][7]=W;

for (i=2;i5;i++)

a[i][6]=W;

a[4][5]=W;

a[1][1]=R;

a[2][2]=B;

a[2][3]=B;

a[3][2]=B;

a[3][7]=O;

a[4][7]=O;

a[5][7]=O;

if (move (a))

{

printf (“WIN\n”);

system (“pause”);

}

else

goto NO2;

MessageBox (NULL,”第三關”,” “,MB_OK);//第三關

NO3:

all0 (a);

for (i=1;i8;i++)

a[0][i]=W;

a[1][1]=W;

for (i=7;i10;i++)

a[1][i]=W;

for (i=0;i2;i++)

a[2][i]=W;

for (i=3;i6;i++)

a[2][i]=W;

a[2][9]=W;

a[3][0]=W;

a[3][9]=W;

a[4][0]=W;

a[4][4]=W;

a[4][9]=W;

a[4][8]=W;

a[5][0]=W;

a[5][1]=W;

a[5][4]=W;

a[5][8]=W;

for (i=1;i9;i++)

a[6][i]=W;

a[2][2]=B;

a[3][4]=B;

a[3][2]=R;

a[3][7]=B;

a[4][6]=B;

a[4][2]=O;

a[4][3]=O;

a[5][2]=O;

a[5][3]=O;

if (move (a))

{

printf (“WIN\n”);

system (“pause”);

}

else

goto NO3;

MessageBox (NULL,”第四關”,” “,MB_OK);//第四關

NO4:

all0 (a);

for (i=1;i5;i++)

{a[0][i]=W;a[7][i]=W;}

a[1][1]=W;

a[1][4]=W;

a[2][1]=R;

a[2][2]=B;

a[2][4]=W;

a[3][1]=W;

a[3][2]=B;

a[3][4]=W;

a[3][5]=W;

a[4][1]=W;

for (i=1;i8;i++)

a[i][0]=W;

a[4][3]=B;

a[5][2]=B;

a[5][1]=O;

a[6][1]=O;

a[6][2]=O;

a[6][3]=BO;

a[6][4]=O;

for (i=1;i4;i++)

a[i][4]=W;

for (i=3;i8;i++)

a[i][5]=W;

if (move (a))

{

printf (“WIN\n”);

system (“pause”);

}

else

goto NO4;

MessageBox (NULL,”第五關”,” “,MB_OK);//第五關

NO5:

all0 (a);

for (i=1;i6;i++)

a[0][i]=W;

for (i=1;i4;i++)

a[i][1]=W;

for (i=3;i8;i++)

a[i][0]=W;

for (i=1;i8;i++)

a[7][i]=W;

for (i=4;i7;i++)

{a[1][i]=W;a[i][1]=O;}

for (i=3;i7;i++)

a[i][7]=W;

a[2][6]=W;

a[3][6]=W;

a[1][2]=R;

a[2][3]=B;

a[3][2]=W;

a[4][2]=W;

a[3][4]=W;

a[4][4]=W;

a[5][5]=W;

a[5][2]=B;

a[6][5]=B;

if (move (a))

{

printf (“WIN\n”);

system (“pause”);

}

else

goto NO5;

MessageBox (NULL,”第六關”,” “,MB_OK);//第六關

NO6:

all0 (a);

for (i=1;i8;i++)

a[i][0]=W;

for (i=7;i11;i++)

a[i][1]=W;

for (i=1;i4;i++)

{a[1][i]=W;a[i][9]=W;}

for (i=3;i10;i++)

a[0][i]=W;

for (i=3;i8;i++)

a[i][10]=W;

for (i=7;i11;i++)

a[i][12]=W;

a[7][11]=W;

for (i=2;i13;i++)

a[10][i]=W;

for (i=3;i6;i++)

{a[i][2]=W;a[8][i]=W;}

for (i=5;i8;i++)

{a[2][i]=W;a[i][8]=W;}

a[3][4]=W;

a[6][3]=W;

a[4][7]=W;

a[7][6]=W;

a[9][8]=W;

a[9][7]=W;

a[2][4]=O;

a[6][2]=O;

a[4][8]=O;

a[8][6]=O;

a[4][4]=B;

a[4][6]=B;

a[5][5]=BO;

a[6][4]=B;

a[6][6]=B;

a[8][11]=R;

if (move (a))

{

printf (“WIN\n”);

system (“pause”);

}

else

goto NO6;

MessageBox (NULL,”第七關”,” “,MB_OK);//第七關

NO7:

all0 (a);

for (i=3;i10;i++)

a[0][i]=W;

for (i=1;i6;i++)

a[i][2]=W;

for (i=5;i8;i++)

a[i][0]=W;

a[5][1]=W;

a[1][3]=W;

a[6][0]=W;

for (i=0;i9;i++)

a[7][i]=W;

a[5][8]=W;

a[6][8]=W;

for (i=1;i6;i++)

a[i][9]=W;

a[1][6]=W;

a[2][6]=W;

a[4][5]=W;

a[4][6]=W;

a[5][6]=W;

a[3][3]=B;

a[3][5]=B;

a[3][7]=B;

a[4][4]=B;

a[5][4]=B;

a[1][8]=R;

for (i=1;i6;i++)

a[6][i]=O;

if (move (a))

{

printf (“WIN\n”);

system (“pause”);

}

else

goto NO7;

MessageBox (NULL,”第八關”,” “,MB_OK);//第八關

NO8:

all0 (a);

for (i=3;i9;i++)

a[0][i]=W;

for (i=1;i4;i++)

a[1][i]=W;

a[2][1]=W;

a[1][8]=W;

a[2][8]=W;

for (i=2;i6;i++)

a[i][0]=W;

for (i=1;i6;i++)

a[5][i]=W;

for (i=2;i5;i++)

a[i][9]=W;

for (i=4;i7;i++)

a[i][8]=W;

for (i=5;i9;i++)

a[6][i]=W;

a[2][5]=W;

a[2][6]=W;

a[2][4]=B;

a[3][3]=B;

a[3][5]=B;

a[4][4]=B;

a[4][6]=B;

a[3][8]=R;

a[3][1]=O;

a[4][1]=O;

for (i=2;i5;i++)

a[i][2]=O;

if (move (a))

{

printf (“WIN\n”);

system (“pause”);

}

else

goto NO8;

MessageBox (NULL,”第九關”,” “,MB_OK);//第九關

NO9:

all0 (a);

for (i=1;i10;i++)

{a[0][i]=W;a[8][i]=W;}

for (i=1;i6;i++)

{a[i][1]=W;a[i][9]=W;}

for (i=5;i9;i++)

{a[i][0]=W;a[i][10]=W;}

for (i=4;i7;i++)

{a[3][i]=W;a[4][i]=O;a[5][i]=O;}

a[1][4]=W;

a[1][5]=W;

a[4][3]=W;

a[5][3]=W;

a[4][7]=W;

a[5][7]=W;

a[7][6]=W;

a[2][5]=B;

a[3][2]=B;

a[3][8]=B;

a[6][2]=B;

a[6][5]=B;

a[6][8]=B;

a[7][8]=R;

if (move (a))

{

printf (“WIN\n”);

system (“pause”);

}

else

goto NO9;

MessageBox (NULL,”第十關”,” “,MB_OK);//第十關

NO10:

all0 (a);

for (i=2;i8;i++)

a[0][i]=W;

a[1][2]=W;

for (i=0;i2;i++)

a[2][i]=W;

for (i=3;i6;i++)

a[i][0]=W;

for (i=1;i4;i++)

a[5][i]=W;

for (i=3;i7;i++)

a[6][i]=W;

for (i=1;i5;i++)

a[i][7]=W;

a[4][6]=W;

a[5][6]=W;

a[3][1]=R;

for (i=3;i6;i++)

{a[2][i]=B;a[4][i]=O;}

a[3][3]=B;

a[3][4]=O;

a[3][5]=O;

a[4][2]=B;

if (move (a))

{

printf (“WIN\n”);

system (“pause”);

}

else

goto NO10;

MessageBox(NULL,”恭喜您通關了。”,” “,MB_OK);

return 0;

}

int move (char a[Size][Size])//控制小人的移動

{

int condition (char a [Size][Size],int x,int y,int b,int c,int d,int e);

void print ( char a [Size][Size]);

int x,y;

char c;

int i,j;

for (i=0;iSize;i++)//給小人定位

for (j=0;jSize;j++)

if (a[i][j]==R)

{ x=i;y=j; }

print (a);

loop:

c=getch();

if (c==0)//如果是鍵盤上下左右鍵用掃描碼

c=getch();

switch(c)

{

case ‘n’:

case ‘N’: return 1;//下一關

case ‘r’:

case ‘R’: return 0;//返回0,重新開始

case ‘w’:

case ‘W’:

case  72: if (condition(a,x,y,x-1,y,x-2,y))x=x-1;break;//上

case ‘a’:

case ‘A’:

case  75: if (condition(a,x,y,x,y-1,x,y-2))y=y-1;break;//下

case ‘s’:

case ‘S’:

case  80: if (condition(a,x,y,x+1,y,x+2,y))x=x+1;break;//左

case ‘d’:

case ‘D’:

case  77: if (condition(a,x,y,x,y+1,x,y+2))y=y+1;break;//右

default : goto loop;

}

print (a);

for (i=0;iSize;i++)//用是否存在箱子作勝利條件

for (j=0;jSize;j++)

if (a[i][j]==B)

goto loop;

return 1;

}

void print ( char a [Size][Size])//輸出數組函數

{

int i,j;

system (“cls”);//清屏函數

for (i=0;iSize;i++)

{

for (j=0;jSize;j++)

if (a[i][j]!=0)

printf (“%2c”,a[i][j]);

else

printf (”  “);

printf (“\n”);

}

printf (“\n”);

}

int condition (char a [Size][Size],int x,int y,int b,int c,int d,int e)//小人移動後的情況處理

{

if (a[b][c]!=W)

{

if (a[x][y]==Ra[b][c]==0)

{a[x][y]=0;a[b][c]=R;return 1;}

if (a[x][y]==ROa[b][c]==0)

{a[x][y]=O;a[b][c]=R;return 1;}

if ((a[x][y]==R||a[x][y]==RO)(a[b][c]==B||a[b][c]==BO)(a[d][e]==B||a[d][e]==BO||a[d][e]==W))

return 0;

if (a[x][y]==Ra[b][c]==O)

{a[x][y]=0;a[b][c]=RO;return 1;}

if (a[x][y]==ROa[b][c]==O)

{a[x][y]=O;a[b][c]=RO;return 1;}

if (a[x][y]==Ra[b][c]==Ba[d][e]==O)

{a[x][y]=0;a[b][c]=R;a[d][e]=BO;return 1;}

if (a[x][y]==Ra[b][c]==Ba[d][e]==0)

{a[x][y]=0;a[b][c]=R;a[d][e]=B;return 1;}

if (a[x][y]==Ra[b][c]==BOa[d][e]==0)

{a[x][y]=0;a[b][c]=RO;a[d][e]=B;return 1;}

if (a[x][y]==Ra[b][c]==BOa[d][e]==O)

{a[x][y]=0;a[b][c]=RO;a[d][e]=BO;return 1;}

if (a[x][y]==ROa[b][c]==Ba[d][e]==O)

{a[x][y]=O;a[b][c]=R;a[d][e]=BO;return 1;}

if (a[x][y]==ROa[b][c]==Ba[d][e]==0)

{a[x][y]=O;a[b][c]=R;a[d][e]=B;return 1;}

if (a[x][y]==ROa[b][c]==BOa[d][e]==O)

{a[x][y]=O;a[b][c]=RO;a[d][e]=BO;return 1;}

if (a[x][y]==ROa[b][c]==BOa[d][e]==0)

{a[x][y]=O;a[b][c]=RO;a[d][e]=B;return 1;}

}

return 0;

}

void all0 (char a[Size][Size])//數組成員歸為0

{

int i,j;

for (i=0;iSize;i++)

for (j=0;jSize;j++)

a[i][j]=0;

}

原創文章,作者:FQZG,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/147076.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FQZG的頭像FQZG
上一篇 2024-11-01 14:05
下一篇 2024-11-01 14:05

相關推薦

  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28
  • Python基礎語言

    Python作為一種高級編程語言擁有簡潔優雅的語法。在本文中,我們將從多個方面探究Python基礎語言的特點以及使用技巧。 一、數據類型 Python基礎數據類型包括整數、浮點數、…

    編程 2025-04-28

發表回復

登錄後才能評論