>第 7 章 结构体>数据抽象>习题

码匠 code_smith@sohu.com
2009-09-03 15:45:28

宋老师,啥是复数阿? 能不能用个简单的例子来写这一节阿, 太复杂了 .... ~~~!!~~:)


码匠 code_smith@sohu.com
2009-09-03 16:44:02

#include <stdio.h>

int GCD(int a, int b)
{
	if(a%b == 0)
		return b;
	else
		return GCD(b, a%b);
}

struct rational {
	int numerator;
	int denominator;
};

void print_rational(struct rational a)
{
	if( a.numerator == 0)
		printf("0\n");
	else if(a.denominator == 1)
		printf("%d\n", a.numerator);
	else
		printf("%d/%d\n", a.numerator, a.denominator);
}

struct rational make_rational(int numerator, int denominator)
{
	int divisor = GCD(numerator, denominator);
	struct rational ret = {numerator/divisor, denominator/divisor};
	if(ret.denominator<0)
	{
		ret.numerator = -ret.numerator;
		ret.denominator = -ret.denominator;
	}
	
	return ret;
}

struct rational add_rational(struct rational a, struct rational b)
{
	struct rational ret;

	ret.numerator = a.numerator*b.denominator + b.numerator*a.denominator;
	ret.denominator = a.denominator*b.denominator;

	return make_rational(ret.numerator, ret.denominator);
}

struct rational sub_rational(struct rational a, struct rational b)
{
	struct rational ret;

	ret.numerator = a.numerator*b.denominator - b.numerator*a.denominator;
	ret.denominator = a.denominator*b.denominator;

	return make_rational(ret.numerator, ret.denominator);
}

struct rational mul_rational(struct rational a, struct rational b)
{
	struct rational ret;

	ret.numerator = a.numerator*b.numerator;
	ret.denominator = a.denominator*b.denominator;

	return make_rational(ret.numerator, ret.denominator);
}

struct rational div_rational(struct rational a, struct rational b)
{
	struct rational ret;

	ret.numerator = a.numerator*b.denominator;
	ret.denominator = a.denominator*b.numerator;

	return make_rational(ret.numerator, ret.denominator);
}


int main(void)
{
	struct rational a = make_rational(1, 8); /* a=1/8 */
	struct rational b = make_rational(-1, 8); /* b=-1/8 */
	print_rational(add_rational(a, b));
	print_rational(sub_rational(a, b));
	print_rational(mul_rational(a, b));
	print_rational(div_rational(a, b));

	return 0;
}



码匠 code_smith@sohu.com
2009-09-03 16:44:50

为什么不能看到俺的帖子呢? try again


tianyebj tianyebj@gmail.com
2009-09-21 23:54:36

#include <stdio.h>
struct rational{
	int p;
	int q;
};
struct rational make_rational(int p, int q){
	struct rational r;
	r.p = p;
	r.q = q;
	return r;
}

struct rational make_simple(struct rational r){
	int a = r.p;
	int b = r.q;
	int c;
	while(b != 0){
		c = a;
		a = b;
		b = c % b;
	}
	r.p /= a;
	r.q /= a;
	return r;
}

struct rational add(struct rational a, struct rational b){
	struct rational r;
	if(a.q != b.q){
		r.q = a.q * b.q;
		r.p = a.p * b.q + b.p * a.q;
	}else{
		r.q = a.q;
		r.p = a.p + b.p;
	}
	return make_simple(r);
}

struct rational mul(struct rational a, struct rational b){
	struct rational r;
	r.q = a.q * b.q;
	r.p = a.p * b.p;
	return make_simple(r);
}

struct rational nag(struct rational r){
	r.p = -r.p;
	return r;
}

struct rational inv(struct rational r){
	struct rational ir;
	ir.p = r.q;
	ir.q = r.p;
	return ir;
}

struct rational add_rational(struct rational a, struct rational b){
	return add(a, b);
}

struct rational sub_rational(struct rational a, struct rational b){
	return add(a, nag(b));
}

struct rational mul_rational(struct rational a, struct rational b){
	return mul(a, b);
}

struct rational div_rational(struct rational a, struct rational b){
	return mul(a, inv(b));
}

void print_rational(struct rational r){
	char c;
	if(r.p * r.q >= 0){
		c = '+';

	}else{
		c = '-';
	}
	if(r.p < 0) r.p = -r.p;
	if(r.q < 0) r.q = -r.q;
	
	if(c == '-'){
		if(r.p == 0){
			printf("0");
		}else if(r.q == 1){
			printf("-%d\n", r.p);
		}else{
			printf("-%d/%d\n", r.p, r.q);
		}
	}else{
		if(r.p == 0){
			printf("0\n");
		}else if(r.q == 1){
			printf("%d\n", r.p);
		}else{
			printf("%d/%d\n", r.p, r.q);
		}
	}
}

