当前位置:文档之家› Winsocket入门教程一:多线程阻塞式服务器和阻塞式客户端程序(TCP)

Winsocket入门教程一:多线程阻塞式服务器和阻塞式客户端程序(TCP)

Winsocket入门教程一:多线程阻塞式服务器和阻塞式客户端程序(TCP)
Winsocket入门教程一:多线程阻塞式服务器和阻塞式客户端程序(TCP)

最近因为工作需要学习了Winsocket客户端服务器模型程序的设计。在学习的过程中,我发现学习Winsocket的资料不多并且十分的零散。我一直没有找到一本学习W insocket方面的经典国外著作。而且这些资料中并没有提供源代码文件,所以我只有将这些源代码在自己敲一遍。在敲代码的过程中,我发现了这些源代码中的一些错误的地方和一些已经过时的Windows程序的输写方法(Win16?)。现将学习经验和通过阅读各种资料总结出来的模型以及代码分享出来。希望对学习Winsocket的初学者有一定的帮助。

我们首先来了解一下什么是Winsocket。Winsocket是unix/linux下的berkeley socket在Windows下的实现。unix/linux下的berkeley socket是网络通讯方面的基石,应用程序通过调用berkeley socket的API进行相互通讯,berkeley socket则利用具体的网络通讯协议和操作系统的调用来为我们完成具体的通讯工作。Winsocket保留了berkeley socket的所有内容,并且为了其能在Win32消息机制和多线程的环境下更好的工作。Winsocket在berkeley socket原有的基础上对其进行了扩充。如我们可以利用W SAAsyncSelect对Socket消息进行订阅,以及使用WSAGetLastError对多线程环境下的Winsocket错误进行捕获。

接着再让我们来了解一下服务器\客户端应用程序模型。该模型是构建分布式系统的模型之一。服务器程序一直处于监听的状态,等待客户端程序的连接。客户端程序像服务器程序发送连接请求,服务器程序接受该连接请求,同时与客户端程序建立连接。此时客户端程序就可以向服务器发送具体的请求,获取相关的数据。服务器\客户端模型有三种连接方式,一种是面向连接的(TCP),面向连接的服务是一种可靠的服务,它通过数据流进行数据的传输,面向连接的服务实现了无差错无重复的顺寻数据发送。一种是面向无连接的(UDP),面向无连接的服务是一种不可靠的服务,它通过数据报进行数据传输,由于数据报进行传输时的顺序是无序的,所以它是不可靠的服务。最后一种是多播的方式,及服务器程序主动向多个客户端程序发送信息。面向连接的服务器\客户端应用程序模型的程序流程图如下所示:

在此模型的阻塞模式中,服务端程序在执行accept操作、客户端程序connect操作、以及服务端\客户端在进行read和write操作时,如果这些操作既没有成功也没有失败,应用程序会在执行这些操作的地方一直阻塞着。所以我们应该在服务端应用程序的主线程中不停的调用accept操作,以使服务端程序能不停地接受客户端程序发送过来的连接请求。

而在接受了一个客户端的连接请求后,我们应改为每一个接受的连接请求开辟一个专门的线程来接受客户端程序发送的请求以及为具体的请求返回特定的信息。

根据以上的程序流程图以及说明,我们可以写出以下的服务端程序源代码:

view plaincopy to clipboardprint?

1.///////////////////////////////////////////////////////////////////////////////////

/////////////////

2./// \file ServerMultThread\ServerMultThread.cpp

3.///

4./// \brief 阻塞式多线程服务器程序。每当客户端程序请求与服务端连接时,服务

端程序开放一个线程接受客户端程序的请求

5./// 并且向客户端回馈请求的信息。客户端请求的信息输出到控制台中.

6.///////////////////////////////////////////////////////////////////////////////

/////////////////////

7.#include

8.#include

9.#include

10.#include

11.#pragma comment(lib, "ws2_32.lib" )

12.#define ASSERT assert

13.#define THREAD HANDLE

14.#define EVENT HANDLE

15.#define CloseThread CloseHandle

16.#define CloseEvent CloseHandle

https://www.doczj.com/doc/b31960000.html,ing std::cin;

https://www.doczj.com/doc/b31960000.html,ing std::cout;

https://www.doczj.com/doc/b31960000.html,ing std::endl;

20.///////////////////////////////////////////////////////////////////////////////

/////////////////////

21./// \struct tagServerRecv

22.///

23./// \brief 线程函数参数结构体,其中包含已建立连接的socket.

24.///

25./// \author Shining100

26./// \date 2010-05-18

27.///////////////////////////////////////////////////////////////////////////////

/////////////////////

28.typedef struct tagServerRecv

29.{

30. SOCKET skAccept; // 已建立连接的socket

31. CRITICAL_SECTION *pcs; // 同步控制台输出的临界区

32. EVENT e; // 保证结构体各个字段在结构体字段改变之前将其拷贝

到线程中的信号量

33. THREAD t; // 当前线程的内核对象

34.DWORD dwThreadID; // 当前线程的ID

35.}SERVER_RECV, *PSERVER_RECV;

36.///////////////////////////////////////////////////////////////////////////////

/////////////////////

37./// \fn static int ServerRecv(LPVOID lParam)

38.///

39./// \brief 服务器与建立连接的客户端进行通讯.

40.///

41./// \author Shining100

42./// \date 2010-05-18

43.///

44./// \param lParam 线程函数参数, 详细信息见上面说明.

45.///

46./// \return 总是返回0.

47.///////////////////////////////////////////////////////////////////////////////

/////////////////////

48.static int ServerRecv(LPVOID lParam);

49.static const int c_iPort = 10001;

50.int main()

