㈠ 誰給我解釋下c語言中變數的生命周期

函數內部, 不帶static修飾的, 是局部變數.比如你說的j.
這種,生命周期是從定義位置, 到作用域結束.
函數內部 帶static的是靜態局部變數.
函數外部 帶static的是靜態全局變數. 帶extern的是外部全局變數. 不帶的 是全局變數.
靜態局部變數以及所有的全局變數, 生命周期都是整個程序運行時間.

㈡ 用C語言模擬生命

什麼東西來的?這個生命能吃飯的么?

㈢ c語言的變數定義

C語言中變數遵循「先定義後使用」的原則:

1、定義變數的格式:數據類型 變數名;

首先要強調的一點是:變數的定義是一條語句,每條語句都是以分號結尾的。故定義完變數,後面不要漏掉「;」分號。

在變數定義中,「數據類型」表示想要存儲什麼類型的數據就定義什麼類型的變數。

如想要存儲整數就定義成 int 型;想要存儲小數就定義成 float 型或 double 型;想要存儲字元就定義成 char 型等等。

「變數名」就是你想給這個變數起個什麼名字,通常都是用字母、數字與下劃線組合而成。比如:

「int i;double price;double goods_price2」等等。

就表示定義了一個整型變數 i、小數型變數price、goods_price2;

2、變數定義完成後,接下來就是使用變數,為變數賦值。

將一個值放到一個變數中,這個動作叫「賦值」。通俗點講,「給變數賦值」意思就是將一個值傳給一個變數。

賦值的格式是:

變數名 = 要賦的值;

它的意思是將=右邊的數字賦給左邊的變數。比如:
i = 3;
這就表示將 3 賦給了變數 i,此時 i 就等於 3 了。

3、變數的定義和賦值,可以分成兩步寫,也可以將它們合成一步,而且事實上,在實際編程中用得最多的也是合二為一的寫法。

形式如下:

數據類型 變數名 = 要賦的值;

比如:int i = 3;

就表示定義了一個變數 i,並把 3 賦給這個變數。它與

int i;
i =3;

是等價的。

在定義變數時也可以一次性定義多個變數,比如:

int i, j;

這就表示定義了變數 i 和 j。這里需要強調的是,當同時定義多個變數時,變數之間是用逗號隔開的,千萬別寫成分號。這是很多新手最容易犯的錯誤,即將逗號和分號記混了。

同樣也可以在定義多個變數的同時給它們賦值:

int i = 3, j = 4;

中間還是用逗號隔開,最後別忘記輸入分號。

最後需要注意的是,在較老的 C89/C90 標准(也稱 ANSI C 標准)中,變數只能在程序的開頭定義,或者說變數定義的前面不能有其他非聲明或非定義的語句。

(3)c語言加生命擴展閱讀:

在主回答中,提到了變數定義時,變數名通常都是用字母、數字與下劃線組合而成,但是實際上,變數名也不是隨便組合的,變數定義需要遵循一定的規范,否則容易產生歧義,影響整體程序代碼 的可讀性。

所以在定義變數的時候,要注意以下命名規范:

(1)、變數名的開頭必須是字母或下劃線,不能是數字。實際編程中最常用的是以字母開頭,而以下劃線開頭的變數名是系統專用的。命名應當直觀且可以拼讀,可望文知意,便於記憶和閱讀。

標識符最好採用英文單詞或其組合,不允許使用拼音。程序中的英文單詞一般不要太復雜,用詞應當准確。

(2)、變數名中的字母是區分大小寫的。比如 a 和 A 是不同的變數名,num 和 Num 也是不同的變數名。當標識符由多個片語成時,每個詞的第一個字母大寫,其餘全部小寫。

比如: int CurrentVal;

這樣的名字看起來比較清晰,遠比一長串字元好得多。

(3)、變數名絕對不可以是C語言關鍵字,不能有空格。

(4)、變數名的長度應當符合「min-length && max-information」原則。

