em có bài này xin mấy anh chỉ hộ em , mai e thi rồi. đề là cấu trúc Phân Số dùng con trỏ , khi chạy code thì nhập vào 2 giá tri la : 1/2 2/3 , rồi em gọi hàm thêm 1 phân số nhập vào là 3/2 tại vị trí a[0] chạy ra mảng mới là : 3/2 1/2 2/3 nhưng khi gọi ngược lại hàm nhâp vào ban đầu thay vì ra là : 1/2 2/3 thì nó lai ra là: 3/2 1/2 . Mong mấy anh giúp giùm


Mã:
#include<stdio.h>
#include<conio.h>
#include<alloc.h>
typedef struct
{
  int tu,mau;
}ps;
void nhap1ps(ps &x)
{
 printf("Nhap tu so :      ");
 scanf("%d",&x.tu);
 printf("Nhap mau so :      ");
 scanf("%d",&x.mau);
}
void xuat1ps(ps x)
{
 printf(" %d/%d   ",x.tu,x.mau);
}
int ucln(int a,int b)
{ while(a!=b)
  { if(a>b)
     a=a-b;
    else
     b=b-a;
   };
   return a;
}
void rutgon(int &tu,int &mau)
{
  int c=ucln(tu,mau);
  tu=tu/c;
  mau=mau/c;
}
void nhapmang(ps *a,int n)
{
 for(int i=0;i<n;i++)
 {
     printf("
 Phan so thu %d 
 ",i+1);
     nhap1ps(*(a+i));
 }
}
void xuatmang(ps *a,int n)
{
 for(int i=0;i<n;i++)
    xuat1ps(*(a+i));
  getch();
}
void mangrut(ps *a ,int n)
{
 for(int i=0;i<n;i++)
  {
    rutgon((a+i)->tu,(a+i)->mau);
    xuat1ps(*(a+i));
  }
  getch();
}
ps tongps(ps *a,int n)
{
 ps z;int i=1;
 z.tu=a->tu;
 z.mau=a->mau;
 for(i=1;i<n;i++)
 {
   z.tu=z.tu*(a+i)->mau + z.mau*(a+i)->tu;
   z.mau=z.mau*(a+i)->mau;
 }
 rutgon(z.tu,z.mau);
 return z;
}
void xoa(ps *a,int n,int vtri)
{
 int i=0;
 for(i=vtri;i<n-1;i++)
   *(a+i)=*((a+i)+1);
  --n;
}
void them(ps *a,int n,ps x,int vt)
{
 int i;
 for(i=n;i>vt;i--)
   *(a+i)=*((a+i)-1);
   *(a+vt)=x;
 n++;
}
void main()
{
 ps *a;int n,chon;
 ps x;
 int vtri,vt;
 do{
    clrscr();
    printf("
 0 .Ket thuc");
    printf("
 1 .Nhap moi");
    printf("
 2. Xuat ");
    printf("
 3. Mang rut gon");
    printf("
 4. Tong mang");
    printf("
 5. Xoa vi tri");
    printf("
 6. Them tai vi tri");
    printf("
 ");
    printf("
 Moi ban chon :   ");
    scanf("%d",&chon);
    switch(chon){
		 case 1:
			printf(" n =   ");
			scanf("%d",&n);
			a=(ps * ) malloc (n*sizeof(ps));
			nhapmang(a,n);
			break;
		 case 2:
         printf("
");
			xuatmang(a,n);
			break;
       case 3:
         printf("
");
         mangrut(a,n);
         break;
       case 4:
         printf("
 %d/%d",tongps(a,n));
         getch();
         break;
       case 5:
         printf("Nhap vi tri can xoa :      ");
         scanf("%d",&vtri);
         xoa(a,n,vtri);
         xuatmang(a,n-1);
         getch();
         break;
       case 6:
         printf("Nhan vi tri can them :   ");
         scanf("%d",&vt);
         printf("Nhap tu so :   ");
         scanf("%d",&x.tu);
         printf("Nhap mau so :   ");
         scanf("%d",&x.mau);
         them(a,n,x,vt);
         xuatmang(a,n+1);
         getch();
         break;
	       }
   }while(chon!=0);
 free(a);
}