51.{

52.int iRet = SOCKET_ERROR;

53. // 初始化Winsocket,所有Winsocket程序必须先使用WSAStartup进行初

始化

54. WSADATA data;

55. ZeroMemory(&data, sizeof(WSADATA));

56. iRet = WSAStartup(MAKEWORD(2, 0), &data);

57. ASSERT(SOCKET_ERROR != iRet);

58. // 建立服务端程序的监听套接字

59. SOCKET skListen = INVALID_SOCKET;

60. skListen = socket(AF_INET, SOCK_STREAM, 0);

61. ASSERT(INVALID_SOCKET != skListen);

62. // 初始化监听套接字地址信息

63. sockaddr_in adrServ; // 表示网络地址

64. ZeroMemory(&adrServ, sizeof(sockaddr_in));

65. adrServ.sin_family = AF_INET; // 初始化地址格式,只能为AF

_INET

66. adrServ.sin_port = htons(c_iPort); // 初始化端口,由于网络字节

顺序和主机字节顺序相反,所以必须使用htons将主机字节顺序转换成网络字节顺序

67. adrServ.sin_addr.s_addr = INADDR_ANY; // 初始化IP,由于是服务

器程序,所以可以将INADDR_ANY赋给该字段,表示任意的IP

68. // 绑定监听套接字到本地

69. iRet = bind(skListen, (sockaddr*)&adrServ, sizeof(sockaddr_in));

70. ASSERT(SOCKET_ERROR != iRet);

71. // 使用监听套接字进行监听

72. iRet = listen(skListen, SOMAXCONN); // SOMAXCONN表示可以连接到

该程序的最大连接数

73. ASSERT(SOCKET_ERROR != iRet);

74. // 输出控制台缓冲区,由于可能有多个客户端程序可能同时向缓冲区发送请求

信息

75. // 为了保证输出时能够一次性完整的输出完一个客户端的请求信息,所以在输

出客

76. // 户程序的信息到控制台时,必须使用临界区阻塞其它线程

77. CRITICAL_SECTION cs;

78. InitializeCriticalSection(&cs);

79. // 保证结构体各个字段在结构体字段改变之前将其拷贝到线程中的信号量

80. // 因为当该结构体拷贝到线程中之前, 有可能有新的连接到来并改变了结构体

的值

81. // 所以我们必须先保证值拷贝过后再接受连接

82. EVENT e = NULL;

83. e = CreateEvent(NULL, FALSE, FALSE, NULL);

84. ASSERT(NULL != e);

85. for(;;)

86. {

87. // 客户端向服务器端发送连接请求,服务器端接受客户端的连接

88. SOCKET skAccept = INVALID_SOCKET;

89. sockaddr_in adrClit;

90. ZeroMemory(&adrClit, sizeof(sockaddr_in));

91.int iLen = sizeof(sockaddr_in);

92. skAccept = accept(skListen, (sockaddr*)&adrClit, &iLen); // 如果

没有客户端程序请求连接,服务端程序会一直阻塞在这里等待连接

93. ASSERT(INVALID_SOCKET != skAccept);

94. SERVER_RECV sr;

95. // 成功创建连接后创建一个独立的线程应答客户请求,以防止应用程序因为

阻塞无法应答新的客户请求

96. // 我们应该先将线程挂起,以便我们能够在线程执行之前初始化线程所需要

的结构体变量中的各个字段

97. THREAD hThread = NULL;

98.DWORD dwThreadID = 0;

99. hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)

ServerRecv,

100. &sr, CREATE_SUSPENDED, &dwThreadID);

101. ASSERT(NULL != hThread);

102. // 初始化结构体字段

103. sr.skAccept = skAccept;

104. sr.pcs = &cs;

105. sr.e = e;

106. sr.t = hThread;

107. sr.dwThreadID = dwThreadID;

108. // 启动线程

109.DWORD dwRet = ResumeThread(hThread);

110. ASSERT(-1 != dwRet);

111.

112. // 保证结构体被拷贝到线程中后再应答新的连接

113. dwRet = WaitForSingleObject (e, INFINITE);

114. ASSERT(WAIT_FAILED != dwRet);

115. }

116. // 清理线程同步资源

117. DeleteCriticalSection(&cs);

118.BOOL bRet = FALSE;

119. bRet = CloseEvent(e);

120. ASSERT(bRet);

121. // 关闭该套接字的连接

122. iRet = shutdown(skListen, SD_SEND);

123. ASSERT(SOCKET_ERROR != iRet);

124. // 清理该套接字的资源

125. iRet = closesocket(skListen);

126. ASSERT(SOCKET_ERROR != iRet);

127. // 清理Winsocket资源

128. iRet = WSACleanup();

129. ASSERT(SOCKET_ERROR != iRet);

130. cin.get();

131. return 0;

132.}

133.int ServerRecv(LPVOID lParam)

