首页 > 精品范文库 > 14号文库
U盘枚举(自己总结)
编辑:空山新雨 识别码:23-459070 14号文库 发布时间: 2023-05-10 16:00:33 来源:网络

第一篇:U盘枚举(自己总结)

插入U盘

直接拔出

安全拔出

A9枚举

Linux USB gadget设备驱动解析(2)---驱动调试 作者:刘洪涛, 华清远见嵌入式学院金牌讲师。

这一节主要把在实现“linuxU盘功能”过程中的一些调试过程记录下来,并加以解析。

一、背景知识

1、USB Mass Storage类规范概述

USB 组织在universal Serial Bus Mass Storage Class Spaceification 1.1版本中定义了海量存储设备类(Mass Storage Class)的规范,这个类规范包括四个

独立的子类规范,即:

1.USB Mass Storage Class Control/Bulk/Interrupt(CBI)Transport 2.USB Mass Storage Class Bulk-Only Transport 3.USB Mass Storage Class ATA Command Block 4.USB Mass Storage Class UFI Command Specification 前 两个子规范定义了数据/命令/状态在USB 上的传输方法。Bulk-Only 传输规范仅仅使用Bulk 端点传送数据/命令/状态,CBI 传输规范则使用Control/Bulk/Interrupt 三种类型的端点进行数据/命令/状态传送。后两个子规范则定义了存储介质的操作命令。ATA 命令规范用于硬盘,UFI 命令规范是针对USB 移动存储。Microsoft Windows 中提供对Mass Storage 协议的支持,因此USB 移动设备只需要遵循 Mass Storage 协议来组织数据和处理命令,即可实现与PC 机交换数据。而Flash 的存储单元组织形式采用FAT16 文件系统,这样,就可以直接在Windows的浏览器中通过可移动磁盘来交换数据了,Windows 负责对FAT16 文件系统的管理,USB 设备不需要干预FAT16 文件系统操作的具体细节。

USB(Host)唯一通过描述符了解设备的有关信息,根据这些信息,建立起通信,在这 些描述符中,规定了设备所使用的协议、端点情况等。因此,正确地提供描述符,是USB 设备正常工作的先决条件。

Linux-2.6.26内核中在利用USB gadget驱动实现模拟U盘时主要涉及到file_storage.c、s3c2410_udc.c等驱动文件(这些文件的具体结构,将在下一篇文章中 描述)。此时我们想先从这些代码中找到USB描述描述符,从中确定使用的存储类规范,从而确定协议。确定通讯协议是我们调试的基础。存储类规范是由接口描述符决定的。接口描述符各项的定义义如下:

其中,bInteaceClass、bInterfaceSubClass、bInterfaceProtocol可以判断出设备是否是存储类,以及属于哪种存储子类和存储介质的操作命令。在file_storage.c文件中,/* USB protocol value = the transport method */ #define USB_PR_CBI 0x00 // Control/Bulk/Interrupt #define USB_PR_CB 0x01 // Control/Bulk w/o interrupt #define USB_PR_BULK 0x50 // Bulk-only /* USB subclass value = the protocol encapsulation */ #define USB_SC_RBC 0x01 // Reduced Block Commands(flash)#define USB_SC_8020 0x02 // SFF-8020i, MMC-2, ATAPI(CD-ROM)#define USB_SC_QIC 0x03 // QIC-157(tape)#define USB_SC_UFI 0x04 // UFI(floppy)#define USB_SC_8070 0x05 // SFF-8070i(removable)#define USB_SC_SCSI 0x06 // Transparent SCSI 默认的情况是:

