C程序设计语言(K&R)第六章学习笔记

6.1

            点是最基本的对象,假定用 x 与 y 坐标表示它,且 x、y 的坐标值都为整数。

采用结构存放这两个坐标:

struct  point {

           int  x;

           int  y;

};

          结构可以嵌套。我们可以用对角线上的两个点来定义矩形:

struct  rect {

           struct  point  pt1;

           struct  point  pt2;

};

            struct  rect  screen;

            可以用语句 screen.pt1.x 引用 screen 的成员 pt1 的 x 坐标。


6.2

/* makepoint: make a point from x and y components */
struct point makepoint(int x, int y)
{
	struct point temp;

	temp.x = x;
	temp.y = y;
	return temp;
}

struct rect screen;
struct point middle;
struct point makepoint(int, int);

screen.pt1 = makepoint(0, 0);
screen.pt2 = makepoint(XMAX, YMAX);
middle = makepoint((screen.pt1.x + screen.pt2.x)/2, (screen.pt1.y + screen.pt2.y)/2);

/* addpoints: add two points */
struct addpoint(struct point p1, struct point p2)
{
	p1.x += p2.x;
	p1.y += p2.y;
	return p1;
}

/* ptinrect: return 1 if p in r, 0 if not */
int prinrect(struct point p, struct rect r)
{
	return p.x >= r.pt1.x && p.x < r.pt2.x && p.y >= r.pt1.y && p.y < r.pt2.y;
}


#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))
/* canonrect: canonicalize coordinate of rectangle */
struct rect canonrect(struct rect r)
{
	struct rect temp;

	temp.pt1.x = min(r.pt1.x, r.pt2.x);
	temp.pt1.y = min(r.pt1.y, r.pt2.y);
	temp.pt2.x = max(r.pt1.x, r.pt2.x);
	remp.pt3.y = max(r.pt1.y, r.pt2.y);
	return temp;
}
            如果传递给函数的结构很大,使用指针方式的效率通常比复制整个结构的效率要高。结构指针类似于普通变量指针。

struct  point  *pp;

将pp定义为一个指向struct  point 类型对象的指针。如果 pp 指向一个 point 结构,那么 *pp 即为该结构,而 (*pp).x 和 (*pp).y 则是结构成员。可以按照下例中的方式使用 pp:

struct  point origin,  *pp;

pp = &origin; 

printf("origin  is  (%d, %d)\n",  (*pp).x,  (*pp).y);

其中,(*pp).x 中的圆括号是必须的,因为结构成员运算符 “.” 的优先级比 “*” 的优先级高。


           结构指针的使用频度非常高,为了使用方便,C 语言提供了另一种简写方式。假定 p 是一个指向结构的指针,可以用

p->结构成员

这种形式引用相应的结构成员。


6.4

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define	MAXWORD 100

int getword(char *, int);
struct key *binsearch(char *, struct key *, int);

/* count C keywords; pointer version */
int main()
{
	char word[MAXWORD];
	struct key *p;

	while (getword(word, MAXWORD) != EOF)
		if (isalpha(word[0]))
			if ((p=binsearch(word, keytab, NKEYS)) != NULL)
				p->count++;
	for (p = keytab; p < keytab + NKEYS; p++)
		if (p->count > 0)
			printf("%4d %s\n", p->count, p->word);
	return 0;
}

/* binsearch: find word in tab[0] ... tab[n-1] */
struct key *binsearch(char *word, struct key *tab, int n)
{
	int cond;
	struct key *low = &tab[0];
	struct key *high = &tab[n];
	struct key *mid;

	while (low < high)
	{
		mid = low + (high-low)/2;
		if ((cond = strcmp(word, mid->word)) < 0)
			high = mid;
		else if (cond > 0)
			low = mid + 1;
		else 
			return mid;
	}
	return NULL;
}


我们无法简单的通过下列表达式计算中间元素的位置:

mid = (low + high) / 2;  /* wrong */

这是因为,两个指针之间的加法运算是非法的。但是,指针的减法运算却是合法的。high-low的值就是数组元素的个数,

因此,可以用下列表达式:

mid = low + (high-low) / 2;



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值