指针和结构体理论题文档格式.docx
《指针和结构体理论题文档格式.docx》由会员分享,可在线阅读,更多相关《指针和结构体理论题文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
}}
main()
{inti=0,digit,letter,other;
charch,str[80];
printf("
"
);
ch=getchar();
while((11)){
str[i]=ch;
i++;
}
str[i]='
\0'
;
(12);
Digit=%dletter=%dother=%d\n"
digit,letter,other);
}
本题的思想很简单,只不过使用了指针而已。
(9)A.intdigit=0,letter=0,other=0;
B.int*digit=0,*letter=0,*other=0;
C.digit=letter=other=0;
D.*digit=*letter=*other=0;
内容赋值为0,不是指针赋值为0,因为*是取值运算.
(10)A.*s++!
B.*s++!
\n'
C.*s!
D.*s!
因为不结束,就继续。
数组不结束,就是不等于\0,所以只能在A和C中选择。
但因为A选项在结束循环后还要移动指针S,此时已经指向了\0,再移动指针会出错,所以选择C。
(11)A.ch!
B.ch!
C.ch=='
D.ch=='
(12)A.count(str,&
digit,&
letter,&
other)
B.count(&
str,&
C.count(*str,digit,letter,other)
D.count(*str,*digit,*letter,*other)
传地址,注意str就是字符串的首地址。
由此判断其他几个选项都是错误的。
P24
试题6(每小题3分,共12分)
structst{
charc;
chars[80];
};
这是结构体数组的定义(2个成员)
char*f(structstt);
voidmain()
{intk;
structsta[4]=
{{'
1'
"
123"
},{'
2'
321"
3'
4'
}};
这是结构体数组的初始化
for(k=0;
k<
4;
k++)
%s\n"
f(a[k]));
char*f(structstt)
{intk=0;
while(t.s[k]!
){
if(t.s[k]==t.c)returnt.s+k;
k++;
returnt.s;
本题的意思是,从t.s中找出与t.c相同的,从此开始,输出k位。
本题组合了函数和结构体、字符串的知识,比较难。
t.s+k的作用是向后移动k个元素。
注意:
’1’,’2’,’3’,’4’是字符型,t.c
’123’,’321’,’123’,’321’是字符串型,t.s
(21)程序运行时,第1行输出(21)。
A、321B、21
C、123D、12
第1行,从”123”中的第一个元素开始。
因为
t.s[k]==t.c
此时,t.c=1t.s[0]=1,
以下语句中if的条件成立:
if(t.s[k]==t.c)returnt.s+k;
所以,执行returnt.s+k;
这样从”1”开始输出,所以输出123。
(22)程序运行时,第2行输出(22)。
A、21B、12
C、3D、1
第2行,
此时,t.c=2,t.s[1]=2
所以,从”321”中的”2”开始输出,输出21。
(23)程序运行时,第3行输出(23)。
A、3B、123
C、1D、321
第3行,从”123”中的”3”开始输出,所以输出3。
(24)程序运行时,第4行输出(24)。
A、123B、1
C、3D、321
第4行,while(t.s[k]!
)条件不成立(321中没有4)
所以返回t.s,直接输出321。
P49
STRING.h>
{char*s[2]={"
****"
"
};
while(*s[1]!
s[0]+strlen(s[1])-1);
s[1]++;
}}
A、****B、***
C、**D、*
S是一个指针数组。
S[0]指向字符数组”****”,也就是说,
[*][*][*][*][\0]
↑
s0
S1指向字符数组”****”,也就是说,
s1
strlen(s[1])计算指针s的长度。
循环第一次时,*s[1]=*,*s[1]!
为真。
strlen(s[1])=4
strlen(s[1])-1=3
s[0]+strlen(s[1])-1=s[0]+3
这时,s[0]的指针变化为(向后移动指针3位):
所以输出的结果是*
C、**D、*
循环第2次时,*s[1]=*,*s[1]!
strlen(s[1])=3(注意:
s[1]++;
使s[1]的指针后移一位,所以长度减少)
strlen(s[1])-1=2
s[0]+strlen(s[1])-1=s[0]+2
这时,s[0]的指针变化为(向后移动指针2位):
所以输出的结果是**
C、**D、*
循环第3次时,*s[1]=*,*s[1]!
strlen(s[1])=2(注意:
strlen(s[1])-1=1
s[0]+strlen(s[1])-1=s[0]+1
这时,s[0]的指针变化为(向后移动指针1位):
所以输出的结果是***
A、****B、***
同理。
P54
阅读下列程序并回答问题,在每小题提供的若干可选答案中,挑选一个正确答案。
main()
charch,a[10],*s[10]={"
one"
two"
three"
four"
k=0;
while((ch=getchar())!
9)
if(ch>
5'
ch<
8'
)a[k++]=ch;
a[k]='
for(k=0;
a[k]!
printf("
%s"
s[('
-a[k])-1]);
}
s[0]one,s[1]two,s[2]three,s[3]four
(21)程序运行时,输入5678,输出(21)。
A、twothreeB、two
C、onefourthreeD、fourthreetwoone
第1次,输出s[‘9’-5-1]=s[3]=four
第2次,输出s[‘9’-6-1]=s[2]=three
第3次,输出s[‘9’-7-1]=s[1]=two
第4次,输出s[‘9’-8-1]=s[0]=one
(22)程序运行时,输入8561#,输出(22)。
A、twothreeB、two
第1次,输出s[‘9’-8-1]=s[0]=one
第2次,输出s[‘9’-5-1]=s[3]=four
第3次,输出s[‘9’-6-1]=s[2]=three
第4次,因为ch>
不成立,a[k]='
下移循环没有执行,所以没有输出结果。
注意一下各题,输入9和3时,与输入1一样。
(23)程序运行时,输入7902#,输出(23)。
C、onefourthreeD、fourthreetwoone
(24)程序运行时,输入7633#,输出(24)。
P65
1.阅读下列程序并回答问题,在每小题提供的若干可选答案中,挑选一个正确答案。
(每小题3分,共12分)
string.h>
main()
{inti,j;
charstr[10],*s[10]={"
SQL"
hello"
bear"
zone"
gets(str);
/**读入一个字符串/
for(i=0;
i<
i++){
if(strcmp(str,s[i])>
0)continue;
j=3;
while(j>
=i){/*逐一后移,腾出一个位置*/
s[j+1]=s[j];
j--;
}
s[i]=str;
/*放入刚才输入的字符串*/
break;
if(i==4)s[4]=str;
/*循环结束,没有比任何一个大,
也就是break语句没有起作用,此时循环正常结束,i==4
就把刚才输入的字符串放到最后*/
5;
i++)
s[i]);
putchar('
【问题】
(21)程序运行时,输入apple,输出(21)。
A.SQLapplehellobearzoneB.appleSQLhellobearzone
C.SQLhellobearzoneappleD.SQLhelloapplebearzone
(22)程序运行时,输入I,输出(22)。
A.SQLhellobearIzoneB.ISQLhellobearzone
C.SQLIhellobearzoneD.SQLhellobearzoneI
(23)程序运行时,输入zoo,输出(23)。
A.zooSQLhellobearzoneB.SQLhellobearzoozone
C.SQLhellobearzonezooD.SQLhellozoobearzone
(24)程序运行时,输入orange,输出(24)。
A.SQLorangehellobearzoneB.SQLhelloorangebearzone
C.orangeSQLhellobearzoneD.SQLhellobearorangezone
这个函数的作用是:
把输入的字符串与S[10]中的串逐一比较,如果输入的串小,就插入。
如果比所有的串都大,就放到最后。
大写字母比小写字符小(按照ASCII码比较)
P59
structnum{inta,b;
voidf(structnums[],intn)
{intindex,j,k;
structnumtemp;
n-1;
k++){
index=k;
for(j=k+1;
j<
n;
j++)
if(s[j].b<
s[index].b)index=j;
temp=s[index];
s[index]=s[k];
s[k]=temp;
{intcount,i,k,m,n,no;
structnums[100],*p;
scanf("
%d%d%d"
&
n,&
m,&
k);
s[i].a=i+1;
s[i].b=0;
p=s;
count=no=0;
while(no<
n){
if(p->
b==0)count++;
if(count==m){
no++;
p->
b=no;
count=0;
p++;
if(p==s+n)
f(s,n);
%d:
%d\n"
s[k-1].b,s[k-1].a);
(21)程序运行时,输入543,输出(21)。
A.3:
5B.2:
3
C.1:
2D.4:
1
(22)程序运行时,输入534,输出(22)。
5B.1:
2
C.4:
3D.4:
2
(23)程序运行时,输入752,输出(23)。
A.1:
5B.6:
1
C.2:
3D.2:
4
(24)程序运行时,输入424#,输出(24)。
3B.4:
4D.4:
一、
通过分析以下一段程序,
for(i=0;
我们知道:
结构体s的最初情况是:
S[0].a=1,s[0].b=0
S[1].a=2,s[1].b=0
S[2].a=3,s[2].b=0
S[3].a=4,s[4].b=0
S[4].a=5,s[0].b=0
二、通过分析以下一段程序,
if(s[j].b<
我们知道,函数f是按照s[j].b的大小排序,小的在前、大的在后。
注意,排序时s[j].a也相应改变。
三、分析以下程序:
/*赋初值,为0*/
n){/*1*/
/*2*/
if(count==m){/*3*/
/*4*/
/*5*/
}/*6*/
/*7,指针向后移动一次*/
if(p==s+n)/*8这两句的意思是,如果指到头,再返回起点*/
当循环进行了4次时,语句3的条件得到满足,所以语句4得到执行,no=1
此时,指针指向s[3].b,所以s[3].b=1;
注意,此后语句7继续执行,但语句8的条件不满足,所以继续,但因为语句6已经执行,所以count=0
然后,语句2再执行一次,语句8条件满足,又指向s[0].
这样,当下次语句3的条件满足时,no=2,而指针指向s[2],所以,s[2].b=2
依次类推,我们得到结构体s的最后结果:
S[0].a=1,s[0].b=5
S[1].a=2,s[1].b=4
S[2].a=3,s[2].b=2
S[3].a=4,s[4].b=1
S[4].a=5,s[5].b=3
特别应该注意的是,这里m的次数是4,而n=5,所以不匹配。
四,调用函数f对以上结构体排序后,结果如下:
S[0].a=4,s[0].b=1(注意是原来的s[4].b,所以S[0].a=4)
S[1].a=3,s[1].b=2
S[2].a=5,s[2].b=3
S[3].a=2,s[4].b=4
S[4].a=1,s[0].b=5
五.
S[k-1].b=s[3-1].b=s[2].b=3
S[k-1].a=s[3-1].a=s[2].a=5
所以,(21)题的答案是A.
其余各题类似。