第一篇:VB遍历文件目录的实现方法总结
VB遍历文件目录的实现方法总结
2009-04-25 20:44VB遍历文件夹的实现方法总结一共三种,如下: 使用FSO对象模型
'=============================== '描述:需要Scripting类型库(Scrrun.dll)支持。实际使用时需要引用Microsoft Scripting Runtime '优点:测试当中没有错误。可以检测隐藏文件。
'示例:一个文本标签、一个ListBox、一个命令按钮。都取默认名称即可
'=============================== Dim fso As New FileSystemObject Dim fld As Folder
Private Sub Command1_Click()
Dim nDirs As Long, nFiles As Long, lSize As Currency
Dim sDir As String, sSrchString As String
sDir = InputBox(“Type the directory that you want to search for”, _
“FileSystemObjects example”, “C:”)
sSrchString = InputBox(“Type the file name that you want to search for”, _
“FileSystemObjects example”, “vb.ini”)
MousePointer = vbHourglass
Label1.Caption = “Searching ” & vbCrLf & UCase(sDir)& “...”
lSize = FindFile(sDir, sSrchString, nDirs, nFiles)
MousePointer = vbDefault
MsgBox Str(nFiles)& “ files found in” & Str(nDirs)& _
“ directories”, vbInformation
MsgBox “Total Size = ” & lSize & “ bytes” End Sub
Private Function FindFile(ByVal sFol As String, sFile As String, _
nDirs As Long, nFiles As Long)As Currency
Dim tFld As Folder, tFil As File, FileName As String
On Error GoTo Catch
Set fld = fso.GetFolder(sFol)
FileName = Dir(fso.BuildPath(fld.Path, sFile), vbNormal Or _
vbHidden Or vbSystem Or vbReadOnly)
While Len(FileName)<> 0
FindFile = FindFile + FileLen(fso.BuildPath(fld.Path, _
FileName))
nFiles = nFiles + 1
List1.AddItem fso.BuildPath(fld.Path, FileName)' Load ListBox
FileName = Dir()' Get next file
DoEvents
Wend
Label1 = “Searching ” & vbCrLf & fld.Path & “...”
nDirs = nDirs + 1
If fld.SubFolders.Count > 0 Then
For Each tFld In fld.SubFolders
DoEvents
FindFile = FindFile + FindFile(tFld.Path, sFile, nDirs, nFiles)
Next
End If
Exit Function Catch: FileName = “"
Resume Next End Function Api方法
'================================== '描述:使用Api。
'备注:使用过程中出现错误。未加分析。忽略错误即可。'
可查看隐藏文件。
'示例:2个listbox、2个命令按钮、6个文本框、一个模块
=================================== '模块代码
Option Explicit
Declare Function FindFirstFile Lib ”kernel32“ Alias _
”FindFirstFileA“(ByVal lpFileName As String, lpFindFileData _
As WIN32_FIND_DATA)As Long
Declare Function FindNextFile Lib ”kernel32“ Alias ”FindNextFileA“ _
(ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA)As Long
Declare Function GetFileAttributes Lib ”kernel32“ Alias _
”GetFileAttributesA“(ByVal lpFileName As String)As Long
Declare Function FindClose Lib ”kernel32“(ByVal hFindFile As Long)_
As Long
Declare Function FileTimeToLocalFileTime Lib ”kernel32“ _
(lpFileTime As FILETIME, lpLocalFileTime As FILETIME)As Long
Declare Function FileTimeToSystemTime Lib ”kernel32“ _
(lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME)As Long
Public Const MAX_PATH = 260
Public Const MAXDWORD = &HFFFF
Public Const INVALID_HANDLE_VALUE =-1
Public Const FILE_ATTRIBUTE_ARCHIVE = &H20
Public Const FILE_ATTRIBUTE_DIRECTORY = &H10
Public Const FILE_ATTRIBUTE_HIDDEN = &H2
Public Const FILE_ATTRIBUTE_NORMAL = &H80
Public Const FILE_ATTRIBUTE_READONLY = &H1
Public Const FILE_ATTRIBUTE_SYSTEM = &H4
Public Const FILE_ATTRIBUTE_TEMPORARY = &H100
Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type
Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Public Function StripNulls(OriginalStr As String)As String
If(InStr(OriginalStr, Chr(0))> 0)Then
OriginalStr = Left(OriginalStr, _
InStr(OriginalStr, Chr(0))1
FindFilesAPI = FindFilesAPI + FindFilesAPI(path & dirNames(i)_
& ”“, SearchStr, FileCount, DirCount)
Next i
End If
End Function
Private Sub Command1_Click()
On Error Resume Next
Dim SearchPath As String, FindStr As String
Dim FileSize As Long
Dim NumFiles As Integer, NumDirs As Integer
Screen.MousePointer = vbHourglass
List1.Clear
SearchPath = Text1.Text
FindStr = Text2.Text
FileSize = FindFilesAPI(SearchPath, FindStr, NumFiles, NumDirs)
Text3.Text = NumFiles & ” Files found in “ & NumDirs + 1 & _
” Directories“
Text4.Text = ”Size of files found under “ & SearchPath & ” = “ & _
Format(FileSize, ”#,###,###,##0“)& ” Bytes“
Screen.MousePointer = vbDefault
End Sub
Function FindFiles(path As String, SearchStr As String, _
FileCount As Integer, DirCount As Integer)
Dim FileName As String
' Walking filename variable.Dim DirName As String
' SubDirectory Name.Dim dirNames()As String ' Buffer for directory name entries.Dim nDir As Integer
' Number of directories in this path.Dim i As Integer
' For-loop counter.On Error GoTo sysFileERR
If Right(path, 1)<> ”“ Then path = path & ”“
' Search for subdirectories.nDir = 0
ReDim dirNames(nDir)
DirName = Dir(path, vbDirectory Or vbHidden Or vbArchive Or vbReadOnly _ Or vbSystem)' Even if hidden, and so on.Do While Len(DirName)> 0
' Ignore the current and encompassing directories.If(DirName <> ”.“)And(DirName <> ”..“)Then
' Check for directory with bitwise comparison.If GetAttr(path & DirName)And vbDirectory Then
dirNames(nDir)= DirName
DirCount = DirCount + 1
nDir = nDir + 1
ReDim Preserve dirNames(nDir)
'List2.AddItem path & DirName ' Uncomment to list
End If
' directories.sysFileERRCont:
End If
DirName = Dir()' Get next subdirectory.Loop
' Search through this directory and sum file sizes.FileName = Dir(path & SearchStr, vbNormal Or vbHidden Or vbSystem _
Or vbReadOnly Or vbArchive)
While Len(FileName)<> 0
FindFiles = FindFiles + FileLen(path & FileName)
FileCount = FileCount + 1
' Load List box
List2.AddItem path & FileName & vbTab & _
FileDateTime(path & FileName)
' Include Modified Date
FileName = Dir()' Get next file.Wend
' If there are sub-directories..If nDir > 0 Then
' Recursively walk into them
For i = 0 To nDir” & Err.Description, , _
“Unexpected Error”
Resume AbortFunction
End If
End Function
Private Sub Command2_Click()
On Error Resume Next
Dim SearchPath As String, FindStr As String
Dim FileSize As Long
Dim NumFiles As Integer, NumDirs As Integer
Screen.MousePointer = vbHourglass
List2.Clear
SearchPath = Text1.Text
FindStr = Text2.Text
FileSize = FindFiles(SearchPath, FindStr, NumFiles, NumDirs)
Text5.Text = NumFiles & “ Files found in ” & NumDirs + 1 & _
“ Directories”
Text6.Text = “Size of files found under ” & SearchPath & “ = ” & _
Format(FileSize, “#,###,###,##0”)& “ Bytes”
Screen.MousePointer = vbDefault
End Sub
Private Sub Form_Load()
Command1.Caption = “Use API code”
Command2.Caption = “Use VB code”
' start with some reasonable defaults
Text1.Text = “C:My Documents”
Text2.Text = “*.*”
End Sub 使用系统控件
'=================================== '描述:简单易于实现
'
不可查看隐藏文件
'示例:一个目录操作经典三联组合。一个命令按钮。
'===================================
Private Sub Command1_Click()List1.Clear sosuofile(Dir1.List(Dir1.ListIndex))MsgBox “搜索完毕!,共找到” + Str(List1.ListCount)+ “条记录。”, vbOKOnly + vbExclamation, “提示” End Sub
Private Sub Drive1_Change()Dir1.Path = Drive1.Drive End Sub Sub sosuofile(MyPath As String)Dim Myname As String Dim dir_i()As String Dim i, idir As Long If Right(MyPath, 1)<> “" Then MyPath = MyPath + ”“ Myname = Dir(MyPath, vbDirectory Or vbHidden Or vbNormal Or vbReadOnly)Do While Myname <> ”“ If Myname <> ”.“ And Myname <> ”.." Then If(GetAttr(MyPath & Myname)And vbDirectory)= vbDirectory Then '如果找到的是目录 idir = idir + 1 ReDim Preserve dir_i(idir)As String dir_i(idir1 Call sosuofile(MyPath + dir_i(i))Next i ReDim dir_i(0)As String End Sub
第二篇:vb程序设计方法
发表于《中小学信息技术教育》杂志2005年第7期 VB程序设计方法——今天我来做导演!
教学目标:
1、知道创建一个VB程序的基本步骤
2、了解窗口、事件和消息的含义
3、培养学生的自主探究精神
教学重点和难点:
1、窗口,事件和消息的关系
2、属性的设置
3、代码的输入
学生分析:
高一学生,已经学习了程序的三种基本结构,能辨别三种结构,但不会自己书写程序。对VB基本上一无所知。
教学方法:
采用主动式任务驱动的教学方法,通过创设情境,激发学生对VB的兴趣,使学生产生动手做一个VB程序的欲望.在布置任务的时候,不是教师指定完成什么任务,而是由学生自己提出想完成一个样的任务,即想做一个什么样的VB程序,因为任务是学生自己提出来的,所以学生肯定感兴趣的,这就避免了教师布置的任务不能照顾到全体学生装的弊端.而教师作为引导者和技术帮助者,帮助学生一步步地完成任务,引导学生分解任务,分解为界面的创建,属性的设置,代码的输入等几部分。在实践过程中,使学生掌握用VB进行程序设计的步骤和方法。
教学过程:
一、激趣引入
师:上节课中我们演示了一个抛硬币的VB小程序,大家还有印象吗?(教师演示这个程序)师:下面我再来演示几个其他VB小程序(教师演示若干个趣味小程序,如,和刘德华对话,井字棋,心情好吗,挖地雷,单选复选框与字体,测验记忆力,弹球游戏,剪刀包袱,在演示过程中,让学生注意鼠标单击按钮,或者鼠标移动,窗口上会有什么反应)
师:窗口——舞台,事件——导演的命令,反应——演员的表演,控件——演员(以对比方式说明它们之间的关系,让学生明白,需要哪个演员(控件)作出什么表演,要对这个演员(控件)发号施令,导演不能瞎指挥,不然表演要乱套的。)
师:有了舞台,演员,导演在哪儿呢?导演就是你!今天就是请大家当一回导演(出示课题:今天你来做导演!)意图:
1、在演示过程中,提醒学生注意窗口,事件(点击按钮或移动按钮),消息(事件的反应)。
2、激发学生的兴趣,产生自己动手做一个VB程序的欲望。
二、形成任务 大屏幕展示:
一、确定导演的工作目标,即你想要完成一个什么样的VB程序?
老师引导,启发学生,使每个学生能确定自己的目标,即要完成一个什么样的VB程序,即名称是什么?功能是什么?……。(对于不能确定的学生,建议参考老师演示的例子,从中选择一个自己感兴趣的)
意图:这是很重要的一个过程,要很好地引导学生,使学生清楚地知道自己的任务,即自己要做什么?
三、分解任务
(以演示中的一个小例子,来说明如何完成一个VB程序)大屏幕展示:
二、导演如何完成任务?
师:导演正式上任了,大家都胸有成竹了,明确了要做一个什么样的VB程序,首先做什么呢?
1、界面的设计(舞台的布置)师:一个程序,你最先看到是什么?
师:舞台如何布局?演员如何选取?窗口如何布局?上面要放哪些东西?这些东西怎么放比较好看?……
意图:引导学生从界面设计入手,学会用控件来输入文字,图片,通过对文字的修饰,图片的插入,引入属性的设置,突破这个难点。
2、如何让对象动起来?
师:窗口布置好了,舞台拱建好了,演员也到位了,那么让演员如何表演呢?每个演员做什么动作呢?导演发布命令的时候(输入代码)的时候,一定要看清对象,不要乱发命令啊!意图:
引入代码的输入。为节省时间,提供演示程序的代码,避免自己书写代码。
四、动手实践
师:各位跃跃欲试的导演们,按照自己刚才确定的任务,动手来完成自己的第一个VB小程序吧!可能问题:
有些学生在输入代码的时候,为分不清代码需要给哪个控件加上,这时一定要让学生明白,导演的指令必须是针对某个演员发的,不能乱发。对于学生碰到的问题,老师做好技术指导工作。
五、评价交流(展示学生作品,交流评价)
师:不同风格的导演设计的效果是不同的,让我们来欣赏一下各位导演的作品吧 意图:
通过电子教室软件,转发一些小组完成的作品,能过交流了解其他同学的制作成果,吸取他人经验
提醒学生在程序中加入制作人信息,即导演的信息,有初步的版权意识
有些学生可能设计的任务比较大,在课内无法完成,则鼓励在课后继续完成,作为拓展作业。
五、总结
师:各位导演感觉如何?做一个导演不容易吧,做一个好的导演更不容易。创建一个VB程序的基本步骤:界面设计,属性设置,代码输入。
导演有大有小,但是基本工作是一样的,就是上面这些步骤,今天我们是小导演,明天我们可能是大导演,期待欣赏到同学们的大作!意图:回顾过程,总结提高。
附:学案
今天我来做导演
——VB程序设计方法
一、明确目标
身为导演,最重要的一件事,就是明确自己的目标,请确定你的目标,即你想做个什么样的VB程序?
提示:如果一时之间想不出来,可以参考老师演示的例子
二、设计舞台(界面的布局)
1、如果你想在窗口上输入文字,方法如下:
(1)用鼠标选择左边工具栏中的“LABEL”标签
(2)在窗口上拖出一个大小合适的矩形(矩形的大小可以用矩形边上的八个小方块进行调整)
2、如果你想插入一张图片,方法如下:
(1)用鼠标选择左边工具栏中的“IMAGES”标签
(2)在窗口上拖出一个大小合适的矩形
3、如果你想在窗口上增加一个按钮,方法如下:
(1)用鼠标选择左边工具栏中的“BUTTON”标签
(2)在窗口上拖出一个大小合适的矩形
4、如果你想在窗口上增加一个文本框,方法如下:
(1)用鼠标选择左边工具栏中的“TEXT”标签
(2)在窗口上拖出一个大小合适的矩形
:),增加其他控件的方法类似,相信自己,试一试!
三、对演员进行分工(属性的设置)
1、如何在窗口上显示文字?
方法如下:
(1)用鼠标选中Label控件
(2)在右边的属性窗口中找到“Caption”属性,在右边输入要显示的文字 思考:如何修改文字的字体?颜色?大小? 提示:修改相应的属性
2、如何插入图片?
方法如下:
(1)用鼠标选中Image控件
(2)在右边的属性窗口中找到“Picture”属性,点击旁边的省略号按钮,选择要插入的图片
3、如何修改Text显示的文字? 方法如下:
(1)用鼠标选中Text控件
(2)在右边鼠性中选中Text属性,输入要显示的文字
4、如何修改按钮上显示的文字? 方法如下:
选中按钮,修改“Caption”属性
四、让演员动起来(输入代码)选择演员,输入想要演员实现的代码
五、检查一下导演工作进展如何? 方法: 运行、播放
六、你是个合格的导演?还是个优秀的导演?
1、你知道如何做一个VB程序了吗?(知道/不知道)
2、你是个合格的/优秀的导演?(是/不是)
第三篇:黑马程序员C语言教程:Linux 文件目录树的遍历
Linux 文件目录树的遍历
1. linux提供opendir、readdir(readdir_r)、closedir和scandir等接口实现对目录的读取;
2. readdir返回指向下一个目录项的指针,如果要自己传入缓冲区存储目录项,应使用readdir_r代替。readdir的结果中包含当前目录和上一级目录的目录项信息。
3. 在遍历过程中,进程的工作目录不会改变,在递归遍历的时候,需要改变工作目录(chdir)以识别相对路径,或者每次都限定全局路径。
4. 深度优先遍历目录树采用递归实现易编码(参见如下代码),广度优先遍历则需借助队列实现。当目录下的文件数量较少时,采用广度优先遍历效率会更高,因目录下的目录项基本都是连续存放,减少了很多磁盘寻道;而采用深度优先遍历,结果的聚合性更高
1.int dir_traverse(const char *dir_name)2.{
3.DIR *dirp = opendir(dir_name);4.if(!dirp){
5.perror(“opendir”);6.return-1;7.} 8.9.struct stat st;10.struct dirent *dir;11.char fullpath[FILENM_MAX];
12.while((dir = readdir(dirp))!= NULL){
13.if(!strcmp(dir->d_name, “.”)|| // 考虑当前目录和上级目录,否则会死循环 14.!strcmp(dir->d_name, “..”)){ 15.continue;16.}
17.18.sprintf(fullpath, “%s/%s”, dir_name, dir->d_name);//获取全局路径 19.printf(“%sn”, fullpath);// 打印路径 20.if(lstat(fullpath, &st)< 0){ 21.perror(“lstat”);22.continue;23.}
24.if(S_ISDIR(st.st_mode)){
25.dir_traverse(fullpath);// 递归遍历子目录 26.} 27.28.} 29.30.closedir(dirp);31.32.return 0;33.}
访问目录下某个文件时,需要逐个读取目录数据中的目录项并与目标进行匹配获得文件的inode号,假设文件的平均长度为10byte,加上inode、type及reclen等信息,每个目录项的平均长度为16byte,假设采用4K的数据块,则一个块可以存放256个目录项,按照ext2文件数据索引的方式,当目录下文件数n少于256*12时,则在目录下查找文件最多需要访问n/256(向上取整)个数据块,当目录下文件数更多的时候,需要访问的块数会更快的增加(后面得到存储数据的物理块号需要多级索引),这也是在目录下不应放太多文件的原因,如果将拥有很多文件的目录均分成多个子目录,多一级目录会多一次(或多次,具体依赖于子目录下文件数量)磁盘块访问,但在子目录中查找文件的磁盘访问开销会小很多。
第四篇:数据结构实验报告-二叉树的实现与遍历
《数据结构》 第六次实验报告
学生姓名 学生班级 学生学号 指导老师
重庆邮电大学计算机学院 计算机专业实验中心
一、实验内容
1)采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。2)输出树的深度,最大元,最小元。
二、需求分析
遍历二叉树首先有三种方法,即先序遍历,中序遍历和后序遍历。递归方法比较简单,首先获得结点指针如果指针不为空,且有左子,从左子递归到下一层,如果没有左子,从右子递归到下一层,如果指针为空,则结束一层递归调用。直到递归全部结束。下面重点来讲述非递归方法: 首先介绍先序遍历:
先序遍历的顺序是根 左 右,也就是说先访问根结点然后访问其左子再然后访问其右子。具体算法实现如下:如果结点的指针不为空,结点指针入栈,输出相应结点的数据,同时指针指向其左子,如果结点的指针为空,表示左子树访问结束,栈顶结点指针出栈,指针指向其右子,对其右子树进行访问,如此循环,直至结点指针和栈均为空时,遍历结束。
再次介绍中序遍历:
中序遍历的顺序是左 根 右,中序遍历和先序遍历思想差不多,只是打印顺序稍有变化。具体实现算法如下:如果结点指针不为空,结点入栈,指针指向其左子,如果指针为空,表示左子树访问完成,则栈顶结点指针出栈,并输出相应结点的数据,同时指针指向其右子,对其右子树进行访问。如此循环直至结点指针和栈均为空,遍历结束。最后介绍后序遍历:
后序遍历的顺序是左 右 根,后序遍历是比较难的一种,首先需要建立两个栈,一个用来存放结点的指针,另一个存放标志位,也是首先访问根结点,如果结点的指针不为空,根结点入栈,与之对应的标志位也随之入标志位栈,并赋值0,表示该结点的右子还没有访问,指针指向该结点的左子,如果结点指针为空,表示左子访问完成,父结点出栈,与之对应的标志位也随之出栈,如果相应的标志位值为0,表示右子树还没有访问,指针指向其右子,父结点再次入栈,与之对应的标志位也入栈,但要给标志位赋值为1,表示右子访问过。如果相应的标志位值为1,表示右子树已经访问完成,此时要输出相应结点的数据,同时将结点指针赋值为空,如此循环直至结点指针和栈均为空,遍历结束。
三、详细设计
源代码:
#include
typedef struct Tnode //定义结点 {
char data;//存储结点数据
struct Tnode *left;//定义结点左子指针 struct Tnode *right;//定义右子指针
}Tnode,*Pnode;//声明Tnode类型的变量和指针 typedef struct Stack//定义栈 { Pnode pnode[MAX];//存放数据 int p;//栈顶指针
}Stack,*Pstack;//定义Stack类型的变量和指针 void Push(Pstack pstack,Pnode pnode)//入栈 {
} Pnode Pop(Pstack pstack)//出栈 { } Pnode Top(Pstack pstack)//看栈顶元素 { } int Isempty(Pstack pstack)//栈判空 {
} int Isfull(Pstack pstack)//栈满 {
} void Initstack(Pstack pstack)//初始化栈 if(pstack->p==FULL)else return 0;return 1;if(pstack->p==EMPTY)else return 0;;return 1;return pstack->pnode[pstack->p];return pstack->pnode[pstack->p--];pstack->p ++;pstack->pnode[pstack->p] = pnode;//赋值
{ } void Inittnode(Pnode root,Pnode left,Pnode right,char data)//初始化结点 {
} void PreorderR(Pnode proot)//递归先序遍历算法 {
} void InorderR(Pnode proot)//递归中序遍历算法 {
} void PostorderR(Pnode proot)//递归后序遍历算法 {
} void PreorderI(Pnode proot,Pstack pstack)//非递归先序遍历算法 {
Initstack(pstack);//初始化栈
while(proot||!Isempty(pstack))//如果栈空并且结点指针空,则结束循环 {
if(proot){ printf(“%2c”,proot->data);if(proot){
} PostorderR(proot->left);PostorderR(proot->right);printf(“%2c”,proot->data);if(proot){
}
InorderR(proot->left);printf(“%2c”,proot->data);InorderR(proot->right);if(proot){
} printf(“%2c”,proot->data);PreorderR(proot->left);PreorderR(proot->right);root->left=left;root->right = right;root->data = data;pstack->p=EMPTY;
}
}
} else {
} if(Isfull(pstack))//如果栈满不能执行入栈操作 {
} Push(pstack,proot);//入栈 proot=proot->left;//指针指向左子 printf(“栈满,不能执行入栈操作!”);return;if(Isempty(pstack))//栈空时不能出栈 {
} proot = Pop(pstack);//执行出栈操作 proot=proot->right;//指针指向右子 printf(“栈空,不能执行出栈操作!”);return;void InorderI(Pnode proot,Pstack pstack)//非递归中序遍历算法 {
Initstack(pstack);//初始化栈
while(proot||!Isempty(pstack))//循环结束条件 {
if(proot){
} else {
if(Isempty(pstack)){
} proot = Pop(pstack);//出栈
printf(“%2c”,proot->data);//打印数据 printf(“栈空,不能执行出栈操作!”);return;if(Isfull(pstack)){
} Push(pstack,proot);//执行入栈操作 proot = proot->left;//指针指向左子 printf(“栈满,不能执行入栈操作!”);return;
}
} } proot=proot->right;//指针指向右子
void PostorderI(Pnode proot,Pstack pstack)//非递归后续遍历算法 {
} void main(){ int flags[MAX];//定义标志位栈 int p =-1;//初始化标志位栈 int flag;//存放标志位 Initstack(pstack);//初始化栈
while(proot||!Isempty(pstack))//循环结束条件 {
} if(proot){
} else {
} proot = Pop(pstack);//指针出栈 flag = flags[p--];//相应标志位出栈
if(flag==0)//如果标志位为0表示右子还未访问过 {
} else {
} printf(“%2c”,proot->data);//打印数据 proot = NULL;//将结点指针置空 flag =1;//将标志位置1,右子已访问 flags[++p] = flag;//标志位入栈 Push(pstack,proot);//结点入栈 if(Isfull(pstack)){
} flags[++p] = 0;//标志位置0,并入栈 Push(pstack,proot);//结点入栈 proot=proot->left;//指针指向左子 printf(“栈满,不能执行入栈操作!”);return;
proot = proot->right;//指针指向右子
Tnode A,B,C,D,E,F,G;//声明结点变量 Stack stack;//声明栈
Inittnode(&A,&B,&C,'A');//初始化结点 Inittnode(&B,NULL,&D,'B');Inittnode(&C,&E,&F,'C');Inittnode(&D,NULL,NULL,'D');Inittnode(&E,NULL,NULL,'E');Inittnode(&F,&G,NULL,'F');Inittnode(&G,NULL,NULL,'G');printf(“你定义的树的结构是:n”);printf(“A(B(D)C(E F(G)))n”);printf(“=====================下面是遍历结果====================n”);printf(“=====================递归先序遍历:====================n”);PreorderR(&A);printf(“n”);printf(“=====================非递归先序遍历:==================n”);PreorderI(&A,&stack);printf(“n”);printf(“=====================递归中序遍历:====================n”);InorderR(&A);printf(“n”);printf(“=====================非递归中序遍历:==================n”);InorderI(&A,&stack);printf(“n”);PostorderR(&A);printf(“n”);PostorderI(&A,&stack);
printf(“n”);
/*一下是调用相应的函数输出遍历结果*/
}
printf(“=====================递归后序遍历:====================n”);
printf(“=====================非递归后序遍历:==================n”);
五、遇到的问题及解决办法
这部分我主要遇到如下两个问题,其内容和解决方法如下所列:
执行程序时程序停止运行,其效果如图:
解决方法:看到程序停止运行,推测可能的原因:遇到死循环、参数设置不合理或者结构体没有造好。首先对结构体进行了检查,各个成员声明正常无误,在对程序进行调试,程序正常跳出循环,因此最可能是自定义函数的参数设置的不合理,因此对调用的自定义函数进行相应的改动,将参数由具体类型改为指针类型后,程序正常运行。
程序不停的输出同一个结点的数据,其效果入图:
解决方法:分析运行结果可知,第一不停的输出证明遇到了死循环,第二输出的是同一个结点的数据,表示指针没有按预期进行指向,首先对程序进行调试,发现程序没有添加循环结束条件,添加循环结束条件后,只能输出树的部分结点的数据,对标志位进行修改后,程序运行正常,也能正确输出遍历结果。
六、心得体会
通过这次作业真的受益匪浅,感触良多:
首先,要提高编程能力,必须多动手,多实践,而不是仅仅局限在书本上,更不能眼高手低。眼高手低,懒得动手,这就犯了编程人员的大忌。大一我们开始接触C语言,这是我们接触到的第一种编程语言,但是当时徒有对编程的兴趣,却没有付诸行动,动手少,结果考试险过,通过这次作业,我再次看了C语言课本,边看边写代码,理解快,印象深刻,思维也活跃许多,状态也好,真正的意识到,编程能力需要靠实践来提升。当自己写出意想的程序后,真的有些成就感。再者,在吴老师的指导和要求下,我们改掉了很多的编程坏习惯的同时也养成了良好的编程习惯,另一方面我们态度端正了很多,认真完成好每一项任务,这样无形中提高了对自己的要求,同时也增强了我们的动手能力和编程能力。
七、附录 运行结果截图。
第五篇:ATM系统实现报告(VB)
面向对象方法设计与实现报告
—ATM机系统
软件0802班
高晓亮
200807040203
一、概要
根据ATM的需求分析,该系统设计为2个子系统:用户系统、银行工作人员系统。其中用户系统主要使用户在ATM上完成一些基本操作,例如:存款、取款、转账、查询余额、修改账户密码等银行工作人员系统主要用来管理用户账户、ATM机、事务。其具体功能和界面及代码将在下文叙述。
说明:该系统主要代码是用vb编写,数据库使用的是单机数据库access。
二、用户系统
A:主要界面介绍: 一)、待机界面:
1、功能:系统欢迎界面,点击模拟按钮开始模拟ATM机工作。
2、说明:由于没有找到合适的广告图片,所以待机默认先用蓝色背景代替。
3、界面文字动画代码如下:If Label5(0).Left > Me.ScaleWidth Then
Label5(0).Left = Me.Left100 End If
Label5(1).Move Label5(1).Left + 120
4、界面截图如下:
二)、登陆界面:
1、功能:a、密码框设置只能输入6位
B、密码输入3次错误,将冻结该账户
C、银行卡号不存在、冻结或密码错误,均不能进入系统
2、说明:因为各银行卡号位数不太一样,银行卡号位数并未设置。
3、登陆确认按钮代码如下: Private Sub Command27_Click()If Not Text7.Text = “" And Not Text8.Text = ”“ Then Dim sql As String sql = ”select * from 账户 where 银行卡号='“ & Trim(Text7.Text)& ”'“
Adodc1.RecordSource = sql
Adodc1.Refresh
If Adodc1.Recordset(”状态“)= ”冻结“ Then '判断该账户状态
MsgBox ”该账户已冻结!“
Text7.Text = ”“
Text8.Text = ”“
Else
sql = ”select * from 账户 where 银行卡号='“ & Trim(Text7.Text)& ”' and 密码=“ & Trim(Text8.Text)& ”“
Adodc1.RecordSource = sql
Adodc1.Refresh
If Adodc1.Recordset.EOF Then
MsgBox ”密码错误!“, 48, ”错误提示“
Text8.Text = ”“
count1 = count1 + 1
If count1 >= 3 Then '三次输入错误冻结该账户
Adodc1.Refresh
sql = ”select * from 账户 where 银行卡号='“ & Trim(Text7.Text)& ”'“
Adodc1.RecordSource = sql
Adodc1.Refresh
Adodc1.Recordset(”状态“)= ”冻结“
Adodc1.Recordset.Update
MsgBox(”三次输入错误,该账户已被冻结“)
End If
Else
Label10.Visible = False
Label11.Visible = False
Text7.Visible = False
Text8.Visible = False
Command27.Visible = False Command28.Visible = False Command14.Visible = True Command15.Visible = True Command16.Visible = True Command17.Visible = True Command18.Visible = True Command19.Visible = True Command24.Visible = True Ynum = Text7.Text Adodc2.Refresh ’添加事务 Adodc2.Recordset.AddNew
Adodc2.Recordset(”银行卡号“)= Ynum
Adodc2.Recordset(”事务类型“)= ”用户登录“
Adodc2.Recordset(”时间“)= Now()
Adodc2.Recordset(”事务描述“)= ”用户完成登陆“
Adodc2.Recordset.Update
Adodc2.Refresh Text7.Text = ”“ Text8.Text = ”“ End If End If Else MsgBox(”信息不全!请确认“)End If End Sub
4、界面截图如下:
三)、系统主界面
1、功能:ATM的主要功能陈列,供用户选择,其中包括存款、取款、转账、查询余额、修改密码、取卡、返回。当账户登录时,将在事务表中记录登录时间。
2、说明:由于所有按钮均只是用来调出对应的功能的界面,并没有实际功能,所以在此省略其按钮代码。
3、界面截图如下:
四)、存款界面
1、功能:a、只允许用户输入100的整数值
b、当文本框为空时报错
c、实现用户的存款功能
d、每存入一笔款,都将在事务表中记录该操作
2、存款代码如下:If Not Text12.Text = ”“ Then If Val(Text12.Text)Mod 100 = 0 Then Adodc1.Refresh Adodc1.Recordset(”余额“)= Adodc1.Recordset(”余额“)+ Val(Text12.Text)Adodc1.Recordset.Update Adodc1.Refresh Label15.Caption = ”存款成功“ ye = ye + Text12.Text Adodc2.Refresh Adodc2.Recordset.AddNew
Adodc2.Recordset(”银行卡号“)= Ynum
Adodc2.Recordset(”事务类型“)= ”存款“
Adodc2.Recordset(”时间“)= Now()
Adodc2.Recordset(”事务描述“)= ”用户存入“ & Text12.Text & ”元“
Adodc2.Recordset.Update
Adodc2.Refresh Text12.Text = ”“ Command33.Enabled = True Command32.Enabled = False Else MsgBox ”请输入100的整数“ End If Else Label15.Caption = ”无款可存“ End If End Sub
3、界面截图如下:
四)、取款界面
1、功能:a、用户按相对应数值的按钮进行取款
b、每个账户每天取款数不能超过2500
c、账户余额不足时,报错
d、用户每取走一笔款额,都将在事务表中记录取走金额和时间
2、说明:由于不同数值按钮的代码很相似,所以这里仅给出100按钮的代码
3、存款代码如下:Private Sub Command20_Click()Adodc1.Refresh If Adodc1.Recordset(”余额“)>= 100 Then Adodc1.Refresh Adodc1.Recordset(”余额“)= Adodc1.Recordset(”余额“)100 Adodc2.Refresh Adodc2.Recordset.AddNew
Adodc2.Recordset(”银行卡号“)= Ynum
Adodc2.Recordset(”事务类型“)= ”取款“
Adodc2.Recordset(”时间“)= Now()
Adodc2.Recordset(”事务描述“)= ”用户取走100元“
Adodc2.Recordset.Update
Adodc2.Refresh Else Label15.Caption = ”余额不足,取款失败“ End If End Sub
4、取款界面截图如下:
五)、查询余额界面
1、功能:实现用户查询对应账户的余额
2、查询余额代码如下:Private Sub Command17_Click()Command14.Visible = False Command15.Visible = False Command16.Visible = False Command17.Visible = False Command18.Visible = False Command19.Visible = False Label6.Visible = False Label7.Visible = False sql = ”select 余额 from 账户
where 银行卡号= '“ & Ynum & ”'“ Adodc1.RecordSource = sql Adodc1.Refresh Label8.Caption = Adodc1.Recordset.Fields(”余额“)Adodc2.Refresh Adodc2.Recordset.AddNew
Adodc2.Recordset(”银行卡号“)= Ynum
Adodc2.Recordset(”事务类型“)= ”查询余额“
Adodc2.Recordset(”时间“)= Now()
Adodc2.Recordset(”事务描述“)= ”查询余额“
Adodc2.Recordset.Update
Adodc2.Refresh Label9.Visible = True Label8.Visible = True End Sub
3、查询余额界面截图如下:
六)、转账界面
1、功能:a、实现用户转账
b、需2次确认账户信息,若信息输入不全,账户余额不足,2次输入不一样,均不可完成转账
c、用户每转一笔账,均将在事务表中记录转账金额和时间
2、转账代码如下:Private Sub Command30_Click()If Not Text11.Text = ”“ And Not Text10.Text = ”“ And Not Text9.Text = ”“ Then If Text10.Text = Text9.Text Then Adodc1.Refresh If Adodc1.Recordset(”余额“)>= Val(Text11.Text)Then Adodc1.Refresh Adodc1.Recordset(”余额“)= Adodc1.Recordset(”余额“)Me.picLOAD.Width)/ 2 'Me.picLOAD.Top = Me.ScaleHeight / 2Me.picLOAD.Width)/ 2 'Me.picLOAD.Top = Me.ScaleHeight / 2Me.picLOAD.Width)/ 2 'Me.picLOAD.Top = Me.ScaleHeight / 2-Me.picLOAD.Height Me.picLOAD.Visible = True 'DoEvents '释放控制权
Me.ListView1.ListItems.Clear Dim addLIST As ListItem Dim ss As String Dim sql As String ss = App.Path + ”datadata.mdb“ Adodc1.ConnectionString = ”Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password=gxl;Persist Security Info=False;Data Source=“ & ss Adodc1.CommandType = adCmdText sql = ”select * from ATM“ Adodc1.RecordSource = sql Adodc1.Refresh '连接数据库
Do While Not Adodc1.Recordset.EOF Set addLIST = ListView1.ListItems.Add(, , Adodc1.Recordset!ATM机编号, , i)addLIST.SubItems(1)= IIf(IsNull(Adodc1.Recordset.Fields(”状态“).Value), Adodc1.Recordset.Fields(”状态“).Value)addLIST.SubItems(2)= IIf(IsNull(Adodc1.Recordset.Fields(”余额“).Value), Adodc1.Recordset.Fields(”余额“).Value)Adodc1.Recordset.MoveNext Loop Me.picLOAD.Visible = False End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)Select Case Button.Index
Case Is = 2 '
ZhZCfrm.Show 1
Case Is = 3
' ZHZXfrm.Show 1
Case Is = 4
Call addLIST End Select End Sub
3、界面截图:
”“, ”“,六)、单位信息界面
1、功能:显示单位信息
2、代码: Private Sub cmdBC_Click()'修改银行信息 Dim s As String If Not Text1(0).Text = ”“ And Not Text1(1).Text = ”“ And Not Text1(2).Text = ”“ And Not Text1(3).Text = ”“ And Not Text1(4).Text = ”“ Then
s = ”update 银行信息 set 银行名称='“ & Text1(0).Text & ”',银行地址='“ & Text1(1).Text & ”',邮政编号='“ & Text1(2).Text & ”',负责人='“ & Text1(3).Text & ”', 联系电话='“ & Text1(4).Text & ”'“
Adodc1.RecordSource = s
MsgBox(”修改成功“)
Adodc1.Recordset.Update
Else
MsgBox ”修改信息不全,请检查!“
End If End Sub
Private Sub Form_Load()Dim ss As String Dim sql As String ss = App.Path + ”datadata.mdb“ Adodc1.ConnectionString = ”Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password=gxl;Persist Security Info=False;Data Source=“ & ss Adodc1.CommandType = adCmdText sql = ”select * from 银行信息“ Adodc1.RecordSource = sql Adodc1.Refresh '连接数据库 End Sub
3、界面截图:
七)、下面给出数据备份还原的代码 Private Sub a14_Click()On Error GoTo ERR_line newname = App.Path & ”datadata.mdb“ datapath = App.Path & ”backup“ & Date & ” 备份卡.bak“ FileCopy newname, datapath MsgBox ”数据已备份到
“ & datapath, 64, ”提示“ Exit Sub ERR_line: MsgBox ”不能完成数据备份!“, 48, ”运行错误“ End Sub
Private Sub a15_Click()On Error GoTo ERR_line
Me.CommonDialog1.ShowOpen
snewname = Me.CommonDialog1.FileName
sdatapath = App.Path & ”datadata.mdb“
If snewname <> ”“ Then
If MsgBox(”还原后将覆盖原有数据,确定还原吗?“, vbInformation + vbYesNo, ”提示“)= vbYes Then
FileCopy snewname, sdatapath
MsgBox ”数据已经成功还原!请重新登陆 “, 48, ”提示“
Unload Me
Formload.Show
Else
Exit Sub End If
End If Exit Sub
ERR_line: MsgBox ”不能完成数据还原,请进入系统后未做任何操作时进行!“, 48, ”运行错误" End Sub
四、数据库
本系统使用的是access数据库。数据库密码为gxl。本系统共有5张表,分别为:ATM,事务,系统用户表,银行信息,账户。
下面给出数据库的相关截图。
1、表图:
2、ATM的设计视图
3、事务的设计视图
4、系统用户表的设计视图
5、银行信息的设计视图
6、账户的设计视图