mod_data = { // Default values.transport_parm = “BBB”,.protocol_parm = “SCSI”, „„

默认的赋值如下:

bInterfaceClass=08 表示:存储类

bInterfaceSubClass=0x06 表示:透明的SCSI指令 bInterfaceProtocol=0x50 表示:bulk-only 传输

2、Bulk-Only 传输协议

下面看看Bulk-Only 传输协议:(详细的规范请阅读《Universal Serial BusMass Storage ClassBulk-Only Transport》)

设 备插入到USB 后,USB 即对设备进行搜索,并要求设备提供相应的描述符。在USBHost 得到上述描述符后,即完成了设备的配置,识别出为Bulk-Only 的Mass Storage 设备,然后即进入Bulk-Only 传输方式。在此方式下,USB 与设备间的所有数据均通过Bulk-In和Bulk-Out 来进行传输,不再通过控制端点传输任何数据。

在 这种传输方式下,有三种类型的数据在USB 和设备之间传送,CBW、CSW 和普通数据。CBW(Command Block Wrapper,即命令块包)是从USB Host 发送到设备的命令,命令格式遵从接口中的bInterfaceSubClass 所指定的命令块,这里为SCSI 传输命令集。USB设备需要将SCSI 命令从CBW 中提取出来,执行相应的命令,完成以后,向Host 发出反映 当前命令执行状态的CSW(Command Status Wrapper),Host 根据CSW 来决定是否继续发 送下一个CBW 或是数据。Host 要求USB 设备执行的命令可能为发送数据,则此时需要将 特定数据传送出去,完毕后发出CSW,以使Host 进行下一步的操作。USB 设备所执行的操

作可用下图描述:

CBW的格式如下:

dCBWSignature:

CBW的标识,固定值:43425355h(little endian)。dCBWTag:

主机发送的一个命令块标识,设备需要原样作为dCSWTag(CSW中的一部分)再发送给Host;主要用于关联CSW到对应的CBW。dCBWDataTransferLength:

本次CBW命令要求在命令与回应之间传输的字节数。如果为0,则不传输数据。bmCBWFlags:

反映数据传输的方向,0 表示来自Host,1 表示发至Host; bCBWLUN:

对于有多个LUN逻辑单元的设备,用来选择具体目标。如果没有多个LUN,则写0。

bCBWCBLength:

命令的长度,范围在0~16.CBWCB:

传输的具体命令,符合bInterfaceSubClass.中定义的命令规范,此处是SCSI CSW命令格式如下:

dCSWSignature:

CSW的标识,固定值:53425355h(little endian)dCSWTag:

设置这个标识和CBW中的dCBWTag一致,参照上面关于dCBWTag的解释 dCSWDataResidue:

还需要传送的数据,此数据根据dCBWDataTransferLength-本次已经传送的数据得到

bCSWStatus:

指示命令的执行状态。如果命令正确执行,bCSWStatus 返回0 即可。

3、SCSI指令集

Bulk-Only 的CBW 中的CBWCB 中的内容即为如下格式的命令块描述符(Command Block Descriptor)。SCSI-2 有三种字长的命令,6 字节、10字节和12字节,Microsoft Windows 环境下支持12 字节长的命令。

Operation Code:

操作代码,表示特定的命令。高3 位为Group Code,共有8 种组合,即8 个组,低5 五位为Command Code,可以有32 种命令。Logicol unit Number:

为了兼容SCSI-1 而设的,此处可以不必关心。Logical block address:

为高位在前,低位在后的逻辑块地址,即扇区地址。第2 位为高位,第3、4、5 依次为低位。

Transfer length:

为需要从逻辑块地址处开始传输的扇区数(比如在Write 命令中)。Parameter list length:

为需要传输的数据长度(比如在Mode Sense 命令中); Allocation length:

为初始程序为返回数据所分配的最大字节数,此值可以为零,表示不需要传送数据。

SCSI指令集的Direct Accesss 类型存储介质的传输命令有许多,Mass Storage协议只用到了其中的一些。更多的SCSI指令参见:http://en.wikipedia.org/wiki/SCSI_command 指令代码 指令名称 说明

04h Format Unit 格式化存储单元 12h Inquiry 索取器件信息 1Bh Start/Stop load/unload 55h Mode select 允许Host对外部设备设置参数。5Ah Mode Sense 向host传输参数 Eh Prevent/Allow Medium Removal 写保护

>28h Read(10)Host读存储介质中的二进制数据 A8h Read(12)同上,不过比较详细一点 25h Read Capacity 要求设备返回当前容量

23h Read Format Capacity 查询当前容量及可用空间 03h Request Sense 请求设备向主机返回执行结果,及状态数据

01h Rexero Unit 返回零轨道 2Bh Seek(10)为设备分配到特定地址 1Dh Send Diagnostic 执行固件复位并执行诊断

00h Test Unit Ready 请求设备报告是否处于Ready状态 2Fh Verify 在存储中验证数据

2Ah Write(10)从主机向介质写二进制数据 AAh Write(12)同上,不过比较详细 2Eh Write and Verify 写二进制数据并验证

对于不同的命令,其命令块描述符略有不同,其要求的返回内容也有所不同,根据相 应的文档,可以对每种请求作出适当的回应。比如,下面是INQUIRY 请求的命令块描述符和其返回内容的数据格式:如:INQUIRY 命令描述符:

返回数据格式

Host 会依次发出INQUIRY、Read Capacity、UFI Mode Sense 请求,如果上述请求的返回结果都正确,则Host 会发出READ 命令,读取文件系统0 簇0 扇区的MBR 数据,进入文件系统识别阶段。

4、利用USB View观察结果

可通过USB View软件查看到USB设置阶段获取到的信息。

二、出现的主要问题

在调试过程中遇到了一个问题。现象是:在目标板加载完驱动后,即执行完: # insmod g_file_storage.ko file=“/dev/mtdblock2” stall=“0” removable=“1” 后,接好USB线。此时在windows端设备出有usb storage设备加入,但出现不了盘符。

下面记录下调试过程。

三、调试过程

根据规范,当完成SCSI指令集中Inquiry 命令时,可以出现盘符。所以可以通过bushound软件查看通讯过程,找出原因。下面是利用bushound工具在出现问题时采集到的数据。

Dev Phase Data Info Time Cmd.Phase.Ofs------------------------------------26 CTL 80 06 00 0100 00 00 1012 03 01 02........%.......4.8ms 1.2.0 03 01..1.2.16 26 CTL 80 06 00 0201 01 04 c000 00 20 00 GET DESCRIPTR 16us 3.1.0 26 DI 09 02 20 0001 09 04 0081 02 40 0002 40 00 00 P.....@......@..3.2.16 26 CTL 80 06 00 0301 01 04 c000 00 04 00 GET DESCRIPTR 15us 5.1.0 26 DI 04 03 09 04....3.9ms 6.1.0 26 CTL 80 06 03 0309 04 1a 00 GET DESCRIPTR 18us 7.1.0 26 DI 1a 03 33 0030 00 34 0037 00 37 0000 00 00 00 SET CONFIG 16us 8.1.0 26 CTL 01 0b 00 0000 00 01 00 CLASS 62ms 10.1.0 26 DI 00.3.9ms 10.2.0 26 DO 55 53 42 4324 00 00 0000 00 00 0000 00 00...$...........11.1.16 26 DI 00 80 02 024c 69 6e 752d 53 74 6f64 67 65 74 File-Stor Gadget 12.1.16 30 33 31 32 0312 12.1.32 26 CTL 80 06 00 0201 01 04 c000 02 08 06...............4.1ms 13.2.0 50 05 07 0500 07 05 0200 00 20 00 GET DESCRIPTR 2.7sc 14.1.0 26 DI 09 02 20 0001 09 04 0081 02 40 0002 40 00 00 P.....@......@..14.2.16 26 USTS 05 00 00 c0 no response 2.8sc 15.1.0 注意上面红色部分的代码,DO发出了55 53 42 43开 始的CBW命令块,命令码是12,即Inquiry命令。要求目标返回Inquiry命令要求的数据,长度是0x24。接下来设备端通过DI返回了设备信 息。按照规范,在返回完了数据后,设备端还应该通过DI向系统返回CSW的值。但实际的捕获内容并没有。所以导致不能正确出现盘符。

在file_storage.c中,发送数据时都会调用到start_transfer()函数。在此函数中加入printk调试语句,观察现象。发现只要加入的调试语句,windows端就能够正常设别设备了。于是,可以猜测是因为需要在连续 两次发送之间加上一些延时。在函数中加入udelay(800)后,windows系统可以正常发现设备了。具体的代码架构,将在下一遍文章中解析。下面是程序正常后,用bushound捕获到的数据。

红色部分,可以看出设备正确的按照规范在发送完数据后,返回CSW信息。

四、总结做好USB gadget驱动、或者USB host驱动调试需要: ·掌握一定的知识基础

包括:USB协议、具体的类设备规范、USB驱动程序架构、USB设备端控制器操作等。·合理利用调试工具。

包括:USB view、bushound、及一些硬件USB信号分析仪。

一、追踪USB大容量设备的实现流程

1、从main.c开始

(1)main函数的执行流程

Set_System();//设置时钟、端口等。

Set_USBClock();//设置usb的时钟

USB_Interrupts_Config();//设置中断

Led_Config();//设置所使用的到的灯。

MSD_Init();//SD卡初始化

Get_Medium_Characteristics();//获取SD块总数、每块字节数。

USB_Init();//USB_init.c提供的初始化函数。从这里开始USB设备被主机检测到。

while(1)

{ //USB的工作都是在中断中完成的,主执行流程什么也没做。

}

(2)与鼠标例程不同的地方

在中断配置中,使能了USB高优先级中断。

NVIC_InitStructure.NVIC_IRQChannel= USB_HP_CAN_TX_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

用到了几个灯指示,这个我的开发板上用不到,就不详细看了。

MSD_Init(),是对SD卡进行初始化。该函数在msd.c中,我看了一下它的SD卡实现的代码,比我的SD函数代码齐整多了。以后有时间要把我的USB驱动好好的整理一下。不过现在就先不管了。

接下来这个函数获取SD卡的容量,这样的函数我在SD卡驱动中也实现了,改变一下调用方式就行了。

USB_Init()函数在usb_init.c库函数中,但它最终会调用user_prop.c宏的用户初始化例程。下面就追踪进去看一看。

(3)大容量存储设备的初始化

void MASS_init()

{ pInformation->Current_Configuration = 0;

PowerOn();连接电缆主机很快发总线复位。

_SetISTR(0);

wInterrupt_Mask = IMR_MSK;

_SetCNTR(wInterrupt_Mask);开启复位和传输中断。

pInformation->Current_Feature = MASS_ConfigDescriptor[7];

while(pInformation->Current_Configuration == 0)

{

NOP_Process();

}

bDeviceState = CONFIGURED;//这句执行完成后,设备处于已配置状态。我先在这里加一句调试语句。

#if usb_debug

Uart_PutString(“设备已配置”);

#endif

}

2、进入复位中断

(1)先列出中断处理代码

发生总线复位中断以后,处理是在usb_prop.c的Mass_Reset()函数中完成的。

void MASS_Reset(){

Device_Info.Current_Configuration = 0;

SetBTABLE(BTABLE_ADDRESS);

SetEPType(ENDP0, EP_CONTROL);//端点0控制端点

SetEPTxStatus(ENDP0, EP_TX_NAK);//不响应IN

SetEPRxAddr(ENDP0, ENDP0_RXADDR);//设置接收缓冲区(OUT)

SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);接收长度。

SetEPTxAddr(ENDP0, ENDP0_TXADDR);//发送缓冲区(IN)

Clear_Status_Out(ENDP0);

SetEPRxValid(ENDP0);//使能端点0的接收。

SetEPType(ENDP1, EP_BULK);//端点1批量模式

SetEPTxAddr(ENDP1, ENDP1_TXADDR);//设置发送缓冲区(IN)

SetEPTxStatus(ENDP1, EP_TX_NAK);发送不响应。

SetEPRxStatus(ENDP1, EP_RX_DIS);//接收无效。对OUT无效

SetEPType(ENDP2, EP_BULK);//端点2批量模式

SetEPRxAddr(ENDP2, ENDP2_RXADDR);//设置接收缓冲区OUT

SetEPRxCount(ENDP2, Device_Property.MaxPacketSize);

SetEPRxStatus(ENDP2, EP_RX_VALID);

SetEPTxStatus(ENDP2, EP_TX_DIS);//发送无效,对IN无效

SetDeviceAddress(0);//使能USB接口模块。

CBW.dSignature = BOT_CBW_SIGNATURE;

Bot_State = BOT_IDLE;//命令状态机初始化为空闲状态

}

