007_stdc_C语言基础
回顾:
   1. continue;  break;  
      跳出一次循环
      break 跳出整循环
2. 多重循环
   3. while  do while
      while(条件)  //循环次数不确定
      {
}
for  带次数的循环
      do  while();  先执行一次循环体里面的语句 在判断条件
      for或者 while  先判断条件再确定是否执行循环体语句
4. goto 在同一函数进行跳转
5. 数组
       1.用于存储一组同一类型数的容器
       2.定义数组  需要数据名 类型,还需要知道容纳元素的个数.
       int arr[5];
       3. 系统为数据分配连续的存储空间
         5 * 4 = 20;
4.对数组元素的访问,可以通过数组名(数组首地址) + 偏移 来访问该数组其他元素的内容
       arr[0]     第一个元素
       arr[1]     
       arr[]  数据类型
       []   下标运算
跟循环一起使用,通过循环读写数组里面的内容
       arr[0] = 10;
       arr[1] = 10;
       arr[2] = 10;
       arr[3] = 10;
       arr[4] = 10;
arr[0]   等价于  变量
       int i;
       &i
       &arr[0]  ??
----------------------
#include <stdio.h>
//#include <windows.h>
#include <stdlib.h>
#include <time.h>
int main(){
    int a[7];
    srand(time(0));
    int flag = 1;
    while(flag)
    {
        flag = 0;
        for(int i = 0;i<7;i++)
        {
            a[i] = rand()%32+1;  //1 - 32 
        }
        for(int i = 0;i<7;i++)
        {
            printf("a[%d] = %d\n",i,a[i]);  //1 - 32 
        }
        for(int j = 0;j<7;j++)
        {
            for(int i =j+1;i<7;i++)
            {
                if(a[j]  == a [i])
                {
                    printf("数字重复\n"); 
                    flag =1;
                    break;
                }
            }
            if(flag ==1)
                break;
        }
    }
    getchar();
    return 0;
}数组的初始化
将a 内容 复制 到 b
    输出 b
#include <stdio.h>
int main(){
     char a[]={‘H‘,‘e‘,‘l‘,‘l‘,‘o‘,‘ ‘,‘W‘,‘o‘,‘r‘,‘l‘,‘d‘,‘!‘};
     char b[12]={0};
     for (int i=0;i<12;i++)
     {
         b[i] = a[i];
         printf("%c",b[i]);
     }
    getchar();
    return 0;
}将a 内容 复制 到 b (去掉空格)
输出 b
#include <stdio.h>
int main(){
     char a[]={‘H‘,‘e‘,‘l‘,‘l‘,‘o‘,‘ ‘,‘W‘,‘o‘,‘r‘,‘l‘,‘d‘,‘!‘};
     char b[12]={0};
     for (int i=0;i<12;i++)
     {
         if (a[i] != 32)
         {
             b[i] = a[i];
             printf("%c",b[i]);
         }
     }
    getchar();
    return 0;
}int a[5] = {0};
    printf("a = %p\n",&a);
    printf("a[0] = %p\n",&a[0]);
    printf("a[1] = %p\n",&a[1]);
    printf("a[2] = %p\n",&a[2]);
    printf("a[3] = %p\n",&a[3]);
    printf("a[4] = %p\n",&a[4]);a = 0055F88C
a[0] = 0055F88C
a[1] = 0055F890
a[2] = 0055F894
a[3] = 0055F898
a[4] = 0055F89C
可变长数组    C99 
int n = 3;
n = 5;
int a[n]; //在定义数组时 跟据变量 确定 数组长度
(Windows不支持)

linux系统下
/*
 * C99 支持的可变长数组
 * [练习] 使用可变数组
 *      先输入 学员个数n
 *      为这n学员 申请 n个数组元素 存放录入他们的成绩
 *
 *      录入完后 打印 他们的成绩 和平均 成绩(考虑是小数)
 */
