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