在这里没有我没有看到将批量端点设置为双缓冲模式的迹象,难道这个例程没有用它?

3、进入枚举过程

因为在鼠标例程中已经详细分析过枚举过程,这里主要是大容量设备枚举过程中不同的地方做一下分析。

(1)获取设备描述符、设置地址。

(2)获取配置描述符

(3)获取配置描述符集合,这里主要讲接口描述符分析一下。

0x09, /* bLength: Interface Descriptor size */

0x04, /* bDescriptorType: */

0x00, /* bInterfaceNumber: Number of Interface */

0x00, /* bAlternateSetting: Alternate setting */

0x02, /* bNumEndpoints*/ 使用两个端点

0x08, /* bInterfaceClass: MASS STORAGE Class,大容量存储类 */

0x06, /* bInterfaceSubClass : SCSI transparent,SCSI传输*/

0x50, /* nInterfaceProtocol,仅批量传输*/ 4, /* iInterface: */

(4)获取字符串描述符

(5)类请求实现:

类获取逻辑盘:

一般返回0

类请求复位:

ClearDTOG_TX(ENDP1);

ClearDTOG_RX(ENDP2);

CBW.dSignature = BOT_CBW_SIGNATURE;

Bot_State = BOT_IDLE;

(6)设置配置

在用户设置的回调函数中,又调用

void Mass_Storage_SetConfiguration(void)

{

if(pInformation->Current_Configuration)

{

ClearDTOG_TX(ENDP1);

ClearDTOG_RX(ENDP2);

Bot_State = BOT_IDLE;}

} 这个工作前面已经做过了。

4、主机发命令INQUIRY

(1)首先进入批量输出中断

该中断的回调函数调用Mass_Storage_Out()进行处理。

(2)追踪进入Mass_Storage_Out()

void Mass_Storage_Out(void)

