Fortran95第9章 基本计算(一)赋值语句

Fortran95第9章  基本计算(一)赋值语句
Fortran95第9章  基本计算(一)赋值语句

第9章基本计算(一)赋值语句

从计算机的实际状态来看,给出表达式并不意味着计算的开始,真正能够驱动计算的是可执行语句,而最直接驱动表达式的计算过程的就是赋值语句,完成一个赋值步骤,就意味着机器的状态的局部或全局发生了一个根本的变化。

从语法的角度来看,一个表达式还只是一个比较复杂的复合词汇,还不能构成一个完整的语句,而赋值语句则是一个在语法意义上的完整的语句,表达式在赋值语句中扮演关键的语法作用。

从计算问题的角度来看,赋值可以说是基本的计算步骤,考虑一下我们人工计算的过程就可以发现,任何一个完整的计算步骤,都可以说就是一个赋值步骤,特别是公式演算和数值计算,完成一个局部运算过程的标志,往往就是求出某个中间变量的数值或表达式。

FORTRAN语言作为一种以公式翻译为初衷的高级语言,它的赋值语句的一般形式就是一个数学等式,当然不是那种公式恒等变换得到的恒等式,而是要把运算的结果赋予一个变量,因此它的一般句法形式为:

variable = expression

variable => expression

可以看到一个赋值语句作为一个完整的语句,分为三个部分:

● 被赋值的变量

● 赋值符号

● 计算(表达式)

其中被赋值的变量,通过赋值,就拥有了明确的取值形式,如果该变量含有下标,片断下标或子串范围,则赋值的前提是它们都已经获得具体的取值。

基于表达式结果的不同种类,赋值语句分为:

●固有赋值:固有赋值是把任意类型的值赋予一个非指针变量,或把一个指针变量赋

予一个与之相关联的目标。

●自定义赋值:自定义赋值得以构成的前提是存在一个可访问的子例行程序,它包含

一个具有ASSIGNMENT形式的赋值界面,其属性与自定义赋值语句里的变量和表达式的属性保持一致。

●指针赋值:指针赋值把一个指针变量关联到它的目标对象,或者说把一个目标对象

赋予到一个指针变量。在形式上它使用符号=>。

●过滤数组赋值:这个赋值过程是对满足一定条件的数组元素进行赋值,而不是对数

组整体进行赋值。

●并行指标数组赋值。这种赋值形式给出了一种有效的并行机制,能够大规模地对多

重指标变量进行赋值。

下面我们将分节讨论这5类赋值形式,首先给出一些例子如下:

9.1 固有赋值语句

所谓固有赋值的主要特征就是被赋值的变量不能是指针变量,赋值语句本身就是对变量的定义或重定义,变量的取值就是直接计算赋值语句右边的表达式所得。不需要额外的子程序来加以说明。

下面说明固有赋值语句的用法:

●固有赋值中变量与表达式所能够具有的类型,以及它们的一致性要求见表9-1。

●如果变量是标量,那么表达式也必须是标量。

●如果变量是数组,那么表达式或者是标量,或者是相同形状的数组。

●如果变量是显形数组,那么变量的形状可以通过说明语句说明。

●如果变量是待定形数组,那么它的形状由ALLOCATE语句,或指针赋值语句确定。

●如果变量是哑形数组,那么它的形状由变量里的片断下标,或实元确定。变量不能

是哑尺度数组,除非存在含有最后一个维度上的上界的片断下标,或数组的下标向量,或者标量下标。

●表达式的形状由算元的形状,表达式里的运算,以及其中的函数引用决定。

●如果变量是一个指针,那么它必定已经关联到一个目标,赋值语句把表达式的值赋

予指针的目标。指针所关联的目标可以是一个数组,指针决定数组的秩,而每个维度的宽度则由目标决定。

●在赋值过程本身被执行之前,赋值语句右边表达式以及表达式和变量里面包含的下

标与下标片断表达式,都必须预先求值完毕。

●如果变量的类型以及种别参数和表达式的不一致,那么在执行赋值语句之前,还必

须完成必要的针对表达式的类型转换,固有转换函数见下表9-2:

●表达式里面可以使用赋值语句左边变量的部分值。

【例9-2】

DATE(5:10)=DATE(2:6)

注意这是FORTAN现代版本所增加的功能,在FORTRAN77里面是不允许的。

●如果变量和表达式都是字符型的,那么它们必须具有相同的种别参数值。

●如果变量和表达式是具有不同长度属性的字符型对象,那么赋值过程遵循以下规则:

●如果变量的长度比表达式的短,那么把表达式的右边长出来的部分截除;

●如果变量的长度比表达式的长,那么在表达式的右边添加空格,直到跟变量一样长。

●如果在赋值语句左边的变量里面含有表达式,例如下标表达式,那么这个表达式的

计算与取值完全与赋值语句右边的表达式无关,因为左边变量的任何表达式都必须是预先完成计算的。

●如果把一个标量赋值给一个数组,为了保持形状的一致性,需要把该标量扩充为一

个与左边数组同样形状的数组,该数组的每个元素都是那个标量。

【例9-3】

INTEGER X(100)

X=5.0

经过赋值后X的取值为含有100个元素的数组,每个元素都是5.0。

●数组的赋值过程是按照元素位置一一对应进行的。

【例9-4】设有两个相同形状的数组X和Y,有赋值语句:

X=Y

那么具体的赋值过程就是Y的元素赋予X的相同位置的元素,至于不同位置的元素是按照什么顺序来进行赋值的,并不需要考虑,可以认为所有元素的赋值是同时进行的。

●对于派生类型的对象的固有赋值,变量与表达式必须是属于同一个派生类型,而赋

值方法类似于数组,在相同位置的成员之间进行赋值,如果某个成员是指针,则该成员的赋值过程按照指针赋值的规则进行。

9.2 自定义赋值语句

如果需要进行赋值的变量和表达式是不符合表9-1,表9-2所规定的一致性要求的固有类型或派生类型,那么就需要使用自定义赋值语句,它提供赋值界面与相应子例行程序以供访问,从而完成赋值。

自定义赋值是由具有赋值说明符ASSIGNMENT(=)的子例行程序来完成赋值操作的。用户可以在子例行程序当中通过定义新的规则,来扩充可以进行赋值的类型。

下面介绍自定义赋值运算的用法:

●自定义赋值运算由具有两个哑元的子例行程序声明。(子例行程序可以是外部或模块

子例行程序里的对象。)

●子例行程序的哑元按照其出现的前后顺序,分别表示自定义赋值的变量与表达式。

其中第一个哑元必须具有INTENT的OUT或INOUT的属性,而第二个哑元必须具有INTENT的IN的属性。

●具有ASSIGNMENT(=)形式的通用说明符的子例行程序必须带有界面块。

●变量与表达式的类型以及种别参数必须与哑元保持一致。

●对于一个非基本子例行程序,变量与表达式的秩必须与哑元的秩相同。

●对于一个基本子例行程序,变量必须是数组,而表达式与之保持一致;或者两者都

是标量。

●如果变量和表达式同时与一个基本子例行程序和一个非基本子例行程序的界面匹配,

那么赋值运算由非基本子例行程序定义。

●两个哑元或者有一个是派生类型,或者都是固有类型,但不满足固有赋值的一致性

条件。

●对变量的自定义赋值的结果由所引用的子例行程序决定。

【例9-5】

INTERFACE ASSIGNMENT(=)

ELEMENTAL SUBROUTING RATIONAL_TO_REAL(L,R)

USE RATIONAL_MODULE

TYPE (RATIONAL), INTENT(IN) :: R

REAL, INTENT(OUT) ::L

END SUBROUTING RATIONAL_TO_REAL

ELEMENTAL SUBROUTING REAL_TO_RATIONAL (L,R)

USE RATIONAL_MODULE

REAL INTENT(IN) ::R

TYPE (RATIONAL), INTENT(OUT)::L

END SUBROUTING REAL_TO_RATIONAL

END INTERFACE

上面的界面块通过两个外部子例行程序给出了自定义赋值,一个把派生类型RATIONAL的对象赋值给实型对象,另一个把实型对象赋值给派生类型RATIONAL的对象。有了上面的界面块,就可以进行下面的自定义赋值:

REAL R_VALUE, R_ARRAY(20)

TYPE (RATIONAL) RAT_VALUE, RAT_ARRAY(20)

R_VALUE=RATIONAL(5,8)

RAT_VALUE=6.2

9.3 指针赋值

所谓指针赋值,实际上就是把指针变量关联到一个具有TARGET属性的对象上,即使得指针变量成为目标对象的一个“别名”。

如果指针所关联的目标的状态发生改变,例如去关联,或去定义,那么指针的状态也发生相应的改变。一旦指针赋值语句被执行之后,指针的关联状态就不会改变了,除非执行另外一个指针赋值语句来改变其状态,或执行ALLOCATE,DEALLOCATE,NULLIFY语句对指针重定义。

指针赋值的一般形式(R736)为:

pointer-object=> target

其中指针对象(pointer-object)的一般形式(R630)为:

variable-name

structure-component

而目标(target)的一般形式(R737)为:

variable

expression

