U8 二维数组的应用

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值