66。按照相同的方法,可以知道控制变量abc的值将依次等于65、66、67、68,循环的条件都满足。当abc加1后变为69时,判断控制循环的条件“adc<C”将不再成立,退出循环。由上述分析,该循环一共执行4次,所以只有备选答案③是符合题意的。
【答案】③
7 关于枚举型变量的引用,下列说法中错误的是()
①给枚举型变量赋值可以使用:枚举型变量=(enum枚举型)整常数
②两个同一种枚举型的变量之间可以进行关系运算
③两个同一种枚举型的变量之间可以进行加减运算
④一个枚举型变量可以进行++、--的运算
【分析】分析备选答案①:教材(p165)的例子中明确指出:整数不能作为枚举型常量值,但是“(enum枚举型名)整数”是通过数据类型强制转换原则将整数转换成枚举型数据,所以该答案的说法是正确的。分析备选答案②:只要两个枚举型变量是同一种枚举型,它们之间就可以进行比较大小的运算(即关系运算),所以该答案的说法也是正确的。分析备选答案③:给枚举型变量所赋的值只能是枚举型常量,虽然枚举型常量的值是整数,但是枚举型数据是一种特殊类型的数据,不是整型数据,所以它们之间不能进行算术运算,该答案的说法是错误的,符合题意。至于备选答案④:教材(pl66)的关于枚举型变量使用在循环中的例子里,已经使用了“枚举型变量++”,显然该答案中的说法是正确的,不符合题意。
【答案】③
8 下列关于结构型、共用型、枚举型的定义语句中,正确的是()
① struct ss{ int x} ② union uu { int x;}xx=5;
③ enum ee{ int x;}; ④struct{int x;};
【分析】分析备选答案①:在成员名x的后面缺少一个分号,在右花括号的后面缺少一个分号,所以语法上是错误的。分析备选答案②:共用型变量是不能赋初值的,该语句语法出错。分析备选答案③:枚举型定义时,花括号中是枚举常量表,即用逗号分隔的一个个枚举常量,不能对每个枚举常量给出数据类型,所以该语句也有语法错误。显然备选答案④是正确的,符合题意。注意,在这个定义语句中,没有给出结构型名,这是允许的。
【答案】④
9 若有下列定义语句“typedef int *INTARRAY[10];”,则和定义语句“INTAIthAY a,b;”作用相同的数据定义语句是()
① int a[10], b[10]; ② int a[10],*b;
③int *a,b[10]; ④int *a[10],*b[10];
【分析】首先来分析给出的前一个定义语句,这个语句是定义用户自己的数据类型符的,从语句本身可以看出,这是定义指向整型数据的指针型数组的用户数据类型。再分析结出的后一个定义语句,显然这个语句是使用用户定义的数据类型符“INTARRAY”来定义具体的指针型数组,从语句中可以看出,一共定义了两个名为a和b的、指向整型数据的。长度为10的指针数组。显然,分析给出的四个备选答案,只有备选答案④的功能是定义两个名为a和b的指向整型数据的指针型数组,且数组长度为10,所以本题的正确答案应选④。
【答案】 ④
10 下列程序的功能是输入一个学生的学号,在3个学生的信息(参看程序清单中的结构型定义)中查找,如果找到,则输出该学生的姓名和总分;如果找不到,则输出提示“NotFound!”。请填写程序中缺少的语句成份。
struct { long num; /*学生的学号*/
char nane[10]; /*学生的姓名*/
float total; /*学生的总分*/
} s[3]={{101L,"chi",658},102L,"gu",648},{103L,"cheng",549}};
main()
{ long x;
int i, flag= 0;
scanf(“%1d”, &x);
for( i= 0; i< 3; i++)
if(______________)
{ flag= l;
break;
}
if(flag)
prinif("%s%f\n", s[i].name, s[i].total);
else
printf("Not Found!\n");
}
【分析】这是一个在数组中寻找符合条件的数组元素的常见问题,唯一要注意的是这个数组是结构型数组,这个查找的条件是结构型成员的位。例览程序可以发现,和一般的顺序查找算法相同,也是利用一重次数型循环依次处理当前数组元素,查到则在标记变量flag中置1,退出循环;查不到,则利用循环前在标记变量flag中预置的0来表示。最后利用标记变量flag的值进行不同的输出。分析到这儿,就可以来考虑需要填写的内容,这个内容显然是查到的条件:输入的学号x要等于当前结构型数组元素s[i]的成员num值,具体写出来就是:x==s[i].num。注意,这个答案还有另一种写法:x==(&s[i])->num。
【答案】x==S[i].num或x==(&s[i])->num1 设有下列定义语句,则表达式“p->x「l」”的值是_____________;表达式“(*p).k”的值是____________。
struct { int x[5];
int k;
} s={{1,2},3},*p=&s;
【分析】p是指向结构型变量s的结构型指针变量,所以“p->成员名”就是结构型变量s的成员。由于表达式中给出的成员是数组元素x[1],所以该表达式的值就是x[1]的值。从赋初值来看,这个数组元素的初值为2,所以第一个空白应该填写2。同样道理,*p就是p指向的结构型变量s,所以第二个表达式就是s.k,k是结构型变量S的成员,初值为3,所以第二个表达式的值为3。
【答案】2
3
2 设有下列定义语句,则下列表达式中能表示结构型xx的成员x的表达式是()
struct xx{ int x;};
struct yy { struct xx xxx;int yy;} xxyy;
① xxyy.x ② xxyy->x ③(&xxyy)->xxx.x ④xxx.x
【分析】分析备选答案①:xxyy是结构型yy的变量,其后跟“.成员”是正确的,但是这个成员必须是结构型yy的成员,而表达式中的“x”是结构型xx的成员,所以是错误的。分析备选答案②:xxyy是结构型变量,其后不能跟“->”,这样会造成语法错误。分析备选答案③:&xxyy是结构型变量xxyy的地址,其后跟“->成员”是正确的,表示该结构型
的成员,这个成员是结构型对的成员xxx,而这个成员的数据类型又是另一个结构型xx,所以其后应该是“.xx的成员”,表达式中恰好是xx的成员x,所以这个表达式是正确的(注意,这是嵌套结构型成员的弓l用格式)。至于备选答案④:xxx是结构型成员,不能直接引用,前面必须有结构型变量或结构型数组元素。
【答案】③
3 设有下列定义语句,则表达式“(*(p+1)).name[1]”的值是______________;表达式“(p+1)-> score[1]”的值是_____________。
struct { long num;char name[10」;float score[3];
}s[2」={{101L,"zhao",{90,80,70}},{102L,"qian",{75,65,55}}},*p=s;
【分析】指针变量 p是指向结构型数组 S的首地址,所以 p+ 1就是数组元素 s[1]的地址,因此,*(p+ l)就是 s[1],这是一个结构型数组元素,其后跟“.name[1]”,则代表结构型成员,所以第一个空白处应该填写的是结构型成员name数组的元素name[1]的值,从赋初值的情况来看,这个值是字符‘i’。再来分析第二个表达式, p+ l是结构型数
组s的元素s[1]的地址,在地址后面跟“->score[1]”也是代表结构型成员,因此第二个空白处填写的是结构型成员score数组的元素score[l]的值,这个值显然是65.0。
【答案】'i'
65.0
4 关于获得系统日期函数(getdate())和获得系统时间(gettime())的函数,下列说法中错误的是()
①需要在程序的开头写上相关的包含命令
②如果需要通过getdate()函数获得系统日期,必须定义一个 struct date型的变量
③如果需要通过gettime()函数获得系统时间,必须定义一个 struct time型的变量和一个struct time型的指针变量
④getdate()函数和gettime()函数均无返回值
【分析】分析备选答案①:显然是正确的说法,使用任何系统函数都要写上包含该函数的包含命令。分析备选答案②:因为调用getdat()函数时,需要一个能接受系统日期的结构型 struct date的变量,虽然该函数的参数是指向该种结构型的指针变量,但是我们可以用“&结构型变量名”作为实际参数,所以本答案的说法也是正确的。分析备选答案③:和备选答案②类似,从gettime()函数的调用要求来说,也需要一个能存放系统时间的 struct tine结构型的变量,虽然调用函数时需要的是指针变量,但是可以用“&结构型变量名”来调用,并不一定需要同时有结构型变量和结构型指针变量,所以该说法是错误的,符合题意。至于备选答案④:教材中明确指出,这两个系统函数均无返回值。
【答案】 ③
5 设有下列定义语句,则表达式“sizeof(union uu)”的值是___________;表达式“size-of((&uu1)->x[5])”的值是_________________。
union uu { short x[10]; char s[10]; float x10;}uu1;
【分析】sizeof()函数的参数可以是数据类型符,也可以是已经定义的变量、数组元素等对象。该函数的返回值是测试对象所占用的内存字节数。对于第一个表达式来说,测试对象是共用型“union un”。对于共用型来说,所占用的字节数是共用型成员中占用字书数最多的成员所占用的字节数。共用型union uu的三个成员占用的字节数分别为20、10、4,所以该表达式的值是20。第二个表达式测试的是共用型uu的变量uul的成员x数组元素x[5」所占用的字节数,这个成员的数据类型是短整型,所以每个数组元素占用的字节数是2,即该表达式的值为2。
【答案】 20
2
6 设有下列定义语句:
enum { A=65,B=67, C=69}abc;
则关于循环语句“for(abc=A;abc<C;abc++);”的正确说法是()
①语法出错 ②死循环 ③循环次数是4 ④循环次数是2
【分析】由于A、B、C是枚举常量,所以可以用在循环语句中作为控制变量来控制循环。分析备选答案①:显然这个答案是错误的,上述循环语句的语法是正确的。注意循环体是一个空语句,这是允许的。分析备选答案②、③、④,关键是搞清楚这个循环到底执行多少次。分析这个问题时,有一个原则,即使用枚举型变量时,进行++运算是加上整数1,还是将定义枚举型时,枚举常量表中的后一个枚举常量值放到这个枚举变量中,答案是前者。掌握了这个原则,就可以来分析循环到底执行多少次?首先,枚举型变量abc是等于枚举常量A的值(为整数65),控制循环的条件是“abc<C”,此时枚举常量C的值是 69,条件成立,执行循环体一次,再执行“abc++”,此时枚举变量abc的值不是枚举常量B(其值为67),而是在原值65的基础上加上整数
11 阅读下列程序,写出程序运行后的输出结果。
struct stu { int x;
int *px;
} a[4],*p=a;
main()
{ int i,y[4]={10,11,12,13};
for(i=0;i< 4; i++)
a[i].x=i,a[i].px=y+i;
printf("%d,",++p->x);
printf("%d,",(++p)->x);
printf("%d\n",++(*p->px) ) ;
}
【分析】主函数体的第 1条语句是数据定义语句,给定义的整型数组 y赋了初值。最后的3条语句是输出语句,输出表达式显然是结构型成员的值。所以,首先要搞清楚结构型数组a的每个元素各个成员的值。从for循环语句中不难看出,结构型数组a的所有元素的成员的值如下:
a[0].x的值为0 a[0].px是指针型,指向数组元素y[0];
a[1].x的值为1 a[1].px是指针型,指向数组元素y[1];
a[2].x的值为2 a[2].px是指针型,指向数组元素y[2];
a[3],x的值为3 a[3].px是指针型,指向数组元素y[3];
注意结构型指针变量p已经通过赋初值方式,指向结构型数组a的首地址。
现在来分析第 1个输出语句的输出表达式“++p->x”,由于“->”运算符优先于“++”,所以首先执行“p-> x”,p是指向结构型数组。的首地址,即p是指向结构型数组a的数组元素a[0]的,所以“p->x”就是a[0]的成员x,其值为0,再执行“++”运算,其值为1,这就是第1条输出语句的输出结果。注意,此时指针变量p的位未改变,仍是指向a[0];a[0].x的值改为1。
同样道理,可以分析第2条输出语句的输出表达式“(++p)->x”,先执行“++p”。使得 p指向的数组元素为 a[1],“(++ p)-> x”代表数组元素 a[1]的成员 x,其值为1。注意此时的p已经指向a[1],而a[l].x的值没有改变。
最后分析第3条输出语句的输出表达式“++(*p->px)”,由于“->”优先于“*”,所以先计算“p->px”,现在的p是指向数组元素a[1]的,“p->px”的运算结果是a[1]的成员px,这是一个指针变量,它是指向数组元素y[1],所以“(*p-> px)”代表y[1],其值为11。因此,输出表达式“++(*p->px)”的值应该是12。注意此时的p值没有改变,而y[1]的值改为12;
【答案】1,1,12
12 阅读下列程序,写出程序运行后的输出结果。
main()
{ union { int x;char y[2];} xy;
xy.y[0]=010;
xy.y[1」=00;
printf("%d\n",xy.x);
}
【分析】程序的第1条语句定义了一个共用型变量xy,该共用型的成员有两个:一个是整型的x,一个是字符型数组y[2]。由于共用型成员占用相同的内存单元,所以这两个成员占用的内存单元示意图可以表示如下:
字节1|______|}y[0]\
| | | x
字节2|______|}y[1]/
两条赋值语句使得字节1的值为010、字节2的值为00。按照二进制数在内存的存放顺序是“低位在前、高位在后”的规则,“字节1字节2”中存放的值是0010,这是人进制数,转换成十进制数为8。而“字节1字节2”就是分配给整型变量x的,所以变量x的值为8。程序中的输出语句输出的值就是整型变量x的值,输出格式是十进制整数,所以输出结果是8。
【答案】 8
13 读下列程序,写出程序的主要功能。
# include”dos.h”
main()
{ struct date today;
int n, year1;
getdate(&today);
scanf("%d",&year1);
while((n=today.da_year-year1)>=0)
{ printf("age=%d\n",n);
scanf("%d",&year1);
}
}
【分析】程序的前两条语句是定义变量,其中的today是日期结构型date变量,该变量有3个成员,分别为: da_ year(整型年份)、da_ mon(整型月份)、 da_day(整型日期)。第3条语句是利用系统函数“gatdate()”获得系统日期并存入结构型变量today中。第4条语句是输入一个整数存入变量yearl中。接下来的语句是当型循环,控制循环的条件“n>=0”,n的值是today.da_year_year1。其中前者是系统日期中的年份,后者是输入的整数,从变量名中可以看出是一个年份,因此变量n的值是一个人的年龄。循环体就是输出这个变量n的值。
综上所述, while循环的功能是:输入一个年份(某人的出生年份),计算其年龄。如果年龄小于0,则退出循环;否则输出年龄后继续循环。
【答案】输入一个人的出生年份,计算并输出该人的年龄。反复进行,直到输入的年份使得计算的年龄为负数时中止。
14 编一个程序,输入10名职工的姓名、基本工资和职务工资,统计并输出工资总和最高和最低的职工姓名、基本工资、职务工资及其工资总和。
(要求10个职工的信息用结构型数组存放)
【分析】首先要设计一个结构型用来存放职工的信息。用次数型循环输入职工的信息,并存入结构型数组。再用次数型循环计算并寻找最大的工资总和及最小的工资总和,并记录其下标,退出该循环后利用记录的两个下标输出对应职工的工资总和最高和最低的职工姓名、基本工资、职务工资及其工资总和。
【答案】 # define N 10
main()
{ struct { char name[20];
float jbgz;
float zwgz;
}person[N];
int i;
float max,min,max_i,min_i,x1,x2;
for(i=0;i<N;i++)
{ scanf("%s",person[i].name);
scanf("%f,%f",&xl,&x2);
person[i].jbgz=x1;
person[i].zwgz=x2;
}
max=min=person[0].jbgz+person[0].zwgz;
max_i=min_i=0;
for(i=1;i<N;i++)
{ if(max<person[i].jbgz+person[i].zwgz)
{ max=person[i].jbgz+person[i]. zwgz;
max_1=1
}
if(min>person[i].jbgz+person[i].zwgz)
{ min=person[i].jbgz+person[i]+person[i].zwgz:
min_1=l;
}
}
printf("max:%20s%10.2f%10.2f%10.2f\n",person[max_i].name,
person[max_i] .jbgz,person[max_i].zwgz,
person[max_i].jbgz+person[max_i].zwgz) ;
printf("min:%20s%10.2f%10.2f%10.2f\n",person[min_i].name,
person[min_i] .jbgz,person[min_i]zwgz,
person[min_i].jbgz+person[min_i].zwgz:
}
说明:数据输入格式如下:
(第1名职工的)姓名/(其中的/是回车换行键)
(第1名职工的)基本工资,职务工资/
(第2名职工的)姓名/
(第2名职工的)基本工资,职务工资/
...
注:/为回车换行符
15 编一个程序,输入10个学生的姓名、年龄、课程1、课程2、课程3的成绩,统计并分别输出3门课程成绩为第1名的学生姓名、年龄和3科成绩。
(要求10个学生信息用结构型数组存放,每个学生3科成绩用实型数组存放)
【分析】设计一个结构型数组用来存放 10名学生的信息。用次数型循环输入学生的信息,并存入结构型数组。再用二重次数型循环查找并输出3门课程第1名学生的信息。外层循环执行3次,分别处理3门课程;内层循环的任务就是寻找该课程的最高分,并记录对应学生的下标,退出内层循环后即输出该门课程最高分的学生及其信息。
【答案】# define N 10
main()
{ struct student { char[20];
int age;
float score[3];
}stu[N];
int i,j,max_i;
float max;
for(i=0; i<N;i++)
{ scanf(“%s",stu[i].name);
scanf("%d",&stu[i].age);
scanf("%f,%f,%f",&stu[i].score[0],stu[i]. score[1],
&stu[i].score[2]);
}
for(j=0;j<3;j++)
{ max=stu[0].score[j];
max_i= 0;
for(i=1;i<N;i++)
if(max<stu[i].score[j])
{ max= stu[i].score[j];
max_i=l;
}
printf("score%1d:name=%s age=%d\n",
j+1,stu[max_i].name,stu[max_i].age);
printf("score1=%f score2=%f score3=%f\n",
stu[max_i].score[0],stu[max_i].score[1],
sin[max_i].score[2]);
}
}
说明:数据输入格式如下:
(第1名学生的)姓名/(其中的/是回车换行键)
(第1名学生的)年龄/
(第1名学生的)课程1成绩,课程2成绩,课程3成绩/
(第2名学生的)姓名/
(第2名学生的)年龄/
(第2名学生的)课程1成绩,课程2成绩,课程3成绩/