文档库 最新最全的文档下载
当前位置:文档库 › SQL Server 2008 的 Transact-SQL 语言增强

SQL Server 2008 的 Transact-SQL 语言增强

SQL Server 2008 的 Transact-SQL 语言增强
SQL Server 2008 的 Transact-SQL 语言增强

SQL Server 2008 的Transact-SQL 语言增强

作者:张洪举Microsoft MVP

应用于:SQL Server 2008

日期:2008/9/1

Microsoft SQL Server 2008 对Transact-SQL 语言进行了进一步增强,主要包括:ALTER DATABASE 兼容级别设置、复合运算符、CONVERT 函数、日期和时间功能、GROUPING SETS、MERGE 语句、SQL 依赖关系报告、表值参数和Transact-SQL 行构造函数。

1.ALTER DA TABASE 兼容级别设置

某些数据库行为与SQL Server 版本有关,通过ALTER DATABASE 下面新增的语法,可以设置数据库兼容级别,它取代了以前版本中的sp_dbcmptlevel 过程。

ALTER DATABASE database_name

SET COMPATIBILITY_LEVEL = { 80 | 90 | 100 }

可用的设置值80、90、100分别代表SQL Server 2000、2005和2008。

2.复合运算符

SQL Server 2008 现在支持如下复合运算符,可执行操作并将变量设置为结果。

运算符

操作

+=

将原始值加上一定的量,并将原始值设置为结果

-=

将原始值减去一定的量,并将原始值设置为结果

*=

将原始值乘上一定的量,并将原始值设置为结果

/=

将原始值除以一定的量,并将原始值设置为结果

%=

将原始值除以一定的量,并将原始值设置为余数

&=

^=

对原始值执行位异或运算,并将原始值设置为结果

|=

对原始值执行位或运算,并将原始值设置为结果

如:

DECLARE @x1 int = 27;

SET @x1 += 2 ;

SELECT @x1 -- 返回29

3.CONVERT 函数

CONVERT 函数现在允许在二进制和字符十六进制值之间进行转换。函数语法格式如下:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

expression 是被转换的有效的表达式,data_type 目标数据类型(不能使用别名数据类型),length 指定目标数据类型长度的可选整数,style 指定CONVERT 函数如何转换expression 的整数表达式。

如果expression 为binary(n)、varbinary(n)、char(n) 或varchar(n),则style 可以为下表中显示的值之一。

输出

0(默认值)

将ASCII 字符转换为二进制字节,或者将二进制字节转换为ASCII 字符。每个字符或字节按照1:1 进行转换。

如果data_type 为二进制类型,则会在结果左侧添加字符0x。

1, 2

对于style 1,将在转换后的结果左侧添加字符0x。作为要转换的二进制表达式,字符0x 必须为表达式中的前两个字符。

在style为2的情况下,生成的二进制值不会包含字符0x。作为要转换的二进制表达式,也不需要在字符前面包含字符0x。

如果data_type 为二进制类型,则表达式必须为字符表达式。

如果转换后的表达式长度大于data_type 长度,则会在右侧截断结果。

如果固定长度data_types 大于转换后的结果,则会在结果右侧添加零。

如果data_type 为字符类型,则表达式必须为二进制表达式。每个二进制字符均转换为两个十六进制字符。如果转换后的表达式长度大于data_type 长度,则会在右侧截断结果。

如果data_type 为固定大小的字符类型,并且转换后的结果长度小于其data_type 长度,则会在转换后的表达式右侧添加空格,以使十六进制数字的个数保持为偶数。

参考下面的示例代码:

--转换二进制值0x4E616d65 到一个字符值

SELECT CONVERT(char(8), 0x4E616d65, 0) AS 'Style 0, 二进制到字符'

--下面的示例演示了Style 为1 的情况下,如何强行截断结果值。

--产生的结果值由于包含字符0x ,所以被截断

SELECT CONVERT(char(8), 0x4E616d65, 1) AS 'Style 1, 二进制到字符'

--下面的示例演示了Style 为2 的情况下,没有截断结果值。

--这是因为0x 字符未包含在结果中

SELECT CONVERT(char(8), 0x4E616d65, 2) AS 'Style 2, 二进制到字符'

--转换字符值Name 到一个二进制值

SELECT CONVERT(binary(8), 'Name', 0) AS 'Style 0, 字符到二进制'

SELECT CONVERT(binary(4), '0x4E616D65', 1) AS 'Style 1, 字符到二进制'

SELECT CONVERT(binary(4), '4E616D65', 2) AS 'Style 2, 字符到二进制'

结果如下:

4.日期和时间功能

DA TEPART ( datepart , date )函数用于返回date中的指定datepart 的整数。如:

SELECT DA TEPART(YEAR,'2007-05-10') --返回2007

SQL Server 2008 包含对ISO 周-日期系统的支持,即周的编号系统。每周都与该周内星期四所在的年份关联。例如,2004 年第 1 周(2004W01) 从2003 年12 月29 日星期一到2004 年 1 月 4 日星期天。一年中最大的周数可能为52 或53。这种编号方式通常用于欧洲国家,但其他国家/地区很少用到。

下面分别是2010年和2009年1月份的日历。由于2010年第一个星期中的星期四是2010-1-7日,所以2010-1-3日及之前的日期会作为2009年的第53个星期,而不是2010年的第一个星期。而对于2009年1月份的日历,由于星期四是2009-1-1,所以该星期会作为2009年的第一个星期。当然,该星期也包含了2008-12-28至31的4天。

参考下面的代码:

SELECT DA TEPART(ISO_WEEK,'2010-1-3') --返回53

SELECT DA TEPART(ISO_WEEK,'2010-1-4') --返回1

SELECT DA TEPART(ISO_WEEK,'2009-1-1') --返回1

