# GÓC SÁNG TẠO > Khu vực lập trình > Pascal/Delphi/Kylix >  Giúp em bài tập Thập Phân Sang Phân Số Với

## tranngoan

Chào các anh chị ! em đang có 1 rắc rối lớn . đó là bài tập về pascal.mong các anh chị giúp e với . e cảm ơn nhìu
Đề bài : Nhập 1 số thập phân tự động chuyển sang phân số
Ví dụ : Nhập 1,5 sau khi Enter sẽ tự động chuyển sang phân số là 3/2
Mong anh chị giúp đỡ e

----------


## 53caugiay

- Có điều kiện cho inp không bạn ?
- Vì số thập phân có nhiều trường hợp lắm vd như số thập phân hữu hạn , số thập phân hữu hạn , số thập phân tuần hoàn vô hạn ....

----------


## greenhome

cho só thập phân hữu hạn 


```
 
var       tu,mau,t:longint;
            s:real;
procedure       doips;
var    xau,x:string;
         i:longint;
         k:integer;
begin
             str(s,xau);
             for i:=1 to length(xau) do
             if xau[i]='.' then x:=copy(xau,i+1,length(xau)-i);
        mau:=1;
        for i:=1 to length(xau)-1 do
        if xau[i]='.' then
        begin
                xau[i]:=xau[i+1];
                xau[i+1]:='.';
                mau:=mau*10
        end;
end;
function    pstg(tu,mau:longint):longint;
var         du:longint;
begin
           t:=tu;
           repeat
           du:=( tu mod mau);
           tu:=mau;
           mau:=du;
           until  mau=0;
          write('phan so la :',(t div  tu) ,'/', ( mau div tu ));  
 end;
begin
          readln(s);
         doips;
         pstg(tu,mau);
          readln;
end.
```

p/s: em làm còn nhiều sơ xuất có gì mọi người thông cảm [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]
với lại hnay em ko ở nhà nên chưa test đc .

----------


## kettrinh

```
 
             for i:=1 to length(x)
```

thiếu "do" nà bạn 



```
            for i:=1 to length(xau) do
            if s[i]='.' then x:=copy(xau,i+1,length(xau)-i);
```

s kiểu real mà 

Trên là những lỗi về lập trình , còn về tư tưởng thuật toán của bạn thì mình không rõ

----------


## toiyeucota1992

cám ơn anh chị ! nhưng em mang về chạy thì không hiểu lắm . cô giáo k nói rõ là điều kiện như thế nào cả , e cũng có làm theo hàm chuổi nhưng mà không được . có vòng lặp xác định nhưng cũng k được . anh chị nào có thể làm và test hoàn chỉnh cho e được không ạ

----------


## maihienland

Đây là code cho số thập phân hữu hạn 


```
      uses crt;

      var   n:string;
            a,b,k,err:integer;

      function ucln(c,d:integer):integer;
      begin
            while c<>d do
            begin
                  if c>d then c:=c-d;
                  if d>c then d:=d-c;
            end;
            ucln:=d;
      end;

BEGIN
      clrscr;
      write(' Nhap N :'); readln(n);
      k:=length(n);
      repeat dec(k) until n[k]='.';
      delete(n,k,1);
      k:=length(n)-k+1;
      a:=1;
      repeat
            a:=a*10; dec(k);
      until k=0;
      val(n,b,err);
      k:=ucln(a,b);
      a:=a div k;
      b:=b div k;
      writeln;
      write(b,' / ',a);
      readln
END.
```

----------


## nhimbien12

* Ý TƯỞNG :
vd : 1.5 = 15/10 sau đó giản ước phân số 
1.55 = 155/ 100 sau đó giản ước phân số

----------


## hovafa

> ```
>  
>              for i:=1 to length(x)
> ```
> 
> thiếu "do" nà bạn 
> 
> 
> 
> ...


em nhầm 1 chút . thực ra là xau_ chứ ko phải là s cái này là do quen tay . Mọi người thông cảm_

----------


## hoanggiang212

theo em với số thập phân vô hạn tuần hoàn thì :
+tìm ra phần thập phân tuần hoàn 
+xem phần tuần hoàn đó và phần sau dấu '.' ko tuần hoàn có bao nhiêu chữ số thì chia cho 1 số có từng ấy chữ số 9 và 0 ( cái này là trước học casio ). 
Còn với số thập phân vô hạn ko tuần hoàn thì em nghĩ là ko đổi đc ( vì toàn số vô tỉ ).

----------


## duancanhotp

> em nhầm 1 chút . thực ra là xau_ chứ ko phải là s cái này là do quen tay . Mọi người thông cảm_


[I]_

Mình thấy vô lí . Bởi vì ở dưới cũng có 1 câu lệnh tương tự nhưng lại các câu lệnh trong begin end; lại khác nhau


```
         for i:=1 to length(xau) do
         if xau='.' then

```

 Bạn có thể nói qua ý tưởng của bạn không ?_

----------


## vlvietlamvl

