Announcement

Collapse
No announcement yet.

Thắc mắc bài tập lập trình C

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Thắc mắc bài tập lập trình C

    Mọi người xem dùm em bài này nhá, bài thực hành yêu cầu tính toán phân số qua "struct", chương trình của em nó chạy bình thường với những kết quả > 0, còn những kết quả < 0 thì bị lỗi. VD em chạy:
    - Phân số 1: 3/5
    - Phân số 2: 4/5
    Thì Tổng vẫn ra kết quả bình thường là 7/5, còn tới tính hiệu thì chương trình bị lỗi.
    Tương tự với lỗi nhập số, khi em nhập một phân số âm thì bước rút gọn cũng bị lỗi tương tự.
    Code:
    #include<stdio.h>
    typedef struct PhanSo 
    { 
     	int iTuSo; 
    	int iMauSo; 
    }So;
    void Nhap(So* i, int m);
    void Xuat(So i);
    So Tong(So u, So v);
    So Hieu(So u, So v);
    So Tich(So u, So v);
    So Thuong(So u, So v);
    So RutGon(So a);
    int SoSanh(So u, So v);
    main()
    {
    	So a,b,c,d,e,f,g,h;
    	Nhap(&a,1);
    	g=RutGon(a);printf("Phan so thu 1 khi da rut gon: ");Xuat(g);
    	printf("\n\n");
    	Nhap(&b,2);
    	h=RutGon(b);printf("Phan so thu 2 khi da rut gon: ");Xuat(h);
    	printf("\n\nHai so co:");
    	c=Tong(a,b);printf("\n Tong la: ");Xuat(RutGon(c));
    	d=Hieu(a,b);printf("\n Hieu la: ");Xuat(RutGon(d));
    	e=Tich(a,b);printf("\n Tich la: ");Xuat(RutGon(e));
    	f=Thuong(a,b);printf("\n Thuong la: ");Xuat(RutGon(f));
    	printf("\n\nQuy uoc so sanh:\n - a > b --> 1\n - a < b --> -1\n - a = b --> 0");
    	printf("\nKet qua so sanh 2 so: ");
    	printf("\n%d",SoSanh(g,h));
    }
    void Nhap(So* i, int m)
    {
    	printf("Nhap tu so thu %d: ", m);scanf("%d", &i->iTuSo);
    	printf("Nhap mau so thu %d: ", m);scanf("%d", &i->iMauSo);
    }
    void Xuat(So i)
    {
    	if (i.iTuSo % i.iMauSo != 0) printf("%d/%d", i.iTuSo, i.iMauSo);
    	else printf("%d", i.iTuSo/i.iMauSo);
    }
    So Tong(So u, So v)
    {
    	//Tim uoc chung lon nhat
    	//u=a/c v=b/d
    	So i;
    	int a=u.iTuSo,b=v.iTuSo,c=u.iMauSo,d=v.iMauSo,e;
    	while(u.iMauSo != v.iMauSo)
    	{
    		if (u.iMauSo > v.iMauSo) u.iMauSo = u.iMauSo - v.iMauSo;
    		else v.iMauSo = v.iMauSo - u.iMauSo;
    	}
    	//tim boi chung nho nhat
    	e = c*d/ u.iMauSo;
    	//quy dong
    	a=a*(e/c);
    	b=b*(e/d);
    	c=e;
    	d=e;
    	i.iTuSo= a+b;
    	i.iMauSo= c;
    	return i;
    }
    So Hieu(So u, So v)
    {
    	//Tim uoc chung lon nhat
    	//u=a/c v=b/d
    	So i;
    	int a=u.iTuSo,b=v.iTuSo,c=u.iMauSo,d=v.iMauSo,e;
    	while(u.iMauSo != v.iMauSo)
    	{
    		if (u.iMauSo > v.iMauSo) u.iMauSo = u.iMauSo - v.iMauSo;
    		else v.iMauSo = v.iMauSo - u.iMauSo;
    	}
    	//tim boi chung nho nhat
    	e = c*d/ u.iMauSo;
    	//quy dong
    	a=a*(e/c);
    	b=b*(e/d);
    	c=e;
    	d=e;
    	i.iTuSo= a-b;
    	i.iMauSo= c;
    	return i;
    }
    So Tich(So u, So v)
    {
    	So i;
    	int a=u.iTuSo,b=v.iTuSo,c=u.iMauSo,d=v.iMauSo;
    	i.iTuSo=a*b;
    	i.iMauSo=c*d;
    	return i;
    }
    So Thuong(So u, So v)
    {
    	So i;
    	int a=u.iTuSo,b=v.iTuSo,c=u.iMauSo,d=v.iMauSo;
    	i.iTuSo=a*d;
    	i.iMauSo=c*b;
    	return i;
    }
    So RutGon(So a)
    {
    	So i;
    	int b=a.iTuSo,d=a.iMauSo;
    		while(a.iTuSo != a.iMauSo)
    	{
    		if (a.iTuSo > a.iMauSo) a.iTuSo = a.iTuSo - a.iMauSo;
    		else a.iMauSo = a.iMauSo - a.iTuSo;
    	}
    	i.iTuSo=b/a.iTuSo;
    	i.iMauSo=d/a.iTuSo;
    	return i;
    }
    int SoSanh(So u, So v)
    {
    	int a=u.iTuSo,b=v.iTuSo,c=u.iMauSo,d=v.iMauSo,e;
    	while(u.iMauSo != v.iMauSo)
    	{
    		if (u.iMauSo > v.iMauSo) u.iMauSo = u.iMauSo - v.iMauSo;
    		else v.iMauSo = v.iMauSo - u.iMauSo;
    	}
    	//tim boi chung nho nhat
    	e = c*d/ u.iMauSo;
    	//quy dong
    	a=a*(e/c);
    	b=b*(e/d);
    	if (a>b) return 1;
    	if (a<b) return -1;
    	if (a==b) return 0;
    }

  • #2
    :look_down: vòng lặp tìm UCLN se chạy vô tận nếu có số âm. thuật toán Euclid tìm UCLN là tìm UCLN của giá trị tuyệt đối của 2 số đó
    VD: a=-1, b=5 =>UCLN(-1,5) thì phải tìm UCLN(1,5)
    :funny::brick::beauty::what:

    Comment


    • #3
      Originally posted by 10520237 View Post
      :look_down: vòng lặp tìm UCLN se chạy vô tận nếu có số âm. thuật toán Euclid tìm UCLN là tìm UCLN của giá trị tuyệt đối của 2 số đó
      VD: a=-1, b=5 =>UCLN(-1,5) thì phải tìm UCLN(1,5)
      Cảm ơn anh, em hiểu rồi.

      Comment

      LHQC

      Collapse
      Working...
      X