{

u8 CMD;

CMD = CBW.CB[0];//

Data_Len = GetEPRxCount(ENDP2);

PMAToUserBufferCopy(Bulk_Data_Buff,ENDP2_RXADDR, Data_Len);

switch(Bot_State)

{

case BOT_IDLE:

CBW_Decode();//第一次收到命令肯定调用这个解码函数。

break;//它的作用应该是填充CBW命令块封包结构

case BOT_DATA_OUT:

if(CMD == SCSI_WRITE10)

{

SCSI_Write10_Cmd();

break;

}

}

(3)追踪进入CBW_Decode()

这个函数的代码较长,我就不列举在这里了,我就分析一下本次的主要工作。

首先将用户缓冲区的数据复制到命令封包结构里面。

然后准备好状态封包结构:

CSW.dTag = CBW.dTag;//这个标志由主机生成,可以用于检查设备是否正确收到该命令。

CSW.dDataResidue = CBW.dDataLength;

然后主要是根据命令操作码,调用相应的SCSI命令处理函数。

switch(CBW.CB[0])

{

case SCSI_REQUEST_SENSE:

SCSI_RequestSense_Cmd();

break;

case SCSI_INQUIRY:

SCSI_Inquiry_Cmd();

break;

我这里就列出了两项,实际的命令是很多的。本次主要是查询处理。

(4)追踪进入SCSI_Inquiry_Cmd()

以上函数是在usb_bot.c里面,现在跳转到usb_scsi.c里面。

这个函数的主要工作是调用Transfer_Data_Request(Inquiry_Data, Inquiry_Data_Length)来完成。

这个Inquiry_Data = Standard_Inquiry_Data,后面这个Standard_Inquiry_Data是scsi_data.c里面定义的一个数据结构,专门用于inquiry命令的返回。

u8 Standard_Inquiry_Data[] =

{

0x00, /* Direct Access Device */

0x80, /* RMB = 1: Removable Medium */

0x02, /* Version: No conformance claim to standard */

0x02, //这里圈圈的书上说应该为 0x01

36BULK_MAX_PACKET_SIZE;

Block_offset = BULK_MAX_PACKET_SIZE;

}

else

{

UserToPMABufferCopy(Data_Buffer + Block_offset, ENDP1_TXADDR, BULK_MAX_PACKET_SIZE);

Block_Read_count-= BULK_MAX_PACKET_SIZE;

Block_offset += BULK_MAX_PACKET_SIZE;

}

SetEPTxCount(ENDP1, BULK_MAX_PACKET_SIZE);SetEPTxStatus(ENDP1, EP_TX_VALID);

Memory_Offset += BULK_MAX_PACKET_SIZE;

Transfer_Length-= BULK_MAX_PACKET_SIZE;//剩下的需要传输的字节数。

CSW.dDataResidue-= BULK_MAX_PACKET_SIZE;

Led_RW_ON();

}

这里不清楚的是主机是一次把512字节读完,还是每次发一个命令读取64字节。我觉得应该是发一次读命令,8次“IN”读取一个扇区,再发一个“IN”读取命令状态封包。

8、写命令WRITE(10)

这个命令的处理过程跟读命令的处理差不多,只是最后它会调用Write_Memory()进行处理。

i = 0;

for(;Counter < temp;Counter++)

{

Data_Buffer[Counter] = Bulk_Data_Buff[i];

i++;

}

从接受缓冲区得到的数据总是先放到用户缓冲区,这个缓冲区有512个字节。

if(!(Transfer_Length % 512))

{

Counter = 0;

MSD_WriteBlock(Data_Buffer, Memory_OffsetInquiry之后会发出ReadFormatCapacity命令,这个命令在SCSI规范中是“厂家自定义命令”,可以参考UFI命令集文档(实际上,U盘所使用的所有SCSI命令集都可以参考UFI文档,它比SCSI标准文档更简洁明了)。注意这个命令在BusHound里是没有描述的,必须在“Device”选项页里勾选上这个U盘所对应的USB Mass Storage Device这个节点,才能看到这个命令的数据流。

-ReadFormatCapacity之后会发出ReadCapacity命令。

-U盘读数据(读扇区)时会发送Read(10)。ReadCapacity完成后就会发送Read(10)读取U盘的第一个扇区。

-U盘写数据时(写扇区)会发送Write(10)。

-TestUnitReady会在无其他数据传输时会定时发送,如果设备没有回应成功的CSW给主机,则主机认为设备已不存在。此时如果再双击磁盘图标,Windows会提示“请插入磁盘”。RequestSense:如果CSW指示此次传输不成功,那么主机会发出此请求。ModeSense6/10这两个命令可以不支持(不支持不代表不反应,任何一个命令你都要做出反应,对于不支持的命令,可以通过STALL握手来向主机表明),暂时也未遇到过什么异常情况,而且我查看过一些U盘,有相当一部分就是随便回了几个数据给主机。这两个命令只会在U盘插入后发送一次,此后不再发送。

U盘开发的几点体会

如果你开发过USB相关项目,理解USB的一些基本概念,例如设备描述符、配置描述符、子类规范等,那么开发U盘只要概念清晰应该不难。以下是我开发过程中的几个相关步骤:

       保证USB 芯片正常工作,用其他USB成功项目验证硬件连接及固件的正确性

按Mass Storage协议 Bulk-Only 模式提供描述符,使PC 机控制面板上设备类型出现Mass Storage Device 响应SCSI指令集中Inquiry 命令,可以出现盘符 实现FAT16文件系统

处理SCSI命令集中READ命令及其他UFI命令,可以访问盘符 处理SCSI命令集中WRITE命令 U盘开发成功

开发U盘有三个工具软件应该必备:USBVIEW 察看设备描述符,端点测试等;BUSHOUND 截取USB总线数据,可分析UFI命令及U盘返回的数据流;串口助手可实时了解U盘所收命令流及程序流程由于每个人知识面不同,我想实现上面的几个步骤遇到的问题也不一样。对我最大的困惑是实现FAT16文件系统,直到在微软网站找到它的白皮书才算解惑。这里简介一下方便大家有的放矢。USB 组织定义了海量存储设备类(Mass Storage Class)的规范,这个类规范包括四个独立的子类规范,即:

1.USB Mass Storage Class Control/Bulk/Interrupt(CBI)Transport 2.USBMass Storage Class Bulk-Only Transport 3.USB Mass Storage Class ATA Command Block 4.USB Mass Storage Class UFI Command Specification。

前两个子规范定义了数据/命令/状态在USB 上的传输方法。Bulk-Only 传输规范仅仅使用Bulk 端点传送数据/命令/状态,CBI 传输规范则使用Control/Bulk/Interrupt三种类型的端点进行数据/命令/状态传送。后两个子规范则定义了存储介质的操作命令。ATA 命令规范用于硬盘,UFI 命令规范是针对USB 移动存储。

Windows95 OSR2和Windows 98开始支持FAT32 文件系统,它是对早期DOS的FAT16文件系统的增强,由于文件系统的核心--文件分配表FAT由16位扩充为32位,所以称为FAT32文件系统。在一逻辑盘(硬盘的一分区)超过 512 兆字节时使用这种格式,会更高效地存储数据,减少硬盘空间的浪费,一般还会使程序运行加快,使用的计算机系统资源更少,因此是使用大容量硬盘存储文件的极有效的系统。本人对Windows 98下的FAT32 文件系统做了分析实验,总体上与FAT16文件系统变化不大,现将有关变化部分简介如下:

(一)FAT32 文件系统将逻辑盘的空间划分为三部分,依次是引导区(BOOT区)、文件分配表区(FAT区)、数据区(DATA区)。引导区和文件分配表区又合称为系统区。

(二)引导区从第一扇区开始,使用了三个扇区,保存了该逻辑盘每扇区字节数,每簇对应的扇区数等等重要参数和引导记录。之后还留有若干保留扇区。而FAT16文件系统的引导区只占用一个扇区,没有保留扇区。

(三)文件分配表区共保存了两个相同的文件分配表,因为文件所占用的存储空间(簇链)及空闲空间的管理都是通过FAT实现的,FAT如此重要,保存两个以便第一个损坏时,还有第二个可用。文件系统对数据区的存储空间是按簇进行划分和管理的,簇是空间分配和回收的基本单位,即,一个文件总是占用若干个整簇,文件所使用的最后一簇剩余的空间就不再使用,而是浪费掉了。

从统计学上讲,平均每个文件浪费0.5簇的空间,簇越大,存储文件时空间浪费越多,利用率越低。因此,簇的大小决定了该盘数据区的利用率。FAT16系统簇号用16位二进制数表示,从0002H到FFEFH个可用簇号(FFF0H到FFFFH另有定义,用来表示坏簇,文件结束簇等),允许每一逻辑盘的数据区最多不超过FFEDH(65518)个簇。FAT32系统簇号改用32位二进制数表示,大致从00000002H到FFFFFEFFH个可用簇号。FAT表按顺序依次记录了该盘各簇的使用情况,是一种位示图法。每簇的使用情况用32位二进制填写,未被分配的簇相应位置写零;坏簇相应位置填入特定值;已分配的簇相应位置填入非零值,具体为:如果该簇是文件的最后一簇,填入的值为FFFFFF0FH,如果该簇不是文件的最后一簇,填入的值为该文件占用的下一个簇的簇号,这样,正好将文件占用的各簇构成一个簇链,保存在FAT表中。0000000H、00000001H两簇号不使用,其对应的两个DWORD位置(FAT表开头的8个字节)用来存放该盘介质类型编号。FAT表的大小就由该逻辑盘数据区共有多少簇所决定,取整数个扇区。

(四)FAT32系统一簇对应8个逻辑相邻的扇区,理论上,这种用法所能管理的逻辑盘容量上限为16TB(16384GB),容量大于16TB时,可以用一簇对应16个扇区,依此类推。FAT16系统在逻辑盘容量介于128MB到256MB时,一簇对应8个扇区,容量介于256MB到512MB时,一簇对应16个扇区,容量介于512MB到1GB时,一簇对应32个扇区,容量介于1GB到2GB时,一簇对应32个扇区,超出2GB的部分无法使用。显然,对于容量大于512MB的逻辑盘,采用FAT32的簇比采用FAT16的簇小很多,大大减少了空间的浪费。

但是,对于容量小于512MB的盘,采用FAT32虽然一簇8个扇区,比使用FAT16一簇16个扇区,簇有所减小,但FAT32的FAT表较大,占用空间较多,总数据区被减少,两者相抵,实际并不能增加有效存储空间,所以微软建议对小于512M的逻辑盘不使用FAT32。

另外,对于使用FAT16文件系统的用户提一建议,硬盘分区时,不要将分区(逻辑盘)容量正好设为某一区间的下限,例:将一逻辑盘容量设为1100M(稍大于1024M),则使用时其有效存储容量比分区为950M的一般还少,因其簇大一倍,浪费的空间较多。还有,使用FDISK等对分区指定容量时,由于对1MB的定义不一样(标准的二进制的1MB为1048576B,有的系统将1MB理解为1000000B,1000KB等),及每个分区需从新磁道开始等因素,实际分配的容量可能稍大于指定的容量,亦需注意掌握。

(五)根目录区(ROOT区)不再是固定区域、固定大小,可看作是数据区的一部分。因为根目录已改为根目录文件,采用与子目录文件相同的管理方式,一般情况下从第二簇开始使用,大小视需要增加,因此根目录下的文件数目不再受最多512的限制。FAT16文件系统的根目录区(ROOT区)是固定区域、固定大小的,是从FAT区之后紧接着的32个扇区,最多保存512个目录项,作为系统区的一部分。

(六)目录区中的目录项变化较多,一个目录项仍占32字节,可以是文件目录项、子目录项、卷标项(仅跟目录有)、已删除目录项、长文件名目录项等。目录项中原来在DOS下保留未用的10个字节都有了新的定义,全部32字节的定义如下:

(1)0--7字节 文件正名。(2)8--10字节 文件扩展名。

(3)11字节 文件属性,按二进制位定义,最高两位保留未用,0至5位分别是只读位、隐藏位、系统位、卷标位、子目录位、归档位。

(4)12--13字节 仅长文件名目录项用,用来存储其对应的短文件名目录项的文件名字节校验和等。(5)14--15字节 24位二进制的文件建立时间,其中的高5位为小时,次6位为分钟。

(6)16--17字节 16位二进制的文件建立日期,其中的高7位为相对于1980年的年份值,次4位为月份,后5位为月内日期。

(7)18--19字节 16位二进制的文件最新访问日期,定义同(6)。(8)20--21字节 起始簇号的高16位。

(9)22--23字节 16位二进制的文件最新修改时间,其中的高5位为小时,次6位为分钟,后5位的二倍为秒数。

(10)24--25字节 16位二进制的文件最新修改日期,定义同(6)。(11)26--27字节 起始簇号的低16位。(12)28--31字节 32位的文件字节长度。

其中第(4)至(8)项为以后陆续定义的。对于子目录项,其(12)为零;已删除目录项的首字节值为E5H。在可以使用长文件名的FAT32系统中,文件目录项保存该文件的短文件名,长文件名用若干个长文件名目录项保存,长文件名目录项倒序排在文件短目录项前面,全部是采用双字节内码保存的,每一项最多保存十三个字符内码,首字节指明是长文件名的第几项,11字节一般为0FH,12字节指明类型,13字节为校验和,26--27字节为零。

(七)以前版本的 Windows 和DOS与 FAT32 不兼容,不能识别FAT32分区,有些程序也依赖于 FAT16文件系统,不能和 FAT32 驱动器一道工作。将硬盘转换为 FAT32,就不能再用双引导运行以前版本的Windows(Windows 95 [Version 4.00.950]、Windows NT 3.x、Windows NT 4.0 和 Windows 3.x)。

磁盘结构综述 1.硬盘结构

硬盘的内部是由圆形金属片堆叠起来的,每个盘片的两面都有一个磁头(Head)负责读写这个磁面(Side),在每个磁面上划分了一圈一圈的同心圆,叫做柱面(Cylinder)对于软盘通常称之为磁道,在每个柱面中又划分了若干段,称之为扇区(Sector)。由于技术的发展,硬盘的密度越来越大,使得硬盘的实际盘片数越来越少,对磁盘操作的柱面、磁头、扇区被硬盘控制器内部转换,已经不是实际的柱面、磁头、扇区了。由于最早时磁盘存取系统估计不足,传输数据时只给扇区留了6位,柱面留了10位,磁头留了8位。也就是说,柱面最大只能为1023。但是大硬盘的柱面远大于这个数,所以后来就采用将柱面数减少,将磁头数增加的方式来满足磁盘寻址的要求,对于实际地址的转换在BIOS中进行,这叫逻辑块寻址方式(Logical Block Addressing,LBA)硬盘中有关柱面、磁头、扇区的数据都是以此为基准的。

第二篇:简单枚举个性化教案

大愚教育中小学个性化学习中心

简单枚举

专题解析:

枚举是一种常见的分析问题、解决问题的方法。一般地,要根据问题要求,一一列举问题解答。运用枚举法解应用题时,必须注意无重复、无遗漏,因此必须有次序、有规律地进行枚举。运用枚举法解题的关键是要正确分类,要注意以下两点:一是分类要全,不能造成遗漏;二是枚举要清,要将每一个符合条件的对象都列举出来。

例1.小华家到学校有3条路可走,从学校到文峰公园有4条路可走。从小华家到文峰公园,有几种不同的走法?

分析与解答:为了帮助理解题意,我们可以画出如上示意图。

我们把小华的不同走法一一列举如下:根据列举可知,从小明家经学校到文峰公园,走①路有4种不同走法,走②路有4种不同走法,走③路也有4种不同走法,共有4×3=12种不同走法。

练习一

1.从甲地到乙地,有3条公路直达,从乙地到丙地有2条铁路直达。从甲地到丙地有多少种不同走法?

2.新华书店有3种不同的英语书,4种不同的数学读物销售。小明想买一种英语书和一种数学读物,共有多少种不同买法?

例2.用红、绿、黄三种信号灯组成一种信号,可以组成多少种不同的信号?

分析与解答:要使信号不同,要求每一种信号颜色的顺序不同,我们可以把这些信号进行列举。可以看出,红色信号灯排在第一个位置时,有两种不同的信号,绿色信号灯排在第一个位置时,也有两种不同的信号,黄色信号灯排在第一个位置时,也有两种不同的信号,因而共有3个2种不同排列方法,即2×3=6种。

练习二

1.用红、黄、蓝三种颜色涂圆圈,每个圆圈涂一种颜色,一共有多少种不同的涂法?○○○

大愚教育中小学个性化学习中心

2.用2、3、5、7四个数字,可以组成多少个不同的四位数?

例3.一个长方形的周长是22米,如果它的长和宽都是整米数,那么这个长方形的面积有多少种可能?

分析与解答:由于长方形的周长是22米,可知它的长与宽之和为11米。下面列举出符合这个条件的各种长方形:

练习三

1.一个长方形的周长是30厘米,如果它的长和宽都是整厘米数,那么这个长方形的面积有多少种可能值?

2.3个自然数的乘积是18,问由这样的3个数所组成的数组有多少个?如(1.2.9)就是其中的一个,而且数组中数字相同但顺序不同的算作同一数组,如(1.2.9)和(2.9,1)是同一数组。

例4.有4位小朋友,寒假中互相通一次电话,他们一共打了多少次电话?

分析与解答:把4个小朋友分别编号:A、B、C、D,A与其他小朋友打电话,应该打3次,同样B小朋友也应打3次电话,同样C、D应该各打3次电话。4个小朋友,共打了3×4=12次。但题目要求两个小朋友之间只要通一次电话,那么A打电话给B时,A、B两人已经通过话了,所以B没有必要再打电话给A,照这样计算,12次电话中,有一半是重复计算的,所以实际打电话的次数是3×4÷2=6次。

练习四

1.6个小队进行排球比赛,每两队比赛一场,共要进行多少次比赛?

2.小芳出席由19人参加的联欢会,散会后,每两人都要握一次手,他们一共握了多少次手?

课后练习

1.明明有2件不同的上衣,3条不同的裤子,4双不同的鞋子。最多可搭配成多少种不同的装束?

2.用数字1、2、3.可以组成多少个不同的三位数?分别是哪几个数?

3把15个玻璃球分成数量不同的4堆,共有多少种不同的分法?

4.有8位小朋友,要互通一次电话,他们一共打了多少次电话?

第三篇:《枚举算法》教学设计

《枚举算法》教学设计

苍南县成人教育中心学校 陈荣军

一、教学目标

1、知识与技能目标:

理解枚举算法的基本原理,熟悉枚举算法程序设计的基本思路及程序结构特点;学会使用枚举算法解决现实生活、学习中所遇到的问题。

2、过程与方法:

围绕“课堂任务导航程序”,通过课堂任务设计,让学生熟悉用枚举算法求解问题的基本过程,并把它运用到实际生活中去解决问题,学会选择适当的枚举方法多角度分析问题,解决问题。

3、情感态度与价值观:

激发学生的学习热情,提高学生自主学习能力,增强学生创新意识;引导学生关注枚举算法在社会生活中的应用,并以此培养学生将算法思想运用到解决实际问题中去的能力。

二、学情分析

本节内容的教学对象是普通高中高一学生,他们经过半学期的信息技术教学,具备了一定的计算机操作能力;在VB程序设计方面,也已经有所学习,具备一定的基础,但因所上课时不多,学生对VB还只是略知皮毛,语法及编程能力有待于进一步提高。

三、教材分析

1、本节主要内容介绍

枚举算法是程序设计中使用最为普遍、学生必须熟练掌握和正确运用的一种算法。它利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检查,从中找出符合要求的答案。用枚举算法解决问题,通常可以从确定范围、逐一列举,验证条件、逐一验证这两个方面进行分析,把这两个方面分析好了,问题自然会迎刃而解。

2、重点难点分析 教学重点:

(1)理解枚举算法的基本原理。

(2)能根据问题描述确定枚举范围,并能用程序正确表示验证条件。(3)枚举算法的程序实现。教学难点:

(1)各种枚举算法的优劣评价。(2)编程实现枚举算法。

四、教学设计理念 采用了以学生的学习和发展为中心,基于建构主义理论的任务驱动、情境教学等教学方法,突出自主、合作、探究等学习方法;强调信息技术与生活实际的联系,培养学生的逻辑思维能力、解决问题的能力以及创新意识等;设置多元化的评价方式,让学生掌握学习内容的同时,形成交流与评价的能力。

主要教学方法:讲授法、演示法、任务驱动、情境教学等 主要学习方法:自主学习,合作探究学习等

五、教学策略

通过“课堂任务导航程序”,在教学过程中,围绕“情境导入→回顾算法思想→任务引领→自主学习→合作探究→交流评价→课堂总结”的教学流程来展开教学活动。

六、教学环境

教师用VB自制的“课堂任务导航程序”(客户端)、教师服务端程序、多媒体网络教室、多媒体教学软件、VB6.0中文企业版等。

七、教学过程

一、情境导入(3分钟)

教师活动:同学们,大家好!首先,很高兴今天能给大家上一节课,希望老师今天的这节课能让大家有所收获。在上新课内容之前,老师想先请同学们帮老师一个忙(教师广播展示VB制作的“QQ登录程序”):老师前段时间申请了个QQ,结果把密码给忘记了,但我记得密码是由六位相同的数字组成,哪位同学能上来帮老师找出密码?

学生活动:学生上台,根据老师的描述,从000000到999999一一测试密码,最终找到密码。教师活动:非常感谢这位同学的帮忙!这位同学能说下,你是怎么找出密码的吗? 学生活动:从000000,111111,222222„„ 999999这样逐个测试。教师活动:很好。像刚才这位同学这样,根据老师给的范围,逐一列举所有可能,并根据程序提示(验证条件)逐一验证,从而找出答案的方法就是今天我们要来共同学习的《枚举算法》。

设计理念:通过学生熟悉的QQ密码破解来引入课堂,增强学生兴趣,也能使学生乐于接受。

二、回顾枚举算法思想,提出课堂任务(5分钟)

教师活动:教师广播展示课件,学习枚举算法的概念,说明枚举算法的两个关键点:

1、确定范围,一一列举(既不遗漏,也不多余);

2、确定条件,逐一验证。教师活动:在了解了枚举算法的概念后,同学们能不能列举几个我们实际生活中用枚举算法解决的问题的例子呢? 学生活动:学生举例(教师根据例子引导分析,重点强调“确定范围、一一列举,根据条件、逐一验证”)

教师活动:非常好!看来大家对枚举算法已经有了一定的理解了,接下来,我们来看下在程序里面,如何实现枚举算法解决问题。请大家打开桌面“学生”文件夹里的“课堂任务导航.exe”,完成“任务一”。(教师简要说明“课堂任务导航程序“使用方法)

三、课堂任务一(10分钟)

学生活动:根据课堂任务导航程序及帮助信息自主完成课堂“任务一”(4分钟)教师活动:教师巡视、个别指导,观察、总结并及时记录学生在完成任务过程中出现的问题。同时,在“教师服务端”程序中观察展示学生任务一的完成情况,及时了解学生的学习进度。

任务反馈:大部分学生能顺利完成任务一,对于不能自主完成的,可由已完成学生帮助完成。

教师活动:很好!大部分同学已经完成任务一了,接下来让我们一起看下我们的程序是如何实现枚举算法的。教师展示任务一程序(广播)教师活动:我们知道要想实现枚举算法,主要是要做到两点:一个是确定枚举范围进行一一列举;还有就是根据条件,逐一验证。我们来看下我们的程序的怎么实现这两点的?

学生活动:观察程序,思考。

教师活动:我们先来看下“确定范围、一一列举”在程序里是如何体现的?(6分钟)

学生活动:使用for语句实现

教师活动:“根据条件,逐一验证”呢? 学生活动:if语句

教师活动:很好!一般实现枚举算法的程序都是由循环结构嵌套分支结构组成。好了,大家现在已经知道了枚举算法的程序结构了,接下来请同学们继续完成任务二。

(设计理念:通过任务一的设计,让学生自主探究学习,培养学生的自主探究学习能力,通过学生互助,培养学生互帮互助的精神;通过对任务一的程序分析,培养学生的善于观察思考、解决问题的能力,并让学生熟悉枚举算法的程序结构特点,以便学生能更加顺利的完成任务二。)

四、课堂任务二(设置陷阱,探讨交流)(15分钟)学生活动:学生先自主完成任务二。(5分钟)

教师活动:教师巡视、个别指导,观察学生在完成任务过程中出现的问题:有些学生能输出58个数,有些学生只输出6个数,原因在哪里?请一个能输出58个数的学生上台演示操作,然后让学生分析输出的这些数都能满足要求吗?经过分析,学生会发现有些数的个位数不符合要求。提出问题:如何修改程序将不符合要求的数去掉?(2分钟)

学生活动:修改程序(由学生小组合作相互探讨完成)。(5分钟)教师活动:当有部分学生输出正确答案后,请一个能输出正确结果的学生分析如何修改,并到教师机上修改刚才错误的程序(算法1); 请一个不同算法的同学来修改程序(算法2);让他们分析各自算法的效率谁更高。然后教师小结,鼓励学生要善于发现问题、深入分析问题、积极解决问题;从不同角度分析问题可以得到不同效率的算法。(3分钟)

(设计理念:设计任务陷阱培养学生善于发现问题、深入分析问题、积极解决问题的能力;通过探讨交流,培养学生的团体协作能力及合作探究精神;设计任务一题多解,培养学生从不同角度分析问题的能力,锻炼学生的发散性思维。通过算法分析,让学生理解算法的执行效率,懂得选择最优算法去解决问题,提高程序的性能。)

五、层层递进,任务拓展(高层次学生做)

拓展任务:在任务二的基础上,增加验证条件:“十位数是3的倍数,百位数是4的倍数”,提出问题:如何将数字里的十位数和百位数分离?

学生活动:学生通过教师提供的帮助材料,讨论分析问题,尝试去完成拓展任务 教师活动:教师观察,引导。

(设计理念:设计拓展任务,提高任务难度梯度,供高层次学生完成,以实施课堂中的分层教学。)

六、提交作品,课堂评价(3分钟)

学生提交作品,教师选择几个作品做总结性评价。

七、归纳总结、布置课后作业(1分钟)

1、通过“教师服务端”程序中学生“自我评价”中的知识点,进行课堂总结:(1)枚举算法的基本原理:

确定范围、逐一列举(既不遗漏,也不多余)(循环语句)确定条件、逐一验证

(条件语句)

(2)枚举算法中范围的确定及列举:循环语句(如for)实现

(3)枚举算法中验证条件的表示:利用if语句进行条件判断;条件表示主要运用VB中的算数运算符及逻辑运算符实现。(4)实现枚举算法的程序结构特点:

外层循环嵌套内层条件判断

2、布置课后作业: 找水仙花数(学生任务导航程序)

(设计理念:通过知识总结,帮助学生将知识系统化,便于学生理解记忆。通过知识的延伸,促使学生将知识内化,并进行能力迁移,进一步提高学生解决问题的能力。)

八、自我评价(1分钟)

让学生利用“课堂任务导航程序”中的自我评价功能进行自我评价。教师活动:展示学生自评结果。

(设计理念:通过评价,引导学生自我反思,加深对所学知识的认识与理解;教师查看学生自我评价结果能及时了解到学生对本堂课所学知识点的掌握情况,以便安排后续教学内容。)

第四篇:实用的枚举算法教案

《实用的枚举算法》教案

上课时间:2016.4.29 班级:技术1班 授课教师:徐飞翔

一、教学目标:

1、知识与技能:

(1)理解枚举算法的概念。

(2)通过枚举算法,理解循环中嵌套分支的结构特点,执行过程。

(3)在理解流程图的基础上,初步实现VB代码的编写,并上机用VB语言实现程序的功能。

2、过程与方法:

(1)培养同学自主探索研究、解决问题的能力。

(2)能通过实际问题的分析、求解过程,尝试归纳出利用枚举算法解决问题的思路和方法。(3)培养同学用计算机程序解决问题的思维能力。

3、情感态度与价值观:

(1)通过解决任务,培养同学勇于尝试,不怕困难的精神。(2)积极参与、主动探究;合作学习,体验成功。

二、教学设计思想:

《学科教学指导意见》中对枚举算法的教学目标是使学生能了解枚举算法的概念,并用枚举算法来解决实际问题。根据这两次信息技术选考考试的难度,此课例不要求同学独立地画出流程图,而仅要求学生在理解枚举算法设计思想的基础上,读懂循环中嵌套分支的流程图,并完成主程序关键处的选择或填空(其中填空比选择对学生思维的要求又高一些)。

三、学情分析:

通过前几个章节的学习与实践,VB中几个相关的函数已经讲解并上机实践过了,对于3种基本控制结构大部分同学已理解,对于用流程图描述算法也非常熟悉,VB上机操作已有一定的实践,为本节内容的学习提供了良好的基础。

对于简单的程序段也有一定的认知意识,那么在本课中学生会觉得设计思想比较容易掌握。困难之处在于如何将题目的设计思想转化为流程图,根据流程图写出相应的代码,并通过自己编制程序上机实践来体验。那么在课堂分析过程中学生将从听课--理解--体验--探究,这些过程中全面掌握枚举算法的设计思想,并能用此算法来解决日常生活问题及与其他学科有所关联的一些简单问题。

四、教学重点:

理解枚举算法的概念和基本特征。

五、教学难点:

a)熟练掌握循环结构、分支结构的嵌套使用。

b)枚举算法思想的理解与实现(流程图转化为VB代码并上机实践)。

六、教学准备:

计算机机房、教学课件(枚举算法.ppt)

七、教学过程:

(一)新课导入

小明不小心把寝室门钥匙丢了,他去寝室管理员那里去找钥匙开门。寝室管理员那里总共有100把钥匙,其中配套的钥匙有若干把,但钥匙上只有1到100的编号没有寝室编号,请问小明如何才能找出能开自己寝室门的所有钥匙?

设计算法画出流程图。

(二)学习新课

1.枚举算法:按问题本题的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解,若是,就采纳这个解,否则就抛弃它。

例题1:使用枚举算法解决问题,在列举问题可能解的过程中做到()A.不能遗漏,但可以重复 B.不能遗漏,也不应该重复 C.可以遗漏,但不应该重复 D.可以遗漏,也可以重复

例题2:鸡兔共笼问题,若有腿共60条,问鸡、兔各有多少只?下面鸡和兔只数最合理的范围是()。(范围确定了循环的起始值和终止值)

A.鸡:1到28,兔:1到14 B.鸡:2到28,兔:1到14 C.鸡:1到28,兔:2到14 D.鸡:2到28,兔:2到14 例3.一份单据中被涂抹数字的推算(体验数字推算算法)

有一张单据上有一个5位数的编号n,如图1所示,其百位数和十位数处已经变得模糊不清,但是知道这个5位数是37或67的倍数。现要设计一个算法,找出所有满足这些条件的5位数,并统计这些5位数的个数。

图1 1)算法分析

