4.3
复习
控制语句
if···else
一般形式:
if(表达式)
{
语句块;
}
···
else
{
语句块;
}
执行过程:如果表达式为真则执行语块1,否则向下判断表达式2,如果为真则执行表达式2···如果都不满足以上所有表达式则执行else
switch···case
一般形式:
switch(表达式)
{
case 常量表达式:
break;
···
default; //和else相同
break; //最后一句的break可以不加
}
执行过程:
表达式的结果和常量表达式从上往下匹配,结果相同则执行对应的语句块
while(表达式)
{
循环体;
}
执行过程先判断表达式是否为真,为真则执行一次循环体,为假则退出循环,每执行完一次表达式再再次判断循环体。
死循环:
while(1);
do
{
循环体;
} while(表达式);
/* do-while语句: 1.while后面表达式的分号不能省略。
2.while后面的表达式一定要为假。
today
循环结构
for
一般形式:
for(表达式1;表达式2;表达式3)
{
语句块;
}
执行顺序:执行表达式1(只执行一次),判断表达式2是否进入循坏,如果满足,结果为真则执行循环体,执行完一次循坏体后执行表达式3,再次判断表达式2 结果···
一些在模块里边定义的只能在模块内部使用
练习:打印菱形
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int i,k,n,m=0;
while(1)
{
for(i=0;i<7;i++)
{
for(k=0;k<6-i+m;k++)
{
printf(" ");
}
for (n=0;n<2*i-1;n++)
{
printf("*");
}
puts(" ");
}
for(i=1;i<6;i++)
{
for(k=0;k<i+m;k++)
{
printf(" ");
}
for(n=0;n<11-2*i;n++)
{
printf("*");
}
puts(" ");
}
m++;
if(m>20)
m=0;
usleep(60000);
system("clear");
}
return 0;
}
goto
while(1)
{
while(1)
{
while(1)
{
break;
goto A;
}
printf("1\n");
}
}
A: printf("2\n");
跳转到对应符号位置
数组
数组的定义
数组:存储大量同类型数据,是一片连续的空间
存储类型 数据类型 数组名[元素个数]
存储类型:auto register extern static
数据类型:char int float··
数组名:遵循标识符的命名规则
代表数组的首地址()
[]:数组运算符
元素个数:数组能够存储的最大元素个数
例:
int a[5];
数组的赋值
使用数组中的某一个值:
数组名[下标]:下标从0开始,最大能用到n-1.
a[0]=6; //代表给数组第一个元素赋值为6
只能一个元素进行使用,只有初始化时能整体赋值
完全初始化
int a[5]={5,4,3,6,7}; //只能在初始化时给每个数据赋值
未完全初始化:
int a[10]={3,4,6}; //后面7个数据全是0
int a[]={4,52,6,6}; //初始化时开辟四个空间(缺省初始化)
int a[10]={0}; //所有内容全为0
只定义不初始化所有值是随机数
两个数据异或等于就会交换数据:
/* a[j]^=a[j+1];
a[j+1]^=a[j];
a[j]^=a[j+1]; */
冒泡排序:
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[10]={12,43,34,54,65,76,23,14,57,67};
int i,j,m;
for (i=0;i<10;i++)
{
for(j=0;j<9;j++)
{
if(a[j]>a[j+1])
{
m=a[j+1];
a[j+1]=a[j];
a[j]=m;
}
}
}
for(i=0;i<10;i++)
printf("%d\n",a[i]);
return 0;
}
/* int a[10];
14 srand(NULL);
15 for(i=0;i<10;i++)
16 {
17 a[i]=rand()%100; //0~99;
18 } */ 随机数排序
二维数组
定义
内存中没有二维数组这种东西,只是抽象的想象成为二维,存储方式还是一维。
存储类型 数据类型 数组名[行][列]
int a[2][4] // 行优先:先存行,再存列
最大存储个数:行*列
例:
int a[2][3];
赋值
使用方式:
数组名[行下标][列下标]
例:
int a[2][3];
a[0][1];
初始化
完全初始化:
int a[2][3]={4,5,6,7,8,9};
int a[2][3]={{4,5,6},{7,8,9}};
未完全初始化:
int a[2][3]={6,4,8};//未赋值的全为0
int a[][4]={2,68,9,3,7,6}//只能缺行,不能缺列
int a[2][3]={{4,5},{}}
printf("%p\n",a); //数组首地址
printf("%p\n",&a[0][0]);//数组首地址
printf("%p\n",a[1]); //a[1][0]的地址
printf("%p\n",&a[1][0]);
printf("%d\n",a[0][0]); //0行0列的元素
printf("%d\n",a[0][2]); //0行2列的元素,未完全初始化为0
printf("%d\n",a[1][0]); //1行0列的元素
*************************************
练习:实现一个二维数组的转置a[i][j]-->b[j][i]
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int a[2][4],b[4][2];
int i,j;
srand(time(NULL));
for(i=0;i<2;i++)
{
for(j=0;j<4;j++)
{
a[i][j]=rand()%51;
}
}
for(i=0;i<2;i++)
{
for(j=0;j<4;j++)
{
printf("%-3d",a[i][j]);
}
puts(" ");
}
printf("**************************");
puts(" ");
for(i=0;i<2;i++)
{
for(j=0;j<4;j++)
{
b[j][i]=a[i][j];
}
}
for(i=0;i<4;i++)
{
for(j=0;j<2;j++)
{
printf("%-3d",b[i][j]);
}
puts(" ");
}
return 0;
}
hqyj@ubuntu:~/4.3$ gcc 一维数组求最大值.c
hqyj@ubuntu:~/4.3$ ./a.out
7 35 36 34
11 31 35 16
**************************
7 11
35 31
36 35
34 16
找出三行五列二维数组最大数以及下标
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int a[3][5];
int i,j,max;
srand(time(NULL));
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
a[i][j]=rand()%51;
}
}
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
printf("%d ",a[i][j]);
}
puts(" ");
}
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
if(a[i][j]>max)
max=a[i][j];
}
}
printf("最大值为%d ,位置a[%d][%d]",max,i,j);
puts(" ");
return 0;
}
hqyj@ubuntu:~/4.3$ ./a.out
32 27 45 40 3
40 13 17 24 46
6 6 35 15 27
最大值为46 ,位置a[3][5]
练习:
打印十行杨辉三角:
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[10][10]={0};
int i,j;//i为行数,j为列数
for(i=0;i<10;i++)
{
a[i][0]=1;//第一列全为1
for(j=0;j<=i;j++)
{
if(i==j)
{
a[i][j]=1;//三角斜边全为1
}
else
{
a[i][j]=a[i-1][j-1]+a[i-1][j];//三角里面的内容
}
printf("%d ",a[i][j]);
}
puts(" ");
}
return 0;
}
hqyj@ubuntu:~/4.3$ gcc homework.c
hqyj@ubuntu:~/4.3$ ./a.out
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1