第一篇:网络课设-端口扫描与抓包分析报告
CENTRAL SOUTH UNIVERSITY
计算机网络课程设计报告题目端口检测与数据包捕获解析 学生姓名 班级学号 指导教师刘丽敏 设计时间 2015年9月
网络课设 | 39 网络课设
目录
CENTRAL SOUTH UNIVERSITY.....................................................................1 第一章设计目的、任务与要求....................................................................................3
1.1设计的目的.......................................................................................................3 1.2设计的任务与要求...........................................................................................3 第二章系统总体分析设计............................................................................................4
2.1 总体需求分析..................................................................................................4 2.2 实验环境..........................................................................................................4 第三章端口扫描模块分析设计....................................................................................4
3.1 端口的基本概念..............................................................................................4 3.2 常见端口了解..................................................................................................5 3.3 扫描端口的基本原理......................................................................................6 3.4 扫描端口的常用技术......................................................................................6 3.5功能设计与流程图...........................................................................................8 第四章端口扫描模块实现............................................................................................8
4.1 输入要扫描的网段并将其排序......................................................................8 4.2 ScanIP扫描......................................................................................................9 4.3 清理结束后进程............................................................................................10 4.4 输出结果........................................................................................................10 4.5 计算时间........................................................................................................11 第五章抓包模块分析设计..........................................................................................11
5.1 IP包知识........................................................................................................11 5.2 功能设计与流程图........................................................................................13 第六章抓包模块实现..................................................................................................15
6.1 数据结构的定义............................................................................................15 6.2 初始化工作....................................................................................................16 6.3 套接字的创建和设置....................................................................................17 6.4 数据包的捕获与分析....................................................................................18 6.5 信息的输出....................................................................................................19 第七章程序运行结果与分析......................................................................................20 第八章心得体会..........................................................................................................25 参考文献......................................................................................................................26 附录程序源代码..........................................................................................................27 | 39
网络课设
第一章设计目的、任务与要求
1.1设计的目的
现今,计算机网络已经彻彻底底地改变了人们的生活。大量的数据都是经过计算机网络传输的,而TCP/IP协议是计算机网络中最重要的协议之一。计算机网络中绝大多数数据都是以IP数据包的形式发送和接受的。所以IP数据包的捕获是很多计算机安全技术的基础。在本次课程实际中,通过编程实现网卡截取标准IP包,并解析IP数据包,以了解IP包结构中各个字段的含义与用途,更好掌握网络层的基本原理,这是第一点。
本课程设计的另一个目的是运用漏洞、端口的基础知识,设计并实现一个网络扫描器,它通过与目标主机TCP/IP端口建立连接并请求某些服务,记录目标主机的应答,分析目标主机相关信息,从而发现目标主机某些内在的安全弱点。
1.2设计的任务与要求
本次实验的要求在网络环境,实现端口检测以及捕获网络中的IP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。
程序的具体要求如下:
l)实现本机以及局域网内计算机的端口监控。
2)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。
3)形成记录结果的日志文件。| 39
网络课设
第二章系统总体分析设计
2.1 总体需求分析
可以将本实验分为两个独立的模块来解决,具体两个模块的设计实现在后面单独章节里详述,从总体而言,可以设计一个界面,将两个功能整合到一起,然后让用户选择所要实验的功能。而对于扫描本机端口,用自己写的端口扫描器也可以完成,但速度较cmd指令慢,所以将其单独出来作为一项功能。其中,cmd中查本机端口号指令为netstat –no。总体系统功能如下图:
开始菜单、接收键盘输入多分支IF1、抓包分析
2、扫本机端口
3、扫局域网端口
4、退出
2.2 实验环境
本实验采用Windows操作系统平台,利用Windows提供的Windows Sockets API实现IP数据包的捕获与分析。采用WinSock 2.2版本,编程语言选用C++,编程开发采用Code::Blocks 13.12。
第三章端口扫描模块分析设计
3.1端口的基本概念
我们这里所说的端口,不是计算机硬件的i/o端口,而是软件形式上的概念。服务器可以向外提供多种服务,比如,一台服务器可以同时是web服务器,也可| 39
网络课设
以是ftp服务器,同时,它也可以是邮件服务器。为什么一台服务器可以同时提供那么多的服务呢?其中一个很主要的方面,就是各种服务采用不同的端口分别提供不同的服务。根据提供服务类型的不同,端口分为两种,一种是TCP端口,一种是UDP端口。计算机之间相互通信的时候,分为两种方式:一种是发送信息以后,可以确认信息是否到达,也就是有应答的方式,这种方式大多采用TCP协议;一种是发送以后就不管了,不去确认信息是否到达,这种方式大多采用UDP协议。对应这两种协议的服务提供的端口,也就分为TCP端口和UDP端口。那么,如果攻击者使用软件扫描目标计算机,得到目标计算机打开的端口,也就了解了目标计算机提供了那些服务。
3.2 常见端口了解
端口是一个16 bit的地址,用端口号进行标识不同作用的端口。端口一般分为两类。
熟知端口号:范围从0到1023,这些端口号一般固定的分配给一些服务,所以,这些端口分别对应哪些服务也是我们要关注的,以下是一些常见的熟知端口号的介绍:
1)端口:21 服务:FTP 说明:FTP服务器所开放的端口,用于上传、下载。最常见的攻击者用于寻找打开anonymous的FTP服务器的方法。这些服务器带有可读写的目录。木马Doly Trojan、Fore、Invisible FTP、WebEx、WinCrash和Blade Runner所开放的端口。
2)端口:23 服务:Telnet 说明:远程登录,入侵者在搜索远程登录UNIX的服务。大多数情况下扫描这一端口是为了找到机器运行的*作系统。还有使用其他技术,入侵者也会找到密码。木马Tiny Telnet Server就开放这个端口 3)端口:25 服务:SMTP 说明:SMTP服务器所开放的端口,用于发送邮件。入侵者寻找SMTP服务器是为了传递他们的SPAM。入侵者的帐户被关闭,他们需要连接到高带宽的E-MAIL服务器上,将简单的信息传递到不同的地址。木马Antigen、Email Password Sender、Haebu Coceda、Shtrilitz Stealth、WinPC、WinSpy都开放这个端口 4)端口:80 服务:HTTP 说明:用于网页浏览。木马Executor开放此端口。| 39
网络课设
动态端口号:动态端口的范围从1024到65535,这些端口号一般不固定的分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。比如8080端口就是分配给第一个向系统发出申请的程序。在关闭程序进程后,就会释放所占用的端口号。
3.3 扫描端口的基本原理
端口分为源端口和目的端口,源端口是本机打开的,目的端口是在和本机通信的另一台计算机的端口。端口是由计算机的通信协议TCP/IP协议定义的。其中规定,用IP地址和端口作为套接字,它代表TCP连接的一个连接端,一般称为Socket。具体来说,就是用IP端口来定位一台主机中的进程。可以做这样的比喻,端口相当于两台计算机进程间的大门,可以随便定义,其目的只是为了让两台计算机能够找到对方的进程。计算机就像一座大楼,这个大楼有好多入口(端口),进到不同的入口中就可以找到不同的公司(进程)。如果要和远程主机A的程序通信,那么只要把数据发向A端口就可以实现通信了。可见,端口与进程是一一对应的,如果某个进程正在等待连接,称之为该进程正在监听,那么就会出现与它相对应的端口。由此可见,通过扫描端口,便可以判断出目标计算机有哪些通信进程正在等待连接。服务器上所开放的端口就是潜在的通信通道,也就是一个入侵通道。对目标计算机进行端口扫描[5],能得到许多有用的信息,进行端口扫描的方法很多,可以是手工进行扫描、也可以用端口扫描软件进行。
扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法可以搜集到很多关于目标主机的各种有用的信息,例如远程系统是否支持匿名登陆、是否存在可写的FTP目录、是否开放TELNET服务和HTTPD服务等。
3.4 扫描端口的常用技术
1、TCP connect()扫描:
这是最基本的TCP扫描,操作系统提供的connect()系统调用可以用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么connect()就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的一个最大的优点是,你不需要任何权限。系统中的任何用户都有权利使用这个调用。另一个好处就是速度,如果对每个目标端口以线性的方式,使用单独的| 39
网络课设
connect()调用,那么将会花费相当长的时间,使用者可以通过同时打开多个套接字来加速扫描。使用非阻塞I/O允许你设置一个低的时间用尽周期,同时观察多个套接字。但这种方法的缺点是很容易被察觉,并且被防火墙将扫描信息包过滤掉。目标计算机的logs文件会显示一连串的连接和连接出错消息,并且能很快使它关闭。
2、TCP SYN扫描:
这种技术通常认为是“半开放”扫描,这是因为扫描程序不必要打开一个完全的TCP连接。扫描程序发送的是一个SYN数据包,好象准备打开一个实际的连接并等待反应一样(参考TCP的三次握手建立一个TCP连接的过程)。一个SYN|ACK的返回信息表示端口处于侦听状态:返回RST表示端口没有处于侦听态。如果收到一个SYN|ACK,则扫描程序必须再发送一个RST信号,来关闭这个连接过程。这种扫描技术的优点在于一般不会在目标计算机上留下记录,但这种方法的缺点是必须要有root权限才能建立自己的SYN数据包。
3、TCP FIN 扫描:
SYN扫描虽然是“半开放”方式扫描,但在某些时候也不能完全隐藏扫描者的动作,防火墙和包过滤器会对管理员指定的端口进行监视,有的程序能检测到这些扫描。相反,FIN数据包在扫描过程中却不会遇到过多问题,这种扫描方法的思想是关闭的端口会用适当的RST来回复FIN数据包。另一方面,打开的端口会忽略对FIN数据包的回复。这种方法和系统的实现有一定的关系,有的系统不管端口是否打开都会回复RST,在这种情况下此种扫描就不适用了。另外这种扫描方法可以非常容易的区分服务器是运行Unix系统还是NT系统。
4、IP段扫描:
这种扫描方式并不是新技术,它并不是直接发送TCP探测数据包,而是将数据包分成两个较小的IP段。这样就将一个TCP头分成好几个数据包,从而过滤器就很难探测到。但必须小心:一些程序在处理这些小数据包时会有些麻烦。
5、TCP 反向 ident扫描:
ident 协议允许(rfc1413)看到通过TCP连接的任何进程的拥有者的用户名,即使这个连接不是由这个进程开始的。例如扫描者可以连接到http端口,然后用identd来发现服务器是否正在以root权限运行。这种方法只能在和目标端口建立了一个完整的TCP连接后才能看到。
6、FTP 返回攻击:
FTP协议的一个有趣的特点是它支持代理(proxy)FTP连接,即入侵者可以从自己的计算机self.com和目标主机target.com的FTP server-PI(协议解释器)连接,建立一个控制通信连接。然后请求这个server-PI激活一个有效的| 39
网络课设
server-DTP(数据传输进程)来给Internet上任何地方发送文件。对于一个User-DTP,尽管RFC明确地定义请求一个服务器发送文件到另一个服务器是可以的,但现在这个方法并不是非常有效。这个协议的缺点是“能用来发送不能跟踪的邮件和新闻,给许多服务器造成打击,用尽磁盘,企图越过防火墙”。
3.5功能设计与流程图
开始初始化输入IP段ScanIP扫描计算时间结束 第四章端口扫描模块实现
4.1 输入要扫描的网段并将其排序
//功能: 输入一个IP段,输出该IP段内的端口开放情况信息
int ScanIp(const string &start_Ip, const string multimap
GetIpToScan(start_Ip,endIp,g_vec_IpToScan);int scanNum = g_vec_IpToScan.size();//线程总数
g_runThreadNum = scanNum;
&endIp, | 39 网络课设
cout< for(int i = 0;i < scanNum;++i){ CreateThread(NULL,0,ThreadFunc,&g_vec_IpToScan[i],0,NULL);//要是不间隔时间的话,同时创建socket会出现10093错误 Sleep(50);} return 0;} 4.2ScanIP扫描 建立多个线程,每个线程扫描一个ip。每个线程内先建立数据流套接字,然后绑定ip端口进行扫描。将扫描端口保存到g_map_ScanResult。//保存IP扫描的结果 multimap short port;//正在扫描的端口 while(index < PORTSNUM){ port = g_portsTOscan[index];//创建数据流套接字 link_sock = socket(AF_INET, SOCK_STREAM, 0);if(link_sock == INVALID_SOCKET)//cout << “创建link_sock socket失败:错误号为: ” << GetLastError()<< endl;WaitForSingleObject(g_ThreadNumMutex,INFINITE);g_runThreadNum--;| 39 网络课设 ReleaseMutex(g_ThreadNumMutex);//cout << “***还有_”<< g_runThreadNum << “_个扫描线程进行中**”<< endl;return-1;} 4.3 清理结束后进程 //清理 void CleanProc(){ //线程都执行完后清理socket相关信息 while(1){ WaitForSingleObject(g_ThreadNumMutex,INFINITE);if(g_runThreadNum == 0){ break;} ReleaseMutex(g_ThreadNumMutex);Sleep(100);} //清理socket相关信息 WSACleanup();} 4.4输出结果 //输出扫描结果 int OutPutScanInfo(){ cout <<“扫描到 ” << g_map_ScanResult.size()<< “ 条记录” << endl; multimap ofstream out(“out.txt”); cout <<“显示总 ” << g_map_ScanResult.size()<< “ 条记录” << endl;cout< for(;iter!=g_map_ScanResult.end();++iter) { out << iter->second << endl; cout << iter->second << endl;| 39 网络课设 } return 0;} 4.5 计算时间 //计算程序运行时间 end_time = clock(); cost_time =(double)(end_timeulStartIp; for(int i = 0;i <= ipnums;++i){ //将每个IP的unsigned long型存到数组中供扫描 vec_ip.push_back(InvertIp(ulStartIp++));} return 0;} //功能: 输入一个IP段,输出该IP段内的端口开放情况信息 | 39 网络课设 int ScanIp(const string &start_Ip, const string &endIp, multimap GetIpToScan(start_Ip,endIp,g_vec_IpToScan);int scanNum = g_vec_IpToScan.size(); //线程总数 g_runThreadNum = scanNum;cout< cout<<“********************************************************************************”;cout << “t共有 ” << scanNum <<“ 个IP要扫描” << endl;//对每个IP开一个线程 for(int i = 0;i < scanNum;++i){ CreateThread(NULL,0,ThreadFunc,&g_vec_IpToScan[i],0,NULL);//要是不间隔时间的话,同时创建socket会出现10093错误 Sleep(50);} return 0;} //输出扫描结果 int OutPutScanInfo(){ cout <<“扫描到 ” << g_map_ScanResult.size()<< “ 条记录” << endl;multimap ofstream out(“out.txt”);cout <<“显示总 ” << g_map_ScanResult.size()<< “ 条记录” << endl;cout< | 39 网络课设 void UserInput(){ system(“CLS”); cout<<“**********************************************************************”< cout<<“**********************************************************************”< cout<<“********************************************************************************”<< endl;} //初始化相关信息 void InitProc(){ //初始化socket相关信息 int ws_result;ws_result = WSAStartup(MAKEWORD(2,2),&g_wsadata); if(ws_result!= 0){ cout << “socket WSAStartup初始化失败” << endl;} //设置阻塞函数的超时时间 g_timeout.tv_sec = TIMEOUT;g_PortMutex = CreateMutex(NULL, FALSE, “port mutex”);g_ThreadNumMutex= CreateMutex(NULL, FALSE, “threadnums mutex”);g_ResultMutex = CreateMutex(NULL, FALSE, “result mutex”);} //清理 void CleanProc(){ //线程都执行完后清理socket相关信息 while(1) | 39 网络课设 { WaitForSingleObject(g_ThreadNumMutex,INFINITE);if(g_runThreadNum == 0){ break;} ReleaseMutex(g_ThreadNumMutex);Sleep(100);} //清理socket相关信息 WSACleanup();} int main(int argc, char **argv){ cout<<“t欢迎来到抓包小程序!”< int sz;cin>>sz;if(sz==1){ if(argc!= 2){ //cout< //初始化winsock的动态链接库 WSADATA wsa_data; if(WSAStartup(MAKEWORD(2, 2), &wsa_data)!= 0){ cerr << “WSAStartup()error!” << endl;return 1;} | 39 网络课设 //建立一个原始套接字 SOCKET s = socket(AF_INET, SOCK_RAW, IPPROTO_IP);if(s == INVALID_SOCKET){ WSACleanup();cerr << “socket()error!” << endl;return 1;} //设置套接字 set_socket(s); //打开日志文件 ofstream fout(argv[1]);if(!fout){ cerr << “fout.open()error!” << endl;return 1;} //捕获数据包,并进行解析 //将结果写入标准输出和日志文件中 char buf[MAX_IP_LEN];for(;;){ int n_recv = recv(s, buf, sizeof(buf), 0);SYSTEMTIME cur_time;GetLocalTime(&cur_time);//获得捕获数据包的时间 if(n_recv > 0){ IPHead *lp_iphead =(IPHead *)buf; char buf[20];sprintf(buf, “%02d:%02d:%02d:%03d”, cur_time.wHour, cur_time.wMinute, cur_time.wSecond, cur_time.wMilliseconds); //输出到标准输出 cout << “捕包时间t” << buf << endl;output_ip(lp_iphead, cout);cout << endl << endl; //输出到文件 | 39 网络课设 fout << “捕包时间t” << buf << endl;output_ip(lp_iphead, fout);fout << endl << endl;fout.flush();} } WSACleanup();system(“pause”);return 0;} else if(sz==2){system(“netstat-an”);} else if(sz==3){ clock_t start_time;clock_t end_time;double cost_time = 0;start_time = clock();InitProc();//初始化 UserInput();//输入 ScanIp(g_startIp,g_endIp,g_map_ScanResult);//开始扫描 CleanProc();//清理结束后进程 OutPutScanInfo();//输出结果 //计算程序运行时间 end_time = clock();cost_time =(double)(end_time-start_time)/ CLOCKS_PER_SEC;cout << “使用时间为: ” << cost_time << “ 秒” << endl;system(“pause”);return 0;} else if(sz==4){cout<<“马上退出”;} else cout<<“输入错误”;} /* **set_socket完成对原始套接字s的设置 **以使s能接收到所用的IP数据包 */ void set_socket(SOCKET s){ //将s绑定到本机地址上 struct sockaddr_in hostaddr;hostaddr.sin_family = AF_INET;hostaddr.sin_port = htons(0);hostaddr.sin_addr.s_addr = gethostid();if(bind(s,(sockaddr *)&hostaddr, sizeof(sockaddr))!= 0) | 39 网络课设 { closesocket(s);WSACleanup();cerr << “bind()error!” << endl;exit(-1);} //将s设置为接受所有IP数据包 DWORD in_buffer = 1, n_returned;int ret = WSAIoctl(s, SIO_RCVALL, &in_buffer, sizeof(in_buffer), NULL, 0, &n_returned, NULL, NULL);if(ret!= 0){ closesocket(s);WSACleanup();cerr << “WSAIoctl()error!” << endl;exit(-1);} } /* **函数:gethostid()**描述:获得本机IP地址,使用如下算法: ** 生成一个UDP socket ** 连接这个UDP socket到任意的地址和端口 ** 使用getsockname()得到本地IP地址 */ u_long gethostid(){ SOCKET s = socket(AF_INET, SOCK_DGRAM, 0); struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(IPPORT_ECHO);addr.sin_addr.s_addr = inet_addr(“128.127.50.1”); connect(s,(sockaddr*)&addr, sizeof(sockaddr)); struct sockaddr_in hostaddr;//本机地址 int n_addr = sizeof(sockaddr);getsockname(s,(sockaddr*)&hostaddr, &n_addr); closesocket(s); | 39 网络课设 return hostaddr.sin_addr.s_addr;} /* **将IP数据包信息输出到out流 **ip_iphead为指向IPHead类型的指针 */ void output_ip(IPHead *lp_iphead, ostream &out){ out << “版本tt” <<(int)lp_iphead->version << endl;out << “头长度tt” <<(int)(lp_iphead->ihl * 4)<< “(BYTE)” << endl;out << “服务类型t” <<(int)lp_iphead->tos << endl;out << “数据包总长度t” << lp_iphead->len << “(BYTE)” << endl;out << “数据包标识t” << lp_iphead->id << endl; u_short unserved =(lp_iphead->off)>> 15;u_short DF =((lp_iphead->off)>> 14)& 0x0001;u_short MF =((lp_iphead->off)>> 13)& 0x0001;out << “分段标识t” << unserved << DF << MF << endl;out << “分段偏移量t” <<((lp_iphead->off)& 0x1fff)<< endl; out << “生存时间t” <<(int)lp_iphead->ttl << “(hops)” < out << “头校验和t” << lp_iphead->cksum << endl;out << “源IP地址t” << inet_ntoa(lp_iphead->saddr)<< endl;out << “目的IP地址t” << inet_ntoa(lp_iphead->daddr)<< endl;} | 39 基于C/S结构的套接字程序设计 ----通过socket实现服务端功能 学 院: 信息技术工程学院 _ 专 业: 计算机科学与技术 _ 班 级: *班 _ 姓 名: 陈*** 学 号: 0123456789 指导老师: *** 开课时间:2014年1月12日到1月16日 摘 要 基于C/S结构的套接字程序设计,采用了Client/Server模型, 程序基于TCP协议,通过socket接口来实现的。服务器端的一个端口用来监听对服务的请求,另外有一个临时端口用来给客户端发送数据,当客户端向该地址提出连接请求时,服务器端会对它的请求做出相应的反应。 当连接成功之后,客户端就可以向服务器端发送数据或接收来自服务器的的数据。在传输过程中如果出现错误会返回错误信息,并对该信息做出诊断。 引 言 1、目的及要求 (1)目的和意义 通过编程了解C/S结构的网络通信模型; 掌握基于C/S结构的Windows Socket TCP的程序设计方法。(2)基本要求 按照C/S模型编写两个程序。一个为客户端程序,另一是服务器端程序; 对于C/S两端都应输出必要的日志、出错或诊断信息。 2、研究设想 能够实现当客户端向服务器端发送请求时,通过TCP协议(传输控制协议)服务器端能够响应,并能与客户端进行通信。 3、相关理论 TCP协议提供的是可靠的、面向连接的传输控制协议,即在传输数据前要先建立逻辑连接,然后再传输数据,最后释放连接3个过程。TCP协议在网络层IP协议的基础上,向应用层用户进程提供可靠地全双工的数据流传输。并且通过创建的流式套接字实现服务端与客户端的数据传送。 流式套接字(SOCK--STREAM):该类套接字提供了面向连接的、可靠的、数据无错并且无重复的数据发送服务。而且发送的数据是按顺序接收的。所有利用该套接字进行传递的数据均被视为连续的字节流的并且无长度限制。这对数据的稳定性、正确性和发送/接受顺序要求严格的应用十分适用,TCP使用该类接口。 4、预期结果 通过运用套接字,实现服务器端与客户端的数据传送。 5、关键字 流式套接字;TCP/IP协议;服务器/客户端 正 文 1、理论基础 应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字的接口,区分不同应用程序进程间的网络通信和连接。网络化的应用程序在开始任何通讯之前都必需要创建套接字。 套接字可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入套接字中,该套接字将这段信息发送给另外一个套接字中,使这段信息能传送到其他程序中。 套接字,是支持TCP/IP的网络通信的基本操作单元,可以看作是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。 流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP协议。 2、设计方法及思路 客户端与服务器建立连接,连接是通过申请的套接字实现的,客户打开一个套接字并把它约束在一个端口上如果成功就相当于建立一个虚拟文件以后就可以在虚拟文件上写数据并通过网络向外传送,完成连接后就可以通信了。客户机向服务器发送请求,打开一个连接后,客户机把请求消息送到服务器的停留端口上,完成提出请求操作。服务器在处理完客户的请求之后,要向客户机发送响应消息。客户通过关闭套接字来结束TCP/IP对话。 当使用TCP/IP协议发送客户服务器服务程序时,服务器需要等待任意数量客户端的连接,以便为他们提供服务。客户端连接服务器时,必须先知道服务器的名称。在TCP/IP中,就是服务器的IP地址和端口号。bind()函数实现将服务器绑定到一个已知的名字上的功能。接下来要将服务器套接字设置为监听状态,这是通过listen()函数完成的。在监听状态下,如果客户端向服务器发起连接请求,服务器通过调用accept()函数来接受该连接请求。服务器与客户端完成连接后,就可以进行数据通信了。 对于客户端来说,首先调用connect()函数向服务器发出连接请求。如果服务器接受了该请求接下来就可以与服务器通信了 3、编程方法 TCP/IP流式套接字的编程步骤(客户端程序)及流程 1)加载套接字库 2)创建套接字(socket) 3)向服务器发出连接请求(connect) 4)和服务器端进行通信 5)关闭套接字 6)流程 4、主要内容及对其分析 客户端源程序 using System;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Windows.Forms;namespace Socket { public partial class Server : Form { public Server(){ InitializeComponent();TextBox.CheckForIllegalCrossThreadCalls = false;} private void ErrShow(string str, Exception ex)4 { SetShow(“------错误-------rn”);SetShow(ex.Message + “rn”);SetShow(“-----------------rn”);} private void SetShow(string str){ txtShow.AppendText(str+“rn”);} #region 服务端部分 //负责监听端口 System.Net.Sockets.Socket wellcome = null;//负责和客户端通信 System.Net.Sockets.Socket connect = null;//负责监听线程 Thread listenThread = null; private void btnListen_Click(object sender, EventArgs e){ //创建 try { IPAddress ipadd = IPAddress.Parse(txtIp.Text.Trim());//创建端口 IPEndPoint ipend = new IPEndPoint(ipadd, int.Parse(txtPort.Text.Trim()));//监听套接字(寻址协议流方式、Tcp协议 wellcome = new System.Net.Sockets.Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);wellcome.Bind(ipend);wellcome.Listen(10);//允许监听的最大数量 SetShow(“开始监听了-…-”);listenThread = new Thread(Listing){ IsBackground = true };listenThread.Start(); } catch(Exception ex){ ErrShow(“", ex);5 } } /// 5、结果 运行页面 监听页面 监听错误报告 6、不足之处 我们的这次课程设计程序编写运用C#语言。虽然满足设计的基本要求要求,但由于对TCP的概念相对于模糊,导致缺少对端口号的判断,使得任意的端口号都可以进行数据传送,而且没有考虑到一些端口号的特殊性,使得程序整体运行不完美。 因此考虑到这些不足,以下是对程序的补充。 改进程序设计: 1)判断客户输入的端口号是否是合理的: try { Int16 x = Convert.ToInt16(this.txtClientTxt.Text.Trim());} catch { MessageBox.Show(”请输入大于0的整数!“,”提示“,MessageBoxButtons.OK);textBox1.Focus();return;} if(Convert.ToInt16(this.txtClientTxt.Text.Trim())<= 0){ MessageBox.Show(”请输入大于0的整数!“, ”提示“, MessageBoxButtons.OK);textBox1.Focus();return;} 2)检查TCP端口是否被占用 Process p = new Process();//提供对本地和远程进程的访问并使您能够启动和停止本地系统进程。 //Process.StartInfo 属性,获取或设置要传递给 Process 的 Start 方法的属性。p.StartInfo = new ProcessStartInfo(”netstat“, ”-a“);//指定启动进程时使用的一组值。p.StartInfo.CreateNoWindow = true;//获取或设置指示是否在新窗口中启动该进程的值。//如果UseShellExecute属性是true或UserName和Password属性不是null、CreateNoWindow属性值将被忽略,并创建一个新窗口。 p.StartInfo.UseShellExecute = false;//获取或设置一个值,该值指示是否使用操作系统 shell 启动进程。 p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;//获取或设置启动进程时使用的窗口状态。 p.StartInfo.RedirectStandardOutput = true;//获取或设置一个值,该值指示是否将应用程序的输出写入 Process.StandardOutput 流中。p.Start();string result = p.StandardOutput.ReadToEnd().ToLower();//最后都转换成小写字母 //Environment.MachineName获取此本地计算机的 NetBIOS 名称。 if(result.IndexOf(”tcp “ + Environment.MachineName.ToLower()+ ”:“ + textBox1.Text)>= 0){ MessageBox.Show(”TCP“ + textBox1.Text + ”端口被占用“,”提示 “,MessageBoxButtons.OK,MessageBoxIcon.Information);} else { MessageBox.Show(”TCP“ + textBox1.Text + ”端口没有被占用“, ”提示", 9 MessageBoxButtons.OK.MessageBoxIcon.Information);} 结 论 通过这次的网络课程设计收获颇多,在对与原有的基础上再一次的学习TCP知识。我们组这次做的课题的目的就是通过套接字在客户端和服务器之间建立连接,这个连接是以TCP协议传输。在建立连接之后实现客户端与服务器之间的通信,从而设计相关函数的调用和对套接字的应用。: 客户连接(Client connections)由客户启动,并将本地客户套接字与远程服务器套接字相连.客户套接字必须说明它们想连接的服务器.需要提供服务器的主机名或IP地址及其端口号.2 : 监听连接(Listening Connections)是等待客户的被动服务器套接字连接.一旦客户发出了新的请求,服务器就会为该特殊连接生成新的套接字,然后返回监听状态.监听服务器套接字必须说明代表其提供服务的端口吗(事实上,客户正是通过该端口进行连接的).3 : 服务器连接是由服务器激活的连接,负责接受来自客户的请求.这些不同的连接种类只对建立客户与服务器之间的连接具有重要性.一旦连接建立完毕.连接的双方都可以自由发出请求并彼此发送数据.这里面涉及什么是套接字,什么是流式套接字,为什么用流式套接字等问题。用套接字中的相关函数来完成通信过程,它的存在是为了区别不同应用程序进程间的网络通信和连接。流套接字用于提供面向连接、可靠的数据传输服务,又因为该服务将保证数据能够实现无差错、无重复发送,并按顺序接收,所以用了流式套接字。 致 谢 真诚感谢老师在我们课程设计阶段给予我们的指导与帮助以及专业课的教授,在老师的指导下使我对网络专业知识有了更深的认识,并且您严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我,这些使我受益匪浅,并将成为我终身献身科学和献身事业的动力。在此向您致以诚挚的谢意与敬意。 参考文献 《计算机网络课程设计》吴功宜、胡晓英、张仁、何云、王宁编著 机械工业出版社 《计算机网络》(第三版)安淑芝、黄彦编著 网络上的关于套接字编程的课件 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 课程设计报告 题目:华科校园导航 课程名称:数据结构课程设计 专业班级: 学 号: 姓 名: 指导教师: 报告日期: 计算机科学与技术学院 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 任务书 数据结构是计算机科学技术与信息安全等专业的一门重要专业基础课,牢固掌握数据结构的基础知识,熟练地运用数据结构的思想与技术方法解决实际应用问题是是本课程学习的基本任务与目标。而课程设计是实现这一学习目标的重要环节和组成部分。通过课程设计的训练,使学生加深对数据结构知识的理解,牢固掌握其应用方法,并合理灵活地解决一定实际问题,增强和提高综合分析问题与解决问题的能力。 设计题目 华科地图导航系统。设计目的 掌握图结构的物理存储结构、基本算法及其算法在相关领域中的应用。 设计内容 华中科技大学(Huazhong University of Science and Technology),简称华中大,坐落于湖北省武汉市,学校面积7000余亩。华科大校园具有典型的工科院校特征,道路笔直,建筑面积方方正正,这为构建电子地图提供了极大的便利。本次课程设计要求以华中科技大学为背景,设计一个简单的华科地图导航程序,可以方便的为用户提供搜索、导航等功能。 设计要求 基本要求: 1.输入地点名,可以在地图中以一定标记标示出地点所在的位置 2.鼠标移动到指定建筑处显示建筑名称 3.输入或点击起点和终点,找出最短的路径,并在图上描出路径,路径不能脱离道路 4.输入起点,输入特定的地点,如食堂,超市能够找到最近的两到三个 5.地点至少要包括清单中所列的位置 实验提示: 1.将每个十字路口或特定建筑看作节点,构建图模型,两个节点的边即是一个路段。对于某些节点,可能具有特定的意义,例如“图书馆”,可以为其设置一个名称;而对于大多数节点,例如普通路口,可能并不需要名称,只是用来构建图模型的一个节点。信息的录入可能需要人为输入,需要编写辅助程序。辅助程序可以如下构造: 程序首先载入一张图片并显示。程序具有多个文本框,当点击图片上 I 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 特定点时,获取该点的坐标,第一个文本框显示该点的图像坐标,第二个文本框可以输入地点名,第三个文本框用来输入节点编号,剩下的文本框用来输入直接相邻的节点编号或者节点的属性。点击“确认”后可以将信息保存到磁盘。这样可以实现坐标、节点编号和位置名称的绑定,为实验构图采集数据。 2.特定建筑只需考虑建筑大门所对应的路段上的一点。例如“图书馆”建 筑,可认为“图书馆”位于图书馆大门和学校道路相接处,简化处理。当鼠标移动到“图书馆”附近时,找到距离最近的具有名称的节点显示 即可。 3.对于存在折线的路段,将其看作多段处理;对于细碎的弯折路线,当作 直线简化处理。 参考文献 [1] 严蔚敏,吴伟民.数据结构(C语言版).北京: 清华大学出版社,1997 [2] 王晓东.计算机算法设计与分析.北京: 电子工业出版社, 2007 [3] 严蔚敏,吴伟民,米宁.数据结构题集(C语言版).北京: 清华大学出版社,1999 [4] Elliot B.Koffman and Paul A.T.Wolfgang..Objects, Abstraction, Data Structures and Design: Using C++.October 2005, ©2006 II华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 目录 任务书.............................................................................................................................I 1 系统需求分析与总体设计........................................................................................1 1.1系统需求分析.................................................................................................1 1.2系统总体设计.................................................................................................1 2 系统详细设计............................................................................................................2 2.1 有关数据结构的定义....................................................................................2 2.2 主要算法设计................................................................................................3 3 系统实现与测试........................................................................................................4 3.1 系统实现........................................................................................................4 3.2 系统测试........................................................................................................6 4 总结与展望..............................................................................................................13 4.1 全文总结......................................................................................................13 4.1 工作展望......................................................................................................13 5 体会..........................................................................................................................15 参考文献......................................................................................................................16 附录..............................................................................................................................17 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 系统需求分析与总体设计 1.1系统需求分析 华中科技大学(Huazhong University of Science and Technology),简称华中大,坐落于湖北省武汉市,学校面积7000余亩。华科大校园具有典型的工科院校特征,道路笔直,建筑面积方方正正,这为构建电子地图提供了极大的便利。本次课程设计以华中科技大学为背景,设计一个简单的华科校园地图导航程序,可以方便的为用户提供搜索、导航等功能。该系统的具体的功能为: 1.输入任意地点名,可以在地图中以一定标记显示出该地点所在的位置; 2.输入任意起点和终点,可以在地图上查询并显示从起点到终点的最佳路线以及最短距离; 3.输入任意地点名,可以在地图上查询并显示出距离该地点最近的食堂或者超市,并给出从该地点到达食堂或者超市的最佳路线和最短距离; 4.鼠标移动到地图上的某一地点是,显示该地点的名称和简介; 5.系统能为用户提供华科整体地图、系统使用说明、设计信息。拥有以上的功能的导航应用将给不熟悉华科的用户提供极大的便利,是人们所需要的。 1.2系统总体设计 系统的总体模块图如图1所示。用户进入系统后,在窗口主界面可以选择“地图导航”、“进入地图”、“使用帮助”“关于导航”、“退出导航”等功能。在“地图导航”功能中,用户可以查询某个地点或者某个地点附近最近的食堂和超市、到达该地点的最佳路径和距离等,在过了一定时间后,系统会提示用户选择返回“地图导航”界面还是进入“进入地图”功能,然后系统根据用户的选择进入相应的界面;在“进入地图”功能下,用户可以浏览整个华科地图并且查询某个地点的名称和简介;在“使用帮助”下,用户可以阅读该系统的使用说明;在“关于导航”下,用户可以了解该系统的设计信息;用户点击“退出导航”即可退出该系统。 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 图 1 系统详细设计 2.1 有关数据结构的定义 华科校园导游系统是用图结构来实现的。具体数据结构如下: 定义景点的结构类型 typedef struct { 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 Point point;char name[20];char num;}Vexs; 定义景点坐标的结构类型 typedef struct { int x;int y;}Point; 定义图的结构类型 struct MGraph { }; 声明无向图的邻接矩阵类型 MGraph G[100],G0,G1; 初始化所有景点信息,存放在图G1中 int CreateUDG1(MGraph &G1);Vexs vexs[MAX_VEX_NUM]; //顶点向量 int vexnum,arcnum; //顶点数,边数 int arcs[MAX_VEX_NUM][MAX_VEX_NUM];//邻接矩阵 2.2 主要算法设计 Floyd算法:void Floyd(void); 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);„„;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。 采用松弛技术(松弛操作),对在i和j之间的所有其他点进行一次松弛。所以时间复杂度为O(n^3);其状态转移方程为map[i,j]:=min{map[i,k]+map[k,j],map[i,j]};map[i,j]表示i到j的最短距离,K是穷举i,j的断点,map[n,n]初值应该为0,或者按照题目意思来做。当然,如果这条路没有通的话,还必须特殊处理,比如没有map[i,k]这 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 条路。 通过弗洛伊德算法计算出两单间的最短路径之后,就可以通过距离计算公式计算出两点间的最短距离。 利用佛洛依德算法计算出每两点间的最短路径矩阵。里面有三重for循环,时间的复杂度为O(n^3)。系统实现与测试 3.1 系统实现 3.1.1 开发环境 本系统是在windows7下的Visual C++ 6.0编译器中进行设计,但是一般的编译器中没有包含编写界面的 Runtime Library 下选 Multi-threaded Debug(/MTd)Project->setting->C/C++->category(code generation)->using runtime library(debug multithread)。3.1.2 运行环境 Window7 64位旗舰版系统。3.1.3 主要函数及说明 1、void Floyd(void); 按照实际路况处理,利用佛洛依德算法,算出每两点间的最短路径矩阵。求 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 ->的最短路径,如果->有弧,则存在一条长度为arcs[i][j]的路径,但是该路径不一定是最短路径,尚需要进行n次试探。若存在(Vi,Vo,Vj),则比较(Vi,Vj)和(Vi,Vo)+(Vo,Vj)的大小。取(Vi,Vo,Vj)和(Vi,Vj)的较短者,继续添加结点。依此类推,每次都找到短路径,最后得到的便是最短路径。把最短的路径存到全局变量path中。 2、void LoadData(void); 加载初期设定的信息包括所有图片。并且将设定好的坐标信息存储到图G0中。并且使用佛洛依德算法,将每对景点之间的最短路径距离算出并存储最短路径到全局变量path中。以方便后续程序的进行。 3、int CreateUDG1(MGraph &G1);加载所有景点信息,并存储到图G1中。(图G1不包括路口坐标信息)。里面有两个for循环,一个用来加载景点坐标,名称和代号。另一个for循环用来构建完全图G1,计算出每对景点的最短路径(理想情况下处理的)。返回值为1。 4、int weight(Point a,Point b);计算两个点之间的距离,利用公式,计算出的结果是double类型的,将结果强制类型转换为int类型,并将其值返回。 5、void Musicplay(int mark); 利用mciSendString函数,mark用来控制背景音乐的播放与停止。mark=1,循环播放音乐。界面打开时后台启动。当主界面上点击音乐暂停图标mark=2,音乐暂停.。当主界面上点击音乐播放图标mark=3,音乐恢复播放。.6、void Windows(void);加载事先做好的主界面背景图。在上面输出文字信息。用GetMouseMsg();函数获取鼠标信息,设置鼠标响应区,当鼠标移动到响应区时,文字实现颜色的改变。当单击鼠标左键时,会进入到相应的函数里面,进行下一步操作。 7、void Viewmain(void);输出景点坐标及名称。设置景点活动区域,获取鼠标信息,当鼠标移动到相应的景点活动区域,就会加载相应的景点图片。 8、void Help(void); 有简单的操作说明。操作说明是以图片的形式加载进去的。图片是事先用PS 5 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 准备好的。 9、void About(void);有简单的作者信息及实验感想。背景是以图片的形式加载进去的。图片是事先用PS准备好的。里面还有一个网页链接,点击后会用Systen函数,打开该网页链接。 10、void Quit(void);关闭图形区域,退出导航。详细设计代码见附录。 3.2 系统测试 根据设计要求测试相关的功能,测试结果用相应的截图表示。 1、运行程序,进入系统主窗口界面,结果如图2所示。 图 2 2、选择主界面的“地图导航功”能,进入功能选区,结果如图3所示。华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 图 3 2.1、在“地图导航”功能界面选择“place”(地点查询)功能,查询地点A(南大门)。输入A,系统在地图上正确地显示地点A的位置。结果如图4,图5所示。 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 图 4 图 5 2.2、在“地图导航”功能界面选择“route”(路线查询)功能,查询A(南大门)到B(南一楼)之间的最佳路线和距离。输入AB,系统在地图上正确地显示AB之前的最佳路线和距离。结果如图6,图7所示。 图 6 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 图 7 2.3、在“地图导航”功能界面选择“repast”(食堂查询)功能,查询B(南一楼)附近最近的食堂。输入B,系统在地图上正确地显示B附近最近的食堂,并且给出了最佳路线和距离。结果如图8,图9所示。 图 8 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 图 9 2.4、在“地图导航”功能界面选择“market”(超市查询)功能,查询A(南大门)附近最近的超市。输入A,系统在地图上正确地显示A附近最近的超市,并且给出了最佳路线和距离。结果如图10,图11所示。华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 图 10 图 11 3、在系统主界面选择“进入地图”功能,将鼠标光标移动到地图的地点(机械大楼)上面,地图右下角显示该地点的具体信息。结果如图12所示。 图 12 11 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 4、在系统主界面选择进入“使用帮助”功能,系统显示该系统的使用说明。结果如图13所示。 图 13 5、在系统主界面选择进入“关于导航”功能,系统显示该系统的设计信息。结果如图14所示。华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 图 14 6、在系统主界面选择“退出导航”功能,点击“确定”即退出系统。结果如所示。总结与展望 图 1 54.1 全文总结 对自己的工作做个总结,主要工作总结如下: (1)分析设计题目、设计内容和设计要求,到图书馆和网上查阅相关资料,制定设计计划,为设计工作做准备。 (2)按照设计要求进行设计工作,设计合适的数据结构和算法,收集并处理相关的资料,编程实现。 (3)按照设计要求测试系统,调试程序BUG,优化、完善系统。(4)撰写课程设计报告。 4.1 工作展望 在今后的研究中,围绕着如下几个方面开展工作: (1)此次设计使用了弗洛伊德算法,没有设计出更高效的算法。所以应该 设计更合适的数据结构和更高效的算法,优化代码,提高系统的效率。华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 (2)设计的系统功能还是比较单一。所以应该完善和扩充系统功能,使系 统能为用户提供更多、更优质的服务。 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 体会 在该接触到本次《数据结构》的课程设计时,心里是没有底的,一开始就为了确定题目思考了很久,但是看到地图就有了很多想法,回想起在课程的学习中对图进行了深入地学习并且学习了诸多寻路算法,于是就选择了这个题目,我觉得我可以根据自己所学习的图的知识和算法设计出“华科地图导航”。 “华科地图导航”涉及到大量的图形信息与绘图信息,于是我开始寻找合适的开发的工具与语言进行编程设计。最开始在网上查询相关信息了解到QT是写图形界面的好工具,但是进行上手学习后发现QT函数库众多,而我不能正确熟悉地使用,于是考虑了很久就放弃了。后来了解到了C语言的图形库easyx,于是上网查询了相关的资料,对easyx有了大致的了解,上手很容易,只需根据其图形函数与绘图函数进行编程设计,课设就正式进入了设计、编写、测试,然后顺利完成课设。 感谢帮助过我同学和老师,也感谢我自己。 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 参考文献 [1] 严蔚敏,吴伟民.数据结构(C语言版).北京: 清华大学出版社,1997 [2] 严蔚敏,吴伟民,米宁.数据结构题集(C语言版).北京: 清华大学出版社,1999 [3] 曹计昌,卢萍,李开.C语言与程序设计.北京: 电子工业出版社,2013 [4] 王晓东.计算机算法设计与分析.北京: 电子工业出版社, 2007 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 附录 1.TourGuide.h #include #define MAX_VEX_NUM 100 //最大地点个数 #define N 22 //当前地点个数 #define All 60 //地点和路口总数 #define MAX_ROAD 10000 //相当于两地点间断开 int shortest[MAX_VEX_NUM][MAX_VEX_NUM]; //全局变量存贮最小路径 int path[MAX_VEX_NUM][MAX_VEX_NUM]; //存贮路径 int pos[][2]={ //地点坐标及路口坐标 //地点坐标 {208,430},{209,387},{50,404} ,{105,355}, {110,300},{170,300},{167,234},{230,150}, {310,235},{310,320},{390,320},{615,155},{430,320},{430,150},{417,320},{368,307},{406,320},{472,160},{5,185} ,{339,293},{65,452} ,{109,439}, //路口坐标 {369,317},{46,379} ,{110,387},{368,293}, {168,386},{262,384},{112,320},{170,320}, {262,320},{309,292},{309,282},{110,284}, {170,284},{230,250},{309,250},{170,250}, {230,220},{307,220},{370,150},{2,219} , {108,188},{33,337} ,{109,250},{109,218}, {309,150},{108,150},{167,218},{427,250}, {368,218},{368,250},{166,150},{166,188}, {230,188},{309,188},{368,188},{230,282}, {230,320},{168,350} };char Num[]={ //地点编号 'A','B','C','D', 'E','F','G','H', 'I','J','K','L','M','N','O','P','Q','R','S','T','U','V' };char Name[][20]={ //地点名称 “南大门”,“南一楼”,“西十二楼”,“西五楼”, “青年园”,“图书馆”,“科技楼”,“喻园餐厅”, 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 “机械学院”,“名人园”,“中心操场”,“东九楼”, “沁苑”,“喻园教工超市”,“东教工超市”, “东一食堂”,“紫荆园餐厅”,“清真食堂”, “百景园”,“东五楼”,“南三门”,“南二门” };typedef struct { int x;int y;}Point;typedef struct { Point point;char name[20];char num;}Vexs;struct MGraph { Vexs vexs[MAX_VEX_NUM]; //顶点向量 int arcs[MAX_VEX_NUM][MAX_VEX_NUM];//邻接矩阵 int vexnum,arcnum; //顶点数,边数 };MGraph G[100],G0,G1; //声明无向图的邻接矩阵类型 int Gi;IMAGE map,map1; //图片信息的加载 IMAGE loading;IMAGE about;IMAGE help;IMAGE background;IMAGE Aa,Bb,Cc,Dd,Ee,Ff,Gg,Hh,Ii,Jj,Kk,Ll,Mm,Nn,Oo,Pp,Qq,Rr,Ss,Tt,Uu,Vv,a1,a2,b1,b2,c1,c2,d1,d2;void LoadData(void); //加载信息 int CreateUDG1(MGraph &G1);//初始化所有景点信息 int weight(Point a,Point b);//计算两点之间的距离 void Windows(void); //主窗口界面 void Musicplay(int mark);//播放音乐 void Showplace(void); //查找地点位置 void Showpoint(int i);void Shortest(void); //两点之间的最短路径 void Showline(int i,int j);//显示输入框 void Showline1(int i,int j);//显示输入框 void Showline2(int i,int j);//显示输入框 void Floyd(void); //佛洛依德算法,算出每两点间的最短路径矩阵 void Linemin(int i,int j); //画最短路径 void Findrepast(void); //查找附近的食堂 void Findmarket(void); //查找附近的超市 void Entermap(void); //进入地图操作界面 void Viewmain(void); //浏览地点信息 void HelP(void); //操作说明 void About(void); //作者相关信息 void Quit(void); //退出系统 2.TourGuide.cpp 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 #include“head.h” int main(){ initgraph(640,480);HWND hwnd = GetHWnd(); // 设置窗口标题文字 SetWindowText(hwnd, “华科地图导航”);LoadData();CreateUDG1(G1);Musicplay(1);Windows();return 0;} /*功能:对输入的两个点计算它们之间的距离,并将其返回到调用的函数中*/ int weight(Point a,Point b){ double x;int y;x=pow((a.x-b.x),2)+pow((a.y-b.y),2);x=sqrt(x);y=int(x);return y;} /*功能:加载程序运行必须的图片及函数相关信息*/ void LoadData(void){ int i,j;loadimage(&loading,“./picture/loading.jpg”);loadimage(&about,“./picture/about.jpg”);loadimage(&help,“./picture/help.jpg”);loadimage(&background,“./picture/background.jpg”);loadimage(&map,“./picture/map.jpg”);loadimage(&map1,“./picture/map1.jpg”);loadimage(&Aa,“./picture/place/A.jpg”);loadimage(&Bb,“./picture/place/B.jpg”);loadimage(&Cc,“./picture/place/C.jpg”);loadimage(&Dd,“./picture/place/D.jpg”);loadimage(&Ee,“./picture/place/E.jpg”);loadimage(&Ff,“./picture/place/F.jpg”);loadimage(&Gg,“./picture/place/G.jpg”);loadimage(&Hh,“./picture/place/H.jpg”);loadimage(&Ii,“./picture/place/I.jpg”);loadimage(&Jj,“./picture/place/J.jpg”);loadimage(&Kk,“./picture/place/K.jpg”);loadimage(&Ll,“./picture/place/L.jpg”);loadimage(&Mm,“./picture/place/M.jpg”);loadimage(&Nn,“./picture/place/N.jpg”);loadimage(&Oo,“./picture/place/O.jpg”);loadimage(&Pp,“./picture/place/P.jpg”);loadimage(&Qq,“./picture/place/Q.jpg”);loadimage(&Rr,“./picture/place/R.jpg”);loadimage(&Ss,“./picture/place/S.jpg”);loadimage(&Tt,“./picture/place/T.jpg”);loadimage(&Uu,“./picture/place/U.jpg”);loadimage(&Vv,“./picture/place/V.jpg”);loadimage(&a1,“./picture/menu/a1.jpg”);华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 loadimage(&a2,“./picture/menu/a2.jpg”);loadimage(&b1,“./picture/menu/b1.jpg”);loadimage(&b2,“./picture/menu/b2.jpg”);loadimage(&c1,“./picture/menu/c1.jpg”);loadimage(&c2,“./picture/menu/c2.jpg”);loadimage(&d1,“./picture/menu/d1.jpg”);loadimage(&d2,“./picture/menu/d2.jpg”);for(i=1;i<=All;i++){ for(j=1;j<=All;j++) { G0.arcs[i][j]=MAX_ROAD; } } for(i=1;i<=All;i++) { shortest[i][i]=0; } for(i=0;i G0.vexs[i+1].point.x=pos[i][0]; G0.vexs[i+1].point.y=pos[i][1]; } //初始化连通路径 G0.arcs[1][2]=G0.arcs[2][1]=weight(G0.vexs[1].point,G0.vexs[2].point);G0.arcs[1][22]=G0.arcs[22][1]=weight(G0.vexs[22].point,G0.vexs[1].point);G0.arcs[1][27]=G0.arcs[27][1]=weight(G0.vexs[27].point,G0.vexs[1].point); G0.arcs[1][28]=G0.arcs[28][1]=weight(G0.vexs[28].point,G0.vexs[1].point); G0.arcs[2][27]=G0.arcs[27][2]=weight(G0.vexs[27].point,G0.vexs[2].point); G0.arcs[2][28]=G0.arcs[28][2]=weight(G0.vexs[28].point,G0.vexs[2].point); G0.arcs[3][21]=G0.arcs[21][3]=weight(G0.vexs[21].point,G0.vexs[3].point); G0.arcs[3][24]=G0.arcs[24][3]=weight(G0.vexs[24].point,G0.vexs[3].point);G0.arcs[4][24]=G0.arcs[24][4]=weight(G0.vexs[24].point,G0.vexs[4].point); G0.arcs[4][25]=G0.arcs[25][4]=weight(G0.vexs[25].point,G0.vexs[4].point);G0.arcs[4][29]=G0.arcs[29][4]=weight(G0.vexs[29].point,G0.vexs[4].point);G0.arcs[4][60]=G0.arcs[60][4]=weight(G0.vexs[60].point,G0.vexs[4].point); G0.arcs[5][29]=G0.arcs[29][5]=weight(G0.vexs[29].point,G0.vexs[5].point);G0.arcs[5][34]=G0.arcs[34][5]=weight(G0.vexs[34].point,G0.vexs[5].point);G0.arcs[6][30]=G0.arcs[30][6]=weight(G0.vexs[6].point,G0.vexs[30].point);G0.arcs[6][35]=G0.arcs[35][6]=weight(G0.vexs[6].point,G0.vexs[35].point); G0.arcs[7][49]=G0.arcs[49][7]=weight(G0.vexs[7].point,G0.vexs[49].point);G0.arcs[7][38]=G0.arcs[38][7]=weight(G0.vexs[7].point,G0.vexs[38].point);G0.arcs[8][47]=G0.arcs[47][8]=weight(G0.vexs[8].point,G0.vexs[47].point);G0.arcs[8][53]=G0.arcs[53][8]=weight(G0.vexs[53].point,G0.vexs[8].point);G0.arcs[8][55]=G0.arcs[55][8]=weight(G0.vexs[55].point,G0.vexs[8].point);G0.arcs[9][37]=G0.arcs[37][9]=weight(G0.vexs[9].point,G0.vexs[37].point);G0.arcs[9][40]=G0.arcs[40][9]=weight(G0.vexs[9].point,G0.vexs[40].point);G0.arcs[10][31]=G0.arcs[31][10]=weight(G0.vexs[10].point,G0.vexs[31].point);G0.arcs[10][23]=G0.arcs[23][10]=weight(G0.vexs[10].point,G0.vexs[23].point);G0.arcs[10][32]=G0.arcs[32][10]=weight(G0.vexs[10].point,G0.vexs[32].point); G0.arcs[11][17]=G0.arcs[17][11]=weight(G0.vexs[11].point,G0.vexs[17].point); G0.arcs[11][23]=G0.arcs[23][11]=weight(G0.vexs[11].point,G0.vexs[23].point); G0.arcs[12][18]=G0.arcs[18][12]=weight(G0.vexs[12].point,G0.vexs[18].point); G0.arcs[13][50]=G0.arcs[50][13]=weight(G0.vexs[13].point,G0.vexs[50].point);G0.arcs[13][15]=G0.arcs[15][13]=weight(G0.vexs[13].point,G0.vexs[15].point); G0.arcs[14][18]=G0.arcs[18][14]=weight(G0.vexs[14].point,G0.vexs[18].point); G0.arcs[14][41]=G0.arcs[41][14]=weight(G0.vexs[14].point,G0.vexs[41].point);华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 G0.arcs[14][50]=G0.arcs[50][14]=weight(G0.vexs[14].point,G0.vexs[50].point); G0.arcs[15][17]=G0.arcs[17][15]=weight(G0.vexs[15].point,G0.vexs[17].point); G0.arcs[16][23]=G0.arcs[23][16]=weight(G0.vexs[16].point,G0.vexs[23].point); G0.arcs[16][26]=G0.arcs[26][16]=weight(G0.vexs[16].point,G0.vexs[26].point); G0.arcs[19][42]=G0.arcs[42][19]=weight(G0.vexs[19].point,G0.vexs[42].point); G0.arcs[19][43]=G0.arcs[43][19]=weight(G0.vexs[19].point,G0.vexs[43].point); G0.arcs[20][26]=G0.arcs[26][20]=weight(G0.vexs[20].point,G0.vexs[26].point); G0.arcs[20][32]=G0.arcs[32][20]=weight(G0.vexs[20].point,G0.vexs[32].point); G0.arcs[21][22]=G0.arcs[22][21]=weight(G0.vexs[22].point,G0.vexs[21].point); G0.arcs[22][25]=G0.arcs[25][22]=weight(G0.vexs[22].point,G0.vexs[25].point); G0.arcs[24][44]=G0.arcs[44][24]=weight(G0.vexs[24].point,G0.vexs[44].point); G0.arcs[25][27]=G0.arcs[27][25]=weight(G0.vexs[25].point,G0.vexs[27].point); G0.arcs[26][52]=G0.arcs[52][26]=weight(G0.vexs[26].point,G0.vexs[52].point); G0.arcs[27][60]=G0.arcs[60][27]=weight(G0.vexs[27].point,G0.vexs[60].point); G0.arcs[28][31]=G0.arcs[31][28]=weight(G0.vexs[28].point,G0.vexs[31].point); G0.arcs[29][30]=G0.arcs[30][29]=weight(G0.vexs[29].point,G0.vexs[30].point); G0.arcs[29][44]=G0.arcs[44][29]=weight(G0.vexs[29].point,G0.vexs[44].point); G0.arcs[30][59]=G0.arcs[59][30]=weight(G0.vexs[30].point,G0.vexs[59].point);G0.arcs[30][60]=G0.arcs[60][30]=weight(G0.vexs[30].point,G0.vexs[60].point); G0.arcs[31][59]=G0.arcs[59][31]=weight(G0.vexs[31].point,G0.vexs[59].point); G0.arcs[32][33]=G0.arcs[33][32]=weight(G0.vexs[32].point,G0.vexs[33].point); G0.arcs[33][37]=G0.arcs[37][33]=weight(G0.vexs[33].point,G0.vexs[37].point); G0.arcs[33][58]=G0.arcs[58][33]=weight(G0.vexs[33].point,G0.vexs[58].point); G0.arcs[34][35]=G0.arcs[35][34]=weight(G0.vexs[34].point,G0.vexs[35].point); G0.arcs[34][45]=G0.arcs[45][34]=weight(G0.vexs[34].point,G0.vexs[45].point); G0.arcs[35][38]=G0.arcs[38][35]=weight(G0.vexs[35].point,G0.vexs[38].point);G0.arcs[35][58]=G0.arcs[58][35]=weight(G0.vexs[35].point,G0.vexs[58].point); G0.arcs[36][37]=G0.arcs[37][36]=weight(G0.vexs[36].point,G0.vexs[37].point); G0.arcs[36][38]=G0.arcs[38][36]=weight(G0.vexs[36].point,G0.vexs[38].point); G0.arcs[36][39]=G0.arcs[39][36]=weight(G0.vexs[36].point,G0.vexs[39].point);G0.arcs[36][58]=G0.arcs[58][36]=weight(G0.vexs[36].point,G0.vexs[58].point); G0.arcs[37][52]=G0.arcs[52][37]=weight(G0.vexs[37].point,G0.vexs[52].point);G0.arcs[38][45]=G0.arcs[45][38]=weight(G0.vexs[45].point,G0.vexs[38].point);G0.arcs[39][49]=G0.arcs[49][39]=weight(G0.vexs[39].point,G0.vexs[49].point); G0.arcs[39][55]=G0.arcs[55][39]=weight(G0.vexs[39].point,G0.vexs[55].point);G0.arcs[39][40]=G0.arcs[40][39]=weight(G0.vexs[39].point,G0.vexs[40].point); G0.arcs[40][56]=G0.arcs[56][40]=weight(G0.vexs[40].point,G0.vexs[56].point); G0.arcs[40][51]=G0.arcs[51][40]=weight(G0.vexs[40].point,G0.vexs[51].point); G0.arcs[41][47]=G0.arcs[47][41]=weight(G0.vexs[41].point,G0.vexs[47].point);G0.arcs[41][57]=G0.arcs[57][41]=weight(G0.vexs[41].point,G0.vexs[57].point);G0.arcs[42][44]=G0.arcs[44][42]=weight(G0.vexs[42].point,G0.vexs[44].point);G0.arcs[42][46]=G0.arcs[46][42]=weight(G0.vexs[42].point,G0.vexs[46].point);G0.arcs[43][46]=G0.arcs[46][43]=weight(G0.vexs[43].point,G0.vexs[46].point); G0.arcs[43][48]=G0.arcs[48][43]=weight(G0.vexs[43].point,G0.vexs[48].point);G0.arcs[43][54]=G0.arcs[54][43]=weight(G0.vexs[43].point,G0.vexs[54].point);G0.arcs[45][46]=G0.arcs[46][45]=weight(G0.vexs[45].point,G0.vexs[46].point); G0.arcs[46][49]=G0.arcs[49][46]=weight(G0.vexs[46].point,G0.vexs[49].point);G0.arcs[47][56]=G0.arcs[56][47]=weight(G0.vexs[47].point,G0.vexs[56].point);G0.arcs[48][53]=G0.arcs[53][48]=weight(G0.vexs[48].point,G0.vexs[53].point);G0.arcs[49][54]=G0.arcs[54][49]=weight(G0.vexs[49].point,G0.vexs[54].point); G0.arcs[50][52]=G0.arcs[52][50]=weight(G0.vexs[50].point,G0.vexs[52].point);G0.arcs[51][52]=G0.arcs[52][51]=weight(G0.vexs[51].point,G0.vexs[52].point);G0.arcs[51][57]=G0.arcs[57][51]=weight(G0.vexs[51].point,G0.vexs[57].point); G0.arcs[53][54]=G0.arcs[54][53]=weight(G0.vexs[53].point,G0.vexs[54].point);G0.arcs[54][55]=G0.arcs[55][54]=weight(G0.vexs[54].point,G0.vexs[55].point);G0.arcs[55][56]=G0.arcs[56][55]=weight(G0.vexs[55].point,G0.vexs[56].point);G0.arcs[56][57]=G0.arcs[57][56]=weight(G0.vexs[56].point,G0.vexs[57].point);华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 G0.arcs[58][59]=G0.arcs[59][58]=weight(G0.vexs[58].point,G0.vexs[59].point Floyd();} /*功能:佛洛依德算法,将每对景点之间的最短路径距离算出并存储最短路径到path中 */ void Floyd() { int i,j,k; for(i=1;i<=All;i++) { for(j=1;j<=All;j++) { shortest[i][j]=G0.arcs[i][j]; path[i][j]=j; } } /*初始化数组*/ for(k=1;k<=All;k++) { for(i=1;i<=All;i++) { for(j=1;j<=All;j++) { if(shortest[i][j]>(shortest[i][k]+shortest[k][j])) { shortest[i][j]=shortest[i][k]+shortest[k][j]; path[i][j]=k; path[j][i]=k; /*记录经过的路径*/ } } } } } /*功能:初始化由所有景点构成的无向完全图G1,并加载必要信息*/ int CreateUDG1(MGraph &G1){ int p,q;Gi=0;G1.vexnum=22; for(q=0;q G1.vexs[q].point.x=pos[q][0]; G1.vexs[q].point.y=pos[q][1]; strcpy(G1.vexs[q].name,Name[q]); G1.vexs[q].num=Num[q];} for(q=0;q { for(p=q;p G1.arcs[q][p]=G1.arcs[p][q]=weight(G1.vexs[p].point,G1.vexs[q].point);} return 1;} /*把音乐以资源形式嵌入exe并播放,mark用来控制音乐的播放与暂停*/ void Musicplay(int mark){ mciSendString(“open./music/1024.mp3 alias music”,NULL,0,NULL);华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 if(mark==1) mciSendString(_T(“play music repeat”),NULL,0,NULL);if(mark==2) mciSendString(_T(“pause music”),NULL,0,NULL);if(mark==3) mciSendString(_T(“resume music”),NULL,0,NULL);} /*功能:显示主窗口界面,进入功能选择区*/ void Windows(void){ cleardevice();int posx[]={265,265,265,265,265,31,62};int posy[]={180,220,260,300,340,449,449};putimage(0,0,&loading);settextstyle(25, 0, _T(“隶书”));setbkmode(TRANSPARENT);settextcolor(WHITE);outtextxy(posx[0],posy[0], _T(“地图导航”));outtextxy(posx[1],posy[1], _T(“进入地图”));outtextxy(posx[2],posy[2], _T(“使用帮助”));outtextxy(posx[3],posy[3], _T(“关于导航”));outtextxy(posx[4],posy[4], _T(“退出导航”));MOUSEMSG m;while(true){ m=GetMouseMsg(); if(m.uMsg==WM_MOUSEMOVE) { if(m.x>posx[0]&&m.x posy[0]&&m.y settextcolor(BLACK); else settextcolor(WHITE); outtextxy(posx[0],posy[0], _T(“地图导航”)); if(m.x>posx[1]&&m.x posy[1]&&m.y settextcolor(BLACK); else settextcolor(WHITE); outtextxy(posx[1],posy[1], _T(“进入地图”)); if(m.x>posx[2]&&m.x posy[2]&&m.y settextcolor(BLACK); else settextcolor(WHITE); outtextxy(posx[2],posy[2], _T(“使用帮助”)); if(m.x>posx[3]&&m.x posy[3]&&m.y settextcolor(BLACK); else settextcolor(WHITE); outtextxy(posx[3],posy[3], _T(“关于导航”)); if(m.x>posx[4]&&m.x posy[4]&&m.y settextcolor(BLACK); else settextcolor(WHITE); outtextxy(posx[4],posy[4], _T(“退出导航”)); } if(m.uMsg==WM_LBUTTONUP) { 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 if(m.x>posx[0]&&m.x posy[0]&&m.y Entermap(); if(m.x>posx[1]&&m.x posy[1]&&m.y Viewmain(); if(m.x>posx[2]&&m.x posy[2]&&m.y HelP(); if(m.x>posx[3]&&m.x posy[3]&&m.y About(); if(m.x>posx[4]&&m.x posy[4]&&m.y Quit(); if(m.x>posx[5]&&m.x posy[5]&&m.y Musicplay(3); if(m.x>posx[6]&&m.x posy[6]&&m.y Musicplay(2); } } cleardevice();return;} /*功能:进入地图操作界面,可选功能项有最短路径查询和最佳路线问题*/ void Entermap(){ int posx[]={215,325,215,325,0};int posy[]={135,135,245,245,0};putimage(0,0,&background);MOUSEMSG m;while(true){ m=GetMouseMsg(); if(m.uMsg==WM_MOUSEMOVE) { if(m.x>posx[0]&&m.x posy[0]&&m.y putimage(215,135,&c2); else putimage(215,135,&c1); if(m.x>posx[1]&&m.x posy[1]&&m.y putimage(325,135,&d2); else putimage(325,135,&d1); if(m.x>posx[2]&&m.x posy[2]&&m.y putimage(215,245,&a2); else putimage(215,245,&a1); if(m.x>posx[3]&&m.x posy[3]&&m.y putimage(325,245,&b2); else putimage(325,245,&b1); } if(m.uMsg==WM_LBUTTONUP) { if(m.x>posx[0]&&m.x posy[0]&&m.y Showplace(); if(m.x>posx[1]&&m.x posy[1]&&m.y Shortest(); if(m.x>posx[2]&&m.x posy[2]&&m.y Findrepast(); if(m.x>posx[3]&&m.x posy[3]&&m.y 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 Findmarket(); if(m.x>posx[4]&&m.x posy[4]&&m.y Windows(); } } } /*功能:弹出地点查询框,作为输入信息用*/ void Showplace(void){ char s[10];int choose;HWND wnd = GetHWnd();M: if(InputBox(s, 10, “查找地点,如:我的选择是:AnA南大门 B南一楼 C西十二楼 D西五楼nE青年园 F图书馆 G科技楼 H喻园餐厅nI机械学院 J名人园 K中心操场 L东九楼nM沁苑 N喻园教工超市 O东教工超市nP东一食堂 Q紫荆园餐厅 R清真食堂nS百景园 T东五楼 U南三门 V南二门”,“输入地点编号”,NULL,300,90,false)==true){ choose=s[0]-'A'+1; if(0 Showpoint(choose); else if(MessageBox(wnd, _T(“选择出现在A-V,请重新输入”), _T(“提醒”),MB_OK | MB_ICONWARNING)== IDOK) goto M; } else Entermap();} void Showpoint(int i){ HWND wnd = GetHWnd();char s[][100] = {“你现在查询的是 : ”,“ 【红色为查询地点所在位置】”};char message[100];int a=i;strcpy(message,s[0]);putimage(0,0,&map1);strcat(message,G1.vexs[a-1].name);strcat(message,s[1]);setfillcolor(0x001eff);fillcircle(G1.vexs[a-1].point.x,G1.vexs[a-1].point.y,7); if(MessageBox(wnd, _T(message), _T(“提醒”),MB_OK | MB_ICONQUESTION)== IDOK)Sleep(1000);if(MessageBox(wnd, _T(“你要继续查询吗?n是 : 返回查询界面n否 : 进入地图界面”), _T(“提醒”),MB_YESNO | MB_ICONQUESTION)== IDNO) Viewmain();else Entermap();} /*功能:弹出最短路径查询框,作为输入信息用*/ void Shortest(void){ char s[10];int choose1,choose2;HWND wnd = GetHWnd();华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 M: if(InputBox(s, 10, “查询线路,如:我的选择是:ABnA南大门 B南一楼 C西十二楼 D西五楼nE青年园 F图书馆 G科技楼 H喻园餐厅nI机械学院 J名人园 K中心操场 L东九楼nM沁苑 N喻园教工超市 O东教工超市nP东一食堂 Q紫荆园餐厅 R清真食堂nS百景园 T东五楼 U南三门 V南二门”,“输入两地点编号”,NULL,300,90,false)==true){ choose1=s[0]-'A'+1; choose2=s[1]-'A'+1; if(0 Showline(choose1,choose2); else if(MessageBox(wnd, _T(“选择出现在A-V,请重新输入”), _T(“提醒”),MB_OK | MB_ICONWARNING)== IDOK) goto M; } else Entermap();} /*功能:弹出食堂查询框,作为输入信息用*/ void Findrepast(void){ char s[10];int choose1,choose2;HWND wnd = GetHWnd();M: if(InputBox(s, 10, “查找地点附近食堂,如:我的选择是:AnA南大门 B南一楼 C西十二楼 D西五楼nE青年园 F图书馆 G科技楼 H喻园餐厅nI机械学院 J名人园 K中心操场 L东九楼nM沁苑 N喻园教工超市 O东教工超市nP东一食堂 Q紫荆园餐厅 R清真食堂nS百景园 T东五楼 U南三门 V南二门”,“输入编号”,NULL,300,90,false)==true){ choose1=s[0]-'A'+1; if(0 { if(choose1==6||choose1==7||choose1==8){ choose2=8; Showline1(choose1,choose2);} else if(choose1==1||choose1==2||choose1==9||choose1==10||choose1==16||choose1==20){ choose2=16; Showline1(choose1,choose2);} else if(choose1==11||choose1==13||choose1==15||choose1==17){ choose2=17; Showline1(choose1,choose2);} else if(choose1==12||choose1==14||choose1==18){ choose2=18; Showline1(choose1,choose2);} else{ choose2=19; Showline1(choose1,choose2);} } else if(MessageBox(wnd, _T(“选择出现在A-V,W-X,请重新输入”), _T(“提醒”),MB_OK | MB_ICONWARNING)== IDOK) goto M; } else Entermap();华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 } /*功能:弹出食堂超市查询框,作为输入信息用*/ void Findmarket(void){ char s[10];int choose1,choose2;HWND wnd = GetHWnd();M: if(InputBox(s, 10, “查找地点附近超市,如:我的选择是:AnA南大门 B南一楼 C西十二楼 D西五楼nE青年园 F图书馆 G科技楼 H喻园餐厅nI机械学院 J名人园 K中心操场 L东九楼nM沁苑 N喻园教工超市 O东教工超市nP东一食堂 Q紫荆园餐厅 R清真食堂nS百景园 T东五楼 U南三门 V南二门”,“输入编号”,NULL,300,90,false)==true){ choose1=s[0]-'A'+1; if(0 { if(choose1==8||choose1==12||choose1==14||choose1==18||choose1==19){ choose2=14; Showline2(choose1,choose2);} else{ choose2=15; Showline2(choose1,choose2);} } else if(MessageBox(wnd, _T(“选择出现在A-V,W-X,请重新输入”), _T(“提醒”),MB_OK | MB_ICONWARNING)== IDOK) goto M; } else Entermap();} /*功能:输出最短路径线路图及最短距离*/ void Showline(int i,int j){ HWND wnd = GetHWnd();char s[][100] = {“你现在查询的是 : ”,“→”,“的最短距离nn”,“最短距离为:”,“米 【蓝色为起点,红色为终点】”};char message[100];char string[10];int a,b;a=i;b=j;strcpy(message,s[0]);putimage(0,0,&map1);strcat(message,G1.vexs[a-1].name);strcat(message,s[1]);strcat(message,G1.vexs[b-1].name);strcat(message,s[2]);strcat(message,s[3]);Linemin(a,b);itoa(shortest[a][b]*3.68,string,10);strcat(message,string);strcat(message,s[4]);setfillcolor(BLUE);fillcircle(G1.vexs[a-1].point.x,G1.vexs[a-1].point.y,7);setfillcolor(0x001eff);fillcircle(G1.vexs[b-1].point.x,G1.vexs[b-1].point.y,7);if(MessageBox(wnd, _T(message), _T(“提醒”), 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 MB_OK | MB_ICONQUESTION)== IDOK)Sleep(1000);if(MessageBox(wnd, _T(“你要继续查询吗?n是 : 返回查询界面n否 : 进入地图界面”), _T(“提醒”),MB_YESNO | MB_ICONQUESTION)== IDNO) Viewmain();else Entermap();} /*功能:输出食堂最短路径线路图及最短距离*/ void Showline1(int i,int j){ HWND wnd = GetHWnd();char s[][100] = {“你现在查询的是 : ”,“ 附近最近的食堂 ”,“ 其路径如图nn”,“最短距离为:”,“米 【蓝色为起点,红色为终点】”};char message[100];char string[10];int a,b;a=i;b=j;strcpy(message,s[0]);putimage(0,0,&map1);strcat(message,G1.vexs[a-1].name);strcat(message,s[1]);strcat(message,G1.vexs[b-1].name);strcat(message,s[2]);strcat(message,s[3]);Linemin(a,b);itoa(shortest[a][b]*3.68,string,10);strcat(message,string);strcat(message,s[4]);setfillcolor(BLUE);fillcircle(G1.vexs[a-1].point.x,G1.vexs[a-1].point.y,7);setfillcolor(0x001eff);fillcircle(G1.vexs[b-1].point.x,G1.vexs[b-1].point.y,7);if(MessageBox(wnd, _T(message), _T(“提醒”),MB_OK | MB_ICONQUESTION)== IDOK)Sleep(1000);if(MessageBox(wnd, _T(“你要继续查询吗?n是 : 返回查询界面n否 : 进入地图界面”), _T(“提醒”),MB_YESNO | MB_ICONQUESTION)== IDNO) Viewmain();else Entermap();} /*功能:输出食堂最短路径线路图及最短距离*/ void Showline2(int i,int j){ HWND wnd = GetHWnd();char s[][100] = {“你现在查询的是 : ”,“ 附近最近的超市 ”,“ 其路径如图nn”,“最短距离为:”,“米 【蓝色为起点,红色为终点】”};char message[100];char string[10];int a,b;a=i;b=j;strcpy(message,s[0]);putimage(0,0,&map1);华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 strcat(message,G1.vexs[a-1].name);strcat(message,s[1]);strcat(message,G1.vexs[b-1].name);strcat(message,s[2]);strcat(message,s[3]);Linemin(a,b);itoa(shortest[a][b]*3.68,string,10);strcat(message,string);strcat(message,s[4]);setfillcolor(BLUE);fillcircle(G1.vexs[a-1].point.x,G1.vexs[a-1].point.y,7);setfillcolor(0x001eff);fillcircle(G1.vexs[b-1].point.x,G1.vexs[b-1].point.y,7);if(MessageBox(wnd, _T(message), _T(“提醒”),MB_OK | MB_ICONQUESTION)== IDOK)Sleep(1000);if(MessageBox(wnd, _T(“你要继续查询吗?n是 : 返回查询界面n否 : 进入地图界面”), _T(“提醒”),MB_YESNO | MB_ICONQUESTION)== IDNO) Viewmain();else Entermap();} /*功能:绘制最短路径线路图*/ void Linemin(int i,int j){ setlinestyle(PS_DASH|PS_JOIN_ROUND,4);if(path[i][j]==i||path[i][j]==j) line(G0.vexs[i].point.x,G0.vexs[i].point.y,G0.vexs[j].point.x,G0.vexs[j].point.y);else{ Linemin(path[i][j],i); Linemin(path[i][j],j);} setlinestyle(PS_SOLID,1);} /*功能:地图地点相关信息的介绍*/ void Viewmain(){ IMAGE temp;int choose;putimage(0,0,&map);getimage(&temp,465,275,210,260);setfillcolor(0x001eff);settextstyle(20,0,“楷体”);settextcolor(BLACK);setbkmode(TRANSPARENT);for(choose=1;choose<=N;choose++){ fillcircle(pos[choose-1][0],pos[choose-1][1],7);} outtextxy(0,0,“返回”);outtextxy(80,0,“Tips:鼠标移动到相应的点范围即可查看对应地点信息”);MOUSEMSG m;while(true){ m=GetMouseMsg(); if(m.uMsg==WM_MOUSEMOVE)华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 { if(m.x>pos[0][0]-7&&m.x pos[0][1]-7&&m.y putimage(465,275,&Aa); else if(m.x>pos[1][0]-7&&m.x pos[1][1]-7&&m.y putimage(465,275,&Bb); else if(m.x>pos[2][0]-7&&m.x pos[2][1]-7&&m.y putimage(465,275,&Cc); else if(m.x>pos[3][0]-7&&m.x pos[3][1]-7&&m.y putimage(465,275,&Dd); else if(m.x>pos[4][0]-7&&m.x pos[4][1]-7&&m.y putimage(465,275,&Ee); else if(m.x>pos[5][0]-7&&m.x pos[5][1]-7&&m.y putimage(465,275,&Ff); else if(m.x>pos[6][0]-7&&m.x pos[6][1]-7&&m.y putimage(465,275,&Gg); else if(m.x>pos[7][0]-7&&m.x pos[7][1]-7&&m.y putimage(465,275,&Hh); else if(m.x>pos[8][0]-7&&m.x pos[8][1]-7&&m.y putimage(465,275,&Ii); else if(m.x>pos[9][0]-7&&m.x pos[9][1]-7&&m.y putimage(465,275,&Jj); else if(m.x>pos[10][0]-7&&m.x pos[10][1]-7&&m.y putimage(465,275,&Kk); else if(m.x>pos[11][0]-7&&m.x pos[11][1]-7&&m.y putimage(465,275,&Ll); else if(m.x>pos[12][0]-7&&m.x pos[12][1]-7&&m.y putimage(465,275,&Mm); else if(m.x>pos[13][0]-7&&m.x pos[13][1]-7&&m.y putimage(465,275,&Nn); else if(m.x>pos[14][0]-7&&m.x pos[14][1]-7&&m.y putimage(465,275,&Oo); else if(m.x>pos[15][0]-7&&m.x pos[15][1]-7&&m.y putimage(465,275,&Pp); else if(m.x>pos[16][0]-7&&m.x pos[16][1]-7&&m.y putimage(465,275,&Qq); else if(m.x>pos[17][0]-7&&m.x pos[17][1]-7&&m.y putimage(465,275,&Rr); else if(m.x>pos[18][0]-7&&m.x pos[18][1]-7&&m.y putimage(465,275,&Ss);华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 else if(m.x>pos[19][0]-7&&m.x pos[19][1]-7&&m.y putimage(465,275,&Tt); else if(m.x>pos[20][0]-7&&m.x pos[20][1]-7&&m.y putimage(465,275,&Uu); else if(m.x>pos[21][0]-7&&m.x pos[21][1]-7&&m.y putimage(465,275,&Vv); else putimage(465,275,&temp); } if(m.uMsg==WM_LBUTTONUP) { if(m.x>0&&m.x<40&&m.y>0&&m.y<20) { setbkmode(TRANSPARENT); Windows(); } } } } /*功能:进入帮助功能界面,显示操作说明*/ void HelP(void){ putimage(0,0,&help);MOUSEMSG m;while(true){ m=GetMouseMsg(); if(m.uMsg==WM_LBUTTONUP) if(m.x>0&&m.x<070&&m.y>0&&m.y<50) Windows();} } /*功能:显示作者相关信息*/ void About(void){ int posx[]={0,25};int posy[]={0,350};cleardevice();putimage(0,0,&about);MOUSEMSG m;while(true){ m=GetMouseMsg(); if(m.uMsg==WM_LBUTTONUP) if(m.x>posx[0]&&m.x posy[0]&&m.y Windows();} } /*退出系统,结束程序的运行*/ void Quit(void){ HWND wnd = GetHWnd();if(MessageBox(wnd, _T(“你确定要退出吗?”), _T(“提醒”),31 华 中 科 技 大 学 计 算 机 科 学 与 技 术 学 院 课 程 设 计 报 告 } { } MB_OKCANCEL | MB_ICONQUESTION)== IDOK)closegraph();exit(0); 《企业资源计划ERP》 课程设计 题目:关于企业实施ERP对人力资源管理影响的探究 班 级 信管 092 专 业 信息管理和信息系统 学 号 3090561053 姓 名 窦 婷 地 点 经济与管理学院实验室 指导老师 朱宗乾 设计日期 2012-6-24 — 2012-6-29 2012 年 春季 学期 目 录 研究背景、研究意义及研究目标„„„„„„„„„„„„„„„„„„ 3 1.1 设计背景„„„„„„„„„„„„„„„„„„„„„„„„„„„ 3 1.2 设计意义及目标„„„„„„„„„„„„„„„„„„„„„„„„ 3 2 设计内容„„„„„„„„„„„„„„„„„„„„„„„„„„„„ 4 2.1 实施ERP的风险识别„„„„„„„„„„„„„„„„„„„„„„ 4 2.2 人在ERP系统中居主导地位„„„„„„„„„„„„„„„„„„„ 4 2.2.1 ERP系统本质上是一个以人为主的动态开放系统„„„„„„„„„4 2.2.2在ERP实施和应用过程中需要大量的人力资源管理工作„„„„„„5 2.2.3 ERP对人力资源管理提出了更高的要求„„„„„„„„„„„„ 5 2.3人力资源模块设计„„„„„„„„„„„„„„„„„„„„„„„ 6 2.3.1 组织管理„„„„„„„„„„„„„„„„„„„„„„„„„6 2.3.2人事管理„„„„„„„„„„„„„„„„„„„„„„„„„„7 2.3.3 招聘管理„„„„„„„„„„„„„„„„„„„„„„„„„7 2.3.4 考勤管理„„„„„„„„„„„„„„„„„„„„„„„„„7 2.3.5 薪资核算„„„„„„„„„„„„„„„„„„„„„„„„„7 2.3.6 培训管理„„„„„„„„„„„„„„„„„„„„„„„„„7 2.3.7 员工管理„„„„„„„„„„„„„„„„„„„„„„„„„8 2.3.7.1制定职务模型„„„„„„„„„„„„„„„„„„„„„„8 2.3.7.2 进行人员成本分析„„„„„„„„„„„„„„„„„„„„8 2.3.7.3 绩效考核„„„„„„„„„„„„„„„„„„„„„„„„8 2.4 ERP成功实施的人力资源管理条件与对应措施 „„„„„„„„„„„8 2.4.1 企业有稳定的人力资源管理体系„„„„„„„„„„„„„„„ 8 2.4.2全体员工的关注和支持„„„„„„„„„„„„„„„„„„„ 9 2.4.3 坚持人本管理,重视心理契约„„„„„„„„„„„„„„„„ 9 2.4.4 注重长期规划„„„„„„„„„„„„„„„„„„„„„„„9 3 课程设计心得体会„„„„„„„„„„„„„„„„„„„„„„„„10 4 参考文献„„„„„„„„„„„„„„„„„„„„„„„„„„„„10 1、研究背景、意义及目标 1. 1、研究背景 企业实施ERP系统,意味着给会企业带来一场大规模的、深刻的变革。人力资源是企业的重要资源之一,同样的人力资源管理也是ERP系统中的一个重要组成部分。企业实施ERP,是指建立在信息技术基础上,以系统化的管理思想,为企业决策层及员工提供决策运行手段的管理平台。ERP系统集信息技术与先进的管理思想于一身,成为现代企业在信息时代生存、发展的基本运行模式。可以从管理思想、软件产品、管理系统三个层次给出它的定义:一是在MRPⅡ(Manufacturing Resources Planning)基础上进一步发展而成的面向供应链(Supply Chain)的管理思想;二是综合应用了客户机服务器体系、关系数据库结构、面向对象技术,图形用户界面,网络通讯等信息技术成果,以ERP管理思想为灵魂的软件产品;三是整合了企业管理理念、业务流程、人力物力、计算机硬件和软件于一体的企业资源管理系统。企业资源计划系统是企业进行管理创新提高管理水平,实现企业管理功能整体优化的重要途径。 以往ERP在企业管理中的发展进程,始终是以生产制造及销售过程为中心的。而作为企业资源:人、财、物之首要的人力资源,长期以来一直作为一个孤立的系统独立于企业核心管理系统之外。在竞争日益激烈的今天,如何吸引优秀人才、合理安排人力资源、降低人员成本、提高企业竞争力。已经成为企业管理者首先需要面对的一个问题。成功实施ERP可以使库存下降、停工待料减少、成本降低、生产能力提高,从而带来巨大经济效益,这使很多企业对ERP产生了浓厚兴趣。在知识经济时代,落后的信息技术意味着将被市场淘汰,企业要想长久地发展,必须实施ERP成为不争的事实。因此,如何将ERP与企业的内部条件和外部环境有机地结合起来,是ERP成功的首要因素,而其中人力资源问题首当其冲。 1.2研究意义及目标 企业实施ERP系统,可以实现管理方式的重大变革,进一步体现现代企业流程科学化、管理精细化、信息集成化的管理思想。它往往意味着,公司将不再需要原有数量的人员来完成工作,但是他们必须飞跃性地在技术上更加娴熟,了解更多的经营知识,必须搞清楚如何借助于新系统来完成手头上的工作任务,必须 3 要知道他们对ERP所做的一举一动会对企业中的其他部门产生什么影响,还必须去学习新型的分析方法及申报手段。总之,他们必须学会在一个完全不同的、更加复杂的环境中生存。任何改革都会面对来自雇员的抵抗,抵抗变化是人类的本性。这种抵抗可能是对新系统及其优势的忽视,对失业或对新技术的惧怕(对自身被淘汰的惧怕)等等。如果这些担心和焦虑不被合理地提前解决,肯定会给新系统的实施带来灾难。所以研究企业实施ERP对于人力资源的研究对于企业的生存及长远发展意义重大。 企业资源计划系统(ERP)以其巨大的潜在经济效益在国内外得到广泛的应用,人力资源管理系统功能的完善和发挥对ERP的成功起举足轻重的作用。研究企业实施ERP对人力资源管理的影响,就是要通过了解这些影响,提前作出应对措施,来避免因实施ERP而导致企业业绩下滑、组织机构涣散、发展状况变差等不良状况,从而帮助企业实现业绩增加、组织机构紧密有序、更好更快地发展。 2、研究内容 2.1 实施ERP的风险识别 企业人力资源风险管理始于风险识别。ERP系统是面向整个企业的,它需要所有部门和使用者的支持,而不仅仅是高层管理人员的认同和支持。因此,使各个部门都能认同ERP是系统协调员所面临的最困难的任务之一。ERP的实施需要许多人的通力合作——软件经销商、外部的顾问、内部的实施小组、终端操作人员以及公司的管理层。一个典型的实施小组的结构为:最顶端的是执行委员会(负责人是CIO或COO,或者是其他高层管理人员),而后依次是项目管理小组、技术支持小组和管理支持小组、工作组,最底端是普通员工。所以任何一个环节出现问题,ERP 的实施都会受到影响。所以针对人力资源管理来说,必须把整个ERP实施过程所涉及的所有人员都协调好,使之各司其职,ERP的成功实施才有保障。 2.2 人在ERP系统中居主导地位 2.2.1 ERP系统本质上是一个以人为主的动态开放系统 ERP系统是一个以人为主的人机系统,人在系统中发挥决策主导的作用。人是ERP系统的输入端,是ERP系统要管理的重要资源,同时人又是其它企业资源 4 的运筹整合与使用者。ERP是一种处理逻辑、一种方法论、一种管理哲学,它为企业管理人员提供了一套科学有效的管理工具,只有人们真正地理解了ERP的思想和逻辑,只有最终用户面对企业实际生产中的问题,加强相应的采购管理、库存管理、财务管理、生产管理、人力资源管理、销售管理等才能使ERP创造出明显的效益,使企业更快地收回投入ERP系统的资金,产生更大的效益和更长远的发展。ERP系统同时也是一个动态的系统,首先系统赖以运行的数据是动态的,作为系统重要组成部分的人一一管理人员和操作人员,也是动态的。管理人员和操作人员的创造性和规范性将决定系统的运行效果。再者ERP系统更是一个开放的系统,系统必须适应企业并促使企业适应外部环境,反过来外部环境是不断变化的,企业要适应变化,作为企业资源计划系统的ERP也必须变化,它不但不能成为束缚企业的因素,而且要能够敏捷地使企业变化,促使企业更快更长远地发展。因此ERP不但对软件系统有较高要求,而且要求管理人员和操作人员要不断进取,快速适应企业的不断变革和新旧系统的切换,推动系统应用不断向前发展,从而推动企业不断发展。 2.2.2在ERP实施和应用过程中需要大量的人力资源管理工作 实施ERP必须和企业业务流程重组(BPR)结合起来,没有BPR实施ERP只是换汤不换药,只是将原有的手工系统换成了一个相对快速的计算机系统,远远达不到企业实施ERP的目的。在BPR过程中要对企业的整个业务流程进行全面的审视,根据公司战略,重组业务流程,然后在此基础上进行组织结构的调整、人力资源结构的调整,进而是岗位职责的划分,最后是工作分析与绩效考核。在这个过程中,需要耗费相当大的人力资源,而人力资源管理工作的成效将直接决定BPR与ERP的程度和效果,ERP系统的实施是一个管理项目而非仅仅是一个IT项目,员工适应新的工作流程和观念的转变都需要大量持久的教育和培训,需要耗费大量的人力物力以及财力,因此人力资源的管理在ERP的成功实施过程中占有举足轻重的作用。 2.2.3 ERP对人力资源管理提出了更高的要求 ERP项目是一个企业管理系统工程,努力提高企业全体员工的知识水平,充分调动和发挥人的主动性、积极性和创造性,积极营造人与企业一起成长、共同发展的良好环境是现代企业管理的新理论,也是企业生存与发展之本。应用ERP 5 要求企业加强以人为本的管理工作,建立相应的竞争机制、激励机制和约束机制,把应用ERP与制定企业经营发展战略和全体员工的业绩考核有机地结合起来,促使员工能感受外部压力,从而自觉地投入到ERP应用与心得工作机制中来。 人力资源管理的职能之一就是帮助业务人员提升解决问题的能力,高效、快速地对企业各个层次的员工进行管理。应用ERP要求企业通过各种形式,不同程度地使全体员工接受新思想、新方法和新机制、新系统的培训教育,以使他们适应系统变化,促使系统应用深入和组织架构的调整。为适应ERP系统带来的改变,企业必须在组织架构和部门职责上做出相应的调整,在改革中会涉及到部门职能的重新划分、岗位职责的调整、业务流程的改变、权力利益的重新分配等复杂问题,如果企业不能妥当地处理这些问题,将会使企业的处于不稳定的状态,这对于企业的张远发展是极其不利的。由于使用计算机系统的人员层次结构有了很大的变化,原来是管理人员重复劳动,现在管理人员把主要精力放到更具创造性的工作上来,这样就能为企业创造出更多的利润,员工自身也能受益,达到员工与企业共同发展的双赢局面。企业要进行新的工作分析,以此为根据调整人力资源目标,对企业员工制定相应的引进、提拔、培训等计划。 由于企业组织架构、业务流程和人力资源结构的调整,企业必须对业绩考评体系进行相应的调整,以适应新的岗位职责和业务要求。能否顺利地将原有的业绩考评体系转变到适应新系统的业绩考评体系是对人力资源管理部门的一个考验,也是企业实施ERP后人力资源管理成败的关键所在。2.3人力资源模块设计 目前ERP中的人力资源系统功能已经从单一的工资核算、人事管理发展到可以为企业的决策提供帮助的全方位解决方案。这些领域包括人力资源规划、员工考核、劳动力安排、时间管理、招聘管理、员工薪资核算、培训计划和差旅管理等。并同ERP中的财务、生产等子系统一起组成高效的、具有高度集成性的企业资源管理系统。 2.3.1 组织管理。该模块清晰的显示组织机构图,组织结构、职能、成立日期、工作范畴一目了然,便于管理。 2.3.2人事管理。该模块记录了公司所有员工的档案,便于领导对员工进行统筹管理,只有最高领导有权使用本功能。领导可以从不同角度对员工进行分类 6 查看,用其所长,避其所短,充分发挥每一位员工的聪明才智。从而达到最佳的用人效果。 2.3.3 招聘管理。人才是企业最重要的资源,拥有优秀的人才才能保证企业获得持久的竞争力。招聘系统一般从以下几方面提供支持:一是通过信息取舍,优化招聘过程,减少业务工作量;二是通过信息比对,对招聘成本进行归集、分析,从而降低招聘成本;三是为选择聘用人才的岗位提供辅助信息。并有效地帮助企业进行人力资源的挖掘。 2.3.4 考勤管理。一则能通过权限分配由最终用户进行考勤输入,由关键用户进行考勤校队及工资核算:二则与时间管理壹接集成,方便查看及管理。同时,根据所在国或当地的日历,灵活安排企业的运作时间以及员工的作息时间表。对员工加班、作业轮班、员工假期、以及员工作业顶替等作出一整套周密的编排。2.3.5 薪资核算。一则能根据公司跨地区、跨部门、跨工种的不同薪资结构及处理流程制定与之相适应的薪资核算方法:二则与时间管理壹接集成,能够及时更新,对员工的薪资核算动态化;三则通过和其他块的集成.自动根据要求调整薪资结构及数据,履行“回算功能”。当薪资核算过程结束之后.员工的有关上一薪核算期的主数据发生变化,在下一薪核算期内,回算功能会自动触发,进行修正。工作管理。运用远端考勤系统,可以将员工的实际出勤状况记录到主系统中。并把与员工薪资、奖金有关的数据导入薪资系统和成本核算中。 2.3.6培训管理。从员工技术现状到培训计划、实施、评审、完成形成一整套完整的管理体系。实现培训管理程序化、科学化、数字化。根据担任该职位员工的资格和条件,系统会提出针对本员工的一系列相应培训设计方案,如遇机构改组或职位变迁,系统会及时提出对应的一系列的培训变动。 2.3.7员工管理。 2.3.7.1制定职务模型。包括职位要求、升迁路径和培训计划,根据担任该职位员工的资格和条件,系统会提出针对本员工的一系列相应培训设计方案,如遇机构改组或职位变迁,系统会及时提出对应的一系列的职位变动或升迁建议。 2.3.7.2 进行人员成本分析。可以对过去、现在、将来的人员成本做出细节性分析及总评性分析,在此基础上。对相应的成本做出数据化升降趋势预测。并 7 通过ERP集成环境,为企业成本分析提供依据。对于企业人员、组织结构编制的多种方案.进行模拟比较和运用分析,并辅之以图形的直观评估,辅助管理层做出最终决策。 2.3.7.3绩效考核。为激发员工工作积极性、保留优秀的员工而建立的考核机制,为高效员工创建晋升机会,恰当的薪酬激励可以让员工个尽心尽力地工作,提高工作效率、不断创新。.4 ERP成功实施的人力资源管理条件与对应措施 人力资源管理信息化是ERP实施后企业人力资源管理的主要方式,该过程以先进的电子信息技术为手段,以软件系统为平台实现低成本、高效率、全员共同参与管理过程。实现人力资源战略地位的全面、开放的人力资源管理新模式。人力资源信息化作为知识经济时代的产物。在以ERP技术为平台基础上,它的需要企业具备以下几个条件: 2.4.1 企业有稳定的人力资源管理体系。企业需要有扎实稳定的管理体系,保证各项命令都能认真贯彻执行,只有这样才能让每位员工在企业里安心工作并因才使用。促进企业不断成长。在这样的前提下可以考虑更进一步的信息化。2.2 企业人力资源管理人员应具备相当的业务水准与操作技能。既要有人力资源开发与管理的专业知识和实务经验,又同时具备ERP系统的操作技能,即复合型人才。人力资源信息化要求管理人员遵循一定的规范。如实做好对工作步骤和流程的记录工作。 2.4.2全体员工的关注和支持。人力资源管理信息化不只是人力资源部门的事情.需要生产、研发、财务等部门的协助和配合。作为企业领导者.要以发展的眼光看到它能给企业未来壮大集聚的巨大效益,积极给于支持.加大资金投入.配备合适人员。对于企业其他员工。也要充分认识到信息化给自己带来的实惠。通力配合人力资源部门信息化改革。人力资源管理软件的导入及运用无疑给企业带来了前所未有的便利与效率,但是管理毕竟是出自实践的,如何将软件和企业自身管理调度之特点尤其是自身人力资源管理结构及流程恰当结合起来。最大限度地发挥其功能,这才是解决问题的重心所在。 2.4.3 坚持人本管理,重视心理契约。“以人为本”的管理思想不仅仅是传统管理所需的,既是企业实施人力资源管理信息化,这一思想仍要被重视.毕竟 8 再好的机器也要靠人去操作。管理软件是“一把手”。人性管理也是“一把手”,一定要两只手一起抓,只有这样,才能使企业更快地适应信息化,提高人力资源管理的工作绩效。心理契约是靠沟通、信旗、承诺、感情联系来实现的,基于国际互联网的在不确定环境下的柔性沟通将成为未来组织的发展方向,因此企业实施人力资源管理信息化是一项改革与挑战。如果不能合理有效的与员工进行沟通,则有可能会破坏他们的心理契约,进而导致满意率下降、忠诚度下降,影响企业的绩效。 2.4.4 注重长期规划。实现持续发展。很多企业在导人人力资源管理信息化后往往产生一劳永逸的思想。忽视后期规划和发展。其实成功的人力资源管理信息化建设是需要长期给予关注和规划的。只有审时度势地不断改进它的工作,才有可能将它对企业潜移默化的影响转化成持续的经济效益。ERP系统注重企业管理的全面性、系统性,重视企业与外界的关系,支持全球化经营等,同时ERP还能使企业以更低的成本为客户提供更多的服务。成功地选择和实施ERP可以优化企业的业务流程,改善数据信息系统,有效地提高企业的管理、工作及设备等效率,实现快速信息传递与共享,从而达到管理水平的全面提高,使企业活力及竞争力加强。 3、课程设计心得体会 人力资源管理在信息化、科技化的今天越来越要求快速高效的管理,开发适合企业需要的人力资源管理系统已是非常重要的工作。而ERP系统的实施注定要对企业的各个管理部门进行一次深入的变革,人力资源作为企业最最重要的资源之一,其管理理念当然也要随之变化。 首先要对ERP实施下的人力资源风险进行分析,只有清楚地了解了风险,才能懂得如何更好地避免风险,从而为企业避免损失。 其次,企业要将传统的人力资源管理模式信息化,企业实施ERP就是一个实现信息化管理的过程,因此人力资源管理也要随之信息化,才能使整个ERP系统高度集成、高度信息化,实现更高效和快速的管理。 最后,要对原有的人力资源模块进行改革和重新设计,设计出适应ERP系统实施的新模块,为企业成功实施ERP奠定坚实的基础。在ERP运行的过程中还要随着ERP系统的改变而迅速作出响应,从而保证企业能够快速适应市场变化,保 9 证企业更好地、长远地发展。 在课程设计过程中我查阅了相关资料,对原有的ERP知识有了更加透彻的理解。同时对ERP实施下的人力资源管理业有了一定的认识。当然,可能我的许多认识和理解可能还不是很成熟甚至是错误的,希望老师能予以批评指正,帮助我更好地提高。 4、参考文献 [1]贺军.ERP-HR系统在人力资源信息化建设中的应用【J】.湖南电力,2007,27(1):11-14. [2]陈启申.ERP—从企业内部集成起步(第二版)【M】.电子工业出版社2012 [3]池续航.对ERP实施现状的思考【N】.中国计算机报,2000—10—05. [4]杨体仁,祁光华.劳动与人力资源管理总览【M】.北京:中国人民大学出版社,1999. [5]李严锋.对ERP中人力资源管理的思考【J】.云南财贸学院学报,2010(5). [6]黄燃东.ERP/MRPII环境下的人力资源管理【J】.企业管理,2001.(4):94. [7] [荷] 诺伯特·韦尔伯.成功的ERP项目实施[M].北京:机械工业出版社,2003. 武汉理工大学《财务会计课程设计》报告书 13年我们一起做的财务会计课程设计 财务会计课程设计,是我的第三次专业课程设计,说实话做起来应该轻车熟路,但实际却不是如此。在刚开始时,因为没有做好足够的心理准备,发现做起有些困难,现在做完了回头看看这三周的学习,发现自己从中真的学到不少东西。在寒假期间,我找到了一家软件公司帮忙代理记账,所以说这个财务会计课程设计课程设计于我意义更加重大,我更加明白这个课程设计对我的帮助有多大。下面是我对整个财务会计课程设计的感受。1 我眼中的财务会计课程设计 当第一次听说要做财务会计课程设计时,我感觉既兴奋又紧张,刚开始接触时更多地是迷茫,更深入接触后,我对财务会计课程设计的认识又有了新变化。从陌生到熟悉,从害怕到喜欢。让我讲讲我眼中的财务会计课程设计。 1.1 初识财务会计课程设计 我认为做财务会计课程设计的目的不仅是要求我们掌握账务处理程序,更重要的是要我们明确财务人员的职责所在。这在我们课程设计书最前面已经指出,我个人十分认同这个观点。会计的职责主要包括:按相关规定开设账簿并进行会计核算,编制财务报表;计算税费工资;做好成本控制等。而在此次课程设计中这些内容都有所涉及,让我们全面的了解会计的工作,从月初到月末结账,我们自己做一遍,感觉比老师讲很多遍应该如何做账来的更加直接,让我们印象更加深刻。 1.2 财务会计课程设计新认识 财务会计课程设计的流程将会计的确认,计量,记录和报告融合在一起,相互交叉,例如在材料入库时,需要将在合理损耗范围内的材料也要算入入库数量时就很好的体现了一点。另外在做财务会计课程设计时,我对会计信息质量的谨慎性,明晰性,实质重于形式,及时性等有了新的认识。 谨慎,是对于会计来说非常重要的特性,我们在填写凭证登记账簿时要认真填写,不能随意更改,一旦填错必须按照相关规定修改如划线更正法,红字更正法等。而不能像平时一样直接随便拿笔划掉再写,在这次课程设计中我写错过很多地方,都坚持按照规定一个个修改过来,这让我逐渐养成习惯,以后在填写凭证和账簿时一定要看清楚想清楚再下笔。我感觉谨慎还体现在对充满不确定性的交易或事项时还要进行职业判断,例如按照经验确定计提坏账准备和存货跌价准备的比例等,不能随意臆测,要有依据。这样我们最终 体现在报表上的数据才能符合既不高估企业资产或者收益,又不低估企业的负债或费用的要求。 拿财务会计课程设计和我们之前做的会计学原理的课程设计进行对比,我发现此次课程设计的重心除日常的业务处理外,还加入了月末的计提税费,调整税费等,特别加入了我们在中财课上刚刚学习的递延所得税负债和递延所得税资产,所得税费用和应交所得税,通过四者之间的关系计算出实际应交的税费;针对债务重组、以前损益调整等都有专门的训练,特别是设备盘盈如何冲减以前损益调整,然后再如何冲减所得税费用和盈余公积等之前都是从未碰到过;另外,因为这个学期刚刚学习了现金流量表的编制,所以在编制报表也是一个大重点大难点。当我们编制完现金流量表时,长长的舒了一口气。2 简述课程设计流程 第一步,登记期初余额。包括建帐,填写期初余额等。在此次实训中,资产负债类期初填制时间为12月1号,摘要写余额,而损益类的要写11月30号,摘要写本年累计,登记借贷方,余额一律为0;第二步,审核填制记账凭证;第三步,登记账簿。具体包括:三栏式明细账,数量金额式明细账,八栏式明细账,十七栏明细账,应交税费明细账等;第四步,成本核算。包括登记制造费用明细账和生产成本明细账;编制制造费用分配表,产品成本明细表;结转完工产品成本;第五步,对账,结账。将总账与明细账,总账与日记账核对;第六步,编制资产负债表、利润表、现金流量表;第七步,归档及会计档案保管。 具体的例子将在财务会计课程设计的个人心得即财务会计课程设计中的“酸甜苦辣”中详细叙述。心得之财务会计课程设计中的“酸甜苦辣” 在做财务会计课程设计的过程中心情时时刻刻都在变,会因为填写凭证和账簿时整张都没错误而开心;会因为数据计算错误而伤心;会因为自己进度比别人慢而焦急不已;也会因为自己有些账务无从下手而不知所措„„整个手工中酸甜苦辣都有,但是更多地是充足,感觉有绵绵不断的只是注入了你的大脑,整个人分分秒秒都感觉到了激情,而不是大家认为通常做账时的苦闷。 3.1 财务会计课程设计中的“酸” 在做账时发现原始资料中有许多不合理的地方,例如库存现金在12月17日时的余额只有897.5,但是18号却发生了李天一预支差旅费2000元,十分不合理,但大家当时做 账时没有想到这一点,都直接按书上的数额记账登记日记账,后来董老师看了后,告诉我们这种做法不合理,因为在实际中,支取的现金是不能大于日记账中的余额的。我后来认真想想明白了,如果你是出纳,你难不成要3己垫支不足的额度给来支取差旅费的员工吗?我感觉老师给我们指出来并要求我们重新登记相关凭证的做法是对的,虽然我们现在只是一个实验,并不是真实的,但是我们就要从现在养成实事求是的态度,切不可降低对会计信息真实性的要求。这样做虽然需要我们改很多东西增加了很多工作量但也是值得的。 像这种错误还有几个,虽然给我们在记账过程中增加了工作量,但恰恰是这些给我们提了一个醒,这也许就是我们以后可能会犯的错误。现在遇到了,以后碰上类似的情况我们就知道该如何处理了。 3.2 财务会计课程设计中的“甜” 就如在对财务会计课程设计新认识的那里写到的一样,我在课程设计过程中学到最多的总结起来就是三个字“如何做”。这三个字的含义有很多,既包括如何进行账务处理也包括在做账过程中遇到困难时我该用什么态度对待等。在进行建账那一部分时,我感觉特别容易掌握,不需要特别动脑筋,但在进行日常业务时,就发现在根据原始凭证填制记账凭证时,像31号的那些结转处理以及计提的税费、坏账准备等都感觉有些吃力,最后在问过老师和同学后最终学会该如何计算,这时真的感觉自己学过的知识点掌握的有多么不牢固。 但是通过这次的财务会计课程设计后我发现我真的学到了很多东西,像如何更正明细账及总账中的错误,如何填制原始凭证,如何计提坏账,如何编制报表等,或许以前这些知识点我们都有学过,但却是这一次的财务会计课程设计让我真的掌握了这些知识点。 还记得之前分不清楚原材料和材料采购的区别,在这个案例中,因为有多笔相关账务要处理,像12月1号购入x材料,实际数量,价格要登记在材料采购,当然还有运费,说到运费又要注意运费中可以抵扣的进项税额,要一并加入材料采购的进项税额中去。在材料入库时因为要求按计划成本核算,所以入库时的价格要按计划成本的算,但是数量还是要按照真实性的原则,登记实际入库数量,相应计入管理费用的合理损耗也要计入入库数量等等。 另外在现金流量表编制时,胡老师告诉了我们一个小技巧,不一定非得编制调整分录或者用底稿,其实像一些比较简单的业务,并且数量不多时,可以直接分类,按类别计入。在这种方法下,比较难填列的项目有销售商品、提供劳务收到的现金和购买商品、接受劳 务支付的现金。在计算这两个项目时需要特别注意。这是在实际工作中比较实用的一个技巧,我们大多数同学都是按照这种方法编制的现金流量表 3.3 财务会计课程设计中的“苦” 在计算银行存款日记账时,因为数据较多,自己在计算时经常出现错误,导致银行存款日记账错误太多,不得不在全部计算完成后又另外抄了一份。像这种情况还有很多,像有时候在登记管理费用,制造费用,财务费用等时一不小心就登错了行,我真的有时候感觉自己这种神经大条的人不适合做财务会计课程设计,但经过后来慢慢地磨练我发现自己出现的这种低级大意的错误越来越少。 因为在刚开始做账时,不知道书写规范或者可能是自己太随意,导致书写不规范,像数字书写过大等等,我又利用课余时间把凭证和明细账都抄了一遍,在写第二遍时,发现很多东西都已经了然于心,没有刚开始做时那么生疏,很多人都说没必要这么做,但是我个人还是感觉有些东西在你做第二遍时效果肯定比第一遍好很多。 在这次财务会计课程设计中,因为很多数据都要自己重新计算,所以可能有时候需要我们睡得晚些,但是我感觉这些都是值得的,都是有意义的。如果老师说数据你们就将错就错吧,我估计会有很多同学会直接抄答案,特别是31后结转成本,计提折旧、坏账等这些比较麻烦的账务。但是老师本着严谨的态度,真的想让我们在这次财务会计课程设计中得到锻炼,所以让我们自己计算,并且老师也很负责任的自己算了一遍,并不断询问同学们的数据,这让我感觉感动,每位老师都很负责,是一个学生最想看到的。 说实话,这些也说不上是苦,只是当时可能有点抱怨,但现在什么真的对我以后的工作是有益处的,已经了然于心了。谢谢老师。 3.4 财务会计课程设计中的“辣” 所谓辣,给人感觉就是刚开始吃感觉不适应,但是如果吃习惯了,就会越来越习惯。而在课程设计则是指那些刚开始我不会的问题。像结转完工产品和编制报表表虽然也多多少少会,但是不够熟练,这次我一直坚持自己登记制造费用明细账和生产成本明细账,本着不怕出错但绝不能不敢下笔的原则,把所有工作做完后在和别人对一下,再把错误的改过来,不会的就问,再简单的问题只要自己还有疑问的都不放过,把硬骨头一个个啃透,最终越做越熟练。 想债务重组这些碰到的比较少,不太熟悉的知识点,我也愿意先去网上找相关知识点然后再看答案,就是抱着这种严谨的学习态度,真的在课程设计中学到很多东西。财务会计课程设计总结 在这次课程设计中,受益匪浅,把以前学过的忘记的知识点又重新捡了起来。除此之外,在做帐过程中我养成了许多好习惯并且学会如何调整好心态对待接下来的会计工作。 从专业上说,我对书本上学过的知识有了更加直观的认识,像根据明细账登记总账,根据科目汇总表登记总账等。另外课程设计与我们们刚刚学完的中财联系在一起,像应付职工薪酬、应交税费等,之前也有接触但是学的不是十分详细,而这次课程设计使这些知识点都连在了一次。像编制报表在这次课程设计前我认为我最多只能编制一个资产负债表和利润表出来,根本没有想到自己居然可以编出现金流量表。但我真的自己编制出来了,与老师的答案对过之后,发现有一点小错误,改正后真的很开心,为自己肯去尝试并努力去做这件事情真的感到自豪。 从心态上说,做事要不急不躁,时刻保持警惕,不可放松对自己的要求。这是我在财务会计课程设计中得到的启示。有时候,我们做事情就是太急功近利,到最后反而什么都做不好,越落后别人,越做不对数据时一定要静下心来把下一步的计划做好后再行动,磨刀不误砍柴工。遇到不会的、不明白的事情,就要不耻下问,一个人将不明白就多问几个人,只有这样才能学到真正要学习的知识。这次财务会计课程设计实训,历时三周,感觉每天都能学到新知识,每天都很充实,希望以后还可以在工作前再有这种实训来锻炼自己。第二篇:socket网络课设报告
第三篇:数据结构课设报告
第四篇:ERP课设报告
第五篇:财务会计课设报告