29.有以下程序
point(char*p){p+=3;}
main()
{charb[4]={'a','b','c','d'},*p=b;
point(p);printf("%c\n",*p);
}
程序运行后的输出结果是a
注:
不要以为用指针做参数就是地址传递方式,因为你主函数中的p是指针,要想在函数中改变主函数中指针的值,应该以指针的指针的方式传递参数:
不可能通过调用函数来改变实参指针变量的值,但可以改变实参指针变量所指变量的值。
(*p+=3)就会变成d了。
P228
30.用矩形表示实体(等同于表)用椭圆形表示实体的属性(等同于表中字段)
用菱形表示实体关系(等同于外键),还要将有关系的实体用线连接上,线上画菱形。
31.在面向对象方法中, 类(Class)描述的是具有相似属性与操作的一组对象,而一个具体对象则是其对应类的一个实例。
32.当数据的存储结构改变时,其逻辑结构可以不变,因此,基于逻辑结构的应用程序不必修改,称为物理独立性。
当数据库总体逻辑结构改变,不需要修改应用程序,这是数据的逻辑独立性。
33.scanf读到空格或者回车时会把空格或回车转化为\0(字符串结束符)而gets函数则把空格作为字符接收。
34.不改变关系表中的属性个数但能减少元组个数的是(交)
35.函数返回值的类型最终取决于(函数定义时在函数值首部所说明的函数类型)
36.若变量均已正确定义并赋值,以下合法的C语言赋值语句是(A)
A)x=y==5;B)x=n%2.5;C)x+n=I;D)x=5=4+1;A可以是赋值语句啊(先判断y是否等于5,并将返回值赋给x)注:
B中取模右边不是整数C中赋值号左侧不是一个变量D中第二个赋值号左侧不是一个变量。
34.
A)p->next=q->next;B)p->next=p->next->next;C)p->next=r;D)p=q->next;
注:
A.B.C的作用都是删除q节点,D的作用是让p指针指向r。
删除结点只要让它第一个点脱离就行了,后面的q->next还指向r结点不管的,没事。
选D
35./*/*programming*/*/中/*programming做为注释内容(/*和他后面的第一个*/结合),但多出的*/是非法的。
而/*/programming/*/是对的。
36.有以下程序
#include
main()
{charc1,c2,c3,c4,c5,c6;
scanf("%c%c%c%c",&c1,&c2,&c3,&c4);
c5=getchar();c6=getchar();
putchar(c1);putchar(c2);
printf("%c%c\n",c5,c6);
}
程序运行后,若从键盘输入(从第1列开始)
一,123<回车>45678<回车>二,1234<回车>45678<回车>三,12<回车>45678<回车>
则输出结果是1245,12\n4,1256
说明这里的回车键也是一个字符,与书P85~86的区别下。
37.有以下程序
main()
{inta=0,b=0,c=0,d=0;
if(a=1)b=1;c=2;
elsed=3;
printf("%d,%d,%d,%d\n",a,b,c,d);
}
程序输出(D)
A)0,1,2,0B)0,0,0,3
C)1,1,2,0D)编译有错
注:
首先程序肯定会出错的,if和else之间不可以超过一句语句;如果改成这样的话
main()
{inta=0,b=0,c=0,d=0;
if(a=1){b=1;c=2;}//注意这里的a=1是赋值语句,所以是永真,因此执行b=1;c=2不执行else
elsed=3;
printf("%d,%d,%d,%d\n",a,b,c,d);//a=1,b=1,c=2,d=0;
或者改成
if(a=1)b=1,c=2;也可以。
这里是逗号表达式。
只有一个分号,只有一句语句
注意if和else之间不能超过一句语句。
37.在C语言中,预处理命令行都以"#"开头。
38.每个C程序必须在开头包含预处理命令行:
#include是错误的。
39.可以通过typedef增加新的类型错误:
用typedef只是对已经存在的类型增加一个类型名,而没有创造新的类型。
40.用typedef定义新的类型名后,原有类型名仍有效。
41.用typedef可以为各种类型起别名,但不能为变量起别名。
42.以下选项中,值为1的表达式____B____。
A)1-"0" B)1-"\0" C)"1"-0 D)"\0"-"0"
注:
“0”代表‘0’和‘\0’(字符串结束符)
43.&与运算,|或运算,^异或运算,~取反运算。
38.有以下程序
main()
{char*p[]={"3697","2584"};//定义了p[0]=”3697”,p[1]=”2584”
inti,j;longnum=0;
for(i=0;i<2;i++)
{j=0;
while(p[i][j]!
=′\0′)
{if((p[i][j]-′0′)%2)num=10*num+p[i][j]-′0′;//注意while循环,执行了两次
j+=2;
}
}
printf("%d\n",num);
}
程序执行后的输出结果是39
39.对下列二叉树进行,前序,中序,后序遍历的结果是前:
FCADBEG中:
ACBDFEG后:
ABDCGEF
39.有以下程序
main()
{union
{charch〔2〕;
intd;
}s;
s.d=0x4321;
printf("%x,%x\n",s.ch〔0〕,s.ch〔1〕);
}
在16位编译系统上,程序执行后的输出结果是21,43。
注;ch[0]为低字节;ch[1]高字节。
40.若有定义语句:
intk[2][3],*pk[3];,则以下语句中正确的是____B____。
A)pk=k;B)pk[0]=&k[1][2];C)pk=k[0];D)pk[1]=k;
注:
*pk[3]相当于*pk[0],*pk[1],*pk[2].因为〔〕的优先比*号高,所以代表的是数组元素p[0]-p[2]的地址。
A如果是A的话,应该改成*pk[2]而不是*pk[3]
B是对的pk[0]=&k[1][2]就是一个元素的地址
C其实和A一样,k[0]代表首行地址,相当于k
Dpk[1]代表是一个数组的地址,而不是行地址
注意区别(*pk)[3]如果是这样的话,分别表示(*pk)[0]-(*pk)[2],是一个数组,数组里三个元素都是地址。
此时p就指向包含四个元素的一维数组,p就指向行,所以pk=k就可以。
P248
(*pk)[3]整个表示的是第一行三个列元素的地址
41.在深度为7的满二叉树中,度为2的结点个数为___63______。
注:
度为2的节点就是该节点既有左子树,又有右子树
深度为7的满二叉树总共的节点数为2^7-1=127;又因为是满二叉树,所以只有度为2的和度为0的节点
<度为0的就是叶子节点>,叶子节点的数目为:
2^(7-1)=64,所以有度为2的结点个数为=127-64=63个.
42.在结构化分析使用的数据流图(DFD)中,使用【数据字典】对其中的图形元素进行解释。
43.逗号表达式:
a=3*5,a*4解:
a的值为15,整个逗号表达式的值为60。
(a=3*5,a*4),a+5解:
先计算出a=15,再a*4得到60,但a值未变,所以整个表达式的值为20。
例如:
inta=10;a=(3*5,a+4);printf(“a=%d\n”,a);结果为a=14
44.strlen("IBM\n012\1\\")这个的长度是多少?
答案9个。
IBM\n012\1\\
\1(此处显示的为ASCII码的001的字符笑脸).
45.若程序中有宏定义行:
#define N 100 表示在编译程序对C源程序进行预处理时用100替换标识符N。
41.main()
{第一次n=0,k=4;因为default后面没
intk=5,n=0;break,所以执行下面的case2,case4.
do第二次n=2,k=3;
{第三次n=3,k=2;
switch(k)第四次n=5,k=1;此时n<5不成立,退出。
{程序运行的输出结果为235
case1:
case3:
n+=1;k--;break;
default:
n=0;k--;
case2:
case4:
n+=2;k--;break;
}
printf("%d",n);
}while(k>0&&n<5);
}
42.
答案:
D【f(a)中的a不是数组名或指针所以传的是变量也就是值,没返回。
】
43.有以下函数
intfun(char*s)
{char*t=s;
while(*t++);
retum(t-s);
}
该函数的功能是(B)字节比字符串长度多1个
A)比较两个字符串的大小B)计算s所指字符串占用内存字节的个数
C)计算s所指字符串的长度D)将s所指字符串复制到字符串t中
注:
注意while后面的分号,还有就是执行到*t='\0'=0;退出while循环。
此时t还要加1。
44.
inta=4;
intf(intn)
{intt=0;staticinta=5;
if(n%2){inta=6;t+=a++;}
else{inta=7;t+=a++;}//n=0,执行else,t=0+7=7
returnt+=a++;//但此时的a不是上面的a=7加1的a=8,因为上面ifelse的a为局部变量,
}此时a应为staticinta=5,所以t=12,a此时为6,由于a静态保留上次的。
main()
{ints=a,i=0;
for(;i<2;i++)s+=f(i);
printf("%d\n",s);
}运行后结果为28
45.
结果为136
注:
argv是保存参数的二维字符数组
argv[0]指向程序路径:
"tt.exe"argv[1]指向第一个参数:
"12"argv[2]指向第二个参数:
"345"
argv[3]指向第三个参数:
"678"显然*argv[1]='1'*argv[2]='3'*argv[3]