1. 命令行参数的使用
#include<stdio.h>
#include<string.h>
#define true 1
#define false 0
int login(char*(*str)[2] ,const char* account,const char* password)//后两个是命令行输入的参数
{ //指针数组指针 account是指针数组,实际还是数组,所以要用指针数组指针来接
if(strcmp(account,"admin")==0)
{ //account,输入的账号
if(strcmp(password,"123456")==0)
{
printf("welcome admin!\n");
return true;
}
}
for(int i=0;i<4;i++) //2是用户数量,依次匹配
{
if(strcmp(str[i][0],account)==0) //第i个用户的第0列(账号)
{
if(strcmp(str[i][1],password)==0)
{
printf("welcome!\n");
return true;
}
}
}
return false;
}
void SignUp(char*(*str)[2] ,const char* account,const char* password)
{ //注册
for(int i=0;i<4;i++) //注册四个账号
{
if(strcmp(str[i][0],"")==0)
{
str[i][0]=account; //用主函数传过来的参数进行注册
str[i][1]=password;
}
}
}
int main(int argc,char* argv[])
{ //命令行参数,argc命令行参数的数量,包含./1
char* account[4][2]= //定义一个指针的两行两列的二维指针数组
{ //每一个数组元素都是指针
{"zhangsan","1"},
{"lisi","2"},{"",""},{"",""}
};
if(argc!=3)
{
printf("input false numbe!\n");
return 0;
}
if(login(account,argv[1],argv[2])==false) // 注册时不用这四行
{ //argv[0]是./1 argv[1]输入的账号 argv[2]输入的密码
printf("account or password error!\n");
} //
SignUp(account,argv[1],argv[2]);
for(int i=0;i<4;i++)
{
for(int j=0;j<2;j++)
{
printf("%s",account[i][j]);
}
printf("\n");
}
return 0;
}
2. 二维数组应用
a. 杨辉三角
1 1
1 1 1 1
1 2 1 1 2 1
1 3 3 1 1 3 3 1
1 4 6 4 1 1 4 6 4 1
array.c
#include<stdio.h>
#define Size 10
int main()
{
int a[Size][Size]={0}; //要初始化
for(int i=0;i<Size;i++)
{
a[i][0]=1;
a[i][i]=1;
}
for(int i=2;i<Size;i++) //第三行开始输出两数之和
{
for(int j=1;j<i;j++) //第二列开始,第i行有i个数,第一个和第i个是1
{
a[i][j]=a[i-1][j]+a[i-1][j-1];
} //每个数等于自己上面那个数与左上角数之和
}
for(int i=0;i<Size;i++)
{
for(int j=0;j<Size-i;j++) //在打印数字之前,先打印空格,输出成等腰三角形式
{ //size-i个" "然后输出数字
printf(" ");
}
for(int j=0;j<=i;j++) //二维数组的输出
{ //行第i次循环时,列第j次循环的值
printf("%3d ",a[i][j]); //3d是每个数字占三个十进制位
}
printf("\n");
}
return 0;
}
b. 井字棋
#include<stdio.h>
#define Size 3
#define true 1
#define false 0
void InitBoard(char (*Board)[Size])//二维数组传参用数组指针接
{
for(int i=0;i<Size;i++)
{
for(int j=0;j<Size;j++)
{
Board[i][j]=' '; //预留棋子位置
}
}
}
void PrintBoard(char (*Board)[Size])
{
printf("\n");
for(int i=0;i<Size;i++)
{
for(int j=0;j<Size;j++)
{
printf("%c ",Board[i][j]); //输出棋子
if(j!=Size-1)
printf("|");
}
printf("\n");
if(i!=Size-1)
printf("--|--|--\n");
}
} //有返回值,返回下棋的位置成功与否
int MakeMove(char (*Board)[Size],int row,int column,char player) //下棋
{
if(row<0||row>=Size||column<0||column>=Size)
{
printf("Invalid Place!please try again!\n");
return false;
}
if(Board[row][column]!=' ')
{
printf("This place has been placed !try again!\n");
return false;
}
Board[row][column]=player;
return true;
}
int CheckIsWin(char (*Board)[Size],char player)
{
for(int i=0;i<Size;i++)
{
if(Board[i][0]==player && Board[i][1]==player && Board[i][2]==player)
return true;
}
for(int i=0;i<Size;i++)
{
if(Board[0][i]==player && Board[1][i]==player && Board[2][i]==player)
return true;
}
if(Board[0][0]==player && Board[1][1]==player && Board[2][2]==player)
return true;
if(Board[0][2]==player && Board[1][1]==player && Board[2][0]==player)
return true;
}
int CheckIsDraw(char (*Board)[Size]) //平局
{
for(int i=0;i<Size;i++)
{
for(int j=0;j<Size;j++)
{
if(Board[i][j]==' ')
return false;
}
}
return true;
}
int main()
{
char Board[Size][Size]={0};
InitBoard(Board);
char player='X';
while(1)
{
PrintBoard(Board);
printf("player %c please enter your mark:",player);
int row=0,column=0;
scanf("%d %d",&row,&column);
if(MakeMove(Board,row-1,column-1,player)==false)//下错位置重新下
{
continue; //continue关键字:跳过当次循环
}
if(CheckIsWin(Board,player)==true)
{
PrintBoard(Board);
printf("player %c wins!Congratulations!\n",player);
break;
}
if(CheckIsDraw(Board) ==true)
{
PrintBoard(Board);
printf("the result is Draw!Game is over!\n");
break;
}
player=(player=='X'?'O':'X');
}
return 0;
}
c. 五子棋
#include<stdio.h>
#define Size 15
#define true 1
#define false 0
void InitBoard(char (*Board)[Size])
{
for(int i=0;i<Size;i++)
{
for(int j=0;j<Size;j++)
{
Board[i][j]='-'; //预留棋子位置
}
}
}
void PrintBoard(char (*Board)[Size])
{
printf(" "); //最上面数字前面的空格
for(int i=0;i<Size;i++)
{
printf(" %4d",i+1);
}
printf("\n");
for(int i=0;i<Size;i++)
{
printf(" %4d",i+1);
for(int j=0;j<Size;j++)
{
printf("%4c ",Board[i][j]); //输出棋子
}
printf("\n");
}
}
int MakeMove(char (*Board)[Size],int row,int column,char player) //下棋
{
if(row<0||row>=Size||column<0||column>=Size)
{
printf("Invalid Place!please try again!\n");
return false;
}
if(Board[row][column]!='-')
{
printf("This place has been placed !try again!\n");
return false;
}
Board[row][column]=player;
return true;
}
int CheckIsWin(char (*Board)[Size],int row,int column,char player)
{
int direction[4][2]=
{
{1,0},
{0,1},
{1,1},
{-1,1} //四个方向
};
for(int i=0;i<4;i++) //遍历四个方向上的向量
{
int count=1; //五子棋,1是找五个
int dx=row+direction[i][0]; //下一个位置的横坐标
int dy=column+direction[i][1];
while(dx>=0 && dx<Size && dy>=0 && dy<Size && Board[dx][dy]==player)
{
count++; //找到这个玩家的棋子
dx=dx+direction[i][0];//往这边找,加这个方向上的向量direction[i][0]
dy=dy+direction[i][1];
}
dx=row-direction[i][0];
dy=column-direction[i][1]; //反方向找,所以减去该方向上的向量
while(dx>=0 && dx<Size && dy>=0 && dy<Size && Board[dx][dy]==player)
{
count++;
dx=dx-direction[i][0];
dy=dy-direction[i][1];
}
if(count>=5) //是有可能6颗棋子获胜的
{
return true;
}
}
return false;
}
int CheckIsDraw(char (*Board)[Size]) //平局
{
for(int i=0;i<Size;i++)
{
for(int j=0;j<Size;j++)
{
if(Board[i][j]=='-')
return false;
}
}
return true;
}
int main()
{
char Board[Size][Size]={0};
InitBoard(Board);
PrintBoard(Board);
char player='X';
while(1)
{
PrintBoard(Board);
printf("player %c please enter your mark:",player);
int row=0,column=0;
scanf("%d %d",&row,&column);
if(MakeMove(Board,row-1,column-1,player)==false)//下错位置重新下
{
continue; //continue关键字:跳过当次循环
}
if(CheckIsWin(Board,row-1,column-1,player)==true)
{
PrintBoard(Board);
printf("player %c wins!Congratulations!\n",player);
break;
}
if(CheckIsDraw(Board) ==true)
{
PrintBoard(Board);
printf("the result is Draw!Game is over!\n");
break;
}
player=(player=='X'?'O':'X');
}
return 0;
}
3. 函数指针函数
把指向函数的指针作为返回值的就是函数指针函数(函数指针指向的函数)
#include<stdio.h>
typedef int (*MathFunc)(int ,int); //定义一个叫MathFunc的函数指针
int add(int a,int b)
{
return a+b;
}
int sub(int a,int b)
{
return a-b;
}
MathFunc GetMathFunc(char Symbol) //MathFunc 是返回值类型
{
switch(Symbol)
{
case '+':return add;
case '-':return sub;
default:
return NULL;
}
}
int main()
{
char Symbol='+';
MathFunc func=GetMathFunc(Symbol); //GetMathFunc(Symbol)返回的函数赋值给func
if(func !=NULL)
printf("%d\n",func(1,2));
return 0;
}