> Mình thấy vô lí . Bởi vì ở dưới cũng có 1 câu lệnh tương tự nhưng lại các câu lệnh trong begin end; lại khác nhau


em nhầm 1 chút thôi mà anh .



> ```
>        for i:=1 to length(xau) do
>        if xau[i]='.' then
> ```
> 
> Bạn có thể nói qua ý tưởng của bạn không ?


-còn về ý tưởng thì theo em nghĩ phần nguyên và thập phân sẽ đc ngăn cách nhau bằng 1 dấu '.' 
-sau khi đổi thành xâu thì mỗi lần gặp dấu '.' này trong xâu thì đưa nó ra sau kí tự đứng sau nó (cũng tương đương với số *10) .
-do i tăng và vị trí của '.' cũng luôn tăng nên việc gặp dấu '.' sẽ đc đảm bảo .
-đến khi đã dịch hết thì sẽ xóa kí tự cuối cùng mà lúc đó chính là dấu '.' .
không biết như vầy có đc ko ạ ? anh cho ý kiến giúp em với .

----------


## huudatfee

Mình thấy mọi người đưa ra ý kiến mình hơi rắc rối, riêng mình giải quyết đơn giản thôi:
- Quy về 2 số m và n là tử và mẫu rồi tìm ucln.
- N sẽ là một số có dạng 10^i với i là số lượng số đứng sau "." .
- M sẽ là toàn bộ số thập phân đó loại ra dấu "." .
- Rồi in ra.
Bài sau đây dựa vào nguyên lí giải quy về số hữu tỉ có dạng:
10^i x= b.
Trong đó b là số nguyên được đưa về từ số thực do nhân 10^i vào.


```
uses crt;
var s,s1:string;e:integer;d,i,j:byte;m,n,tam:longint;
procedure doi(var a,b:longint);
var tam:longint;
begin
        if a<b then
        begin
                tam:=a;
                a:=b;
                b:=tam;
        end;
end;
function ucln(i,j:longint):longint;
var a,b:longint;
begin
        a:=i;
        b:=j;
        doi(a,b);
        while  b<>a do
                begin
                        a:=a-b;
                        doi(a,b);
                end;
end;
BEGIN
        readln(s);
        i:=1;
        s:=s+'.';
        while s[i]<>'.' do inc(i);
        if i=length(s) then write('Day khong phai so thap phan')
                else
                        begin
                                delete(s,length(s),1);
                                d:=length(s)-i;
                                n:=1;
                                for i:=1 to d do n:=n*10;
                                while s[i]<>'.' do inc(i);
                                s1:=s;
                                delete(s,i,1);
                                val(s,m,e);
                        end;
        tam:=m;
        m:=m div ucln(m,n);
        n:=n div ucln(tam,n);
        write(s1,'=',m,'/',n);
        readln;
END.
```

----------


## TruongTamPhong

> em nhầm 1 chút thôi mà anh .
> 
> -còn về ý tưởng thì theo em nghĩ phần nguyên và thập phân sẽ đc ngăn cách nhau bằng 1 dấu '.' 
> -sau khi đổi thành xâu thì mỗi lần gặp dấu '.' này trong xâu thì đưa nó ra sau kí tự đứng sau nó (cũng tương đương với số *10) .
> -do i tăng và vị trí của '.' cũng luôn tăng nên việc gặp dấu '.' sẽ đc đảm bảo .
> -đến khi đã dịch hết thì sẽ xóa kí tự cuối cùng mà lúc đó chính là dấu '.' .
> không biết như vầy có đc ko ạ ? anh cho ý kiến giúp em với .


- Chỉ cần tìm vị trí của dấu '.' và dùng lệnh delete là được rồi bạn àh !

@ Nguyên : cách em cũng là cách HSG mà [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------


## leanhseomxh

> - Chỉ cần tìm vị trí của dấu '.' và dùng lệnh delete là được rồi bạn àh !


nhưng em nghĩ mình có thể dùng vòng lặp đó để tạo ra mẫu = 10^i

----------


## daiklinh688

> - Chỉ cần tìm vị trí của dấu '.' và dùng lệnh delete là được rồi bạn àh !
> 
> @ Nguyên : cách em cũng là cách HPS mà [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]


 HPS là cách gì vậy???????? Em chưa biết?
@sack: code mình có vòng lặp rồi, nằm trong esle.

----------


## iwinonline365

> nhưng em nghĩ mình có thể dùng vòng lặp đó để tạo ra mẫu = 10^i


10^i trong đó i là số các chữ số đứng sau dấu '.' . Vậy khi đã tìm được dấu '.' thì dễ dàng xác định được sau dấu '.' có bao nhiêu số chữ số mà . Ta tạo mẫu 10^i 1 cách dễ dàng .

@ Nguyên : HSG = HappySoftGroup . Viết nhầm [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------


## love2806

mọi người giúp tôi bài toán pascal ở bên kia đi kái nào!
==============================================
*Bạn đã đưa bài không đúng đề tài, mong bạn không tái phạm*
*binhnguyenLQD-kg*

----------