这个5位正整数n中的百位和十位数有00、01、02、„、97、98、99共100种可能,分别填入,从而产生出n的全部可能解:25006、25016、25026、„、25986、25996。使用枚举算法解决问题时,必须逐一地给出所有可能解并对它们逐一进行检验,既不应遗漏任何一个可能解,也不应重复地产生和检验可能解。因而将每个可能解n逐一进行判断是否是一个真正解,即n是否能被37或67整除。若n是真正解,则输出n的值,并在计数器c中加上1,表示找到了一个真正解。2)算法表示

图2 寻找单据中被涂抹数字算法流程图 3)完成算法运行体验“涂抹数字推算” 程序并补完整程序代码。提高:把程序中的 for循环换成 Do While循环 For j=1 to 99 n = 25006 +j*99 If n Mod 37 = 0 Or n Mod 67 = 0 Then List1.AddItem Str(n)c = c + 1 End If Next j 2.枚举算法解题过程: 解题过程分两步:

逐一列举可能的解的范围。这个过程用循环结构实现。

对每一个列举可能的解进行检验,判断是否为真正的解。这个过程用分支结构实现。

枚举算法=循环结构+分支结构,循环结构内嵌套选择结构

(三)课堂训练:

有30个人,其中有男人、女人和小孩。他们在一家饭馆里花去500元。已知,每个男人花30元,每个女人花20元,每个小孩花10元。问男人、女人和小孩各为多少人?VB程序如下,在划线出填入合适的语句或表达式。

