c语言学习第三天

do while语句:
do{
// 循环体
}while(条件);
do while的执行流程:先执行循环体,再判断条件,当条件为真时继续执行循环体,条件为假时结束do while语句(先工作后检查)。
相同条件下它比for和while多执行一次,且至少执行一次循环体。
int i = 0;
do{
printf(“%d\n”,i);
}while(i++<10);
注意:在循环体中定义的变量,不能在小括号中使用(出了大括号就失效了)。

练习1:密码验证(123434),当输入正确的密码时,显示登录成功,如果密码错误则显示还有几次机会,超过三次则显示帐号已锁定,请联系管理员。

循环嵌套:
就是在循环语句中包含循环语句,外层循环执行一次,内层循环执行一遍历。
for(int i=0; i<10; i++)
{
for(int j=0; j<10; j++)
{
printf("j=%d ",j);
}
printf(“i=%d\n”,i);
}

练习2:打印九九乘法表。
练习3:计算出100~1000之间所有的素数。
练习4:计算出10万以内所有的完美数。

break语句:
功能1:在switch语句中使用,可以关闭执行开关。
功能2:在循环语句中使用,可以跳出循环语句提前结束,但只能跳转一层循环。
int i=0;
for(;
{
if(i>=10)
break;
printf(“i=%d\n”,i);
}
printf(“循环结束了\n”);

continue语句:
只能在循环语句中使用,它可以提前结束本次循环,进入下一次循环。
for(int i=0; i<10; i++)
{
if(i%2)
continue;
printf(“i=%d\n”,i);
}

练习5:打印以下图形(printf一次只能打印一个字符)。
        *     1 0 
       ***    3 1
      *****   5 2
     *******  7 3
    ********* 9 4
练习6:打印以下图形:
        *
       ** *
      *** **
     **** ***
    ***** ****
     **** ***
      *** **
       ** *
        *
练习7:打印以下图形:
        *
       * *
      *   *
     *     *
    *       *
     *     *
      *   *
       * *
        *

goto语句:
它能跳转到函数内的任意位置(既能向上跳转也能向下跳转),它通过定义标签来确定代码的位置。
定义标签的方法:
标签名:
跳转方法:
goto 标签名;

// 以代码会形成死循环
loop:
    循环体
goto loop;

// 循环10次
int i=0; 
loop:
    循环体
if(i<10)
    goto loop;
注意:goto构成的循环体,不能使用break和continue语句。

注意:由于goto语句可以任意跳转(过度自由),可能会破坏已经设计好的分支、开关、循环等语句,所以很多编程语言都去掉了goto语句的功能,很多使用C语言开发的公司也禁止使用goto语句,但它在硬件开发、驱动开发时goto语句非常适合用来释放资源。
练习8:使用goto语句打印前N项斐波那切数列。
  1 0 1 1 2 3 5 8 13 21 ... 

数组:
数组就是由若干个相同类型变量的组合,是一种批量定义变量的方式。
定义:数据类型 数组名[长度];
int arr[5] <=> int num0,num1,num2,num3,num4;
使用:数组名[下标];
下标范围:0 ~ 长度-1
初始化:数据类型 数组名[长度] = {0,1,2,3,4,5,…};
1、数组中的变量与普通变量一样,默认值是不确定的(随机的)。
2、初始化语法只有在定义数组时才能使用,数组定义完毕后,只能单个访问其中的变量,初始化过程是编译器帮助完成的。
3、初始化数据如果过多,编译器会丢弃多余的数据,并产生警告。
4、初始化数据如果不够,编译器则会补0。
5、初始化数组时,数组的长度可以省略,编译器会自动统计数据的数量,设置给数组。
sizeof(arr)/sizeof(arr[0]) 计算出数组的长度。
遍历:与for配合,使用循环变量作为数组的下标。
int arr[] = {0,1,2,3,4,5,1,2,3,1,2,2,1,2,2,2,2,2,2,2};
int len = sizeof(arr)/sizeof(arr[0]);
for(int i=0; i {
printf("%d ",arr[i]);
}
练习9:定义一个长度为10的数组并初始化,计算出数组中的最大值,最小值,平均值。
练习10:定义一个长度为10的数组并初始化,对数组进行升序排序。
练习11:定义一个长度为10的数组并初始化,找出数组中第二个大的数。
练习12:输入一个整数判断是否是回文数,例如:12321 123321。

变长数组:
变长数组就是数组在定义时,使用变量作为它的长度,在执行数组定义语句前,长度变量可以变化,当执行了数组定义语句后,数组的长度就确定下来了,不能再变。
int len;
// 该变量根据实际情况进行变化
int arr[len];
优点:可以根据实际情况来确定数组长度,达到节约内存的目的。
缺点:由于在编译时数组的长度无法确定,因此编译器不能帮数组进行初始化。

数组越界:
当使用数组中的变量时,下标超合法范围,这种情况叫数组越界。
由于变量可以作为数组的下标,在编译时无法确定下标变量的值是否合法,所以编译器无法检查出数组越界的错误,只有在程序执行时才会触发错误。
数据越界的后果:
1、一切正常
2、段错误
3、脏数据

二维数组:
如果说普通数组(一维数组)是把变量排成一排,二维数组就是把变量排成一个矩阵。
定义:数据类型 数组名[行数][列数];
int arr[3][5]; 变量在内存中的排列形状:
[0][0] [0][1] [0][2] [0][3] [0][4]
[1][0] [1][1] [1][2] [1][3] [1][4]
[2][0] [2][1] [2][2] [2][3] [2][4]
访问:数组[行下标][列下标];
行下标范围:0 ~ 行数-1
列下标范围:0 ~ 列数-1
初始化语法:数据类型 数组名[行数][列数] = {{第一行数据},{第二行数据},…};
其它规则与一维数组相同。
int arr[3][5] = {
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15}
};
遍历:二维数组需要与双层for循环配合,外层循环变量当作行下标,内存循环变量当作列下标。
int arr[3][5];
for(int row=0; row<3; row++)
{
for(int col=0; col<5; col++)
{
printf(“%d “,arr[row][col]);
}
printf(”\n”);
}
练习13:定义一个55的二维数组并初始化,计算出每行的最大值、每列的最小值。
练习14:定义一个5
5的二维数组并初始化,计算出最小值周边数据的和。

你可能感兴趣的:(c语言,学习,算法)