ch6-Functions (struct arguments)

Chapter_6 words     Exercise_6-1







points.c     K&R, p. 128-132         download


#include <stdio.h> // for printf(), putchar()
#include <math.h> // for sqrt()

#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))

struct point
{
int x;
int y;
};

struct point makepoint(int x, int y); // return point
struct point middlep(struct point pt1, struct point pt2); // middle point
struct point addpoints(struct point pt1, struct point pt2); // pt1 + pt2
void prnstrp(char *name, struct point pt); // print structure point
double distp(struct point pt); // distance of point from origin

struct rect // rectangle
{ // we assume pt1 < pt2
struct point pt1; // left down corner
struct point pt2; // right up corner
};

struct point center(struct rect);
void prnrect(char *name, struct rect); // print rectangle
int ptinrect(struct point pt, struct rect r); // point inside rectangle
struct rect canonrect(struct rect r); // canonical rectangle

int main()
{
struct point pt;
struct point origin = makepoint(0, 0);
struct point maxpt = {320, 200};

prnstrp("origin", origin);
prnstrp("maxpt", maxpt);
printf("dist: %f\n", distp(maxpt));

struct point m = middlep(origin, maxpt);
prnstrp("middle", m);
printf("dist: %f\n", distp(m));

struct rect screen;
screen.pt1 = origin;
screen.pt2 = maxpt;

struct point c = center(screen);

prnstrp("center", c);
printf("dist: %f\n", distp(c));

putchar('\n');

struct point sum = addpoints(m, c);
prnstrp("origin", origin);
prnstrp("middle", m);
prnstrp("center", c);
prnstrp("sum", sum);
prnstrp("maxpt", maxpt);

putchar('\n');

prnrect("screen", screen);
printf("origin in screen: %d\n", ptinrect(origin, screen));
printf("center in screen: %d\n", ptinrect(c, screen));
printf("maxpt in screen: %d\n", ptinrect(maxpt, screen));

putchar('\n');

struct point inverted = makepoint(c.y, c.x);
struct rect noncanon = {c, inverted};
struct rect canon = canonrect(noncanon);
prnrect("noncanon", noncanon);
prnrect("canon", canon);

putchar('\n');

struct point *pp; // pointer to struct point
pp = &origin;
prnstrp("*pp", *pp);
printf("(*pp).x: %d, pp->y: %d\n", (*pp).x, pp->y);

putchar('\n');

struct rect *rp = &screen;
printf("rp->pt1.x: %d\n", rp->pt1.x);
printf("++rp->pt1.x: %d\n", ++rp->pt1.x); // ++(rp->pt1.x)
printf("rp->pt1.x: %d\n", rp->pt1.x);

putchar('\n');

struct // no name
{
int len;
char *str;
} s = {0, "hello"}, *p = &s;

printf("p->len: %d\n", p->len);
printf("++p->len: %d\n", ++p->len); // ++(p->len)
printf("p->str: %s\n", p->str);
printf("*p->str++: %c\n", *p->str++);
printf("*p->str: %c\n", *p->str);
printf("--p->str: %s\n", --p->str);
printf("p->str: %s\n", p->str);
/*
p++;
printf("p->len: %d\n", p->len); // garbage value
printf("p->str: %s\n", p->str); // run-time error (segmentation fault)
*/
return 0;
}

struct point makepoint(int x, int y) // return point
{
struct point temp;

temp.x = x;
temp.y = y;

return temp;
}

struct point middlep(struct point pt1, struct point pt2) // middle point
{
makepoint((pt1.x + pt2.x) / 2, (pt1.y + pt2.y) / 2);
}

struct point addpoints(struct point pt1, struct point pt2) // pt1 + pt2
{
pt1.x += pt2.x;
pt1.y += pt2.y;

return pt1;
}

void prnstrp(char *name, struct point pt) // print structure point
{
printf("%s: (%d, %d)\n", name, pt.x, pt.y);
}

double distp(struct point pt) // distance of point from origin
{
return sqrt((double)pt.x * pt.x + (double)pt.y * pt.y);
}

struct point center(struct rect r)
{
return middlep (r.pt1, r.pt2);
}

void prnrect(char *name, struct rect r) // print rectangle
{
printf("%s: ((%d, %d), (%d, %d))\n", name, r.pt1.x, r.pt1.y, r.pt2.x, r.pt2.y);
}

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

// turn r into a canonical rectangle: pt1 <= pt2
struct rect canonrect(struct rect r) // canonical rectangle
{
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);
temp.pt2.y = max(r.pt1.y, r.pt2.y);

return temp;
}

/*
gcc points.c -o points -lm // link math library
./points
origin: (0, 0)
maxpt: (320, 200)
dist: 377.359245
middle: (160, 100)
dist: 188.679623
center: (160, 100)
dist: 188.679623

origin: (0, 0)
middle: (160, 100)
center: (160, 100)
sum: (320, 200)
maxpt: (320, 200)

screen: ((0, 0), (320, 200))
origin in screen: 1 // rectangle includes left and bottom sides
center in screen: 1
maxpt in screen: 0 // rectangle does not include right and top sides

noncanon: ((160, 100), (100, 160))
canon: ((100, 100), (160, 160))

*pp: (0, 0)
(*pp).x: 0, pp->y: 0

rp->pt1.x: 0
++rp->pt1.x: 1
rp->pt1.x: 1

p->len: 0
++p->len: 1
p->str: hello
*p->str++: h
*p->str: e
p->str--: hello
p->str: hello
*/









Chapter_6 BACK_TO_TOP words     Exercise_6-1



Comments

Popular posts from this blog

Contents

Blogger Page Margins in Contempo