Private sub command1_click()Dim man , woman , children , s As Integer For man=1 to(1)For woman=1 to 23 children=(2)s = 30*man + 20*woman + 10*children If(3)then list1.AddItem(str(man)+str(woman)+str(children))End if next woman next man End sub

(四)课堂总结:

1.枚举算法=循环结构+分支结构 2.做到既不遗漏任何一个解、也不重复.3.枚举算法效率较低.注:并不是所有的问题都可以使用枚举算法来求解,只有当问题的所有可能解的个数不太多时,并在可以接受的时间内得到问题的所有解,才有可能使用枚举算法。

(五)课后作业

完成《学生活动手册》实践活动八 找出1000以内的所有素数

四、教学反思

枚举算法的教学设计,得到几位听课老师的指点,经过几次教学实践环节和本人的反思,我认为以下几方面很值得去总结和改进。

1、教学情境的创设

枯燥乏味的程序算法课中,如何让学生变得愿学、乐学,一直是信息技术教师追求的梦想。不过,算法本来就是源于生活的,如果教师能够细心观察、多多思考,完全可以使算法的课堂变得生活气息十足。本节课以在一串钥匙中查找一把锁的所有正确钥匙为新课引入,此任务同学经常遇到,非常形象。而且又能结合课堂教学内容和教学目标,比较有效地调动了学生主动探究学习的积极性。

