版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言程序结构和语法规则一、C语言程序的基本结构下面通过几个简单的示例,介绍 C 语言程序的基本构成和书写格式,使读者对 C 语言 程序有一个基本的了解。在此基础上,再进一步了解 C 语言程序的语法和书写规则。【例1.1】求三个数的平均值的 C 语言程序。/* 功能:求三个数的平均值 */main() /* main() 称为主函数 */float a,b,c,ave; /* 定义 a,b,c,ave 为实型数据 */a=7;b=9;c=12;ave=(a+b+c)/3; /* 计算平均值 */printf(ave=%fn,ave); /* 在屏幕上输出 ave 的值 */程序运行结果:ave
2、=9.333333【例 1.2】输出两个数中的较大值的 C 语言程序。/* 功能:输出两个数中的较大值 */main() /* 主函数 */int num1,num2,max; /* 定义 num1、 num2、 max 为整型变量 */ scanf(%d,%d,&numl,&num2); /* 由键盘输入 numl、num2的值 */ printf(max=%dn,max(num1,num2); /* 在屏幕上输出调用 max 的函数值 */* 用户设计的函数 max()*/int max(int x,int y)/* x 和 y 分别取 numl 和 num2传递的值 */if(xy) r
3、eturn x; /* 如果 xy,将 x 的值返回给 max */else return y; /* 如果 xy 不成立,将 y 的值返回给 max */程序运行情况:5,8/ ( “/”表示按回车键,以下相同 )max=8在以上两个示例中,【例1.11所示的C语言程序仅由一个 main()函数构成,它相当于其 他高级语言中的主程序;【例1.21所示的C语言程序由一个 main()和一个其他函数 max()(用 户自己设计的函数)构成,函数max()相当于其他高级语言中的子程序。由此可见,一个完整的 C 语言程序结构有以下两种表现形式:(1) 仅由一个 main()函数(又称主函数)构成,如
4、图1-1(a)所示。(2) 由一个且只能有一个 main()函数和若干个其他函数结合而成,如图1-1(b)所示。其 中,自定义函数由用户自己设计。图1-1 C 语言程序结构示意图结合以上示例,可以看出 C 语言程序结构有以下基本特点:(1)C 语言程序是由函数 (如: main 函数和 max 函数)组成的,每一个函数完成相对独 立的功能,函数是 C 语言程序的基本模块单元。 main 是函数名,函数名后面的一对圆括号 “() ”是用来写函数的参数的。参数可以有,也可以没有(本程序没有参数),但圆括号不能省略。(2) 一个C语言程序总是从 main()函数开始执行。主函数执行完毕,程序执行结束
5、。( 3) C 语言编译系统区分字母大小写。 C 语言把大小写字母视为两个不同的字符,并 规定每条语句或数据说明均以分号 (;)结束。分号是语句不可缺少的组成部分。(4)主函数 main()既可以放在 max()函数之前,也可以放在max()函数之后。习惯上,将主函数main()放在最前面。( 5) C 语言程序中所调用的函数,既可以是由系统提供的库函数,也可以是由设计人 员自己根据需要而设计的函数。例如,在【例1.2】中, printf() 函数是 C 语言编译系统库函数中的一个函数,它的作用是在屏幕上按指定格式输出指定的内容;max()函数是由用户自己设计的函数,它的作用是计算两个数中的较
6、大值。二、C语言程序的书写规则(1) C 源程序是由一个主函数和若干个其它函数组成的。( 2)函数名后必须有小括号,函数体放在大括号内。( 3) C 程序必须用小写字母书写。( 4)每句的末尾加分号。( 5)可以一行多句。( 6)可以一句多行。( 7)可以在程序的任何位置加注释。一个完整的C语言程序,是由一个main()函数(又称主函数)和若干个其它函数结合而成的,或仅由一个 mai n()函数构成。例1.3仅由main()函数构成的C语言程序。main() printf( “This is a C program.n ”);程序运行结果:This is a C program.例1.4由ma
7、in()函数和1个其它函数 max()构成的C语言程序。int max(int x, int y)return( xy ? x : y );main()int num1,num2;printf( “ Input the first integer number:”);scanf( “%d”, &num1););printf( “ Input the second integer number: scanf( “%d”, &num2);printf(“ max=n%”d , max(num1, num2);程序运行情况:In put the first in teger n umber:6 1I
8、n put the sec ond in teger n umber:9 , =,=,.)依次为取反,按位与,按位或,按位异或,右移位,左移位,无符号右移位5. 赋值运算符 ( =) 赋值操作符,它将等号右边数据的值赋值给左边的变量。6. 条件运算柠 (? :)条件运算符为三目运算符,其“般格式为:ab?a:bA=,=,强制类型转换运算符“ (类7. 扩展运算符 (十=,* = , /=,%=,&=,|=,= )( 注意它们之间不能用空格隔扩展运算符都是由一个双目运算符和一个等号连在一起组成开) ,以“+=”为例说明这类扩展运算符的用法:A += B ;表示 A = A+B 其它类似。8其他运
9、算符,如豆号运算符“,”,分量运算符“” 。再如实例运算符“ instanceof ”,内存分配运算符“ new”, 型)”,方法调用运算符“()”,取数组元素运算符“ 比如,设 t 是类 Thread 的一个实例。意指通过点的操作符访问类的实分量运算符: t .name 表示类的实例的调用,又叫点问, 例对象)、运算符的优先级优先顺序依次为(1级最优先,余下类推)1()5+ -9&13II2+ + - ! 6 =1!1一 + 一 - 一 * 一15/ =4* / %8=!=1&1& 一! 一26=记住这些优先次序是困难的,一个较好的方法是使用括号(),比如:ab & bc & ca 可以用括
10、号写为 (ab) & (bc) & (ca) 这样即清晰易懂,也不易出错。二、表达式表达式是由操作数和运算符按一定的语法形式组成的符号序列。一个常量或一个变量名字是最简单的表达式,其值即该常量或变量的值。表达式的值还可以用作其他运算的操作数, 形成更复杂的表达式。表达式的类型由运算以及参与运算的操作数的类型决定,可以是简单类型,也可以是复合类型,如下面的例子所示:布尔型表达式:x&y|z ;整型表达式:numl十num2;顺序结构:输入与输出一、选择题(1) 有以下程序main () int m, n,p;sca nf(m=%d n=%dp=%d,&m,&n,&p);prin tf(%d%d%
11、dn,m, n,p);若想从键盘上输入数据,使变量m中的值为123,n中的值为456,p中的值为789,则正确的输入 是A) m=123n=456p=789B) m=123 n=456 p=789C) m=123,n=456,p=789D) 123 456 789(2) 有以下程序main () int m=0256, n=256;prin tf(%o %on, mn,n);程序运行后的输出结果是A) 0256 0400B) 0256 256C) 256 400D) 400 400(3) 有以下程序main() int a=666,b=888; printf(%dn,a,b); 程序运行后的输
12、出结果是A) 错误信息B) 666C) 888D) 666,888(4) 有以下程序main( )int x=102 , y=012;printf( “%2d,%2d n”,x,y); 执行后输出结果是A) 10,01B) 02,12C) 102,10D) 02,10(5) 有以下程序main() int a; char c=10;float f=100.0; double x;a=f/=c*=(x=6.5);printf(%d %d %3.1f %3.1fn,a,c,f,x); 程序运行后的输出结果是A) 1 65 1 6.5B) 1 65 1.5 6.5C) 1 65 1.0 6.5D)
13、2 65 1.5 6.5(6) 有定义语句: int x,y; ,面四组若要通过 scanf(%d,%d,&x,&y); 语句使变量 x 得到数值 11,变量 y 得到数值 12, 输入形式中,错误的是A) 11 12 回车B) 11 , 12v回车C) 11,12 v回车D) 11, v回车12v回车(7) 设有如下程序段:int x=2002,y=2003;printf(%dn,(x,y);则以下叙述中正确的是A) 输出语句中格式说明符的个数少于输出项的个数,不能正确输出B) 运行时产生出错信息C) 输出值为 2002D) 输出值为 2003(8) 若有以下程序段( n 所赋的是八进制数)
14、int m=32767,n=032767 printf(%d,%o/n,m,n); 执行后输出结果是A) 32767 , 32767 B) 32767 , 032767C) 32767 , 77777 D) 32767 , 077777(9) 若有以下程序段 int m=0xabc,n=0xabc;m-=n; printf(%Xn,m); 执行后输出结果是A) 0X0B) 0x0C) 0D) 0XABC(10)已知i、j、k为int型变量,若从键盘输入:1, 2, 3回车,使i的值为1、j的值为2、k的值为 3,以下选项中正确的输入语句是A) scanf(B) scanf(C) scanf(D
15、) scanf(“%2d%2d%”2d,&i,&j,&k); “%d %d %”d ,&i,&j,&k); “%d,%d,%”d ,&i,&j,&k); “i=%d,j=%d,k=%d”,&i,&j,&k);(11) 设有定义: long x=-123456L ;,则以下能够正确输出变量 x 值的语句是A) printf(B) printf(C) printf(D) printf(“x=%d n”,x); “x=%1d n”,x);“x=%8dL n”,x);“x=%LD n”,x);(12) 以下程序段的输出结果是int a=1234 ;printf(%2dn,a);A) 12B) 34C)
16、 1234D) 提示出错、无结果(13) x 、 y、 z 被定义为 int 型变量,若从键盘给 x、 y、 z 输入数据,正确的输入语句是A) INPUT x 、 y、 z;B) scanf(C) scanf(“%d%d%”d,&x,&y,&z);“%d%d%”d,x,y,z);D) rea d( “%d%d%”d,&x,&y,&z);(14) 若变量已正确说明为 float 类型,要通过语句 scanf( “ %f %f %f”,&a,&b,&c);给a赋于10.0 , b赋予22.0 , c赋予33.0,不正确的输入形式是:A) 10 B) 10.0,22.0,33.02233C) 10
17、.0 D) 10 2222.0 33.0 33(15) 有如下程序main0 int y=3,x=3,z=1;printf( “%d %d n” ,(+x,y+),z+2);运行该程序的输出结果是A) 3 4B) 4 2C) 4 3D) 3 3(16) 下列程序执行后的输出结果是 (小数点后只写一位 )A) 6 6 6.0 6.0 B) 6 6 6.7 6.7C) 6 6 6.0 6.7 D) 6 6 6.7 6.0main() double d; float f; ling l; int i;i=f=1=d=20/3;printf(%d %ld %f %f n, i,l,f,d);(17)
18、以下说法中正确的是A) #define 和 printf 都是 C 语句B) #define 是 C 语句,而 printf 不是C) printf是C语句,但#define不是D) #define 和printf 都不是C语句(18) 以下程序的输出结果是A) 17 , 021 , 0x11 B) 17 , 17, 17B) 17 , 0x11 , 021 D) 17 , 21 , 11main( ) int k=17;printf(%d , %o, %x n , k, k, k) ;(19) 以下叙述中正确的是A) 输入项可以是一个实型常量 , 如:scakf(%f,3.5);B) 只有格
19、式控制 , 没有输入项 , 也能正确输入数据到内存 , 例如 : scakf(a=%d,b=%d);C) 当输入一个实型数据时 , 格式控制部分可以规定小数点后的位数 , 例如 : scakf(%4.2f,&f);D) 当输入数据时 , 必须指明变量地址 , 例如 : scakf(%f,&f);(20) 若有以下定义和语句 : int u=010,v=0x10,w=10;printf(%d,%d,%dn,u,v,w); 则输出结果是 :A) 8,16,10 B) 10,10,10 C) 8,8,10 D) 8,10,10(21) 请读程序片段: int i=65536; printf(%dn,
20、i); 上面程序片段的输出结果是A) 65536B) 0C) 有语法错误,无输出结果D) -1(22) 若x和y都是int型变量,x=100, y=200,且有下面的程序片段: printf(%d,(x,y);上面程序片段的输出结果是A) 200B) 100C) 100 200D) 输出格式符不够,输出不确定的值(23) 请读程序: #includemain() int a; float b, c; scanf(%2d%3f%4f,&a,&b,&c);printf(na=%d, b=%f, c=%fn, a, b, c);若运行时从键盘上输入 9876543210(CR表示回车),则上面程序的
21、输出结果是A) a=98, b=765, c=4321B) a=10, b=432, c=8765C) a=98, b=765.000000, c=4321.000000D) a=98, b=765.0, c=4321.0(24) 以下程序的输出结果是【24】 。# include # include main() int a=1,b=4,c=2;float x=10.5 , y=4.0 , z; z=(a+b)/c+sqrt(double)y)*1.2/c+x;pritnf(%fn,z); A) 14.000000B) 015.400000C) 13.700000D) 14.900000 (
22、25) 以下程序的输出结果是25】# include main() int a=2,c=5; printf(a=%d,b=%dn,a,c); A) a=%2,b=%5B) a=2,b=5C) a=%d,b=%dD) a=%d,b=%d(26) 执行下面程序中的输出语句,A) 65B) 20C) 15D) 10 main() int a; printf(%dn,(a=3*5,a*4,a+5); 二、填空题: (1)以下程序运行后的输出结果是 main() int x=0210; printf(%Xn,x); (2)以下程序运行后的输出结果是 main() char c; int n=100; f
23、loat f=10; double x; x=f*=n/=(c=50); printf(%d %fn,n,x); (3)以下程序运行时若从键盘输入: #include main() int i=0,j=0,k=0; scanf(%d%*d%d,&i,&j,&k); printf(%d%d%dn,i,j,k); (4) 以下程序段的输出结果是【 4】int i=9; printf(%on,i);(5) 以下程序运行后的输出结果是 main() int a,b,c;a=25;的值是1】 。2】 。10 20 30。输出结果是5】 。b=025;c=0x25;printf(%d %d %dn,a,b
24、,c);(6) 有以下语句段int n1=10,n2=20;printf( “ 【 6】 ”,n1.n2);要求按以下格式输出n1和n2的值,每个输出行从第一列开始,请填空。n1=10n2=20(7) 若有语句int i=-19,j=i%4;printf(%dn,j);则输出结果是【7】 。(8) 若有程序main() int i,j;scanf(i=%d,j=%d;&i,&j); printf(i=%d,j=%dn,i,j);要求给 i 赋10,给 j 赋 20,则应该从键盘输入【 8】 。(9) 以下程序的输出结果是【 9】 。main() int a=177;printf(%on,a);
25、(10) 以下程序的输出结果是【10】 。main() int a=0a+=(a=8); printf(%dn,a);(11) 以下程序的输出结果是【11】main() int a=1, b=2;a=a+b; b=a-b; a=a-b;print f( “%d,%d n”, a, b );(12) 下列程序的输出结果是 16.00 ,请填空。main() int a=9, b=2;float x=【 12】 , y=1.1,z;z=a/2+b*x/y+1/2;printf( “%5.2f n”, z );(13) 以下程序的输出结果是main () un sig ned short a=655
26、36; int b; printf( “ %d n”,b=a);(14) 若想通过以下输入语句使int b , c; float a ;scanf(%f , %d c=%d, &a,(15) 若想通过以下输入语句给int a,b;sca nf(a=%b,b=%d,&a,&b);答案:一、选择题01) A 02) CC 10) C 11) B18) D 19) D26) C二、填空题(1) 88 (2) 2 20.00000013 oa=5.0,b=4, c=3,则输入数据的形式应该是【14】。&b,&c);a赋于1,给b赋于2,则输入数据的形式应该是【15】o03) B04) C12) C 1
27、3) B20) A 21) B05) B 06) A14) B22) A07) D15) D23) C08) A16) A24) C09)17) D25) D(3) 10 30 0 (4) 11 (5) 25 21 37 n1=%dn n2=%d (7) -3 (8) i=10,j=20 (9) 261 (10) 16(11) 2,1(12) 6.6(13) 0 (14) 5.0,4,c=3(15) a=1,b=2水滴石穿C语言之指针、数组和函数基本解释;数组的本质则是一1、指针的本质是一个与地址相关的复合类型,它的值是数据存放的位置(地址)系列的变量。2、数组名对应着(而不是指向)一块内存,
28、其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是“可变,所以我们常用指针来操作动态内存。3、当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。问题:指针与数组听说char a与char *a 是一致的,是不是这样呢?答案与分析:指针和数组存在着一些本质的区别。当然,在某种情况下,比如数组作为函数的参数进行传递时,由 于该数组自动退化为同类型的指针,所以在函数内部,作为函数参数传递进来的指针与数组确实具有一定 的一致性,但这只是一种比较特殊的情况而已,在本质上,两者是有区别的。请看以下的例子:char a = Hi, pig!;ch
29、ar *p = Hi, pig!;上述两个变量的内存布局分别如下:数组a需要在内存中占用8个字节的空间,这段内存区通过名字a来标志。指针p则需要4个字节的空间来存放地址,这4个字节用名字p来标志。其中存放的地址几乎可以指向任何地方,也可以哪里都不指, 即空指针。目前这个p指向某地连续的8个字节,即字符串“ Hi, pig! ”。另外,例如:对于a2和p2,二者都返回字符i ,但是编译器产生的执行代码却不一样。对于 a2,执行代码是从a的位置开始,向后移动2两个字节,然后取出其中的字符。对于 p2,执行代码是从p的位置取出一个地址,在其上加2,然后取出对应内存中的字符。问题:数组指针为什么在有些
30、时候我们需要定义指向数组而不是指向数组元素的指针?如何定义?答案与分析:使用指针,目的是用来保存某个元素的地址,从而来利用指针独有的优点,那么在元素需要是数组的情况下,就理所当然要用到指向数组的指针,比如在高维需要动态生成情况下的多维数组。定义例子如下:int (*pElement)2 。下面是一个例子:int array23 = 1,2,3,4,5,6;int (*pa)3; /定义一个指向数组的指针pa = &arrayO;/ &符号能够体现pa的含义,表示是指向数组的指针printf (%d, (*pa)0); / 将打印 array00 ,即 1pa+ ;/猜一猜,它指向谁?array
31、1 ?对了!printf (%d, (*pa)0); /将打印 array10 ,即 4上述这个例子充分说明了数组指针一一种指向整个数组的指针的定义和使用。需要说明的是,按照我们在第四篇讨论过的,指针的步进是参照其所指对象的大小的,因此,pa+将整个向后移动一个数组的尺寸,而不是仅仅向后移动一个数组元素的尺寸。问题:指针数组有如下定义:struct UT_TEST_STRUCT *pTo2MAX_NUM;请分析这个定义的意义,并尝试说明这样的定义可能有哪些好处?答案与分析:前面我们谈了数组指针,现在又提到了指针数组,两者形式很相似,那么,如何区分两者的定义呢? 分析如下:数组指针是:指向数组的
32、指针,比如int (*pA)5。指针数组是:指针构成的数组,比如int *pA5。至于上述指针数组的好处,大致有如下两个很普遍的原因:a)、各个指针内容可以按需要动态生成,避免了空间浪费。b)、各个指针呈数组形式排列,索引起来非常方便。在实际编程中,选择使用指针数组大多都是想要获得如上两个好处。问题:指向指针的指针在做一个文本处理程序的时候,有这样一个问题:什么样的数据结构适合于按行存储文本?答案与分析:首先,我们来分析文本的特点,文本的主要特征是具有很强的动态性,一行文本的字符个数或多或少 不确定,整个文本所拥有的文本行数也是不确定的。这样的特征决定了用固定的二维数组存放文本行必然 限制多多,缺乏灵活性。这种场合,使用指向指针的指针有很大的优越性。现实中我们尝试用动态二维数组(本质就是指向指针的指针)来解决此问题:图示是一个指针数组。所谓动态性指横向(对应每行文本的字符个数)和纵向(对应整个文本的行数) 两个方向都可以变化。就横向而言,因为指针的灵活性,它可以指向随意大小的字符数组,实现了横向动态性。就竖向而言,可以动态生成及扩展需要的指针数组的大小。下面的代码演示了这种动态数组的用途:/用于从文件中读取以0结尾的字符串的函数extern char *getline(FILE*pFile);F
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026国网浙江省高校毕业生提前批招聘(约450人)笔试模拟试题浓缩500题及参考答案详解
- 2026秋季国家管网集团湖南公司高校毕业生招聘4人考试备考试题(浓缩500题)及答案详解【典优】
- 2026国网安徽省电力公司高校毕业生提前批招聘笔试参考题库浓缩500题及参考答案详解1套
- 2026年黔西南州农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(轻巧夺冠)
- 2026秋季国家管网集团福建公司高校毕业生招聘考试备考试题(浓缩500题)附参考答案详解(精练)
- 2026秋季国家管网集团北方管道公司高校毕业生招聘考试参考题库(浓缩500题)附答案详解(满分必刷)
- 2026国家管网集团北方管道公司秋季高校毕业生招聘笔试参考题库(浓缩500题)含答案详解(典型题)
- 2026秋季国家管网集团浙江省天然气管网有限公司高校毕业生招聘笔试参考题库(浓缩500题)含答案详解(模拟题)
- 2026秋季国家管网集团北方管道公司高校毕业生招聘笔试参考题库(浓缩500题)带答案详解(精练)
- 2025国网陕西省高校毕业生提前批招聘(约450人)笔试模拟试题浓缩500题含答案详解(模拟题)
- 量值溯源培训课件
- 丙烷安全培训课件
- 2025年广西专业技术人员继续教育公需科目(一)答案
- 2025年广东省考公务员考试(公安专业科目)考试试题
- 天车工高级考试题库及答案
- 公司内部营运管理制度
- 化工单位销售管理制度
- T/CNCA 022-2022煤矿用可伸缩带式输送机无基础安装装置
- 男护士职业发展现状与未来路径
- 入团考试2025年价值观分享试题及答案
- 国家电投笔试题及答案
评论
0/150
提交评论