数据类型转换

2024-09-02

数据类型转换(共7篇)

数据类型转换 篇1

C语言中数据类型纷杂多样,在使用中可以灵活多变,特别是在不同的场合,各种类型之间经常可以相互转换;对于这些,很多初学者觉察不出它们之间的差别,而且在进行数据类型转换时会经常出现一些问题,以至使用时经常不知所措。针对这些问题,就数据类型转换的分类以及在使用它们时应该注意的问题进行了一些深入讨论。

1 数据类型转换的方式

C语言中的数据类型转换可分为隐式转换和显式转换两种。

1.1 隐式转换

隐式转换也可称作为自动转换,它经常以以下几种形式发生:

1)在计算一个同时出现多种数据类型的表达式时,将所有数据类型都转换为同一种数据类型。

2)在对数据进行输出时,按指定格式将数据输出。

3)利用赋值运算符将数据转换为运算符左边指定的数据类型。

4)在对函数调用时,如果形参与实参的数据类型不一致,实参会自动转换为形参的数据类型。

根据转换发生的形式,可将隐式转换分为类型:一般算术转换、输出转换、赋值转换与函数调用转换。

1.1.1 一般算术转换

这种转换类型会经常出现,它是通过编译器自动实现的,不同类型的数据在一个表达式中会自动转换为最长的类型,例如:

有如下定义char a;int b,e;float c;double d;

计算a*b+c-d/e时,按计算顺序说明类型转换:

1)a*b;//char类型的a转换为int类型的值,再和int类型的b相乘。

2)d/e;//int类型的e转换为double类型的值,然后double类型的d再和e相除。

3)a*b+c;//int类型的a*b转换为float类型值,再和float类型的c相加。

4)a*b+c-d/e;//float类型的(a*b+c)转换为double类型的值,再和double类型的d/e相减。

不考虑过程,最终表达式的值为最长类型(这里是double)的值。

1.1.2 格式输出转换

这种转换类型是将某种类型的数据按照输出格式转换成指定格式。例如:

main(){int a=65;printf("%cn",a);}//输出“A”

此程序是将ASCII值为65的字符输出来,所以输出结果是“A”。

1.1.3 赋值转换

在这种转换中,会出现赋值运算符“=”,就是要将运算符右边的数据类型转换为运算符左边的数据类型,例如:

main(){int a=3.15;printf("%dn",a);}//输出结果是3

之所以会出现这种结果,就是因为运算符右边的3.15是浮点型常量,它要被转换为运算符左边的整型数据,导致整型变量被赋值为3。

1.1.4 函数调用转换

此种类型的转换主要会出现在函数调用时形参跟实参数据类型发生不一致的场合,例如:

int mul(int x,int y)//函数中的形参为int

{int a;a=x*y;return(a);}

void main()

{float a=1.23,b=2.35;

int c;c=mul(a,b);//调用函数时,由于实参是float,所以实参首先会转换为int,再执行函数体部分

printf("%d",c);}//输出结果是2

1.2 显式转换

显式转换可分为两种,即强制性数据类型转换以及利用标准函数转换。

1.2.1 强制性数据类型转换

强制性数据类型转换是将某一种数据类型强制转换为另外一种数据类型。这一种较常见。强制性数据类型转换的一般格式为:(类型标识符)表达式。例如:

main(){float a=5.6,b=2.3;printf("%dn",(int)a%(int)b);}

由于运算符“%”要求两个数据必须为int类型,如果不进行强制性数据类型转换,则系统会提示出错信息,所以浮点型数据a和b先各自转换为整型数据5和6,再进行求余运算,输出结果是1。

1.2.2 标准函数转换

这种转换是利用C语言中的标准函数将某一种数据类型转换为另外一种数据类型。例如:

main()

{int a;float b;char*c="123.45xy",*d;

b=atof(c);//将字符串c转换为float型数据

a=atoi(c);//将字符串c转换为int型数据

itoa(a,d,10);//将十进制数a转换为字符串数据并且存放在字符型指针d所指向的字符串

printf("%.4f,%d,%sn",b,a,d);//将浮点型数据b、整型数据a以及字符串数据d分别按照浮点型、十进制数整型和字符串格式输出,输出结果是:123.4500,123,123

}

2 常见问题

在对数据类型进行转换时,是为了程序的需要,可有的时候却会带来意想不到的安全隐患和错误,这就是非安全转换、输入输出格式错误与运算符数据不匹配。

2.1 非安全转换

非安全转换是将一种数据类型长的转换成其它数据类型短的数据,使其值的表示范围被缩小所出现的错误。它有如下几种情况:

2.1.1 较大整数转换为较短的类型

C语言系统一般不检测这种类型的错误,大部分的编译器在可能出现非安全转换是不会给出警告信息,因此在编程时需避免此类型转换。

如main(){long i=123456;printf("%dn",i);}//其输出结果为-6716.

又如main(){unsigned i=65535;int j;j=i;printf("%dn",j)}//输出结果为-1.

2.1.2 有符号负数转换为无符号数

例如:main(){int i=-1;printf("%u",i);}//其结果为65535

当由有符号数转换为无符号数时,原来的符号位将不作为符号,而作为数据的一部分。

2.1.3 双精度类型转换为单精度类型

例1 main()

{double i=10.123456789;float j=i;printf("%.9fn",j);

}//输出为10.123456955

例2 main()

{double i=12345678912345.123;float j=i;printf("%fn",j);

}//输出为12345679020032.000000

由于双精度类型转换成单精度类型时,可能出现以下两种情况:其一,降低精度,截断尾数,保留前8位有效数字,后面的数字无意义,如例1;其二,若数值超出了单精度所表示的范围,则得到的数据无意义,且系统不提示错误,因此在遇到较大的数据,或对数据精度要求比较高时,应避免进行此类的转换,如例2。

2.1.4 浮点数转换为整型

当浮点数转换成整型数据时,舍弃小数,不进行四舍五入,例如:

main()

{double i=15.99999;int j=i;printf("%dn",j);}//其输出为15。