5.ROLLUP、CUBE 和GROUPING SETS

在SQL Server 2008之前,进行分组统计汇总,可以在GROUP BY子句中使用WITH ROLLUP和WITH CUBE参数。ROLLUP指定在结果集内不仅包含由GROUP BY提供的行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。而CUBE参数则在使用ROLLUP参数所返回结果集的基础上,再将每个可能的组和子组组合在结果集内返回。

例如,假设dbo.T1表中存在下列数据:

执行下面的查询语句:

SELECT CustName,ProductID,SUM(Sales) AS 'SalesTotal'

FROM dbo.T1

GROUP BY CustName,ProductID

WITH CUBE

ORDER BY CustName,ProductID;

SELECT CustName,ProductID,SUM(Sales) AS 'SalesTotal'

FROM dbo.T1

GROUP BY CustName,ProductID

WITH ROLLUP

ORDER BY CustName,ProductID;

得到下面的结果集合,可以看出,使用WITH CUBE多出了对子组ProductID的两行汇总。

而在SQL Server 2008中,GROUPING SETS、ROLLUP 和CUBE 运算符已添加到GROUP BY 子句中。不再推荐使用不符合ISO 的WITH ROLLUP、WITH CUBE 和ALL 语法。在SQL Server 2008中,可以将上面的WITH CUBE语句改写为如下的形式:

SELECT CustName,ProductID,SUM(Sales) AS 'SalesTotal'

FROM dbo.T1

GROUP BY CUBE(CustName,ProductID)

ORDER BY CustName,ProductID;

如果不需要获得由完备的ROLLUP 或CUBE 运算符生成的全部分组,则可以使用GROUPING SETS 仅指定所需的分组。例如,下面的语句将得到分别按CustName和ProductID分组汇总结果集的并集。

SELECT CustName,ProductID,SUM(Sales) AS 'SalesTotal'

FROM dbo.T1

GROUP BY GROUPING SETS(CustName,ProductID)

ORDER BY CustName,ProductID;

结果集如下:

上面的语句等同于下面的UNION ALL语句:

SELECT CustName,NULL AS ProductID,SUM(Sales) AS 'SalesTotal'

FROM dbo.T1

GROUP BY CustName

UNION ALL

SELECT NULL AS CustName,ProductID,SUM(Sales) AS 'SalesTotal'

FROM dbo.T1

GROUP BY ProductID

6.MERGE 语句

在SQL Server 2008 中,可以使用MERGE 语句在一条语句中根据与源表联接的结果对目标表执行INSERT、UPDA TE 或DELETE 操作。如:使用一个语句有条件地在单个目标表中插入或更新行,如果目标表中存在相应行,则更新一个或多个列;否则,会将数据插入新行。使用该语句还可以同步两个表,根据与源数据的差别在目标表中插入、更新或删除行。

MERGE 语法包括如下五个主要子句:

MERGE 子句用于指定作为插入、更新或删除操作目标的表或视图。

USING 子句用于指定要与目标联接的数据源。

ON 子句用于指定决定目标与源的匹配位置的联接条件。

WHEN 子句用于根据ON 子句的结果指定要执行的操作。

OUTPUT 子句针对更新、插入或删除的目标对象中的每一行返回一行。

其完整的语法格式如下:

[ WITH [,...n] ]

MERGE

[ TOP ( expression ) [ PERCENT ] ]

[ INTO ] target_table [ WITH ( ) ] [ [ AS ] table_alias ]

USING

ON

[ WHEN MATCHED [ AND ]

THEN ]

[ WHEN NOT MATCHED [ BY TARGET ] [ AND ] THEN ]

[ WHEN NOT MATCHED BY SOURCE [ AND ] THEN ]

[ ]

[ OPTION ( [ ,...n ] ) ]

使用下面的语句创建两个表:

USE AdventureWorks;

GO

IF OBJECT_ID (N'dbo.Purchases', N'U') IS NOT NULL

DROP TABLE dbo.Purchases;

GO

CREATE TABLE dbo.Purchases (

ProductID int, CustomerID int, PurchaseDate datetime,

CONSTRAINT PK_PurchProdID PRIMARY KEY(ProductID,CustomerID)); GO

INSERT INTO dbo.Purchases V ALUES(707, 11794, '20060821'),

(707, 15160, '20060825'),(708, 18529, '20060821'),

(712, 19072, '20060821'),(870, 15160, '20060823'),

(870, 11927, '20060824'),(870, 18749, '20060825');

GO

IF OBJECT_ID (N'dbo.FactBuyingHabits', N'U') IS NOT NULL

DROP TABLE dbo.FactBuyingHabits;

GO

CREATE TABLE dbo.FactBuyingHabits (

ProductID int, CustomerID int, LastPurchaseDate datetime,

CONSTRAINT PK_FactProdID PRIMARY KEY(ProductID,CustomerID)); GO

INSERT INTO dbo.FactBuyingHabits V ALUES(707, 11794, '20060814'), (707, 18178, '20060818'),(864, 14114, '20060818'),

(870, 17151, '20060818'),(870, 15160, '20060817'),

(871, 21717, '20060817'),(871, 21163, '20060815'),

(871, 13350, '20060815'),(873, 23381, '20060815');

GO

两个表中的数据如下图所示:

请注意,这两个表中有两个共有的产品-客户行:客户11794 购买了产品707,客户15160 购买了产品870。对于这些行,可以使用WHEN MATCHED THEN 子句利用Purchases 中这些购买记录的日期来更新FactBuyingHabits。我们可以使用WHEN NOT MA TCHED THEN 子句将所有其他行插入FactBuyingHabits。参考下面的语句:

MERGE dbo.FactBuyingHabits AS Target

USING (SELECT CustomerID, ProductID, PurchaseDate FROM dbo.Purchases) AS Source