#include <stdio.h>
int  main(){
    int n = 0;
    //int a[n] = {0};  不能初始化
    //printf("数组元素个数:%d\n",sizeof(a)/sizeof(a[0]));
    printf("输入新n值:");
    scanf("%d",&n); //0  5
    int a[n];// {0};   一般是局部变量
    printf("数组元素个数:%d\n",sizeof(a)/sizeof(a[0]));
    for(int i = 0;i<n;i++)
    {
        printf("输入一个学员的成绩:");
        scanf("%d",&a[i]); //a[5]  
        //printf("a[%d] = %d\n",i,a[i]);
    }
    float sum  = 0;
    for(int i = 0;i<n;i++)
    {
        sum = sum + a[i];
        printf("a[%d] = %d\n",i,a[i]);
    }
    printf("平均成绩= %f\n",sum/n);
    return 0;
}多维数组
定义
int a[5][5] 二维数组
int a[5][5][3] 三维数组
#include <stdio.h>
int main(){
    int a[3][3];
    for (int j=0;j<3;j++)//j 表示 第几排
    {
        for (int i=0;i<3;i++)
        {
            a[j][i] = (j+1) * (i+1);
        }
    }
    for (int j=0;j<3;j++)//j 表示 第几排
    {
        for (int i=0;i<3;i++)
        {
            printf("%d ",a[j][i]);
        }
        printf("\n");
    }
    getchar();
    return 0;
}1 1 1
2 2 2
3 3 3
//a[j][i] = (j+1) * (i+1); a[j][i] = (j+1);
#include <stdio.h>
int main(){
    int a[3][3] ={{3,3,3},{3,3,3},{3,3,3}};   //3*3 9个元素
    int b[3][3] ={{4,4,4},{4,4,4},{4,4,4}};   //3*3 9个元素
    for (int j =0;j<3;j++)
    {
        for (int i=0;i<3;i++)
        {
            a[j][i] = a[j][i] * b[j][i];//对应的数组下标相乘再放到对应的A数组下标
            printf("a[%d][%d] = %d ",j,i,a[j][i]);
        }
        printf("\n");
    }
    getchar();
    return 0;
}a[0][0] = 12 a[0][1] = 12 a[0][2] = 12
a[1][0] = 12 a[1][1] = 12 a[1][2] = 12
a[2][0] = 12 a[2][1] = 12 a[2][2] = 12
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(){
    int a[4][4] ={0}; 
    srand(time(0));
    int x = rand()%4;
    int y = rand()%4;
    a[x][y] = 2;
    printf("+----+----+----+----+\n");
    for (int i=0;i<4;i++)
    {
        for (int j=0;j<4;j++)
        {
            printf("|%4d",a[i][j]);
        }
        printf("|\n");
        printf("+----+----+----+----+\n");
    }
    getchar();
    return 0;
}+----+----+----+----+ | 0| 0| 0| 0| +----+----+----+----+ | 0| 0| 0| 0| +----+----+----+----+ | 0| 0| 0| 2| +----+----+----+----+ | 0| 0| 0| 0| +----+----+----+----+
添加移动游戏(向上)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(){
    int a[4][4] ={0}; 
    srand(time(0));
    int x = rand()%4;
    int y = rand()%4;
    a[x][y] = 2;
    while (1)
    {
        system("cls");
    printf("+----+----+----+----+\n");
    for (int i=0;i<4;i++)
    {
        for (int j=0;j<4;j++)
        {
            if(a[i][j] == 0)  //0 用空格替换
            {
                printf("|    "); 
            }else{
                printf("|%4d",a[i][j]);
            }
        }
        printf("|\n");
        printf("+----+----+----+----+\n");
    }
    printf("|    k              |\n");
    printf("|h<--+-->l          |\n");
    printf("|    j              |\n");
    printf("+----+----+----+----+\n");
    char cmd = 0; 
    scanf("%c",&cmd);
    scanf("%*[^\n]");
    scanf("%*c");
    switch (cmd)
    {
    case ‘k‘ :
        for (int i=3;i>0;i--)//遍历第四排开始
        {
            for (int j=0;j<4;j++)//遍历列数
            {
                if (a[i-1][j] == 0)//如果第三排的对应元素等于0
                {
                    a[i-1][j] = a[i][j];//把第四排开始将对应的元素拿到上一排
                    a[i][j] = 0;//拿走之后赋值为0
                }else{
                    if (a[i-1][j] == a[i][j])
                    {
                        a[i-1][j] = 2*a[i][j];//如果对应元素相等,合并
                        a[i][j] = 0;//拿走之后赋值为0
                    }
                }
            }
        }
        x = rand()%4;
        y = rand()%4;
        a[x][y] = 2;
        break;
    case  ‘h‘ :
        printf("左移动\n");
        break;
    case  ‘j‘ :
        printf("下移动\n");
        break;
    case  ‘l‘ :
        printf("右移动\n");
        break;
    default :
        printf("输入错误\n");
        break;
    }
  }
    getchar();
    getchar();
    return 0;
}添加移动游戏(向上2)如果随机的位置还没有值才赋值 do...while()
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(){
    int a[4][4] ={0}; 
    srand(time(0));
    int x = rand()%4;
    int y = rand()%4;
    a[x][y] = 2;
    while (1)
    {
        system("cls");
    printf("+----+----+----+----+\n");
    for (int i=0;i<4;i++)
    {
        for (int j=0;j<4;j++)
        {
            if(a[i][j] == 0)  //0 用空格替换
            {
                printf("|    "); 
            }else{
                printf("|%4d",a[i][j]);
            }
        }
        printf("|\n");
        printf("+----+----+----+----+\n");
    }
    printf("|    k              |\n");
    printf("|h<--+-->l          |\n");
    printf("|    j              |\n");
    printf("+----+----+----+----+\n");
    char cmd = 0; 
    scanf("%c",&cmd);
    scanf("%*[^\n]");
    scanf("%*c");
    switch (cmd)
    {
    case ‘k‘ :
        for (int i=3;i>0;i--)//遍历第四排开始
        {
            for (int j=0;j<4;j++)//遍历列数
            {
                if (a[i-1][j] == 0)//如果第三排的对应元素等于0
                {
                    a[i-1][j] = a[i][j];//把第四排开始将对应的元素拿到上一排
                    a[i][j] = 0;//拿走之后赋值为0
                }else{
                    if (a[i-1][j] == a[i][j])
                    {
                        a[i-1][j] = 2*a[i][j];//如果对应元素相等,合并
                        a[i][j] = 0;//拿走之后赋值为0
                    }
                }
            }
        }
        do 
        {
            x = rand()%4;
            y = rand()%4;
        } while (a[x][y] != 0);//如果得到的随机位置已经有值,继续循环得到随机坐标
        a[x][y] = 2;//的到为空的值的随机坐标,赋值
        break;
    case  ‘h‘ :
        printf("左移动\n");
        break;
    case  ‘j‘ :
        printf("下移动\n");
        break;
    case  ‘l‘ :
        printf("右移动\n");
        break;
    default :
        printf("输入错误\n");
        break;
    }
  }
    getchar();
    getchar();
    return 0;
}