C 是一種簡潔的語言, 命名也應該是簡潔的。例如變數名MaxVal 就比MaxValueUntilOverflow 好用。標識符的長度一般不要過長,較長的單詞可通過去掉「母音」形成縮寫。

另外,英文詞盡量不縮寫,特別是非常用專業名詞,如果有縮寫,在同一系統中對同一單詞必須使用相同的表示法,並且註明其意思。

㈣ 生命游戲c語言代碼

黑白棋游戲#include"graphics.h"/*圖形系統頭文件*/#defineLEFT0x4b00/*游標左鍵值*/#defineRIGHT0x4d00/*游標右鍵值*/#defineDOWN0x5000/*游標下鍵值*/#defineUP0x4800/*游標上鍵值*/#defineESC0x011b/*ESC鍵值*/#defineENTER0x1c0d/*回車鍵值*/inta[8][8]={0},key,score1,score2;/*具體分數以及按鍵與存放棋子的變數*/charplayone[3],playtwo[3];/*兩個人的得分轉換成字元串輸出*/voidplaytoplay(void);/*人人對戰函數*/voidDrawQp(void);/*畫棋盤函數*/voidSetPlayColor(intx);/*設置棋子第一次的顏色*/voidMoveColor(intx,inty);/*恢復原來棋盤狀態*/intQpChange(intx,inty,intz);/*判斷棋盤的變化*/voidDoScore(void);/*處理分數*/voidPrintScore(intn);/*輸出成績*/voidplayWin(void);/*輸出勝利者信息*//******主函數*********/voidmain(void){intgd=DETECT,gr;initgraph(&gd,&gr,"c:\\tc");/*初始化圖形系統*/DrawQp();/*畫棋盤*/playtoplay();/*人人對戰*/getch();closegraph();/*關閉圖形系統*/}voidDrawQp()/*畫棋盤*/{inti,j;score1=score2=0;/*棋手一開始得分都為0*/setbkcolor(BLUE);for(i=100;i=64-score1-score2)/*如果嘗試超過空格數則停步*/{MoveColor(x,y);fillellipse(x,y,15,15);break;}elsecontinue;/*如果按鍵無效*/}DoScore();/*分數的改變*/break;/*棋盤變化了,則輪對方走棋*/}else/*已經有棋子就繼續按鍵*/continue;}else/*四個方向按鍵的判斷*/if(key==LEFT&&x>120)/*左方向鍵*/{MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x-=40;fillellipse(x,y,15,15);}elseif(key==RIGHT&&x80)/*右方向鍵*/{MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x+=40;fillellipse(x,y,15,15);}elseif(key==UP&&y>120)/*上方向鍵*/{MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y-=40;fillellipse(x,y,15,15);}elseif(key==DOWN&&y1)/*判斷左邊*/{for(k=j-1;k>=0;k--)if(a[i][k]==a[i][j]||!a[i][k])break;if(a[i][k]!=0&&k>=0){for(kk=j-1;kk>k&&k>=0;kk--){a[i][kk]=a[i][j];fillellipse(120+i*40,120+kk*40,15,15);}if(kk!=j-1)yes=1;}}if(i1)/*判斷上邊*/{for(k=i-1;k>=0;k--)if(a[k][j]==a[i][j]||!a[k][j])break;if(a[k][j]!=0&&k>=0){for(kk=i-1;kk>k&&k>=0;kk--){a[kk][j]=a[i][j];fillellipse(120+kk*40,120+j*40,15,15);}if(kk!=i-1)yes=1;}}if(i>1&&j=0&&kk=0&&kkk&&k>=0;ii--,jj++){a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);}if(ii!=i-1)yes=1;}}if(i1)/*左下*/{for(k=i+1,kk=j-1;k=0;k++,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k=0){for(ii=i+1,jj=j-1;ii1&&j>1)/*左上*/{for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k>=0&&kk>=0){for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--){a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);}if(ii!=i-1)yes=1;}}if(iscore1)/*開始判斷最後的結果*/outtextxy(100,50,"blackwin!");elseif(score2#include#include#include#include#defineLEFT0x4b00#defineRIGHT0x4d00#defineDOWN0x5000#defineUP0x4800#defineESC0x011b#defineSPACE0x3920#defineBILI20#defineJZ4#defineJS3#defineN19intbox[N][N];intstep_x,step_y;intkey;intflag=1;voiddraw_box();voiddraw_cicle(intx,inty,intcolor);voidchange();voidjudgewho(intx,inty);voidjudgekey();intjudgeresult(intx,inty);voidattentoin();voidattention(){charch;window(1,1,80,25);textbackground(LIGHTBLUE);textcolor(YELLOW);clrscr();gotoxy(15,2);printf("游戲操作規則:");gotoxy(15,4);printf("PlayRules:");gotoxy(15,6);printf("1、按左右上下方向鍵移動棋子");gotoxy(15,8);printf("1.PressLeft,Right,Up,DownKeytomovePiece");gotoxy(15,10);printf("2、按空格確定落棋子");gotoxy(15,12);printf("2.PressSpacetoplacethePiece");gotoxy(15,14);printf("3、禁止在棋盤外按空格");gotoxy(15,16);printf("3.");gotoxy(15,18);printf("你是否接受上述的游戲規則(Y/N)");gotoxy(15,20);printf("?[Y/N]:");while(1){gotoxy(60,20);ch=getche();if(ch=='Y'||ch=='y')break;elseif(ch=='N'||ch=='n'){window(1,1,80,25);textbackground(BLACK);textcolor(LIGHTGRAY);clrscr();exit(0);}gotoxy(51,12);printf("");}}voiddraw_box(){intx1,x2,y1,y2;setbkcolor(LIGHTBLUE);setcolor(YELLOW);gotoxy(7,2);printf("Left,Right,Up,DownKEYtomove,Spacetoput,ESC-quit.");for(x1=1,y1=1,y2=18;x1=1;i--)if(box[i][j]==0){draw_circle(step_x,step_y,LIGHTBLUE);break;}if(i18)break;else{for(i=step_x+1,j=step_y;i18)break;step_x=i;judgewho(step_x,step_y);break;}caseDOWN:if((step_y+1)>18)break;else{for(i=step_x,j=step_y+1;j18)break;step_y=j;judgewho(step_x,step_y);break;}caseUP:if((step_y-1)=1;j--)if(box[i][j]==0){draw_circle(step_x,step_y,LIGHTBLUE);break;}if(j=1&&step_x=1&&step_y=1;j--){if(box[j][k]==flag)n1++;elsebreak;}/*水平向右數*/for(j=x,k=y;j=5){return(1);break;}/*垂直向上數*/n1=0;n2=0;for(j=x,k=y;k>=1;k--){if(box[j][k]==flag)n1++;elsebreak;}/*垂直向下數*/for(j=x,k=y;k=5){return(1);break;}/*向左上方數*/n1=0;n2=0;for(j=x,k=y;j>=1,k>=1;j--,k--){if(box[j][k]==flag)n1++;elsebreak;}/*向右下方數*/for(j=x,k=y;j=5){return(1);break;}/*向右上方數*/n1=0;n2=0;for(j=x,k=y;j=1;j++,k--){if(box[j][k]==flag)n1++;elsebreak;}/*向左下方數*/for(j=x,k=y;j>=1,k=5){return(1);break;}return(0);break;}}voidmain(){intgdriver=VGA,gmode=VGAHI;clrscr();attention();initgraph(&gdriver,&gmode,"c:\\tc");/*setwritemode(XOR_PUT);*/flag=1;draw_box();do{step_x=0;step_y=0;/*draw_circle(step_x,step_y,8);*/judgewho(step_x-1,step_y-1);do{while(bioskey(1)==0);key=bioskey(0);judgekey();}while(key!=SPACE&&key!=ESC);}while(key!=ESC);closegraph();}