ON (Target.ProductID = Source.ProductID AND Target.CustomerID = Source.CustomerID)

WHEN MA TCHED THEN

UPDA TE SET https://www.wendangku.net/doc/612100189.html,stPurchaseDate = Source.PurchaseDate

WHEN NOT MA TCHED BY TARGET THEN

INSERT (CustomerID, ProductID, LastPurchaseDate)

V ALUES (Source.CustomerID, Source.ProductID, Source.PurchaseDate)

OUTPUT $action, Inserted.*, Deleted.*;

$action用于在OUTPUT 子句中指定一个nvarchar(10) 类型的列,列的值是代表所执行操作的INSERT、UPDA TE或DELETE。Inserted.*和Deleted.*分别用于指定返回所有插入行的列和删除行的列。如果要指定具体的列,可以使用Inserted.ProductID这样的命名方式。

上面语句的输出结果如下:

再查询FactBuyingHabits表,可以看到被更新和插入后的结果,如下所示:

7.SQL 依赖关系报告

SQL Server 2008 引入了新的目录视图和系统函数用以提供一致可靠的SQL 依赖关系报告。所谓依赖关系,通俗的讲:存储过程1需要使用存储过程2提供的结果,它们之间就是一种依赖关系。可以使用sys.sql_expression_dependencies、sys.dm_sql_referencing_entities 和sys.dm_sql_referenced_entities 来报告架构绑定和非架构绑定对象的跨服务器、跨数据库和数据库SQL 依赖关系。

下例将创建一个表、一个视图和三个存储过程。这些对象将用在后面的查询中以演示如何报告依赖关系信息。可看到MyView 和MyProc3 均引用Mytable。MyProc1 引用MyView,而MyProc2 引用MyProc1。

USE AdventureWorks;

GO

-- Create entities

CREATE TABLE dbo.MyTable (c1 int, c2 varchar(32));

GO

CREATE VIEW dbo.MyView

AS SELECT c1, c2 FROM dbo.MyTable;

GO

CREATE PROC dbo.MyProc1

AS SELECT c1 FROM dbo.MyView;

GO

CREATE PROC dbo.MyProc2

AS EXEC dbo.MyProc1;

GO

CREATE PROC dbo.MyProc3

AS SELECT * FROM AdventureWorks.dbo.MyTable;

EXEC dbo.MyProc2;

GO

下面的示例查询sys.sql_expression_dependencies 目录视图以返回由MyProc3 引用的实体。

USE AdventureWorks;

GO

SELECT OBJECT_NAME(referencing_id) AS referencing_entity_name

,referenced_server_name AS server_name

,referenced_database_name AS database_name

,referenced_schema_name AS schema_name

, referenced_entity_name

FROM sys.sql_expression_dependencies

WHERE referencing_id = OBJECT_ID(N'dbo.MyProc3');

GO

下面是结果集:

referencing_entity server_name database_name schema_name referenced_entity

------------------ ----------- ------------- ----------- -- ---------------

MyProc3 NULL NULL dbo MyProc2

MyProc3 NULL AdventureWorks dbo MyTable

上面的查询返回了两个在MyProc3 定义中按名称引用的实体。服务器名称为NULL,因为被引用实体没

中是使用由三部分组成的有效名称定义此实体的。

8.表值参数

数据库引擎引入了可以引用用户定义表类型的新参数类型。表值参数可以将多个数据行发送到SQL Server 语句或例程(比如存储过程或函数),而不用创建临时表。表值参数具有更高的灵活性,在某些情况下,可比临时表或其他传递参数列表的方法提供更好的性能。表值参数具有以下优势:

首次从客户端填充数据时,不获取锁。

提供简单的编程模型。

允许在单个例程中包括复杂的业务逻辑。

减少到服务器的往返。

可以具有不同基数的表结构。

是强类型。

使客户端可以指定排序顺序和唯一键。

与其他参数一样,表值参数的作用域也是存储过程、函数或动态Transact-SQL 文本。同样,表类型变量也与使用DECLARE 语句创建的其他任何局部变量一样具有作用域。

与BULK INSERT操作相比,频繁使用表值参数将比大型数据集要快。大容量操作的启动开销比表值参数大,与之相比,表值参数在插入数目少于1000 的行时具有很好的执行性能。

下面是SQL Server帮助中的示例,演示了如何执行以下操作:创建表值参数类型,声明变量来引用它,填充参数列表,然后将值传递到存储过程。

USE AdventureWorks;

GO

/* 创建一个table类型*/

CREATE TYPE LocationTableType AS TABLE

( LocationName V ARCHAR(50)

, CostRate INT );

/* 创建一个存储过程,用于从表值参数接收数据*/ CREATE PROCEDURE usp_InsertProductionLocation @TVP LocationTableType READONL Y

AS

SET NOCOUNT ON

INSERT INTO [AdventureWorks].[Production].[Location] ([Name]

,[CostRate]

,[Availability]

,[ModifiedDate])

SELECT *, 0, GETDATE()

FROM @TVP;

GO

/* 定义一个引用表值类型的变量*/

DECLARE @LocationTVP

AS LocationTableType;

/* 添加数据到表值变量*/

INSERT INTO @LocationTVP (LocationName, CostRate) SELECT [Name], 0.00

[AdventureWorks].[Person].[StateProvince];

/* 传递表值变量数据给存储过程*/

EXEC usp_InsertProductionLocation @LocationTVP;

GO

9.Transact-SQL 行构造函数

增强后的Transact-SQL 可以允许将多个值插入单个INSERT 语句中,语法比较简单。参考下面的代码:/* 创建一个表*/

CREATE TABLE dbo.T1(

CustName char(20) ,

ProductID int ,

MadeFrom char(20) ,

Sales numeric(20, 2)

)

/* 插入2行数据*/

INSERT INTO dbo.T1

