#include<stdio.h> struct rational{ int numerator; int denominator; }; int gcd(int a,int b){ if(a<0) a=-a; if(b<0) b=-b; if(a<b){ int temp; temp=a; a=b; b=temp; } if(a%b==0) return b; else return gcd(b,a%b); } int numerator(struct rational r){ return r.numerator; } int denominator(struct rational r){ return r.denominator; } struct rational make_rational(int a,int b){ struct rational r; int temp; temp=gcd(a,b); r.numerator=a/temp; r.denominator=b/temp; return r; } struct rational rational_add(struct rational ra,struct rational rb){ struct rational r; r.numerator=numerator(ra)*denominator(rb)+numerator(rb)*denominator(ra); r.denominator=denominator(ra)*denominator(rb); r=make_rational(r.numerator,r.denominator); return r; } struct rational rational_sub(struct rational ra,struct rational rb){ struct rational r; r.numerator=numerator(ra)*denominator(rb)-numerator(rb)*denominator(ra); r.denominator=denominator(ra)*denominator(rb); r=make_rational(r.numerator,r.denominator); return r; } struct rational rational_mul(struct rational ra,struct rational rb){ struct rational r; r.numerator=numerator(ra)*numerator(rb); r.denominator=denominator(ra)*denominator(rb); r=make_rational(r.numerator,r.denominator); return r; } struct rational rational_dev(struct rational ra,struct rational rb){ struct rational r; r.numerator=numerator(ra)*denominator(rb); r.denominator=denominator(ra)*numerator(rb); r=make_rational(r.numerator,r.denominator); return r; } void print_rational(struct rational r){ if(r.numerator<0||r.denominator<0){ if(r.numerator<0) printf("-%d/%d",-r.numerator,r.denominator); if(r.denominator<0) printf("-%d/%d",r.numerator,-r.denominator); } else printf("%d/%d",r.numerator,r.denominator); printf("\n"); } int main(void){ struct rational ra=make_rational(-1,4); struct rational rb=make_rational(1,3); print_rational(rational_add(ra,rb)); print_rational(rational_sub(ra,rb)); print_rational(rational_mul(ra,rb)); print_rational(rational_dev(ra,rb)); return 0; }
宋老师,啥是复数阿? 能不能用个简单的例子来写这一节阿, 太复杂了 .... ~~~!!~~:)
#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; }
#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);} }
/* * ========================================================================== * * 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; }
http://blog.chinaunix.net/u4/124133/showart_2442083.html
#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; } 不吝赐教,新手,这个程序也弄了好长时间。
原来麻将兄,高中学的还不扎实啊,都能写出那么强的代码,看来我还是有希望的。。。 写了不知道对不对,高中数学一塌糊涂。 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; }
#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; }
过于复杂并且费时间,弄懂了结构体的概念和访问方式即可,跳过代码了,罪过罪过
/* 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 ; }
/* 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; }
求两个数的最大公约数,网上看到一段代码写的很简洁: int gcd(int x,int y) { return y ? gcd(y, x%y) : x; }
如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!