新概念C语言能力教程练习试题10答案.pdf
10.1 答 案:结 构 型 是 一 种 数 据 类 型,与 int,float类 似,用 于 规 定 相 关 存 储 单 元 的 类 型,但 结 构 型 是 用 户 自 己 定 义 的 数 据 类 型。结 构 型 变 量 与 整 型 变 量 类 似 是 相 关 存 储 单 元 的 标 识。结 构 型 用 于 定 义 结 构 型 变 量。10.2 答 案:结 构 型 中 成 员 的 类 型 可 以 是 其 它 结 构 型。测 试 程 序 代 码:#include#include struct date(int year,month,day;);struct student(int no;char nameflO;struct date birthday;float fm,fe;);int main()(struct student stu 1;stul.no=8;strcpy(stu 1.name,“张 三);stu 1.fm=stu 1.fe=90.0;stu 1.birthday.day=1;stu l.birthday.month=1;stu 1.birthday.year=2012;printf(学 号:dn,stul.no);printf(姓 名:sn,stu 1.name);printf(n 生 日:d 年%d 月%d 日 n,stul.birthday.year,stul.birthday.month,stul.birthday.day);printf(数 学 成 绩:.1 fnn,stul.fin);printf(英 语 成 绩:.1 fn,stu l.fe);return 0;)10.3 答 案:#include#include struct studentint no;char name10;float fm,fe;);int main()struct student stul,stu2;prinlf(请 输 入 两 个 学 生 的 学 号,姓 名,数 学 和 英 语 成 绩 n);scanf(%d%s%f%f&stu l.no,&stu 1.name,&stu l.fm,&stu 1.fe);scanf(%d%s%f%f&stu2.no,&stu2.name,&stu2.fm,&stu2.fe);if(strcmp(stu 1.name,stu2.name)0)(printf(n 学 号:d 姓 名:s绩:.lfn*stul.no,stul.name,stuLfm,stul.fe);printf(H 学 号:%d 姓 名:s绩:.11n”,slu2.no,stu2.name,stu2.fm,stu2.fe);)else(printfC,学 号:d 姓 名:s绩:.1 fnu,stu2.no,stu2.name,stu2.fm,stu2.fe);p r in t f(学 号:d 姓 名:s绩:.1 fnu,stu 1.no,stu l.name,stu l.fm,stu l.fe);)return 0;)10.4答 案:#include struct student(int no;char name10;float fm,fe;);int main()数 学 成 数 学 成 数 学 成 数 学 成 绩:%.lf绩:%.lf绩:%,lf绩:%.lf英 语 成 英 语 成 英 语 成 英 语 成 struct student stu5,temp;int i=0,j=0;printf(”请 输 入 5 个 学 生 的 学 号,姓 名,数 学 和 英 语 成 绩 n“);for(i=0;i5;i+)scanf(%d%s%f%f&stui.no,&stui.name,&stui.fm,&stui.fe);for(i=0;i5;+i)for(j=i+l;jstuj.fm)temp=stui;stui=stuj;stuj=temp;printf(按 照 数 学 成 绩 升 序 排 列:n);for(i=0;i更 简 便。通 过 变 量 直 接 使 用 结 构 型 存 储 单 元 的 成 员 变 量 时 使 用 成 员 操 作 符。10.7答 案:例 10-2中 construct。函 数 将 两 个 double型 小 数“组 合”成 一 个 结 构 型 的 复 数 变 量。#include struct date(int year,month,day;);struct date construct(int year,int month,int day)(struct date temp;仅 进 行 了 简 单 的 检 测 if(year0&month0&month0&day31)(temp.day=day;temp.month=month;temp.year=year;elsetemp.day=temp.month=temp.year=1;)return temp;)int main()(int year,month,day;struct date date 1;printf(请 输 入 年,月,日 n”);scanf(n%d%d%dH,&year,&month,&day);date 1=construct(year,month,day);printf(%d 年 4 月 4 日 n,date 1.year,date 1.month,date 1.day);return 0;)10.8答 案:函 数 中 没 有 必 要 检 测 参 数 的 合 法 性。struct date addDay(struct date d)(struct date d2;int flag=0;d2=d;+d2.day;switch(d2.month)case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(d2.day 31)(flag=1;break;)case 2:if(d2.year%4=0&d2.year%100!=0|d2.year%400=0)if(d2.day 29)flag=1;break;)else if(d2.day 28)(flag=1;break;)default:if(d2.day 30)flag=1;)if(Rag=1)(d2.day=1;+d2.month;if(d2.month=13)(d2.month=1;+d2.year;)return d2;)10.9答 案:测 试 程 序 如 下:#include struct student(int no;char nameflO;float fm,fe;int main()(struct student stu 1;printf(%dnM,sizeof(stu 1);return 0;程 序 的 输 出24结 构 型 中 成 员 分 别 占 4 个、1 0个、4 个、4 个,原 本 为 2 2字 节,但 由 输 出 结 果 可 知,实 际 上 占 了 2 4个 字 节。结 构 型 变 量 所 占 存 储 单 元 空 间 之 和 有 时 并 不 等 于 各 成 员 变 量 所 占 存 储 单 元 之 和。在 缺 省 情 况 下,C 编 译 器 为 每 一 个 变 量 或 是 数 据 单 元 按 其 自 然 对 界 条 件 分 配 空 间。在 结 构 中,编 译 器 为 结 构 的 每 个 成 员 按 其 自 然 对 界(alignm ent)条 件 分 配 空 间。各 个 成 员 按 照 它 们 被 声 明 的 顺 序 在 内 存 中 顺 序 存 储(成 员 之 间 可 能 有 插 入 的 空 字 节),第 一 个 成 员 的 地 址 和 整 个 结 构 的 地 址 相 同。C 编 译 器 缺 省 的 结 构 成 员 自 然 对 界 条 件 为“N 字 节 对 齐”,N 即 该 成 员 数 据 类 型 的 长 度。如 in t型 成 员 的 自 然 对 界 条 件 为 4 字 节 对 齐,而 double类 型 的 结 构 成 员 的 自 然 对 界 条 件 为 8 字 节 对 齐。若 该 成 员 的 起 始 偏 移 不 位 于 该 成 员 的“默 认 自 然 对 界 条 件”上,则 在 前 一 个 节 面 后 面 添 加 适 当 个 数 的 空 字 节。C 编 译 器 缺 省 的 结 构 整 体 的 自 然 对 界 条 件 为:该 结 构 所 有 成 员 中 要 求 的 最 大 自 然 对 界 条 件。若 结 构 体 各 成 员 长 度 之 和 不 为“结 构 整 体 自 然 对 界 条 件 的 整 数 倍,则 在 最 后 一 个 成 员 后 填 充 空 字 节 10.10答 案:代 码 如 下:#include#include struct student(int no;char namef 10;float fm,fe;);int studentcmp(const void*pl,const void*p2)(return(struct student*)pl)-fm-(struct student*)p2)-fm;)int main()(struct student stu5;int i=0,j=0;printf(”请 输 入 5 个 学 生 的 学 号,姓 名,数 学 和 英 语 成 绩 n)for(i=0;i5;+i)scanf(%d%s%f%f&stui.no5&stui.name,&stui.fm,&stui.fe);qsort(stu,5,sizeof(struct student),studentcmp);printf(按 照 数 学 成 绩 升 序 排 列 后:n)for(i=0;i5;+i)printf(n学 号:d 姓 名:s 数 学 成 绩:.If 英 语 成 绩:.1 fnn,stui.no,stui.name,stui.fm,stui.fe);return 0;10.11答 案:#include#include struct student(int no;char name10;float fm,fe;struct student*next;);int main()(struct student*phead,*ptemp,*stu;int i,n;phead=stu=NULL;printf(”请 输 入 学 生 人 数:n);scanf(d;&n);fbr(i=l;ino,ptemp-name,&ptemp-fm,&ptemp-fe);if(i=l)phead=stu=ptemp;else(stu-next=ptemp;stu=stu-next;)if(stu!=NULL 防 止 一 个 学 生 也 没 有 stu-next=NULL;printf(HnnM);for(ptemp=phead;ptemp!=NULL;ptemp=ptemp-next)printf(n学 号:d 姓 名:s 数 学 成 绩:.If 英 语 成 1 fnptemp-no,ptemp-name,ptemp-fm,ptemp-fe);return 0;10.12答 案:#include#include struct student(int no;char name10;float fm,fe;struct student*next;);假 设 头 结 点 head为 链 表 中 第 0 个 结 点。int insert(struct student*phead,int n,struct student*pnew)(int i=0;struct student*pl,*p2;if(pnew=NULL)return 2;for(pl=phead;pl!=NULL&inext)+i;if(pl=NULL)return 1;p2=pl-next;pl-next=pnew;pnew-next=p2;return 0;)int main()(struct student head,*ptail=&head,*ptemp;int i,n;printf(”请 输 入 学 生 人 数:n);scanf(n%d,&n);fbr(i=l;ino,ptemp-name,&ptemp-fm,&ptemp-fe);ptail-next=ptemp;ptail=ptail-next;ptail-next=NULL;ptemp=(struct student*)malloc(sizeof(struct student);if(ptemp=NULL)(print 内 存 分 配 失 败 分)return-1;printf(”请 输 入 新 加 学 生 的 位 置:n);scanf(%d,&i);printf(”请 输 入 新 加 学 生 的 信 息:n);scanf(n%d%s%f%f,&ptemp-no,ptemp-name,&ptemp-fm,&ptemp-fe);printf(%dn insert(&head,i,ptemp);fbr(ptemp=head.next;ptemp!=NULL;ptemp=ptemp-next)printf(H 学 号:%d 姓 名:%s 数 学 成 绩:%.If 英 语 成 绩 ptemp-no,ptemp-name,ptemp-fm,ptemp-fe);return 0;)10.13答 案:int del(struct student*phead,int n)(int i=0;struct student*pl,*p2;for(pl=phead;pl!=NULL&i!=n-l;pl=pl-next)+i;if(pl=NULL|n next;if(p2!=NULL)(pl-next=p2-next;delete p2;return 0;)return 2;)10.14答 案:#include#include struct student(int no;char name10;float fm,fe;struct student*next;);int main()(struct student head,*ptail=&head,*ptemp;int i,n;printf(”请 输 入 学 生 人 数:n”);scanf(n%d,&n);fbr(i=l;ino,ptemp-name,&ptemp-fm,&ptemp-fe);ptail-next=ptemp;ptail=ptail-next;)ptail-next=NULL;fbr(ptemp=head.next;ptemp!=NULL;ptemp=ptemp-next)printf(n 学 号:%d 姓 名:%s 数 学 成 绩:.If 英 语 成 绩 ptemp-no,ptemp-name,ptemp-fm,ptemp-fe);ptail=head.next;ptemp=ptail-next;ptail-next=NULL;while(ptemp!=NULL)(head.next=ptemp;ptemp=ptemp-next;head.next-next=ptail;ptail=head.next;)printf(转 置 后 的 链 表:n)fbr(ptemp=head.next;ptemp!=NULL;ptemp=ptemp-next)printf(学 号:%d 姓 名:%s 数 学 成 绩:.If 英 语 成 绩%.lfn,ptemp-no,ptemp-name,ptemp-fm,ptemp-fe);return 0;10.15答 案:#include#include struct student(int no;char name10;float fm,fe;struct student*next;);int main()(struct student head,*ptail=&head,*ptemp,*pl,*p2;int i,n;printf(”请 输 入 学 生 人 数:n);scanf(d”,&n);fbr(i=l;ino,ptemp-name,&ptemp-fm,&ptemp-fe);ptail-next=ptemp;ptail=ptail-next;)ptail-next=NULL;fbr(ptemp=head.next;ptemp!=NULL;ptemp=ptemp-next)printf(H 学 号:%d 姓 名:%s 数 学 成 绩:%.If 英 语 成 绩 ptemp-no,ptemp-name,ptemp-fm,ptemp-fe);ptail=head.next-next;head.next-next=NULL;while(ptail!=NULL)(pl=ptail;ptail=ptail-next;for(p2=&head;p2-next!=NULL&(p2-next)-fm fm;p2=p2-next)if(p2-next=NULL)pl-next=NULL;p2-next=pl;)else(pl-next=p2-next;p2-next=pl;)printf(按 数 学 成 绩 排 序 后 的 学 生 信 息 如 下:n);for(ptemp=head.next;ptemp!=NULL;ptemp=ptemp-next)printf(M 学 号:%d 姓 名:%s 数 学 成 绩:%.If 英 语 成 绩%.lfnn,ptemp-no,ptemp-name,ptemp-fm,ptemp-fe);return 0;110.16 答 案:函 数 construct(int n)是 例 10-4中 construct函 数 的 另 一 种 形 式,它 通 过 函 数 的 返 回 值 给 出 了 循 环 链 表 的 一 个 结 点 的 地 址。10.17 答 案:函 数 p lay同 样 模 拟 了 例 10 4 中 的 报 数 过 程。10.18 答 案:#include#include struct node(double data;struct node*next;);int main()(int i;struct node*head,*p,*q;head=(struct node*)malloc(sizeof(struct node);if(head!=NULL)scanf(u%lf,&head-data);p=head;for(i=l;idata);p-next=q;p=p-next;p-next=head;for(p=head;p-next!=head;p=p-next)printf(M%f p-data);printf(,%fn,p-data);)10.19答 案:#include#include#define N 10struct node(double data;struct node*next;);int main()(int i;double sum=0,min;struct node*head,*p,*q;printf(请 输 入 d 个 小 数!n”,N);head=(struct node*)malloc(sizeof(struct node);if(head!=NULL)scanf(%lf,&head-data);p=head;for(i=l;idata);p-next=q;p=p-next;)p-next=head;p=head;q=p;for(i=0;idata;q=q-next;min=sum;printf(M%.lf,sum);for(p=p-next;p-next!=head;p=p-next)(q=p;sum=0;for(i=0;idata;q=q-next;)printf(n%.lfn,sum);if(sum min)min=sum;)sum=0;for(i=0;idata;p=p-next;)printf(%.lf,sum);if(sum min)min=sum;printf(nMin:%fnn,min);)10.20 答 案:程 序 开 始 时 标 识 符 INTA被 定 义 长 度 为 3 的 一 维 整 型 数 组 的 类 型 的 别 名,实 际 上 作 用 域 是 指 标 识 符 的 作 用 域,INTA在 程 序 中 从 定 义 处 开 始 直 到 程 序 结 束 处 为 止 起 作 用,即 遇 到 时 表 示 别 名。程 序 中 复 合 语 句 里 面 又 定 义 一 个 INTA的 整 型 变 量,允 许 作 用 域 不 同 的 同 名 标 识 符。作 用 域 重 叠 时 仍 然 是 后 定 义 的 标 识 符 有 效。输 出 结 果 为:1 23910.21 答 案:联 合 型 成 员 变 量 的 类 型 可 以 是 结 构 型,程 序 中 定 义 了 一 个 长 度 为 2 的 联 合 型 数 组,先 是 使 用 了 两 个 数 组 元 素 中 的 结 构 型 成 员 变 量,然 后 又 使 用 了 其 中 一 个 元 素 的 整 型 成 员。程 序 的 输 出 结 果 为:11,1221,222310.22 答 案:一 个 联 合 型 变 量 也 包 含 了 多 个 成 员 变 量,故 可 以 算 作 构 造 类 型,但 与 结 构 型 变 量 的 不 同 之 处 在 于,这 些 成 员 变 量 共 享 一 个 存 储 单 元,因 此,联 合 型 变 量 初 始 化 时 虽 然 也 需 用 花 括 号,但 其 中 只 能 有 一 个 初 值。编 程 测 试 代 码 如 下:#include union Testinti;float f;void main()(union Test u=3;printf(%dnM,u.i);(运 行 结 果:310.23答 案 枚 举 型 是 用 户 自 定 义 类 型,定 义 时 列 举 出 此 类 数 据 所 有 可 能 的 取 值,定 义 后 就 可 以 用 它 定 义 枚 举 型 变 量,枚 举 型 变 量 的 取 值 仅 限 于 定 义 枚 举 型 是 列 举 出 的 值。枚 举 型 的 使 用 可 以 极 大 地 提 高 程 序 的 可 读 性。程 序 越 大,程 序 的 可 读 性 越 重 要。