V ALUES ('Jane',1,'China',20.00),

('Jack',2,'USA',10.00)

本文来自CSDN博客,转载请标明出处:https://www.wendangku.net/doc/612100189.html,/zhanghongju/archive/2008/09/03/2871565.aspx

C语言上机作业题及答案

实验一: 1、已知华氏温度,根据转换公式计算相应的摄氏温度。 摄氏温度= 5*(华氏温度-32)/9 2.任意输入一个有五位数字的正整数,逆序输出每一数位上的数字。 如: 输入 12345 输出 5 4 3 2 1 #include"stdio.h" main() { double t,T; printf ("已知华氏温度,根据转换公式计算相应的摄氏温度"); scanf ("%lf",&t); T=(5*(t-32)/9); printf ("摄氏温度=%lf",T); } #include"stdio.h" main() { int value,a,b,c,d,e,m,n,h; printf ("任意输入一个有五位数字的正整数,逆序输出每一数位上的数字"); scanf ("%d",&value); a=value/10000; m=value%10000; b=m/1000; n=m%1000; c=n/100; h=n%100; d=h/10; e=h%10; printf ("%d%d%d%d%d",e,d,c,b,a); } 实验二: 1.一个成年人的身高与其父母的身高密切相关,根据以下人体标准身高预测公式计算自己或某个同学的身高,并跟实际身高比较,给出结论是否符合该公式(误

差在3厘米范围内即视为相符)。 男性身高=(父亲身高+母亲身高)×1.08÷2(厘米) 女性身高=(父亲身高×0.923+母亲身高)÷2(厘米) 2.从键盘上输入税前收入,根据以下公式及规则,计算个人所得税税额并输出。应纳个人所得税税额=(税前收入—起征点额度)*适用税率—速算扣除数 其中,起征点额度是3500元,其他如下: 应纳税所得额税率速算扣除数 不超过1500元的部分 3% 0 超过1500元至4500元的部分 10% 105 超过4500元至9000元的部分 20% 555 超过9000元至35000元的部分 25% 1005 超过35000元至55000元的部分 30% 2755 超过55000元至80000元的部分 35% 5505 超过80000的部分 45% 13505 如:某人月收入5000元,则应纳个人所得税税额为(5000-3500)* 10% - 105 = 45元。 #include #include main() { float A,a,H,h,b; printf("父亲身高(厘米)\n"); scanf("%f",&A); printf("母亲身高(厘米)\n"); scanf("%f",&a); printf("孩子实际身高(厘米)\n"); scanf("%f",&H); printf("请选择孩子性别:女=0,男=1\n"); scanf("%f",&b); if(b) h=(A+a)*1.08/2; else h=(A*0.923+a)/2; if(fabs(H-h)<=3) printf("实际身高符合该公式\n"); else

C语言上机作业试题5套含答案

第一次上机作业(2014): 要求: ?独立完成,上机调试通过后上交 ?作业提交邮箱: ?邮件主题命名:班级学号姓名(第1次作业), 例如:电1301班2王鹏(第1次作业) ?以附件形式将每次作业的所有程序源程序压缩打包后提交,压缩文件命名格式同上。 ?程序必须采用缩进格式 1.大写字母转换成小写字母 从键盘输入一个大写英文字母,输出相应的小写字母。 例:输入G 输出g 2.求平方根 输入一个实数x,计算并输出其平方根(保留1 位小数)。 例:输入17 输出The square root of 17.0 is 4.1 3.温度转换 设计一个程序将华氏温度转换成摄氏温度c = 5/9(f-32) a)输入华氏温度(实型) b)输出的摄氏温度结果保留两位小数 例:Please input Fahrenheit temperature: 76.8 The corresponding Celsius temperature is 24.89 4. 计算旅途时间 输入二个整数time1 和time2,表示火车的出发时间和到达时间,计算并输出旅途时间。 (输入的有效的时间范围是0000 到2359,不需要考虑出发时间晚于到达时间的情况。) 例:输入712 1411 (出发时间是7:12,到达时间是14:11) 输出The train journey time is 6 hours 59 minutes. 5. 数字加密 输入一个四位数,将其加密后输出。方法是将该数每一位上的数字加9,然后除以10 取余,做为该位上的新数字,最后将第1 位和第3 位上的数字互换,第2 位和第4 位上的数字互换,组成加密后的新数。 例:输入1257 输出The encrypted number is 4601 思考题:你能否编程找出谁做的好事? 有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。 ?A说:不是我。 ?B说:是C。 ?C说:是D。 ?D说:他胡说。 已知三个人说的是真话,一个人说的是假话。现在要根据这些信息,找出做了好事的人。 第二次上机作业(2014): 要求: ?独立完成,程序必须采用缩进格式,上机调试通过后上交

扬州大学C语言上机作业1-9整理

答案仅供参考 实验一 4.设计main函数实现从键盘上输入两个整型变量a、b的值,交换它们的值并输出。#include void main() { int a,b,c; printf("enter first integer : "); scanf("%d",&a); printf("enter second integer : "); scanf("%d",&b); c=a; a=b; b=c; printf("%d,%d\n",a,b); getch(); } 5.设计main函数实现从键盘上输入两个整型变量a、b的值,并将b的值加入到a中,输出a的值。 #include void main() { int a,b,c; printf("enter first integer : "); scanf("%d",&a); printf("enter second integer : "); scanf("%d",&b); c=a+b; a=c; printf("a=%d,b=%d\n",a,b); getch(); } 6.从键盘输入整数x的值,根据公式y=x3+3x2+x-10求y的值,输出x和y的值。 #include void main() { int x,y; printf("enter first integer : "); scanf("%d",&x); y=x*x*x+3*x*x+x-10;

