华清远见嵌入式培训_第二周回顾与反思

目录

前言

周一

一、switch..case

1.1 注意事项

1.2 使用练习

二、循环控制语句

2.1 使用goto实现循环

2.2 while循环

2.3 do..while 循环

2.4 for 循环

2.5 死循环

2.6 辅助控制关键字

周二

一、数组

1.1 一维数组

1.2 数组越界问题

1.3 二维数组

1.4 编码练习

二、冒泡排序

2.1 原理动图

2.2 代码实现(以降序为例)

周三

一、字符数组和字符串

1.1 概述

1.2 几个注意事项

二、字符串处理函数

2.1 strlen

2.2 strcpy

2.3 strcat

2.4 strcmp

2.5 编码练习

 三、指针

3.1 概念

3.2 指针相关的操作

3.3 指针和变量和关系

3.4 指针的基本使用

3.5 指针的大小

3.6 指针的运算

周四

一、指针

1.1 大小端存储问题

1.2 指针和一维数组

1.3 指针和二维数组

1.4 数组指针

1.5 指针数组

1.6 指针和字符串

1.7 二级指针

周五

 一、const关键字

二、函数

1.1 函数的概念

1.2 函数的定义和调用

2.3 函数的声明

2.4 函数的参数

2.5 函数的返回值

2.6 全局变量和局部变量

2.7 函数的传参方式

2.8 数组的传参方式

2.9 二维数组的传参方式

2.10 main函数的参数

周末作业

反思与总结


前言

        这是培训的第二个周末,闭眼细想,明显感觉学的东西比上周要多,这周里结束了C语言基础这一部分,补充学习了控制语句、新学了一维数组、二维数组、字符数组、字符串、指针和函数,重点难点是后面的指针和函数,也是老师花了最多篇幅讲解的,因此篇文章也将会,对指针函数做着重复习和回顾。

        同样,写此文章,是想以这种碎碎念的方式回顾重点、重复盲点、加深印象,复习、总结和反思本周的学习,仅供后期自己回顾使用。知识体系不完善,内容也不详细,仅供笔者复习使用。如果是有需要笔记,或者对这方面感兴趣,可以私信我,发你完整的知识体系和详细内容的笔记。如有任何错误请多指正,也欢迎友好交流,定会虚心听取大佬的宝贵意见!

周一

一、switch..case

1.1 注意事项

1.switch后面()里的表达式: 变量或者完整表达式。

        一般是是整型或者字符的(不能是浮点型的)

2.case后面的表达式: switch后面()中表达式可能的结果。

3.break的作用: 执行完某个分支的代码块就立即结束整个switch..case语句。

如果不加 break,程序会继续向下执行下面case的代码块,直到遇到break或者整个switch..case语句结束,这种现象叫做---case击穿”

4.default 分支相当于 if..else 语句中的else部分,如果前面的case都不满足,则执行default分支,如果不关心其他分支的情况,整个default分支都可以不要

1.2 使用练习

编码实现一个简易的计算器功能( + - * 功能即可):

        要求在终端输入表达式,输出计算的结果

        如:输入:5+6 则输出 11

#include <stdio.h>
int main(){    
    int lvalue = 0;
    char operator = 0;
    int rvalue = 0;
    scanf("%d%c%d", &lvalue, &operator, &rvalue);
    switch(operator){
        case '+':
            printf("%d + %d = %d\n", lvalue, rvalue, lvalue + rvalue);
            break;
        case '-':
            printf("%d - %d = %d\n", lvalue, rvalue, lvalue - rvalue);
            break;
        case '*':
            printf("%d * %d = %d\n", lvalue, rvalue, lvalue * rvalue);
            break;
        default:
            printf("目前只支持 +  -  * 运算\n");
            break;
    }
    return 0;
}

二、循环控制语句

2.1 使用goto实现循环

2.1.1 注意事项

goto本身是用来实现代码跳转的。

注意:只能在同一个函数中实现跳转。

注意:goto的跳转对代码的逻辑性和易读性有一定的影响,所以要谨慎使用。

2.1.2 循环实现

使用 goto 实现 计算 1+2+3+....+100 的和。

#include <stdio.h>

int main(int argc, const char *argv[])
{
	int sum = 0;
	int i = 1;//既用来控制循环结束 又用来控制每次加的值
	//一般用来控制循环结束的变量 称之为 循环变量  一般使用 i  j  k 等表示

LOOP:
	sum = sum + i;
	i++;
	if(i <= 100){
		goto LOOP;
	}

	printf("sum = %d\n", sum);//5050

	return 0;
}

2.2 while循环

        优先使用while循环的情况:循环次数不确定情况。

2.2.1 格式

while(表达式){
    循环体;//就是要循环执行的代码块
}

2.2.2 代码练习

猴子吃桃问题:

        猴子第一天摘了若干个桃,当即就吃了一半数量的桃,没吃过瘾,又多吃了一个;第二天又将剩下的桃,吃了一半,没吃过瘾,又多吃了一个;以后的每天,依次类推,都吃掉一半数量再多一个。直到第10天再想吃桃的时候,发现只剩下一个了。

        问:猴子第一天摘了多少个桃。使用while循环实现。

思路:第十天剩1个,第9天剩(1+1)*2个,以此类推,借助循环,day>1是循环条件。

#include <stdio.h>
int main(){
    int count = 1;
    int i = 0;
    while(i < 9){
        count = (count+1) * 2;
        i++;
    }
    printf("第1天有 %d 个桃\n", count);//1534
    return 0;
}

