Trang 1 / 2 12 LastLast
Hiển thị kết quả từ 1 đến 10 / 12
  1. #1
    Tham gia
    04-08-2011
    Bài viết
    90
    Like
    9
    Thanked 17 Times in 15 Posts

    Cứu mình với.........,sắp mặc cạn đến nơi rồi

    ông thầy trên lớp ra bài này, tuy là cực kì dễ, nhưng lại kèm 1 yêu cầu quái đản nên mình nghĩ mãi ko ra. giúp mình nha cac bạn.
    nhập từ bàn phím sô N (<=100), in ra tất cả các sô chẵn <= N.
    ( ko đc dùng vòng lặp như while..do.. hay for ..to..do hoặc repeat...until...).
    chỉ đc dùng if...then....
    thế đấy. dùng vòng lặp thỳ coi như ko có điểm,
    Quote Quote

  2. #2
    Tham gia
    22-10-2010
    Bài viết
    7
    Like
    0
    Thanked 1 Time in 1 Post
    Mình nghĩ là thế này : Bạn công dồn vào biến x và in ra , đồng thời so sánh với n, khi x=n thì thoát chương trình . Bn nào có cách hay hơn thì chỉ giáo thêm nhá )

    Code:
    var
     n,x:integer;
    begin
     x:=-2;
     readln(n);
     x:=x+2;
     writeln(x);
     if x=n then halt;
     x:=x+2;
     writeln(x);
     if x=n then halt;
     .
     . 
     .
     (copy khoảng 50 lần)
    end.

  3. #3
    Tham gia
    10-11-2011
    Location
    Hồ Chí Minh
    Bài viết
    537
    Like
    86
    Thanked 54 Times in 46 Posts
    Thử xài goto dán mác label vào xem @-)
    Goto: lệnh nhảy không điều kiện.
    Tham khảo cụ thể google bạn nhé

  4. #4
    Tham gia
    05-03-2009
    Bài viết
    1
    Like
    0
    Thanked 0 Times in 0 Posts
    Có nhiều cách, bạn cũng có thể sài switch case cũng đc...nhưng mà hơi dài thôi
    Nếu có thể viết ctrinh con thì sài đệ quy

  5. #5
    Tham gia
    22-10-2011
    Bài viết
    211
    Like
    2
    Thanked 30 Times in 19 Posts
    Vấn đề là thuật toán thôi!
    Cứu bạn nè:
    Dùng công thức tính TỔng của cấp số cộng.


    Sn là tổng của N số.
    a1 số đầu (trong bài này luôn = 2)
    d= công sai ( trong bài này cũng luôn là 2)

    - Nếu N chẵn thì nó là tổng của 2,4,6.... N ==> Tổng S với a1=2, d=2, n=N
    - Nếu N lẻ thì nó là tổng của 2,4,6.... N-1 ==> Tổng S với a1=2, d=2, n=N-1


    Đến đây thì quá dễ rồi, bạn tự viết nha!

    PS: Làm Pascal thì cần Kiến thức Toán Học + Tư Duy, đừng vội nghĩ nó cao siêu quá.

    Một bài cũng thuộc dạng kinh điển: "Cho 2 biến a,b là integer. Không dùng biến trung gian thứ 3 (trong var chỉ khai báo 2 biến), hãy đổi chỗ giá trị của hai biến."

  6. #6
    Tham gia
    04-08-2011
    Bài viết
    90
    Like
    9
    Thanked 17 Times in 15 Posts
    Quote Được gửi bởi Em Chán Gà View Post
    Vấn đề là thuật toán thôi!
    Cứu bạn nè:
    Dùng công thức tính TỔng của cấp số cộng.


    Sn là tổng của N số.
    a1 số đầu (trong bài này luôn = 2)
    d= công sai ( trong bài này cũng luôn là 2)

    - Nếu N chẵn thì nó là tổng của 2,4,6.... N ==> Tổng S với a1=2, d=2, n=N
    - Nếu N lẻ thì nó là tổng của 2,4,6.... N-1 ==> Tổng S với a1=2, d=2, n=N-1


    Đến đây thì quá dễ rồi, bạn tự viết nha!

    PS: Làm Pascal thì cần Kiến thức Toán Học + Tư Duy, đừng vội nghĩ nó cao siêu quá.

    Một bài cũng thuộc dạng kinh điển: "Cho 2 biến a,b là integer. Không dùng biến trung gian thứ 3 (trong var chỉ khai báo 2 biến), hãy đổi chỗ giá trị của hai biến."
    mình vẫn chưa hiểu, có công thức, rồi làm sao in ra tât cả các số đc

  7. #7
    Tham gia
    22-10-2011
    Bài viết
    211
    Like
    2
    Thanked 30 Times in 19 Posts
    Quote Được gửi bởi davangmuitet View Post
    cách 1 : dùng label và goto
    // mình không nhớ nguyên bản của turbo pascal (dùng delphi nha)
    procedure DisplayRange;
    label reout;
    var N : Integer;
    begin
    N := 200;
    reout :
    N := N div 2;
    if N mod 2 = 0 then Write('.....', N
    if N > 0 then goto reout;
    end;

    cách 2 : dùng đệ quy

    procedure DisplayRange;
    procedure SubProc(var N : Integer);
    begin
    N := N div 2;
    if N mod 2 = 0 then Write('.....', N
    if N > 0 then SubProc(N);
    end;
    var N : Integer;
    begin
    N := 200;
    SubProc(N);
    end;
    Bài này hình như có vấn đề, mình cùng giả lập nhấn F5 nha ( chạy từng dòng - ko bít đúng ko, lâu quá ko mó đến)
    Code:
    Giả sử N=200
    Hàm được gọi lần 1:
    procedure SubProc(var N : Integer); {N=200}
    begin 
     N := N div 2; {N=100} 
     if N mod 2 = 0 then Write('.....', N); { In ra 100}
     if N > 0 then SubProc(N); {N=100}
    end;
    Hàm được gọi lần 2:
    procedure SubProc(var N : Integer); {N=100}
    begin 
     N := N div 2; {N=50} 
     if N mod 2 = 0 then Write('.....', N); { In ra 50}
     if N > 0 then SubProc(N); {N=50}
    end;
    Hàm được gọi lần 3: 
    procedure SubProc(var N : Integer); {N=50}
    begin 
     N := N div 2; {N=25} 
     if N mod 2 = 0 then Write('.....', N); { không in}
     if N > 0 then SubProc(N); {N=25}
    end;
    Hàm được gọi lần 4: 
    procedure SubProc(var N : Integer); {N=25}
    begin 
     N := N div 2; {N=12} 
     if N mod 2 = 0 then Write('.....', N); { In ra 12}
     if N > 0 then SubProc(N); {N=12}
    end;
    
    ---- Cứ tiếp diễn tới khi N=0---
    Dãy nhận được là: 100,50,12....,0
    Vậy dãy này sai!

    Bạn nhầm với bài nào rồi..??

    Tôi nghĩ dùng goto label thì giống như viết bằng repeat until, nhưng thoát qua được cái "khó" thấy đưa ra.

    Viết 1 đoạn thôi nha.
    Code:
    ......
    :label
    If N>0 then
     
      If (N mod 2) =0 then 
         Begin
          Write(N,",");
          Tong:=Tong+n;
          N:=N-2;
          Goto Label;
         End 
      Else
       Goto End_off;
     :Enn_off
     Write("Tong:",Tong);
     Readln;

  8. #8
    Tham gia
    14-11-2011
    Bài viết
    2
    Like
    0
    Thanked 0 Times in 0 Posts
    // xin lỗi vì cao hứng hơi ngớ ngẩn


    // cách 1 : dùng label và goto
    // mình không nhớ nguyên bản của turbo pascal (dùng delphi nha)
    procedure DisplayRange;
    label reout;
    var N : Integer;
    begin
    N := 100;
    reout :
    Write('.....', N
    N := N - 2;
    if N >= 0 then goto reout;
    end;

    // cách 2 : dùng đệ quy

    procedure DisplayRange;
    procedure SubProc(var N : Integer);
    begin
    Write('.....', N
    N := N - 2;
    if N >= 0 then SubProc(N);
    end;
    var N : Integer;
    begin
    N := 100;
    SubProc(N);
    end;

    // Mình không dùng turbo pascal nên không có trình biên dịch để kiểm tra kết quả, nhưng kiến
    // trúc như vậy là không sai, đây là dạng tiêu biểu khi mấy ông viết sách đến phần đệ quy.
    // Thường thì mấy ông viết sách sẽ cho rằng dùng label và goto là hạ sách nhưng thực tế nórất
    // hữu dụng ở một số trường hợp, không những thế khi dịch ra ngôn ngữ máy nó sẽ có thế
    // mạnh tương đồng với assembly
    Được sửa bởi davangmuitet lúc 16:11 ngày 17-11-2011

  9. #9
    Tham gia
    17-01-2008
    Bài viết
    163
    Like
    5
    Thanked 1 Time in 1 Post
    Không biết viết Pascal. Viết C# rùi bạn tự chuyển nhá. Dùng đệ quy.
    namespace ConsoleApplication1
    {
    class Program
    {
    static void Main(string[] args)
    {
    Console.Write("Vui long nhap 1 so: ");
    try
    {
    int n = int.Parse(Console.ReadLine());
    Console.WriteLine("Ban vua nhap vao so: {0}",n);
    Console.WriteLine("Danh sach cac so chan trong khoang tu 0 den {0} la:",n);
    DeQuy(n);
    Console.Read();
    }
    catch
    {
    Console.WriteLine("Thong tin ban vua nhap khong hop le");
    }
    }

    private static void DeQuy(int n)
    {
    if (n < 0)
    {
    return;
    }
    else
    {
    if (n % 2 == 0)
    {
    Console.WriteLine(n);
    DeQuy(n - 2);
    }
    else
    {
    Console.WriteLine(n-1);
    DeQuy(n - 2);
    }
    }
    }
    }
    }

  10. #10
    Tham gia
    21-04-2007
    Bài viết
    4
    Like
    3
    Thanked 3 Times in 1 Post
    Tình hình là Đọc code rất khó với những người không biết gì (chẳng hạn mình biết về C mà lại bắt đọc code Java thì rất mệt, tốn thời gian học).
    Nên chúng ta cần Mã giả:
    Begin // Bắt đầu chương trình
    Nhập số N;
    i = 0;
    InSo (i; N); //Ý tưởng chính là Đệ qui hàm

    Function InSo (i , N)
    Begin
    if i nhỏ hơn hoặc bằng N
    then
    if i chia het 2
    then Xuat ra i;
    Inso (i + 1, N);
    endif
    endif
    End

    End // Kết thúc chương trình

Trang 1 / 2 12 LastLast

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •