C语言程序设计习题参考答案第二版杜友福 下载本文

见导学例

9. 由n个学生,每个学生考m门课程,要求编一函数,能检查n个学生有无不及格的课程,如果由某一学生有一门或一门以上课程不及格,就输出该学生的号码(学号从0开始)和其全部课程成绩。 见导学例

习题十一 结构体、共用体和用户定义类型

一、选择题

1—10: AABDD BDDDC 11-20: CBBCC

二、填空题

1.若有下面的定义:

struct

{int x;int y;}s[2]={{1,2},{3,4}},*p=s;

则表达式 ++p->x 的值为_____2______; 表达式(++p)->x的值为____3_____。

2.为了建立如图所示的链表,结点的正确描述形式是:

data data

图 链表的结点 struct node

{ int data; struct node *next; };

3.已知head 指向一个带头结点的单向链表,链表中每个结点包含数据域(data)和指针域(next),数据域为整型。下面的sum函数是求出链表中所有结点数据域值的和,作为函数值返回。请填空完善程序。

struct link

{ int data; struct link *next;} main()

{ struct link *head; int s; ┆

s=sum(head);

┆ }

int sum( struct link *head )

{ struct link *p; int s=0; p=head->next; while(p)

{ s+= p->data ; p= p->next ; } return(s); }

4.设有共用体类型和共用体变量定义如下:

union Utype

{ char ch; int n; long m; float x; double y; };

union Utype un; 并假定un的地址为ffca。

则的地址是__ffca_, 的地址是__ffca__。执行赋值语句:=321; 后,再执行语句:printf(\其输出值是__A_。

(进一步提示:0100 0001B=65D,char与int的比特位分布关系参见课本P30。) 三、编程题

1.编写程序,进行两个复数的相减。

#include <> struct Complex{ double m_r,m_i; };

struct Complex sub(struct Complex c1,struct Complex c2) { struct Complex c; = = return c; }

void main()

{ struct Complex c1 ={,},c2={,}; struct Complex c; c=sub(c1,c2);

printf(“c=%g+i%g\\n”,,; }

2.定义一个包括年、月、日的结构体。输入一个日期,计算该日在本年中是第几天注意闰年问题。

#include<> struct ymd

{

int day; int month; int year; };

int dayof[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int days(struct ymd *p) {

int i,d;

if(p->year%4==0&&p->year0!=0||p->year@0==0) dayof[2]=29; d=p->day;

for(i=1;imonth;i++) d=d+dayof[i]; return (d); }

void main() {

struct ymd date; int d; for (;;) {

printf(\ scanf(\ if==0) break;

d=days(&date);

printf(\ } }

3.有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩。从键盘输入10个学生的数据,要求输出3门课程的总平均成绩,以及最高分的学生的学号、姓名、3门课程成绩、平均分数。

#include<> #define N 10 struct student { char num[6]; char name[8]; float score[3]; float avr; }stu[N]; void main() { int i,j,maxi;

float sum,max,average; for(i=0;i

{ printf(\

printf(\

scanf(\ printf(\

scanf(\ for(j=0;j<3;j++) {

printf(\

scanf(\ } }

average=0; max=0; maxi=0;

for(i=0;i

for(j=0;j<3;j++)

sum+=stu[i].score[j]; stu[i].avr=sum/;

average+=stu[i].avr; if(sum>max) { max=sum; maxi=i; } }

average/=N;

printf(\ No. name scorel score2 score3 average\\n\

for(i=0;i

printf(\ for(j=0;j<3;j++)

printf(\ printf(\ %\\n\ }

printf(\ printf(\highest score is : student %s,%s.\\n\

printf(\ stu[maxi].score[1],stu[maxi].score[2],stu[maxi].avr); }

4.设单向链表head1和head2已建立。编写将单向链表head2连接到单向链表head1之后的函数,以head1返回,如图所示。

/* 结点结构 Node */ struct Node { int data;

struct Node *next;