因此,若需要计算结果尽可能高的精度,应避免此种类型的转换。

2.2 输入输出格式错误

这种错误会出现在格式输入与格式输出函数中。例如:

main()

{int i=2;printf("%f",i);}//会出现编译错误(数据类型不一致)

2.3 算术运算“/”、“%”与数据类型不匹配

例1 main()

{int i=7,j=2;printf("%dn",i/j);}//输出结果为3

例2 main()

{float i=12.45,j=6.3;printf("%dn",i%j);}//提示错误:非法地使用浮点数在main函数中

在例1中,程序的本来目的是想得到结果3.5,可是结果却是3,,是因为变量i和j都是int类型的,其结果也是int类型的,如果想得到3.5的话,就要将i和j都要强制转换为float类型;在例2中,之所以会出现系统提示错误,是因为运算符“%”左右两侧的数据类型都必须是int,但程序中两个变量却都不是int类型的,因此,想让系统不出错误,就必须将两个变量都强制转换为float类型。从上述两个例子来看,对于算术运算符“/”和“%”,一定要注意数据类型的匹配。

3 结论

在C语言中,多种数据类型之间的转换有它出现的必然性,也就是在某些情况下,数据转换是必须的,但应尽量避免出现将数据长的类型转换为数据短的类型、输入输出格式上的错误以及运算符数据类型不匹配等问题。

参考文献

[1]谭浩强.C程序设计[M].北京:清华大学出版社,2005:14-18.

[2]谭浩强.C++程序设计[M].北京:清华大学出版社,2004:36.

[3]谭浩强,张基温,唐永炎.C语言程序设计[M].北京:高等教育出版社,1992:87-88.

[4]Schildt H.C语言大全[M].戴健鹏,译.北京:电子工业出版社,1994:68-69.

[5]Schildt H.ANSI C标准详解[M].王曦若,李沛,译.北京:学苑出版社,1994:45-46.

[6]夏涛.C语言程序设计[M].北京:北京邮电大学出版社,2007:52-54.

[7]杨路明.C语言程序设计教程[M].北京:北京邮电大学出版社,2005:76-77.

[8]贾素玲.C语言编程[M].北京:高等教育出版社,2005:65-67.

数据类型转换 篇2

同义句转换题是近几年中考英语的一个常考题型,其出题形式通常是同时给出两个句子,第一句完整,第二句中设有几处空格,要求考生填入适当的词或词组,使第二句的意思与第一句意思相同。它综合考查考生的语法、词汇、短语或习惯用语和句型结构等知识,要求运用所学的词汇、语法知识和句型结构填写句子,使句子结构完整、逻辑合理、语法知识无误、意思与所给句子相同。通过对近几年的中考英语试题中同义句转换题的分析,我们发现中考英语同义句转换题主要考查以下几个方面:

一、运用同义词(组)进行转换

用同义词或同义词组对原句中的某些词或词组进行替换,注意转换后的词或词组的词形变化要与句子其他成分相适应。如:

1. That day we could see flowers here and there.

That day we could see flowers __________.

分析:答案为everywhere。everywhere与here and there都表示“到处”。

2. The teacher always takes good care of the children in the school.

The teacher always_______ ______the children well in the school.

分析:答案为looks after。take good care of与look after…well都表示“好好照顾”。

二、运用反义词(组)的否定式进行转换

即用反义词或词组的否定式表达与原句相同的意思,主要考查学生对反义词(词组)的积累和换位思维的能力。如:

1. It’s clear that this visit is different from last time.

It’s clear that this visit is not the___ ___last time.

分析:答案为same as。be different from意为“与……不同”;the same as意为“与……相同”,其否定式与be different from同义。

2. I think wealth is less important than health.

I ___ think wealth is ___ important than health.

分析:答案为don’t,more。less important的意思是“没有(不及)……重要”;more important的意思是“(比)……更重要”,该结构与not连用,则表示“不比……更重要”。

另外,有的反义词即使不与否定词连用,而只需改变句子结构也可构成同义句。如:

He lent some money to his friend.

He friend ___ some money ___ him.

分析:答案为borrowed,from。borrow…from意为“向……借……”;lend…to意为“把……借给……”。两个结构意思相反,但若变换“借出者”与“借入者”的位置,则可转换为同义句。

三、运用不同语态进行转换

即运用主动语态与被动语态的变化来转换同义词,但此时要特别注意时态、动词一致性。如:

1. Everyone should give back his library books on time.

Library books should____ ____ ____ on time.

分析:答案为be given back。被动句中含有情态动词should,因此助动词用be。

2. It is widely accepted that more people use computers in the world today.

Computers ____ widely ___ in the world today.

分析:答案为are,used。computers是复数名词,助动词用are。

四、非延续性动词与延续性动词的相互转换

即非延续性动词与延续性动词进行转换,此时往往会涉及时态的.变化。如:

1. The manager left two hours ago.

The manager _____ ____ ____ for two hours.

分析:答案为has been away。leave为非延续性动词,不能与for two hours这样的一段时间连用,而改成be away这样的延续性动词后,则可连用一段时间。

2. The film began five minutes ago.

The film has been _____  _____ five minutes.

分析:答案为on for。has been提示时态是现在完成时态,“for+时间段”表示“持续(一段时间)”,常用在含有现在完成时态的句子里。

3. Mr Li joined the Party twenty years ago.

Mr Li _____ _____ _____ the Party for twenty years.

答案:has been in。短暂动词join,意为“参加、加入(组织,政党)”,不能与延续时间状语连用,与延续性时间状语连用时,将join改成be in或be a member in…。

五、运用不同引语进行转换

即将直接引语变为间接引语或将间接引语转换成直接引语。此时还要注意相关时态、人称、动词、状语等相应的变化。如:

1. “I’ve found my wallet,” he said to me.

He _________ me that he _________ _________ his wallet.

分析:答案为told,had found。此题是将直接引语转换成间接引语。

2. “Did you see her last week?” he said.