2、培养同学总结、概括的能力

开始的教学设计中在新课引入后,老师直接将枚举算法的概念和流程图特征总结了出来,同学只是被动的知识接受者,主动思考,积极参与教学环节的热情不太高。后来有听课老师指出,可以先让同学自主探索完成任务1水仙花,并在同学根据新课引入和尝试完成任务1(水仙花数)中的领悟和理解,用自己的语言讨论和总结:枚举算法的概念、结构特征和注意事项,然后老师再补充、完善。如此可以培养同学总结、概括的能力。

3、程序成功的体验

任务1有下列三种难度,难度★★(流程图+完整程序),难度★★★(流程图),难度★★★★(仅任务描述。)同学选择合适自己的难度(分层教学)。课后统计选择难度★★的有16人,选择难度★★★的有15人,没有同学选择难度★★★★。第一个任务(水仙花数)将作详细的介绍,大部分同学可以比较顺利地理解和上机实现。第二个任务是用枚举算法来找出一定条件下的勾股数,相关概念比较多,还用到了VB中的INT函数。部分理解能力强,上机实践熟悉的同学可以按时地独立完成此任务;有部分同学只能完成算法流程图的理解,我会提供不完整的程序代码作为学习支架,在程序的关键处还是要求其思考和填空。

第五篇:论证模型之枚举归纳

