音乐播放器课设报告要点_音乐播放器课设
音乐播放器课设报告要点由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“音乐播放器课设”。
音乐播放器
音乐播放器问题定义和可行性研究................................................................2
(1)问题定义.......................................................................................................................2(2)可行性研究.....................................................................................................................3需求分析........................................................................................3功能需求...............................................................................................................................3
1.1 功能描述....................................................................................................................3 2 性能需求...............................................................................................................................4 3 将来可能提出的要求...........................................................................................................4 4项目描述................................................................................................................................5
4.1编写目的.....................................................................................................................5 4.2项目背景.....................................................................................................................5 4.3开发工具及环境简介.................................................................................................6 3 概要设计和详细设计....................................................................6
3.1概要设计.............................................................................................................................6 3.2 详细设计............................................................................................................................7 3.3音乐编码设计.....................................................................................................................7
5主界面界面介绍.............................................................................8 6 系统的实现..................................................................................11
一、主要的对话框.................................................................................................................11
二、全局变量.........................................................................................................................12
三、初始化函数.....................................................................................................................12
三、播放、暂停功能.............................................................................................................15
四、添加文件到播放列表.....................................................................................................18
五、下一首上一首................................................................................................................20
六、停止播放.........................................................................................................................21
七、播放模式.........................................................................................................................21
八、显示时间和播放进度.....................................................................................................22
九、删除歌曲.........................................................................................................................23 5.2 单元测试..........................................................................................................................25 6.总结...............................................................................................26问题定义和可行性研究
本章分为两部分,问题定义和可行性研究。问题定义阶段主要研究我们所学的知识能做什么项目,而可行性研究给出了制作音乐播放器的可行性。
(1)问题定义
通过开发音乐播放器,来练习本学期软件工程课程所学知识。熟悉软件开发的各个阶段,将书本上的知识与实践性的开发活动联系起来。实现音乐播放器基本的功能。(2)可行性研究
大一的时候已经学过了基本的C++编程的知识,在这个基础上,有三个星期的时间来学习MFC编程,学习文件的读写操作,以及系统API函数调用等知识。边学边用,具备开发软件的能力。需求分析
本章给出了音乐播放器应该具备的功能,并给出了功能示意图,最后提出了实现该播放器应该具备的条件。功能需求 1.1 功能描述
本播放器主要有如下功能:1.对文件进行操作。2.对按钮的处理
1.对文件的操作
通过文件的读写知识,实现浏览目录以选择文件,添加歌曲到播放列表,删除播放列表中的歌曲,对已经选中的文件进行播放、暂停,以及通过双击播放列表中的歌曲来播放文件。
2.对控件的处理
对各种按钮添加了事件响应函数,可以处理基本的播放,暂停,上一首/下一首,删除,选择播放模式等操作。功能如下图:性能需求
本项目是一个普通的音乐播放器,运行环境为VS2010,项目运行速率正常,可以满足用户需求。1.时间性能要求:越低越好。
2.便捷性:运用了可视化编程,更有助于人机交互,更人性化。程序的运行,符合正常的操作习惯,程序功能明了简洁!将来可能提出的要求
(1)歌曲列表的保存(2)菜单操作(3)更换背景图片
(4)提供网络下载功能:支持通过歌名和歌手名进行歌曲检索和下载功能;(5)支持歌词显示和同步播放;(6)支持歌曲在线播放;
(7)支持更友好的歌曲检索和下载功能;(8)提供更良好的操作界面。
4项目描述 4.1编写目的设计一个基于windows平台的音乐点播系统,实现音乐库的管理以及播放功能。
音乐播放器能够满足音乐的播放功能,实现一款播放器的基本功能。
4.2项目背景
本项目作为《软件课程设计》课程的训练项目提出,在基本的设计实现基础上,将不断对已有的设计进行进一步的修改和完善,最终完成整个软件开发过程。本次项目的旨在通过不同软件工程设计方法与技术的实践,了解和掌握各种技术、工具平台的特点与局限性,体会协同开发方式。
第1阶段:主要目的是通过对项目需求的分析和理解,通过面向对象的设计方式完成项目前期的准备工作。
第2阶段:我们会根据既定需求,完善设计模式。第3阶段:在设计文档和需求分析的文档下,完成音乐点播系统原型的开发,并完成整个开发流程的测试报告
第4阶段:通过音乐点播系统软件的设计开发,了解软件文档的编写原则,训练掌握软件各类文档写作的技巧,同时在文档的编写过程中提高和增加C++开发的能力和经验。
4.3开发工具及环境简介
操作系统:windows xp或以上版本
C++ 6.0: Visual C++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。
Microsoft Office Word 2003:经典办公软件,本项目中用于编写文档。概要设计和详细设计
3.1概要设计
通过这个阶段的工作将划分出组成系统的物理元素——程序,文件和文档等,但是每个物理元素仍然处于黑盒子级,这些黑盒子里的具体内容将在以后仔细设计。总体设计的另一项重要任务是设计软件的结构,也就是要确定该软件由哪些模块组成的,以及这些模块之间的关系。
运用传统软件工程方法学的知识将音乐播放器软件的开发分成:
一、MFC的使用以及实现方法
二、文件的读写操作
三、系统API函数的调用
3.2 详细设计
根据概要设计所划分的四个模块,该阶段应详细地完成这四个模块的任务:
一、MFC的实现
通过MFC窗口以及函数的使用,创建出播放器的主界面,主界面应包括文件的打开、添加、播放以及线程按键。另外,还要各种函数应该实现相应组件上的各种事件。
二、文件读写操作的实现
通过以前的学过的文件读写操作知识,实现对音乐文件的读以及写操作。
三、系统API函数的调用
通过调用系统媒体控制接口函数实现对mp3,wav,wma等格式的音乐的播放的功能。
3.3音乐编码设计
一、编码原理
1.音乐的十二平均率规定(1)每两个八度音之间的频率相差一倍。
(2)两个八度音之间又可以分为十二个伴音,每两个伴音的频率比为1.059463。
(3)低音6(音名A)的频率是440Hz,音名B到C之间、E到F之间为伴音,其余为全音。2.乐谱编码
选取65536Hz为基准频率,以此频率分频得到简谱高音各音调的分频比。计算公式为N=65536/f。
二、编码参照
为了让ROM能够识别各音频的分频系数,需将个音频分频系数按照一定格式转换成十六进制格式。我们采用8位的ROM,D6D5位表示高中低音,如表1-2所示,11为高音,10为中音,01为低音;用D4D3D2D1D0位表示分频系数,将表1-1的分频系数转换成二进制格式表示;ROM的高位全部补0。然后转换成十六进制如表1-2所示。之所以采用高音分频比的二分之一为基准分频系数,是因为ROM的位宽限制,而每两个八度音频率相差一倍,所以我们后面用译码器译成各音频的分频系数输出给分频器,这样由分频器输出到扬声器,扬声器就可发声了。
5主界面界面介绍
1、界面图:
2添加歌曲按钮
3、删除歌曲按钮
4、音量的变大变小按钮
5、歌曲时间和进度的显示图像
6、下一首歌按钮
7、上一首歌按钮
8、停止播放按钮
9、播放按钮
10、单曲播放/随机播放/顺序播放按钮
11、空白部分为歌曲的菜单列表 6 系统的实现
一、主要的对话框
cla CMCIPlayerDlg : public CDialogEx { // 构造 public: CMCIPlayerDlg(CWnd* pParent = NULL);// 标准构造函数 // 对话框数据
enum { IDD = IDD_MCIPLAYER_DIALOG };
protected: virtual void DoDataExchange(CDataExchange* pDX);//
DDX/DDV 支持
// 实现 protected: HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public: // 列表
CListBox m_list;afx_msg void OnBnClickedOnstart();afx_msg void OnBnClickedOnloadmusic();void load(music a);int isplay;int index;CSliderCtrl volume;afx_msg void OnNMCustomdrawVolun(NMHDR *pNMHDR, LRESULT
*pResult);afx_msg void OnBnClickedOnnext();afx_msg void OnBnClickedOnper();afx_msg void OnBnClickedOnstop();LRESULT OnMciNotify(WPARAM wParam, LPARAM lParam);//设置播放
模式
afx_msg void OnBnClickedOrder();afx_msg void OnLbnDblClk();void OnTimer(UINT nIDEvent);// 进度条
CSliderCtrl m_progre;afx_msg DWORD getinfo(DWORD item);afx_msg void OnBnClickedDeletemusic();};
二、全局变量
struct music { string name;string mPath;};int m_max;//进度条的最大位置变量
int hour,minute,second;//时间变量:小时、分钟、秒钟 DWORD cdlen;//某个音频文件的总时间长度 DWORD m_count;//设备型号
DWORD cdfrom,cdto;//歌曲的起点和终点 DWORD DeviceID;
list mus;//全局歌曲链表
vector allpath;//保存已有的歌
三、初始化函数
BOOL CMCIPlayerDlg::OnInitDialog(){ CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
//volume.SetBkColor(RGB(37,38,37));
HBITMAP
hBitmap;
hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP4));
((CButton *)GetDlgItem(IDC_ONSTART))->SetBitmap(hBitmap);
hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1));
((CButton *)GetDlgItem(IDC_ONPER))->SetBitmap(hBitmap);
hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP2));
((CButton *)GetDlgItem(IDC_ONNEXT))->SetBitmap(hBitmap);
hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP5));
((CButton *)GetDlgItem(IDC_ONSTOP))->SetBitmap(hBitmap);
hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP7));
((CButton *)GetDlgItem(IDC_ORDER))->SetBitmap(hBitmap);
SetBackgroundImage(IDB_BITMAP6,BACKGR_TILE,NULL);
isplay=0;
//未播放状态
index=-1;
m_list.SetCurSel(0);//设置初始选择位置
volume.SetRange(0,1000);//滑块的移动范围0~1000
volume.SetPos(500);//滑块指针的初始位置设为500代表初始音
量为50
ifstream rin;
//导入原先数据
rin.open(“Mylist.txt”);
//int rere;
string str[2];
if(rin>>setw(50)>>str[0]>>setw(150)>>str[1])
while(!rin.eof())
{
music mu;
mu.name=str[0];
mu.mPath=str[1];
CString name;
for(int i=0;i
{
if(mu.name[i]=='/')
mu.name[i]=' ';
}
name=mu.name.c_str();
CString mPath;
for(int i=0;i
{
if(mu.mPath[i]=='/')
mu.mPath[i]=' ';
}
mPath=mu.mPath.c_str();
int j=m_list.GetCount();// 把名字和地址插
入到list控件
m_list.InsertString(j,name);
//CString *p=&mPath;
allpath.push_back(mPath);
rin>>str[0]>>str[1];
}
rin.close();
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0)== IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX
CMenu* pSysMenu = GetSystemMenu(FALSE);if(pSysMenu!= NULL){
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if(!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX, strAboutMenu);
} }
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将
自动
// 执行此操作
SetIcon(m_hIcon, TRUE);
// 设置大图标
SetIcon(m_hIcon, FALSE);// 设置小图标
// TODO: 在此添加额外的初始化代码
return TRUE;// 除非将焦点设置到控件,否则返回 TRUE }
三、播放、暂停功能
void CMCIPlayerDlg::OnBnClickedOnstart()//开始播放 { // TODO: 在此添加控件通知处理程序代码
if(isplay==0){ // TODO: 在此添加控件通知处理程序代码
if(m_list.GetCurSel()==-1)//判断有没有歌曲被选中,若
没有,则从第一首开始播放-1代表没有被选中
m_list.SetCurSel(0);
if(m_list.GetCurSel()==index){
SetTimer(0,1000,NULL);
mciSendCommand(DeviceID,MCI_RESUME,0,0);
HBITMAP
hBitmap;
hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP3));
((CButton *)GetDlgItem(IDC_ONSTART))->SetBitmap(hBitmap);
SetDlgItemText(IDC_ONSTART,“暂停”);
isplay=1;} else {
index = m_list.GetCurSel();CString data;//m_list.GetDlgItemTextA(index,data);//CString c=dat
MCI_OPEN_PARMS mciopenparms;//打开
MCI_PLAY_PARMS mciplayparms;//播放
second=0;minute=0;hour=0;mciopenparms.lpstrElementName=allpath[index];//将音乐文件路
径传给设备
DWORD dwReturn;if(dwReturn=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT|
MCI_WAIT,(DWORD)(LPVOID)&mciopenparms)){
//如果打开文件失败,则将出错信息储存在buffer,并显示
出错警告
char buffer[256];
mciGetErrorString(dwReturn,buffer,256);
MeageBox(buffer,“出错警告!”,MB_ICONHAND|
MB_ICONERROR|MB_ICONSTOP);
} DeviceID=mciopenparms.wDeviceID;
mciopenparms.lpstrDeviceType=NULL;//文件类型
m_count=mciopenparms.wDeviceID;//多媒体设备类型编号
mciplayparms.dwFrom=0;//每次播放都是从0开始播放
HWND hwnd = GetSafeHwnd();
mciplayparms.dwCallback =(DWORD)hwnd;cdlen=getinfo(MCI_STATUS_LENGTH);
CString stime;CClientDC dc(this);dc.SetBkColor(RGB(255,255,255));//设置放置计数器区域的外观
dc.SetTextColor(RGB(95,180,66));stime.Format(“%02d:%02d:%02d”,cdlen/3600000,(cdlen
%3600000)/60000,((cdlen%3600000)%60000)/1000);//显示时间进度
dc.TextOut(328,13,stime);
mciSendCommand(DeviceID,MCI_PLAY,/*MCI_FROM|*/MCI_NOTIFY,(DWORD)(LPVOID)&mciplayparms);
SetTimer(0,1000,NULL);//设置系统计数器,显示歌曲播放的进度
HBITMAP
hBitmap;
hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP3));
((CButton *)GetDlgItem(IDC_ONSTART))->SetBitmap(hBitmap);
SetDlgItemText(IDC_ONSTART,“暂停”);isplay=1;}
} else {
KillTimer(0);
mciSendCommand(DeviceID,MCI_PAUSE,0,0);
HBITMAP
hBitmap;
hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP4));
((CButton *)GetDlgItem(IDC_ONSTART))->SetBitmap(hBitmap);
SetDlgItemText(IDC_ONSTART,“播放”);
isplay=0;} }
四、添加文件到播放列表
void CMCIPlayerDlg::OnBnClickedOnloadmusic()//导入歌曲 { // TODO: 在此添加控件通知处理程序代码
CFileDialog dlg(TRUE, _T(“*.*”), NULL,OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,_T(“mp3文件(*.mp3)|*.mp3|”
“wma文件(*.wma)|*.wma|”
“wav文件(*.wav)|*.wav|”
“所有文件(*.*)|*.*|”), NULL);
// 选项图片的约定
dlg.m_ofn.lpstrTitle = _T(“打开音乐文件”);
// 打开文件对话框 的标题名
if(dlg.DoModal()!= IDOK)
// 判断是否获得图
片
return;
CString mPath = dlg.GetPathName();// 获取音乐路径
CString mmpath=mPath;
allpath.push_back(mPath);
int i = mPath.ReverseFind('');//从磁盘地址中获取歌曲名字
CString name;
name = mPath.Right(mPath.GetLength()-1-mPath.ReverseFind(''));
int j=m_list.GetCount();// 把名字和地址插入到list控件
m_list.InsertString(j,name);//m_shelllist.SetItemText(j,0,name);music mu;mu.name=name.GetBuffer();mu.mPath=mPath.GetBuffer();load(mu);}
void CMCIPlayerDlg::load(music a){ list mus;
ifstream rin;
rin.open(“Mylist.txt”);
//int rere;
string str[2];
if(rin>>str[0]>>str[1])
while(!rin.eof())
{
music mu;
mu.name=str[0];
mu.mPath=str[1];
if(mu.name!=a.name)
mus.push_back(mu);
else
{
MeageBox(“已经有该歌曲”);
return;
}
rin>>str[0]>>str[1];
}
rin.close();
for(int i=0;i
//把名
字里面的空格变为'_'
{
if(a.name[i]==' ')
a.name[i]='/';
}
for(int i=0;i
//把地
址里面的空格变为'*'
{
if(a.mPath[i]==' ')
a.mPath[i]='/';
}
mus.push_back(a);
ofstream out(“Mylist.txt”);list::iterator it=mus.begin();while(it!=mus.end()){
out
(*it).mPath
it++;} out.close();}
五、下一首上一首
void CMCIPlayerDlg::OnBnClickedOnnext()//下一首 { // TODO: 在此添加控件通知处理程序代码
KillTimer(0);
second=0;minute=0;hour=0;mciSendCommand(DeviceID,MCI_CLOSE,0,0);//在加载文件前先清空 上一次播放的设备
isplay=0;index = m_list.GetCurSel();if(index+1==m_list.GetCount()){
m_list.SetCurSel(0);} else {
m_list.SetCurSel(index+1);}
OnBnClickedOnstart();
isplay=1;}
void CMCIPlayerDlg::OnBnClickedOnper()//上一首 { // TODO: 在此添加控件通知处理程序代码
KillTimer(0);
second=0;minute=0;hour=0;mciSendCommand(DeviceID,MCI_CLOSE,0,0);//在加载文件前先清空 上一次播放的设备
isplay=0;
} index = m_list.GetCurSel();if(index==0){ m_list.SetCurSel(m_list.GetCount()-1);} else { m_list.SetCurSel(index-1);} OnBnClickedOnstart();isplay=1;
六、停止播放
void CMCIPlayerDlg::OnBnClickedOnstop()//停止 { // TODO: 在此添加控件通知处理程序代码
KillTimer(0);
second=0;minute=0;hour=0;mciSendCommand(DeviceID,MCI_CLOSE,0,0);//在加载文件前先清空 上一次播放的设备
isplay=0;SetDlgItemText(IDC_ONSTART,“播放”);HBITMAP
hBitmap;
hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP4));
((CButton *)GetDlgItem(IDC_ONSTART))->SetBitmap(hBitmap);
index=-1;UpdateData(false);}
七、播放模式
void CMCIPlayerDlg::OnBnClickedOrder()//设置播放模式 { // TODO: 在此添加控件通知处理程序代码
CString pattern;GetDlgItemText(IDC_ORDER,pattern);if(pattern==“顺序”){
SetDlgItemText(IDC_ORDER,“随机”);
HBITMAP
hBitmap;
hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP8));
((CButton *)GetDlgItem(IDC_ORDER))->SetBitmap(hBitmap);
} if(pattern==“随机”){
SetDlgItemText(IDC_ORDER,“单曲”);
HBITMAP
hBitmap;
hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP9));
((CButton *)GetDlgItem(IDC_ORDER))->SetBitmap(hBitmap);
} if(pattern==“单曲”){
SetDlgItemText(IDC_ORDER,“顺序”);
HBITMAP
hBitmap;
hBitmap = LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP7));
((CButton *)GetDlgItem(IDC_ORDER))->SetBitmap(hBitmap);
} }
八、显示时间和播放进度
void CMCIPlayerDlg::OnTimer(UINT nIDEvent){ CString stime;second++;CClientDC dc(this);dc.SetBkColor(RGB(255,255,255));//设置放置计数器区域的外观
dc.SetTextColor(RGB(95,180,66));
if(second==60)//设置钟表的显示
{minute++;second=0;} if(minute==60){hour++;minute=0;} if(hour==24){hour=0;} stime.Format(“%02d:%02d:%02d”,hour,minute,second);//显示时间
进度
dc.TextOut(68,13,stime);m_progre.SetRange(0,cdlen);//使进度条的范围与歌曲时间一致
UpdateData(false);m_max=cdfrom;//保存歌曲的当前位置信息
if(m_max!=cdlen)//如果歌曲结束,则进度条重新置0 {m_progre.SetPos(cdfrom);} else {m_progre.SetPos(0);m_max=0;OnBnClickedOnstop();}
DWORD cdf=getinfo(MCI_STATUS_POSITION);
cdfrom=MCI_MAKE_MSF(MCI_MSF_MINUTE(cdf),MCI_MSF_SECOND(cdf),MCI_MSF_FRAME(cdf));//获取当前播放文件的信息
UpdateData(false);CDialog::OnTimer(nIDEvent);
九、删除歌曲
void CMCIPlayerDlg::OnBnClickedDeletemusic()//删除歌曲 { // TODO: 在此添加控件通知处理程序代码
if(m_list.GetCurSel()==-1)
MeageBox(“请选中要删除的歌曲”);else {
CString na;
int i=m_list.GetCurSel();
na=allpath[i];
allpath.erase(allpath.begin()+i);
m_list.DeleteString(i);
UpdateData(false);
string pa=na.GetBuffer();
for(int i=0;i
//把地址里面的空格
变为'*'
{
if(pa[i]==' ')
pa[i]='/';
}
list mus;
ifstream rin;
rin.open(“Mylist.txt”);
//int rere;
string str[2];
if(rin>>str[0]>>str[1])
while(!rin.eof())
{
music mu;
mu.name=str[0];
mu.mPath=str[1];
if(mu.mPath!=pa)
mus.push_back(mu);
rin>>str[0]>>str[1];
}
rin.close();
ofstream out(“Mylist.txt”);list::iterator it=mus.begin();while(it!=mus.end()){
out
(*it).mPath
it++;} out.close();
} } 5.2 单元测试
初始界面:
初始界面由一个七个按钮控件,一个列表控件,一个进度条控件组成。
当点击添加歌曲按钮时,弹出文件对话框
弹出的文件对话框
6.总结
自制音乐播放器是运行于VS2010的一款MFC应用程序,该软件通过运用平时所学的知识,把文件的创建、读写操作,MFC控件的使用,系统的MCI函数的知识系统地联系在了一起。
播放器通过文件的读写知识,实现了对音乐文件的添加、删除等操作;通过系统MCI函数,支持MP3,WAV,WMA等格式的音乐文件的播放,而在主界面程序中只是调用这些功能函数,有助于对软件进行更新操作;另外,该软件运用了MFC的知识,实现了按钮,列表框等控件的使用,通过使用事件处理机制,实现了各种按键上的动作事件。
因此,该播放器能够更好地练习本学期所学的各种知识,通过该播放器的开发,回顾了文件的各种操作,加深了对MFC的认识,尤其是对软件开发的各个过程有了较详细的了解。