>第 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;
}


CK ck_246@sina.com.cn
2010-09-28 12:31:01

#include <stdio.h>
 main ()
{
   struct abc {
   float a;
   char b;
   float c;
   char d;
} z;
 z.b='+';z.d='i';
 printf("input a and c:");
 scanf("%f,%f",&z.a ,&z.c );
 if (z.a==0.0) printf("%.1f%c\n",z.c,z.d);
 else {if (z.c==0.0) { printf("%.1f%c\n",z.a,z.b);}
      else
		  printf("%.1f%c%.1f%c\n",z.a,z.b,z.c,z.d);}
}


sd44 sd44sd44@yeah.net
2010-10-20 20:57:35

/*
 * ==========================================================================
 *
 *       Filename:  prac.c
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  2010年10月20日 16时50分14秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 ==========================================================================
 */
#include <stdio.h>
#include <math.h>

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

struct rational {
    int x,y
} ;

struct rational add_rational (struct rational z1,struct rational z2)
{
    struct rational z;
    z.x = z1.x + z2.x;
    z.y = z1.y + z2.y;
    return z;
}
struct rational sub_rational (struct rational z1,struct rational z2)
{
    struct rational z;
    z.x = z1.x - z2.x;
    z.y = z1.y - z2.y;
    return z;
}
struct rational mul_rational (struct rational z1, struct rational z2)
{
    struct rational z;
    z.x = z1.x * z2.x;
    z.y = z1.y * z2.y;
    return z;
}
struct rational div_rational (struct rational z1, struct rational z2)
{
    struct rational z;
    z.x = z1.x / z2.x ;
    z.y = z1.y / z2.y ;
    return z;
}

struct rational make_rational (int a,int b)
{
    struct rational z;
    z.x = a;
    z.y = b;
    return z;
}

int print_rational (struct rational z)
{
    if (z.y < 0) {
        z.x = -z.x;
        z.y = -z.y;
    }
    if (z.y == 0)
        printf ("0 不能做除数\n");
    else if (z.x % z.y == 0) //如果能被整除,则变为最简分数
        printf ("%d\n", z.x/z.y);
    else
    {
        int gcd= euclid( z.x,z.y);
        z.x = z.x/gcd;
        z.y = z.y/gcd;
        printf ("%d/%d\n", z.x, z.y);
    }
    return 0;
}

int main(void)
{
    struct rational a = make_rational(1, 8); 
    struct rational b = make_rational(-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;
}


newbie newbie2013@gmail.com
2010-12-21 12:19:06

http://blog.chinaunix.net/u4/124133/showart_2442083.html


赵昱 zy4668@126.com
2011-05-08 17:18:44

#include<stdio.h>

struct rational {int x,y;};

int Euclid(int x,int y)
{
 if(x*y==0)
   return 1;
 else if(x%y==0)
   return y;
 else
   return Euclid(y,x%y); 
}
/***************biaoshiceng*****************/
struct rational make_rational(int x,int y)
{
     int a,b;
     a=x/Euclid(x,y);
     b=y/Euclid(x,y);
     struct rational z={a,b};
     return z;
}
int fenzi (struct rational z)
{
  return z.x;
}
int fenmu (struct rational z)
{
  return z.y;
}
/***************yunsuanceng***********/
void printf_rational(struct rational z)
{
   printf("fenzi shi %d,fenmu shi %d\n",fenzi(z),fenmu(z));  
}
struct rational add_rational(struct rational a,struct rational b)
{
  return make_rational(fenzi(a)*fenmu(b)+fenzi(b)*fenmu(a),fenmu(a)*fenmu(b));
}
struct rational sub_rational(struct rational a,struct rational b)
{
  return make_rational(fenzi(a)*fenmu(b)-fenzi(b)*fenmu(a),fenmu(a)*fenmu(b));
}
struct rational mul_rational(struct rational a,struct rational b)
{
  return make_rational(fenzi(a)*fenzi(b),fenmu(a)*fenmu(b));
}
struct rational div_rational(struct rational a,struct rational b)
{
  return make_rational(fenzi(a)*fenmu(b),fenzi(b)*fenmu(a));
}
/****************main**************/
int main(void)
{
struct rational a=make_rational(1,8);  /*a=1/8*/
struct rational b=make_rational(-2,16);  /*b=-1/8*/
printf_rational(add_rational(a,b));
printf_rational(sub_rational(a,b));
printf_rational(mul_rational(a,b));
printf_rational(div_rational(a,b));
return 0;
}


不吝赐教,新手,这个程序也弄了好长时间。


江民 vipstepstep@163.com
2011-05-23 15:25:01

原来麻将兄,高中学的还不扎实啊,都能写出那么强的代码,看来我还是有希望的。。。

写了不知道对不对,高中数学一塌糊涂。

void print(struct complex_struct p, char c)
{
	printf("%lf %c %lf\n", p.x, c, p.y);	
}

int main(void)
{
	struct complex_struct z1, z2, add, sub, mul, div;

	z1.x = 4.0;
	z1.y = 3.0;

	z2.x = 5.0;
	z2.y = 6.0;

	add = add_complex(z1, z2);
	sub = sub_complex(z1, z2);
	mul = mul_complex(z1, z2);
	div = div_complex(z1, z2);

	print(add, '+');
	print(sub, '-');
	print(mul, '*');
	print(div, '/');

	return 0;
}





gh codeghg@gmail.com
2011-05-29 21:11:11

#include <stdio.h>
#include <math.h>

int gcd(int x, int y)
{
	if (x % y == 0)
		return y;
	else
		return gcd(y, x % y);
}

struct rational {
	int x, y;
};

struct rational make_rational(int x, int y)
{
	struct rational a;
	int z;
	z = gcd(x, y);
	a.x = x / z;
	a.y = y / z;
	return a;
}

struct rational add_rational(struct rational a, struct rational b)
{
	return make_rational(a.x * b.y + b.x * a.y, a.y * b.y);
}

struct rational sub_rational(struct rational a, struct rational b)
{
	return make_rational(a.x * b.y - b.x * a.y, a.y * b.y);
}

struct rational mul_rational(struct rational a, struct rational b)
{
	return make_rational(a.x * b.x, a.y * b.y);
}

struct rational div_rational(struct rational a, struct rational b)
{
	return make_rational(a.x * b.y, a.y * b.x);
}

void printf_rational(struct rational a)
{
	if (a.y == 0)
		printf("分母不能为零\n");
	else if (a.x % a.y == 0)
		printf("%d\n", a.x / a.y);
	else if (a.y > 0)
		printf("%d/%d\n", a.x, a.y);
	else
		printf("%d/%d\n", -a.x, -a.y);
}

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

	return 0;
}


wangzhengyi 15866883396@126.com
2011-10-09 16:10:01

过于复杂并且费时间,弄懂了结构体的概念和访问方式即可,跳过代码了,罪过罪过


ivon yifeng.ivon.wang@hotmail.com
2011-11-22 07:23:41

/*
07.2.1
在本节的基础上实现一个打印复数的函数,打印的格式是x+yi,如果实部或虚部为0则省略,例如:1.0、-2.0i、-1.0+2.0i、1.0-2.0i。最后编写一个main函数测试本节的所有代码。
*/

#include <stdio.h>
#include <math.h>

struct complex_struct
{
	double x ;
	double y ;
} ;

double real_part(struct complex_struct z)
{
	return z.x;
}

double img_part(struct complex_struct z)
{
	return z.y;
}

double magnitude(struct complex_struct z)
{
	return sqrt(z.x * z.x + z.y * z.y);
}

double angle(struct complex_struct z)
{
	return atan2(z.y, z.x);
}

struct complex_struct make_from_real_img(double x, double y)
{
	struct complex_struct z;
	z.x = x;
	z.y = y;
	return z;
}

struct complex_struct make_from_mag_ang(double r, double A)
{
	struct complex_struct z;
	z.x = r * cos(A);
	z.y = r * sin(A);
	return z;
}

struct complex_struct add_complex(struct complex_struct z1, struct complex_struct z2)
{
	return make_from_real_img(real_part(z1) + real_part(z2), img_part(z1) + img_part(z2));
}

struct complex_struct sub_complex(struct complex_struct z1, struct complex_struct z2)
{
	return make_from_real_img(real_part(z1) - real_part(z2), img_part(z1) - img_part(z2));
}

struct complex_struct mul_complex(struct complex_struct z1, struct complex_struct z2)
{
	return make_from_mag_ang(magnitude(z1) * magnitude(z2), angle(z1) + angle(z2));
}

struct complex_struct div_complex(struct complex_struct z1, struct complex_struct z2)
{
	return make_from_mag_ang(magnitude(z1) / magnitude(z2), angle(z1) - angle(z2));
}

int print_complex(struct complex_struct z)
{
	if(real_part(z) != 0.0 && img_part(z) != 0.0)
	{
		if(img_part(z) > 0.0)
		{
			printf("%lf+%lfi\n", real_part(z), img_part(z)) ;
		}
		else
		{
			printf("%lf%lfi\n", real_part(z), img_part(z)) ;
		}
		
	}

	if(real_part(z) == 0.0)
	{
		if(img_part(z) != 0.0)
		{
			printf("%lfi\n", img_part(z)) ;
		}
		else
		{
			printf("0.0\n") ;
		}
	}

	if(img_part(z) == 0.0)
	{
		if(real_part(z) != 0.0)
		{
			printf("%lf\n", real_part(z)) ;
		}
		else
		{
			printf("0.0\n") ;
		}
	}

	return 0 ;
}

int main(void)
{
	struct complex_struct z1 ;
	struct complex_struct z2 ;
	
	z1 = make_from_real_img(1.0, 1.0) ;
 	z2 = make_from_mag_ang(1.0, 1.0) ;

	printf("real_part=%lf\n", real_part(z2)) ;
	printf("img_part=%lf\n", img_part(z2)) ;
	printf("magnitude=%lf\n", magnitude(z1)) ;
	printf("angle=%lf\n", angle(z1)) ;
	printf("\n") ;

	print_complex(add_complex(z1, z2)) ;
	print_complex(sub_complex(z1, z2)) ;
	print_complex(mul_complex(z1, z2)) ;
	print_complex(div_complex(z1, z2)) ;
	printf("\n") ;

	print_complex(make_from_real_img(1.0, 0.0)) ;
	print_complex(make_from_real_img(0.0, -2.0)) ;
	print_complex(make_from_real_img(-1.0, 2.0)) ;
	print_complex(make_from_real_img(1.0, -2.0)) ;
	printf("\n") ;

	return 0 ;
}


ivon yifeng.ivon.wang@hotmail.com
2011-11-22 11:30:59

/*
07.2.1
实现一个用分子分母的格式来表示有理数的结构体rational以及相关的函数,rational结构体之间可以做加减乘除运算,运算的结果仍然是rational。
*/

#include <stdio.h>
#include <math.h>

struct rational_struct
{
	int x ;
	int y ;
} ;

int numerator(struct rational_struct z)
{
	return z.x;
}

int denominator(struct rational_struct z)
{
	return z.y;
}

struct rational_struct make_rational(int x, int y)
{
	struct rational_struct z;
	z.x = x;
	z.y = y;
	return z;
}

struct rational_struct add_rational(struct rational_struct z1, struct rational_struct z2)
{
	return make_rational(numerator(z1) * denominator(z2) + denominator(z1) * numerator(z2), denominator(z1) * denominator(z2));
}

struct rational_struct sub_rational(struct rational_struct z1, struct rational_struct z2)
{
	return make_rational(numerator(z1) * denominator(z2) - denominator(z1) * numerator(z2), denominator(z1) * denominator(z2));
}

struct rational_struct mul_rational(struct rational_struct z1, struct rational_struct z2)
{
	return make_rational(numerator(z1) * numerator(z2), denominator(z1) * denominator(z2));
}

struct rational_struct div_rational(struct rational_struct z1, struct rational_struct z2)
{
	return make_rational(numerator(z1) * denominator(z2), denominator(z1) * numerator(z2));
}

int gcd(int i, int j)
{
	int temp ;

	if(i<j)
	{
		temp = i ;
		i = j ;
		j = temp ;
	}	

	if(i%j == 0)
	{
		return j ;
	}
	else
	{
		int temp ;

		temp = gcd(j, i%j) ;

		return temp ;
	}
}

int print_rational(struct rational_struct z)
{
	int i ;
	
	if(numerator(z) == 0)
	{
		printf("rational=0\n") ;
	
		return 0 ;
	}

	if(denominator(z) == 0)
	{
		printf("Invalid rational.\n") ;

		return 0 ;
	}
	
	i = gcd(numerator(z), denominator(z)) ;

	if((numerator(z) > 0 && denominator(z) > 0) || (numerator(z) < 0 && denominator(z) < 0))
	{
		if(numerator(z) / denominator(z) == 1)
		{
			printf("rational=1\n") ;

			return 0 ;
		}
		else
		{
			printf("rational=%d/%d\n", abs((numerator(z)) / i), abs(denominator(z) / i)) ;

			return 0 ;
		}
	}

	if((numerator(z) > 0 && denominator(z) < 0) || (numerator(z) < 0 && denominator(z) > 0))
	{
		if(numerator(z) / denominator(z) == -1)
		{
			printf("rational=-1\n") ;

			return 0 ;
		}
		else
		{
			printf("rational=-%d/%d\n", abs((numerator(z)) / i), abs(denominator(z) / i)) ;

			return 0 ;
		}
	}
}

int main(void)
{
	struct rational_struct a = make_rational(1, 8); // a=1/8
	struct rational_struct 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;
}


caozhijie czj627@126.com
2011-12-31 11:42:58

求两个数的最大公约数,网上看到一段代码写的很简洁:

int gcd(int x,int y)
{
return y ? gcd(y, x%y) : x;
}


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