2.3 do..while 循环

        优先使用do..while循环的情况:在循环开始之前,需要先执行一次循环内的代码。

2.3.1 格式

        注意:while后要加一个分号!

do{
    代码块;
}while(表达式);  

2.3.2 while和do ..while的区别

while :         先判断 后执行

do_while:        先执行 后判断

不管表达式为真还是为假,do_while里面的代码块 至少要执行一次。

2.4 for 循环

        优先使用for循环的情况:循环区间明确的情况。

2.4.1 格式

这三个表达式,如果哪个不需要,可以不写,但是两个引号“ ;; ”必须要写。

for(表达式1;表达式2;表达式3){
    循环体;
}

2.4.2 代码练习

1、输出 [100,999] 范围内所有的水仙花数:

        水仙花:个*个*个 + 十*十*十 + 百*百*百 == 自身

        如:153 就是一个水仙花数

        153 == 1*1*1 + 5*5*5 + 3*3*3 = 1+125+27 == 153

#include <stdio.h>

int main(int argc, const char *argv[])
{
	int num = 0;
	int g = 0;
	int s = 0;
	int b = 0;

	for(num = 100; num <= 999; num++){

		g = num % 10;
		s = num / 10 % 10;
		b = num / 100;

		if(num == g*g*g + s*s*s + b*b*b){
			printf("%d 是水仙花数\n", num);
		}
	}

	return 0;
}

2、输出 [2,100] 范围内所有的质数

#include <stdio.h>

int main(){
    int num = 0;
        
    int i = 0;
    for(num = 2; num <= 100; num++){
        for(i = 2; i < num; i++){
            if(num % i == 0){
                break;
            }
        }
        if(i == num){
            printf("%d 是质数\n", num);
        }
    }
    return 0;
}

2.5 死循环

//所谓的死循环就是程序一直在循环中执行循环体,无限循环。

while(1){        //常用的写法
//循环体
}

for(;;){         //注意,表达式可以不写,但是两个分号必须要写,否则报错
//循环体
}

2.6 辅助控制关键字

2.6.1 break

       1、break可用在switch..case 语句中,表示执行完某个分支就立即结束整个switch..case语句。

       2、break也可以用在循环中,表示结束本层循环

2.6.2 continue

        continue只能用在循环中,表示结束本层的本次循环

2.6.3 return

       1、 return用在函数中,是用来返回函数执行的结果的。

       2、 如果在主函数中使用 return,表示立即结束整个程序

周二

一、数组

        数组是构造类型,是用来存储一组相同的数据类型的数据的。

        数组的元素在内存上的都是连续的,不管几维数组,都是连续的。

1.1 一维数组

        格式:        存储类型  数据类型  数组名[下标]

        例如:           默认为auto      int      s[10]                              

       一维数组: 下标只有一个数的数组

        注意:

                在定义数组时,下标必须是常量,表示告诉操作应该给这个数组分配多大的内存空间;

                在其他场景下,既可以是常量,也可以是变量,也可以是表达式,表示访问数组中的第几个元素。

1.2 数组越界问题

#include <stdio.h>

#define N 5

int main(int argc, const char *argv[])
{
	int s[N];
	
	//使用数组时一定要注意检查边界
	//数组越界的错误编译器不会检查 需要程序员自己检查
	//数组越界的错误是不可预知的
	//可能不报错
	//可能段错误
	//也可能修改了不该修改的数据
	s[234789] = 100;
	printf("s[234789] = %d\n", s[234789]);

	return 0;
}

1.3 二维数组

        下标有两个的数组:s[3][4],第一个下标表示行数,第二个表示列数。

1.4 编码练习

使用二维数组保存杨辉三角,并输出。

#include <stdio.h>

int main(){
    int s[10][10] = {0};
    
    int i = 0;
    int j = 0;
    //控制行
    for(i = 0; i < 10; i++){
        s[i][0] = 1;
        //控制列
        for(j = 1; j <= i; j++){
            s[i][j] = s[i-1][j-1] + s[i-1][j];
        }
    }
    //输出
    for(i = 0 ; i < 10; i++){
        for(j = 0; j <= i; j++){
            printf("%4d", s[i][j]);
        }
        putchar(10);
    }
    
    return 0;
}

二、冒泡排序

2.1 原理动图

2.2 代码实现(以降序为例)

#include <stdio.h>
int main(){
    int s[10] = {12, 34, 56, 5, 14, 98, 60, 68, 70, 17};
    int len = sizeof(s)/sizeof(s[0]);

    int i = 0;
    int j = 0;
    int temp = 0;
    for(i = 0; i < 10; i++){
        printf("%d  ", s[i]);
    }
    printf("\n");

    for(j = 0; j < len-1; j++){

        for(i = 0; i < len-1-j; i++){
            if(s[i] < s[i+1]){
                temp = s[i];
                s[i] = s[i+1];
                s[i+1] = temp;
            }
        }
    }
    i = 0;
    for(i = 0; i < 10; i++){
        printf("%d  ", s[i]);
    }
    printf("\n");
    return 0;
}

周三

一、字符数组和字符串

1.1 概述

        字符数组:数组中的每个元素都是一个char类型的变量;

char s1[5] = {'h','e','l','l','o'};

        字符串:连续的字符,在字符数组中以‘\0’结尾。

char s3[6] = "12345"; //比较常用的写法

1.2 几个注意事项

        1、char s[]="hqyj";        sizeof(s4) 结果是5 因为结尾的 '\0' 也会被计算;

&nb

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值