134.{

135. // 拷贝结构体各个字段到线程中

136. PSERVER_RECV psr = (PSERVER_RECV)lParam; 137. SERVER_RECV sr = {

138. psr->skAccept,

139. psr->pcs,

140. psr->e,

141. psr->t,

142. psr->dwThreadID

143. };

144. // 设置信号量,使主线程能够接受新的连接

145.BOOL bRet = FALSE;

146. bRet = SetEvent(sr.e);

147. ASSERT(bRet);

148. const int c_iBufLen = 512;

149.char szBuf[c_iBufLen + 1] = {'\0'};

150. const char c_szPrefix[] = "Server recv:"; 151. const int c_iPrefLen = strlen(c_szPrefix);

152.char szRely[c_iBufLen + 16 + 1] = {'\0'};

153. strcpy(szRely, c_szPrefix);

154.int iRet = SOCKET_ERROR;

155. for(;;)

156. {

157. iRet = recv(sr.skAccept, szBuf, c_iBufLen, 0); // 接收客户端发送的信息,如果客户端不发送信息,则线程会阻塞到此处

158. if(0 == iRet) // 客户端优雅的关闭了此连接

159. {

160. cout << "Connection " << sr.dwThreadID << " shutdown." < < endl;

161. break;

162. }

163. else if(SOCKET_ERROR == iRet) // 客户端粗鲁的关闭了此连接或者接受信息出错

164. {

165. cout << "Connection " << sr.dwThreadID << " recv error." < < endl;

166. break;

167. }

168. szBuf[iRet] = '\0';

169. EnterCriticalSection(sr.pcs);

170. cout << "Connection " << sr.dwThreadID << " says:" << szBu

f << endl; // 输出接收到的信息

171. LeaveCriticalSection(sr.pcs);

172. // 向客户端发送信息

173. strcpy(szRely + c_iPrefLen, szBuf);

174. iRet = send(sr.skAccept, szRely, strlen(szRely), 0); // 客户端如果没有足够的缓冲区接受信息,则线程会阻塞到此处

175. if(SOCKET_ERROR == iRet)

3.///

4./// \brief 连接服务器并向服务器发送信息,然后接受服务器发送的信息.

5.///////////////////////////////////////////////////////////////////////////////

/////////////////////

6.#include

7.#include

8.#include

9.#pragma comment(lib, "ws2_32.lib" )

10.#define ASSERT assert

https://www.doczj.com/doc/b31960000.html,ing std::cin;

https://www.doczj.com/doc/b31960000.html,ing std::cout;

https://www.doczj.com/doc/b31960000.html,ing std::endl;

14.static const char c_szIP[] = "127.0.0.1";

15.static const int c_iPort = 10001;

16.int main()

17.{

18.int iRet = SOCKET_ERROR;

19. // 初始化Winsocket,所有Winsocket程序必须先使用WSAStartup进行初

始化

20. WSADATA data;

21. ZeroMemory(&data, sizeof(WSADATA));

22. iRet = WSAStartup(MAKEWORD(2, 0), &data);

23. ASSERT(SOCKET_ERROR != iRet);

24. // 建立连接套接字

25. SOCKET skClient = INVALID_SOCKET;

26. skClient = socket(AF_INET, SOCK_STREAM, 0);

27. ASSERT(INVALID_SOCKET != skClient);

28. // 初始化连接套接字地址信息

29. sockaddr_in adrServ; // 表示网络地址

30. ZeroMemory(&adrServ, sizeof(sockaddr_in));

31. adrServ.sin_family = AF_INET; // 初始化地址格式,只能为

AF_INET

32. adrServ.sin_port = htons(c_iPort); // 初始化端口,由于网络字

节顺序和主机字节顺序相反,所以必须使用htons将主机字节顺序转换成网络字节顺序

33. adrServ.sin_addr.s_addr = inet_addr(c_szIP); // 初始化IP,由于网

络字节顺序和主机字节顺序相反,所以必须使用inet_addr将主机字节顺序转换成网络字节顺序

34. // 使用连接套接字进行连接

35. iRet = connect(skClient, (sockaddr*)&adrServ, sizeof(sockaddr_in));

36. ASSERT(SOCKET_ERROR != iRet);

37. const int c_iBufLen = 512;

38.char szBuf[c_iBufLen + 16 + 1] = {'\0'};

39. for(;;)

40. {

41. cout << "what you will say:";

42. cin >> szBuf;

43. if(0 == strcmp("exit", szBuf))

44. {

45. break;

46. }

47. // 向服务器端发送信息

48. iRet = send(skClient, szBuf, strlen(szBuf), 0); // 服务器端如果没有

足够的缓冲区接受信息,则线程会阻塞到此处

49. if(SOCKET_ERROR == iRet)

50. {

51. cout << "send error." << endl;

52. break;

53. }

54. // 接收服务器端发送的信息

55. iRet = recv(skClient, szBuf, c_iBufLen, 0); // 如果服务器端没有发送

数据,则会阻塞到此处

56. if(0 == iRet)

57. {

58. cout << "connection shutdown." << endl;

59. break;

60. }

61. else if(SOCKET_ERROR == iRet)

62. {

63. cout << "recv error." << endl;

64. break;

65. }

66. szBuf[iRet] = '\0';

67. cout << szBuf << endl;

68. }

69. // 关闭该套接口

70. iRet = shutdown(skClient, SD_SEND);

71. while(recv(skClient, szBuf, c_iBufLen, 0) > 0);

72. ASSERT(SOCKET_ERROR != iRet);

73. // 清理该套接口的资源

74. iRet = closesocket(skClient);

75. ASSERT(SOCKET_ERROR != iRet);

76. // 清理Winsocket资源

77. iRet = WSACleanup();

78. ASSERT(SOCKET_ERROR != iRet);

79. while(cin.get());

80. return 0;

81.}

四人竞赛抢答器实验报告

数电实验报告 姓名:侯婉思 专业:通信工程 班级:1111 学号:11387121 指导老师:田丽娜

四人竞赛抢答器实验报告 一.前言 现今,形式多样、功能完备的抢答器已广泛应用于电视台、商业机构、学校、企事业单位及社会团体组织中,它为各种知识竞赛增添了刺激性、娱乐性,在一定程度上丰富了人们的业余生活。 对于抢答器我们大家都知道那是用于选手做抢答题时用的,选手进行抢答,抢到题的选手来回答问题。抢答器不仅考验选手的反应速度同时也要求选手具备足够的知识面和一定的勇气。选手们都站在同一个起跑线上,体现了公平公正的原则。 本文介绍了一种用74系列常用集成电路设计的高分辨率的4路抢答器。该抢答器为全数字集成电路设计,具有分组数多、分辨率高等优点。该抢答器除具有基本的抢答功能外,还具有优先能力,定时及复位功能。主持人通过控制开关使抢答器达到复位的功能。 二.实验目的 1. 学习并掌握抢答器的工作原理及其设计方法 2. 熟悉各个芯片的功能及其各个管脚的接法。 3. 灵活运用学过的知识并将其加以巩固,发散思维,提高学生的动手能力和思维的缜密。 三.设计任务与要求 1、设计任务 设计一台可供4名选手参加比赛的竞赛抢答器。选手抢答时,数码显示选手组号。 2.设计要求: 抢答器的基本功能: 1.设计一个智力抢答器,可同时供四名选手或四个代表队参加比赛,编号为一,二,三,四,各用一个抢答按钮,分别用四个按钮S0——S3表示。 2.给节目主持人设置一个控制开关,用来控制系统的清零(编号显示数码管清零)。 3.抢答器具有数据锁存和显示的功能,抢答开始后,若有选手按动抢答按钮,编号立即锁存,并在LED数码管上显示出选手的编号,此外,要封锁输入电路,实现优先锁存,禁止其他选手抢答,优先抢答选手的编号一直保持到主持人将系统清零为止。 简言之,有选手按下时,显示选手的编号。同时,其他人再按下时电路不做任何处理。也就是说,如果有选手按下以后,别的选手再按的话电路不会显示是他的编号。 4.可用555定时器产生频率为1H z的脉冲信号,作为触发器的CP信号。四.四人竞赛抢答器电路原理及设计

Android开发规范参考文档

Android开发参考文档 一、Android编码规范 1. java代码中不出现中文,最多注释中可以出现中文.xml代码中注释 2. 成员变量,局部变量、静态成员变量命名、常量(宏)命名 1). 成员变量: activity中的成员变量以m开头,后面的单词首字母大写(如Button mBackButton; String mName);实体类和自定义View的成员变量可以不以m开头(如ImageView imageView,String name), 2). 局部变量命名:只能包含字母,组合变量单词首字母出第一个外,都为大写,其他字母都为小写 3). 常量(宏)命名: 只能包含字母和_,字母全部大写,单词之间用_隔开UMENG_APP_KEY 3. Application命名 项目名称+App,如SlimApp,里面可以存放全局变量,但是杜绝存放过大的实体对象4. activity和其中的view变量命名 activity命名模式为:逻辑名称+Activity view命名模式为:逻辑名称+View 建议:如果layout文件很复杂,建议将layout分成多个模块,每个模块定义一个moduleViewHolder,其成员变量包含所属view 5. layout及其id命名规则 layout命名模式:activity_逻辑名称,或者把对应的activity的名字用“_”把单词分开。

