C语言习题(详细解答) 下载本文

内容发布更新时间 : 2024/5/18 13:12:58星期一 下面是文章的全部内容请认真阅读。

【解析】此题考察的是结构体的定义方式。S是我们定义的结构体的名字,在题目中顺便将T定义为struct S类型,即T被定义为一个类型名。这样就可以用T来定义说明新的变量了。在此S与T 都不是变量的名称。 4.下面结构体的定义语句中,错误的是__B______。

A)struct ord {int x;int y;int z;};struct ord a; B)struct ord {int x;int y;int z;}struct ord a; C)struct ord {int x;int y;int z;}a; D)struct {int x;int y;int z;}a;

【解析】 定义结构体变量有三种方式:①先声明结构体类型,再定义变量名,如选项A)所示;②在声明类型的同时定义变量,如选项C)所示;③直接定义结构体类型变量,如选项D)所示。 5.有以下程序:

#include struct st

{ int x,y;}data[2]={1,10,2,20}; main()

{ struct st *p=data;

printf(\,\,p->y); printf(\,(++p)->x); }

程序的运行结果是________。 A)10,1 B)20,1 C)10,2 D)20,2

【解析】数组名的值即为数组首地址,所以p->y可得第一个元素的y值,(++p)->x可得第二个元素的x值。 6.设有定义:

struct complex

{int real,unreal;} datal={1,8},data2; 则以下赋值语句中错误的是

A)data2=data1; B)data2=(2,6);

C)data2.rea1=data1.real; D)data2.real=datal.unreal;

【解析】选项B需要强制转换数据类型,应该为(struct complex){2,6};。 7.有以下程序

#include struct ord

{ int x,y;}dt[2]={1,2,3,4}; main() {

struct ord*p=dt;

printf(\;printf(\; }

程序运行后的输出结果是 A)1,2

B)4,l

C)3,4

D)2,3

【解析】本题中定义了一个结构体数组dt[2],其中dt[0].x=1,dt[0].y=2,dt[1].x=3,dt[1].y=4。在main函数中指针p指向了结构体数组的第一个元素,因此p->x值为1,p->y值为2,自加运算的结果分别为2和3。 8.有以下程序

26

#include struct S

{ int a, b; }data[2]={10,100,20,200}; main()

{ struct S p=data[1];

printf(\,++(p.a)); }

程序运行后的输出结果是 A)10

B)11

C)20

D)21

【解析】本题中定义了一个结构体数组data[2],其中data[0].a=10,data[0].b=100,data[1].a=20,data[1].b=200。在main函数中结构体数组的第2个元素data[1]赋值给p,即p指向结构体数组的第2个元素,因此p.a的值为20,进行自加运算后结果为21。 9.有以下定义和语句

struct workers

{int num;char name[20];char c; struct

{int day;int month;int year;}s; };

struct workers w,*pw; pw=&w;

能给w中year成员赋1980的语句是

A)*pw.year=1980; B)w.year=1980; C)pw->year=1980; D)w.s.year=1980;

【解析】结构体structure workers中的成员s是结构体类型,给w中成员year赋值的语句是w.s.year=1980,故选D。 10.假定已建立以下链表结构,且指针p和q已指向如下图所示的结点:

则以下选项中可将q所指结点从链表中删除并释放该结点的语句组是 。 A)(*p).next=(*q).next; free(p); B)p=q->next; free(q); C)p=q; free(q);

D)p->next=q->next; free(q);

【解析】要将结点b从链表中删除,应先将a的指针域指向b结点的下一个结点,即p->next=q->next,然后释放指针q的空间。 二.填空题 1.有以下程序:

#include typedef struct

{ int num;double s;}REC;

void funl(REC x) {x.num=23;x.s=88.5;} main()

{ REC a={16,90.0); fun1(a);

27

printf(\,a.num); }

程序运行后的输出结果是______。 参考答案:16

【解析】 主函数中,通过funl( )函数将a值传递给x,但没有把形参x的值返回,此时变量a的值并没有发生变化,所以输出a.num的值为16。 2.设有定义:

struct person

{ int ID;char name[12];}p;

请将scanf(\,_______);语句补充完整,使其能够为结构体变量p的成员ID正确读入数据。 参考答案:&p.ID

【解析】结构体成员的引用通过符号\来表示,通过scanf语句对变量进行赋值时,要用取地址符&。 3.下列程序的运行结果为_______。

#include #include struct A

{ int a; char b[10]; double c; }; void f(struct A *t); main()

{ struct A a={1001,\,1098.0);

f(&a);printf(\,%s,%6.1f\\n\,a.a,a.b,a.c); }

void f(struct A *t)

{ strcpy(t->b,\;} 参考答案:1001,ChangRong,1098.0

【解析】此题考的是结构体用法。函数f的功能为将结构体的第二个变量修改为ChangRong。主函数为运行f函数后,将结构体输出。

4.以下程序把三个NODETYPE型的变量链接成一个简单的链表,并在while循环中输出链表结点数据域中的数据。请填空。

#include struct node

{ int data;struct node *next;}; typedef struct node NODETYPE; main()

{ NODETYPE a,b,c,*h,*P;

a.data=10;b.data=20;c.data=30;h=&a; a.next=&b;b.next=&c;c.next=′\\0′; p=h;

while(p){printf(\,\,p->data);__p=p->next

______;} printf(\; }

【解析】打印完一个链表结点的数据域中的数据域后,用p=p->next使链表指针指向下一个链表结点。 第11章 一.选择题

文件

28

1.下列关于C语言文件的叙述中正确的是________。 A)文件由一系列数据依次排列组成,只能构成二进制文件 B)文件由结构序列组成,可以构成二进制文件或文本文件 C)文件由数据序列组成,可以构成二进制文件或文本文件 D)文件由字符序列组成,其类型只能是文本文件

【解析】 文件由数据序列组成,可以构成二进制文件,也可以构成文本文件。 2.有以下程序:

#include main()

{ FILE *fp; int a[10]={1,2,3},i,n; fp=fopen(\,\;

for(i=0;i<3;i++) fprintf(fp,\,a[i]); fprintf(fp,\; fclose(fp);

fp=fopen(\,\; fscanf(fp,\,&n); fclose(fp); printf(\,n); }

程序的运行结果是 A)12300 B)123 C)1 D)321

【解析】在函数中首先把整型数组a[10]中的每个元素写入文件d1.dat中,然后再次打开这个文件,把文件d1.dat中的内容读入到整型变量n中,最后输出变量n的值。所以正确答案为B)。 3.有以下程序:

#include main() { FILE *pf;

char *s1=\,*s2=\; pf=fopen(\,\+\; fwrite(s2,7,1,pf);

rewind(pf); /*文件位置指针回到文件开头*/ fwrite(s1,5,1,pf); fclose(pf); }

以上程序执行后abc.dat文件的内容是_B_______。 A)China B)Chinang C)ChinaBeijing D)BeijingChina

【解析】该题目考查文件相关知识。\+\用于打开或建立二进制文件并允许对其进行读和写操作。文件操作先写入了s2,然后将文件指针移动到文件夹,再写入s1,这样s1就会覆盖掉一部分s2的内容。

29

4.有以下程序:

#include main() { FILE *f;

f=fopen(\,\; fprintf(f,\; fclose(f); }

若文本文件filea.txt中原有内容为:hello,则运行以上程序后,文件filea.txt中的内容为___C_____。 A)helloabc B)abclo C)abc D)abchello

【解析】\表示建立一个供写入的文件。如果文件不存在,系统将用在fopen调用中指定的文件名建立一个新文件,如果指定的文件已存在,则将从文件的起始位置开始写入,文件中原有的内容将全部消失。 5.有以下程序

#include main()

{ FILE *fp;char str[10]; fp=fopen(\ fputs(\ fp=fopen(\ fprintf(fp,\ rewind(fp);

fscanf(fp,\ fclose(fp); }

程序运行后的输出结果是C A)abc B)28c

C)abc28 D)因类型不一致而出错

【解析】首先打开文件写入字符串\,然后关闭文件,再打开时文件指针定位到了最后,写入\,然后重定位位置指针到开始,读取字符串为\。

6.设fp已定义,执行语句fp=fopen(\;后,以下针对文本文件file操作叙述的选项中正确的是。B A)写操作结束后可以从头开始读 C)可以在原有内容后追加写

B)只能写不能读 D)可以随意读和写

【解析】本题中用\方式打开文件,只能向文件写数据。如果原来不存在该文件,则新创建一个以指定名字命名的文件;如果已存在该文件,则把原文件删除后重新建立一个新文件,而不是把内容追加到原文件后。 二.填空题

1.以下程序打开新文件f.txt,并调用字符输出函数将a数组中的字符写入其中,请填空。

#include main()

{ _FILE_____ *fp;

char a[5]={'1','2','3','4','5'},i; fp=fopen(\,\;

for(i=0;i<5;i++)fputc(a[i],fp); fclose(fp);

30