下面说明指针赋值的用法:

●如果指针对象为变量名称或结构成员,那么它们都必须具有POINTER属性。

●如果目标是命名变量,那么它必须具有TARGET或POINTER属性。

●如果目标是子对象指示符,那么它的父结构必须具有TARGET或POINTER属性,

或者它必须是一个在最右边成员具有POINTER属性的结构引用。

●目标与指针对象的类型,种别参数,长度参数,秩都必须一样。

●如果=>右边的变量具有TARGET属性,那么=>左边的指针对象就被关联到该目标。

●如果=>右边的变量具有POINTER属性,并且处于关联状态,那么=>左边的指针对

象在指针赋值语句执行之后,也被关联到目标指针所关联的同一个数据对象。

●如果=>右边的变量具有POINTER属性,并且处于去关联状态,或者右边的表达被

引用到固有函数NULL,那么=>左边的指针对象也成为去关联状态。

●如果=>右边的变量具有POINTER属性,并且处于去定义关联状态,那么=>左边的

指针对象也成为去定义关联状态。

●指针赋值语句终止了指针对象此前所具有的任何关联状态,从而产生一个新的关联

状态。

●如果指针对象是待定形数组,那么指针赋值语句就能够确立指针数组每个维度的宽

度,即其目标的相应维度的宽度,除非目标本身是去关联指针或去定义指针。

【例9-6】执行以下语句:

INTEGER,TARGET::T(11:20)

INTEGER,POINTER::P1(:),P2(:)

P1=>T

P2=>T(:)

得到P1的宽度是11和20,而P2的宽度是1和10。

●目标不能是属于哑尺度数组的命名变量。

●如果目标是一个哑尺度数组的数组片断,那么它必须具有下标,或者具有在最后一

维给出了上界的下标三元组。

●如果目标为数组片断,那么它不能具有下标向量。

●如果目标是一个表达式,那么它必须给出一个指针结果,这意味着该表达式引用了

固有函数NULL,或者是引用了能够得到指针结果的用户自定义函数或自定义运算。

因为在固有函数或固有运算里,只有NULL得到指针结果。

●如果一个指针的目标没有被引用或定义,那么该指针也不能被引用或定义。

●如果一个结构的某些成员具有POINTER属性,而该结构被固有派生类型赋值语句

进行了赋值,那么对于每个具有POINTER属性的成员,是运用指针赋值语句进行赋值的。

自定义赋值语句可以用来在结构的成员之间进行指针赋值。

【例9-7】

MONTH=>DAYS(1:30)

PTR=>X(:,5)

NUMBER=>INDEXONE%INDEXTWO

FIRST_RESLUT=>NULL()

【例9-8】下面的目标也是指针:

REAL,POINTER::PTR,P

REAL,TARGET::X

REAL Y

X=5.7

P=>X

PTR=>P

Y=PTR-8.1

【例9-9】下面的目标为表达式:

INTERFACE

FUNCTION POINTER_FCN(X)

REAL X

REAL,POINTER::POINTER_FCN

END FUNCTION

REAL,POINTER::P

REAL A

P=>POINTER_FCN(A)

注意以下情形:

●在指针与目标之间建立关联,除了指针赋值语句之外,使用ALLOCATE语句也能做到,而使得指针去关联则也可使用DEALLOCATE或NULLIFY语句。

●当在表达式或过程里引用指针时,会得到与该指针关联的目标的值,这点与在指针赋值语句里不同。

●当指针是作为一个与具有POINTER属性的哑元相应的实元出现的时候,那么该引用是到达指针本身,而不是它的值。

9.4 过滤数组赋值

对于数组的赋值,除了全数组的一一对应的赋值方式之外,很多时候,还需要做到在数组里挑选符合一定条件的某些元素,只对这些特定元素进行赋值。这时已有的赋值语句都无法做到,因此FORTRAN专门提供了过滤数组赋值方式,用来完成这类任务。

所谓过滤数组赋值,实际上就是建立WHERE块,或ELSEWHERE块,或者是WHERE 语句,然后在其中使用固有赋值语句,它的变量为数组时,就可以对其元素进行选择性赋值。

在WHERE语句或WHERE结构里对数组元素进行过滤,是根据一个逻辑数组表达式的值来进行的,该逻辑数组表达式是从数组取值而得到逻辑型值的条件表达式,作用于:

●基本固有运算;

●基本固有函数引用;

●基本自定义运算;

●基本自定义函数引用;

●固有赋值;

●基本自定义赋值。

注意所谓WHERE语句或WHERE结构非常类似于选择控制结构IF结构或IF语句,但它们有一个主要的差别,就是在WHERE结构里,所有的赋值语句都是要执行的,即使是

不满足条件的元素,它的赋值同样执行了,只是不满足条件的元素的赋值对随后的程序不其任何作用而已。但是在IF结构里,不满足条件的情形是不被执行的。

9.4.1 WHERE语句

WHERE语句的句法形式(R738)为:

WHERE(logical-expression)array-assignment-statement

其中逻辑表达式(logical-expression)对所有数组元素起作用,就相当于一个过滤网,使得表达式结果为TURE的数组元素被赋值给变量,而表达式结果为FALSE的数组元素不被赋值给变量。

【例9-10】

WHERE(CURRENT>1.00)PASS=CURRENT

WHERE(TEMP<0.40)USEFULL=TEMP

9.4.2 WHERE结构

WHERE结构的句法形式(R739)为:

[where-construct-name:] WHERE(logical-expression)

[where-body-construct]…

[ELSEWHERE(logical-expression)[where-construct-name]

[where-body-construct]…]…

[ELSEWHERE [where-construct-name]

[where-body-construct]…]

END WHERE [where-construct-name]

其中where体结构的句法形式(R741)为:

assignment-statement

where-construct

where-statement

在初始WHERE语句当中出现的逻辑表达式构成了一个过滤网,可以控制在WHERE 体结构里给出的数组赋值语句的表达式取值和赋值。如果逻辑表达式在ELSEWHERE语句当中也出现,那么该语句就成为了过滤ELSEWHERE语句。

【例9-11】

INTEGER::N(9)=(/1,2,3,4,5,6,7,8,9/)

WHERE(MOD(N,2)==0)

N=2 !现在N=(/1,2,3,2,5,2,7,2,9/)

ELSEWHERE(MOD(N,3)==0)

N=3 !现在N=(/1,2,3,2,5,2,7,2,3/)

ELSEWHERE(MOD(N,5)==0)

N=5 !现在N=(/1,2,3,2,5,2,7,2,3/)

ELSEWHERE

N=0 !现在N=(/0,2,3,2,5,2,0,2,3/)

END WHERE

下面说明WHERE结构的用法:

●一个结构名称不能单独出现在初始WHERE语句,或END WHERE语句里,必须成

对出现。如果一个结构名称出现在ELSEWHERE语句里,或者是过滤ELSEWHERE 语句里,那么它也必定出现在WHERE结构语句里。

●在WHERE结构的每个赋值语句里,被定义的变量必须和过滤网具有相同的形状,

如果在WHERE结构的其他位置也出现了过滤网,它们的形状必须都相同。

●WHERE结构里的语句按照其出现的顺序执行。

●每个过滤网的有效取值只有一次,随后的逻辑表达式里的取值变化都对控制过滤网

的值没有影响。

●WHERE结构里的自定义赋值必须由基本子例行程序定义。

●只有在控制过滤网取真值时,赋值语句里的基本运算或函数才得到计算。

【例9-12】

REAL X(1,100)

WHERE(X>0.0)

SQRTX=SQRT(X)

END WHERE

●如果在结构的逻辑表达式或赋值语句当中出现了数组构造器,那么它将不经过过滤

而得到完全计算。

●结构里的表达式或变量或逻辑表达式里的非基本函数引用将得到完全计算,尽管有

可能结果数组的所有元素都用不上。

【例9-13】

REAL A(2,3),B(3,10),C(2,10),D(2,10)

IMTRINSIC MATMUL

WHERE (D<0.0)

C=MATMUL(A,B)

END WHERE

其中矩阵乘积的所有元素都得到了,但是只有小于0的元素才得到赋值。

●在WHERE结构里,只有WHERE语句才能成为分支目标。

9.4.3 WHERE 结构的运行

当WHERE 结构开始运行的时候,其中的控制过滤网和候选过滤网就都已经建立了,而控制过滤网主宰了随后的语句块的执行。

● 如果WHERE 结构不是嵌套WHERE 结构,那么控制过滤mask 取得逻辑表达式的值,而候选过滤网的值为.NOT.mask 。

【例9-14】

WHERE(A1) !语句1

CALL B1 !块1

ELSEWHERE(A2) !语句2

CALL B2 !块2

ELSEWHERE !语句3

CALL B3 !块3

END WHERE

在执行语句1之后,控制过滤网的值为A1,而候选过滤网的值为.NOT.A1;

在执行语句2之后,控制过滤网的值为(.NOT.A1).AND.A2,而候选过滤网的值为(.NOT.A1).AND(.NOT..A2);

在执行语句3之后,控制过滤网的值为(.NOT.A1).AND(.NOT..A2)。