命名模式为:view缩写_模块名称_view的逻辑名称, 用单词首字母进行缩写 view的缩写详情如下 LayoutView:lv RelativeView:rv TextView:tv ImageView:iv ImageButton:ib Button:btn 6. strings.xml中的 1). id命名模式: activity名称_功能模块名称_逻辑名称/activity名称_逻辑名称/common_逻辑名称,strings.xml中,使用activity名称注释,将文件内容区分开来 2). strings.xml中使用%1$s实现字符串的通配,合起来写 7. drawable中的图片命名 命名模式:activity名称_逻辑名称/common_逻辑名称/ic_逻辑名称 (逻辑名称: 这是一个什么样的图片,展示功能是什么) 8. styles.xml 将layout中不断重现的style提炼出通用的style通用组件,放到styles.xml中; 9. 使用layer-list和selector,主要是View onCclick onTouch等事件界面反映

lab1 SQLPlus使用及简单Select语句

实验1 SQL*Plus使用及简单Select语句 实验人:_________ 学号_____ 班级____________ 实验目的: 1.掌握SQL*Plus常用功能的使用。 2.掌握简单查询的语法。 实验平台: 1.Windows 2000/XP。 2.Oracle 10g 实验过程记录及分析: 1.SQL*Plus的使用: 1) 2) 3)如果某个用户连接数据库时,发生了“协议适配器错误”,分析其原因,并给出解决错 4)

5) 6) 7) 2. SQL 1) 2)3

4)查询emp表中,工资额大于2000的员工的姓名及其工资额。 5) 6) 7)查询emp表中,ename列含有字母A的员工的姓名。

8) 9) 10

11)使用to_date函数查询1981年入职的员工姓名。 SQL> select * from emp 2 where to_char(hiredate,'yyyy')='1981'; EMPNO ENAME JOB MGR HIREDATE SAL COMM ---------- ---------- --------- ---------- -------------- ---------- ---------- DEPTNO ---------- 7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 7566 JONES MANAGER 7839 02-4月 -81 2975 20 EMPNO ENAME JOB MGR HIREDATE SAL COMM ---------- ---------- --------- ---------- -------------- ---------- ---------- DEPTNO ---------- 7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 EMPNO ENAME JOB MGR HIREDATE SAL COMM ---------- ---------- --------- ---------- -------------- ---------- ----------

四路抢答器课程设计报告

四 路 抢 答 器 设 计 实 验 报 告 信息科学技术学院自动化*班 ****

四路抢答器设计实验报告 一、设计任务: 1、巩固和加深对电子电路基本知识的理解,提高综合运用本课程所学知识的能 力。 2、养成根据设计需要选学参考书籍,查阅相关手册、图表和文献资料的自学能力。 3、通过电路方案的分析、论证和比较,设计计算和选取元器件、电路组装、 调试和检测等环节,初步掌握简单实用电路的分析方法和工程设计方法。 4、学会简单电路的实验调试和性能指标的测试方法,提高学生动手能力和进行 数字电子电路实验的基本技能。 二、技术指标 抢答器是一种具有优先输出的电子电路。它的基本功能是,在四组参赛的情况下,首先抢答者发出抢答信号,此时其他参赛组的抢答电路即失去控制作用。在优先抢答者解除抢答信号后,电路才自动恢复到各组又可均等抢答的状态中。 1、设计一个可供4人进行的抢答器。 2、系统设置复位按钮,按动后,重新开始抢答。

3、抢答器开始时数码管无显示,选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。抢答后显示优先抢答者序号,同时发出音响。并且不出现其他抢答者的序号,这样其它选手无法再抢答,达到抢答目的。 4、抢答器具有定时抢答功能,本抢答器的时间设定为10秒,当主持人启动“开始”开关后,定时器开始减计。 5、设定的抢答时间,选手可以抢答,这时定时器开始工作,显示器上显示选手 的和抢答时间。并保持到主持人按复位键。 6、当设定的时间一到,而无人抢答时,本题报废,选手们无法再抢答,同时扬 声器报警发出声音,定时器上显示0。 三、元件清单:

android中selector背景选择器(全部属性)

浅谈android的selector背景选择器 ---------------------------------------------------- Item顺序是有讲究的,条件限定越细致,则应该放到前面。比如这儿如果把1,2行和3,4行的item交换,那么pressed的就永远无法触发了,因为有item已经满足条件返回了。可以理解为代码中的if语句。 ---------------------------------------------------- 关于listview和button都要改变android原来控件的背景,在网上查找了一些资料不是很全,所以现在总结一下android的selector的用法。 首先android的selector是在drawable/xxx.xml中配置的。 先看一下listview中的状态: 把下面的XML文件保存成你自己命名的.xml文件(比如list_item_bg.xml),在系统使用时根据ListView中的列表项的状态来使用相应的背景图片。 drawable/list_item_bg.xml

Quartus六路抢答器实验报告

抢答器实验报告 一、 抢答器的功能介绍: 1、 基本功能: (1) 抢答器同时供6名选手比赛,分别用6个按钮S0 ~ S5表示。 (2) 设置一个系统清除和抢答控制开关S ,该开关由主持人控制。 (3) 抢答器具有锁存与显示功能。即优先锁存抢答选手的编号,并显示在数码管上,扬声器发出音响提示。此时其它选手再按键无效。优先抢答选手的编号一直保持到主持人将系统清除为止。 → →→ 2、 扩展功能: (1) 抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30秒)。当主持人启动“开始”键后,定时器进行减计时显示。主持人按“开始” 键前抢答给以警告,抢答选手的LED 闪烁 (2) 参赛选手在设定的时间内抢答后,定时器停止减计时。 (3) 如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。 二、抢答器总体方案设计及原理图; 1、总体方案图 (1)主持人有开始键和复位键,按下开始键后才能开始抢答,否则犯规。其他六个人设有六个按键。按键中加有除颤装置。

(2)抢答后选手的号码用数码管显示,正常抢答后显示抢到的选手号码,并有铃声响起,如果在主持人按开始键前有人抢答,则选手的指示灯会闪烁,并有报警音响起。 (3)如果10秒内没有抢答,则说明该题超时作废。 三、 1、键入模块 选 手 、 主持人未开始, 选手抢答,指示