printf("x=%d,y=%d\n",x,y); getch(); } 实验二 1.编写程序,从键盘上输入一个整数(例如560)表示分钟,将其换算成用小时和分钟表示,然后输出至屏幕。 #include void main() { int a,b,hour,min; printf("enter first integer : "); scanf("%d",&a); b=60; hour=a/b; min=a%b; printf("hour=%d,min=%d\n",hour,min); getch(); } 2.编写程序,输入两个整数(例如1500和350),求出它们的商和余数并进行输出。 #include void main() { int a,b,c,d; a=1500,b=350; c=a/b; d=a%b; printf("%d,%d",c,d); getch(); } 3.编写程序,读入3个整数给分别变量a,b,c,然后将a,b,c的值输出到屏幕,再交换它们中的数值,把a中原来的值给b,把b中原来的值赋给c,把c中原来的值赋给a,然后再次输出a,b,c的值到屏幕。 #include void main() { int a,b,c,d; printf("enter first integer : "); scanf("%d",&a);

C语言期末上机考试题及答案

C语言上机考试题—01 1. //#include #include double fun( int n ) { double sum=0,a=1; for(;n>0;n--,a++) sum=sum+1/(a*(a+1)); return sum; } main() { // clrscr(); printf("%f\n", fun(10)); } 2. #include main() { int k,m,s=0,i,b=0; for(k=10000;k<=20000;k++ ) { if(k%10==7) { for(i=2,b=0;i main() { int a; printf("请输入一个需要判 断的年份:\n"); scanf("%d",&a); if(a%4==0&&a%100!=0) printf("是闰年\n"); else if(a%400==0) printf("是闰年 \n"); else printf("不是闰 年\n"); } C语言上机考试题—02 1. //#include #include double fun( int n ) { double sum=0,a=1; for(;n>0;n--,a++) sum=sum+1/(a*(a+1)); return sum; } main() { // clrscr(); printf("%f\n", fun(10)); } 2. #include fun(int n) { int i,j=0; for(i=2;i #include main() { char str[81]; int i,j=0,w=1,s=0; printf("请输入一串字符: \n"); gets(str); for(i=0;i

大连理工c语言第五次上机作业参考答案

第五次上机作业:(请用指针实现) 1.数据移位 有n(n<=10)个整数,使前面各数顺序向后移m(m<=n)个位置,最后m 个数变成最前面的m个数,如图所示。编写函数shift(a,n,m)实现上述功能,在主函数中输入n个整数和输出调整后的n个数。 SAMPLE OUTPUT Input n(n<=10):10 Input 10 integers:1 2 3 4 5 6 7 8 9 10 Output the original:1 2 3 4 5 6 7 8 9 10 Input m(m<=10):4 Output the shifted:7 8 9 10 1 2 3 4 5 6 #include #define N 10 void shift(int a[ ],int n,int m); void main( ) { int i,n,m; int a[N]; printf("Input n(n<=10):"); scanf("%d",&n); printf("Input %d integers:\n",n); for(i=0;i=0;j--) a[j+1]=a[j]; a[0]=t; } } n

c语言上机考试训练题库及答案

上机考试习题集 1.编写程序,一次输入5个学生的3门课成绩,每输入一个学生的3门成绩后,立即统计并输出该学生的总分和平均分。 #include "stdio.h" void main() { int score[5][3], i,j; float sum[5],average[5]; printf("请分别输入三个学生的成绩:\n"); for(i=0;i<5;i++) { sum[i]=0; for(j=0;j<3;j++) {scanf("%d",&score[i][j]); average[i]=0; sum[i]+=score[i][j]; average[i]=sum[i]/5; } } for(i=0;i<5;i++) printf("第%d个学生的总分为:%f,平均成绩为:%f\n",i+1,sum[i],average[i]); } 2 、编写程序,提示用户从键盘输入一个double类型的数,使该数保留小数点后两位,对第三位小数进行四舍五入处理,然后在显示器上输出此数,以便验证处理是否正确。 #include #include double rounding(double x,int n); void main() { double x,x1; int n; printf("请输入一个浮点数:\n"); scanf("%lf",&x); printf("请输入给定的小数位:\n"); scanf("%d",&n); x1=rounding(x,n); printf("圆整后的数为:\n%.*lf\n",n,x1); } double rounding(double x,int n)

c语言上机模拟题1

1.按照计算机应用领域分类,学校使用的成绩管理系统属于_______。 A. 实时控制 B. 计算机辅助设计 C. 数据处理 D. 科学计算 参考答案:C 2.下面关于计算机系统的叙述中,完整的计算机系统通常是指______。 A. 计算机的硬件系统 B. 计算机上配置的操作系统 C. 计算机的软件系统 ! D. 由硬件系统和软件系统组成 参考答案:D 3.微型计算机的微处理芯片上集成的主要组件包括______。 A. 控制器和运算器 B. 内存和控制器 C. 控制器和存储器 D. 运算器和I/O接口 参考答案:A 的对话框窗口不可以______。 A. 关闭