He _______ _______ I had seen her the week _______.

分析:答案为asked if/ whether, before。此题是将疑问句的直接引语转换成间接引语。

六、运用简单句与复合句之间的转换

即将简单句变成同义的复合句或将复合句变成同义的简单句。如:

1. We didn’t go out for a walk because it was raining.

We didn’t go out for a walk _______ _______ the rain.

分析:答案为because of。将原因状语从句because it was raining改为表示原因的介词短语because of the rain。

2. He was so excited that he couldn’t go to sleep.

He was ______ ______ ______ go to sleep.

分析:答案为too excited to。将so…that…换成too…to…结构,原句的that从句为结果状语从句,改写句中的不定式仍表结果。

3. Now I will show you how to do the work.

Now I will show you ______ ______ ______ do the work.

分析:答案为how you can。即将原句中的“疑问词+不定式”结构转换成宾语从句。

4. You should put them back after you use them.

You should put them back _____ _____ them.

分析:答案为after using。即将after引导的状语从句改写为after引导的介词短语。

七、运用并列句与复合句之间的转换

即将并列句变成同义的复合句或将复合句变成同义的并列句。如:

1. Come on, or we’ll miss the early bus.

____ we ____ hurry, we’ll miss the early bus.

分析:答案为If,don’t。if引导条件状语从句。

2. The man gave us a talk last week. Now he will give us another talk this week.

The man _____ gave us a talk last week _____ _____ us another talk this week.

分析:答案为who/ that,will give。who/ that gave us a talk last week为定语从句,修饰先行词the man。

八、运用关联连词连接或合并句子

即运用关联连词both…and…,neither…nor…,either…or…,not only…but also…等将两个简单句合并为一个简单句。此时要注意的是,both…and…连接两个主语时,谓语总是用复数,而neither…nor…,either…or…,not only…but also…连接两个主语时,谓语动词通常应与靠近的主语保持一致。如:

1. Tom can’t speak Japanese well and Jim can’t, either.

______ Tom ______ Jim can speak Japanese well.

分析:答案填Neither,nor。neither…nor…表示“……和……(两者)都不”,刚好与原句的两个否定结构的意思相吻合。

2. Alice has read the book and Peter has read it, too.

______ Alice ______ Peter have read the book.

分析:答案为Both,and。both…and…的意思是“……和……(两者)都”。

3. This store sells men’s shoes, and it also sells men’s clothes.

This store sells ______ ______ men’s shoes ______ ______ men’s clothes.

分析:答案为not only,but also。表示“不仅……而且……”之意。

九、利用某些典型句式或结构进行转换

这类典型结构如so…that…,too…to…,enough to,not…until…,so do I等。如:

1. Jim wants to go boating and his parents want to go boating, too.

Jim wants to go boating, and ______ ______ his parents.

分析:答案为so do。句意为“……他的父母也一样(一样想去)”。

2. John went to bed after he finished his homework.

C++隐式数据类型转换的研究 篇3

1 用转换构造函数进行类型转换原理

1.1 什么是转换构造函数

把有参数的构造函数用作类型转换, 称为转换构造函数 (有参数的构造函数也可不用做类型转换) 。转换构造函数作用是将基本数据类型的数据转换成类的对象;它是类的成员函数。

1.2 转换构造函数应用

5/8与5.0/8结果不同, 原因是C++执行了两种不同的操作。5.0/8匹配了两个doubl e类型的除法, C++知道如何将8转换成doub le型, 这是基本数据类型的转换。但转换用户定义的类类型, 必须由用户告知。告知方式就是定义含参数的构造函数。通常把有参数的构造函数用作类型转换, 称其为转换构造函数 (有参数的构造函数也可不用做类型转换) 。转换构造函数的作用是将其它类型的数据转换成类的对象。在构造函数中, 完成对象初始化的同时, 也可完成数据类型的转化, 只不过是由系统转化的, 所以称隐式数据类型转化。例如:定义SI类, 该类的对象表示从-128~127之间整数。

SI类重载了两个SI对象相加的操作符;因此, 可以进行两个SI对象相加的操作;如:SI s1 (2) , s2 (2) ;SI s3=s1+s2;如果是SI型变量和其他数据类型的变量进行运算, 如:s3=s1+6;;要让SI变量和整数相加, 而程序只定义了两个SI类型变量相加的运算符, 所以需提供由整数向SI类型转换的函数。其实程序已实现了这样的函数, 类SI的构造函数:SI (int val) ;就实现了这样的功能。在定义SI对象SI s (6) ;系统自动调用构造函数将整数6转化为SI类型的变量。所以类的构造函数可充当类型转换的角色。当用s3=s1+6时, 系统发现第一个操作数是SI类型的, 就寻找有没有以SI为参数类型的“+”运算符, 当找到了这个运算符时, 发现还有一个操作数的类型不对, 就将这个操作数的类型转化为SI型。因为程序定义了int型数据来构造SI对象的构造函数, 所以转型成功。系统就调用SI的成员函数operator+ () 来完成运算。

2 使用重载加运算符和类的友元函数实现

