C语言程序设计习题参考答案!(第二版 杜友福) 联系客服

发布时间 : 星期日 文章C语言程序设计习题参考答案!(第二版 杜友福)更新完毕开始阅读34e34c727fd5360cba1adb43

{ char string[81],c;

printf(\ gets(string);

printf(\ c=getchar();

printf(\}

6. 编写函数实现,判断一个子字符串是否在某个给定的字符串中出现。

#include #include

int IsSubstring(char *str,char *substr) { int i,j,k,num=0;

for(i=0;str[i]!='\\0' && num==0 ;i++)

{ for(j=i ,k=0;substr[k]==str[j];k++,j++) if(substr[ k+1 ]=='\\0') { num=1; break; } }

return num; }

void main()

{ char string[81],sub[81]; printf(\ gets(string);

printf(\ gets(sub);

printf(\ if(!IsSubstring(string,sub)) printf(\

printf(\}

7. 有n个人围成一圈,顺序排号。由用户从键盘输入报数的起始位置,从该人开始报数(计数从0开始),凡报数为3的倍数出圈。问最后剩下的是几号? 见导学例10.25

8. 由一个整型二维数组,大小为m×n,要求找出其中最大值所在的行和列,以及该最大值。请编一个函数max,数组元素在main函数中输入,结果在函数max中输出。 见导学例10.26

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

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

一、选择题

1—10: AABDD BDDDC 11-20: CBBCC

二、填空题

1.若有下面的定义:

struct

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

33

则表达式 ++p->x 的值为_____2______; 表达式(++p)->x的值为____3_____。 2.为了建立如图11.12所示的链表,结点的正确描述形式是:

data next data next

图11.12 链表的结点

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。

则un.n的地址是__ffca_, un.y的地址是__ffca__。执行赋值语句:un.n=321; 后,再执行语句:printf(\其输出值是__A_。(提示:321D=101000001B)

(进一步提示: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;

c.m_r=c1.m_r-c2.m_r; c.m_i=c1.m_i-c2.m_i; return c; }

void main()

{ struct Complex c1 ={1.2,2.3},c2={0.2,0.3}; struct Complex c; c=sub(c1,c2);

printf(“c=%g+i%g\\n”,c.m_r,c.m_i); }

34

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(date.year==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;

35

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;imax) { max=sum; maxi=i; } }

average/=N;

printf(\ No. name scorel score2 score3 average\\n\ for(i=0;i

printf(\

printf(\ printf(\ stu[maxi].score[1],stu[maxi].score[2],stu[maxi].avr); } 4.设单向链表head1和head2已建立。编写将单向链表head2连接到单向链表head1之后的函数,以head1返回,如图11.13所示。

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

struct Node *next; };

36