(Linux)嵌入式打卡第五天

死循环

死循环:程序一直在循环中执行循环体,使用 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语句

代码跳转,可以将代码跳转到指定的标签执行。

注意:

    1. goto 语句只能实现同一个函数内部进行跳转。
    2. 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;
}

数组的初始化

定义数组时,同时对里面的空间进行赋值。

初始化种类:

    1. 完全初始化:将数组里每个元素都初始化。

格式: <数据类型> 数组名[成员个数] = {value};//value个数 = 成员个数

    1. 不完全初始化:初始化的时候,没有将数组每一个空间都赋值。

注意:没有被赋值的元素,自动赋值为0 .

格式: <数据类型> 数组名[成员个数] = {value};//value个数 < 成员个数

    1. 特殊的初始化:在初始化数组的时候,没有定义成员个数,会根据赋予的值的个数,反推成员个数。

格式: <数据类型> 数组名[ ] = {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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值