● 如果WHERE 结构是嵌套WHERE 结构,还是以上面的例子来说明运行过程:如果最外层主宰着块内的语句运行的初始控制过滤网是outer-mask ,那么块1的控制过滤网取值为outer-mask.AND.A1,从这个初始状态开始,就可以得到向内嵌套过程的每个控制过滤网取值,即总是向内取逻辑与运算。到运行内部END WHERE 语句时,控制过滤网就回复到outer-mask 。

9.4.4 WHERE 结构与控制结构的差别

WHERE 结构与控制结构的主要差别在前面9.4已经讨论过,除此之外,还有个差别,就是在WHERE 结构里,不存在从WHERE 块或ELSEWHERE 块里转移出来的机制,当然除了使用函数引用之外。因为在这些块里都不允许分支语句。

WHERE 结构还有一个特征,就是在结构前面块里的语句的执行,会影响后面块里的变量引用,因为所有块里的语句都会顺序得到执行。

9.5 并行指标数组赋值

在数学计算当中,经常会遇到如下的计算任务:

,对于i 从1到n ,j 从1到m 。

,对于i 从1到n 。

22

ij x i j =-ii i x y =

其中第一个计算可以使用嵌套DO循环描述如下:

DO J=1,M

DO I=1,N

X(I,J)=I**2-J**2

END DO

END DO

不过这种实现方法完全没有利用数组这种强大的数据结构,而在很多系统里面,通过利用数组,可以更加有效地完成上面类型的计算任务。

对于FORTRAN而言,除了运用DO循环之外,运用固有函数SPREAD,再采用数组赋值的形式,也可以完成上面的计算:

X=SPREAD((/(I,I=1,N)/),DIM=2,NCOPIES=M)**2-&

SPREAD((/(I,I=1,M)/),DIM=1,NCOPIES=N)

而在FORTRAN里,一种更加自然的计算方法是使用FORALL语句。该语句充分发挥了数组在数据结构方面的特点,使得这种计算更加有效率:

FORALL (I=1:N,J=1:M)X(I,J)=I**2-J**2

显然,在这种计算方法里面,FORALL能够直接把数组元素和片断引用到表达式里面,不仅使得计算过程一目了然,而且表现了并行计算的优越性。

对于上面的第二个数学计算任务,它不能使用数组片断来描述,但FORALL语句则能够把秩为1的数组Y的元素赋值给数组X的对角线:

FORALL(I:N)X(I,I)=Y(I)

如此就轻松自然地完成了计算任务。

在关键词FORALL后面的括号部分称为FORALL头,它能够对后面的多个语句发挥控制作用。

【例9-15】

FORALL (I=2:N-1,J=2:N-1)

A(I,J)=(A(I+1,J)+A(I-1,J)+A(I,J+1)+A(I,J-1))/10.0

B(I,J)=10.0/A(I+1,J+1)

END FORALL

在FORALL语句与END FORALL语句之间的部分,称为FORALL体,FORALL体里面可以包含如下内容:

●赋值语句;

●指针赋值语句;

●WHERE结构和语句;

●FORALL结构和语句。

FORALL体可以包含FORALL结构和语句,也就是说FORALL结构可以嵌套。

FORALL体的结构和语句的执行是顺序往下执行的,所有右边的表达式对所有的指标进行求值计算时,对于不同的指标的求值计算,则是按照任意次序,当这样的计算都完成之后,随即进行的赋值也是按照任意的次序。

所以尽管FORALL语句构造了一个循环结构,但是每当针对结构里的一个语句进行求值时,被认为是进行并行指标运算,每完成一个语句的所有指标的运算,才转到下一个语句的计算,因此具体的在计算每个语句的所有指标时,到底系统是按照什么顺序,是不需要规定的,完全依靠具体的系统的自身特定来实现,在FORTRAN语言层面上不加以规定,因此使得FORALL结构具有了与控制结构完全不同的特征,因为所谓控制结构,是对每一个指标的运算都加以控制的,因此在执行控制语句时,不得不制定不同指标的运算顺序。

FORALL的优越性正是体现在这里,因为语言没有规定的对指标的计算,完全可能在某些系统里面是并行进行的,这样的话,一下子就使得数组具有了并行计算的特征,从而可以大大地提高程序运行的效率。

有时,可能需要排除一些元素,这时,就需要在FORALL头里加入一个过滤表达式。

【例9-16】

FORALL(I=1:N,J-=1:M,A(I)<100.AND.B(I)<100)&

C(I,J)=A(I)+B(J)

9.5.1 FORALL结构

在FORALL头里的说明三项列,再加上可选的过滤网,就可以控制FORALL体内的多种赋值语句,WHERE结构与语句,以及嵌套FORALL语句与结构。

下面我们分形式与运行两个部分来讨论FORALL结构。

1. FORALL结构的形式

FORALL结构的句法形式(R747)为:

[forall-construct-name:]FORALL(forall-triplet-specification-list &

[,scalar-logical-expression])

[forall-body-construct]…

END FORALL [forall-construct-name]

其中的forall说明三项(forall-triplet-specification)的句法形式(R750)为:

index-name = scalar-integer-expression:&

scalar-integer-expression [:scalar-integer-expression]

其中的forall体结构的句法形式(R751)为:

assignment-statement

pointer- assignment-statement

where-construct

where-statement

forall-construct

forall-statement

FORALL结构的一般规则如下:

● 结构名称必须在FORALL语句与END FORALL语句里成对出现,或者都不出现。

●指标名称必须是一个标量整型变量的名称。该名称的作用域与FORALL结构的作用域一致,并且在该作用域内保持自己的属性不变。

【例9-17】

SUBROUTING OPE(I,X)

INTEGER,INTENT(IN)::I

INTEGER X(:)

FORALL(I=1:SIZE(X))

X(I)=I

END FORALL

…..

END SUBROUTING OPE

在执行了上面的FORALL结构之后,X取值为(1,2,…),而I保持它在刚进入子例行程序时的取值不变;在FORALL结构里对I的定义过程也不影响I的意向属性IN。

●在说明三项里的表达式里面,不能引用它所在的说明三项列里的指标名称。

【例9-18】下面的FORALL语句是错误的:

FORALL(I=1:J,J=1:M)A(I,J)=I*2+J*3

必须换一种写法如下,才是有效的:

FORALL(I=1:N,J=1:M,I<=J)A(I,J)=I*2+J*3

● 一个标量逻辑型表达式定义了一个过滤网,其中可以引用指标名称。

【例9-19】

FORALL(I=1:100,J=1:100,X(I)/=0.0 .AND. Y(J)>0.0)

END FORALL

● 在定义过滤网的逻辑表达式或FORALL体结构里的任意位置,要引用过程的话,该过程必须是纯粹过程。

● 在FORALL体结构里指标名称不能被加以赋值。

●FORALL结构里的单个语句不能进行多对一的赋值。

【例9-20】

FORALL(J=1:30)

X(INDEX(J))=Y

END FORALL

上面的赋值只有在INDEX(1:30)不包含重复值的情形下才能进行,不过在FORALL结构里,可以通过使用多个语句做到赋值或指针赋值到同一个数据。

●FORALL体结构不能是分支结构。

●每个说明三项列里的指标名称,是可以出现在被赋值的变量的下标或片断下标列表

里面。

●FORALL结构里的赋值语句可以是数组赋值语句。

【例9-21】

REAL X(100,100)

FORALL(I=1:N)

X(I,:)=1.0/REAL(I)

上面的赋值语句把一个标量值1.0/REAL(I)赋值到数组X的第2维的每个坐标上。

●FORALL结构里的赋值语句可以是指针赋值语句。

【例9-22】

TYPE SCREW

CHARACTER(20),POINTER::HEAD_TYPE

REAL LENGTH,THREAD

END TYPE SCREW

TYPE(SCREW) INVENTORY(500)

REAL THREAD(100)

CHARACTER(20), TARGET:: HEAD_TYPES(5)

FORALL (I=1:500, INVENTORY(I)%LENGTH> .05)

INVENTORY(I)% HEAD_TYPE=> HEAD_TYPES &