【 B. 移动 C. 任意改变大小 D. 最小化 参考答案:C 5.某用户在域名为的邮件服务器上申请了一个账号,账号名为xing,那么该用户的电子邮件地址为______。 A. xing%参考答案:D 6.下列对C语言程序的描述中,正确的是_______。 A. C语言程序总是从第一个定义的函数开始执行 B. C语言程序总是从最后一个定义的函数开始执行 C. C语言程序总是从main()函数开始执行 < D. C语言程序中的main()函数必须放在程序的开始部分 参考答案:C 7.设有char ch='\\';,则变量ch包含______个字符。 A. 1 B. 2 C. 3 D. 4 参考答案:A 8.以下选项中合法的字符常量是____________。 A. '\101' {

B. '\97' C. '\xyz' D. '\019' 参考答案:A 9.下面用户标识符中合法的是____________。 A. iPhone# B. 13a C. char D. _int 参考答案:D ( 10.已知int c1=5,c2=2,c3;,则执行c3=c1/c2后,c3的值是 _______。 A. 5 B. C. 3 D. 2 参考答案:D 11.设有定义int b=0;,表达式_______与其它表达式的值不相同。 A. b+=1 B. b++ C. ++b

C语言上机试题答案

//vc1 //prog1.cpp //设计一个程序,从键盘输入三个整数,按由小到大的顺序输出。#include"stdio.h" main() { int a[3],i,j,t; for(i=0;i<3;i++) { scanf("%d",&a[i]); } for(i=0;i<9;i++) /*此处的i可以小于任意一个大于6的整数*/ { for(j=0;j<2;j++) { if(a[j]>a[j+1]) t=a[j],a[j]=a[j+1],a[j+1]=t; } } printf("The three data from small to big is:"); for(i=0;i<3;i++) printf("%d ",a[i]); } //vc1 //prog2.cpp //求1+3+5+...+95+97+99的和。 #include"stdio.h" main() { int i,sum=0; for(i=1;i<100;i=i+2) sum+=i; printf("1+3+5+....+99=%d\n",sum); } //vc1 //prog3.cpp //写一个函数,从键盘输入一个整数,如果该整数为素数,则输出“此

整数为素数”,否则输出“整数非素数”。(注:要求从主函数输入整数)#include"stdio.h" main() { int i,j,k,l=2; printf("输入一个大于3的整数:"); scanf("%d",&i); for(j=2;j=0;i--) printf("%d ",a[i]); for(i=0;i<10;i++) sum+=a[i]; printf("The total is:%d\n",sum); } //vc2 //prog2.cpp //输入N个国家的英文名,要求按字母的先后顺序排列,并按照顺序输出。

C语言上机题及答案

C语言程序设计上机题 编写函数实现从键盘输入一个字符串,再将其逆序输出。 #include //宏定义 #include //调用string库函数 void main() { int i,n; char a[30]; //定义字符型数组 gets(a); //输入字符串 n=strlen(a); //调用strlen函数,测量字符串长度 for(i=n;i>=0;i--) //通过for循环倒序输出 printf("%c ",a[i]); printf("\n"); } 编写函数求出10!的值并输出。 #include //宏定义 void main() { unsigned int a,num=1; for(a=1;a<=10;a++) //for循环求出10的阶乘 num=num*a; printf("%d\n",num); //输出所求值 } 编写函数实现10个元素数组的平均值,并在主函数输出。 #include //宏定义 float dy(int *a,int n) // 子函数, { float sum=0,p; int i; for(i=0;i<10;i++) //for循环求数组和 sum=*(a+i)+sum; // 数组指针 p=sum/10.0; // 求平均数 return p; // 返回平均数P的值 } void main() { int i,a[10]; for(i=0;i<10;i++) //for循环输入数组的十个数字scanf("%d",&a[i]); printf("%f\n",dy(a,10)); // 输出子函数返回的平均值}

C语言上机试题及答案

实验一 Visual C++6.0的使用及顺序结构程序设计 一、实验目的 1、掌握启动和退出VC6的方法。 2、熟悉VC6开发环境。 3、初步掌握简单程序的上机操作基本步骤,熟悉C单文件程序的输入、编译、链接和运行过程。 4、初步掌握程序的编辑修改和调试。 5、熟练使用赋值运算、算术运算等表达式。 6、熟练使用标准输入、输出函数及各种数据类型的格式说明符。 二、实验内容 1、下面C语言程序,其功能是显示字符串“欢迎同学们来到华北水院计算中心!”。 请同学们按照下面的实验指导学习VisualC++6.0的使用。 1.启动VisualC++6.0开发环境 (1)单击“开始”按钮,选择“程序” ——〉“Microsoft Visual Studio 6.0菜单项,单击“MicrosoftVisualC++6.0”,屏幕出现标题为“当时的提示”的窗口。 (2)单击“结束”按钮,关闭窗口,进入VC6.0开发环境的主窗口。 2.使用Visual C++6.0对一个C程序进行编辑、编译、连接和运行。 ⑴分析 Visual C++6.0中程序的开发过程与其它高级语言的开发过程相仿,都要经过编辑、编译、连接和运行四个步骤。 ⑵步骤 ①编辑

图1-1 New对话框 编辑是将C源程序输入计算机的过程。在Visual C++6.0主界面下,点击File菜单,选择New菜单项,即可出现New对话框,如图1-1所示。在弹出窗口中的Files标签页下,选择C ++ Source File。在选项卡右面的File编辑框里输入文件名如“Exa.c”,在Location编辑框里输入文件路径,如“d:\test”。点击OK按钮。将出现编辑窗口,如图1-2所示。在图1-2所示的 右端编辑窗口里输入以下C源程序并保存文件。 图1-2 编辑窗口 ②编译 编译是使用系统提供的编译器将文本文件Exa.c生成机器语言的过程,结果为Exa.obj,由 于没有得到系统分配的绝对地址,还不能直接运行,如图1-3所示。选择Build菜单下的Co mpile Exa.c,计算机将完成对当前源程序的编译。按提示建立默认工程空间。编译无错时,将源程序Exa.c编译为目标文件Exa.obj。编译结果如图1-4所示。如果出现运行错误,应该分析错误的原因,例如,是输入数据错误,还是代码错误;如果需要修改源程序文件,还需重 新编译、链接和执行。改正编译窗口下方指出的两个错误,直至编译成功,如图1-5所示。

历年全国计算机等级考试-二级C语言上机考试题库及答案

1.填空 给定程序的功能是调用fun函数建立班级通讯录。通讯录中记录每位学生的编号,姓名和电话号码。班级的人数和学生的信息从键盘读入,每个人的信息作为一个数据块写到名为myfile5.dat的二进制文件中。 请在程序的下划线处填入正确的内容并把下划线删除,是程序得出正确的结果。 注意:源程序存放在考生文件夹下的BLANK1.c中 不得增行或删行,也不得更改程序的结构! void check(); /**********found**********/ int fun(___1___ *std) { /**********found**********/ ___2___ *fp; int i; if((fp=fopen("myfile5.dat","wb"))==NULL) return(0); printf("\nOutput data to file !\n"); for(i=0; i

二级C语言上机题库及答案

第一套题 上机填空: #include double fun(double e) { int i, k; double s, t, x; s=0; k=1; i=2; /**********found**********/ x=__1__/4; /**********found**********/ while(x __2__ e) { s=s+k*x; k=k* (-1); t=2*i; /**********found**********/ x=__3__/(t*t); i++; } return s; } main() { double e=1e-3; printf("\nThe result is: %f\n",fun(e)); 第一处答案:3.0 第二处答案:> 第三处答案:(2*i+1)或者(t+1) 上机改错题: #include /************found************/ void fun ( int n )

{ int a, b, c, k; double s; s = 0.0; a = 2; b = 1; for ( k = 1; k <= n; k++ ) { /************found************/ s = s + (Double)a / b; c = a; a = a + b; b = c; } return s; } main( ) { int n = 5; printf( "\nThe value of function is: %lf\n", fun ( n ) ); } 第一处改错:将:void fun ( int n ) 改为double fun ( int n ) 第二处改错:s = s + (Double)a / b; 改为s = s + (double)a / b; 第二套题 上机填空题 #include double fun(int n) { int i; double s, t; /**********found**********/ s=__1__; /**********found**********/ for(i=1; i<=__2__; i++) { t=2.0*i; /**********found**********/ s=s+(2.0*i-1)*(2.0*i+1)/__3__; } return s; } main() { int n=-1; while(n<0) { printf("Please input(n>0): "); scanf("%d",&n); }

c语言上机题库(试题+答案)

1选择题答案:1、D 2、D 3.D 4,A 5.B 6.D 7.C 8.D 9.C 10.A 11.B 12.A 13.B 14.D 15.B 16.B 17.C 18.A 19.A 20.C 一、选择题(共20题,每题2分,共40分) 1、有以下定义: int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12} int (*ptr)[3]=a,*p=a[0]; 则下列能够正确表示数组元素a[1][2]的表达式是()。 A)*((*ptr+1)[2])B)*(*(p+5)) C)(*ptr+1)+2 D)*(*(a+1)+2) 2、# include void main ( ) { int a[3][3]={1,2,3,4,5,6,7,8,9}; int s=0,i; for (i=0;i<3;i++) s+=(*(a+i))[i]; printf("%d",s); } A)9 B)12 C)14 D)15 3、设有说明语句:char a= '\123abc';则变量a ( ) A) 包含7个字符B) 包含6个字符 C) 包含5个字符D) 包含4个字符 4、有以下程序段 int k=0 while(k=1)k++; while 循环执行的次数是( ) A) 无限次 B) 有语法错,不能执行 C) 一次也不执行 D) 执行1次 5、在C语言中,()。 A)函数定义可以嵌套,但函数调用不能嵌套 B)函数定义不可以嵌套,但函数调用可以嵌套 C)函数定义和调用均不能嵌套 D)函数定义和调用均可以嵌套 6、以下叙述正确的是() A)do-while语句构成的循环不能用其它语句构成的循环代替。 B)do-while语句构成的循环只能用break语句退出。 C)用do-while语句构成的循环,在while后的表达式为非零时结束循环。 D)用do-while语句构成的循环,在while后的表达式为零时结束循环。 7、若有声明语句char ch=’a’,*pc=&ch;以下语句中,有语法错误的 是。