当程序出现s3=s1+2.3;因为类SI并没有double型数据来构造SI对象的构造函数, 所以。系统会首先将这个double型的数据转化为int型, 然后在利用SI的构造函数将其转化为SI对象, 即:{SI temp=int (2.3) ;//先构造一个临时的SI对象, s3=s1+temp;//直接运用operator+}。问题是:类中重载加运算符后, s3=6+s1;s3=s1+6;相同吗?加法一般满足交换率的。而对于SI和一般数据类型之间的加法是不满足交换率的。因为操作的第一操作数是int型的数, 而不是SI。类的成员函数的第一参数默认是指向这个类的对象的指针类型, 这是由系统定义好的, 无法更改。所以, 如果operator+ () 被定义为类的成员函数, 就无法通过类型转换将int型数据转化为SI来运算 (系统规定不能这样做) 解决此问题有两种方法。

方法一:将operator+ () 作为类的友元函数来定义:class SI{friend SI operator+ (const SI&, const SI&) };这样, 就不会受到成员函数的第一个参数类型的限制, 可以利用构造函数将作为第一个操作数的整数转化为SI型的数进行运算。

方法二:是保留作为成员函数的operato r+ () 的定义, 另外再重载一个operator+ () 运算符, 并将其第一个参数定义为int型的。程序如下

第一种方法简单, 只需要重载一次运算符;第二种方法需要多次重载这个运算符。而且, 重载多次容易产生二义性, 所以, 在为类的重载运算符时, 一般将运算符定义为类的友元函数, 而不是定义为成员函数。

3 用类型转换函数进行类型转换

用转换构造函数可将指定类型的数据转换为类的对象。但反过来却不能将类的对象转换为基本类型的数据 (如将一个SI类对象转换成int) 。下面介绍类型转换函数可实现这一点。类型转换函数作用是将类的对象转换成基本类型的数据。它是类的成员函数。类型转换的形式为:operator类型名 () {实现转换的语句}。在函数名前不能指定函数类型, 函数没有参数。

一些函数只接受基本数据类型的参数, 如:int abs (int val) ;若希望把SI型数据的变量传递给这个函数来求SI型数据的绝对值:SI s (-2) ;s=abs (s) ;如果想让函数如abs () 来接受SI类型的变量, 就需要定义一个将SI对象转化为int型的转换函数, 实现SI类型向int转换的函数为:Class SI{public:operator int () {return val;};函数体直接返回val的值, 这个值就是转化成的int的值。这样就可直接用SI对象调用函数abs () 了。

4 结语

类型转换构造函数实际上就是带参数的构造函数, 转换构造函数完成的是由标准数据类型 (或一个类类型) 转换至当前类类型;类型转换函数完成的是由当前类类型转换至标准数据类型。转换构造函数与类型转换函数有一个共同的功能:当需要的时候, 编译器会自动调用这些函数, 建立一个无名的临时对象 (或临时变量) , 实现类型间的转换。

摘要:在程序设计中, 常根据编程的需要, 进行数据类型转换。C++实现数据类型转换有隐式类型转换和显式类型转换。本文以自定义类型SI为例分析隐式数据类型转换原理。

关键词:C++,数据类型,构造函数,重载

参考文献

[1]王萍.c++面向对象程序设计.2002年2月第1版.北京:清华大学出版社, 345-351.

数据类型转换 篇4

所谓“智慧型教师”是指通过教育科研不断探索教育规律,寻求教育实践活动所必需的教育智慧,从而具有高情商、高智商、高效能的一类教师。

一般认为智商基本是由先天因素决定的,我们在承认这一科学事实的同时,强调实践出真知,特别是教育活动方面的“智商”能力,更是由教育实践活动造就的。教师的智慧与其他职业人群的智慧有所不同,不同之处在于,它是作为教师专业素养的智慧。作为专业素养的智慧型教师之智慧可以用“一体三维”来概括。

所谓“一体”,指智慧型教师是具有智慧人格的生命主体。教师专业素养的现代性突出地表现为,在师生关系中,教师有一个合理的主体性认同,有一个“无过无不及”的自觉把握,这种主体性是师生主体间性中的教师主体性,它既要求教师发挥主动性、积极性,同时又要时时警惕和克服自身主体性的膨胀,特别是恶性膨胀,这就涉及教师人格问题。做到恰到好处!做到“无过无不及”,正是智慧型教师解决自身主体功能问题的智慧。人的主体性可以理解为作为自己生命主体的人的功能属性。在以能力为本位的当代社会,智慧型教师生命主体之人格性就突出地表现为与具有解决自身主体功能性的智慧人格相连。

所谓“三维”,是充实和具体体现“智慧型教师”生命主体和智慧人格的三个方面,分属心理学三分法的知、情、意领域。

从“知”方面讲,智慧型教师是具有理性观念之智慧的教师。理性观念是教师的主观认识、思想观念,属于康德所说的“纯理性”。教师的“纯理性”对于教育实践具有一种“前定”的效果倾向,即有怎样的“纯理性”,便会产生怎样的实践倾向,“纯理性”发挥着教育观念对教育实践的指导作用。西塞罗曾精辟地论述过理性与智慧的关系,他说:“当理性发展成熟和完善,便被恰当的称之为智慧。”这就是说,智慧是一种成熟的和完善的理性。“智慧型教师”成熟和完善的理性观念,主要表现为对教育的本质、目的、制度、方法等有正确而又深刻的理论洞察,这里边既包括先进的教育理论的学习,更包含教师个人的独立思考和实践反思。教师在理性观念方面的智慧,是这两者相互作用而“转识成智”的结晶。

从“情”方面讲,智慧型教师是具有“人本取向”之智慧的教师。目前对教育活动中的“人本取向”尚有不同看法,对教育是“以人为本”还是“育人为本”尚有歧见。笔者认为,教育的“人本取向”贯彻的是“人是目的”崇高的人文精神。当然应承认“人既是目的又是工具”,然而,人为工具的一面终究是为“人是目的”服务的。教育的“人本取向”主要是以学生为本,它不但建筑于理性认识基础上,更重要的是扎根于师生的情感关系中。

从“意”方面讲,智慧型教师是具有执著精神之智慧的教师。“执著”原是佛家用语,指对某一事物坚持不放,不能超脱。本文所谓“执著精神”,是指智慧型教师坚持教书育人的崇高理想,为之作坚持不懈的努力,有一种不达目的不罢休的意志精神。“执著”在现实生活中大有被排除在“智慧”之外的意思,因为它意味着不能超脱,不会“脑筋急转弯”,因而,“执著”非但不是“智慧”,相反的却是“愚蠢”,然而这只不过是过分世俗化的理解。无论在教育的理想世界,还是在教育的现实场景,看似“愚”的执著终究是教师的一种智慧,而且属大智慧,因为若没有它,崇高的教育理想无法实现,人性教化的现实问题无法解决,因此完全可以说执著精神是智慧型教师专业素养中看似“愚”而实为智慧的意志品质。

“智慧型教师”是一种教师类型。“教师类型”与“教师角色”是有着一定联系但又不一样的概念。一般地说,“教师角色”是指教师在人类社会生活中的职业定位,而“教师类型”则是教师在其职业定位中表现为心性行为的某一类的形象标识,这些形象标识作为一种“隐喻”,往往隐匿着某些特定的思想理念和内在根据。如历史上流行的“园丁型教师”、“设计师型教师”等,就属“教师类型”,而不作为“教师角色”。

教师专业素养的形成和发展,是教师专业发展的核心因素。在当今社会和教育的转型期,这种核心因素已不是过去所强调的知识、经验和某种特定文化,而是具有隐喻性质的“智慧型教师”“一体三维”之“智慧”。它所隐匿的思想理念和内在根据是,在“知识爆炸”的信息化时代,必须靠也只有靠“智慧”去统帅和处理知识信息,必须靠也只有靠以“一体三维”之能力为本位的“智慧人格”去引领教师的教育教学行为;否则便会陷入师生一道被知识信息和教育教学任务压得近乎窒息的无奈和困惑之中。

教育史上最为典型、影响也最大的两种教师类型是“园丁型教师”和“设计师型教师”。园丁型教师所隐匿的思想理念是自然主义教育思想,它认为教育是儿童天赋本能自发的、自然生长的过程,教师只能作为“自然的仆人”参与教育过程,就像植物生长一样,只需从旁提供阳光、雨水等适当的条件,儿童便能自长自成,教师对学生内在的干预会破坏儿童身心的健康发展。这在卢梭的自然教育和杜威的.“教育即生长”的命题中反映最充分。设计师型教师的思想理念则是以赫尔巴特传统教育为代表的理性主义。赫尔巴特反对把人交给“自然”、引向“自然”,强调教师的权威和对学生的刻意求工,以达到把学生塑造成教师“事先预料未来人的目标”。凯洛夫教育学承袭了赫尔巴特的“刻意塑造论”,另外加强了所设计的“理想人”教育目的中的意识形态色彩。

园丁型教师和设计师型教师各自的思想理论基础,在历史上皆作过教育学贡献,但其缺陷也是明显的,从教师专业发展角度看更是如此。比方说,根据园丁型教师理念,父母也可以是教师,而且可能是比学校教师更好的教师,教师甚至可以泛化至“保姆”;根据凯洛夫设计师型教师的理念,“社会”是最高位的教师,代表社会先进思想的阶级及其政党中的任何一员,均可以成为按崇高的教育目的去设计、去塑造年轻一代的“教师”,但这种“塑造”往往容易成为不顾学生特点的“捏塑”。这就是说,园丁型教师和设计师型教师虽都强调了“教师类型”,但在实际上并不强调教师专业,甚至还淡化了教师专业,造成了非“教师角色”的人,也可成为教师的教师“半专业”或非专业的后果。

智慧型教师则不然。首先,它肯定教师是一个专业,强调作为教师专业素养的最具作用力的智慧,必须经长期而艰苦的包括教育科研在内的学习、探究和实践中的修炼、反思才能形成和获得;第二,它面对知识信息社会,把作为专业素养的教师生命主体中“成熟的理性”、高尚的情操和执著的意志归结为教师的智慧人格;第三,在思想理念上,既信奉智慧统帅知识信息、智慧人格引领心性行为,同时又广泛吸收包括园丁型、设计师型教师思想理论基础在内的中外教育思想中的合理因素,不拘于一家一说而博采众长,着重于批判性继承基础上的现代性转化。

据有关研究,中国大陆缺乏“教师专业”的概念意识,这与国际上“教师职业专业化”的认同趋势有较大距离。造成这种现状有多种原因,其中一个很重要的原因就是受“园丁型”,特别是“设计师型”教师理念的消极影响。按“理想人”定式加工式的“塑造论”占主导地位,不仅迫使学生失去了教育生活中的生动、活泼、主动和个性发展,而且令教师失去了真正的教育智慧,失去了对教师专业素养的创造性追求。

从我国教师队伍的现实情况看,教师中属于“园丁型”的不多,大多数属“设计师型”。如果说“园丁型”教师类型属偏重于“方法”的一种教师类型,“设计师型”教师类型属偏重于“权力”的一种教师类型的话,那么“智慧型”教师类型则属于人格型的教师类型。从文化学角度看,如果说自孔子“知者乐水,仁者乐山;知者动,仁者静;知者乐,仁者寿”(《论语雍也》)暗示中外文化不同,中国文化向“仁”的方向发展并形成“仁”文化,西方文化相对而言属于“智”文化的话,那么作为人格类型的智慧型教师则是摆脱了单一特色文化的束缚,而属兼取中西文化之优长的“仁”“智”融合的开放型人格。智慧在当代是超越一切社会角色、超越所有知识信息的人之灵魂。教师拥有了它,并将它作为一种人格来塑造,便能成为具有专业智慧的教师,成为灵活运用中外先进教育思想理论、积极开展教育科研和深刻把握个人实践反思的创造型教师,成为既解放学生又解放教师自身的教师,成为“转识成智”能适应和挑战信息社会的教师。由设计师型教师、园丁型教师转换为“智慧型”,是从传统型走向现代型,从封闭型走向开放型,从理想型走向理想与现实结合型,从“权力型”、“放任型”走向人格型的教师类型。这种“教师类型”的转换意味着教师专业素养新的要求和提升,意味着教师主体智慧人格之当代性的确立和拥有,意味着知识信息社会的需要,意味着教师教育、教育管理在理念上、机制上需要发生的变革。在此意义上应该认为,“教师类型”转换是历史维度教师专业发展的主要目标。知识信息社会正热切呼唤智慧型教师大范围、大批量诞生。

数据类型转换 篇5

C语言到目前为止仍然是国内外广泛使用的程序设计语言之一,同时也是国内外大学开设的程序设计基础课程,很多学生把C语言作为国家计算机等级考试的首选语言。实际上,用C语言编写的程序,就是描述对数据的处理过程,而数据都是以某种特定的形式存在的(例如:整数、字符等)。也就是说,C程序中用到的所有数据都必须指定其数据类型,因此必须掌握C语言程序中的这些数据类型。而运算是对数据进行操作、处理的过程,是通过运算表达式描述的。在C语言的表达式中,通常参与运算的数据类型不一定完全一致。C语言允许不同类型的数据混合运算,但是,要先将它们转换成相同的数据类型,再进行运算。本文就将对数据类型转换的方式和在转换过程中常见的问题进行分析探讨。

1 数据类型转换的方式

数据类型转换一般可分为隐式转换和显式转换,它们分别也可称为自动转换和强制转换。

1.1 隐式转换

常见的隐式转换有四种,分别是:一般算术转换、输出转换、赋值转换、函数调用转换。

(1)一般算术转换即通过某些运算符将操作数的值从一种类型自动转换成另一种类型,而这一规则为“由低级向高级转换”,转换规则如图一所示。

若参与运算变量的类型不同,则先转换成同一类型,然后进行运算。转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int型转成long型后再进行运算。所有的浮点运算都是以双精度进行的,即使仅含float单精度变量运算的表达式,也要先转换成double型再作运算。char型和short型参与运算时,必须先转换成in型。

(2)输出转换指的是待输出的操作数的类型与输出的格式不一致时进行的数据类型的转换。例如:printf(“%u”,-2),其输出结果为:65534。系统把负号作为数值的一部分处理,然后输出转换后的值。

(3)赋值转换是指在赋值运算过程中将赋值运算符右侧的操作数的类型转换成左侧操作数据的类型。具体的转换有:

(1)浮点型与整型;(2)单、双精度浮点型;(3)char型与int型;(4)int型与1ong型;(5)无符号整数。

(4)函数调用转换是指当实参类型和形参类型不一致时所进行的转换。

例1:

在执行multiply函数时,系统会将a与b转换成整型值给形参x,y。

1.2 显式转换

显式转换一般有两种方法,强制性数据类型转换和利用C语言提供的标准函数转换。

强制类型转换是将一种类型的数据强制转换成为另一种数据类型。其格式为:(数据类型标识符)表达式;作用是将表达式的数据类型强制转换成“数据类型标识符”所表示的类型。

例2:

2 常见问题分析

C语言在数据类型转换中常见的错误有以下几种:非安全转换、算术运算“/”、“%”与操作数不匹配、输入输出格式错误。下面就以上几种常见错误进行实例分析。

2.1 非安全转换是将一种数据类型转换成较短数据类型,其值超出较短类型的表示范围时所出现的错误

2.1.1 较大的整数转换为较短的类型

当较大的整数转换为较短的类型时,超出了较短类型所能表示的范围,因此结果是无意义的。如:long i=123456printf(“%d”,i);其输出结果为:-7616。当较长的无符号数转换成较短有符号数时,当无符号数值超出了有符号数类型的表示范围,在转换过程中仅转换了有符号数类型能够表示的较低位,如:unsigned j=65535;int i;i=j;printf(“%dn”,i);程序执行上述语句后输出为-1。C语言系统一般不检测这种类型的错误,大部分的编译器在可能会出现非安全转换时都不会给出警告信息。运行时,若发生此类型错误,任何C系统都不会中断,也不会给出出错信息,因此在编程时需避免此类型转换。

2.1.2 有符号负数转换为无符号数

输出结果为:65535,这是因为-1在存储单元中的存放形式(以补码形式存放)如下:

当有符号数转换为无符号数时,原来的符号位将不作为符号,而是作为数据的一部分。

2.1.3 双精度类型转换成单精度类型

例5:

由于双精度类型转换成单精度类型时,可能出现上述两种情况:其一,降低精度,截断尾数,保留前来位有效数字,后面的数字无意义,如例5;其二,若数值超出了单精度所表示的范围,则得到的数据无意义,也可能是Infinity或NaN之类的值,且C系统不提示出错也不警告用户,如例6。因此,在实际编程过程需仔细,遇到较大的数据,或对精度要求比较高时,避免进行此类的转换。

2.1.4 浮点数转换为整型

当浮点数转换为整型数据时,舍弃小数,不进行四舍五入。如:double j=12.999999;int i;i=j;则j的值为13。因此,若需要计算结果尽可能高的精度,应尽量避免此类型的转换。若较大的浮点数转换为整型数据,所得到的数据对用户是无意义的,如:double j=121234567.89;int i;i=j;printf(“%dn”,i);其输出结果为:-7033。

2.2 算术运算“/”、“%”与操作数不匹配

由于浮点数未定义”%”运算,因此执行例7时,会编译出错,系统提示出错信息:error:illegal use of floating point in function main(在main函数中非法使用浮点数)。例8的程序设计者期望的结果是3或2.5,但实际输出结果为2。由于在C语言中,两个整数执行“/”运算,其结果只保留整数部分,小数位直接舍弃。例9的输出结果为:-1,-1,1,1,原因为在“%”运算中,若两操作数中其一为负数,则结果的符号与左操作数的符号相同,与右操作数的类型无关。在程序设计中若遇到算术“/”、“%”时,需注意运算符两侧的操作数类型是否一致,对于不一致的类型可采用强制类型转换运算使其一致,可以避免出现上述错误。

2.3 输入输出格式错误

在例10中变量j与k都是long double型,在第二个scanf()语句中错用了%g的格式,说明大部分编译器不检测这种错误,也不提示出错信息。程序获取输入的数据,将被转换成格式说明符所指定类型,然后保存到指定的存储区域中。由于在转换过程中未作任何修改,因此变量中存储的是错误信息,由此产生的结果无意义,如:int t=2;printf(“%f”,t)执行上述语句会出现printf:float point formats not linkde的出错信息。

3 结束语

本文介绍了C语言中类型转换的方式,并探讨了几种常见的容易出错的问题。在程序设计过程中,若需用到运算符时,应注意运算符两侧的数据类型是否一致,若不一致应考虑数据类型转换问题。对于一些程序结果未知时,一定需慎用类型转换,在必要时应使用强制类型转换。对运算结果的精度要求较高时,尽量使用double类型。

摘要:在C语言的表达式中,通常参与运算的数据类型不一定完全一致,这就需要把它们转换成相同的数据类型,再进行运算。本文对数据类型转换的几种方式及转换过程中常见的问题进行分析探讨。

关键词:数据类型,隐式转换,显式转换,常见问题

参考文献

[1]谭浩强,张基温,唐永炎.C语言程序教程[M].北京:高等教育出版社,1998.

[2]谭浩强.C程序设计[M].北京:清华大学出版社,2005.

论二级C语言之类型的自动转换 篇6

1.1 填空

1.2 改错

1.3 编程

2 上机操作解析

2.1 填空

2.2 改错

2.3 编程

3 知识点详析

类型的自动转换:

自动转换的规则是按照低类型转换到高类型或赋值号的右边类型转换到赋值号左边的类型来进行。例如:

(1) 字符型 (char) 和短整型 (short) 必须要先转换成整型 (int) 。

(2) 单精度型 (float) 必须要先转换成双精度型 (double) 。

(3) 若两个操作数之一为double型, 则另一项也转换为double型, 运算结果为double型。或者, 如果两个操作数之一为long型, 则另外一项也转换为long型, 运算结果为long型。否则, 如果两个操作数之一为unsigned型, 则另外一项也转换为unsigned型, 运算结果为unsigned型。

(4) 赋值号的右边类型转换到赋值号左边的类型, 结果为赋值号左边的类型。当把右边的浮点型转换成整型时, 去掉小数部分;把右边的双精度型转换成单精度型时, 进行四舍五入处理。

参考文献

[1]路瑾铭.全国计算机等级考试过关宝典系列——教程 (二级C语言) .2011 (9)

数据转换技术研究 篇7

随着信息技术的飞速发展, 大量信息系统和产品的普及应用使其已成为现代生活不可或缺的一部分, 与信息系统的应用一起伴生的数据资源越来越成为各单位的核心资产。这些数据资产具有海量、多源、异构等特点, 如何将这些异构数据源进行格式转换, 从而形成不断聚集的数据资源间实现集成共享, 是有效提高数据资源利用水平、促进系统间集成进而提高单位信息化建设水平的关键技术环节。

2 数据转换概念

2.1 定义

对于数据转换, 业界并没有一个统一和精确的定义。查询中国知网的元数据知识可以得知, 数据转换对应的英文为:data transformation和data conversion。Wikipedia上对“data conversion”的描述是:“Data conversion is the conversion of computer data from one format to another”, 而对data transformation的描述是:“In metadata, a data transformation converts data from a source data format into destination data”。可见两个词条都在强调:数据转换是对数据格式的转换。

通过研究发现, 数据转换其实就是指将不同的数据格式和语义重新转换成能被其它对象所理解的数据整合技术。数据转换的需求由来已久, 只要源数据与目标数据存在差异, 就需要进行数据转换, 如数据类型的转换、数据量纲的改变、数据内容的截取、数据合并等。数据转换可分为格式转换和语义转换两方面。

█格式转换:将一种格式的数据转换为另外一种格式的数据, 也包括数据类型的转换。例如, 将CSV文件转换为XML格式文档。

█语义转换:在现实的数据环境中, 数据在不同的场景下具有不同的语义。数据要在不同的应用系统之间交互, 必须确保交互的双方对数据表达的语义有统一的认识, 对于存在语义冲突的数据需要进行语义转换。例如, 对速度这一字段的描述, A系统采用的量纲是公里/小时, 而B系统采用的是米/秒, 两个系统对速度描述则存在语义冲突, 需要进行转换。

2.2 数据转换分类

与数据转换定义类似, 数据转换的分类也没有统一的标准。综合多种观点, 本文认为可从两个角度来划分:一是数据的存储或组织形式, 二是数据模型。由于数据本身就是以某种数据模型来组织的, 并且存储在某种介质 (此处指数据库、数据文件等) 上。所以, 通常情况下, 两者又会交织融合在一起, 而且每一种分类都可以进行进一步的划分, 具体分类如图所示:

从上图可以得出, 数据转换主要可分为五大类:

█数据库之间转换:针对各种数据库, 如Oracle、SQL Server、DB2和My SQL之间的数据相互转换。

█数据文件转换:针对不同格式的数据文件, 如将CSV格式的数据文件转换成XML格式。

█消息转换:在消息队列系统中, 所有的数据都是以消息形式存在和传递的。目前一些消息代理中间件 (Message Broker) 提供消息转换功能, 如IBM公司的Web Sphere Message Broker。

█数据模型之间转换:主要是针对不同数据模型之间的相互转换。

█特定模型内转换:针对某种特定数据模型, 对数据的结构或内容进行改变。

3 数据转换相关理论研究

根据前文所述的数据转换分类, 数据转换是一个很宽泛的领域。从研究的内容来看, 大体上可以分为模式级别和数据级别。模式级别是指各种数据模型之间的转换, 而数据级别则是在特定数据模型内针对具体数据的。数据模型从早期的层次、网状, 发展到关系、对象和XML等。由于多种数据模型的存在, 所以, 它们之间的转换难以避免。目前, 关系数据库、面向对象技术和XML使用广泛, 所以, 模式级别的转换研究热点主要集中在它们三者之间的相互转换。

3.1 关系模型与XML模型相互转换

随着XML成为信息交换事实上的标准, XML与关系数据库系统的集成已成为一个极其活跃的领域。目前, 映射XML或半结构化数据到关系数据、把关系数据输出为XML文档、提供关系数据的XML视图和扩展关系查询引擎以处理XML数据的查询等技术得到了大量研究人员的关注。许多数据库厂商已经提供XML数据的本地存储和XML文档管理以及一些简易的API用于关系数据导入/导出XML文档。

从关系模式到XML模型的转换有许多方法, 归纳起来主要有两种:一是基于映射规则模板的方法, 如IBM的XML Extender、Silk Route、XPERANTO等算法都要求用户指定从给定关系模式到XML的映射模板;二是利用算法自动完成从关系模式到XML的转换, 如DB2XML、FT、Ne T、Co T等算法。XML Extender使用一个称为XML Extender或DAD的转换语言定义映射;Silk Route则用一种关系到XML的转换语言RXL来定义关系数据库的XML视图。XPERANTO使用XML查询语言XQL浏览XML中的关系数据。在Silk Route和XPERANTO中, 用户需要使用合适的查询语言定义查询。FT按照关系的平面结构直接将关系模型转换为与之对应的XML模型, 但是它不能利用XML提供的正则表达式如 (*, +) 等, 缺乏层次, 也不够直观。Ne T能自动推导出具有层次的、较为直观的XML模型, 不要求用户输入关系模型到XML模型的映射规则, 然而它只能处理单一的关系模式, 并且整个推导过程需要多次嵌套操作才能完成, 所以效率不高。Co T在Ne T的基础之上作了进一步的改进, 能够建立满足一定完整性约束 (外键约束) 的、更为直观的XML模式。Co T首先对外键约束进行处理, 将多关系模式转换为适合Ne T处理的单一关系模式, 然后利用Ne T算法建立完整的XML模式。

从XML模型到关系模式的转换, 主要是出于采用关系数据库来存储XML文档的目的。根据存储时是否使用XML模式 (DTD或XML Schema) , 基于关系的存储可以分为模型映射方法和结构映射方法。模型映射方法是一种与XML模式无关的映射方法, 它用固定的关系模式来存放任何格式的XML数据, 而不考虑XML文档的模式, 其本质是存储XML文档本身的结构信息。在该方法中, XML文档被看作由元素和属性等节点组成的有向有序的树或图, 关系模式就相当于一个模板, XML在关系数据库中的存储按照数据库提供的模板来组织数据。典型的算法有Edge、Xparent和XRel。而结构映射方法是与XML模式相关的, 即依赖XML文档模式的关系存储。这种存储映射策略把XML文档中的模式看成是数据库模式, 而把XML文档本身看成数据库中的数据区。依赖与文档模式的关系存储映射就是把XML模式映射为关系数据中的模式, 然后把XML文档中数据存储到数据库中。

3.2 对象模型与关系模型相互转换

面向对象技术支持从类 (其实现了数据和行为) 的角度创建应用程序。关系技术支持在表中存储数据, 以及从数据操作语言的角度来创建应用程序。从长期的使用情况来看, 这两项技术之间的配合并不是非常完美。20世纪90年代初期, 这两种方法之间的差异被称作对象——关系的阻抗失配 (或简称为阻抗失配) 。

一般认为的对象——关系映射, 多半是指结构映射, 可以细分为:关系的映射和继承。关系可分为一对一、一对多、多对多, 一对一可认为是特殊的一对多关系, 一对多利用表外键来实现到关系数据模型的映射, 而多对多关系的映射则采用增加关联表来解决。

对象数据模型中存在继承关系, 而关系模型中是没有的。Scott在参考文献[3]中提出了四种方式来解决关系数据模型的继承问题:将整个类体系映射成一个表、将每个具体的类映射成它自己的表、将每个类映射成它自己的表和将类映射成一个通用的结构。每种方式的具体含义请参见原文献, 这里不再一一叙述。

业界为了解决二者之间的差异, 加速应用系统的开发, 提出了Object/Relational Mapper (ORM) , 即对象关系数据映射组件, 常见的开源框架有JBoss组织的Hibernate、Apahce组织的OJB和i Batis以及Sun公司 (现已被Oracle公司收购) 的JDO和Oracle公司的商业产品Top Link等。Sun公司在Java EE5.0中提出了JPA (Java Persistence API) 规范, 大有一统Java领域ORM的趋势。上述的ORM框架基本都是通过编写映射配置文件或利用代码上的注解来实现两种数据模型之间的转换的。

3.3 XML模型与对象模型相互转换

由于XML文档本身和对象模型存在一定的相似性, 二者的转换难度不大。在开源领域, 有大量的成熟框架可用, 如XMLBean、Digester和Castor, 通过定义规则, 能够自动完成XML与Java对象之间的映射。

在数据级别的数据转换研究中, Panos Vassiliadis等人对数据转换进行了分类, 并着重阐述了在数据转换过程中的映射关系、转换方法的表示等。数据级别的转换可认为是针对特定数据模型的, 目前的研究主要集中在关系数据模型和XML模型。在关系方面主要采用SQL函数等进行转换;而在XML则使用XSLT结合XPath来进行数据转换。在文献提出了一种称之为关系树模型的XML数据转换模型, 能够有效地把XML层次化的特点和关系理论结合在一起, 把XML模式语言建模成由多个节点集组成的关系树, 定义了数据转换语义, 并把关系运算引入到转换规则中。

4 总结

本文阐述了数据转换的概念及其相关技术基础。数据转换概念相对简单, 但所涉及的业务逻辑和支撑技术却十分复杂, 要设计并实现一个数据转换系统还有许多工作要做:包括应用业务领域具体需求的定义、转换模型的建立、转换策略的制定及编程实现等等。虽然有一些商业数据库和专用工具可以完成类似功能, 但对于特定的业务逻辑, 考虑到使用和采购的成本等因素, 还需要我们进一步研究相关理论与技术, 独立实现“按需而变”的数据转换系统。

参考文献

[1]网上资源http://sysdocdoors.ch/IBM, http://java.sun.com, http://www.apache.org等.

[2]孙宏伟.XML与RDB的多层次双向数据集成技术研究[D].西北工业大学博士学位论文.2003.

[3]Scott W.Ambler.敏捷数据[M].李巍, 译.北京:机械工业出版社.

上一篇:无线广播系统下一篇:过氧联锁控制