(MOD(I-1, 5)+1

! HEAD_TYPES的下标是1,2,3,4,5,1,2,3,4,5,…

INVENTORY(I)%THREAD=THREADS((I-1)/5+1)

! THREADS的下标是1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,…

END FORALL

所谓三项说明实际上就是一个三元组,即:

scalar-integer-expression:scalar-integer-expression:scalar-integer-expression

可以理解为一个数学上常规的三元组,三元组它的取值的集合即对这3个表达式值的集合的笛卡儿乘积。

2. FORALL结构的运行

FORALL结构的运行分如下3个步骤:

●确定指标名称变量的取值;

●如果存在过滤网表达式的话,计算该表达式;

●执行体结构。

1. 确定指标名称变量的取值

首先对指标名称变量求值,得到指标值的集合。

对三元组里的3个标量整型表达式的求值,可以是任意次序。

如果有必要的话,需要把结果值的类型转换为指标名称的类型。

设3个表达式分别为m1,m2,m3,那么指标值的数目由如下公式决定:n=(m2-m1+m3)/m3

其中如果m3不存在的话,取默认值1。

如果n小于或等于0,那么整个结构的执行就到此为止,否则指标名称的值的集合就是m1+(k-1)*m3

而指标值组合的集合由每个三项说明给出的值集合的笛卡儿乘积决定。

2. 计算过滤网表达式

过滤网逻辑表达式的结果为TURE时,就从上面步骤得到的指标值的组合的集合(一个笛卡儿乘积)里选择出一个子集合,被称为指标值的激活组合。

3. 执行体结构

FORALL体结构里的可能的执行单位类型包括:

●赋值语句;

●指针赋值语句;

●WHERE结构或语句;

●嵌套FORALL结构或语句。

整个体结构的执行次序,就是按照各个执行单位出现的先后次序。当每个单位得到执行时,必须遍历所有的指标值的激活组合。

下面分类型予以说明:

●赋值语句

赋值语句的一般形式为

variable = expression

因此赋值语句的执行包括两个部分,即表达式对指标的求值,和每得到一个表达式的值就进行相应的赋值。因此每个部分都必须遍历所有的指标值的激活组合,这种遍历是不规定次序的。也就是被称为并行指标计算的来源。

如果赋值过程为自定义赋值,那么定义该赋值的子例行程序不能包含对任何被赋值的变量,或被关联的指针的引用。

●指针赋值语句

指针赋值语句的一般形式为

pointer-object=>target

因此与赋值语句类似,指针赋值过程也包括两个部分,即目标表达式对指标的求值,和每得到一个目标的值就进行相应的关联。因此每个部分都必须遍历所有的指标值的激活组合,这种遍历同样是不规定次序的。

●WHERE结构或语句;

WHERE结构里的语句都是按照出现的顺序执行的。

首先是WHERE语句或结构,以及ELSEWHERE语句里的过滤网对所有的由外部FORALL结构给出的指标值的激活组合进行过滤,如果WHERE结构嵌套的话,则需要一

直过滤到最里层,然后其中的赋值语句再对所有经过过滤剩下的指标值的激活组合进行赋值操作。

【例9-23】

INTEGER X(5,4)

INT_WHERE: FORALL (I=1:5)

WHERE(X(I,:)==0) X(I,:)=I

END FORALL INT_WHERE

如果X 取初始值:

那么运算的结果为:

● 嵌套FORALL 结构或语句。

内部FORALL 结构或语句的头里的三项列中的表达式的计算是对外部FORALL 结构的指标值的激活组合进行的,每个表达式由此得到的值的集合组合起来,即得到该层FORALL 结构的指标值组合集合。然后再通过其中的过滤网得到它的指标值的激活组合的集合,再用这个指标值集合来控制其中的赋值语句。

【例9-24】

INTEGER X(3,3)

OUTER :FORALL(I=1:N-1)

INTER :FORALL(J=I+1:N)

X(I ,J)=X(J ,I)

END FORALL INTER

END FORALL OUTER 如果N 取值3,X 取初始值为:

那么经过上面程序的运算,得到值:

00001110220210230

000????????????????1111111222321

4235555????????????????

036147258?????????

?

9.5.2 FORALL 语句

FORALL 语句通过一个指标值集合以及可选的过滤网,对单独一个赋值语句或指针赋值语句进行控制。

FORALL 语句的一般形式(R754)为:

FORALL(forall-triplet-specification-list [,scalar-logical-expression])&

forall-assignment-statement

其中forall 赋值语句的句法形式(R752)为:

assignment-statement

pointer- assignment-statement

FORALL 语句实际上可以把它看成是只包含一个为赋值语句或指针赋值语句的体结构的FORALL 结构,它的运行过程就是那个FORALL 结构的运行过程,其中头里面的指标的作用域就是该语句自身。

上面有关嵌套FORALL 结构的例子里面的嵌套FORALL 结构的功能可以使用一个单独的FORALL 语句来表达:

FORALL(I=1:N-1,J=1:N ,J>I)X(I ,J)=X(J ,I)

012145258?????????

?

输入、输出、赋值语句同步练习2

输入、输出、赋值语句 1、计算机的程序设计语言很多,但各种程序语言都包含下列基本的算法语句: , , , , 。 2、 在程序语言中,下列符号分别表示什么运算 * ;\ ;∧ ;SQR ( ) ;ABS ( )? , , , , 。 3、下列程序运行后,a ,b ,c 的值各等于什么? (1) a=3 (2) a=3 b=-5 b=-5 c=8 c=8 a=b a=b b=c b=c PRINT a ,b ,c c=a END PRINT a ,b ,c END (1)________________________ (2)________________________ 4、. 指出下列语句的错误,并改正: (1)A=B=50 (2)x=1,y=2,z=3 (3)INPUT “How old are you ” x (4)INPUT ,x (5)PRINT A+B=;C (6)PRINT Good-bye! 5.将两个数8,17a b ==交换,使17,8a b ==,下面语句正确一组是 ( ) 6. ) 3b =

a a b =+ b a b =- PRINT a ,b A 1,3 B 4,1 C 0,0 D 6,0 7 下列给出的赋值语句中正确的是( ) A 4M = B M M =- C 3B A == D 0x y += 8 对赋值语句的描述正确的是 ( ) ①可以给变量提供初值 ②将表达式的值赋给变量 ③可以给一个变量重复赋值 ④不能给同一变量重复赋值 A ①②③ B ①② C ②③④ D ①②④ 9、已知f (x )=x 3-3x 2 +2x+1,写出任意一个x 的值对应的函数值f (x )的求法程序. 10.已知华氏温度和摄氏温度的转化公式为: 5(32)9=-?摄氏温度华氏温度 编写一个程序,输入一个华氏温度,输出其相应的摄氏温度。 11.编写一个程序,输入两个非零实数,输出他们加、减、乘、除的结果。 12.已知一个三角形的三边长分别是,,a b c ,它的面积可用海伦—秦九韶公式计算。 S =2a b c p ++= 设计一个算法程序,输入三角形的三条边长,,a b c ,输出三角形的面积S 。 13.春节到了,糖果店的售货员忙极了。已知水果糖每千克10.4元,奶糖每千克15.6元,果仁巧克力每千克25.2元,那么依次购买这三种果糖,,a b c 千克,应收取多少钱?请你设计一个程序,帮售货员算账。 14.编写一个程序,输入梯形的上底、下底和高的值,计算并输出其面积。 15.编写一个程序,交换两个变量a 、b 的值,并输出交换前后的值。

带格式的输出语句及输入语句

带格式的输出语句及输入语句 一、输入语句(读语句) 在程序中可以用赋值语句给变量获得一个确定的值,但是变量的值经常变化,尤其初始化时,则必须使用输入语句──读语句,将更为方便。读语句是在程序运行时由用户给变量提供数据的一种很灵活的输入动作,它有两种格式: 1.读语句的一般格式: read(<变量名表>); readln[(<变量名表>)]; 其中变量名表是用逗号隔开的若干个变量名组成的。 功能:从标准输入(即INPUT,一般对应着键盘)中读入数据,并依次赋给相应的变量。 说明: ①read和readln是标准过程名,它们是标准标识符。 ②执行到read或readln语句时,系统处于等待状态,等待用户从键盘上输入数据,系统根据变量的数据类型的语法要求判断输入的字符是否合法。如执行read(a)语句,a是整型变量,则输入的字符为数字字符时是合法的,合法的情况下将输入的整数赋给变量a。 ③在输入数值型(整型或实型)数据时,数据间要用空格或回车分隔开各个数据,一定要输入足够个数的数据,否则仍要继续等待输入,但最后一定要有回车,表示该输入行结束,直到数据足够,读语句执行结束,程序继续运行。 例3. 设a、b、c为整型变量,需将它们的值分别赋以10,20,30,写出对应下列语句的所有可能输入格式。 Read(a,b,c); 解 根据③,即可列出所有可能输入格式 (a)10□20□30←┘ (b)10□20←┘ 30←┘ (c)10←┘ 20□30←┘ (d)10←┘ 20←┘ 30←┘ 其中"←┘"表示回车键。 ④read语句与readln语句的第一个区别是:

read语句是一个接一个地读数据,在执行完本Read语句(读完本语句中变量所需的数据)后,下一个读语句接着从该数据输入行中继续读数据,也就是说,不换行。如: Read(a,b); Read(c,d); Read(e); 如果输入数据行如下: 1□2□3□4□5□6□←┘ 则a,b,c,d,e的值分别为1,2,3,4,5,如果后面无读语句则数据6是多余的,这是允许的。 Readln则不同,在读完本Readln语句中变量所需的数据后,该数据行中剩余的数据多余无用,或者说,在读完本Readln语句中变量所需数据后,一定要读到一个回车,否则多余的数据无用。 例4 设要达到例1同样的目的,但语句改为: readln(a,b);readln(c) 则例3中的4种输入格式只有(b)(d)是有效的. ⑤readln语句与read语句的第二个区别是:read后一定要有参数表,而readln 可以不带参数表,即可以没有任何输入项,只是等待读入一个换行符(回车)。经常用于暂停程序的运行,直到输入一个回车。 例5 设有下列语句: read(a,b,c); readln(d,e); readln; readln(f,g); 其中,所有变量均为整型。再设输入的数据如下: 1□2←┘ 3□4□5□6□7□8←┘ 9□10←┘ 11←┘ 12□13←┘ 列表给出每个变量的值.

