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