论证模型之枚举归纳

首先,我们先来看一道真题:

莫大伟到吉安公司上班的第一天,就被公司职工自由散漫的表现所震惊,莫大伟由此得出结论,吉安公司是一个管理失效的公司。吉安公司的员工都缺乏工作积极性和责任心。

以下哪项为真,最能削弱上述论证:

A.当领导不在时,公司的员工会表现出自由散漫。B.吉安公司的员工超过2万,遍布该省的十多个城市。C.莫大伟刚大学毕业就到吉安公司,对校门外的生活不适应。D.吉安公司的员工和领导表现完全不一样。

拿到一道题目,首先我们先分析题干的逻辑主线。此题的论据为莫大伟在吉安公司上班第一天看到的员工散漫的景象,结论为吉安公司管理失效、员工都缺乏责任心和积极性。通过论据及结论的分析,大家可以分析出本题的论证过程即根据一部分或者个例的情况推断出整体或者全部情况的不完全归纳的推理方式,即枚举归纳。因此,当我们看到题干论证为:根据某类事物部分对象具有某种属性,推出这类事物全部对象都具有该属性的论证过程即可判断为是枚举归纳的论证模型。

中公教育

那么判断之后我们应该如何进行加强或者削弱呢?削弱的方式即证明根据这部分的情况无法推知整体的情况,包括三种方法:①样本特殊,不具有代表性;②样本数量不够多;③其余样本不具有该属性。通过这三种方式中的任一种即可进行对于题干论证的削弱。反之,加强的目的即证明这部分的属性就可以推知全部的属性,同样包括三种方法:①样本具有代表性;②样本数量足够多;③其余样本也具有该属性。

接下来我们就用这些方法帮助我们针对这道真题进行求解。根据题干及问法,要求我们削弱题干论证。由于前面已经分析过了,我们直接来看选项:A项证明确实在某些时间段(领导不在时)员工会表现出自由散漫,证明管理确实存在问题,因此加强了题干结论,排除A项。根据B项可以得到吉安公司的员工遍布十多个城市,人数众多,通过样本数量不够多的方式对题干进行了削弱。C项莫大伟不适合校外生活与题干吉安公司管理的情况之间没有关系,属于无关项,故排除。D项吉安公司的员工和领导表现完全不一样,无法削弱题干论证,故排除。因此这道题目的正确选项为B项。

通过这道真题的讲解我相信小伙伴们对于我们枚举归纳的论证模型已经有了初步的了解,剩下的就是在自己做题的过程当中反复使用,从而加强熟悉度、提高正确率。希望各位考生牢记题干判定特征及具体的解题方法,在熟练运用当中逐渐提升自己的做题速度和正确率!

中公教育

U盘枚举(自己总结)
TOP