1.2.1输入、输出语句和赋值语句(教、学案)

1. 2.1输入、输出语句和赋值语句 【教学目标】 1.正确理解输入语句、输出语句、赋值语句的结构。 2.会写一些简单的程序。 3.掌握赋值语句中的“=”的作用 【重点与难点】 教学重点:正确理解输入语句、输出语句、赋值语句的作用。 教学难点:准确写出输入语句、输出语句、赋值语句。 【教学过程】 1.情境导入 在现代社会里, 计算机已经成为人们日常生活和工作不可缺少的工具, 如:听MP3, 看 电影, 玩游戏, 打字排版, 画卡通画, 处理数据等等, 那么, 计算机是怎样工作的呢? 计算机完成任何一项任务都需要算法, 但是, 我们用自然语言或程序框图描述的算法, 计算机是无法“看得懂, 听得见”的。因此还需要将算法用计算机能够理解的程序设计语言(programming language )翻译成计算机程序。 程序设计语言有很多种。为了实现算法中的三种基本的逻辑结构:顺序结构、条件结构、 和循环结构, 各种程序设计语言中都包含下列基本的算法语句: 输入语句 输出语句 赋值语句 条件语句 循环语句 2..探究新知 我们知道, 顺序结构是任何一个算法都离不开的基本结构。 输入、输出语句和赋值语句基本上对应于算法中的顺序结构。(如右图)计算机从上而下按照语句排列的顺序执行这些语句。 输入语句和输出语句分别用来实现算法的输入信息, 输出结果的功能。 用描点法作函数3 2 32430y x x x =+-+的图象时, 需要求 出自变量与函数的一组对应值。编写程序, 分别计算当5,4,3,2,1,0,1,2,3,4,5x =-----时的函数值。 程序: (一)输入语句 在该程序中的第1行中的INPUT 语句就是输入语句。这个语句的一般格式是:

VB中输入输出语句

VB中输入输出语句 教学目标: 知识与技能:1、掌握输入函数inputbox 2、掌握输出语句print的用法 3、初步学会分析程序 过程与方法:经历分析问题、算法设计、编写程序、调试程序等用计算机解决问题的过程。 情感与态度:培养学生分析处理问题的能力与合作学习能力,增强学生的逻辑思维能力。 教学重点: 1、INPUTBOX的用法 2、PRINT语句的用法 教学难点: PRINT语句的用法 教学过程: 一、赋值语句 格式:变量=表达式 “=”为赋值符号,它的含义是将表达式的值赋给左边的变量 A=30 A=A+10 A=30 变量A 30 A=A+10 40 注:老师讲解学生认真听并理解赋值号和数学中等号的不同之处 InputBox函数的一般格式: InputBox(提示内容,[标题],[输入框起始值],[x坐标位置] ,[y坐标位置]) 每执行一次InputBox函数,用户只能输入一个数据,且这个数据是字符串类型(string)。 例:p=InputBox("请输入密码","密码框") 注:以实例逐个讲解输入函数的各个参数,让学生看到每个参数加上后的效果,学生认真听,理解inputbox()函数的使用方法。 三、输出数据 Print基本格式: print输出内容 1、如果输出的内容是数、变量、表达式,则输出的是数、变量、表达式的值。如果是用引号引起来的字符串,则原样输出。 2、输出的内容可以是一个或多个。如果是多个输出,则各输出内容之间可以用逗号或分号来分隔。 3、输出的内容后面没有符号,则表示下一个print换行输出;如果print中没有

输出内容,则表示输出一个空行。 注:输出语句是编写程序必需掌握的基本语句,老师以实例讲解每个输出要点,输出语句的各个规则,学生观摩并记住print的用法。 四、实战练习 试编写一个程序,交换两个变量的值。 程序: Dim a, as integer,b as integer A=inputbox(“A=”,”输入A”) B=inputbox(“B=”,”输入B”) C=A A=B (先用学生的方式看看交换后的结果, B=C 用比喻的方式让学生容易接受,如交换两怀水一定要弄第3个容器)Print “交换后A=“;A,”交换后B=“;B

C语言数据的输入与输出

C语言数据的输入与输出 一.Printf函数 函数原型在头文件stido.h中(使用时可以不包括) printf函数的返回值等于成功输入得数据的个数 1.printf函数得一般调用形式 printf(格式控制字符串,输出项列表) 格式控制字符串包括: (1)格式指示符 格式:%[标志][宽度][.精度][ [ h|l ] <类型>] (2)转义字符 如:'\n' , '\0' (3)普通字符 如:printf("max=%d,min=%d\n", a, b); “max=”和“,min=”是普通字符;“%d”是格式指示符;“\n”是转义字符; a和b是输出类表中的输出项(可以是常量、变量、或表达式)。 2.print函数中常用得格式控制说明 (1)数据类型控制字符 (2)数据类型修饰符 数据类型修饰符在%和数据类型控制符之间 如:长整型 "%ld" ,短整型 "%hd" (3)输出数据所占得宽度与精度

1)在%与格式字符之间插入一个整数来指示输出宽度。 若指定得输出宽度不够,系统自动以数据实际值得宽度作为输出宽度;如果指定的输出宽度多于数据实际所需宽度,数据右对齐,左边补以空格。 如:printf("%5d\n",42); \*输出结果: 42*\ 2)float或double类型得实型数可以用“整数1.整数2”的形式在指定总宽度的同时指定小数位得宽度。“整数1”指定输出数据得总宽度(小数点也要计算在内),“整数2”称之为精度,即小数位的位数。 注意:输出数据得实际精度并补取决与格式控制中的域宽和小数得位宽,而是取决于数据在计算机内的存储精度。 (4)标志控制字符 1)输出数据左对齐的标志字符“-”,在指定输出宽度之前。 如:printf("%-5d##\n",24); \*输出结果:24 ##*\ 2)输出数字总是带正负号得标志字符“+”,在%和格式字符之间(或指定得输出宽度前) 如:printf("%+d,%+d\n",100,-200); \*输出结果:+100,-200*\ 3)在输出数据前加前导0,可以在指定输出宽度得同时,在数据前面得多于空格处填以数字0。 如:printf("%05d\n",59); \*输出结果:00059*\ 二.Scanf函数 函数原型在头文件stdio.h中(使用时可以不包括) Scanf函数的返回值等于成功输入得数据的个数。 1.scanf函数得一般调用形式 scanf(格式控制字符串,地址列表) 格式控制字符串:%[*][输入数据宽度][ h|l ]<类型> 地址列表是各变量得地址,如:&a,&b

输入语句、输出语句和赋值语句

输入语句、输出语句和赋值语句 一、选择题 1.下列给出的输入、输出语句正确的是() ①INPUT a;b;c②INPUT x=3 ③PRINT A=4④PRINT20,3] A.①② B.②③ C.③④D.④ 2.下列所给的运算结果正确的有() ①ABS(-5)=5; ②SQR(4)=±2; ③5/2=2.5; ④5/2=2; ⑤5MOD2=2.5 ⑥3^2=9. A.2个B.3个 C.4个D.5个 3.执行下列算法语句后的结果(xMOD y表示整数x除以整数y 的余数)为() INPUT“x,y=”;x,y A=x*y B=x MOD y C=A*y+B PRINT A,B,C END (运行时从键盘上输入16和5) A.A=80,B=1,C=401 B.A=80,B=3,C=403 C.A=80,B=3.2,C=403.2 D.A=80,B=3.2,C=404

4.将两个数a=25,b=9交换,使a=9,b=25,下面语句正确的一组是() a=b b=a b=a a=b c=b b=a a=c a=c c=b b=a A B C D 5.程序:INPUT A A=A*2 A=A*3 A=A*4 A=A*5 PRINT A END 若输入的是2,则输出的值是() A.16 B.120 C.240 D.360 二、填空题 6.程序Ⅰ程序Ⅱ x=0 x=x+2 x=x+3 PRINT x END INPUT x y=x*x+6*x+10 PRINT y END (1)程序Ⅰ的运行结果为________; (2)若程序Ⅱ与程序Ⅰ运行结果相同,则程序Ⅱ输入的值为________. 7.程序:

输入语句、输出语句和赋值语句

一、知识概述 算法是解决问题的一种方法,我们把问题看成函数,那么可以把算法看成将输入转化为输出的一个过程. 输入语句 在一些算法中,变量的初始值要根据情况经常改变.一般我们把程序和初始数据分开,每次进行运算时,即使初始数据改变,也不必改变程序部分,只要每次运行程序时,输入相应的数据就可以了.这个过程在程序语言中要用“输入语句”来控制,我们以BASIC 语言为例. 输入语句的意义是:在编写程序时可以把程序和初始数据分开,达到用程序解决一类问题的目的.换种说法,就是在程序中用字母(变量)代替数参与运算和执行. 1、输入语句的格式 INPUT“提示内容”;变量 例如:INPUT“x=”;x 注:程序语言中的变量与函数 在设计算法的过程中,解决问题的基本思想常常很简单、很清楚,但表述参与运算的数值的频频变换却很麻烦.为了解决这个问题,需要在程序中引入变量.前面通过对函数概念的学习,我们已经了解了变量的含义:在研究问题的过程中可以取不同数值的量称为变量. 程序中一些重要的函数也很有用处,如取平方根函数,取绝对值函数 . 变量与函数是中学数学里最重要的和最基本的概念,在算法的设计里面仍然发挥着重要的和基本的作用,它们会使算法的表达变得非常简捷、清楚. 2、作用和要求 功能:实现算法的输入变量信息(数值或字符). 要求:(1)输入语句要求输入的值是具体的常量; (2)提示内容提示用户输入的是什么信息,必须加双引号,提示内容“原原本本”的在计算机屏幕上显示,提示内容与变量之间要用分号隔开;

(3)一个输入语句可以给多个变量赋值,中间用“,”分隔;输入语句还可以是“提示内容1”;变量1,“提示内容2”;变量2,“提示内容3”;变量3,……的形式.例如:INPUT“a=,b=,c=,”;a,b,c. 输出语句 任何求解问题的算法,都要把求解的结果“输出”.由此可知,任何程序语言也必须有“输出语句”来控制输出,不同的程序语言都有自己的输出语句和表现形式.但功能都是一样的,也就是以某种形式把求解结果“输出”出来.下面我们还是以BASIC语言为例. 1、输出语句的一般格式 PRINT“提示内容”;表达式 例如:PRINT“S=”;S 2、作用和要求 功能:实现算法的输出信息(表达式). 要求:(1)表达式是指算法和程序要求输出的信息; (2)提示内容提示用户要输出的是什么信息,提示内容必须加双引号,提示内容要用分号和表达式分开; (3)如同输入语句一样,输出语句可以一次完成输出多个表达式的功能,不同的表达式之间可用“,”分隔;输出语句还可以是“提示内容1”;表达式1,“提示内容2”;表达式2,“提示内容3”;表达式3,……的形式;例如:PRINT“a,b,c:”;a,b,c. 思考1:输出语句中的表达式和输入语句中的变量有什么区别与联系? 输入语句提示内容后面跟的是变量,这是一个字母,它的作用是将用户输入的数值代入程序中,而输出语句后面跟的是表达式,如3x+2中含有变量,变量参与了运算后形成了表达式.单纯的变量也是一个表达式,也就是说变量是表达式的一种特殊情况,表达式可以是常量、变量或含有变量的运算式.如“PRINT 3”输出的结果为实数3,“PRINT x”是将变量“x”的值输出. 【拓展·归纳】(1)输出语句又称“打印语句”,将表达式的值在屏幕上显示出来; (2)表达式可以是变量、计算公式或系统信息; (3)输出语句有计算功能,能直接输出计算公式的值.

人教A版高中数学必修三第一章1.2-1.2.1输入语句、输出语句和赋值语句同步练习(I)卷

人教A版高中数学必修三第一章1.2-1.2.1输入语句、输出语句和赋值语句同步练 习(I)卷 姓名:________ 班级:________ 成绩:________ 一、单选题 (共11题;共22分) 1. (2分)若输入x的值为3,则该程序运行后,输出变量y的值是() INPUT x IF x>3 THEN y=x*x ELSE y=2*x END IF PRINT y END A . 3 B . 6 C . 9 D . 27 2. (2分)以下给出的输入、输出语句、赋值语句中正确的有() ①输入语句INPUT a;b;c; ②输入语句INPUT x=3; ③输出语句PRINT 20,3*2;

④输出语句PRINT A=4; ⑤赋值语3=B; ⑥赋值语句x+y=0; ⑦赋值语句A=B=-2; ⑧赋值语句T=T*T. A . 2个 B . 3个 C . 4个 D . 5个 3. (2分) (2018高二下·辽源月考) 下列给出的赋值语句中正确的是() A . 4=M B . B=A=3 C . x+y=0 D . M=-M 4. (2分)关于赋值语句需要注意的事项中不正确的是() A . 赋值号左边只能是变量,而不能是表达式 B . 赋值号左、右两边不能对换 C . 不能利用赋值语句进行代数式的演算 D . 赋值号与数学中的等号的意义相同 5. (2分)读程序 甲:INPUT i=1 乙:INPUT i=1000

S=0 S=0 WHILE i<=1000 DO S=S+i S=S+i i=i+l i=i-1 WEND LOOP UNTIL i≤1 PRINT S PRINT S END END 对甲乙两程序和输出结果判断正确的是() A . 程序不同,结果不同 B . 程序不同,结果相同 C . 程序相同,结果不同 D . 程序相同,结果相同 6. (2分)输入x=3,根据程序输出的结果是() A . 13 B . 20 C . 12 D . 5

C语言标准输入输出详解

C CC C输入输出函数 输入输出函数输入输出函数 输入输出函数 本节主要介绍Turbo C2.0标准输入输出函数和文件的输入输出函数。通过本 节的学习可以使读者掌握Turbo C2.0的屏幕输出、键盘输入输出以及磁盘文件的 读写函数, 并能开始进行一些简单的程序的编写。 控制流程语句主要包括: 条件语句、循环语句和开关语句。 1.1 标准输入输出函数 1.1.1 格式化输入输出函数 Turbo C2.0 标准库提供了两个控制台格式化输入、输出函数printf( ) 和 scanf(), 这两个函数可以在标准输入输出设备上以各种不同的格式读写数据。 printf()函数用来向标准输出设备(屏幕)写数据; scanf() 函数用来从标准输入

设备(键盘)上读数据。下面详细介绍这两个函数的用法。 一、printf()函数 printf()函数是格式化输出函数, 一般用于向标准输出设备按 规定格式输出信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些 字符将按原 样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个 规定字符, 用来确定输出内容格式。 参量表是需要输出的一系列参数, 其个数必须与格式化字符串 所说明的输出 参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则 将会出现意想 不到的错误。 1. 格式化规定符 Turbo C2.0提供的格式化规定符如下: ━━━━━━━━━━━━━━━━━━━━━━━━━━ 符号作用 ────────────────────────── %d 十进制有符号整数 %u 十进制无符号整数

pascal-带格式的输出语句及输入语句

1.文件的打开与保存 2.文件的输入与输出语句(结合常量与变量、数的科学记数法) 3.类型:溢出的理解 带格式的输出语句及输入语句 一、写语句的输出格式 在pascal语言中输出数据时是可以按照一定格式的,对整数隐含的输出形式为按十进制数形式。对实数的输出,隐含的形式是科学记数法形式(如果不想用科学记数法输出而用小数形式输出,要自己另行定义)。 事实上,输出语句中的每个输出项中的表达式之后可以加上格式说明,若输出项后没有加格式说明,则数据按系统隐含的格式输出,还可加上一定格式符号按特定格式输出。 ⒈隐含的输出格式 pascal语言为整型量、实型量、布尔型量和字符串( 用一对单引号括起来的字符序列)规定了每种数据所占的宽度(即一个数据占几列) ,一个数据所占的宽度称为"场宽"或"字段宽"。系统给出的隐含场宽称为标准场宽。每一种pascal版本给定的标准场宽不尽相同。下表给出标准pascal和pc机上两种pascal版所规定的标准场宽。 标准场宽 ━━━━━━━━━━━━━━━━━ 数据类型标准pascal Turbo pascal ───────────────── integer 10 实际长度 real 22 17 布尔型10 4或5 字符串串长串长 ━━━━━━━━━━━━━━━━━ 在Turbo Pascal系统中,对于整型字符串的输出都是按数据本身长度输出,对于布尔型数据(只有True和False两种值),TRUE为4列,FALSE为5列,一律采用大写输出。而real 型数据的输出时,则按17列输出,其中第一列为符号位,正号不显示,后四位为"E±nn",中间的12列为尾数部分。如: writeln(sqrt(75)); 则输出□8.6602540379E+00。 而writeln(sqrt(81)); 则输出□9.0000000000E+00。 有时,在程序中往往根据实际情况,需要自己定义场宽。 ⒉指定场宽 在写语句中输出项含有格式符号时,就是为了指定场宽。 ⑴指定单场宽. 格式:write(表达式:N)或writeln(表达式:N),其中N为自然数,指定单场宽后,所有数据不再按标准场宽输出,而按指定场宽输出。若数据实际长度小于指定场宽时,则一律"向右

1.2.1赋值、输入和输出语句(练习题)

赋值、输入和输出语句 一、选择题 1.某一程序中先后相邻的两个语句是:x=3*5;x=x+1; 那么下列说法中正确的是() ①x=3*5的意思是x=3×5=15,此式与算术中的式子是一样的;②x=3*5是将数值15赋给x;③x=3*5也可以写为3*5=x;④该语句程序执行后x的值是16. A. ①③ B. ②④ C.①④D.②③ 答案:B ) 2.已知变量a,b已被赋值,要交换a,b的值,下列方法正确的是( ) A.a=b,b=a B.a=c,b=a,c=b C.a=c,b=a,c=a D.c=a,a=b,b=c 解析:选D.利用赋值语句交换a,b的值需引入第三个量c. 3.在Sci l ab的文本编辑器中有如下程序: a=input(“chinese”); b=input(“math”); c=input(“fo r eign l anguage”); ! ave r=(a+b+c)/3 其中第一步程序语句的作用为( ) A.请求将语文成绩的变量输入给a B.请求输入语文成绩,并将它赋值给a C.将表达式input(“chinese”)的值赋给a D.将变量inpu t(“chinese”)的值赋值给表达式a 解析:选B.这里应注意输入语句与赋值语句的作用. 4.计算机执行下面的程序段后,输出的结果是( ) : a=1; b=3; a=a+b;