㈤ 題目24:用C語言演繹「生命游戲」

#include <graphics.h>
main(){
int orgData[100][100],resData[100][100];/*分別記錄每次迭代的初始和結果狀態*/
int nCount,nRows,nCols,i,j,times; /*times記錄迭代次數/*
int GraphDriver=DETECT,GraphMode;
for (i=0;i<100;i++)/*初始化數據,令每一個細胞為生*/
for (j=0;j<100;j++) orgData[i][j]=1;
initgraph(&GraphDriver,&GraphMode,′′′′); /*初始化屏幕顯示*/
setcolor(WHITE);
rectangle(270,190,370,290); /*作顯示邊框*/
for (times=1;times<200;times++){
for (nRows=1;nRows<99;nRows++) {
for (nCols=1;nCols<99;nCols++){
/*計算每一個細胞周圍的活的細胞數*/
nCount=orgData[nRows-1][nCols-1]+orgData[nRows-1][nCols]
+orgData[nRows-1][nCols+1]+orgData[nRows][nCols-1]
+orgData[nRows][nCols+1]+orgData[nRows+1][nCols-1]
+orgData[nRows+1][nCols]+orgData[nRows+1][nCols+1];
switch(nCount){
/*周圍有3個活細胞,該細胞為生,在屏幕上用黑色像素表示*/
case 3: putpixel(nCols+210,120+nRows,BLACK);
resData[nRows][nCols]=1;break;
/*周圍有2個活細胞,該細胞不變,在屏幕顯示也不變*/
case 2: resData[nRows][nCols]=orgData[nRows][nCols];
break;
/*其它情況下,細胞為死,在屏幕上用白色像素表示*/
default:resData[nRows][nCols]=0;
putpixel(nCols+210,120+nRows,WHITE);
}
}
}
for (i=1;i<99;i++)
for (j=1;j<99;j++) orgData[i][j]=resData[i][j];
getch();
}
}