(1)、除颤装置 除颤装置的原理是:在按键操作时,机械触点的弹性及电压跳动等原因。在触点闭合或开启的瞬间会出现电压的抖动,如果不进行处理就会造成误操作。按键去抖动的关键在于提取稳定的低电平状态。如果连续几次为低电平,可以认为信号已经处于稳定状态,此时输出一个低电平按键信号。即:当给与D触发器一个100hz的脉冲信号,选手按键后(为低电平)经过多个D触发器触发,最后输出稳定的低电平。(2)、总的键入装置

好程序员 2015最新Android应用开发基础教程

好程序员2015Android最新开发应用基础教程 适用人群:适用于零基础入学者 课程简介:本套课程结合最新Android新特性,结合最新技术特点所录制,此次课程我们主要讲解,Android基本UI及事件机制,Android四大组件的应用,Android中多线程的使用和Handler原理,Android中Fragment和ViewPager的使等,Android开发中常用知识点和功能讲解。 你会学到哪些? 掌握Android基本UI及事件机制 掌握Android四大组件的应用 掌握Android中多线程的使用和Handler原理 掌握Android中Fragment和ViewPager的使用 掌握菜单、通知、对话框的使用 掌握ListView、BaseAdapter的使用 掌握项目中通用的UI控件(滚动控件、网页控件、视频控件等) 掌握自定义控件和事件分发机制掌握实际项目开发流程和必备常识 1.Activity组件与Intent意图 1.1_activity_01 1.2_activity_02 1.3_activity_03 1.4_activity_04_task 1.5_activity_05

1.6_intent 2.网络操作与数据解析 1.7_AsyncTask01 3.UI(二) 1.8_Spinner_SimpleAdatper1 1.9_AutoCompleteTextView_ListView01 2.0_ListView02 2.1_BaseAdapter01 2.2_ListView04_News 2.3_ListView04_OnScrollListener 2.4_ListView05_ConvertView 2.5_ListView06_Person 2.6_ListView07_Item分类 2.7_ListView08_重构BaseAdapter 2.8_GridView 4.菜单、对话框、通知和Toast 2.9_Menu 3.0_Dialog01 3.1_Dialog02-03

四路抢答器

一、设计题目: 四路抢答器设计 二、技术指导和技术要求: 用集成芯片设计并制作简易四路抢答器,具体要求如下: 1.每个参加者控制一个按钮,用按动按钮发出抢答信号; 2.抢答组数分为四组,即序号A、B、C、D,对应数字编码1、2、3、4,优先抢答者按动本组序号开关,该组对应数字编码立即锁存到LED显示器上,同时封锁其他组号,并有蜂鸣器声音提示。此后其他3人再按动按钮对电路不起作用; 3.竞赛主持人另有一个按钮,用于将电路复位。 三、选择总体方案,确定电路 1、提出电路的方案 方案(1): 如图1所示为总体方框图。其工作原理为:通电源后,抢答器处于工作状态,编号显示器灯灭,主持人宣布“开始”,选手开始抢答,抢答器完成:优先判断、编号锁存、编号显示。当一轮抢答之后,禁止二次抢答。如果再次抢答必须由主持人操作“复位”开关。 图1 电路原理框图 方案(2): 下面是用74LS175、74LS00、74LS20得到的4路抢答器的电路,如图2。 这个电路只是通过发光二极管来显示其结果,没有达到按照选手的号码来显示数字,并且其电路抢答没有声音,所要求集成块个数跟方案(1)相当,但实现功能稍逊方案(1)。 2、方案的选择与论证 比较方案(1)和方案(2),发现方案(1)需要元器件数量稍微多一点,但

所需元件都是比较简易,电路不是很复杂,并且所显示的效果比方案(2)要多,达到了实验的要求。而方案(2)不能有效达到设计指标(没有声音、无数字显示),所以选择方案(1)。 图2 方案(2)电路图 四、单元电路推导和电路元器件参数计算 (1)优先锁存、门控电路: CD4511具有锁存、译码、消隐功能,通常以反相器作输出级,通常用以驱 动LED,其引脚图和功能表如图3。 图3 CD4511的引脚图和功能表

智能抢答器实验报告

电子科技大学 实 验 报 告 学生姓名: 学号: 指导教师: 日期:

一、实验室名称: 二、实验项目名称: 智能抢答器设计 三、实验原理: 4人抢答器可同时供4位选手参加比赛,分别用player1 player2 player3 player4表示,节目主持人设置一个复位按键clear,用于控制系统的清零.抢答器具有锁存和显示功能,能够显示哪位选手获得抢答,并能显示具体选手的号码,同时屏蔽别的选手,再按选择信号.在选手回答问题时在规定时间到达发出报警主持人按键清零,一次抢答结束. 在本设计中,共4位选手,即4个输入信号,考虑到优先原则,所以引用一个状态变量,当这个标志为”1”的时候,说明有选手已经抢答,则对其他选手输入位信号进行屏蔽,然后锁存这个选手的编号并显示.采用两个数码管显示,计数采用BCD码输出. 四、实验目的: ?学习QUARTUSⅡ软件的使用方法 ?学习VHDL或VerilogHDL语言 ?学会用VHDL或VerilogHDL语言进行简单的编程

五、实验内容: 完成智能抢答器实验程序的编写,并进行仿真后分析验证 六、实验器材(设备、元器件): PC机,QUARTUSⅡ软件 七、实验步骤: ?熟悉QUARTUSⅡ软件(以简单实例) ?用VHDL开发FPGA的完整流程.继续掌握QUARTUSⅡ软件使用方法. ?设计出抢答器程序进行调试, ?用QUARTUSⅡ进行编译,综合及仿真. 八、实验数据及结果分析: 设计程序如下: module qdq(player1,player2,player3,player4,res,clk,q1,q2,q3,q4,row,ra,Q1,beep); input player1,player2,player3,player4; input res,clk; output[6:0]row,ra; output[3:0]Q1; output q1,q2,q3,q4,beep; reg q1,q2,q3,q4,beep; reg[6:0]row,ra; reg clk1; reg[3:0]Q1; reg[3:0]y; reg[6:0]i;

android中sharp的使用

android:shape的使用 Android中常常使用shape来定义控件的一些显示属性,今天看了一些shape的使用,对shape有了大体的了解,稍作总结: 先看下面的代码:

solid:实心,就是填充的意思 android:color指定填充的颜色 gradient:渐变 android:startColor和android:endColor分别为起始和结束颜色, ndroid:angle是渐变角度,必须为45的整数倍。 另外渐变默认的模式为android:type="linear",即线性渐变,可以指定渐变为径向渐变,android:type="radial",径向渐变需要指定半径 android:gradientRadius="50" 。 stroke:描边 android:width="2dp" 描边的宽度,android:color 描边的颜色。 我们还可以把描边弄成虚线的形式,设置方式为: 其中android:dashWidth表示'-'这样一个横线的宽度,android:dashGap表示之间隔开的距离。 corners:圆角 android:radius为角的弧度,值越大角越圆。 我们还可以把四个角设定成不同的角度,方法为:

这里有个地方需要注意,bottomLeftRadius是右下角,而不是左下角,记得别搞错了。 还有网上看到有人说设置成0dp无效,不过我在测试中发现是可以的,我用的是2.2,可能修复了这个问题吧,如果无效的话那就只能设成1dp了。 padding:间隔 这个就不用多说了,XML布局文件中经常用到。 大体的就是这样,以下是一个使用的具体示例:用在Selector中作为Button 的背景,分别定义了按钮的一般状态、获得焦点状态和按下时的状态,具体代码如下: main.xml: button_selector.xml:

SQL语句 SELECT LIKE like用法详解

SQL语句 SELECT LIKE like用法详解 2009-12-16 13:44 LIKE语句的语法格式是:select * from 表名 where 字段名 like 对应值(子串),它主要是针对字符型字段的,它的作用是在一个字符型字段列中检索包含对应子串的。 假设有一个数据库中有个表table1,在table1中有两个字段,分别是name 和sex二者全是字符型数据。现在我们要在姓名字段中查询以“张”字开头的记录,语句如下: select * from table1 where name like "张*" 如果要查询以“张”结尾的记录,则语句如下: select * from table1 where name like "*张" 这里用到了通配符“*”,可以说,like语句是和通配符分不开的。下面我们就详细介绍一下通配符。 多个字符 * c*c代表cc,cBc,cbc,cabdfec等 它同于DOS命令中的通配符,代表多个字符。 多个字符 % %c%代表agdcagd等 这种方法在很多程序中要用到,主要是查询包含子串的。 特殊字符 a a代表a*a 代替* 单字符 ? b?b代表brb,bFb等 同于DOS命令中的?通配符,代表单个字符 单数字 # k#k代表k1k,k8k,k0k 大致同上,不同的是代只能代表单个数字。 字符范围 - [a-z]代表a到z的26个字母中任意一个 指定一个范围中任意一个 续上

排除 [!字符] [!a-z]代表9,0,%,*等 它只代表单个字符 数字排除 [!数字] [!0-9]代表A,b,C,d等 同上 组合类型 字符[范围类型]字符 cc[!a-d]#代表ccF#等 可以和其它几种方式组合使用 例:假设表table1中有以下记录: name sex 张小明男 李明天男 李a天女 王5五男 王清五男 下面我们来举例说明一下: 查询name字段中包含有“明”字的。 select * from table1 where name like '%明%' 查询name字段中以“李”字开头。 select * from table1 where name like '李*' 查询name字段中含有数字的。 select * from table1 where name like '%[0-9]%' 查询name字段中含有小写字母的。 select * from table1 where name like '%[a-z]%' 查询name字段中不含有数字的。 select * from table1 where name like '%[!0-9]%' 我们着重要说明的是通配符“*”与“%”的区别。 select * from table1 where name like '*明*' select * from table1 where name like '%明%' 大家会看到,前一条语句列出来的是所有的记录,而后一条记录列出来的是name字段中含有“明”的记录,所以说,当我们作字符型字段包含一个子串的查询时最好采用“%”而不用“*”,用“*”的时候只在开头或者只在结尾时,而不能两端全由“*”代替任意字符的情况下。 大家在写sql 语句的时候,如果是 select .. where 类型的语句,有注意到条件的前后顺序吗?我今天做个小实验。 比如查询地址里包含“海口市”及“振兴路” 两个关键字的数据,一般时候可能会用

八路抢答器实验报告

电子工艺实习报告 1.实验内容: 学习电子工艺理论,包括焊接技术、常用器件和八路抢答器原理等等; 在练习板上进行焊接练习,包括至少四十个电阻(包括立式和卧式)、四十根导线(包括硬线和软线);根据所学内容和所给材料焊接八路抢答器并验收。 2.实验目的: 初步了解和学习电子工艺的相关知识理论,通过实际焊接提高动手能力,加深对知识的理解,为以后的专业学习打好基础。 3.焊接技术: ·电烙铁分为外热式、内热式、恒温式和吸锡器电烙铁,握法分为正握法、反握法、握笔法三种。镀锡防止氧化,使用后保持电烙铁清洁挂 锡,以防再次加热时出现氧化。 ·焊料:易熔的金属合金又称焊锡丝,特点是熔点比被焊物的熔点低,450度以上称硬焊料,450度以下称软焊料。作用是将被焊物连接在 一起。 ·焊剂包括松香、焊油、镪水等,作用是清除被焊物表面氧化物及杂质,保证焊锡及被焊物之间发生合金反应。 ·焊接工艺要求:焊接的机械强度要足够;焊接可靠,保证导电性能良好;焊点表面要光滑清洁,不能出现焊点表面粗糙、拉尖、毛刺等现 象。 ·操作要领:焊接时烙铁与引线、印制板、铜箔之间的接触位置关系; 焊接的温度和时间要掌握好;焊接时被焊物要固定;焊料使用要适量,将焊锡丝和电烙铁同时作用于被焊物两端,当焊料的扩散范围达到要 求后,迅速拿开烙铁和焊锡丝,拿开焊锡丝的时间不得迟于拿开烙铁 的时间;焊点重焊时必须与上次的焊锡一同溶化,并溶为一体时才能 把电烙铁移开;剪掉多余引线。 ·拆焊:依据情况分为用烙铁直接解焊、采用专用工具、采用吸锡烙铁或吸锡器、利用铜丝编织的屏蔽线电缆或较粗的多股导线用为吸锡材 料等方法。 4.对元器件焊接要求: 遵循先小后大,先低后高,先轻后重,先内后外的原则;电阻标记方向一致、高低一致;电容标记方向要容易看,先焊无极性电容再焊有极性的;二极管正负极性一致、高低一致;集成芯片先弄清引脚顺序,再焊对角然后依次从左到右从上到下焊起,时间不超过3秒。 5.元器件的装配工艺及绘制电路板图: ·元器件的插装方法分为卧式和立式; ·布局布线:布置均匀,密度一致,横平竖直,不许斜排或交叉重排,避免相互干扰; ·上下级输出输入要紧接。 6.工业生产焊接技术:包括浸焊、波峰焊、再流焊。 7.焊接技术的发展。 8.元器件介绍:

Android开发编码规范_Android教程

Android开发编码规范 1、java代码中不出现中文,最多注释中可以出现中文 2、局部变量命名、静态成员变量命名 只能包含字母,单词首字母出第一个外,都为大写,其他字母都为小写 3、常量命名 只能包含字母和_,字母全部大写,单词之间用_隔开 4、layout中的id命名 命名模式为:view缩写_模块名称_view的逻辑名称 view的缩写详情如下 LayoutView:lv RelativeView:rv TextView:tv ImageView:iv ImageButton:im Button:btn 5、activity中的view变量命名 命名模式为:逻辑名称+view缩写 建议:如果layout文件很复杂,建议将layout分成多个模块,每个模块定义一个moduleViewHolder,其成员变量包含所属view 6、strings.xml中的id命名 命名模式:activity名称_功能模块名称_逻辑名称/activity名称_逻辑名称 /common_逻辑名称 strings.xml中,使用activity名称注释,将文件内容区分开来 drawable中的图片命名 命名模式:activity名称_逻辑名称/common_逻辑名称 7、styles.xml:将layout中不断重现的style提炼出通用的style通用组件,放到styles.xml中; 8、使用layer-list和selector 9、图片尽量分拆成多个可重用的图片 10、服务端可以实现的,就不要放在客户端 11、引用第三方库要慎重,避免应用大容量的第三方库,导致客户端包非常大 12、处理应用全局异常和错误,将错误以邮件的形式发送给服务端

[MSSQL] - SELECT语句使用大全

SELECT语句使用大全 虽然 SELECT 语句的完整语法比较复杂,但是大多数 SELECT 语句都描述结果集的四个主要属性 1、结果集中的列的数量和属性。 2、从中检索结果集数据的表,以及这些表之间的所有逻辑关系。 3、为了符合 SELECT 语句的要求,源表中的行所必须达到的条件。不符合条件的行会被忽略。 4、结果集的行的排列顺序。 它的主要子句可归纳如下: SELECT select_list --描述结果集的列 INTO new_table_name --指定使用结果集来创建新表 FROM table_list --包含从中检索到结果集数据的表的列表[返回结果集的对象]。 [ WHERE search_conditions ] --WHERE 子句是一个筛选,它定义了源表中的行要满足 SELECT 语句的要求所必须达到的条件 [ GROUP BY group_by_list ] --根据 group_by_list 列中的值将结果集分成组[ HAVING search_conditions ] --结果集的附加筛选 [ ORDER BY order_list [ ASC | DESC ] ] --结果集的附加筛选 一、使用选择列表 1、使用 *号来选择所有列;使用“[表名|别名]。[字段]”选取特定的列。 2、AS 子句可用来更改结果集列的名称或为派生列分配名称,也可以使用空格代替 如: SELECT Name AS Name1,Name Name2 FROM Product ORDER BY Name ASC 3、使用 DISTINCT 消除重复项 如:select distinct [Year] from A 4、使用 TOP 和 PERCENT 限制结果集数量 TOP ( expression ) [ PERCENT ] [ WITH TIES ] --expression 数量、PERCENT按百分比返回数据、WITH TIES返回排序与最后一行并列的行。 如:获取成绩前三名的同学 select top 3 * from Score order by Num desc --不考虑成绩并列 select top 3 WITH TIES * from Score order by Num desc --可解决成绩并列的问题 5、选择列表中的计算值 选择的列不但可以包括数据表列,还可以包括计算值,这些结果集列被称为派生列。 计算并且包括以下运算: 对数值列或常量使用算术运算符或函数进行的计算和运算。如SUM(),

安卓开发实验报告

安卓开发实验报告 目录 一、页面跳转 二、长按图标抖动以及显示删除 一、页面跳转 功能:通过点击button实现2个activity之间的跳转。 1.设置监听器监听点击button 2.使用intent传输数据

