变量的作用域
全局变量
- 定义在函数外的变量(一般定义在开头)
- 作用域:在程序的任意位置(定义开始)都能使用
- 生命周期:从定义开始(分配存储空间),到程序结束(释放存储空间)
局部变量
- 定义在某些区域中的变量:
{ }
中或函数的参数列表
函数中还可以嵌套一个
{ }
,所定义的局部变量作用域仅在{ }
中
- 作用域:被定义的
{ }
中 - 生命周期:从定义开始到超出作用域(
{ }
结束) - 变量隐藏:若定义的不同作用域里的变量名字一致,越大作用域的变量被隐藏,使用作用域较小的变量
变量的修饰符
auto(C中):默认的变量修饰符,可以省略,表示变量由系统自动分配空间
signed :默认的变量修饰符,可以省略,表示有符号。
int a 相当于 auto signed int a;
unsigned :无符号数据,最高位是数据位
const:常量修饰符,不能修改不能赋值,一般变量名大写
常量直接量:int 4、double 8、char 4
static:静态变量
static
修饰全局变量时,该全局变量只能在本文件内使用static
修饰局部变量时,变量只会定义初始化一次;且生命周期延长为整个程序,作用域不变
例如写在循环中
for(10) static int a = 0 ; printf ("%d" , a) ; a++;
执行的最后结果为 10
异常处理
- 编译异常报告
错误和警告信息,只检测语法正误
gcc 的编译器优化 :后加 -O0,~,-O4,进行编译优化,使比如说创建但未使用的变量就不进行创建
作业:五子棋
要求:
- 有行列提示
- 落子位置正误判断
- 输赢判断
#include<stdio.h>
const int SIZE=24;
int board[24][24];
char player1chess='O';
char player2chess='X';
char blankchess=' ';
void initboard();
void player1do();
void player2do();
void boardshow();
int wincheck();
void whowin(int);
void whowin(int iswin){
if (iswin==1){
printf("P1 Win!\ncontinue:0/1?\n");
return ;
}
else if (iswin==2){
printf("P2 Win!\ncontinue:0/1?\n");
return ;
}
}
int main(){
int iswin =0;
int choose =0;
while (1)
{
initboard(board);
while (1)
{
boardshow(board);
player1do(board);
boardshow(board);
iswin=wincheck(board);
whowin(iswin);
if(iswin==1||iswin==2){
printf("player%d Win!\ncontinue:0/1?",iswin);
scanf("%d",&choose);
if(choose==1)
break;
else
return 0;
}
player2do(board);
boardshow(board);
iswin=wincheck(board);
whowin(iswin);
if(iswin==1||iswin==2){
printf("player%d Win!\ncontinue:0/1?",iswin);
scanf("%d",&choose);
if(choose==1)
break;
else
return 0;
}
}
}
}
void initboard(){
for (int i = 0; i < SIZE; i++)
{
for (int j = 0; j < SIZE; j++)
{
if(i==0){
board[i][j]=j;
}
else if(j==0){
board[i][j]=i;
}
else
board[i][j]=0;
}
}
}
void boardshow(){
for (int i = 0; i < SIZE; i++)
{
for (int j = 0; j < SIZE; j++)
{
if(i>0&&j>0){
if(board[i][j]==-1)
printf("%3c",player1chess);
else if(board[i][j]==-2)
printf("%3c",player2chess);
else
printf("%3c",blankchess);
}
else
printf("%3d",board[i][j]);
}
printf("\n");
}
}
void player1do(){
int x,y;
while(1){
printf("P1 please play:x,y\n");
scanf("%d %d",&x,&y);
if((x==0||y==0)||(x>23||y>23)){
printf("error!Retry!");
continue;
}
else if(board[y][x]==-1||board[y][x]==-2){
printf("error!Retry!");
continue;
}
else{
board[y][x]=-1;
break;
}
}
}
void player2do(){
int x,y;
while(1){
printf("P2 please play:x,y\n");
scanf("%d %d",&x,&y);
if((x==0||y==0)||(x>23||y>23)){
printf("error!Retry!");
continue;
}
else if(board[y][x]==-1||board[y][x]==-2){
printf("error!Retry!");
continue;
}
else{
board[y][x]=-2;
break;
}
}
}
int wincheck(){
//判断横向可赢
for(int i=1 ; i<SIZE ; i++){
for(int j=1 ; j<SIZE ; j++){
if((board[i][j]==-1)&&(board[i][j]==board[i][j+1]) && (board[i][j]==board[i][j+2]) && (board[i][j]==board[i][j+3]) && (board[i][j]==board[i][j+4]))
return 1;
else if((board[i][j]==-2)&&(board[i][j]==board[i][j+1]) && (board[i][j]==board[i][j+2]) && (board[i][j]==board[i][j+3]) && (board[i][j]==board[i][j+4]))
return 2;
else
continue;
}
}
//判断竖向可赢
for(int i=1 ; i<SIZE ; i++){
for(int j=1 ; j<SIZE ; j++){
if((board[j][i]==-1)&&(board[j][i]==board[j][i+1])&&(board[j][i]==board[j][i+2])&&(board[j][i]==board[j][i+3])&&(board[j][i]==board[j][i+4]))
return 1;
else if((board[j][i]==-2)&&(board[j][i]==board[j][i+1])&&(board[j][i]==board[j][i+2])&&(board[j][i]==board[j][i+3])&&(board[j][i]==board[j][i+4]))
return 2;
else
continue;
}
}
//判断左上到右下可赢
for(int i=1 ; i<SIZE ; i++){
for(int j=1 ; j<SIZE ; j++){
if((board[j][i]==-1)&&(board[j][i]==board[j+1][i+1])&&(board[j][i]==board[j+2][i+2])&&(board[j][i]==board[j+3][i+3])&&(board[j][i]==board[j+4][i+4]))
return 1;
else if((board[j][i]==-2)&&(board[j][i]==board[j+1][i+1])&&(board[j][i]==board[j+2][i+2])&&(board[j][i]==board[j+3][i+3])&&(board[j][i]==board[j+4][i+4]))
return 2;
else
continue;
}
}
//判断左下到右上可赢
for(int i=1 ; i<SIZE ; i++){
for(int j=SIZE-1 ; j>4 ; j--){
if((board[j][i]==-1)&&(board[j][i]==board[j-1][i+1])&&(board[j][i]==board[j-2][i+2])&&(board[j][i]==board[j-3][i+3])&&(board[j][i]==board[j-4][i+4]))
return 1;
else if((board[j][i]==-2)&&(board[j][i]==board[j-1][i+1])&&(board[j][i]==board[j-2][i+2])&&(board[j][i]==board[j-3][i+3])&&(board[j][i]==board[j-4][i+4]))
return 2;
else
continue;
}
}
}