㈥ 如何用c語言編生命游戲程序

寫了這么多,記得追點分啊~~~~~`

這個問題分解為兩部分

1、用什麼方式表示某時刻有哪些細胞是活的
一種簡單的想法是用一個二位數組將某時刻所有的細胞的狀態都記錄下來,不過這樣的內存開銷太大,同時又給細胞網格設定了界限,而且效率也並不高
比較好的做法是用一個線形表int list[][2]來記錄某時刻的所有的活細胞的坐標,同時用一個整數int n記錄當前的活細胞數量

2、如何從某時刻的狀態推導出下一時刻有哪些細胞為活的
根據規則,顯然,某時刻某個細胞是否活著完全取決於前一時刻周圍有多少活著的細胞,以及該時刻該細胞是否活著
因此,推導下一時刻狀態時,根據當前list中的活細胞,可以得到該時刻有哪些細胞是與活細胞相臨的,進而得知這些細胞在該時刻與多少個活細胞相臨,於是可以知道下一時刻有哪些細胞是活的
具體實現時,需要一個能夠儲存坐標並給每個坐標附帶了一個計數器(記錄該坐標的細胞與多少個活細胞相臨)和一個標志(0或1,表示當前該坐標的細胞是活是死)的容器,假設為T,容器T的功能是檢查某個坐標是否在其中,以及向其中添加帶有某個標志某個坐標並將該坐標的計數器清零,以及將某個坐標的計數器累進一

比如,假設已經定義了

struct Container
{
...
};//容器類型
void Clear(Container *T);//清空容器T
int Exist(Container *T,int x,int y);//返回坐標(x,y)是否存在於T中
void Insert(Container *T,int x,int y,int flag);//將標志為flag的坐標(x,y)加入T
void Add(Container *T,int x,int y);//將坐標(x,y)的計數器累加
void Promote(Container *T,int *n,int list[][2]);//將容器中所有計數器值為3的坐標以及所有計數器為2並且標志為1的坐標添加到list中,並將其個數記錄於n

此外,為了方便找出某個坐標的所有相鄰坐標,設置以下方向常量
const int dir[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{-1,1},{1,-1},{-1,-1}};

那麼,從某時刻狀態生成下一時刻狀態的主要代碼如下

...
Container T;
int i,j;
...
Clear(&T);
for (i=0;i<n;i++) Insert(&T,list[i][0],list[i][1],1);
for (i=0;i<n;i++)
for (j=0;j<8;j++)
{
int x,y;
x=list[i][0]+dir[j][0];
y=list[i][1]+dir[j][1];
if (!Exist(&T,x,y)) Insert(&T,x,y,0);
Add(&T,x,y);
}
Promote(&T,&n,list);
...

關於容器T如何實現,一種簡單的思路是用線形表並將元素有序記錄,不過這樣的查找/插入效率難以兼顧
用哈希表的話,最後的Promote很難實現
塊狀鏈表可以兼顧查找與插入的效率,但是寫起來太惡心,效率也不是特別高
個人認為,最佳的解決方案是用平衡二叉搜索樹,常見的AVL樹或者紅黑樹什麼的,不過寫起來也太麻煩。
這里強烈推薦Size Balanced Tree,由中國一位現在讀高二的高中生所發明,原理清晰,效率高,實現簡單

㈦ 求C語言命令行程序的「生命游戲」代碼

I don't know的這個答案在網上隨處可見,而且並不符合樓主的要求。
這個程序並不復雜,用1個2維數組來保存列表的信息,用2個循環嵌套來遍歷數組中的每個元素,然後計算每個元素周圍共有多少個'*',並根據規則為這個元素重新賦值。計算每個元素周圍'*'的數量我是用2個循環嵌套來實現的,因為不象I don't know給出的程序那樣邊緣的元素不參與變化,所以需要判斷是否會超出范圍。

#include <stdio.h>

void input(char [][21],int,int);
void output(char [][21],int);
int trans(char [][21],int,int);

int main()
{
int row,col,ret,i;
char tab[20][21];

for(;;)
{
printf("輸入行數和列數(行,列):");
ret=scanf("%d,%d",&row,&col);
if(ret==2 && (9<=row && row<=20) && (9<=col && col<=20))
break;
else
printf("輸入錯誤!請重新輸入!\n");
fflush(stdin);
}
input(tab,row,col);
for(i=0;i<10;i++)
{
if(trans(tab,row,col))
output(tab,row);
else
break;
}
return 0;
}

void input(char tab[][21],int row,int col)
{
int i,j,c;

for(c=0;c!=col;)
{
printf("輸入列表:\n");
for(i=0;i<row;i++)
{
scanf("%s",tab[i]);
for(c=j=0;tab[i][j];j++)
{
if(tab[i][j]=='*' || tab[i][j]=='.')
c++;
else
break;
}
if(c!=col)
{
printf("輸入錯誤!請重新輸入!\n");
break;
}
}
fflush(stdin);
}
}

void output(char tab[][21],int row)
{
int i;

printf("輸出列表:\n");
for(i=0;i<row;i++)
printf("%s\n",tab[i]);
}

int trans(char tab[][21],int row,int col)
{
int i,j,x,y,c,change=0;
char t[20][20];

for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
for(c=0,x=i-1;x<=i+1;x++)
{
if(x<0 || x>=row)
continue;
for(y=j-1;y<=j+1;y++)
{
if(y<0 || y>=col || (x==i && y==j))
continue;
if(tab[x][y]=='*')
c++;
}
}
t[i][j]=(c==3 || tab[i][j]=='*' && c==2)?'*':'.';
if(tab[i][j]!=t[i][j])
change=1;
}
}
for(i=0;i<row;i++)
for(j=0;j<col;j++)
tab[i][j]=t[i][j];
return change;
}

㈧ c語言生命還能繼續存在多久

C語言是目前世界上流行、使用非常廣泛的高級程序設計語言,有非常強的生命力
1) C語言對操作系統和系統使用程序以及需要對硬體進行操作的場合,用C語言明顯優於其它高級語言,許多大型應用軟體都是用C語言編寫的。

2)C語言具有繪圖能力強,可移植性,並具備很強的數據處理能力,因此適於編寫系統軟體,三維,二維圖形和動畫它是數值計算的高級語言。
常用的編譯軟體有Microsoft Visual C++,Borland C++,Watcom C++ ,Borland C++ ,Borland C++ Builder,Borland C++ 3.1 for DOS,Watcom C++ 11.0 for DOS,GNU DJGPP C++ ,Lccwin32 C Compiler 3.1,Microsoft C,High C,TurboC等等......
C語言的特點

1. 簡潔緊湊、靈活方便

C語言一共只有32個關鍵字,9種控制語句,程序書寫自由,主要用小寫字母表示。它把高級語言的基本結構和語句與低級語言的實用性結合起來。 C 語言可以象匯編語言一樣對位、位元組和地址進行操作, 而這三者是計算機最基本的工作單元。

2. 運算符豐富

C的運算符包含的范圍很廣泛,共有種34個運算符。C語言把括弧、賦值、強制類型轉換等都作為運算符處理。從而使C的運算類型極其豐富表達式類型多樣化,靈活使用各種運算符可以實現在其它高級語言中難以實現的運算。

3. 數據結構豐富

C的數據類型有:整型、實型、字元型、數組類型、指針類型、結構體類型、共用體類型等。能用來實現各種復雜的數據類型的運算。並引入了指針概念,使程序效率更高。另外C語言具有強大的圖形功能, 支持多種顯示器和驅動器。且計算功能、邏輯判斷功能強大。

4. C是結構式語言

結構式語言的顯著特點是代碼及數據的分隔化,即程序的各個部分除了必要的信息交流外彼此獨立。這種結構化方式可使程序層次清晰, 便於使用、維護以及調試。C語言是以函數形式提供給用戶的,這些函數可方便的調用,並具有多種循環、條件語句控製程序流向,從而使程序完全結構化。

5. C語法限制不太嚴格、程序設計自由度大

一般的高級語言語法檢查比較嚴,能夠檢查出幾乎所有的語法錯誤。而C語言允許程序編寫者有較大的自由度。

6. C語言允許直接訪問物理地址,可以直接對硬體進行操作

因此既具有高級語言的功能,又具有低級語言的許多功能,能夠象匯編語言一樣對位、位元組和地址進行操作,而這三者是計算機最基本的工作單元,可以用來寫系統軟體。

7. C語言程序生成代碼質量高,程序執行效率高

一般只比匯編程序生成的目標代碼效率低10へ20%。

8. C語言適用范圍大,可移植性好

9. C語言有一個突出的優點就是適合於多種操作系統, 如DOS,UNIX,linux,也適用於多種機型。

當然,C語言也有自身的不足,比如:C語言的語法限制不太嚴格,對變數的類型約束不嚴格,影響程序的安全性,對數族下標越界不作檢查等。從應用的角度,C語言比其他高級語言較難掌握。

總之,C語言既有高級語言的特點,又具有匯編語言的特點;既是一個成功的系統設計語言,有時一個使用的程序設計語言;既能用來編寫不依賴計算機硬體的應用程序,又能用來編寫各種系統程序;是一種受歡迎、應用廣泛的程序設計語言。

未來軟體會向開源方向發展,而象linux這樣優秀的個人操作系統,unix這樣用於商業的安全系統都是開源的,c在這些平台很多有點都能充分體現出來,比如最近發展很好的嵌入式開發,多在linux操作系統下,因為該系統開源,內核便於修改 簡化以適合嵌入式開發

㈨ 修改一個C語言生命游戲程序

去看看main的參數argc argv[]吧。
可以接受傳入的參數。