qscool 2020-05-17
回顾:
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;
}