C语言上机练习题及答案

1输入三个整数x,y,z,把这三个数由小到大输出。 # include void main() { int x,y,z,a; scanf ("%d,%d,%d",&x,&y,&z); if(x>y) {a=x; x=y;y=a; } if(x>z) { a=x; x=z; z=a; } if(y>z) {a=y; y=z; z=a; } printf("%d,%d,%d\n",x,y,z); } 2输入圆的半径,输出圆的周长和面积。 # include # define PI 3.1415926 # define S ==PI*r*r # define V (4.0/3)*PI*r*r*r void main() { double r; printf("please input r:"); scanf("%lf",&r); printf("area is %.4lf\n",S); printf("volume is %.4lf\n",V); } 输入正方形的边长,输出正方形的周长和面积。 # include void main() { float c,zc,mj; printf("输入你的正方形"); scanf("%f\n",&c); zc=4*c; mj=c*c; printf("周长%f,面积%f,边长%f",zc,mj,c); } 3用格式输入函数输入3个字符,并用输出函数反向输出3个字符和他们的ASCII 码。 # include int main() {char-ch1,ch2,ch3;

C语言上机试题及答案

实验一Visual C++6.0 的使用及顺序结构程序设计 一、实验目的 1、掌握启动和退出VC6 的方法。 2、熟悉VC6 开发环境。 3、初步掌握简单程序的上机操作基本步骤,熟悉 C 单文件程序的输入、编译、链接和运行过程。 4、初步掌握程序的编辑修改和调试。 5、熟练使用赋值运算、算术运算等表达式。 6、熟练使用标准输入、输出函数及各种数据类型的格式说明符。 二、实验内容 1、下面C 语言程序,其功能是显示字符串“欢迎同学们来到华北水院计算中心!”。 请同学们按照下面的实验指导学习VisualC++6 .0 的使用。 1.启动VisualC++6 .0 开发环境 (1) 单击“开始”按钮,选择“程序”——〉“Microsoft Visual Studio 6 .0 菜单项, 单击“MicrosoftVisualC++6 .0”,屏幕出现标题为“当时的提示”的窗口。 (2) 单击“结束”按钮,关闭窗口,进入VC6.0 开发环境的主窗口。 2.使用Visual C++6.0 对一个 C 程序进行编辑、编译、连接和运行。 ⑴分析 Visual C++6.0 中程序的开发过程与其它高级语言的开发过程相仿,都要经过编辑、编译、 连接和运行四个步骤。 ⑵步骤 ①编辑

