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. Iroh

    Iroh Oyabun

    Tham gia ngày:
    25/3/07
    Bài viết:
    6,495
    Tớ có một cái assignment là làm một từ điển anh-việt. Giờ đang làm phần nhập từ mới. Tớ có nghĩ ra giải thuật sau:

    [SPOIL]- Nhập từ tiếng anh và nghĩa tiếng việt

    +) Sau đó bắt đầu kiểm tra xem từ đó đã có hay chưa:

    - Dùng một vòng lặp để ghi toàn bộ file vào một mảng.

    - Dùng strstr để kiểm tra xem có từ tiếng anh vừa nhập trong mảng hay không.

    Nếu có thì hỏi xem có muốn thêm nghĩa tiếng việt hay không. Có thì di chuyển con trỏ về cuối từ tiếng anh và fputs nghĩa tiếng việt rồi fprintf thêm dấu phẩy để phân cách với nghĩa cũ. Không thì return.

    Nếu không có từ đó thì tiếp tục thực hiện chương trình là fputs cả từ tiếng anh và nghĩa tiếng việt vào cùng một vòng trong file văn bản.[/SPOIL]

    Nhưng có vấn đề xảy ra là giờ cái bước kiểm tra xem từ tiếng anh đã có hay chưa thì nó chả bao giờ báo là đã có rồi cả. Toàn bỏ qua rồi thực thi ghi luôn từ tiếng anh và nghĩa tiếng việt vào. Ai xem hộ tớ với:(

    [SPOIL]
    Mã:
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
    
    struct tudien{
    char english[15];
    char vietnam[50];
    };
    
    void main()
    {
    struct tudien tumoi;
    char *l, *cha;
    char ch, addflag;
    char temp[1];
    FILE *fp;
    cha=(char*)malloc(sizeof(char));
    
    //Tao file neu chua co file trong may
    fp = fopen("D:\Tudien.dat", "a+");
    if (fp == NULL)
    {
        printf("Khong the mo File");
        getch();
        return;
    }
    fclose(fp);
    
    //Nhap tu
    printf("Nhap tu moi tieng anh:");
    gets(tumoi.english);
    printf("Nhap tu moi tieng viet:");
    gets(tumoi.vietnam);
    
    //Mo file de kiem tra da co tu do hay chua
    fp = fopen("D:\Tudien.dat", "a+");
    if (fp == NULL)
    {
        printf("Khong the mo File");
        getch();
        return;
    }
    
    	do{
     	ch=fgetc(fp);
     	temp[1]=ch;
     	strcat(cha,temp);
    	}while(ch!=EOF);
    
    l = strstr(cha,tumoi.english);
    
    	if (l!=NULL)
    	{
    	printf("Da co tu nay.\nCo muon them nghia tieng viet hay khong?\nY = Yes, N = No - ");
    	scanf("%c", &addflag);
    		if (addflag == 'Y')
    		{
     		fseek(fp,sizeof(tumoi.english),SEEK_CUR);
     		fputs(tumoi.vietnam, fp);
     		fprintf(fp,",");
     		printf("Ket thuc chuong trinh.");
     		getch();
     		return;
    		}
    
    		else if(addflag == 'N')
          {
          printf("Ket thuc chuong trinh.");
     		getch();
     		return;
          }
    	}
    fclose(fp);
    
    
    //Mo file de ghi tu moi vao
    fp = fopen("D:\Tudien.dat", "a+");
    if (fp == NULL)
    {
        printf("Khong the mo File");
        getch();
        return;
    }
    
    fputs(tumoi.english, fp);
    fputs(tumoi.vietnam, fp);
    fprintf(fp, "\n");
    fclose(fp);
    printf("Ket thuc chuong trinh.");
    getch();
    }
    [/SPOIL]
     
  2. dark_slayer_83

    dark_slayer_83 Long Phụng Hòa Minh Moderator Lão Làng GVN

    Tham gia ngày:
    19/4/02
    Bài viết:
    16,627
    Tớ đã xem qua cách làm như vầy rồi,nhưng tớ muốn lấy dữ liệu ở database lên luôn kia(lấy 1 cái rồi dựa trên position đó để tìm những cái tương ứng còn lại.)
     
  3. CTKhuyen

    CTKhuyen

    Tham gia ngày:
    11/11/05
    Bài viết:
    2,542
    Nơi ở:
    Giang Hồ
    Đọc cái code xong muốn...8-},chẳng ghi chú thích gì cả,phải paste vào mà debug mới xong...

    Thứ nhất là hàm này:
    Mã:
    do{
     	ch=fgetc(fp);
     	temp[1]=ch;
     	strcat(cha,temp);
    	}while(ch!=EOF);
    Đọc mãi mới hiểu hàm trên,hóa ra là đọc từng kí tự rồi ghép lại,xong lấy từ ghép lại vào tra ...
    Gì mà khổ vậy,trong C có hàm fgets() nó lấy luôn cả một dòng ký tự luôn mà,fgetc nó chỉ lấy có một kí tự,phải tốn cả vòng lặp.

    Thứ 2 là:
    kể từ dòng l != NULL trở xuống ,chỉ thấy có kiểm tra một kí tự thôi.
    Trong khi từ điển,vd muốn tra một từ thì nó tra hết cả từ điển luôn,nên phải để trong một vòng lặp chứ.

    Làm như già dê thì nó sẽ ra thế này:
    vd file input có 3 dòng:
    english
    yes
    no

    Mình nhập từ yes vào,nó sẽ kiểm tra với từ english,ko phải thì kết thúc luôn cả chương trình,thay vì tiếp tục lặp kiểm tra các từ còn lại.
     
  4. dark_slayer_83

    dark_slayer_83 Long Phụng Hòa Minh Moderator Lão Làng GVN

    Tham gia ngày:
    19/4/02
    Bài viết:
    16,627
    Đoạn code login tớ tham khảo thế này
    Mã:
        Private Sub Button_Login_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Login.Click
            Dim connection As New SqlClient.SqlConnection
            Dim command As New SqlClient.SqlCommand
            Dim adapter As New SqlClient.SqlDataAdapter
            Dim dataset As New DataSet
            connection.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Project1_db.mdf;Integrated Security=True;User Instance=True"
            command.CommandText = "select * from [accounts] where username = '" & TextBox_Username.Text & "' and  password = '" & TextBox_Password.Text & "';"
            connection.Open()
            command.Connection = connection
            adapter.SelectCommand = command
            [COLOR="Red"]adapter.Fill(dataset, "0")[/COLOR]
            Dim count = dataset.Tables(0).Rows.Count
            If count > 0 Then
                Form2.Show()
                Me.Hide()
            Else : MsgBox("Failed")
            End If
    
    Có 1 đoạn tớ xem mà k hiểu(dòng màu đỏ).Giờ tớ muốn dựa trên đoạn code ở trên để làm 1 chức năng tìm kiếm ví dụ như nhập username vào thì nó báo pass.vậy tớ phải làm sao?Tớ chả biết cách nào để móc record từ dataset ra hết Y__Y
     
  5. PhiLongXP

    PhiLongXP Youtube Master Race

    Tham gia ngày:
    21/1/07
    Bài viết:
    82
    Nơi ở:
    Crystal World
    Sau khi DataAdapter thực hiện một SELECT query thì nó sẽ đọc ra một tập hợp các record là RecordSet nếu câu truy vấn đúng.
    Lúc này dòng màu đỏ thực hiện hàm Fill để đổ RecordSetDataAdapter đọc được khi nãy vào trong một DataSet.

    Một DataSet là tập hợp của nhiều DataTable. DataTable thì giống như một tập con của bảng mà ta truy vấn tới.
    Nó chứa tất cả các cột mà ta đã truy vấn.
    + adapter.Fill(dataset, "0") ' Đổ vào DataTable có tên là "0" của biến dataset

    - Muốn lấy record từ DataSet thì thực hiện như:
    DataSet.Table("tên DataTable").Rows(Vị trí của row).Item("Tên cột")
    DataSet.Table(thứ tự của DataTable).Rows(Vị trí của row).Item(thứ tự cột)

    VD: string pwd = dataset.Table(0).Rows(0).Item("password")

    + Ngoài ra còn có thể đổ trực tiếp vào DataTable mà không cần qua DataSet nếu chỉ dùng một bảng.
    Dim dt As DataTable ' Khai báo biến DataTable
    adapter.Fill(dt) ' Đổ vào DataTable
    string pwd = dt.Rows(0).Item("password") ' Lấy password dòng đầu tiên

    Hoặc
    Dim dt As DataTable
    Dim dr As DataRow
    adapter.Fill(dt)
    dr = dt.Rows(0);
    string pwd = dr.Item("password")

    Xem thêm về System.Data hay ADO.NET [1][2]
     
  6. dark_slayer_83

    dark_slayer_83 Long Phụng Hòa Minh Moderator Lão Làng GVN

    Tham gia ngày:
    19/4/02
    Bài viết:
    16,627
    cái này mình k hiểu,tại sao table(0) cũng dc mà table("accounts") cũng đc
     
  7. PhiLongXP

    PhiLongXP Youtube Master Race

    Tham gia ngày:
    21/1/07
    Bài viết:
    82
    Nơi ở:
    Crystal World
    Thì có 2 kiểu tham số truyền vào để lấy DataTable trong DataSet là:

    + Thứ tự của nó trong DataSet (1 DataSet có nhiều DataTable)
    + Tên của DataTable mà mình đã Fill từ DataAdapter vào DataSet

    Dùng thứ tự nếu mình biết chính xác thứ tự của các DataTable trong DataSet.
    Nhưng thường khuyên nên dùng tên của DataTable để lấy thông tin chính xác hơn.
     
  8. sega_s3000

    sega_s3000 Sonic the Hedgehog

    Tham gia ngày:
    18/3/07
    Bài viết:
    4,914
    ở đây có ai biết hoặc có link dạy về nguyên lý kết nối khi làm những game có hệ thống multiplay ko....chả là định làm cái game cờ caro onlan 2 máy mà ko biết làm thế nào để kết nối cả :(
     
  9. Funnnny

    Funnnny Will Code Python For FOOD Moderator

    Tham gia ngày:
    2/8/05
    Bài viết:
    9,406
    Nơi ở:
    Hanoi, Vietnam
    1 từ thôi: socket .
     
  10. dark_slayer_83

    dark_slayer_83 Long Phụng Hòa Minh Moderator Lão Làng GVN

    Tham gia ngày:
    19/4/02
    Bài viết:
    16,627
    Tớ lại hỏi tiếp ^__^.Làm sao để thực hiện insert,update và delete dựa theo cơ cấu code ở trên vậy?Mình có làm theo các oleadapter nhưng nếu dùng trong SOL server thì đẩy dữ liệu lên đc,nhưng dùng mdf thì lại k thể,update xong tắt mở lại nó k có.

    Ví dụ như vầy,như code ở trên,tớ search username để ra pass và permission.Giờ tớ muốn sau khi search username có thể update lại permission.Hoặc insert thêm cái mới
     
  11. sega_s3000

    sega_s3000 Sonic the Hedgehog

    Tham gia ngày:
    18/3/07
    Bài viết:
    4,914
    gõ key word này vào google thì nó toàn ra chip xl mới đau =((
     
  12. PhiLongXP

    PhiLongXP Youtube Master Race

    Tham gia ngày:
    21/1/07
    Bài viết:
    82
    Nơi ở:
    Crystal World
    Nếu dùng DataAdapter để thực hiện Insert/Update/Delete
    thì nó chỉ thực hiện hành động thay đổi đó lên DataTable của DataSet mà thôi.

    Vì nó chỉ là Adapter giữa application và DB cho nên cần thêm một bước nữa
    để cập nhật những thay đổi từ DataTable lên DB bằng cách gọi

    VD: adapter.Update(dataset,"tên DataTable")

    Lúc này OLEDBAdapter sẽ thực hiện những thay đổi lên file Access.

    Ngoài ra có thể dùng đối tượng OleDbCommand để thực hiện:
    Lưu ý: Thực hiện tất cả thao tác với hệ quản trị CSDL cần cho vào bên trong Try Catch để dễ bắt lỗi.
    Sau khi thực hiện xong một hành động nếu không còn sử dụng đến thì nên close DataAdapter, Connection để giải phóng kết nối và bộ nhớ.
    Nếu cậu thật sự muốn làm thì phải chịu khó search. Keyword để search về lập trình mạng thì "Socket Programming" in "ngôn ngữ sử dụng"
    hay "Networking Programming", "TCP Programming", "UDP Programming"

    VD: "Socket Programming" in C++

    Ebook [1][2]
     
  13. Kira_h2c

    Kira_h2c title khác. Lão Làng GVN

    Tham gia ngày:
    14/7/08
    Bài viết:
    7,136
    Nơi ở:
    h2c1989
    Ai chỉ mình cách sử dụng uniqueidentifier trong sqlserver với
     
  14. Bối Bối

    Bối Bối C O N T R A

    Tham gia ngày:
    20/2/06
    Bài viết:
    1,859
    Nơi ở:
    Ha Noi, Vietnam,
    phải kèm với ngôn ngữ lt mà mình định dùng nữa chứ.
    vd: tcp/ip socket in c , c++, java ....
     
  15. Dream Theater

    Dream Theater Youth Gone Wild

    Tham gia ngày:
    8/5/04
    Bài viết:
    890
    Nơi ở:
    ...........
    Dùng SqlCommandBuilder là gọn nhẹ nhất, chỉ cần truyền vào câu lệnh SELECT là nó tự build ra cho mình lệnh update.

    Chú này đang học Q7 ở NIIT à, nhìn code quen quen ;;)
     
  16. dark_slayer_83

    dark_slayer_83 Long Phụng Hòa Minh Moderator Lão Làng GVN

    Tham gia ngày:
    19/4/02
    Bài viết:
    16,627
    Có thể minh họa cho mình k^__^
    Hỗ trợ dùm mình 1 chút nhé,viết tới đây roài tịt ngòi rùi Y__Y
    Mã:
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim connection As New SqlClient.SqlConnection
            Dim command As New SqlClient.SqlCommand
            Dim adapter As New SqlClient.SqlDataAdapter
            Dim dataset As New DataSet
            connection.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Project1_db.mdf;Integrated Security=True;User Instance=True"
            command.CommandText = "UPDATE accounts SET permission=" & pertextbox.Text & " WHERE username=" & usertextbox.Text & "';"
            connection.Open()
            command.Connection = connection
            adapter.SelectCommand = command
            'viet gi bi gio hix hix
        End Sub
    
     
  17. Dream Theater

    Dream Theater Youth Gone Wild

    Tham gia ngày:
    8/5/04
    Bài viết:
    890
    Nơi ở:
    ...........
    Minh họa: có 1 lưới hiển thị danh sách phòng ban trong 1 cty, 1 button thực hiện chức năng thêm mới 1 phòng ban, 1 button lưu dữ liệu
    Mã:
    Public Class frmQuanLiPhongBan
    Dim m_connection As New SqlConnection
    Dim m_dataAdapterPhongBan As New SqlDataAdapter
    Dim m_dsPhongBanNhanVien As New DataSetPhongBanNhanVien
    Dim m_bindingSourcePhongBan As New BindingSource
    
    Private Sub frmQuanLiPhongBan_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            m_connection = ConnectionManager.getConnection()
    
            'Gắn command cho bảng PhongBan
            Dim m_commandPhongBan As New SqlCommand
            m_commandPhongBan.Connection = m_connection
            m_commandPhongBan.CommandText = "SELECT * FROM PhongBan"
            m_commandPhongBan.CommandType = CommandType.Text
            m_dataAdapterPhongBan.SelectCommand = m_commandPhongBan
            m_dataAdapterPhongBan.Fill(m_dsPhongBanNhanVien.PhongBan)
    
            [B]Dim m_commandBuilder As New SqlCommandBuilder(m_dataAdapterPhongBan)[/B]
    
            'Đổ dữ liệu lên DataGrid
            m_bindingSourcePhongBan.DataSource = m_dsPhongBanNhanVien.PhongBan
            bindAllData()
            gridPhongBan.DataSource = m_bindingSourcePhongBan
    
    Private Sub bindAllData()
            'Bind dữ liệu PhongBan
            txtPhongBan.DataBindings.Add(New Binding("Text", m_bindingSourcePhongBan, "TenPhongBan"))
            txtGhiChu.DataBindings.Add(New Binding("Text", m_bindingSourcePhongBan, "GhiChu"))
        End Sub
    
    Private Sub btnThem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnThem.Click
            'Thêm một phòng ban mới
            OnAdd()
        End Sub
    
    Private Sub btnLuu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLuu.Click
            OnSave()
        End Sub
    End Class
    BindingSource đóng vai trò trung gian quản lí dữ liệu giữa DataSet và DataGriew. Dùng SqlCommandBuilder chỉ cần truyền tham số là SqlDataAdapter sau khi SqlDataAdapter được khai báo là nó tự build cho mình những lệnh khác.

    Mã:
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim connection As New SqlClient.SqlConnection
            Dim command As New SqlClient.SqlCommand
            Dim adapter As New SqlClient.SqlDataAdapter
            Dim dataset As New DataSet
            connection.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Project1_db.mdf;Integrated Security=True;User Instance=True"
            command.CommandText = "UPDATE accounts SET permission=" & pertextbox.Text & " WHERE username=" & usertextbox.Text & "';"
            connection.Open()
            command.Connection = connection
            adapter.SelectCommand = command
            'viet gi bi gio hix hix
        End Sub
    Thiếu cái lệnh update :|
    Mã:
    adapter.update(dataset.tenbang)
     
  18. dark_slayer_83

    dark_slayer_83 Long Phụng Hòa Minh Moderator Lão Làng GVN

    Tham gia ngày:
    19/4/02
    Bài viết:
    16,627
    sao khi tớ thêm cái lệnh update như vầy
    Mã:
    adapter.Update(dataset.Tables("accounts"))
    
    nó báo
    Value cannot be null.
    Parameter name: dataTable


    Nếu đc Dream cho tớ xin cái file vb của ví dụ phía phòng ban phía trên nhé,xin lỗi nếu đòi hỏi quá đáng
     
  19. Dream Theater

    Dream Theater Youth Gone Wild

    Tham gia ngày:
    8/5/04
    Bài viết:
    890
    Nơi ở:
    ...........
    dataset, chấm xong ghi tên bảng muốn update trực tiếp luôn chứ đừng ghi kiểu đó lỡ mai mốt dataset có thay đổi gì thì khó sửa lắm. VD:
    Mã:
    adapter.Update(dataset.accounts)
     

    Các file đính kèm:

  20. dark_slayer_83

    dark_slayer_83 Long Phụng Hòa Minh Moderator Lão Làng GVN

    Tham gia ngày:
    19/4/02
    Bài viết:
    16,627
    hĩ sao tớ làm k ra Y__Y
    gõ cái update k đc nó báo lỗi.Dream coi dùm nhé Solution 5 ấy
     

Chia sẻ trang này