死循环
死循环:程序一直在循环中执行循环体,使用 Ctrl C 退出死循环。
while死循环
while(1) //计算机中非0即真
{
code; //循环体
}
eg:
int flag = 1;
int count = 0;
while(flag) //flag是1,死循环
{
if(count == 10)
{
flag = 0;//循环结束
}
count++;
}
for循环死循环
格式:
for(;;) //表达式1,表达式2,表达式3可以不写,但是分号不可以不写
{
code;//循环体
}
eg:
#include <stdio.h>
#include <unistd.h>
int main()
{
for(;;)
{
printf("hello");
sleep(1);
}
return 0;
}
辅助关键字
break关键字
continue关键字
只能用到循环,跳出本次循环。
do ... while循环
循环的一种,循环无论是否满足条件,都会先执行一次。
格式:
do
{
code;//循环体
}while(condition); //分号不能省
语法函数:
1.先执行code循环体一次,然后进行while中的condition条件
条件为真:继续执行,直到不能满足条件
条件为假:不再执行循环体。
eg:
#include <stdio.h>
int main(int argc, const char *argv[])
{
//定义一个变量控制执行的次数
printf("------do while start----------\n");
int i = 0;
do{
printf("hello world\n");
i++;
}while(i < 5);
printf("-----do while end-------------\n");
return 0;
}
结果:
------do while start----------
hello world
hello world
hello world
hello world
hello world
-----do while end-------------
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 1;//i 是行
int j = 1;//j 是列
//列++,然后行++
do
{
do
{
printf("%d * %d = %d ",j,i,i*j);
j++;
}while(j <= i);
i++;
j = 1;
printf("\n");
}while(i < 10);
return 0;
}
结果:
1 * 1 = 1
1 * 2 = 2 2 * 2 = 4
1 * 3 = 3 2 * 3 = 6 3 * 3 = 9
1 * 4 = 4 2 * 4 = 8 3 * 4 = 12 4 * 4 = 16
1 * 5 = 5 2 * 5 = 10 3 * 5 = 15 4 * 5 = 20 5 * 5 = 25
1 * 6 = 6 2 * 6 = 12 3 * 6 = 18 4 * 6 = 24 5 * 6 = 30 6 * 6 = 36
1 * 7 = 7 2 * 7 = 14 3 * 7 = 21 4 * 7 = 28 5 * 7 = 35 6 * 7 = 42 7 * 7 = 49
1 * 8 = 8 2 * 8 = 16 3 * 8 = 24 4 * 8 = 32 5 * 8 = 40 6 * 8 = 48 7 * 8 = 56 8 * 8 = 64
1 * 9 = 9 2 * 9 = 18 3 * 9 = 27 4 * 9 = 36 5 * 9 = 45 6 * 9 = 54 7 * 9 = 63 8 * 9 = 72 9 * 9 = 81
goto语句
代码跳转,可以将代码跳转到指定的标签执行。
注意:
-
- goto 语句只能实现同一个函数内部进行跳转。
- goto 语句会破坏代码原有的逻辑,谨慎使用。
goto语句中:设置标签方法:标签名:eg: loop://定义了一个标签,名为loop
格式:
代码块1;
goto loop;
代码块2;
loop:
代码块3;
执行逻辑:
1.先执行代码块1.
2.遇到 goto loop; 直接跳出去执行loop后边的代码。不会再执行代码块2,
执行完 loop 后边的代码,也不会再回去继续执行原来没执行完的代码。
eg:
#include <stdio.h>
int main(int argc, const char *argv[])
{
printf("111\n");
goto NEXT;
printf("222\n");
NEXT:
printf("333\n");
return 0;
}
结果:
111
333
方法1:
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 1;
int sum = 0;
loop:
sum += i;
i++;
if(i > 100)
{
printf("sum = %d\n",sum);
return 0;
}
goto loop;
return 0;
}
结果:
sum = 5050
方法2:
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 1;
int sum = 0;
loop:
sum += i;
i++;
if(i > 100)
{
goto NEXT;
}
goto loop;
NEXT:
printf("sum = %d\n",sum);
return 0;
}
结果:
sum = 5050
数组
简介:
1.数组是一个构造类型,由多个相同类型构造一个新的类型。
2.数组在内存中是一块连续的空间。
3.数组里面的每一个数据,都是数组的成员,类型都是一样的。
数组名是一个地址常量,不可以进行修改。 a = 10;错
数组定义
格式:
数组的访问:
数组名是一个常量,不可以直接赋值,只能通过下标对每个元素进行访问。
注意:C语言中,下标是从 0 开始的。
简介:
数组名是一个常量,不可以直接进行赋值.只能通过下标对每一个元素进行赋值.
注意: C语言中: 下标是从 0开始的.
eg:
#include <stdio.h>
int main()
{
// 1.在内存中定义一个数组,数组里面存放5个int类型的数据
int array[5];
// 2.在申请的数组中进行赋值操作。
// array = {1, 2, 3, 4, 5}; 错 数组名是一个地址常量,不可以进行修改。
// 3.数组是支持下标操作的,下标是从0开始的。
array[0] = 1; // 数组通过 数组名[下标]; 来找到空间的
array[1] = 2;
// array[2] = 3; 将下标为2的空间不进行赋值。则里面是随机值。
array[3] = 4;
array[4] = 5;
// 4.打印数组的内容: 数组访问内容也是通过下标进行访问的。
for(int i = 0; i < 5; i++)
{
printf("%d ", array[i]);
}
putchar(10);
return 0;
}
#include <stdio.h>
int main(int argc, const char *argv[])
{
int arr[10];
int max = 0;
int index = 0;
scanf("%d",&arr[0]);
max = arr[0];
for(int i = 1;i < 10 ; i++)
{
scanf("%d",&arr[i]);
if(max < arr[i])
{
max = arr[i];
index = i;
}
}
printf("index = %d,max = %d\n",index,max);
return 0;
}
#include <stdio.h>
int main(int argc, const char *argv[])
{
int arr[20] = {1,1};
for(int i = 2; i < 20; i++)
{
arr[i] = arr[i-1] + arr[i-2];
}
for(int i = 0;i < 20 ; i++)
{
printf("arr[%d] = %d\n",i,arr[i]);
}
return 0;
}
数组的初始化
定义数组时,同时对里面的空间进行赋值。
初始化种类:
-
- 完全初始化:将数组里每个元素都初始化。
格式: <数据类型> 数组名[成员个数] = {value};//value个数 = 成员个数
-
- 不完全初始化:初始化的时候,没有将数组每一个空间都赋值。
注意:没有被赋值的元素,自动赋值为0 .
格式: <数据类型> 数组名[成员个数] = {value};//value个数 < 成员个数
-
- 特殊的初始化:在初始化数组的时候,没有定义成员个数,会根据赋予的值的个数,反推成员个数。
格式: <数据类型> 数组名[ ] = {value};//value个数 = 成员个数
#include <stdio.h>
int main()
{
// 1.定义一个数组, 然后进行完全赋值
int arr1[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
printf("----------------完全赋值 start -----------------\n");
for(int i = 0; i < sizeof(arr1)/sizeof(arr1[0]); i++)
{
printf("%d ", arr1[i]);
}
putchar(10);
printf("----------------完全赋值 end--------------------\n");
// 2.定义一个数组, 然后进行不完全赋值;
int arr2[10] = {1, 2, 3};
printf("----------------不完全赋值 start -----------------\n");
for(int i = 0; i < sizeof(arr2)/sizeof(arr2[0]); i++)
{
printf("%d ", arr2[i]);
}
putchar(10);
printf("----------------不完全赋值 end--------------------\n");
// 3.特殊赋值:
int arr3[] = {1, 2, 3, 4, 5};
printf("----------------特殊赋值 start -----------------\n");
for(int i = 0; i < sizeof(arr3)/sizeof(arr3[0]); i++)
{
printf("%d ", arr3[i]);
}
putchar(10);
printf("----------------特殊赋值 end--------------------\n");
return 0;
}
#include <stdio.h>
int main()
{
// 1.定义一个数组
int arr[9] = {1, 3, 8, 9 ,10, 9, 8, 1,3};
// target: 找到数组里面只出现一次的数字
// ^ 异或
int value = 0;
// 通过下标 依次拿出里面的值
for(int i = 0; i < 9; i++)
{
value ^= arr[i];
}
printf("value = %d\n", value);
return 0;
}
#include <stdio.h>
int main(int argc, const char *argv[])
{
int arr[9];
int num = 0;
for(int i = 0; i < 9; i++)
{
scanf("%d",&arr[i]);
}
for(int i = 0; i < 9 ; i++)
{
num ^= arr[i];
}
printf("%d\n",num);
return 0;
}
定义一个数组,里面有十个元素,将这个数组反转。
#include <stdio.h>
int main(int argc, const char *argv[])
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int num = arr[0];
int star = 0,end = 9;
while(star < end)
{
num = arr[star];
arr[star] = arr[end];
arr[end] = num;
star++;
end--;
}
for(int i = 0; i < 10 ; i++)
{
printf("%d ",arr[i]);
}
putchar(10);
return 0;
}
冒泡排序*****
排序:一个数组,数组里面的值是无序的,将这个数组里面的值,从小到大进行排序。
int arr[5] = {8,2,10,6,7};
思路:
冒泡排序:两两进行比较,大的向后移。
原始数据:
8 2 10 6 7
下标 0 1 2 3 4
排序第一轮:
2 8 10 6 7 下标 0, 1 进行比较
2 8 10 6 7 下标 1, 2 进行比较
2 8 6 10 7 下标 2, 3 进行比较
2 8 6 7 10 下标 3, 4 进行比较
---------------------------------------------------
排序第二轮:
2 8 6 7 10 下标 0, 1进行比较
2 6 8 7 10 下标 1, 2进行比较
2 6 7 8 10 下标 2, 3进行比较
-------------------------------------------------------
排序第三轮:
2 6 7 8 10 下标 0, 1进行比较
2 6 7 8 10 下标 1, 2进行比较
----------------------------------------------------
排序第四轮:
2 6 7 8 10 下标 0, 1进行比较
#include <stdio.h>
#include <unistd.h>
int main()
{
// 1.定义一个数组
int month[12] = {1, 3, 5, 7, 8, 10, 12, 4, 6, 9, 11, 2};
// 2.使用冒泡排序
printf("开始冒泡排序\n");
// 定义一个变量,用来控制排序的轮数
int i = 0;
for (i = 0; i < sizeof(month) / sizeof(month[0]) - 1; i++)
{
// 每一轮做的事情。
for (int j = 0; j < sizeof(month)/ sizeof(month[0]) - 1 -i; j++)
{
if (month[j] < month[j+1])
{ // 三杯水交换数据
int ret = month[j];
month[j] = month[j+1];
month[j+1] = ret;
}
}
}
sleep(1);
printf("冒泡排序结束\n");
// 打印数据
printf("--------------打印结果-----------------\n");
for(int i =0; i < 12; i++)
{
printf("%d ", month[i]);
}
putchar(10);
return 0;
}
二维数组
二维数组:
二维数组指的是有两个下标的数组. 分别是行与列.
二维数组的定义:
格式:
<存储类型> <数据类型> 数组名[行数][列数];
注意:
存储类型:默认为auto
eg:
int arr[2][3]; //定义了一个2行3列的二维数组
// 每个元素都是int型
二维数组逻辑存储与内存存储
逻辑结构
存储结构
计算机在存储二维数组时:以一块连续的空间进行存储。
二维数组的访问与赋值
二维数组是通过下标进行赋值与访问的。
#include <stdio.h>
int main()
{
// 定义一个二维数组
int arr[2][3]; // 定义了一个二维数组
// 通过下标给这个数组进行赋值操作
arr[0][0] = 1;
arr[0][1] = 2;
arr[0][2] = 3;
arr[1][0] = 4;
arr[1][1] = 5;
arr[1][2] = 6;
// 访问二维数组里面的内容。
for (int line = 0; line < 2; line++)
{
for (int col = 0; col < 3; col++)
{
printf("arr[%d][%d] = %d\n",line, col, arr[line][col]);
}
}
return 0;
}
homework
#include <stdio.h>
int main(int argc, const char *argv[])
{
//定义一个数组
int month[12] = {1,3,5,7,8,10,12,4,6,9,11,2};
int num = month[0];
for(int i = 0; i < sizeof(month)/sizeof(month[0]); i++)
{
//进行几轮排序
for(int j = 1;j < sizeof(month)/sizeof(month[0])-i;j++)
{
//每轮需要做的事
if(month[j-1] > month[j])
{
num = month[j-1];
month[j-1] = month[j];
month[j] = num;
}
}
}
for(int i = 0; i < 12 ; i++)
{
printf("%d ",month[i]);
}
putchar(10);
return 0;
}
#include <stdio.h>
int main(int argc, const char *argv[])
{
//定义一个2行5列的数组
int arr[2][5] = {0};
//从键盘中输入10个值,存入这个数组
for(int i = 0; i < 2; i++)
{
for(int j = 0;j < 5; j++)
{
scanf("%d",&arr[i][j]);
}
}
//找最大值,最小值
int max = arr[0][0],min = arr[0][0];
int index_max_i = 0,index_max_j = 0;
int index_min_i = 0,index_min_j = 0;
for(int i = 0; i < 2; i++)
{
for(int j = 0;j < 5; j++)
{
if(max < arr[i][j])
{
max = arr[i][j];
index_max_i = i;
index_max_j = j;
}
else if(min > arr[i][j])
{
min = arr[i][j];
index_min_i = i;
index_min_j = j;
}
}
}
printf("最大值 = %d,最大值下标为[%d][%d]\n",max,index_max_i,index_max_j);
printf("最小值 = %d,最小值下标为[%d][%d]\n",min,index_min_i,index_min_j);
return 0;
}