int main(void)
{
	struct rational a = make_rational(1, 8); /* a=1/8 */
	struct rational b = make_rational(-1, 8); /* b=-1/8 */
	print_rational(add_rational(a, b));
	print_rational(sub_rational(a, b));
	print_rational(mul_rational(a, b));
	print_rational(div_rational(a, b));
	return 0;
}


笨笨熊 wsj3000@gmail.com
2010-01-17 16:48:37

int print_complex(sComplex z)
{
	if(z.x==0 && z.y==0){
		printf("0.0");
	}else{
		if(z.x!=0.0)
			printf("%.1lf",real(z));
		else;
		if(z.y>0.0 && z.x!=0.0)
			printf("+");
		else;
		if(z.y!=0.0)
			printf("%.1lfi",img(z));
		else;
	}
	printf("\n");
	return 0;
}


笨笨熊 wsj3000@gmail.com
2010-01-18 00:44:29

//rational.h

typedef struct rational{
	int nr;
	int dr;
}sRational;

//==========================================
sRational make_rational(int nr,int dr);
sRational add_rational(sRational a,sRational b);
sRational sub_rational(sRational a,sRational b);
sRational mul_rational(sRational a,sRational b);
sRational div_rational(sRational a,sRational b);
int print_rational(sRational a);


//rational.c
#include <math.h>
#include <stdlib.h>
#include <stdio.h>

#include "rational.h"
/*
sRational make_rational(int nr,int dr);
sRational add_rational(sRational a,sRational b);
sRational sub_rational(sRational a,sRational b);
sRational mul_rational(sRational a,sRational b);
sRational div_rational(sRational a,sRational b);
int print_rational(sRational a);
 */
static int absGCD(int a,int b);
//return a positive great common divisor  numbers;
static int IsRational(sRational a);
static sRational FormatRational(sRational a);
//===================================================
sRational make_rational(int nr,int dr)
{
	sRational tmp;
	tmp.nr=nr;
	tmp.dr=dr;
	return FormatRational(tmp);
}

sRational add_rational(sRational a,sRational b)
{
	if((!IsRational(a)) || (!IsRational(b))){	//if not rational;
		fprintf(stderr,"can't add/sub,one is not rational!");
		exit(1);
	}else;

	int gcd,a1,b1;
	sRational c;
	gcd=absGCD(a.dr,b.dr);
	a1=a.dr/gcd;
	b1=b.dr/gcd;
	c.nr=a.nr*b1 + b.nr*a1;
	c.dr=a1*b1*gcd;
	return FormatRational(c);
}

sRational sub_rational(sRational a,sRational b)
{
	b.nr=-b.nr;	//converse to plus;
	return FormatRational(add_rational(a,b));
}

sRational mul_rational(sRational a,sRational b)
{
	if( !(IsRational(a) && IsRational(b)) ){	//if not rational;
		fprintf(stderr,"can't mul/div,one is not rational!");
		exit(1);
	}else;

	sRational c;
	c.nr=a.nr*b.nr;
	c.dr=a.dr*b.dr;
	return FormatRational(c);
}

sRational div_rational(sRational a,sRational b)
{
	if( !(IsRational(a) && IsRational(b)) ){	//if not rational;
		fprintf(stderr,"can't div,one is not rational!");
		exit(1);
	}else;

	int tmp;
	tmp=b.nr;
	b.nr=b.dr;
	b.dr=tmp;

	return FormatRational(mul_rational(a,b));
}

int print_rational(sRational a)
{
	printf("%d/%d\n",a.nr,a.dr);
	return 0;
}

static int absGCD(int a,int b)
{
	int c;
	a=abs(a);
	b=abs(b);
	while((c=a%b)!=0){
		a=b;
		b=c;
	}
	return b;
}

static int IsRational(sRational a)
{
	return (a.dr==0)?0:1;
}

static sRational FormatRational(sRational a)
{
	if(!IsRational(a)){
		fprintf(stderr,"can't format,one is not rational!");
		exit(1);
	}else;

	if(a.nr<0 ^ a.dr<0){	//format sign;
		a.nr=-abs(a.nr);
		a.dr=abs(a.dr);
	}else{
		a.nr=abs(a.nr);
		a.dr=abs(a.dr);
	}

	int gcd;
	gcd=absGCD(a.nr,a.dr);
	a.nr=a.nr/gcd;
	a.dr=a.dr/gcd;
	return a;
}


如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!