0.8x+22
(3)有一数列,第一数位1,第二个数也为1,以后各数为前两个数之和。
试用数组方法编程打印这个数列的前15个数。
(4)从键盘输入8个整数,用指针方法编程找出其中最大和最小的数。
(5)改正下列程序中的错误。
注意:
不得增行或删行,不能改动程序结构。
#include
#definePOSa>0
main()
{
inta=9;
a+=a%=2;
if(POS)
printf(“aispositive”);
else
printf(“aisnotpositive”)
}
(6)任何一个英文字母的ASCII码,都能以一个由2位组成的十六进制数表示。
请编写一个程序,它能在某个英文字母后,输出2个数,一个是该字母的以2位十六进制表示的ASCII码,另一个数十表示该字母ASCII码的2位十六进制数互换位置后的十六进制数。
如输出十六进制数61和16
4.编程题
(1)已有firstnode指向一个具有头结点的单向链表,链表中每个节点包含整型数据域(idata)和指针域(pnext)。
今欲把值为m的结点插在值为n的结点之前,若没有值为n的结点,则把值为m的结点插在链表最后。
请编写一函数insertm实现上述要求。
第一套解答
1.填空题
(1)答案:
main函数(或主函数),main函数(或主函数)
说明:
C语言规定:
C程序总是从main函数第一条语句开始执行,最后到main函数的最后一条语句结束。
(2)答案:
-12,6
说明:
按照C语言条件表达式(x?
y:
z)的运算规则,若x为真,则表达式的值为y;若x为假,则表达式的值为z。
所以,a=12时a>0成立,故此时a=-a=-12。
逗号是C语言中运算优先级最低的运算符,故当b=12时逗号表达式b=6,2*b的值为12,但运算后b的值为6。
(3)答案:
*d1=-3*d2=︹-3*d3-3︹*(︹表示空格)
说明:
格式符%md表示如下含义:
%d表示按实际长度输出十进制整型数据;如果m为正整数,m为指定的输出字段的宽度,当数据的位数小于m时,左端补以空格,当数据的位数大于m时,按实际位数输出;如果m为负数,|m|为指定的输出字段宽度,当数据的位数小于|m|时,右端补以空格,当数据的位数大于|m|时,按实际位数输出。
所以,*d1=%d,对应输出*d1=-3,*d2=%3d对应输出*d2=︹-3,*d3=%-3d*对应输出*d3=-3︹*。
(4)答案:
1
说明:
逻辑运算符>的优先级高于!
=,所以,当a=6,b=3,c=2时,a>b的值是1,1!
=c为真,其值是1。
(5)答案:
254
说明:
本题的关键是要清楚while语句的用法。
while语句的一般形式为while(表达式)语句。
当表达式为非0时执行while语句中内嵌语句。
另外,要注意在本题中n*=x相当于n=n*x,y+=n相当于y=y+n。
(6)答案:
常量表达式、常量表达式
(7)答案:
voidsub(inta,intb),intsub(inta,intb)
说明:
当不要求函数具有返回值时,用void定义函数。
如果要求函数具有返回值,就要根据函数返回值的类型进行定义,譬如,函数返回值是整型,则用int定义,返回值是自符型,则用char定义,等等。
本题中,函数sub具有返回值c,且c为整型,所以,不能用void定义sub函数,而应该用int定义该函数。
(8)答案:
指针P使用前未赋值
说明:
当指针未被赋值时,指针的值是一个不确定的值,即实际上可能指向一个事先未指定的单元。
这种情况很危险。
因为,在引用指针之前应它赋值。
本题中,指针P被定义后,应先赋值,如可以令P=&a,然后再引用*P=a-5.
(9)答案:
执行(或运行),编译
(10)答案:
结构体变量,结构体类型
(11)答案:
按位于,取地址
说明:
进行单目运算时,&表示取地址。
进行双目运算时,&表示按位与运算。
2.选择题
(1)答案:
A、D、F
说明:
在C语言中,C源程序是由一个或多个函数组成,其中必须且只能包含一个main函数,main函数可以在C源程序中的任何位置。
C程序的语句以分号为终结符,根据实际情况每行可以写一条或多条语句。
C源程序的注释说明用/*和*/作为两侧的分界符,根据需要可以放在一条语句之前、一条语句之后或程序的最前面,等等。
与其他高级语言不通,C语言本身没有输入输出语句,C语言利用标砖库函数(如scanf和printf等)实现数据的输入输出。
(2)答案:
C
说明:
逻辑与&&的优先级高于逻辑或‖得优先级。
所以,(x>=3)&&(x<=20)表示x在闭区间[3,20]取值时为真,(x>150)&&(x<250)表示x在开区间(150,250)取值为真,表达式(x>=3)&&(x<=20)‖(x>150)&&(x<250)表示“当x的取值在[3,20]和(150,250)范围内为真,否则为假”。
注意,以上表达式也可去掉括号,因为逻辑运算符&&和‖的运算优先级低于关系运算符>=、<=、<和>的优先级。
(3)答案:
B、E
说明:
用scanf输入数据时,在以下情况下认为该数据输入结束:
一是遇空格、“回车”键或TAB键;二是按宽度截取,如“%4d”,只取4列;三是遇非法输入,如想输入10.56,但却错打入1o.56,结果1被输入后,该数就被认为输入完。
对于本题,a取值按宽度截取,为5678/。
然后接着输入b的值,由于9后面是空格,故b的值是9.000000。
(4)答案:
B
说明:
本题的关键点是要掌握条件语句的用法。
本题中if和elseif后面都有“表达式”,若表达式的值为非0,执行紧随其后的语句,然后结束if语句的执行,若为0,就进行下面“表达式”的判断。
本题中的x等于2.0,“表达式”中只有x<10.0为非0,故应执行其后语句y=1.0/a,最后屏幕输出是0.500000。
(5)答案:
C
说明:
本题要点:
首先,对于循环语句for(表达式1;表达式2;表达式3)语句,若表达式2为空,则认为循环判断条件总为真。
其次,continue语句结束本次循环,break语句用于整个循环语句。
第三,整型变量i在-32768-32767之间变化。
对于程序段B,当i由30000增大到超过32767时,i变为负值,执行“if(i<0)break;”后,可结束循环。
对于程序段C,for语句的表达式2总为真,又没有break语句,故这是一个死循环程序段。
对于程序段D,i从1自减为0时,while(--i)结束执行。
(6)答案:
D
说明:
一维数组定义式为
类型说明符数组名[常量表达式];
在选择项A中,使用圆括号定义数组时错误的,应该使用方括号。
在选择项B中,方括号中是一个变量n,不属于常量表达式,也不正确。
选项C中存在与选择项B中相同的错误。
在选择项中D中,预处理语句把S定义为一个常数,编译后int[S]变成int[15],这是正确的数组定义。
(7)答案:
C
说明:
C语言规定函数的返回值通过函数中的reture语句获得,函数返回值的类型就是定义该函数时的函数类型。
如果函数值的类型和reture语句中的表达式的值不一致,则以函数类型为准。
如果函数定义时未加类型说明,一律自动按整数处理。
(8)答案:
C
说明:
在“intx,y,z=4,m=6,*p1=&z,*P2=&m;”语句中,定义了4个整型变量和2个整型指针变量,注意指针变量p1和p2在定义时即被赋初始值,分别指向z和m。
在x=p1==&m语句中,赋值号=的右边是一个关系表达式p1==&m,因p1不指向m,故p1==&m的值为0,于是x为0。
在“y=(-*p1)/(*p2)+7”语句中,*p1等于整型数4,*p2等于整型数6,故(-*p1)/(*p2)等于0,于是y等于7。
(9)答案:
B
说明:
如果变量的值有限,可以一一列举出来,则可以用枚举类型定义这种变量。
定义枚举类型用enum开头。
定义形式为:
enum枚举变量{枚举变量}
(10)答案:
A
说明:
在C语言中,系统分配给一个已定义结构体变量的内存,是该结构变量的各成员所需内存量的总和。
而系统分配给一个已定义共用体变量的内存,则是该共用体变量的成员中占内存量最大所需的容量。
这是结构体格共用体的一个重要区别。
(11)答案:
B
说明:
在fopen函数的使用文件方式字符串中,“r”:
打开文本文件用于读。
“w”:
创建文本文件用于写,并删除已存在的内容(如果有的话)。
“a”:
打开或创建文本文件用于在文件末尾写。
“r+”:
打开文本文件用于更新(即读和写。
)“w+”:
创建文本文件用于更新,并删除已有的内容(如果有的话)。
“a+”:
打开或创建文本文件用于读和在文件末尾写。
对于上述各种情况,如有b表示操作二进制文件,无b表示操作文本文件。
对于本题要建立一个新的文件,故在使用文本方字符串中要有w,又要能写能读,要有+,操作二进制文件,要有b。
于是使用文件方式字符串应为“wb+”。
3.解答题
1.答案:
scanf函数从标准输入流(一般为键盘输入)读取字符序列,它的转换规格说明用于表示读取字符的格式,用于读取的变元必须是指针。
所以,本题中的“scanf(“%d%d”,a,b);”有误应该为scanf(“%d%d”,&a,&b)。
2.答案:
#include
main()
{
floatx,y;
scanf(“%f”,&x);
if(x<=0)y=0;
elseif(x<=22)y=12;
elseif(x<50)y=0.8*x+22;
elseprintf(“xisnotinthedefinitionrange.”);
if(x<50)printf(“y=%f”,y)
}
说明:
这是一个分段函数的计算问题。
根据不同的条件,用不同的函数计算,这种情况适合用分支结构的程序实现,可选用if语句或switch语句编程。
本题选择if语句编程。
3.答案:
#include
main()
{
inti;
\*定义一个整型变量作循环变量*\
staticintnum[15]={1,1};
\*定义静态整型数组,并给前两个数赋初始值*\
for(i=2,i<15,i++)num[i]=num[i-2]+num[i-1];
\*计算第二个元素之后各元素的值*\
for(i=0,i<15,i++)printf(“%d”,num[i]);
\*打印数组各个元素值*\
}
说明:
本题编程时应注意两点:
一是通常使用循环语句处理有重复计算的问题;二是数组赋初始值时应定义数组为静态存储或外部存储,还有就是数组下标不要越界(如本题中15个元素数组,其下标最大值为14)。
(4)答案:
#include
main()
{
inti,num[8]/*定义1个整型变量和1个数组*/
int*p,*max,*min;/*定义3个指针变量*/
printf(“input8integersplease.\n”);
for(i=0;i<8;i++)scanf(“%d”,&num[i]);/*循环读取8个整数*/
max=min=p=num;
for(;p{
if(*p>*max)max=p;/*搜索指向数组最大数据元素的指针*/
if(*p<*min)min=p;/*搜索指向数组最小数据元素的指针*/
}
Printf(“\n%d,%d”,*max,*min);/*打印数组最大和最小数据元素*/
}
(5)答案:
C语言中的编译预处理命令包括三种:
宏定义、文件包含和条件编译。
这些命令以符号#开头,结尾没有分号之类的符号。
在本题中,宏定义命令“#definePOSa>0;”结尾有分号,这是错误的,应改为#definePOSa>0的形式。
(6)答案:
#include
main()
{
chara,b,c;/*定义3个字符型变量*/
printf(“inputaEnglishcharacterplease:
”);
scanf(“%c”,&a);/*输入1个英文字母*/
printf(“\n%x”,a);/*以十六进制数表示该字母的ASCII码*/
b=(a&0xf)<<4;/*与高位是4个0低位时4个1的数按位与,再左移4位*/
c=(a&0xf0)>>4;/*与高位是4个1低位时4个0的数换位与,再右移4位*/
a=b|c;/*ASCII码中移到高位的十六进制数与移到低位的十六进制数按位或*/
printf(“\n%x”,a);/*打印结果*/
}
说明:
本题的实质是把字母的ASCII码的高位十六进制数与低位十六进制数进行位置交换。
可采用如下方法处理:
先把高位十六进制数屏蔽掉,左移4位以使低位十六进制数移到高位;再把低位十六进制数屏蔽掉,右移4位以使高位十六进制数移到低位;最后把这两个数按位进行或运算。
4.编程题
(1)答案:
#defineNULL0/*NULL代表0,表示“空地址”*/
#defineLENsizeof(structmynode)/*LEN代表sturctmynode结构数据的长度*/
structmynode/*定义结点为结构体类型*/
{
intidata;
structmynode*pnext;
};
insertm(firstnode,n,m);/*定义firstnode为指针,它指向链表的头结点*/
intn,m;
{
structmynode*s,*p,*q;/*定义3个指针*/
s=(structmynode*)malloc(LEN);/*令s指向新开的结点*/
s->idata=m;/*令新开结点的整数域等于m*/
q=firstnode;p=firstnode->pnext;/*令头结点为当结点(q所指),p指向下一个结点*/
if(p==null)
{s->pnext=p;q->pnext=s;return;}/*若当前节点指向空,则令s所指结点为头结点*/
while((p->idata!
=n)&&(p->pnext!
=NULL))/*查找整数域为n的结点或链表尾结点*/
{q=p;p=p->pnext;}
if(p->idata==n)
{s->pnext=p;q->pnext=s;}/*若当前结点整数域为n,则在它之前插入s所指结点*/
else
{s->pnext=NULL;p->pnext=s;}/*若未找到整数域为n的结点,把s所指结点作尾结点*/
}
说明:
该算法的思路是:
令s指向整数域为m的结点,q指向链表的当前结点,p指向链表当前结点的下一个结点。
从该单向链表的头结点开始搜索检验,如果firtnode指向空,则把s所指结点作为链表的一个结点加入,即令firtnode指向该节点,该结点的指针域指向空。
如果当前结点的整数域为n或当前结点的指针域为空,则停止逐个结点的搜索检验,把s所指结点插入。