Hỏi & đáp lập trình

Thảo luận trong 'Lập trình & Đồ hoạ' bắt đầu bởi canh en buon, 23/5/07.

  1. canh en buon

    canh en buon Thành viên cấp 2

    Tham gia ngày:
    20/5/07
    Bài viết:
    84
    Nơi ở:
    Thành phố buồn
    Tài liệu lập trình
    Đối với nhiều người việc lập trình là 1 công viêc vất vả và khô khan (nếu không nói là nhàm chán)

    Nhưng các bạn hãy nhớ lại cái cảm xúc khi mình tìm ra 1 giải thuật tối ưu, hay khi mình hiện thực thành công 1 projec
    (sau hàng tháng trời ăn nằm với chiếc máy tính)
    Lúc đó tâm trạng của bạn thế nào???


    Bản thân mình nhờ may mắn thi đậu vào lớp chuyên tin nhưng lại chả biết tí gì về máy tính, nội gõ bàn phím thôi đã rất khó khăn nói gì đến lập trình
    Vì vậy thời gian đầu mình rất ghét lập trình, ghét cay ghét đắng

    Nhưng mọi việc đã thay đổi khi lần đầu tiên tự tay mình viết 1 chương trình hoàn chỉnh (mình nhớ rõ đó là bài tìm các số nguyên tố nhỏ hơn 1000)
    Lúc đó mình có 1 cảm giác lân lân rất khó tả và mình bắt đầu càm thấy yêu thích môn lập trình này, niềm say mê đó cứ lớn dần.

    Mình đã từng trải qua giai đoạn mới bắt đầu làm quen với lập trình nên mình hiểu rất rõ các khó khăn mà các bạn sẽ gặp phải.

    Vì vậy mình muốn lập ra topic này nhằm chia sẽ các khó khăn với các bạn mới nhập môn

    Cuối cùng, mình chúc các bạn thành công trên con đường lập trình mà mình đã chọn^^

    Các ngôn ngữ lập trình bạn nên học
    (đươc tạp chí eWEEK bình chọn)
    Một số kinh nghiệm
    Trước khi kết thút mình xin đố các bạn 1 bài toán nho nhỏ
    Hãy tìm 1 giải thuật cho biết 1 danh sách liên kết động có bị lập vòng hay không
    Ví dụ:
    A->B->C->NULL (không bị lặp vòng)
    A->B->C->A (lặp vòng)
    Các bạn chỉ cần nói ý tưởng hay giải thuật thôi, không cần phải hiện thực. Mình sẽ sớm gửi đáp án
     
    ham_vui242 thích bài này.
  2. bokolo

    bokolo Thành viên mới

    Tham gia ngày:
    3/6/06
    Bài viết:
    4
    Bạn ơi , cho mình hỏi một chút về những vấn đề có lien wan dến lập trình :
    Bạn có thể cho mình biết những con số từ 1>>9 ký hiệu là gì được ko .Và cho mình biết làm thề nào ( vào đâu ) để tạo bảng lập trình được ko .

    Tôi chỉ hơi biết một chút về tin học thôi chứ ko rành về cách lập trình .
    Tôi mong bạn có thể hướng dẫn một chút cho tôi. Xin cam' ơn
     
  3. canh en buon

    canh en buon Thành viên cấp 2

    Tham gia ngày:
    20/5/07
    Bài viết:
    84
    Nơi ở:
    Thành phố buồn
    Xin lỗi mình vẫn chưa hiểu lắm câu hỏi của bạn lắm.
    Bạn định hỏi mã ascii từ 1 đến 9 hay ký hiệu "1>>9" là gì?
    Thôi mình trả lời cả 2 vậy:
    + Mã ascii từ 1-> 9 là : 49-58
    + Còn ký hiệu 1>>9 trong ngôn ngữ C có nghĩa là dịch phải 9 lần, tức là 1>>9 = 2^9

    Còn bảng lập trình là gì? Có phải bạn nói bảng mã ascii không? Vậy thì bạn phải nói cụ thể trong ngôn ngữ nào?
     
  4. Gaique9x

    Gaique9x Thành viên cấp 2

    Tham gia ngày:
    21/5/07
    Bài viết:
    77
    Đề: tìm danh sách động bị lập vòng?

    Giải: cho 1 con trỏ giữ node đầu tiên, và 1 con trỏ duyệt danh sách, nếu trong quá trình duyệt danh sách con trỏ thứ 2 bằng con trỏ thứ nhất thì xuất ra danh sách đã lập vòng.

    Ví dụ: A(node1) -> B -> C -> A
    duyệt lần 1: A(node1) -> B(node2) -> C -> A
    duyệt lần 2: A(node1) -> B -> C(node2) -> A
    duyệt lần 3: A(node1) -> B -> C -> A(node2) ==> lập vòng

    Dễ như cơm bữa
     
  5. canh en buon

    canh en buon Thành viên cấp 2

    Tham gia ngày:
    20/5/07
    Bài viết:
    84
    Nơi ở:
    Thành phố buồn
    Trong bài giải bạn cho con trỏ giữ vị trí đầu tiên, vậy nếu lỡ phần tử cuối cùng không trỏ về đầu tiên thì sao.

    Ví dụ: A -> B -> C -> D -> B
    A(node1) -> B(node2) -> C -> D -> B
    A(node1) -> B -> C(node2) -> D -> B
    A(node1) -> B -> C -> D(node2) -> B
    A(node1) -> B -> C -> D -> B(node2)
    A(node1) -> B -> C(node2) -> D -> B (lặp vô tận) =>gameover
     
  6. satthugiaumat1986

    satthugiaumat1986 Thành viên cấp 5

    Tham gia ngày:
    25/9/02
    Bài viết:
    1,506
    Nơi ở:
    The Hell
    Phải làm thế nào để leo lên cái ghế quản lý ( project manager ) hoặc hơn thía nữa chứ cứ ngồi làm coder cả đời thì ko ổn đâu :D

    Cái bài trên tớ chả biết con trỏ là gì , nhưng mà cứ duyệt lặp vòng 4 lần xem , lần đầu A , lần sau B ... chẳng hạn . Chả học thuật toán bao giờ , nhưng vẫn code ứng dụng thực tế tốt ^^ , C# thui ko phải C++
     
  7. canh en buon

    canh en buon Thành viên cấp 2

    Tham gia ngày:
    20/5/07
    Bài viết:
    84
    Nơi ở:
    Thành phố buồn
    Con trỏ thực ra chỉ là 1 biến đặc biệt (thay vì chứa dữ liệu thì nó chứa địa chỉ của 1 biến khác).

    Đây là 1 ví dụ về con trỏ trong C++

    int a = 2;
    int *con_tro;
    con_tro = &a; //gán địa chỉ của biến a vào con trở
    cout<<*con_tro;//xuất ra giá trị của vùng nhớ con trỏ trở tới
    cout<<con_tro; // xuất ra địa chỉ của biến a

    Bạn hãy thử đánh đoạn code trên vào xem::)

    C# và 1 số ngôn ngữ cấp cao khác (java và VB) không còn dùng con trở nửa bởi vì 3 nguyên nhân:
    + Khó sử dụng! Con trỏ có thể lãm nản lòng bất kỳ ngưới nào mới làm quen với lập trình
    + Dễ tạo rác hệ thống! Khi bạn tạo ra 1 con trỏ nếu bạn quên delete nó, thì vùng dữ liệu con trỏ đó trỏ tới sẽ trở thành rác hệ thống
    + Rất nguy hiểm! Con trỏ là 1 biến đặc biệt, nó có thể trỏ tới bất kỳ đâu trong hệ thống. Hãy thữ nghĩ xem nếu 1 con trỏ vô tình trỏ tới 1 file hệ thống và chỉnh sửa lại các giá trị trong đó thì sẽ thế nào? (nhẹ thì treo máy, nặng thì cài lại window).::)
    * Do tính chất trên nên con trỏ rất được các hacker ưu thích (vì thế nếu bạn muốn trở thành 1 hacker thì hãy sữ dụng thành thạo con trỏ:D )
     
  8. canh en buon

    canh en buon Thành viên cấp 2

    Tham gia ngày:
    20/5/07
    Bài viết:
    84
    Nơi ở:
    Thành phố buồn
    Cách giải của bạn satthu gì gì đó là đúng rồi, nhưng tốn nhiều thời gian. Ở đây ta có 1 cách giải rất hay:

    Đầu tiên ta cho con trở thứ nhất nắm vị trí đầu tiên, và con trỏ thứ hai nắm vị trí kế tiếp. Sau đó ta duyệt danh sách theo cách:
    + Con trỏ thứ hai nhảy 2 bước
    + Con trỏ thứ nhất nhảy 1 bước
    + Khi nào con trỏ thứ 2 bằng NULL thì kết luận danh sách không lặp vòng
    + Khi nào con trở thứ 1 bằng con trỏ thứ 2 thì kết luận bị lặp vòng
    Ví dụ:
    A -> B -> C -> D -> E -> B
    Khởi đầu: A(con_tro 1) -> B(con_tro 2) -> C ->D -> E -> B
    Duyệt lần 1: A -> B(con_tro 1) -> C -> D(con_tro 2) -> E -> B
    Duyệt lần 2: A -> B -> C(con_tro 1) -> D -> E -> B(con_tro 2)
    Duyệt lần 3: A -> B -> C -> D(con_tro 1 = con_tro 2) -> E -> B
    => bị lặp vòng
    Lưu ý ở lần lặp thứ 2 và 3, con trở 2 quay trở về rồi nhảy tiếp 2 bước quay trở tới D, tại đây có gặp con trỏ 1
     
  9. canh en buon

    canh en buon Thành viên cấp 2

    Tham gia ngày:
    20/5/07
    Bài viết:
    84
    Nơi ở:
    Thành phố buồn
    Hôm nay trong khoa mình có thảo luận 1 đề tài khá thú vị.

    Nội dung như sau: người kỹ sư công nghệ thông tin không nhất thiết phải biết lập trình!!!
    Các bạn nhận xét sau về ý kiến trên?

    Ý kiến của mình: Một người kỹ sư công nghệ thông tin không biết lập trình thì cũng giống như một nhà văn không biết chữ:D
     
  10. Gaique9x

    Gaique9x Thành viên cấp 2

    Tham gia ngày:
    21/5/07
    Bài viết:
    77
    Nhà văn đâu nhất thiết phải biết chữ. Mấy ông viết truyện cổ tích, thần thoại ngày xưa có biết lấy nữa chữ đâu.=))

    Tương tự, trong công nghệ thông tin, nếu mình chọn theo ngành quản trị mạng, hay ngành nào thiên về phần cứng thì đâu cần phải biết lập trình làm chi cho mệt.

    Vì vậy em tán thành ý kiến trên
     
  11. bachkhoapro1204

    bachkhoapro1204 Thành viên cấp 2

    Tham gia ngày:
    20/5/07
    Bài viết:
    55
    Theo tui thì còn tùy trường hợp. Những ngành như quản trị mạng hay phần cứng thì không cần biết lập trình nhưng những ngành như lập trình mạng, hay lập trình hệ thống nhúng mà không biết lập trình thì chỉ còn biết cắn lưỡi=)).

    =>Tôi bỏ phiếu trắng (không tán thành cũng như không phản đối).
     
  12. = V.T =

    = V.T = Thành viên cấp 2

    Tham gia ngày:
    1/2/07
    Bài viết:
    93
    Ai giải hộ mình bài này với , nghĩ mãi chả ra

    Đề : 1.tính tổng S=1+1/2+1/3+....+1/n > sử dụng loop
    2.Nhập các giá trị cho mảng sau đó in ra có bao nhiêu số dương trong đó ,tính tổng các số âm ,co bao nhiêu số chính phương , bao nhiêu số nguyên tố .

    Cảm ơn trước nha
     
  13. satthugiaumat1986

    satthugiaumat1986 Thành viên cấp 5

    Tham gia ngày:
    25/9/02
    Bài viết:
    1,506
    Nơi ở:
    The Hell
    Cái bài 1 dùng ứng dụng Cn gì gì đó trong toán lớp 12 với đệ quy là xong .
    Câu 2 thì nhập mảng , sau đó duyệt nếu >0 thì count += 1, còn <0 thì tong += số âm đó , còn số chính phương với số nguyên tố là cái số gì thì tớ quên xừ nó rồi :D
     
  14. canh en buon

    canh en buon Thành viên cấp 2

    Tham gia ngày:
    20/5/07
    Bài viết:
    84
    Nơi ở:
    Thành phố buồn
    Lần sau các bạn post câu hỏi nhớ ghi rõ yêu cầu nhe:-/ , như cần hỏi ý tưởng, giải thuật hay hiện thực (và phải ghi rõ hiện thực bằng ngôn ngữ nào!!!)
    Do bạn không ghi rõ yêu cầu nên mình xin viết mã giả ngôn ngữ pascal:
    Begin
    label lap; //khai báo nhãn
    integer n;
    real i;
    i := 0;
    read(n); //nhập n
    lap:
    i := i + 1 / n;
    loop lap;//nhay
    write(i); //xuat ket qua
    End;

    (xin lổi nếu mình nhớ không lầm thì lệnh loop là lệnh nhảy tương tự lệnh goto, phải không? Mình cũng không chắc lắm)
     
  15. canh en buon

    canh en buon Thành viên cấp 2

    Tham gia ngày:
    20/5/07
    Bài viết:
    84
    Nơi ở:
    Thành phố buồn
    Ngôn ngữ C++:


    #include<iostream.h>
    void main{

    int hang, cot;
    int A[hang][cot];
    int dem_so_duong = 0;
    int dem_so_nguyen_to = 0;
    int tong_so_am = 0;
    cin>>hang;
    cin>>cot;

    for (int i = 0; i < hang; i++)
    for (int j = 0; j < cot; j++){

    if (A[j] >= 0) dem_so_duong ++;
    else tong_so_am += A[j];

    bool kiem_tra_nguyen_to = true;
    for (k = 2; k < A[j]; k++)
    if (A[j] % k == 0){
    kiem_tra_nguyen_to = false;
    break;
    }
    if (kiem_tra_nguyen_to) dem_so_nguyen_to ++;

    }

    }

    còn số chính phương là gì? quên mất tiêu rồi!!!:p
     
  16. canh en buon

    canh en buon Thành viên cấp 2

    Tham gia ngày:
    20/5/07
    Bài viết:
    84
    Nơi ở:
    Thành phố buồn
    Xin lỗi hồi nãy mình lộn lệnh loop trong assembly (lần sau nói vòng lặp là mình hiểu rồi, dốt anh văn lắm:p )

    var i: integer;
    var n: integer;
    var ketqua: real

    Begin

    Read(n);
    ketqua = 0;
    For i:= 1 to n do ketqua = ketqua + 1/i;
    Write(ketqua);

    End.
     
  17. Gaique9x

    Gaique9x Thành viên cấp 2

    Tham gia ngày:
    21/5/07
    Bài viết:
    77
    Có ai biết ma phương là gì không? Và cách xây dựng 1 ma phương.
     
  18. = V.T =

    = V.T = Thành viên cấp 2

    Tham gia ngày:
    1/2/07
    Bài viết:
    93
    Uh sry , mình quên mất ko nói rõ , cảm ơn bạn nha . Ban. có thể giải lại cho mình mấy bài đó theo ngôn ngữ C được không vì mình đang học C mà . Khó quá học C đúng là đau cả đầu khó hiểu thế không biết .
    Cảm ơn bạn lắm lắm .

    À quên bạn giải cho mình theo kiểu như viết vào máy rồi chạy luôn đó nhá , kiểu hiện thực thì phải :-?

    Còn cái này nữa :
    Số chính phương là số mà bình phương phần nguyên căn bậc 2 của nó bằng chính nó ví dụ như các số 4 , 16 , 9 , 25...
    k là số chính phương nếu ((int)sqrt(a))^2 == a

    Còn nữa cái số nguyên tố là số như thế nào ấy nhỉ
     
  19. canh en buon

    canh en buon Thành viên cấp 2

    Tham gia ngày:
    20/5/07
    Bài viết:
    84
    Nơi ở:
    Thành phố buồn
    ý tưởng: lấy căn của a, sau đó lấy phần nguyên của a bình phương lên nếu không thay đổi => số chính phương

    hiện thực ngôn ngữ VC++

    #include<iostream.h>
    #include<math.h>//kiểm tra xem có hàm sqr và sqrt không
    void main {

    int hang, cot;
    int A[hang][cot];
    int dem_so_chinh_phuong = 0;
    cin>>hang;
    cin>>cot;

    for (int i = 0; i < hang; i++)
    for (int j = 0; j < cot;j++)
    cin>>A[j]; //nhập các giá trị cho mảng

    double sqrt_a;
    int int_a;
    for (i = 0; i < hang; i++)
    for (j = 0; j < cot; j++)
    {
    sqrt_a = sqrt(A[j]);
    int_a = sqrt_a; //ép kiểu để lấy phần nguyên của a
    if ( sqr(int_a) == A[j] ) dem_so_chinh_phuong++;
    }

    cout<<"So chinh phuong hien co trong mang la:"<<dem_so_chinh_phuong;

    }

    Nếu dùng ngôn ngữ C (ko phải C++) : thay thư viên iostream.h và các hàm cin, cout bằng thư viên stdio.h và các hàm printf, scanf.

    Số nguyên tố là số chỉ chia hết cho 1 và chính nó!!!
     
  20. canh en buon

    canh en buon Thành viên cấp 2

    Tham gia ngày:
    20/5/07
    Bài viết:
    84
    Nơi ở:
    Thành phố buồn
    Ma phương bậc n: là 1 ma trận 2 chiều chứa các số từ 1 đến n^2 sao cho tổng các hàng bằng các cột và bằng 2 đường chéo chính

    Ví dụ ma phương bậc 5:
    11 18 25 02 09
    10 12 19 21 03
    04 06 13 20 22
    23 05 07 14 16
    17 24 01 08 15

    Các hàng, cột, và 2 đường chéo chính đều bằng 65:D

    Cách xây dựng ma phương bậc lẻ:
    Ví dụ ma phương bậc 3:

    Đầu tiên đặt số 1 vào chính giữa hàng cuối
    * * *
    * * *
    * 1 *
    Tiếp tục đặt số 2 vào vị trí đường chéo phải dưới
    (nếu vướt quá giới hạn hạn hàng qui định (số hàng giới hạn 3) thì đưa nó lên đầu)
    * * 2
    * * *
    * 1 *
    Tiếp tục đặt số 3 trên đường chéo (nếu vượt cột qui định thì chuyển nó trở về cột đầu tiên)
    * * 2
    3 * *
    * 1 *
    Tiếp tục đặt số 4 trên đường chéo, nhưng vì vị trí nó trùng với số 1 nên ta đưa nó lên trên số 3
    4 * 2
    3 * *
    * 1 *
    Số 5 và 6 tiếp tục đưa đặt vào đường chéo
    4 * 2
    3 5 *
    * 1 6
    Tiếp tục như thế cho đến khi hoàn thành ma phương
    4 9 2
    3 5 7
    8 1 6
    Tóm lại để tạo 1 ma phương bậc lẻ ta chỉ cần chú ý:
    + Đặt các số liên tiếp trên đường chéo.
    + Nếu vượt quá hàng/cột qui đinh thi ta cho nó quay trở lại vị trí hàng cột đầu tiên.
    + Nếu vị trí đặt đã có sẵn số nào đó thì ta đặt nó ở trên vị trí cũ.

    * Đây là giải thuật dành cho ma phương bậc lẻ, còn đối với ma phương bậc chẵn thì giải thuật hơi phứt tạp hơn!!! (bạn chịu khó tự tìm hiểu nhé)
     

Chia sẻ trang này