




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计(一)第1章 C语言概述1.1C语言概况
1.2简单的C语言程序
1.3算
法1.1C语言概况1.1.1C语言的开展C语言的的前身是ALGOL语言〔ALGOL60是一种面向问题的高级语言〕。1963年英国剑桥大学推出CPL〔CombinedProgrammingLanguage〕语言。1970年美国贝尔实验室的肯·汤姆逊进一步简化,提出了B语言。1972年美国贝尔实验室的布朗·W·卡尼汉和丹尼斯·M·利奇对其完善和扩充,提出了C语言。1987年美国标准化协会制定了C语言标准“ANSIC〞,即现在流行的C语言。1.1C语言概况1.1.2
C语言的特点(1)C语言简洁、紧凑,使用方便、灵活(2)运算符丰富,表达式能力强(3)数据结构丰富,便于数据的描述与存储(4)C语言是结构化、模块化的编程语言(5)语法限制不太严格,程序设计自由度大(6)C语言是具有低级语言功能的高级语言(7)生成目标代码质量高,程序执行效率高(8)可移植性好1.2
简单的C语言程序一个完整的C语言程序由一个或多个具有相对独立功能的程序模块组成,这样的程序模块称为“函数〞。因此,函数是C程序的根本单位。一个C程序,不管它有多简单,都必须有且只有一个主函数,例如:main(){}1.2
简单的C语言程序【例1-1】在计算机屏幕上输出“Howareyou!〞/*EX1-1.C*/main(){printf("Howareyou!\n");}1.2
简单的C语言程序【例1-2】己知圆的半径,求圆的周长和面积。/*EX1-2.C*/main(){intr;/*说明圆半径r为整型变量*/floatl,s;/*说明周长l、面积s为实型变量*/r=8;/*给半径r赋初值*/l=2*3.1416*r;/*计算l的值*/s=3.1416*r*r;/*计算s的值*/printf(“r=%d,l=%f,s=%f\n〞,r,l,s);/*输出圆的半径、周长和面积*/}1.2
简单的C语言程序
【例1-3】输入直角三角形的两个直角边的长,求该三角形的面积。/*EX1-3.C*/main(){intx,y,z;scanf("%d,%d",&x,&y);/*输入直角三角形的两个直角边的长*/z=x*y/2;/*求直角三角形面积的值*/printf("areais%d\n",z);/*输出三角形的面积*/}1.2
简单的C语言程序通过以上三个C程序的例子,可以看出:(1)C程序由函数组成。每个C程序有且仅有一个主函数,该主函数的函数名规定为main,也可以包含一个main函数和假设干个子函数。(2)C程序的书写格式自由,一行内可以写几条语句,一条语句也可以写在多行上。每条语句后必须以“;〞作为语句的结束。(3)C程序的执行总是从主函数开始,并在主函数中结束。(4)C语言本身没有输入输出语句。输入和输出操作是由库函数scanf和printf等函数来完成的。C对输入输出实行“函数化〞。(5)可以用/*……*/对C程序中的任何局部作注释。1.3算法算法概述1.算法的定义所谓算法,是指在使用计算机解题前,需要将解题方法转换成一系列具体的在计算机上可执行的步骤,这些步骤能够清楚地反映解题方法一步步“怎么做〞的过程,这个过程就是通常所说的算法。2.算法的特征(1)有穷性〔有限性〕。(2)确定性〔唯一性〕。(3)可行性〔能行性〕。(4)有0到多个输入。(5)有1到多个输出。1.3算法算法的表示1.传统流程图美国国家标准化协会ANSI规定了一些常用的流程图符号,如下图。
起止框处理框判断框或流程线连接点1.3算法【例1-4】画出求2+4+6+8+……+100之和的流程图。流程图如下图。YNi≤100开始s+i⇒s,i+2⇒i0⇒s,2⇒i结束输出s的值1.3算法2.N-S图顺序结构(2)选择结构(3)循环结构当型循环直到型循环
ABP
成立不成立
AB当P成立
AA
直到P成立1.3算法【例1-4】的N-S图如下图。
第2章C语言根底2.1数据类型2.2标识符、常量与变量2.3根本运算2.4数据类型转换2.5程序举例2.1
数据类型
数据类型概述
整型〔int〕数据类型根本类型整型单精度型〔float〕字符型〔char〕长整型〔long〕短整型〔short〕实型双精度型(double)枚举类型〔enum〕共用体类型〔union〕构造类型结构体类型〔struct〕数组类型空类型〔void〕指针类型〔*〕2.1
数据类型整型归纳起来,C语言定义了6种整型,分别是:根本整型int无符号根本整型unsignedint短整型short或shortint无符号短整型unsignedshort或unsignedshortint长整型long或longint无符号长整型unsignedlong或unsignedlongintC语言没有规定各种整数类型的表示范围,也就是说,没有规定各种整数的二进制编码长度,即数据在内存中所占的位数。2.1
数据类型表中列出了一般PC机上规定的整数类型及相关数据。【注意】在VisualC++6.0中,根本整型〔无符号根本整型〕与长整型〔无符号长整型〕在内存中所占的字节数以及表示的取值范围对应相同。2.1
数据类型实型C语言中实型数据又称浮点型数据。TurboC提供了三种表示实数的类型:
单精度浮点数类型,简称浮点类型float双精度浮点数类型,简称双精度类型double长双精度类型longdouble实型的相关规定2.1
数据类型2.1.4字符型字符类型的数据包括计算机所用编码字符集中的所有字符。常用的ASCII字符集包括所有大小写英文字母、数字、各种标点符号字符,还有一些控制字符,一共128个。扩展的ASCII字符集包括ASCII字符集中的全部字符和另外的128个字符,总共256个字符。字符类型的数据在内存中存储的是它的ASCII码值,一个字符通常占用一个字节的内存空间。除了占用的存储空间不同〔因而数据的取值范围不同〕以外,字符数据与整型数据是相似的。为了方便处理,C语言规定字符类型与整型根本一致,即也有有符号和无符号两种类型。2.1
数据类型字符类型的相关规定。由于ASCII码字符的取值范围是0~127,因此,既可以用char类型表示,也可以用unsignedchar类型表示;扩展ASCII码字符的取值范围是0~255,因此,在128~255范围内的扩展ASCII码字符只能用unsignedchar类型表示。
2.2标识符、常量与变量
标识符1.标识符具体命名规那么如下:(1)标识符的只能由下划线“_〞、数字0~9与26个大小写字母〔a~z,A~Z〕构成。TurboC最多识别32个字符,MicrosoftC最多识别8个字符。(2)标识符的首字符必须是字母或下划线“_〞而不能是数字或其它符号。(3)C语言中大小写字母是敏感的,即在标识符中,大写字母和小写字母代表不同的意义。例如:Name和name是两个不同的标识符。(4)标识符不能使用系统关键字,因为关键字是系统的保存字,它们已有特定的含义。2.2标识符、常量与变量
2.关键字所谓关键字是指系统预定义的保存标识符,又称之为保存字。它们有特定的含义,不能再作其它用途使用。ANSIC定义的关键字共32个:2.2标识符、常量与变量
常量1.整型常量(1)十进制整数:如154、565、-6523。(2)八进制整数:以0开头的数是八进制数。如0123表示八进制数的(123)8,等于十进制数83。(3)十六进制整数:以0x开头的数是十六进制数。如0x4a即(4a)16,等于十进制数74。在上述方法表示的整数后面附一个字母l或L作后缀,即可表示该数据的类型是长整型的。例如-63L、0123LU、0x4aL等分别表示十进制有符号长整型数、八进制无符号长整型数和十六进制有符号长整型数。2.2标识符、常量与变量
2.实型常量实型常量只能用十进制形式表示,不能用八进制和十六进制形式表示。(1)小数形式:由数字和小数点组成,如3.1415926、
-0.12、.4、3.等都是实数。(2)指数形式:如1.8e5或1.8E5都代表1.8x105。但注意字母e〔或E〕之前必须有数字,且e后面指数必须为整数,如e3、、e等都不是合法的指数形式。3.字符常量字符型常量是由一对单引号括起来的单个字符构成,例如,'a','b','1'等都是有效的字符型常量。2.2标识符、常量与变量
C语言中的常用转义字符及这些字符的含义
2.2标识符、常量与变量
4.字符串常量字符串常量是由一对双引号括起来的字符序列组成的,例如“abc〞、“a〞等都是字符串常量。字符串常量与字符常量的区别:(1)字符常量由单引号括起来,字符串常量由双引号括起来。(2)字符常量占一个字节的内存空间。字符串常量在内存中存储时由系统自动在存储的所有字符尾部添加串结束标记'\0',所以,字符串常量占的内存字节数等于字符串中字符所占的字节数加1。注意不要将单个字符组成的字符串常量与字符常量混淆。不能把一个字符串常量赋给一个字符变量。2.2标识符、常量与变量
5.符号常量符号常量就是使用符号代表常量。C语言中允许用标识符定义一个常量,这种常量定义在C语言中被称之为“宏定义〞。变量一个变量有3个相关的要素:①变量名;②变量的存储单元;③变量〔存储单元存放〕的值。2.2标识符、常量与变量
1.变量的定义和赋值C语言要求程序中使用的每个变量都必须先定义,然后才能使用。定义变量需要用变量定义语句进行,其形式为:类型变量名[=初值][,变量名[=初值],……];例如:inta;intx,y,min;intm,n=3,w=5;假设对定义的多个变量赋相同的初值,不能采用连续赋初值的形式,如inta=b=c=5,必须采用形式inta=5,b=5,c=5。【注意】除了不能用关键字做变量名外,可以用任何标识符作为变量名。2.2标识符、常量与变量
2.整型数据的存储shortint型补码为16位二进制数,它表示一个有符号整数,其特点是:当首位为0时表示一个正数,当首位为1时表示一个负数。正数的补码与其原码相同,而负数的补码为其对应的正数的反码加1。如:[+4]补=0000000000000100[-4]补=1111111111111100一个用补码表示的二进制数,最高位为符号位,当符号位为“0〞〔即正数〕时,其余位即为此数的二进制值;但当符号位为“1〞〔即负数〕时,其余位不是此数的二进制值,应把它们按位求反,且在最低位加1,才是它的二进制值。如:[X]补=1111111111111101那么X=-000000000000011=-32.2标识符、常量与变量
3.实型数据的存储实型数据是按指数形式存储的。以微机中存储float型数据为例,float型数据在内存中占据4个字节即32位二进制信息,分别存放符号位、规格化的尾数、阶符位和阶码。例如,实数-32.28E-20的存储情况如下图。4.字符型数据的存储用一个字节〔8位二进制信息〕存储字符类型数据。对于无符号字符类型〔unsignedchar〕数据直接存放ASCII码或扩展ASCII码。对于有符号字符类型〔char〕的数据也是用补码存储的。-0.322800-182.3根本运算算术运算1.根本算术运算符C语言规定:(1)%运算符仅用于整型变量或整型常量的运算,a%b的结果为a除以b的余数,余数的符号与被除数相同。(2)+、-、*、/运算符的两个操作数既可以是整数,也可以是实数。当两个操作数均是整数时,结果仍是整数;假设参加运算的两个操作数中有一个是实数,那么结果为double型。(3)当对两个整型的数据相除时结果为整数。但是如果除数或被除数中有一个为负数,那么舍入的方向是不固定的。如:-5/3在有的机器上得到结果-1,有的机器那么给出结果-2。多数机器采取“向零取整〞方法,即-5/3=-1,取整后向零靠拢。2.3根本运算2.算术表达式(1)算术表达式定义由算术运算符、括号以及操作对象组成的符合C语言语法规那么的表达式称为算术表达式。如:a+b-c/d*(a-c)。(2)优先级和结合性在表达式求值时,先按运算符的优先级别上下次序执行。假设一个运算对象两侧的运算符的优先级别相同,如a-b+c,那么按规定的“结合方向〞处理。算术运算符的结合方向为“自左至右〞,又成为左结合性,即先左后右,因此b先与减号结合,执行a-b的运算,再执行加c的运算。2.3根本运算3.自增、自减运算符既可以放在操作数前,也可以放在操作数后,并且操作对象只能是变量,不能是常量或表达式。如i++,i--/*表示在使用i值之后将i的值加(减)1*/++i,--i/*表示在使用i值之前将i的值加(减)1*/例如:设i的原值为5,那么执行下面的赋值语句:j=i++;/*先将i的值赋给j,i再自增1,赋值语句执行完
后i的值为6,j的值为5*/j=++i;/*先将i的值自增1,再赋给j,赋值语句执行完
后i的值为6,j的值为6*/2.3根本运算【注意】(1)自增自减运算符的优先级较高,和单目运算符相同。其结合方向是“自右向左〞〔右结合性〕。考虑表达式-i++,由于“-〞和“++〞优先级相同,均为右结合性,因此相当于-(i++)。(2)尽管自增自减运算符给程序员带来了方便,但同时也带来了副作用。例如,“printf("%d,%d\n",i,i++);〞在不同的编译环境下结果有可能不同。假设i的值为3,那么结果可能是“3,3〞,也可能是“4,3〞。(3)C编译在处理时尽可能多地自左而右将假设干个字符组成一个运算符〔在处理标识符和关键字时也按同一原那么处理〕,如i+++j,将解释为(i++)+j,而不是i+(++j)。2.3根本运算赋值运算1.赋值运算符C语言中,赋值被认为是一种运算,由赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式。其形式是:<变量><赋值运算符><表达式>赋值表达式的值也可以再赋给其它变量,如:a=(b=3+5)。【注意】赋值运算符“=〞不同于数学中使用的符号,它没有“相等〞的含义。如果赋值运算符两侧的数据类型不同时,在赋值时要进行类型转换。2.3根本运算2.复合赋值运算符C语言允许在赋值运算符“=〞之前加上其他运算符以构成复合的赋值运算符。例如:a+=5;等价于a=a+5;a*=b+5;等价于a=a*(b+5);a%=5;等价于a=a%8;在C语言中,可以使用的复合赋值运算符有:+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=3.运算符的优先级和结合性赋值运算符和复合赋值运算符的优先级相同,且都具有右结合性。2.3根本运算【例2-1】分析下面程序的运行结果/*EX2-1.C*/main(){inta=12;a+=a-=a*a;printf("%d\n",a);}2.3根本运算2.3.3位运算运算规那么2.3根本运算1.按位取反【格式】~x【例2-2】分析下面程序的运行结果/*EX2-2.C*/main(){unsignedcharx=56,y;y=~x;printf("%d\n",y);}其运算过程为:56〔00111000〕~56(~00111000)199(11000111)2.3根本运算2.按位与【格式】x&y【例2-3】分析下面程序的运行结果main(){unsignedcharx=56,y=157,z;z=x&y;printf("%d\n",z);}其运算过程为:56:00111000&157:1001110100011000242.3根本运算3.按位或【格式】x|y【例2-4】分析下面程序的运行结果main(){unsignedcharx=56,y=157,z;z=x|y;printf("%d\n",z);}其运算过程为:56:00111000|157:10011101101111011892.3根本运算4.按位异或【格式】x^y【例2-5】分析下面程序的运行结果。main(){unsignedcharx=56,y=157,z;z=x^y;printf("%d\n",z);}其运算过程为:56:00111000^157:10011101101001011652.3根本运算5.左位移【格式】x<<要位移的位数【功能】把操作对象的二进制数向左移动指定的位,并在右面补上相应的0,高位溢出。【例如】如x=00001111,y=x<<2,那么y=00111100。【注意】左移会引起数据的变化,具体地说,左移一位相当于对原来的数值乘以2。左移n位相当于对原来的数值乘以2n。但此结论只适用于该数左移被溢出舍弃的高位中不包含1的情况。2.3根本运算6.右位移【格式】x>>要位移的位数【功能】把操作对象的二进制数向右移动指定的位,移出的低位舍弃;高位那么:(1)对无符号数和有符号中的正数,补0;(2)有符号数中的负数,取决于所使用的系统:补0的称为“逻辑右移〞,补1的称为“算术右移〞。TurboC和其它一些C编译采用的是算术右移。【例如】如x=01010001,y=x>>2,那么y=00010100。【注意】右移会引起数据的变化,具体说,右移一位相当于对原来的数值除以2。右移n位相当于对原来的数值除以2n。但此结论只适用于该数右移被溢出舍弃的低位中不包含1的情况。2.3根本运算【说明】(1)复合赋值运算符除按位取反运算外,其余5个位运算符均可与赋值运算符一起,构成复合赋值运算符:&=、|+、^=、<<=、>>=。(2)不同长度数据间的位运算──低字节对齐,短数的高字节按最高位补位:①对无符号数和有符号中的正数,补0;②有符号数中的负数,补1。逗号运算1.逗号运算符其一般形式为:表达式1,表达式22.3根本运算逗号表达式的求值过程是:先求表达式1的值,再求表达式2的值,表达式2的值就是整个逗号表达式的值。一个逗号表达式可以与另一个表达式构成一个新的逗号表达式。例如:(a=5-3,a*5),a+15逗号表达式的一般形式可以扩展为:表达式1,表达式2,表达式3,…,表达式n2.运算符的优先级和结合性逗号运算符是所有运算符中级别最低的。逗号表达式的结合性为自左向右的。【注意】并不是任何地方出现的逗号都是作为逗号运算符。2.3根本运算【例2-6】分析下面程序的运行结果。main(){inta=5,b=6,c=1;printf("%d%d\n",(++a,b++),c+2);}2.4数据类型转换类型自动转换转换规那么高doublefloat
long
unsigned
低intchar,short图中横向向左的箭头表示必定的转换,纵向的箭头表示当运算对象为不同类型时转换的方向。2.4数据类型转换赋值类型转换(1)当整型数据赋给浮点型变量时,数值上不发生任何变化,但有效位增加。(2)当单、双精度浮点型数据赋给整型变量时,浮点数的小数局部将被舍弃。(3)将字符型数据赋给整型变量时,由于字符只占一个字节,而整型变量为4个字节,因此将字符数据〔8位〕放到整型变量低8位中。①将unsignedchar型数据赋给unsignedint或int型变量时,高24位补0。②将char型数据赋给unsignedint或int型变量时,假设字符值最高位为0,那么高24位补0;假设字符值最高位为1,那么高24位全补1。2.4数据类型转换【例2-7】分析下面程序的运行结果。main(){unsignedchara;charb;unsignedintx;inty;a=0xfe;x=a;y=a;printf("%x%x\n",x,y);b=0x7e;x=b;y=b;printf("%x%x\n",x,y);b=0xfe;x=b;y=b;printf("%x%x\n",x,y);}2.4数据类型转换(4)当长度长的整型数据赋给长度短的变量时,将进行截断赋值。【例2-8】分析下面程序的运行结果。/*EX2-8.C*/main(){unsignedshorta;shortb;unsignedlongx;x=0x6a8b5cfd;a=x;b=x;printf("%x%x\n",a,b);}2.4数据类型转换(5)当整型数据赋给长度相同的变量时,将进行原样赋值。【例2-9】分析下面程序的运行结果。/*EX2-9.C*/main(){unsignedinta;intb;a=0xffff;b=a;printf("%x%x\n",a,b);}2.4数据类型转换强制类型转换
强制类型转换的一般形式为:(类型名)(表达式)【注意】(1)表达式应该用括号括起来。(2)经强制类型转换后,得到的是一个所需类型的中间变量,原来变量的类型并没有发生任何变化。【例2-10】分析下面程序的运行结果。main(){inta;floatb=3.5;a=(int)b;printf("a=%d,b=%f\n",a,b);}2.5程序举例【例2-11】分析下面程序的运行结果。/*EX2-11.C*/main(){intx,y;x=40;y=(x=x-4,x%7);printf("y=%d\n",y);}2.5程序举例【例2-12】分析下面程序的运行结果。/*EX2-12.C*/main(){intm,n,k;m=3;n=9;k=(++m)+(--n);printf("m=%d,n=%d,k=%d\n",m,n,k);m=3,n=9;k=(m--)+(n++);printf("m=%d,n=%d,k=%d\n",m,n,k);}2.5程序举例【例2-13】取一个整数x从右端开始的4~7位。【分析】(1)先使x右移4位,目的是使要取出的那几位移到最右端。右移到右端可以用下面方法实现:x>>4(2)设置一个低4位全为1,其余全为0的数。可用下面方法实现:~(~0<<4)(3)将上面二者进行&运算。即:(x>>4)&~(~0<<4)2.5程序举例main(){unsignedintx,m,n,k;x=0x3aef;printf("%x\n",x);m=x>>4;n=~(~0<<4);k=m&n;printf("%x,%d\n%x,%d\n",m,m,k,k);}第3章简单程序设计§3.1C语言的根本语句§3.2顺序结构§3.3数据输入与输出§3.4程序举例C语句可分为以下5种类型:1.表达式语句由表达式组成,其一般形式是:表达式;典型例子:赋值语句x=5;2.函数调用语句由一个函数调用加上一个分号构成,其作用是完成特定功能。它的一般形式是:函数名(参数列表);典型例子:printf(“%d〞,x);3.1C语言的根本语句3.控制语句用于完成一定的控制功能,以形成程序的各种结构和流程控制。C语言有9种控制语句,分三类:(1)条件判断语句,构成选择结构:if语句、switch语句(2)循环语句,构成循环结构:for语句、while语句、do-while语句(3)转向控制语句
①限定转向语句:break、continue、return语句
②无条件转向语句:goto语句4.复合语句是用大括号{……}将假设干语句组合在一起,在语法上相当于一条语句。用于if语句的一个分支或循环语句的循环体等。由于复合语句中还可以定义变量,因此又称分程序。注意:复合语句外没有分号,其中最后一个语句的分号不能省略。5.空语句只有一个分号没有其他内容的语句。其形式为:;常用于循环中,表示循环体什么都不做。程序结构分为顺序、选择、循环三种。任何复杂的程序都是由这三种根本结构组成。3.2顺序结构
顺序结构,按语句出现先后顺序依次执行的程序结构。选择结构,又称选取或分支结构,根据给定条件是否成立,以决定程序的分支转向的程序结构,详见第4章。循环结构,又称重复结构,根据条件反复执行某一局部语句的程序结构,详见第5章。顺序结构是程序设计中最简单、最根本的结构,其特点是程序运行时,按语句书写的次序依次执行,其结构如右图所示。顺序结构一般由函数调用语句、说明语句、表达式语句和输入输出语句组成。AB顺序结构图顺序结构流程图#include<stdio.h>main(){inta,b,c;a=123;b=456;c=a+b;printf("\nc=%d\n",c);}【例3-1】分析下面程序预处理命令变量a,b,c声明a,b赋初值赋值语句c=a+b输出变量c的值例3-1的流程从例3-1可以看出,顺序结构的程序框架如下:#开头的预编译命令行
main()
{
局部变量声明语句;
可执行语句;
}3.3数据输入与输出printf()函数的功能是向系统显示器输出假设干个任意类型的数据。1.printf()函数调用形式printf(格式控制字符串,输出列表)注意:调用输入输出函数时,一般在程序开头加头文件:#include<stdio.h>,printf()和scanf()可省略。3.3.1格式化输出函数printf()
格式说明
一般字符按原样输出转义字符作用:换行输出列表printf("a=%d\n",a);printf函数简例格式控制字符串和输出列表都是函数的参数,其中:〔1〕格式控制字符串,它包括两个信息:①格式说明符。由“%〞开头,以格式字符结束的一串字符,最简单的如%d,%c,%f等。它的作用是将要输出的数据转化成指定的格式输出。②原样输出字符,含一般字符和转义字符。一般起提示、分隔数据和换行等作用。如例3-1中printf(“\nc=%d\n〞,c);中双撇号内的\n和c=。〔2〕输出列表是需要输出的常量、变量、函数、表达式。【说明】格式说明符的一般形式为:%[-][+][0][#][整数1][.整数2][l或h]格式字符它是由“%〞开头,以格式字符(英文字母)结束的一串字符,用以说明输出数据的类型、长度、位数等,其中[]表示可选项。因此,除了%以外,格式字符是格式说明符中必须要有的,它控制输出列表里相应输出项数据的输出类型。表3-2给出了常用的格式字符及含义。注意:有符号整数按无符号格式将输出其补码;无符号整数按有符号格式将作为补码输出其数。格式说明符printf函数常用类型格式字符表格式字符格式字符含义d或i表示以十进制形式输出一个带符号的整数o表示以八进制形式输出一个无符号的整数X,x表示以十六进制形式输出一个无符号的整数u表示以十进制形式输出一个无符号的整数f表示以小数形式输出带符号的实数(包括单、双精度)E,e表示以指数形式输出带符号的实数G,g表示选择%f或%e格式输出实数(选择占宽度较小的一种格式输出)c表示输出一个单字符s表示输出一个字符串注:大写字母表示输出中的字母为大写格式说明符各项的意义如以下图所示。[整数1.整数2]:整数1控制输出长度(域宽),整数2对不同格式符有不同含义,具体作用见上图。1、两者缺省情况下:对整数和字符串按实际字符数输出;(VC中)对实数(float和double):①小数型:整数局部原样输出,默认输出6位小数,多余小数舍入处理。②指数型:正数默认输出1位整数、小数点、6位小数、4位指数(e或E、+或―号及3位整数)共13个字符(负数12个字符)。2、有整数1无整数2:默认输出(整数、字符串全部;实数同上)3、无整数1有整数2:按上图说明输出(实数整数局部全部输出)【说明】4、域宽情况(有整数1,有或无整数2)①指定域宽缺乏,按需增加域宽。②指定域宽充裕:缺省"―"右对齐:无"0"控制:前加空格;有"0"控制:数值型前加0填齐;其它类型前加空格。有"―"控制左对齐,按域宽后面加空格。[长度修正l]:长度修正l可与d、i、o、x、X、u、f、e、E、g、G配合使用,long型整数在根本整数范围内、double型实数在float型实数范围内可以不加l输出,否那么,必须加长度修正l才能正常输出。【说明】【注意】〔1〕实数精度(有效数字)由输出项类型控制(float7位double16位),对float型输出项用%lf格式不能增加精度;增大“整数2〞可增加实数输出的小数位数,但不能增加精度。〔2〕输出项从右向左计算后,按格式说明的顺序、类型和要求对应输出。格式说明和输出项的个数类型应相同,如不匹配系统不能正确输出①格式说明的个数少于输出项个数,多余的输出项将不输出;②格式说明的个数多于输出项个数,多余的格式说明将输出随机的值。③整型数据按%f输出或者实型数据按%d输出,均出现输出错误结果。〔3〕格式字符除X〔表示输出的十六进制数用大写字母输出〕、E〔表示输出的指数e用大写字母E输出〕、G〔表示假设选用指数形式输出,那么用大写字母E输出〕外,必须是小写字母。如%d不能写成%D。〔4〕假设想输出字符“%〞,那么在格式字符串中用连续两个%表示。如:printf(“%f%%〞,1.0/4);那么输出:0.250000%【注意】#include<stdio.h>main(){inta,b,c;a=123;b=456;c=a+b;printf("a+b=%d+%d=%d\n",a,b,c);printf(“a+b=%hd+%hd=%hd\n〞,a,b,c);printf("a+b=%2d+%2d=%5d\n",a,b,c);printf("a+b=%02d+%02d=%05d\n",a,b,c);}【例3-2】分析下面程序运行结果#include<stdio.h>main(){unsignedinta=65535;intb=-2;printf(“a=%d,%o,%x,%u\n〞,a,a,a,a);printf(“a=%d,%o,%x,%u\n〞,a,a,a,a);}【例3-3】无符号数据的输出
#include<stdio.h>main(){floatx,y,z;x=123.234;y=0.000345;z=-98.567;printf("x=%.4f,x=%.2f,x=%+e\n",x,x,x);printf("y=%f,y=%8.4f,y=%10.3e\n",y,y,y);printf("z=%+f,z=%+e,z=%+g\n",z,z,z);}【例3-4】分析下面程序运行结果#include<stdio.h>main(){doublex,y,z;x=123.234;y=-0.000345;z=-98.567;printf(“x=%lf,x=%.4lf,x=%2lf,x=%+e\n〞,x,x,x,x);printf("y=%lf,y=%+lf,y=%le\n",y,y,y);printf("z=%f\n",z);}【例3-5】分析下面程序运行结果#include<stdio.h>main(){printf("\n%c",'a');/*输出单个字符*/printf("\n%s","abc");/*输出一个字符串*/}【例3-6】分析下面程序运行结果3.3.2格式化输入函数scanfscanf〔〕函数的功能是从键盘上将数据按用户指定的格式输入并赋给指定变量。1.scanf〔〕函数调用形式scanf〔格式控制字符串,地址列表〕;格式控制字符串的定义与使用方法和printf函数相似,但不能显示非格式字符串,即不能显示提示字符串。地址列表是要赋值的各变量地址,地址是由地址运算符“&〞后跟变量名组成,如&x表示变量x的地址。
格式说明符以%开始,后面跟一个格式符,中间可以有假设干个附加字符,格式字符串一般形式为:%[*][输入数据宽度m][长度]类型其中:[]:表示可选项*:表示输入的数值不赋给相应的变量,即跳过该数据不读。[输入数据宽度m]:表示按十进制正整数m的宽度输入数据。[长度]:长度格式符为l和h,l表示输入长整型数据或双精度实型数据;h表示输入短整型数据。类型:是格式说明符中必须要有的,其格式符的意义与printf函数根本相同,具体如表3-3所示。2.格式说明符表3-3
scanf函数常用类型格式符表格式字符格式字符含义d(i)表示以十进制形式输入一个整数o表示以八进制形式输入一个整数x(X)表示以十六进制形式输入一个整数u表示以十进制形式输入一个无符号的整数f或e(E)表示输入一个实数,可以是小数形式或指数形式g(G)与f或e的作用相同c表示输入一个字符s表示输入一个字符串【注意】〔1〕scanf函数中的“格式控制字符串〞后面应该是变量的地址,而不应是变量名。例如输入语句scanf(“%d,%d〞,a,b);是错误的,&不能少。〔2〕输入数据时不能规定数据的精度。如scanf("%8.2f",&a);是不合法的。〔3〕在“格式控制字符串〞中除了格式说明符外,还有其他字符,那么在输入数据时在对应位置上应输入与这些字符相同的字符。例如scanf("a=%d,b=%d",&a,&b);那么输入时应输入:a=12,b=-2↙其他任何输入形式都不正确。例3-7注意〔4〕输入数据时,遇以下情况认为该数据输入结束: ①按指定的宽度结束; ②遇空格,或“回车〞键,或“Tab〞键; ③遇非法输入。〔5〕在用“%c〞格式输入字符时,所有输入的字符〔包括空格字符和“转义字符〞〕都作为有效字符。〔6〕当输入的数据与输出的类型不一样时,虽然编译没有提示出错,但结果将不正确。/*EX3-8.C*/#include<stdio.h>main(){inta,b,c;scanf("%3d%3d%4d",&a,&b,&c);/*按长度m进行输入*/printf("\na=%d,b=%d,c=%d\n",a,b,c);}【例3-8】分析下面程序/*EX3-9.C*/#include<stdio.h>main(){doublea,b,c;scanf("%lf,%lf",&a,&b);/*按双精度进行输入*/c=a*b;printf("\na*b=%lf*%lf=%le\n",a,b,c);}【例3-9】分析下面程序/*EX3-10.C*/#include<stdio.h>main(){charch1,ch2;scanf("%c%c",&ch1,&ch2);printf("%c%c\n",ch1,ch2);
}【例3-10】阅读下面程序/*EX3-11.C*/#include<stdio.h>main(){intx,y;scanf("%2d%*3d%4d",&x,&y);/*注意%*3d的作用*/printf("\nx=%d,y=%d\n",x,y);}【例3-11】分析下面程序#include<stdio.h>main(){inta;scanf(“%d〞,&a);/*输入输出类型不一致*/printf("\na=%ld\n",a);}【例3-12】分析下面程序3.3.3字符数据的输入与输出C语言为字符定义了两个最根本的函数:字符输入函数getchar和字符输出函数putchar。在使用这两个函数时,程序的头部一定要加上文件包含命令:#include<stdio.h>1.字符输入函数getchar()getchar()的功能是从标准设备〔键盘〕上读入一个字符。其一般调用形式:getchar();语句ch=getchar()和scanf(“%c〞,&ch);功能相同#include<stdio.h>main(){charc1,c2;c1=getchar();/*从键盘上接收一个字符赋给字符变量c1*/c2=getchar();/*和scanf(“%c〞,&c2)等价*/printf("%c,%c\n",c1,c2);}【例3-13】字符输入函数的使用2.字符输出函数putchar()字符输出函数putchar()的功能是向标准输出设备〔显示器〕输出一个字符。其一般调用形式:putchar(c);其中:c是参数,它可以是整型或字符型变量,也可以是整型或字符型常量。当是整型量时,输出以该数值作为ASCII码所对应的字符;当是字符型量时,直接输出字符常量。语名putchar(c)和printf(“%c〞,c)功能相同/*EX3-14.C*/#include<stdio.h>main(){charx,y,z;x='a';y='+';z='b';putchar(x);putchar(y);putchar(z);;putchar('\132');putchar('\n');printf(“%c%c%c\132\n〞,x,y,z);}【例3-14】字符输出函数的使用【例3-15】从键盘上输入两个整数放入变量a,b中,编程将这两个变量中的数据交换。【分析】两个数据交换,不能直接写成a=b;b=a;,因为当执行a=b;后,变量a中的原值就被“冲〞掉了,而与变量b中的值相等,因此不能实现交换。正确的做法是另定义一个变量〔假设是c〕作为暂存单元,在执行a=b;之前,先将变量a的值放入c中保存起来,然后执行a=b;,最后再执行b=c;,由于c中保存的是a的值,这样就将原来a的值赋给了b,从而实现了两个变量中的数据交换。3.4程序举例程序#include<stdio.h>main(){inta,b,c;a=3;b=5;c=a;a=b;b=c;printf("a=%d,b=%d\n",a,b);}
35a3c①②③b【例3-16】从键盘上输入一个英文小写字母,编程输出该字母所对应的ASCII码和所对应的大写字母【分析】在ASCII字符集中,大写字母A~Z是连续的〔ASCII值从65~90〕,小写字母a~z也是连续的〔ASCII值从97~122〕。因此每对字母的ASCII码值差是相同的,都是32,即'a'-'A'、'b'-'B'、'c'-'C'、…、'z'-'Z'都是32。所以将小写字母的ASCII码值减去32,那么得到的是所对应的大写字母ASCII码值。同理,将大写字母的ASCII码值加上32,那么得到的是所对应的小写字母ASCII码值。程序#include<stdio.h>main(){charc1,c2;c1=getchar();/*从键盘获得一个小写字母*/c2=c1-32;/*将小写字母转化为大写字母*/printf("%d,%c\n",c1,c1);putchar(c2);}
#include<stdio.h>#include<math.h>main(){floata,b,c,s,area;scanf("%f%f%f",&a,&b,&c);s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));printf("\na=%.2f,b=%.2f,c=%.2f\n",a,b,c);printf("\narea=%.3f\n",area);}【例3-17】输入三角形的三条边,编程求该三角形的面积【例3-18】编程求解方程#include<stdio.h>#include<math.h>main(){floata,b,c,d,x1,x2;a=3;b=-5;c=-7;d=b*b-4*a*c;x1=(-b+sqrt(d))/(2*a);x2=(-b-sqrt(d))/(2*a);printf("x1=%.4f,x2=%.4f\n",x1,x2);}【例3-19】分析下面程序的运行结果#include<stdio.h>main(){intx=1,y=5;printf("x=%%d,y=%%d",x,y);}
【分析】本程序格式控制字符串中,有两个连续的%%。前面已经讲过,两个连续的%%表示输出一个%,因此变量x,y没有对应的输出格式,只能输出双引号中的字符。【例3-20】分析下面程序的运行结果#include<stdio.h>main(){inta,b;a=0x41;b=++a;printf("%d,%d\n",a--,--b);printf("%c,%c\n",++a,b++);}
本章介绍了顺序程序结构、赋值语句、根本的输入/输出函数。重点讲解了以下几个方面的内容:1.scanf、printf、getchar、putchar四个函数的使用:(1)scanf和getchar都是输入函数,其功能是接收键盘上输入的数据。但scanf函数可以按指定的格式输入任何类型的数据,而getchar函数只能接收一个字符。(2)printf和putchar都是输出函数,其功能是向屏幕〔显示器〕输出数据。但printf函数可以按指定的格式输出任何类型的数据,而putchar函数只能输出一个字符。(3)使用scanf函数或printf函数可以在程序中不包含头文件stdio.h,而使用getchar函数或putchar函数在程序中必须包含头文件stdio.h。本章小结2.格式控制字符串中格式符的含义及使用格式控制串数据对象类型
输入数据形式数据输入格式
%mdintshortunsignedintunsignedshort十进制整数无m则按实际位数输入无m则用分隔符或回车键表示数据输入结束,有m则按m位输入。
%mo八进制整数%mx十六进制整数%mldlongunsignedlong十进制整数同上
%mlo八进制整数%mlxunsignedlong十六进制整数%mffloat十进制小数同上
%me十进制指数%mlfdouble十进制小数同上
%mle十进制指数%mcchar单个字符无m输入单个字符,有m则输入m个字符,只取第一个字符%ms字符串或字符数组
字符串通常给字符数组赋值。无m时取若干个字符直到回车或空格为止,有m则取前m个字符
表3-4输入格式控制符表格式控制串数据对象类型
输入数据形式数据输入格式
%-mdintshortunsignedunsignedshortchar十进制整数无m按实际位数输出,有m输出m位,超过m位,按实际数位输出,不足m位,补空格无-号右对齐(左边补空格)有-号左对齐(右边补空格)
%-mo八进制整数%-mx十六进制整数%-mu无符号整数%-mldlongunsignedlong十进制整数同上%-mlo八进制整数%-mlx十六进制整数%-mlu无符号整数%-m.nffloatdouble十进制小数无m.n则按实际位数输出,保留6位小数,无m有n则输出的数据保留n位小数,有m.n则输出m位,且保留n位小数.其它同上
%-m.ne十进制指数%-mcintcharshort
单个字符无m输出单个字符,有m也输出单个字符,补m-1个空格.有无-号,含义同上
%-m.ns字符串或字符数组
一串字符无m.n按实际字符串输出全部字符,有m.n则只输出前n个字符,补m-n个空格.有无-号,含义同上
表3-5输出格式控制符表4.1关系运算符与关系表达式4.2逻辑运算符与逻辑表达式4.3if语句4.4switch语句4.5程序举例第4章选择结构程序设计关系运算符
<小于<=小于或等于
>大于>=大于或等于==等于!=不等于
优先级:关系运算符中>、>=、<、<=优先级相同,==和!=的优先级相同,低于前四种;关系运算符的优先级低于算术运算符,高于逻辑运算符&&和||,介于位运算符之间。结合性:左结合。假设有多个关系运算同时进行,按优先级从高到低次序运算,优先级相同从左向右计算。4.1关系运算符与关系表达式关系运算符关系运算符都是双目运算符,要求两个操作数是同一种数据类型,其结果为逻辑值(真和假)。在C语言中:逻辑值“真〞:运算结果系统用1表示,参与运 算时用非0值(数值类即可)表示;逻辑值“假〞:用0表示。
关系表达式是用关系运算符连接两个数值表达式形成的式子。例如:3+2==2*3/*判断3+2和2*3的结果是否相等*/a++>=--b/*判断a++的值是否大于或等于--b*/注:数值表达式一般是算术表达式,也可以是关系表达式、逻辑表达式、赋值表达式、字符表达式等。关系表达式的一般形式为:
表达式关系运算符表达式4.1.2关系表达式4.2.1逻辑运算符(作用于逻辑值,结果也为逻辑值)
!逻辑非单目、右结合、优先级最高;&&逻辑与双目、左结合、优先级较低;||逻辑或双目、左结合、优先级最低。
其中,&&和||运算符的优先级低于关系运算符。设a、b均为逻辑值,运算结果:!a当a为真时,结果为假;当a为假时,结果为真a&&b当且仅当a、b都为真时,结果为真a||b当且仅当a、b都为假时,结果为假4.2逻辑运算符与逻辑表达式逻辑运算的真值表
ab!aa&&ba||b真(非0)真(非0)假(0)真(1)真(1)真(非0)假(0)假(0)假(0)真(1)假(0)真(非0)真(1)假(0)真(1)假(0)假(0)真(1)假(0)假(0)逻辑表达式类似于关系表达式,是用逻辑运算符把两个表达式连接起来的式子。例如:a+b&&a;
判断a+b和a的值是否都为真,假设都为真,那么表达式为真,否那么为假。逻辑表达式的一般形式为:!表达式表达式&&(||)表达式4.2.3逻辑表达式【例4-1】分析下面程序段的运行结果
main(){
inta=123,b=456,x;charc='a';x=(a||b)&&(c<'b');printf("a=%d,b=%d\n",a,b);printf("x=%d\n",x);}(1)&&运算符左边的表达式为假,那么其右边表达式将不再计算,整个表达式的值为假;(2)||运算符左边的表达式为真,那么其右边表达式将不再计算,整个表达式的值为真。(3)当有多个逻辑运算符时,把其中高优先级的表达式作为一个整体,只要能够确定整个表达式的值就不再计算剩下局部。因此右边一些表达式中的变量值将不再改变,尽管可能有++、--等运算,例如:假设有定义intx,y,z;x=y=z=0;对于x++&&y++||z++;结果x==1,y==0,z==1表达式为0对于++x||++y&&++z;结果x==1,y==0,z==0表达式为1【注意】逻辑运算符的“短路〞现象根本规律(设a为一合法表达式,结果为逻辑值)0&&a结果为0(不计算a)0||a结果为a(计算a逻辑值)1&&a结果为a(计算a逻辑值)1||a结果为1(不计算a)a&&a结果为a(逻辑值)a||a结果为a(逻辑值)a||!a结果为1a&&!a结果为0!(!a)结果为a(逻辑值)组合规律(设a、b、c均为合法表达式)a&&b&&c…自左向右运算,遇0停止运算,表达式值为0a||b||c…自左向右运算,遇1停止运算,表达式值为10&&a||b不计算a但要计算b1&&a||b计算a,a==0要计算b,a==1不计算b0||a&&b计算a,a==0不计算b,a==1要计算b1||a&&b不计算a和b,表达式值为1【注意】逻辑运算符的“短路〞现象4.3if语句【问题】我们在求解数学问题中常会遇到分段函数的问题,例如:
这类问题可以用if语句描述。If语句可分:单分支if语句双分支if语句多分支选择结构单分支if语句的根本形式为:if(表达式)语句;其语义是:首先判断表达式的值是否为真(非0),假设表达式的值为真,那么执行其后的语句;否那么不执行该语句。无论是否执行该语句,接着都执行if语句后面的语句。4.3.1单分支if语句表达式语句非00main(){floata;printf("pleaseinputthescore:");scanf("%f",&a);if(a>=60)printf("pass\n");}【例4-2】从键盘输入学生成绩并判断是否及格,假设及格输出“pass〞4.3.2双分支if语句
双分支if语句是if语句根本形式,即if-else形式,语句的结构为:if(表达式)语句1;else语句2;语义:当表达式的值为真,那么执行语句1,否那么执行语句2。然后执行if语句后面的语句。单分支if语句相当于双分支if语句缺省else子句。非0表达式语句1语句20main(){floata,b,max;printf("inputthetwonumbers:");scanf("%f,%f",&a,&b);if(a>b)max=a;elsemax=b;printf("max=%f\n",max);}【例4-3】从键盘输入两个整数,输出其中最大者【注意】if语句的条件表达式一般是逻辑表达式或关系表达式,但也可以是其它任何类型的表达式,如赋值表达式等,甚至也可以是一个变量、常量或函数调用。只要表达式的值非0,即为“真〞;表达式值为0,即为“假〞。不能将赋值运算符“=〞与关系运算符中的相等运算符“==〞混淆。如在if〔a=5〕printf(“%d\n〞,a);中表达式a=5的值为5非0,条件为真。这种情况在程序中应防止出现。在循环结构中,假设出现这种错误的写法,会造成程序的死循环。【注意】(2)在if语句中,条件表达式必须用括号括起来。在每一个子句之后必须加分号。例如:if(a>b)max=a;elsemax=b;else子句是if语句的一局部,和if子句配对使用,不能单独使用。(3)在if语句的各种形式中,所有的语句应为单个语句,如果想将单个语句换成一组语句,那么必须把这一组语句用花括号“{}〞括起来组成一个复合语句。4.3.3多分支选择结构
多分支选择结构的if语句if(表达式1)语句1;
elseif(表达式2)语句2;
elseif(表达式3)语句3;
…
elseif(表达式n)语句n;
else语句n+1;
语义:依次判断表达式的值,当某个表达式的值为真时,那么执行其对应的语句。然后跳到整个if语句之外继续执行程序。如果所有的表达式均为假,那么执行语句n+1。然后继续执行后续程序。多分支if语句的控制流程
【例4-4】分段函数
输入任意x,求y值。
main(){floatx,y;printf("inputonenumber:");scanf("%f",&x);if(x==0||x==2)y=0;elseif(x>0)y=(x+1)/(x-2);elsey=(x-1)/(x-2);printf("y=%f\n",y);}【例4-5】判别键盘输入字符的类别:控制字符、数字、大写字母、小写字母、其他字符。#include<stdio.h>voidmain(void){charc;printf("Inputacharacter;");c=getchar(); if(c<32) printf("Thisisacontrolcharacter\n");elseif(c>=´0´&&c<=´9´)printf("Thisisadigit\n"); elseif(c>=´A´&&c<=´Z´)printf("Thisisacapitalletter\n"); elseif(c>=´a´&&c<=´z´)printf("Thisisasmallletter\n"); elseprintf("Thisisanothercharacter\n");}
if语句的嵌套当if语句中的语句体又是if语句时,这种情况就叫if语句的嵌套。C语言对if语句嵌套的层数没有限制。在双分支if语句中语句1和语句2均嵌套的形式为:
if(表达式)
if(表达式)语句11;
else语句12;
else
if(表达式)语句21;
else语句22;有时可能只有语句1或语句2嵌套,也可能有多层嵌套(各层可能单分支或双分支),因此就有很多情况。嵌套if语句的层次划分问题
由于嵌套的复杂情况,怎么划分嵌套的层次就成了问题。其方法为:寻找if—else配对。C语言if—else配对的规定:从最前面的else开始,使每个else与其前面最近的尚未配对的if匹配。嵌套if语句的层次划分问题可能存在的问题:当内层为单分支if语句时,可能产生if—else配对错误(内层if语句为双分支时无此问题)。例如内层单分支if语句嵌套在外层if子句中:原意:按if—else配对原那么应该写成:if(表达式)if(表达式)if(表达式)语句21;if(表达式)语句21;else语句2;else语句2;按原意应该写成:if(表达式){if(表达式)语句21;}else语句2;嵌套if语句的层次划分问题然而,单分支内层if语句嵌套在外层else子句中:if(表达式)语句1;elseif(表达式)语句21;这种写法内层if语句不加花括号也不会出现if—else配对错误。多分支if语句其实就是多层嵌套的if语句,其每一层都是嵌套在else子句中嵌套if语句的层次划分问题嵌套if语句防止出错要点:①按if—else配对原那么设计嵌套。②当内层if语句是单分支时,尽可能嵌套在外层else子句中;如
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年陕西省公务员行测(A类)真题及答案
- 2025年奉新县城区学校选调教师考试笔试试题【答案】
- 电工类安全培训考试题及答案解析
- 初中英语中考试卷及答案
- 初三中考试卷及答案期末
- 儿科护理学第七版 题库及答案解析
- 医疗辐射安全考试题库及答案解析
- 液压部件装配知识培训课件
- 2025年国家开放大学(电大)《法国语言文学导论》期末考试备考试题及答案解析
- 2025年医共体医院职能科室设置及职责
- 加油站计量业务知识培训课件
- 公安矛盾纠纷化解课件
- 2025年恒丰银行笔试题库及答案
- 看板管理管理办法
- 2025至2030镍氢电池隔膜行业市场发展现状及竞争格局与投资价值报告
- 造林质量管理办法
- 冠心病人饮食健康管理
- 2025年陕西省中考数学试题卷(含答案详解)
- 六年级数学考试技能提升教学措施
- 2025至2030全球及中国手机软件行业产业运行态势及投资规划深度研究报告
- 服务器、存储维保项目投标文件
评论
0/150
提交评论