b=a-b; p r int(%io(2),a,b); A.1,4 B.4,1 C.0,0 D.6,0 解析:选A.第一步,a=1+3=4;第二步,b=a-b=4-3=1,p r int(%io(2),a,b)输出的顺序为b,a,所以输出b,a应分别为1,4. ` 5.下面程序运行时输出的结果是( ) A=10; B=-5; C=A+B; A=B+C; B=A+C; C=C+A+B; print%io2,A,B,C; A.5,0,10 B.10,5,0 C.5,10,0 D.0,10,5 解析:选B.执行顺序为C=A+B=10-5=5,A=B+C=-5+5=0,B=A+C=0+5=5,C=C+A+B=5+0+5=10.故最后的结果为A=0,B=5,C=10. 6.关于输入语句、输出语句和赋值语句,下列说法中正确的是( ) A.input语句只能给一个变量赋值 B.p r int语句可以在计算机屏幕上输出常量、变量的值和系统信息 ! C.赋值语句就是将赋值号左边的值赋给赋值号右边的变量 D.赋值语句不能给变量重复赋值,只能赋一次值 答案:B 7.在我们写程序时,对于“A.0个 B.1个 C.2个D.3个 解析:选B.①赋值语句中“=”号左右两边不能互换,即不能给常量赋值.左边必须是变量,右边必须是表达式,应改为B=3;②赋值语句不能给一个表达式赋值;③一个赋值语句只能给一个变量赋值,不能出现两个或多个“=”;④该语句的功能是将当前的T平方后再赋给变量T.故选B. 9.下列给出的输入、输出语句正确的是( )

1.2.1 赋值、输入和输出语句

张喜林制 1.2.1 赋值、输入和输出语句 教材知识检索 考点知识清单 1.用来表明 的语句叫做赋值语句. 2.赋值语句中的“=”号,称作 . 3.赋值语句的一般格式为:____.“input”在计算机程序中通常称为 . 4.在Scilab 中,有各种输出语句,如____(填三个以上). 要点核心解读 1.赋值语句 (1)定义:在表述一个算法时,经常要引入变量,并赋给该变量一个值.用来表明赋给某一个变量一个具体的确定值的语句叫做赋值语句.在算法语句中,赋值语句是最基本的语句. (2)格式:赋值语句的一般格式为:变量名=表达式. (3)作用:赋值语句中的“=”号,称作赋值号,赋值语句的 作用是先计算出赋值号右边表达式的值,然后把该值赋给赋值号左边的变量,使该变量的值等于表达式的值. 如:;5;4;3===c b a ;2/)(c b a s ++= ?---=))(*)(*)(*(c s b s a s s sqrt A 这些都是赋值语句.

如,,5=x 是将数值5写到变量x 的存储单元,是赋值;而在判断框中要判断x 是否等于5,应该用 ”“5==x 2.输入语句 在某些算法中,变量的初值要根据情况经常地改变.一般我们把程序和初始数据分开,每次算题时,即使初始数据改变,也不必改变程序部分,只要每次程序运行时,输入相应的数据即可.这个过程在程序语言中,用“输入语句”来控制,不同的程序语言都有自己的输入指令和方法. 如x= input(“What is your name?",“string’’); ∥输入你的名字. //string 代表输入字符型变量. 3.输出语句 任何求解问题的算法,都要把求解的结果“输出”.由此可知,任何程序语言也必须有“输出语句”来控制输出.不同的程序语言都有自己的输出语句和表现形式,但功能是一样的,就是以某种形式把求解的结果“输出”来.下面,我们以Scilab 为例,主要介绍屏幕显示输出.. 在Scilab 中,有各种输出语句,如print ,write ,format ,printf ,disp. 注意:在Scilab 中,程序中的print(% io(2),a ,b ,c)(本语句表示在屏幕上输出a ,b ,c .)的参数%io(2)表示在屏幕上输出.4.如何使用三种基本的语句 (1)输入、输出语句是任何一个程序必不可少的语句,其功能是实现数据的输入、输出,为了使输入、输出更清楚,可以设计提示信息,用引号引起来,与变量之间用逗号隔开. (2)赋值语句是最重要的一种基本语句,‘也是一个程序必不可少的重要组成部分,使用赋值语句,一定要注意其格式要求,如:赋值号左边只能是变量而不能是表达式;赋值号左右两边不能对换;不能利

C语言输入输出练习题

c语言习题--输入输出函数 1. 设i是int型变量,f是float型变量,用下面的语句给这两个变量输入值: scanf("i=%d,f=%f",&i,&f); 为了把100和765.12分别赋给i和f,则正确的输入为 A)100<空格>765.12<回车> B)i=100,f=765.12<回车> C)100<回车>765.12<回车> D)x=100<回车>,y=765.12<回车> 2. 以下程序的输出结果是 main( ) {int a=12,b=12; printf("%d %d\n",--a,++b); } A)10 10 B)12 12 C)11 10 D)11 13 4. 以下程序输出结果是 main( ) { int m=5; if(m++>5)printf("%d\n",m); else printf("%d\n",m--); } A)7 B)6 C)5 D)4 5. 当a=1,b=3,c=5,d=4时,执行下面一段程序后,x的值为 if(a main() { int a=2,c=5; printf("a=%%d,b=%%d\n",a,c); } A) a=%2,b=%5 B) a=2,b=5 C) a=%%d,b=%%d D) a=%d,b=%d 13. 若x和y都是int型变量,x=100,y=200,且有下面的程序片段:printf("%d",(x,y)); 上面程序片段的输出结果是 A) 200 B) 100 C) 100 200 D) 输出格式符不够,输出不确定的值 15. 已知字母A的ASCII码为十进制的65,下面程序的输出是 main() { char ch1,ch2; ch1='A'+'5'-'3'; ch2='A'+'6'-'3'; printf("%d,%c\n",ch1,ch2);}

赋值,输入和输出语句

课题:赋值,输入和输出语句 (一)教学目标 1.知识与技能目标 (1)初步了解基本的算法语句中的赋值,输入和输出语句特点. (2)理解基本算法语句是将算法的各种控制结构转变成计算机能够理解的程序语言. (3)结合Scilab的程序语言,初步掌握赋值,输入和输出语句的结构以及如何编写对应的Scilab程序及在计算机上实现算法. 2.过程与方法目标 (1)通过上机编写程序,在了解三种语句的应用规则的基础上,运用算法语句实现运算. (2)通过模仿,操作,探索的过程,体会算法的基本思想和基本语句的用途,提高学生应用 数学软件的能力. 3.情感,态度和价值观目标 (1)通过对三种语句的了解和实现,发展有条理的思考,表达的能力,提高逻辑思维能力. (2)学习算法语句,帮助学生利用计算机软件实现算法,活跃思维,提高学生的数学素养. (3)结合计算机软件的应用, 增强应用数学的意识,在计算机上实现算法让学生体会成 功的喜悦. (二)教学重点和难点 1.教学重点:赋值,输入和输出语句的基本结构特点及用法. 2.教学难点:三种语句的意义及作用. (三)教学方法 引导与合作交流相结合,学生在体会三种语句结构格式的过程中,让学生积极参与,讨论交流,充分挖掘三种算法语句的格式特点及意义,在分析具体问题的过程中总结三种算法语句的思想与特征.运用计算机教学, (四)教学过程 教学环节1:提出问题 教学内容: 教师提出前面的例子:鸡兔同笼问题的一个算法: S1: 输入鸡和兔的总数量M S2: 输入鸡兔腿的总数N S3: 鸡的数量 4 2 M N A -= S4: 兔的数量B=M-A 如何才能把这些文字语言写成计算机识别的程序语言并能够运行呢? 对于题目中的输入,输出及鸡和兔的数量的表示A,B的表示使同学们对程序语言的表述产生了兴趣,抓住时机进入下一个环节,介绍定义. 在上一节,我们学习算法和程序框图时,就指出了用顺序结构,条件分支结构和循环结构就可以表示任何算法.如何将算法的这些控制结构,转变成计算机能够理解的程序语言和能在计算机上实现的程序呢?现在计算机能够直接或间接理解的程序语言有很多种,这些程序语言都包含了一些基本的语句结构:输入语句,输出语句,赋值语句,条件语句和循环语句.本节课我们就结合Scilab的程序语言,学习赋值语句,输入和输出语句进行分析,帮助大家更好地理解这些语句地结构以及在解决数学问题中的应用.

《输入输出语句和赋值语句》教学设计

《输入、输出语句和赋值语句》 教学设计 一、教学目标: 1、知识与技能:正确理解输入语句、输出语句、赋值语句的结构特点,并会运用他们写一些简单的程序;掌握赋值语句中的“=”的作用;发展有条理的思考,表达的能力,提高逻辑思维能力.。 2、过程与方法:实例使学生充分地感知、体验应用计算机解决数学问题的方法;通过模仿,操作,探索的过程,体会算法的基本思想,在此基础上由算法语句表示算法,从而细致的刻画算法,进一步体会算法的基本思想。 3、情感态度与价值观:通过本节内容的学习,帮助学生利用计算机软件实现算法,活跃思维,提高学生的数学素养.使他们认识到计算机与人们生活密切相关,增强计算机应用意识,让学生体会成功的喜悦。 二、背景分析 1、内容分析:通过前面的学习,学生了解了算法的含义及其本质特征;学习了用算法步骤和程序框图表示算法的方法,理解了用自然语言表示算法步骤有明确的顺序性,但是对在一定条件下才会被执行的步骤,以及在一定条件下会被重复执行的步骤,自然语言的表示就显的困难,而且不直观、不准确;用程序框图的方法表示算法,使算法的结构更加清楚、步骤更加直观和精确;但这两种形式计算机不识别,只有转化为计算机识别的程序语言,计算机才能理解和执行,而且程序语言可以更细致的刻画算法,学习程序语言表示算法是为了借助于计算机执行算法,帮助学生进一步体会算法及其思想。所以本节课的 学习重点:学生理解基本的赋值、输入和输出语句的结构特点及用法.,并在此基础上编写由算法语句组成的程序,帮助学生进一步体会算法及其思想。 2、学清分析:由于程序语言学生前未接触,种类很多,赋值,输入和输出语句都有各自特殊的含义和适用条件,而且算法语句有着严格的语法规则,他的正确与否,需要用计算机来检验,所以本节课的 学习难点:将程序框图转化为算法语句组成的程序。

输入语句、输出语句和赋值语句 (20)

第一章 1.2 1.2.1 【基础练习】 1.下列给出的输入输出语句正确的是() ①输入语句INPUT a,b,c,d,e ②输入语句INPUT X=1 ③输出语句PRINT A=4 ④输出语句PRINT10,3*2,2/3 A.①②B.②③ C.①④D.③④ 【★答案★】C 【解析】①INPUT语句可以给多个变量赋值,变量之间用“,”隔开;②INPUT语句中只能是变量,而不能是表达式;③PRINT语句中不用赋值号“=”;④PRINT语句可以输出常量、表达式的值.故①④正确. 2.下列算法:①z=x;②x=y;③y=z;④输出x,y.关于算法的作用,叙述正确的是() A.交换了原来的x,y B.让x与y相等 C.变量z与x,y相等 D.x,y仍是原来的值 【★答案★】A 【解析】本算法利用了中间变量z,使x,y的值进行了互换. 3.运行下面的程序,若输入x=1,则输出结果y=() INPUT x x=x*2 x=x*3 y=x*x+6 PRINT y END A.36B.42 C.48D.54 【★答案★】B 【解析】由程序知x=1×2=2,x=2×3=6,y=62+6=42. 4.下面的程序输出的结果为() A.27B.9

C. 2+25D.11 x=6 y=3 x=x/3 y=4*x+1 PRINT x+y END m=1 n=2 p=3 p=m n=p m=n PRINT m,n,p END (第4题图)(第5题图) 【★答案★】D 【解析】该程序的运行过程是:x=6,y=3;x=6÷3=2,y=4×2+1=9.x+y=2+9=11,所以输出11. 5.下列程序的运行结果为________. 【★答案★】1,1,1 【解析】此程序主要以赋值语句来设计,其作用是首先对变量m,n,p分别赋值1,2,3,然后将变量m的值赋给p,再将变量p的值赋给n,最后将变量n的值赋给m,所以最后变量m,n,p的值都等于1,运行结果输出1,1,1. 6.把下列程序用程序框图表示出来. A=20 B=15 A=A+B A=A*B PRINT A+B END 【★答案★】解:程序框图如所示. 7.读下列两个程序回答问题.

变式练习(输入语句、输出语句和赋值语句)

?变式练习 1.用公式法求方程x 2-2x +1=0的两个根. 解:LET A=1 LET B=-2 LET C=1 LET D=SQR(B^2-4*A*C) LET X1=(-B+D)/(2*A) LET X2=(-B -D)/(2*A) PRINT X1,X2 END RUN 1 1 2.设三角形的三边长分别为a =18,b =15,c =27,试编写BASIC 程序求三角形面积. 已知三边求面积的公式为 P =(a +b +c )/2,S=))()((c p b p a p p ---. 解:程序如下 INPUT a,b,c LET p=(a+b+c)/2 LET S=SQR(p*(p -a)*(p -b)*(p -c)) PRINT S END RUN ?18,15,27 127.2792 3.已知底和高求三角形的面积. 分析:S=A *H /2,要求从键盘正确输入底和高的值. 解:程序如下: INPUT “a=”;a INPUT “h=”;h s=a*h/2 PRINT “s=”;s END 4.春节到了,糖果店的售货员忙极了.请你用键盘输入语句设计一个程序,帮助售货员算账.其中,水果糖每斤2.4元,奶糖每斤3.6元,果仁巧克力每斤6.9元. 解:程序如下: INPUT “输入水果糖的质量:”;a INPUT “输入奶糖的质量:”;b INPUT “输入果仁巧克力质量:”;c PRINT “应付款:”;a*2.4+b*3.6+c*6.9 END 5.计算并打印出半径为5 cm 、高为24.5 cm 的直圆柱的底面积S 和体积V . 解:程序如下: LET S=3.1415926*5^2

赋值语句、输入语句和输出语句

一、赋值语句 1、赋值语句的格式: 格式:变量名:=表达式{其中“:=”称为赋值号} 赋值语句的执行是:先计算(表达式的值),后赋值(给变量名)。因此,赋值语句具有计算和赋值的双重功能。(例如:FL1)赋值语句可以对各种数据类型的变量赋值(只有个别的除外)。另外,赋值号两边的类型必须相同,即符合赋值相容的原则。 例如: CONST X=’x’; V AR N , m : real ; C : char; E , sum , num : integer; 下面的赋值语句是合法的: c:=x;n=3;e:=2;n:=n-1;e:2*e+1;num:=0;m:=3*n+n*n;sum:=1245;num:=2 *sum+50; 注意: ①赋值号“:=”的左边只能是变量名,而能是表达式。赋值号“:=”与数学中的等好“=”是完全不同的两个概念。 ②对于任何一个变量必须首先说明,然后才能使用,否则,运行是会报告出错。 ③变量可以多次赋值,赋值后的变量将在程序中一直保持不变,知道该变量被重新赋予其他的值。 ④当表达式值为整数时,可自动转化为实型后赋给实型变量,反之是不行的。 二、键盘输入语句 通过计算机的外设(这里指键盘)把数据送到计算机内存(变量名)的过程称为输入。可以看出,通过键盘输入数据实际上也是一个赋值过程。 PASCAL语言的输入语句有如下两中格式: 格式一:READ(<变量名表>); 格式二:READLN(<变量名表>);或READLN;

其中<变量名表>是一个或几个由逗号隔开的变量标识符。它们可以是整型、实型或字符型。而布尔类型是不可以直接读入的。 程序执行到READ或READLN语句时,系统处于等待状态,等待用户从键盘上输入数据,系统根据变量的数据类型的语法要求判断输入的字符是否合法。 在输入数值型(整型或实型)数据时,数据间要用空格或回车分隔开各个数据,输入足够个数的数据,否则仍要继续等待输入,但最后一定要有回车,表示该输入行结束,直到数据足够,该读语句执行结束,程序继续运行。 例如:FL2。 READLN与READ语句的不同之处在于输入数据到各变量之后,READLN自动换行,从下一行开始准备输入、输出语句。 不带变量名表的READLN语句,在执行时不要求输入数据,在程序中可起到暂停作用,按回车键,可跳到下一语句继续执行。在PASCAL 语言编程时,常在最后一个END.前面加上一个READLN;语句,以便运行时能够看到运行结果而不立即返回到编辑状态中,当然在程序中间也可以根据需要适当加上这一语句,便于程序的调试。 注意: ①当程序执行到READ()或READLN()语句时,不论有无变量或何种类型变量,程序都停下来等待从键盘输入数据,然后将数据存入变量表中,否则,程序将一直等下去。 ②当变量为整型或实型时,READ()、READLN()执行时,从键盘读入一个形成数的序列,遇到一个不能形成数的字符立即停止读入,完成一个变量的录入。 ③输入语句输入的数据必须和变量类型一一对应。如果输入的是一串整数或实数,数据间用空格或回车分隔;若输入的是一串字符,则不用分隔。 ④一个READ语句执行完后,数据行中多余的未读数据可以被下一个输入语句读入;而一个READLN语句执行完后,数据行中多余未读数据就没有用了。 ⑤布尔型数据不能使用READ语句读入。 ⑥READLN语句中可以不包含变量名表。即有以下等价情况:

相关文档
最新文档