图 1-2 编辑窗口 ②编译 编译是使用系统提供的编译器将文本文件 Exa.c 生成机器语言的过程,结果为 Exa.obj ,由 于没有得到系统分配的绝对地址,还不能直接运行,如图 1-3 所示。选择 Build 菜单下的 Co mpile Exa.c ,计算机将完成对当前源程序的编译。按提示建立默认工程空间。编译无错时,将 源程序 Exa.c 编译为目标文件 Exa.obj 。 编译结果如图 1-4 所示。如果出现运行错误,应该分 析错误的原因,例如,是输入数据错误,还是代码错误;如果需要修改源程序文件,还需重 新编译、链接和执行。改正编译窗口下方指出的两个错误,直至编译成功,如图 1-5 所示。 图 1-1 New 对话框 编辑是将 C 源程序输入计算机的过程。在 Visual C++6.0 主界面下,点击 File 菜单,选择 New 菜单项,即可出现 New 对话框,如图 1-1 所示。在弹出窗口中的 Files 标签页下,选择 C ++ Source File 。在选项卡右面的 File 编辑框里输入文件名如 “ Exa .c ”, 在 Location 编辑框里输 入文件路径,如 “d:test 。”点击 OK 按钮。将出现编辑窗口,如图 1-2 所示。 在图 1-2 所示的 右端编辑窗口里输入以下 C 源程序并保存文件。 include void main() { printf(" } 欢迎同学们来到华北水院计算中心! ");

C语言--上机附加题 附1-3答案

七、附加题 附加题1 一、填空题 给定的程序中,函数fun的功能是:在任意给定的9个正整数中找出按升序排列时处于中间的数,将原数据序列中比该中间数小的书用该中间数代替,位置不变,在主函数中输出处理后的数据序列,并将中间数作为函数值返回。 例如,有9个正整数: 1 5 7 23 87 5 8 21 45 按升序排列时的中间数为:8 处理后主函数中的输出的数列为: 8 8 8 23 87 8 8 21 45 请在程序的下划线处天如正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! #include #define N 9 int fun(int x[]) { int i,j,k,t,mid,b[N]; for(i=0;ib[j]) k=j; if(k != i ) { /**********found**********/ t=b[i]; b[i]=b[k]; b[k]=t; } } /**********found**********/ mid=b[N/2]; for(i=0; i #include #define N 20 int fun( int *b ) { /**********found**********/ int t[N] ,i, num=0; for(i=0; i=10) /**********found**********/ t[num++]=b[i]; /**********found**********/ for(i=0; i void NONO(); int fun(char *s) {

c语言上机作业及答案

4.11 编程计算1×2×3+3×4×5+…+99×100×101的值。#include main() { long i ; long term, sum = 0; for (i = 1; i <= 99; i = i + 2) { term = i * (i + 1) * (i + 2); sum = sum + term; } printf("sum=%ld",sum); } 4.12 编程计算1!+2!+3!+4!+…+10!的值。 #include main() { long term = 1,sum = 0; int i; for (i = 1; i <= 10; i++) { term = term * i; sum = sum + term; } printf("1!+2!+...+10! = %ld \n", sum); }

#include main() { long term ,sum = 0; int i, j; for (i = 1; i <= 10; i++) { term = 1; for (j = 1; j <= i; j++) { term = term * j; } sum = sum + term; } printf("1!+2!+…+10! = %ld \n", sum); } 4.13 编程计算a+aa+aaa+…+aa…a(n个a)的值,n和a的值由键盘输入。 #include main() { long term = 0,sum = 0; int a , i, n; printf("Input a,n: "); scanf("%d,%d", &a, &n); /*输入a,n的值*/ for (i = 1; i <= n; i++) { term = term * 10 + a; /*求出累加项*/ sum = sum + term; /*进行累加*/ } printf("sum=%ld\n",sum); }

浙江省秋季C语言二级考试上机编程试题及答案

浙江省2011年秋季C语言二级考试上机编程试题及答案1.三个数比较大小。 #include void s) //int *pa,int *pb { /*交换两个数的位置*/ int temp; temp = *pa; *pa = *pb; *pb = temp; } void main() { int a,b,c,temp; scanf("%d%d%d",&a,&b,&c); if(a>b) s); if(b>c) s); if(______2______) //a>b s); printf("%d,%d,%d",a,b,c); } 2.表达式求和。 #include #include void main() { FILE *fp; float n=1,t=1,pi=0; int i; // 从以下开始答题 i=1; while(fabs(t)>=1e-6) { pi=pi+t; i= -i; n=n+2; t=i/n; } fp=fopen("Design1.dat","w"); fprintf(fp,"%.6f",4*pi); fclose(fp); } 运行结果:3.141594 3.字母后移循环输出。

#include void main() { char c; c=getchar(); if(______1______) // c>='a' && c<'v' c=c+5; else if (c>='v' && c<='z') ______2______ // c=c-21; putchar(c); } 4.求满足条件的数。 #include #include void main() { float y=1.05; int n=1; FILE *p; // 以下开始做答 while(!(pow(y,n)<1e6 && pow(y,n+1)>1e6)) n++; p=fopen("Design2.dat","w"); fprintf(p,"%d,%.0f",n,pow(1.05,n)); fclose(p); } 运行结果:283,992137 5.求满足条件的数。

相关文档
相关文档 最新文档