宋老师,啥是复数阿? 能不能用个简单的例子来写这一节阿, 太复杂了 .... ~~~!!~~:)
#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;
}
为什么不能看到俺的帖子呢? try again
#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;
}
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;
}//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将会出现在本书前言的致谢中。再次感谢您的宝贵意见!