完整代码 1.ui_test.java publicclass UI_Test extends Activity { @Override protectedvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/b31960000.html,yout.incident_activity_1); Button bt = (Button)findViewById(R.id.login); bt.setOnClickListener(new OnClickListener()); } class OnClickListener implements View.OnClickListener{ publicvoid onClick(View v){ EditText name = (EditText)findViewById(https://www.doczj.com/doc/b31960000.html,); EditText password = (EditText)findViewById(R.id.password); Bundle data=new Bundle(); data.putString("name", name.getText().toString()); data.putString("password", password.getText().toString()); Intent intent = new Intent(UI_Test.this,UI_Result.class); intent.putExtras(data); startActivity(intent); } } 2.ui_result.java publicclass UI_Result extends Activity { @Override protectedvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/b31960000.html,yout.incident_activity_2); TextView name = (TextView)findViewById(https://www.doczj.com/doc/b31960000.html,Show); TextView password = (TextView)findViewById(R.id.passwordShow); Intent intent=getIntent(); Bundle result = intent.getExtras(); name.setText("您的用户名为: "+result.getString("name")); password.setText("您的密码为: "+result.getString("password"));

第1节-基本的SQL-SELECT语句

基本的SQL-SELECT语句 1.查看表结构 sql>desc 表名称; 2.查询所有列 select * from 表名称; 3. 查询指定列 select 列名称1 ,列名称2 ,列名称3 from 表名称; 4.如何取消重复行 select distinct 列名称1 ,列名称2 from 表名称; 5. 使用算数表达式 ?显示每个雇员的年工资 select sal*13+nvl(comm,0)*13 "年工资",ename,comm from emp; 6. 使用列的别名 select ename "姓名",sal*12 as "年收入" from emp; 7.如何处理null值(空值不是空格或者0) 使用nvl函数来处理 8. 如何连接字符串(||) selectename || 'is a ' || job from emp; SQL语句分为以下三种类型: ●DML: Data Manipulation Language 数据操纵语言 ●DDL: Data Definition Language 数据定义语言 ●DCL: Data Control Language 数据控制语言

DML用于查询与修改数据记录,包括如下SQL语句: ●INSERT:添加数据到数据库中 ●UPDATE:修改数据库中的数据 ●DELETE:删除数据库中的数据 ●SELECT:选择(查询)数据 SELECT是SQL语言的基础,最为重要。 DDL用于定义数据库的结构,比如创建、修改或删除数据库对象,包括如下SQL语句: ●CREATE TABLE:创建数据库表 ●ALTER TABLE:更改表结构、添加、删除、修改列长度 ●DROP TABLE:删除表 ●CREATE INDEX:在表上建立索引 ●DROP INDEX:删除索引 DCL用来控制数据库的访问,包括如下SQL语句: ●GRANT:授予访问权限 ●REVOKE:撤销访问权限 ●COMMIT:提交事务处理 ●ROLLBACK:事务处理回退 ●SAVEPOINT:设置保存点 ●LOCK:对数据库的特定部分进行锁定

路抢答器实验报告

系别:电子工程系 班级:电子101 学号:23 姓名:李光杰 指导老师:佘明辉2011年6月23日星期四

八路智力竞赛抢答器设计 一.实验目的 掌握抢答器的工作原理及其设计方法。 学会用Multisim8软件操作实验内容。 掌握设计性试验的实验方法 二.实验要求 八路智力竞赛抢答器功能要求: 基本功能: 1.设计一个智力竞赛抢答器,可同时供8名选手或8个代表队参加比赛,他们的编号分别是0、1、2、3、4、5、6、7,各用一个抢答按钮,按钮的编号与选手的编号相对应,分别是S0、S1、S2、S3、S4、S5、S6、S7。 2.给节目主持人设置一个控制开关,用来控制系统的清零(编号显示数码管灭灯)和抢答的开始。 3.抢答器具有数据锁存和显示的功能。抢答开始后,若有选手按动抢答按钮,编号立即锁存,并在LED数码管上显示出选手的编号。此外,要封锁输入电路,禁止其他选手抢答。优先抢答选手的编号一直保持到主持人将系统清零为止。 扩展功能: 1.抢答器具有定时抢答的功能,且一次抢答的时间可以由主持人设定。当节目支持人按下“开始”按钮后,要求定时器立即倒计时,并在显示器上显示。 2.参赛选手在设定的时间内抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答时刻的时间,并保持到主持人将系统清零为止。 3.如果定时抢答的时间已到,却没有选手抢答,则本次抢答无效,系统封锁输入电路,禁止选手超时后抢答,时间显示器上显示00. 三.实验原理 根据对功能要求的简要分析,将定时抢答器电路分为主题电路和扩展电路两部分。主体电路完成基本的抢答功能,即开始抢答后,当选手按动抢答器按钮

SELECT语句练习题答案

SELECT 语句练习题 有下列四个表: 1、学生表 S_NO S_NAME S_SEX S_BIRTHDAY CLASS 108曾华男1905-5-2295033 105匡明男1905-5-1895031 107王丽女1905-5-795033 101李军男1905-5-995033 109王芳女1905-5-1895031 103陆君男1905-5-2095031 2、教师表 T_NO T_NAME TSEX T_BIRTHDAY PROF DEPART 804李诚男1958-12-2副教授计算机系856张旭男1969-3-12讲师电子工程系825王萍女1972-5-5助教计算机系831刘冰女1977-8-14助教电子工程系 3、课程表 C_NO C_NAME T_NO 3-105计算机导论825 3-245操作系统804 6-166数据电路856 9-888高等数学100 4、成绩表 S_NO C_NO DEGREE 1033-24586 1053-24575 1093-24568 1033-10592 1053-10588 1093-10576 1013-10564 1073-10591 1083-10578 1016-16685 1076-10679 1086-16681 Select 语句的最基本结构:Select …. From ….where order by:排序子句(ASC:升序,DESC:降序)

like:模式匹配(通配符:% 可以匹配任意类型和长度的字符; _ 任意单个字符。 聚合函数(SUM A VG、COUNT、COUNT(*)、MAX、MIN) GROUP BY:分组 1、查询Student表中的所有记录的S_NAME、S_SEX和Class列。 2、查询教师所有的单位即不重复的Depart列。 3、查询Student表的所有记录。 4、查询Score表中成绩在60到80之间的所有记录。 5、查询Score表中成绩为85,86或88的记录。 6、查询Student表中“95031”班或性别为“女”的同学记录。 7、以Class降序查询Student表的所有记录。 8、以C_NO升序、Degree降序查询Score表的所有记录。 9、查询“95031”班的学生人数。 10、查询Score表中的最高分的学生学号和课程号。 11、查询‘3-105’号课程的平均分。 12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。 13、查询最低分大于70,最高分小于90的S_NO列。 14、查询所有学生的S_NAME、C_NO和Degree列。 15、查询所有学生的S_NO、C_NAME和Degree列。 16、查询所有学生的S_NAME、C_NAME和Degree列。 17、查询“95033”班所选课程的平均分。 SQL语句练习题参考答案 1、select S_NAME,S_SEX,Class from Student; 2、select distinct depart from teacher; 3、select S_NO as '学号',S_NAME as '姓名',S_SEX as '性别',S_BIRTHDAY as'出生日期',Class as'班号'from student; 或 select S_NO as 学号,S_NAME as 姓名,S_SEX as 性别,S_BIRTHDAY as 出生日期,Class as 班号from student; 4、select * from score where degree between 60 and 80; 或select * from score where degree>=60 and degree<=80; 5、select * from score where degree in (85,86,88); 6、select * from student where class='95031'or S_SEX='女'; 7、select * from student order by class desc; 8、select * from score order by C_NO asc ,degree desc; 或select * from score order by C_NO ,degree desc; 9、select count(*) as CNT from student where class='95031'; 10、select S_NO as '学号',C_NO as '课程号', degree as '最高分' from score where degree=(select max(degree) from score) 11、select avg(degree)as 课程平均分from score where C_NO='3-105'; 12、select C_NO,avg(degree) from score where C_NO like'3%'group by C_NO having count(*) >5; 13、select S_NO from score group by S_NO having min(degree)>70 and max(degree)<90; 14、select student.S_NAME,score.C_NO,score.degree from student,score where student.S_NO=score.S_NO; 15、select x.S_NO,y.C_NAME,x.degree from score x,course y where x.C_NO=y.C_NO; 16、select x.S_NAME,y.C_NAME,z.degree from student x,course y,score z where x.S_NO=z.S_NO and z.C_NO=y.C_NO;

相关主题
文本预览
相关文档 最新文档