数据、常量和变量 2014-3-19总结


今天学习了数据、常量和变量。


一、数据

数据分为两种:静态数据和动态数据。

1、静态数据

1)概念:静态数据是指一些永久性的数据,硬盘内存比较大,所以一般的存储在硬盘中。

2)存储的时长:计算机关闭之后再开启,这些数据依旧还在,只要你不主动删掉或者硬盘没坏,这些数据永远都在。

3)哪些是静态数据:静态数据一般是以文件的形式存储在硬盘上,比如文档、照片、视频等。

2、动态数据

1)概念:动态数据指在程序运行过程中,动态产生的临时数据,一般存储在电脑内存中。

2)存储的时长:计算机关闭之后,这些临时数据就会被清除。

3)哪些是动态数据:当运行某个程序(软件)时,整个程序就会被加载到内存中,在程序运行过程中,会产生各种各样的临 时数据,这些临时数据都是存储在内存中的。 因为是内存的访问速度比硬盘快N倍,所以应用程序加载到硬盘中去执行。

3、静态数据到动态数据的转换

静态数据到动态数据的转换:暴风影音 —> 计算机内存  <— 硬盘中内容(这里用的老师图)

                            


4、数据的大小

1)不管是静态还是动态数据,都是有0和1组成的。

2)1 Byte = 8bit , 1kb = 1024b , 1mb = 1024kb,1GB=1024MB ,1TB=1024GB      


二、常量和变量

C语言数据类型图(这里用的是老师的图)

                          


1、常量分类

1)整型常量(int)
即int类型的数据,包括了所有的整数 

2)浮点型常量(float\double):分为double和float两种数据类型
a)double:双精度浮点型,就是小数。如5.43、-2.3、0.0等,注意,0.0也算是个小数。
b)float:单精度浮点型,也是小数,比double的精确程度低,也就是说所能表示的小数位数比较少。
为了跟double区分开                来,float 型数据都是以f结尾的,比如5.43f、-2.3f、0.0f


 3)字符常量(char)
一个数字(0~9)、英文字母(a~z、A~Z)或者其他符号(+、-、!、?等)用单引号括起来,构成字符常量,            '6'、'a'、'F'、'+'、'$'等。

注意:单引号只能括住1个字符,而且不能是中文字符,下面的写法是错误的:'abc'、'123456'、'男'


 4)字符串常量
将一个或者多个字符用双引号("")括起来,就是字符串常量。如"6"、"男"、printf("Hello World");语句中的"HelloWorld"也是字符串常量。


2、变量

1)定义变量的目的:在内存中分配一块存储空间给变量,方便以后存储数据。
下面描述不同编译器下各种变量占的字符空间(单位:字节)

                                                       


2)变量的赋值

/*
1.变量的定义:变量类型   变量名
              int     score
2.变量的赋值
 scare = 100;
 scare = a;
 scare = b = 100;
 
 变量的输出
 int a = 200;
 printf("%i",a);
 常用格式符:
 1>%d\%i   整数(int)
 2>%f      小数(float、double)
 3>%c      字符(char)
*/


#include <stdio.h>

int main(int argc, const char * argv[])
{
    //这里表示 a赋值给b,然后30又赋值给b,所以b的值改变,a的值不变
    int a = 10;
    int b = 20;
    b = a;
    b = 30;
    
    //%d是一个格式符(占位符)
    printf("a = %d\n  b = %d\n",a , b);
    
    float height = 1.78f;
    
    //%f用来输出小数,默认是6位小数
    printf("身高是%.2f\n",height);
    
    char scoreGrade = 'D';
    
    //%c用来输出字符
    printf("积分等级是%c\n",scoreGrade);
    return 0;
}


3)变量在函数中得作用域

/*
 1.作用域(作用范围)
 从定义变量的那行代码开始,已知到函数结束
 */

#include <stdio.h>

int test()
{
    int score = 200;
    return 0;
}

int main(int argc, const char * argv[])
{
    int score;
    
    test();//这里调用完test函数之后,里面的score内存就消失了, 
    
    score = 100;
    
    printf("score = %d\n",score);
    return 0;
}



4)变量在代码块中得作用域

/*
1.代码块的作用:手机内存有限,为了提高手机内存的及时释放,为了提升性能。
2.变量的作用域:从定义变量的哪一行代码开始,一直到所在的代码块结束
 */
#include <stdio.h>

int main(int argc, const char * argv[])
{
    /*{
        int a = 10;//这里的代码块只能在这个{}中有效使用,其作用域是不能逃出此{}
    }//这个}执行代表这块{}函数执行完毕,将在内存中被释放消失
    printf("a = %d",a);//所以这里的printf函数不能使用变量a
    */
    int  score = 100;
    
    {
        int score = 200;
        {
            int score = 50;//这样函数输出结果score =200 ,score = 100
           /* score = 50;//这将score赋值改变为50,这样函数输出是score = 50 ,score =100  */
        }
        printf("score = %d",score);//这里能调用外面的score变量(注释此代码块中的int score做实验),但是因为代码块存在,所以这里的printf输出采取就近原则,而不是给score赋值两次,(如果赋值两次,那么第二个printf输出也是200,但结果是100,充分证明了代码块中的就近原则)
    }
    
    printf("score = %d",score);
    return 0;
}


5)练习题

//交换整形变量a、b的值。比如a = 10、b = 11;交换之后a的值是11,b的值是10,用两种方式实现


#include <stdio.h>

int main(int argc, const char * argv[])
{
    
    //1、利用第三方变量(工作)
    /*int a = 10 ,b = 11;
    int temp;
    
    temp = a;
    a = b;
    b = temp;*/
    
    //2、不利用第三方变量交换a、b的值(面试,有印象)
    int a = 10 ,b = 11;
    
    a = b - a;
    b = b - a;
    a = b + a;
    
    printf("a = %d,b = %d",a ,b);
    return 0;
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于GPS循迹小车的代码涉及到硬件和软件的部分,需要根据具体的硬件电路和功能需求进行编写,所以无法给出一份完整的代码。不过,以下是一个基本的搭配neo-6m和mpu-6050模块的GPS循迹小车的代码框架,供参考: ``` #include "stm32f10x.h" #include "stdio.h" #include "stdlib.h" #include "math.h" #define MPU6050_ADDRESS 0xD0 #define NEO6M_ADDRESS 0x42 // 定义MPU6050寄存器地址 #define MPU6050_SMPLRT_DIV 0x19 #define MPU6050_CONFIG 0x1A #define MPU6050_GYRO_CONFIG 0x1B #define MPU6050_ACCEL_CONFIG 0x1C #define MPU6050_ACCEL_XOUT_H 0x3B #define MPU6050_ACCEL_XOUT_L 0x3C #define MPU6050_ACCEL_YOUT_H 0x3D #define MPU6050_ACCEL_YOUT_L 0x3E #define MPU6050_ACCEL_ZOUT_H 0x3F #define MPU6050_ACCEL_ZOUT_L 0x40 #define MPU6050_TEMP_OUT_H 0x41 #define MPU6050_TEMP_OUT_L 0x42 #define MPU6050_GYRO_XOUT_H 0x43 #define MPU6050_GYRO_XOUT_L 0x44 #define MPU6050_GYRO_YOUT_H 0x45 #define MPU6050_GYRO_YOUT_L 0x46 #define MPU6050_GYRO_ZOUT_H 0x47 #define MPU6050_GYRO_ZOUT_L 0x48 // 定义NEO-6M寄存器地址 #define NEO6M_GPRMC 0x01 // 定义串口波特率 #define BAUDRATE 9600 // 定义小车控制接口 #define LEFT_FORWARD_GPIO GPIO_Pin_0 #define LEFT_BACKWARD_GPIO GPIO_Pin_1 #define RIGHT_FORWARD_GPIO GPIO_Pin_2 #define RIGHT_BACKWARD_GPIO GPIO_Pin_3 // 定义小车速度 #define SPEED 50 // 定义小车方向 #define LEFT 0 #define RIGHT 1 // 定义PI控制参数 #define KP 1 #define KI 0.5 // 定义角度转弧度的常量 #define DEG_TO_RAD 0.01745329251994329576923690768489 // 定义全局变量 float gyro_x, gyro_y, gyro_z; // 陀螺仪数据 float accel_x, accel_y, accel_z; // 加速度计数据 float pitch, roll, yaw; // 欧拉角 float target_yaw; // 目标航向角 float error_yaw; // 航向角误差 float integral_error_yaw; // 航向角误差积分 float pwm_left, pwm_right; // 左右轮PWM输出 // 定义函数原型 void TIM2_IRQHandler(void); void TIM3_IRQHandler(void); void USART1_IRQHandler(void); void init_GPIO(void); void init_USART1(void); void init_I2C(void); void init_TIM2(void); void init_TIM3(void); void read_MPU6050(void); void read_NEO6M(void); void control_car(void); float get_yaw(void); int main(void) { // 初始化GPIO、USART1、I2C、TIM2、TIM3 init_GPIO(); init_USART1(); init_I2C(); init_TIM2(); init_TIM3(); // 启动TIM2、TIM3 TIM_Cmd(TIM2, ENABLE); TIM_Cmd(TIM3, ENABLE); while(1) { // 读取MPU6050、NEO-6M数据 read_MPU6050(); read_NEO6M(); // 控制小车 control_car(); } } // TIM2中断服务函数 void TIM2_IRQHandler(void) { // 清除更新中断标志位 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 读取陀螺仪数据 I2C_AcknowledgeConfig(I2C1, ENABLE); I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, MPU6050_ADDRESS, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C1, MPU6050_GYRO_XOUT_H); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, MPU6050_ADDRESS, I2C_Direction_Receiver); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); gyro_x = (I2C_ReceiveData(I2C1) << 8 | I2C_ReceiveData(I2C1)); gyro_y = (I2C_ReceiveData(I2C1) << 8 | I2C_ReceiveData(I2C1)); gyro_z = (I2C_ReceiveData(I2C1) << 8 | I2C_ReceiveData(I2C1)); I2C_GenerateSTOP(I2C1, ENABLE); // 计算欧拉角 roll = atan2(accel_y, accel_z) * 180 / M_PI; pitch = atan2(-accel_x, sqrt(accel_y * accel_y + accel_z * accel_z)) * 180 / M_PI; yaw = get_yaw(); // 获取航向角 } // TIM3中断服务函数 void TIM3_IRQHandler(void) { // 清除更新中断标志位 TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 控制小车 control_car(); } // USART1中断服务函数 void USART1_IRQHandler(void) { // ... } // 初始化GPIO void init_GPIO(void) { // ... } // 初始化USART1 void init_USART1(void) { // ... } // 初始化I2C void init_I2C(void) { // ... } // 初始化TIM2 void init_TIM2(void) { // ... } // 初始化TIM3 void init_TIM3(void) { // ... } // 读取MPU6050数据 void read_MPU6050(void) { // ... } // 读取NEO-6M数据 void read_NEO6M(void) { // ... } // 控制小车 void control_car(void) { // ... } // 获取航向角 float get_yaw(void) { // ... } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值