




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
16C语言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=9.333333【例1.2】输出两个数中的较大值的C语言程序。/*功能:输出两个数中的较大值 */main() /*主函数*/int num1,num2,max; /*定义num1、num2、max为整型变量*/scanf(%d,%d,&num1,&num2); /*由键盘输入num1、num2的值*/printf(max=%dn,max(num1,num2); /*在屏幕上输出调用max的函数值*/*用户设计的函数max()*/int max(int x,int y) /* x和y分别取num1和num2传递的值*/if(xy) return x; /* 如果xy,将x的值返回给max */else return y; /* 如果xy不成立,将y的值返回给max */程序运行情况:5,8(“”表示按回车键,以下相同)max=8在以上两个示例中,【例1.1】所示的C语言程序仅由一个main()函数构成,它相当于其他高级语言中的主程序;【例1.2】所示的C语言程序由一个main()和一个其他函数max()(用户自己设计的函数)构成,函数max()相当于其他高级语言中的子程序。由此可见,一个完整的C语言程序结构有以下两种表现形式:(1)仅由一个main()函数(又称主函数)构成,如图1-1(a)所示。(2)由一个且只能有一个main()函数和若干个其他函数结合而成,如图1-1(b)所示。其中,自定义函数由用户自己设计。图1-1 C语言程序结构示意图结合以上示例,可以看出C语言程序结构有以下基本特点:(1)C语言程序是由函数(如:main函数和max函数)组成的,每一个函数完成相对独立的功能,函数是C语言程序的基本模块单元。main是函数名,函数名后面的一对圆括号“()”是用来写函数的参数的。参数可以有,也可以没有(本程序没有参数),但圆括号不能省略。(2)一个C语言程序总是从main()函数开始执行。主函数执行完毕,程序执行结束。(3)C语言编译系统区分字母大小写。C语言把大小写字母视为两个不同的字符,并规定每条语句或数据说明均以分号(;)结束。分号是语句不可缺少的组成部分。(4)主函数main()既可以放在max()函数之前,也可以放在max()函数之后。习惯上,将主函数main()放在最前面。(5)C语言程序中所调用的函数,既可以是由系统提供的库函数,也可以是由设计人员自己根据需要而设计的函数。例如,在【例1.2】中,printf()函数是C语言编译系统库函数中的一个函数,它的作用是在屏幕上按指定格式输出指定的内容;max()函数是由用户自己设计的函数,它的作用是计算两个数中的较大值。二、C语言程序的书写规则(1)C源程序是由一个主函数和若干个其它函数组成的。(2)函数名后必须有小括号,函数体放在大括号内。(3)C程序必须用小写字母书写。(4)每句的末尾加分号。(5)可以一行多句。(6)可以一句多行。(7)可以在程序的任何位置加注释。一个完整的语言程序,是由一个main()函数(又称主函数)和若干个其它函数结合而成的,或仅由一个main()函数构成。例1.3 仅由main()函数构成的语言程序。main() printf(“This is a C program.n”);程序运行结果:This is a C program. 例1.4 由main()函数和1个其它函数max()构成的语言程序。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=%dn”, max(num1, num2);程序运行情况: Input the first integer number:6 Input the second integer number:9max=9 运算符与优先级、表达式一、运算符运算符包括下面这些类型:1、算术运算符(,*,):依次为加,减,乘,除,求余数。除最后两种是单目运算符外,其它几种都是双目运算符。前四种运算较简单,不再展开叙述,最后三种运算的定义如下:Op1 op2 表示:oPlint(oP1op2)*op2,其中ina(a)表示取a的整数部分(a的小数部分总非负)。Op+ 表示 op = op +1;Op- 表示 op = op -1;2 关系运算符(,=, ,) 依次为取反,按位与,按位或,按位异或,右移位,左移位,无符号右移位5 赋值运算符() 赋值操作符,它将等号右边数据的值赋值给左边的变量。6 条件运算柠(?:)条件运算符为三目运算符,其“般格式为:ab?a:b7 扩展运算符(十, * , /= ,|,)扩展运算符都是由一个双目运算符和一个等号连在一起组成(注意它们之间不能用空格隔开),以“+”为例说明这类扩展运算符的用法:A += B; 表示A A+B 其它类似。8 其他运算符,如豆号运算符“,”,分量运算符“ ”。再如实例运算符“instanceof”,内存分配运算符“new”,强制类型转换运算符“(类型)”,方法调用运算符“()”,取数组元素运算符“ ”。比如,设t是类Thread的一个实例。分量运算符:tname 表示类的实例的调用,又叫点问,(意指通过点的操作符访问类的实例对象)二、运算符的优先级优先顺序依次为(1级最优先,余下类推)1()5+ -913|2+ - ! instanceof6 = =11!15 + - * /4* %8= !1216 ! = =记住这些优先次序是困难的,个较好的方法是使用括号(),比如:ab & bc & ca 可以用括号写为 (ab) & (bc) & (ca) 这样即清晰易懂,也不易出错。三、表达式表达式是由操作数和运算符按一定的语法形式组成的符号序列。个常量或一个变量名字是最简单的表达式,其值即该常量或变量的值。表达式的值还可以用作其他运算的操作数,形成更复杂的表达式。表达式的类型由运算以及参与运算的操作数的类型决定,可以是简单类型,也可以是复合类型,如下面的例子所示:布尔型表达式: x&y|z;整型表达式:num1十num2;顺序结构:输入与输出一、选择题(1)有以下程序main() int m,n,p;scanf(m=%dn=%dp=%d,&m,&n,&p);printf(%d%d%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;printf(%o %on,mn,n);程序运行后的输出结果是A) 0256 0400 B) 0256 256 C) 256 400 D) 400 400 (3) 有以下程序main() int a=666,b=888;printf(%dn,a,b);程序运行后的输出结果是A) 错误信息 B) 666 C) 888 D) 666,888 (4) 有以下程序main( )int x=102,y=012; printf(“%2d,%2dn”,x,y); 执行后输出结果是A) 10,01 B) 02,12 C) 102,10 D) 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.5 B) 1 65 1.5 6.5C) 1 65 1.0 6.5 D) 2 65 1.5 6.5(6) 有定义语句:int x,y;, 若要通过scanf(%d,%d,&x,&y);语句使变量x得到数值11,变量y得到数值12,下面四组输入形式中,错误的是A) 11 12回车B) 11,12回车C) 11,12回车 D) 11,回车12回车(7) 设有如下程序段:int x=2002,y=2003;printf(%dn,(x,y);则以下叙述中正确的是A) 输出语句中格式说明符的个数少于输出项的个数,不能正确输出B) 运行时产生出错信息C) 输出值为2002D) 输出值为2003(8)若有以下程序段(n所赋的是八进制数)int m=32767,n=032767printf(%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) 0X0 B) 0x0 C) 0 D) 0XABC(10) 已知i、j、k为int型变量,若从键盘输入:1,2,3,使i的值为1、j的值为2、k的值为3,以下选项中正确的输入语句是A) scanf(“%2d%2d%2d”,&i,&j,&k);B) scanf(“%d %d %d”,&i,&j,&k);C) scanf(“%d,%d,%d”,&i,&j,&k);D) scanf(“i=%d,j=%d,k=%d”,&i,&j,&k);(11) 设有定义:long x=-123456L;,则以下能够正确输出变量x值的语句是A)printf(“x=%dn”,x); B) printf(“x=%1dn”,x);C)printf(“x=%8dLn”,x); D)printf(“x=%LDn”,x);(12) 以下程序段的输出结果是int a=1234;printf(%2dn,a);A) 12 B) 34 C) 1234 D) 提示出错、无结果(13) x、y、z被定义为int型变量,若从键盘给x、y、z输入数据,正确的输入语句是A) INPUT x、y、z; B) scanf(“%d%d%d”,&x,&y,&z);C) scanf(“%d%d%d”,x,y,z); D) read(“%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.0 D) 10 2222.0 33.0 33(15) 有如下程序main0 int y=3,x=3,z=1;printf(“%d %dn”,(+x,y+),z+2);运行该程序的输出结果是A) 3 4B) 4 2C) 4 3 D) 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) 以下说法中正确的是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) 只有格式控制,没有输入项,也能正确输入数据到内存,例如: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,i);上面程序片段的输出结果是A) 65536 B) 0 C) 有语法错误,无输出结果 D) -1(22) 若x和y都是int型变量,x=100,y=200,且有下面的程序片段:printf(%d,(x,y);上面程序片段的输出结果是A) 200 B) 100 C) 100 200 D) 输出格式符不够,输出不确定的值(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(表示回车),则上面程序的输出结果是A) a=98, b=765, c=4321 B) a=10, b=432, c=8765C) a=98, b=765.000000, c=4321.000000 D) 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.000000 B) 015.400000 C) 13.700000 D) 14.900000(25)以下程序的输出结果是【25】 。# include main() int a=2,c=5;printf(a=%d,b=%dn,a,c); A) a=%2,b=%5 B) a=2,b=5 C) a=%d,b=%d D) a=%d,b=%d(26) 执行下面程序中的输出语句,a的值是A) 65B) 20 C) 15D) 10main() int a;printf(%dn,(a=3*5,a*4,a+5);二、填空题:(1)以下程序运行后的输出结果是 【1】 。main() int x=0210; printf(%Xn,x);(2)以下程序运行后的输出结果是 【2】 。main() char c; int n=100;float f=10; double x;x=f*=n/=(c=50);printf(%d %fn,n,x);(3)以下程序运行时若从键盘输入:10 20 30。输出结果是 .#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) 以下程序运行后的输出结果是 【5】 。main() int a,b,c;a=25;b=025;c=0x25;printf(%d %d %dn,a,b,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);(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;printf(“%d,%dn”, 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.2fn”, z ); (13) 以下程序的输出结果是 13 。 main() unsigned short a=65536; int b;printf(“%dn”,b=a);(14) 若想通过以下输入语句使a=5.0,b=4,c=3,则输入数据的形式应该是 【14】 。int b,c; float a;scanf(%f,%d,c=%d,&a,&b,&c);(15) 若想通过以下输入语句给a赋于1,给b赋于2,则输入数据的形式应该是 【15】 。int a,b;scanf(a=%b,b=%d,&a,&b);答案:一、选择题01) A 02) C 03) B 04) C 05) B 06) A 07) D 08) A 09) C 10) C 11) B 12) C 13) B 14) B 15) D 16) A 17) D 18) D 19) D 20) A 21) B 22) A 23) C 24) C 25) D 26) C二、填空题(1) 88 (2) 2 20.000000 (3) 10 30 0 (4) 11 (5) 25 21 37(6) n1=%dnn2=%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、数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。3、当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。 问题:指针与数组听说char a与char *a是一致的,是不是这样呢?答案与分析:指针和数组存在着一些本质的区别。当然,在某种情况下,比如数组作为函数的参数进行传递时,由于该数组自动退化为同类型的指针,所以在函数内部,作为函数参数传递进来的指针与数组确实具有一定的一致性,但这只是一种比较特殊的情况而已,在本质上,两者是有区别的。请看以下的例子:char a = Hi, pig!;char *p = Hi, pig!;上述两个变量的内存布局分别如下:数组a需要在内存中占用8个字节的空间,这段内存区通过名字a来标志。指针p则需要4个字节的空间来存放地址,这4个字节用名字p来标志。其中存放的地址几乎可以指向任何地方,也可以哪里都不指,即空指针。目前这个p指向某地连续的8个字节,即字符串“Hi, pig!”。另外,例如:对于a2和p2,二者都返回字符i,但是编译器产生的执行代码却不一样。对于a2,执行代码是从a的位置开始,向后移 动2两个字节,然后取出其中的字符。对于p2,执行代码是从p的位置取出一个地址,在其上加2,然后取出对应内存中的字符。问题:数组指针为什么在有些时候我们需要定义指向数组而不是指向数组元素的指针?如何定义?答案与分析:使用指针,目的是用来保存某个元素的地址,从而来利用指针独有的优点,那么在元素需要是数组的情况下,就理所当然要用到指向数组的指针,比如在高维需要动态生成情况下的多维数组。定义例子如下: int (*pElement)2。下面是一个例子: int array23 = 1,2,3,4,5,6;int (*pa)3; /定义一个指向数组的指针 pa = &array0; / &符号能够体现pa的含义,表示是指向数组的指针printf (%d, (*pa)0); /将打印array00,即1 pa+; / 猜一猜,它指向谁?array1?对了!printf (%d, (*pa)0); / 将打印array10,即4上述这个例子充分说明了数组指针一种指向整个数组的指针的定义和使用。需要说明的是,按照我们在第四篇讨论过的,指针的步进是参照其所指对象的大小的,因此,pa+将整个向后移 动一个数组的尺寸,而不是仅仅向后移 动一个数组元素的尺寸。问题:指针数组有如下定义:struct UT_TEST_STRUCT *pTo2MAX_NUM;请分析这个定义的意义,并尝试说明这样的定义可能有哪些好处?答案与分析:前面我们谈了数组指针,现在又提到了指针数组,两者形式很相似,那么,如何区分两者的定义呢?分析如下:数组指针是:指向数组的指针,比如 int (*pA)5。指针数组是:指针构成的数组,比如int *pA5。至于上述指针数组的好处,大致有如下两个很普遍的原因:a)、各个指针内容可以按需要动态生成,避免了空间浪费。b)、各个指针呈数组形式排列,索引起来非常方便。在实际编程中,选择使用指针数组大多都是想要获得如上两个好处。 问题:指向指针的指针在做一个文本处理程序的时候,有这样一个问题:什么样的数据结构适合于按行存储文本?答案与分析:首先,我们来分析文本的特点,文本的主要特征是具有很强的动态性,一行文本的字符个数或多或少不确定,整个文本所拥有的文本行数也是不确定的。这样的特征决定了用固定的二维数组存放文本行必然限制多多,缺乏灵活性。这种场合,使用指向指针的指针有很大的优越性。现实中我们尝试用动态二维数组(本质就是指向指针的指针)来解决此问题:图示是一个指针数组。所谓动态性指横向(对应每行文本的字符个数)和纵向(对应整个文本的行数)两个方向都可以变化。就横向而言,因为指针的灵活性,它可以指向随意大小的字符数组,实现了横向动态性。就竖向而言,可以动态生成及扩展需要的指针数组的大小。下面的代码演示了这种动态数组的用途:/ 用于从文件中读取以 0结尾的字符串的函数extern char *getline(FILE *pFile);FILE *pFile;char *ppText = N
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年互联网行业ARVR技术应用前景分析报告
- 2025年电子器材行业智能家居器材市场前景及发展趋势研究报告
- 2025年医疗服务行业远程医疗服务市场前景分析报告
- 2025年互联网教育行业未来发展前景预测报告
- 2025年清洁能源行业可再生能源发展现状与前景研究报告
- 2025年医疗大数据行业健康大数据应用前景报告
- 岳阳楼区2025湖南岳阳市岳阳楼区事业单位招聘44人笔试历年参考题库附带答案详解
- 安置房委托代建协议书6篇
- 定西市2025年甘肃省兰州市事业单位招聘(536人)笔试历年参考题库附带答案详解
- 四川省2025年四川乐至县引进急需紧缺专业人才笔试历年参考题库附带答案详解
- 住房供给调控预案
- 培训行业转介绍
- 文科物理(兰州大学)学习通网课章节测试答案
- 人教版高二数学(上)选择性必修第一册1.2空间向量基本定理【教学设计】
- catia考试图纸题目及答案
- pos机风险管理办法
- 2025年行业机器人边缘计算技术应用与场景分析
- 2025年安徽省公务员录用考试《行测》真题及答案
- 2025年加油站行业需求分析及创新策略研究报告
- 2025中国工业传感器行业市场白皮书
- 手机桌面市场深度解析
评论
0/150
提交评论