嵌入式入门学习笔记,遇到的问题以及心得体会!
DAY4
今日上午进行循环语句的学习,下午对前三天的学习进行了系统的复习,进行了查漏补缺!
今日笔记着重会对前两天的学习进行加深记忆与补漏!
且今日笔记加入了一些对计算机基本组成原理的讲解。
笔记
1,软件环境:
VM:虚拟机—》Ubuntu
pc:真机—》windows
命令:
三要素:命令名称 [选项] [参数]
注意:选项和参数是可以被省略的
mkdir:创建新目录
cd :切换目录
cd ~:切换至主目录(家目录/工作目录)
cd -:跳转至上一次刚工作过的目录
cd:默认跳转至家目录
ls :查看
ls -l:显示该文件的详细信息
ls -R:递归显示该目录以及该目录下的子目录的所有信息
ls -a:显示该目录下的所有内容(包含隐藏文件:.和…)
注意:.代表当前目录
…代表上一级目录
计算机的基本结构:
(1)输入输出设备:键盘,鼠标,显示屏…
(2)CPU处理器:算术逻辑运算器+控制器
(3)存储器:
外存:适用于存储一些不着急使用或者待处理的数据,容量较大,掉电不会丢失数据
内存:适合存储正在运行得到程序或者数据,容量比外存小,掉电会丢失数据
寄存器:容量最小,但是运行速度最快
(4)程序:
什么叫程序?
—》一组有序能够被计算机直接识别的指令
指令:能够被直接是被的操作
1.c 与a.out哪个是程序?
1.c是源代码
a.out是程序
程序的设计语言:
(1)机器语言:0和1组成,不能移植
(2)汇编语言:eg: add 12 34
(3)高级语言:C语言,C++,JAVA…
面向过程:C语言
面向对象:C++,JAVA
程序的设计步骤:
vim ----> 编译—》调试—》编译…
C语言里面总共有32个关键字:
(1)基本数据类型:char short int long float double void struct
union enum
(2)存储类型:auto static register extern
(3)控制语句:if else switch case default break continue goto for while do
(4)类型修饰符: volatile(防止编译器进行优化),const
(5)其他:return (返回值),unsigned(无符号数),signed(有符号数),typedef(重命名),
sizeof()–测字节大小,注意:sizeof不是函数而是一个运算符
注意:当sizeof的测试对象是变量名时,括号可以被省略不写!
常量:其值在程序运行期间不会被改变的数据
(1)字符常量:
(2)整形1常量:
(3)浮点型常量:
(4)字符串常量:
(5)宏常量:
宏的格式:
#define 宏名 值
#define SIZE 10
注意:书写宏的时候,宏只是一个替换
案例:
代码如下:
#include <stdio.h>
#define TEST(arg) ((arg)*(arg))
int main()
{
int argc1,argc2;
printf("请输入两个数字:\n");
//scanf("argc1 = %d,argc2 = %d",&argc1,&argc2);
scanf("%d%d",&argc1,&argc2);
TEST(argc1+argc2);
printf("result = %d\n",TEST(argc1+argc2));
//printf("argc1 = %d\targc2 = %d\n",argc1,argc2);
return 0;
}
总结:以后在书写宏的时候,给表达式中的每个变量以及表达式整体都加上括号就是一个安全的宏!!!
练习:
利用宏定义实现求两个数中的最小值(结合三目运算符)!
#include <stdio.h>
#define MIN(X,Y) ((X)<(Y)?(X):(Y))
int main()
{
int argc1,argc2;
scanf("%d%d",&argc1,&argc2);
//int min = MIN(argc1,argc2);
//printf("min = %d\n",min);
printf("min = %d\n",MIN(argc1,argc2));
return 0;
}
变量:其值在程序运行期间可以被改变的数据
变量的定义:
存储类型 数据类型 变量名;
分析:
存储类型:标志该变量在内存中的存储位置
数据类型:表示一次性分配字节空间的大小
变量名:表示该变量在内存中的名字
存储类型:auto,register,static,extern
auto:被auto修饰的变量称为自动变量,只能修饰局部变量,存储在栈区
register:寄存器变量,只能修饰局部变量,存储在寄存器中
注意:因为编译器已经被优化过了。所以会自动识别可能被重复使用到的变量,会优先考虑将其存储在寄存器中,如果寄存器放不下,则会放在栈区
static:被static修饰的变量称为静态变量,存储在静态区
(1)修饰局部变量:表示可以延长该局部变量的生命周期
(2)修饰全局变量或者函数:都表示隐藏,只能在本文件内使用
extern:从外部引入一个全局变量或者函数
总结:
(1)除了被static修饰的局部变量,其余均存储在栈区
(2)static修饰的变量包含两部分:静态全局和静态局部
注意:当被static修饰的变量没有被初始化时,其值为0.
生命周期&作用域?(思考题)
运算符:
算术运算符,关系运算符,逻辑运算符,赋值运算符
sizeof()运算符,位运算符,三目运算符,逗号运算符
算术运算符:
%:运算对象必须为整形
++:
–:
关系运算符:==
召唤小键盘:(在vm虚拟机ubuntu的vi编辑器上不用汉化召唤小键盘输入汉字)
ibus-daemon -d -r -x
—》通过ctrl 和 空格来切换中英文
作业:
1,完成菱形的打印
#include<stdio.h>
int main()
{
int i,j,k;
for (i = 1;i <= 4;i++ )
{
for(j = 1 ; j <= 4 - i;j++)
{
printf(" ");
}
for(k = 1 ; k <= 1 + 2*(i - 1 );k++)
{
printf("*");
}
printf("\n");
}
for (i = 3;i >= 1;i-- )
{
for(j = 1 ; j <= 4 - i;j++)
{
printf(" ");
}
for(k = 1 ; k <= 1 + 2*(i - 1 );k++)
{
printf("*");
}
printf("\n");
}
return 0;
}
上面的代码是我自己写的,下面的代码是我跟着老师又修改的一遍;
#include <stdio.h>
int main()
{
//实现菱形的打印
//第一步:先打印菱形的上半部分
//定义一个上半部分的行数的变量
int line;
printf("请输入需要打印的上半部分的行数:\n");
scanf("%d",&line);
printf("输出的菱形图案为:\n");
int i,j,k;
for(i=0;i<line;i++)
{
//先打印每一行中的空格的个数
for(j=0;j<line-1-i;j++)
{
printf(" ");
}
//再打印星星的个数
for(k=0;k<(2*i+1);k++)
{
printf("*");
}
//输出换行
printf("\n");
}
//再打印下半部分的菱形
for(i=line-2;i>=0;i--)
{
//先打印每一行中的空格的个数
for(j=0;j<line-1-i;j++)
{
printf(" ");
}
//再打印星星的个数
for(k=0;k<(2*i+1);k++)
{
printf("*");
}
//输出换行
printf("\n");
}
return 0;
}
2,一个数加上100之后是一个完全平方数,再加上168也是一个完全平方数,求该数是谁?(100000之内)
注意:使用sqrt()函数—>#include <math.h>
—编译代码时需要在末尾加上-lm选项
#include<stdio.h>
#include<math.h>
int main()
{
int a,b,i;
for(i = 1;i < 100000;i++)
{
a = sqrt(i + 100);
b = sqrt(i+100+168);
if(a*a==i+100 && b*b == i+100+168)
{
printf("%d\n",i);
}
}
printf("\n");
return 0;
}