作业1:
输入10个整数,按从小到大的顺序输出(选择排序)
每轮排序在未排序的集合中找到(最小/最大),将找到的数与未排序的
第一个数交换位置。
5 4 3 2 1 i = 0 = min
1 4 3 2 5 i+1
1 2 3 4 5
1 2 3 4 5
作业2:
从前有个人叫约瑟夫不幸入狱,监狱枪毙犯人。让33个犯人围成一个圈,
从1-7报数,数到7的出列枪毙,最后只有一个人能活下来。聪敏的约瑟夫稍加
计算活下来了,问这个位置在哪?(编程解决问题)
12
需要思考的问题
1)数组是连续的线性结构,如何构成一个环?
数组下标 k
if ( k > 32 )
k = 0;
2)如何处理死去的犯人?
for (i = 0; i < 7; i++) { //从1-7报数
if (criminal == DEAD) {
i–;
}
}
作业3:输出如下图形:
* 5 1
*** 4 3
***** 3 5
******* 2 7
********* 1 9
*********** 0 11
i=0
5-i 2*i+1
********* 1 9
******* 2 7
***** 3 5
*** 4 3
* 5 1
i=0
i+1 9-2*i
逻辑推理题:(不必写代码)
1、怎样分财宝?
有两位探险家穿越沙漠,甲携带5瓶水,乙携带3瓶水,计划8天走出沙漠,
甲乙二人约定每天每人喝半瓶水。
在旅程刚开始(水还未损耗时),二人碰上一个富商,该富商说他家就在沙漠
另一端(即甲乙二人+的目的地),如果甲乙二人能护送他顺利到家,则会分给
甲乙二人一笔巨额财宝。
由于多了一个人,所以每天每人喝1/3瓶水。
8天后,三人成功穿越沙漠。富商兑现诺言,按甲乙二人携带的水量,
按5:3的比例分给二人一笔财宝。此时甲说:“您的分配方式不公平”。
问:富商的分配方式是否公平?若不公平,则正确的分配方式应该是多少?
7:1
8/3 甲 7/3 已 1/3
2、哪一瓶为毒药?
现有100瓶液体已经编好号,其中99瓶为水,1瓶为毒药。
毒药的外观、性状、气味等与水完全相同。若小白鼠饮下毒药,
则会在24小时后死亡。
现在需要找出哪瓶为毒药,但是由于时间紧迫,只有1天时间,
为了加快验证速度,我们给你7只小白鼠。
问:设计一种给小白鼠喂食液体的验证方案,在24小时之后立即找出哪瓶为毒药
1 0 0 0 0 0 0 0 1
2 0 0 0 0 0 0 1 0
3 0 0 0 0 0 0 1 1
4 0 0 0 0 0 1 0 0
5 0 0 0 0 0 1 0 1
…
3、球的重量?
有8个球,其中一个比另外的要略重。现在只有一个天枰,在不使用砝码的情况
下最少需要称几次,才能找出这个球? 2次
三组 3 3 2
4.沙漠中的尸体?
一个人被发现死在沙漠里,手中捏这一个火柴,周围没有任何足迹,也没有其他
线索。他是怎么死的呢?
===================================================================================
1.结构体 struct
我们学过的数据类型(int、char、float等)是C语言提供的基本数据类型。
【1】什么是结构体
用户自定的一种构造类型。
用于保存不同数据类型的数据的一种构造类型。在结构体中包含了若干不同类型的
和不同含义的数据项(相同也可以),将这些数据综合起来反映某个信息。
【2】定义/声明结构体类型
struct 结构体名 {
数据类型 成员1;
数据类型 成员2;
数据类型 成员3;
…
数据类型 成员n;
};
注意:
struct 结构体名 变量名;
eg :
struct worker stuff;
练习:声明以下结构体类型及变量
1)学生成绩单:成员表列包括:学生学号、学生姓名、语文成绩、数学成绩、英语成绩
struct Score {
int id;
char name[32];
float chinese;
float math;
float english;
};
struct Score score;
2)产品生产批号:成员表列包括:产品批次、产品生产日期(年、月、日)、产地
struct Date {
int year;
int month;
int day;
};
struct Goods {
int pici;
char chandi[32];
struct Date riqi;
}
struct Goods goods;
【4】结构体变量的使用
因为结构是一个整体,不能给整个结构体赋值,只能给结构成员赋值。
struct Goods goods;
goods = {20200909, luan, {2020,9,9}}; 错误❌
引用结构体的成员 :
结构体变量名.成员名 //“.” 成员运算符
eg:
struct Date riqi;
riqi.year = 2020;
riqi.month = 9;
riqi.day = 9;
注意:
1)如果结构体的成员本身也是一个结构,需要使用成员运算符一级一级找到最低的一级成员赋值。
struct Goods goods;
goods.riqi.year = 2020;
goods.riqi.month = 9;
goods.riqi.day = 9;
2)如果两个结构体变量类型相同可以相互赋值
struct worker stuff;
struct worker manger;
stuff = manger;
练习:
键盘上输入两个学生的信息,输入的信息的信息保存在结构体中。比较两个学生的成绩高低。
出成绩高的学生信息,如果两个学生成绩相等则两个学生的信息都输出
(学号、姓名、成绩、年龄)
【5】结构体数组
如果数组内存储的数据都是结构,则该数组是结构体数组
定义结构体数组 :
数据类型 数组名[元素个数];
struct 结构体名 数组名[元素个数];
eg :
struct student stu[10];
引用结构体数组元素
数组名[下标]
eg:
stu[0];
引用结构体数组元素的成员
数组名[下标].成员名
eg:
stu[0].age = 20;
1.FS4412 开发板
【1】核心板(高速设备)
SOC Samsung Exynos4412(ARM)
Flash Emmc(4/8G)
RAM 1G
电源管理单元(unit)
【2】外围板(低速设备)
串口(serial)
网卡(DM9000)
蜂鸣器(beep)
LED灯
LCD显示器
红外接收器
DS18B20 温度传感器
KEY
拨码开关(设置开发板的启动方式)
SD卡
USB接口
电源 & 开关
2.系统移植(Linux 操作系统)
2.1 串口调试
先安装CH340 USB转串口驱动
使用串口调试工具 (以putty为例)
connection type -> Serial
Serial line -> COM3 (根据自身电脑)
speed -> 115200
Saved session ->
2.2 网络配置 (使用网络传输数据)
【1】配置ubuntu的网络
1) sudo vim /etc/network/interfaces //网络配置文件
2) 修改文件内容
auto eth0 //设置以太网卡
iface eth0 inet static //设置静态IP
address 192.168.1.3 //设置IP地址
netmask 255.255.255.0 //设置子网掩码
gateway 192.168.1.1 //设置网关的IP
3) sudo /etc/init.d/networking restart //重启网络服务使配置生效
4) 虚拟机->设置->网络适配器->桥接模式
5) ifconfig //查看网络配置
注意:不要连接无线网络
【2】配置开发板的网络
Uboot (universal boot loader) 通用引导程序
相当于PC中的BIOS 负责引导 操作系统启动(初始化设备 …)
使用者需要使用uboot的指令与 uboot进行交互
uboot 网络设置
setenv ipaddr 192.168.1.2 //设置开发板IP
setenv netmask 255.255.255.0 //设置子网掩码
setenv gatewayip 192.168.1.1 //设置网关IP
setenv serverip 192.168.1.3 //设置服务器IP
saveenv
网络测试
ping 192.168.1.3
显示结果
host 192.168.1.3 is alive 代表成功
host 192.168.1.3 is not alive 代表成功
2.2 设置tftp服务
tftp 简单文本传输协议
开发板可以使用tftp服务从ubuntu中下载操作系统 启动需要的文件
uImage //Linux系统的镜像文件
exynos4412-fs4412.dtb //设备树
1)准备工作
sudo mkdir /tftpboot
sudo chmod 777 /tftpboot -R
将 开发板镜像\uImage //Linux系统的镜像文件
exynos4412-fs4412.dtb //设备树
拷贝到/tftpboot
sudo chmod 777 /tftpboot -R
2)ubuntu下的配置
打开配置文件
sudo vim /etc/default/tftpd-hpa
修改配置文件的第4和第6行
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure -c"
重启配置服务,使配置生效
sudo /etc/init.d/tftpd-hpa restart
3)开发板的配置
下载 uImage //Linux 压缩内核镜像
exynos4412-fs4412.dtb //设备树
setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000 - 42000000
saveenv
2.3 设置nfs服务
nfs (network file system) 网络文件系统
开发板可以通过nfs与ubuntu共享文件系统(方便代码调试)
1)准备工作
sudo mkdir /source
sudo chmod 777 /source -R
将 开发板镜像\rootfs.tar.gz 拷贝到 /source
cd /source
tar -xvf rootfs.tar.gz //解压压缩包
sudo chmod 777 /source -R
2)Ubuntu下的配置
打开配置文件
sudo vim /etc/exports
修改文件内容 (注意只需要修改最后一行即可)
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
#
/source/rootfs *(rw,sync,no_subtree_check)
重启配置服务,使配置生效
sudo /etc/init.d/nfs-kernel-server restart
3)开发板的配置
挂载Linux根文件系统
setenv bootargs root=/dev/nfs nfsroot=192.168.1.3:/source/rootfs ip=192.168.1.2 init=/linuxrc console=ttySAC2,115200 rw
saveenv
完场以上所有配置后,重启开发板,不要打断开发板启动,即可看到Linux成功运行
3.设置交叉编译环境
step 1: 将gcc-4.6.4.tar.xz 拷贝到虚拟机中并解压
fs@ubuntu:~$ tar -xvf gcc-4.6.4.tar.xz
step 2: 将解压的好的文件gcc-4.6.4 剪切到/目录并重命名为toolchain
fs@ubuntu:~$ mv gcc-4.6.4 toolchain
fs@ubuntu:~$ sudo mv toolchain /
step 3: 修改文件权限
fs@ubuntu:~$ sudo chmod 777 /toolchain -R
step 4: 打开配置文件并修改
fs@ubuntu:~$ sudo vim /etc/bash.bashrc
在最后一行新建一行
export PATH= P A T H : / t o o l c h a i n / b i n s t e p 5 : 重 加 加 载 脚 本 配 置 文 件 f s @ u b u n t u : PATH:/toolchain/bin step 5: 重加加载脚本配置文件 fs@ubuntu:~ PATH:/toolchain/binstep5:重加加载脚本配置文件fs@ubuntu: source /etc/bash.bashrc
检查是否配置成功
fs@ubuntu:~$ arm-n
如果能够自动补全
fs@ubuntu:~$ arm-none-linux-gnueabi-
今日作业
根据笔记完成笔记上的所有配置