Từ 1 tới 8 trên tổng số 8 kết quả

Đề tài: Tìm lỗi sai trong bài tập mảng

  1. #1
    Ngày gia nhập
    10 2012
    Bài viết
    3

    Mặc định Tìm lỗi sai trong bài tập mảng

    Các anh giúp em xem bài này sai ở đâu với ạ:
    Đề bài: Viết hàm in vị trí các phần tử nguyên tố trong mảng các số nguyên.

    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<math.h>
    4. #define max 100
    5. int i;
    6. void nhapmang(int a[],int n);
    7. void xuatmang(int a[], int n);
    8. int nguyento(int k);
    9. void vitringuyento(int a[], int n);
    10.  
    11. int main()
    12. {
    13.     int a[max],n;
    14.     printf("\nNhap n: ");
    15.     scanf("%d",&n);
    16.     nhapmang(a,n);
    17.     xuatmang(a,n);
    18.     vitringuyento(a,n);
    19.    
    20.     getch();
    21. }
    22.  
    23. void nhapmang(int a[],int n)
    24. {
    25.     for(i=0;i<n;i++)
    26.     {
    27.         printf("a[%d]= ",i);
    28.         scanf("%d",&a[i]);
    29.     }
    30. }
    31.  
    32. void xuatmang(int a[], int n)
    33. {
    34.     printf("\nNoi dung mang:");
    35.     for(i=0;i<n;i++)
    36.     printf("%d    ",a[i]);
    37. }
    38.  
    39.  
    40.  
    41. int nguyento(int k)
    42. {
    43.     int ok=1;
    44.     for(i=2;i<(int)sqrt(k);i++)
    45.     if(k%i==0)
    46.     {
    47.         ok=0;
    48.         break;
    49.        
    50.     }  
    51.     if(ok=1)
    52.     return 1;
    53. }
    54.  
    55. void vitringuyento(int a[], int n)
    56. {
    57.     for(i=0;i<n;i++)
    58.     {
    59.         if(nguyento(a[i]))
    60.         printf("\nVi tri cua cac so nguyen to trong mang la: %d",i);
    61.     }
    62. }

  2. #2
    Ngày gia nhập
    02 2010
    Bài viết
    113

    Trích dẫn Nguyên bản được gửi bởi vudangthinh Xem bài viết
    Các anh giúp em xem bài này sai ở đâu với ạ:
    Đề bài: Viết hàm in vị trí các phần tử nguyên tố trong mảng các số nguyên.

    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<math.h>
    4. #define max 100
    5. int i;
    6. void nhapmang(int a[],int n);
    7. void xuatmang(int a[], int n);
    8. int nguyento(int k);
    9. void vitringuyento(int a[], int n);
    10.  
    11. int main()
    12. {
    13.     int a[max],n;
    14.     printf("\nNhap n: ");
    15.     scanf("%d",&n);
    16.     nhapmang(a,n);
    17.     xuatmang(a,n);
    18.     vitringuyento(a,n);
    19.    
    20.     getch();
    21. }
    22.  
    23. void nhapmang(int a[],int n)
    24. {
    25.     for(i=0;i<n;i++)
    26.     {
    27.         printf("a[%d]= ",i);
    28.         scanf("%d",&a[i]);
    29.     }
    30. }
    31.  
    32. void xuatmang(int a[], int n)
    33. {
    34.     printf("\nNoi dung mang:");
    35.     for(i=0;i<n;i++)
    36.     printf("%d    ",a[i]);
    37. }
    38.  
    39.  
    40.  
    41. int nguyento(int k)
    42. {
    43.     int ok=1;
    44.     for(i=2;i<(int)sqrt(k);i++)
    45.     if(k%i==0)
    46.     {
    47.         ok=0;
    48.         break;
    49.        
    50.     }  
    51.     if(ok=1)
    52.     return 1;
    53. }
    54.  
    55. void vitringuyento(int a[], int n)
    56. {
    57.     for(i=0;i<n;i++)
    58.     {
    59.         if(nguyento(a[i]))
    60.         printf("\nVi tri cua cac so nguyen to trong mang la: %d",i);
    61.     }
    62. }
    coi lại cái này...
    http://www.cplusplus.com/reference/cmath/sqrt/
    xem lại lí thuyết về biến toàn cục và cục bộ (nhìn kĩ cái biến i bạn khai báo như vậy nó sẽ ảnh hưởng như thế nào đến toàn bộ chương trình????)

  3. #3
    Ngày gia nhập
    10 2012
    Bài viết
    3

    Trích dẫn Nguyên bản được gửi bởi utkunglt Xem bài viết
    coi lại cái này...
    http://www.cplusplus.com/reference/cmath/sqrt/
    xem lại lí thuyết về biến toàn cục và cục bộ (nhìn kĩ cái biến i bạn khai báo như vậy nó sẽ ảnh hưởng như thế nào đến toàn bộ chương trình????)
    Em vẫn không hiểu, anh giải thích kỹ giúp em với ạ.

  4. #4
    Ngày gia nhập
    07 2007
    Nơi ở
    TP HCM
    Bài viết
    66

    Không nên khai báo biến i là biến toàn cục đâu. Bạn để ý biến i được khai báo ở đầu chương trình như thế này. Thì biến i sẽ bị thay đổi giá trị lung tung không kiểm sát được đâu
    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<math.h>
    4. #define max 100
    5. int i;
    6. void nhapmang(int a[],int n);
    7. void xuatmang(int a[], int n);
    8. int nguyento(int k);
    9. void vitringuyento(int a[], int n);

    Ví dụ chỗ này bị lỗi.
    Khi gọi: vitringuyento(a,n);
    C Code:
    1. void vitringuyento(int a[], int n)
    2. {
    3.     for(i=0;i<n;i++)
    4.     {
    5.         if(nguyento(a[i])) // ở đây gọi hàm nguyento
    6.         printf("\nVi tri cua cac so nguyen to trong mang la: %d",i);
    7.     }
    8. }
    9. // Hàm nguyên tố lại sử dụng biến i, bây giờ ví dụ i = 0 lúc mới gọi hàm nguyento
    10. int nguyento(int k)
    11. {
    12.     int ok=1;
    13.     for(i=2;i<(int)sqrt(k);i++) // Ngay chỗ này i được gán bằng 2, (trước đó i = 0) sai chỗ này!!!
    14.     if(k%i==0)
    15.     {
    16.         ok=0;
    17.         break;
    18.        
    19.     }  
    20.     if(ok=1)
    21.     return 1;
    22. }
    => cách sửa:
    Hãy khai báo i ngay trước khi sử dụng.
    ví dụ
    C Code:
    1. int i;
    2. for(i=0;i<n;i++)
    hoặc
    C Code:
    1. for(int i=0;i<n;i++)
    Đã được chỉnh sửa lần cuối bởi trandatnh : 23-02-2013 lúc 04:36 PM.

  5. #5
    Ngày gia nhập
    02 2010
    Bài viết
    113

    Trích dẫn Nguyên bản được gửi bởi vudangthinh Xem bài viết
    Em vẫn không hiểu, anh giải thích kỹ giúp em với ạ.
    biến i khai báo như vậy là biến toàn cục. Nó sẽ "đi xuyên suốt" trong chương trình của bạn.
    như cái hàm
    C Code:
    1. void vitringuyento(int a[], int n)
    2. {
    3.     for(i=0;i<n;i++)//ở đây i=0
    4.     {
    5.         if(nguyento(a[i]))//vào hàm kiểm tra nguyên tố thì
    6.                                    // ví dụ như nó chỉ vào dc vòng thoy đi thì i đã được set =2 rồi
    7.                                      //chạy debug thử cái thấy ngay
    8.         printf("\nVi tri cua cac so nguyen to trong mang la: %d",i);//thì xuống đây i =2
    9.     }
    10. }

    cẩn thận với việc khai báo như vậy!!!
    trong C:
    C Code:
    1.          int i;
    2.          for(i=0;i<n;i++)
    trong C++:
    C++ Code:
    1.          for(int i=0;i<n;i++)

    ngoài ra xem lại thuật toán tìm số nguyên tố, và cái link út để bên trên!!!
    p/s:
    nếu mới bắt đầu học thì thử trả lời câu hỏi này xem(chỉ cho vui thoy):
    C Code:
    1. void main()
    2. {
    3.        int utkung=0;// vậy biến này là biến toàn cục hay cục bộ
    4.                            // chỉ đố chủ topic thoy, mấy anh chị đại đừng chém em. ok?
    5.        //...
    6. }

  6. #6
    Ngày gia nhập
    10 2012
    Bài viết
    3

    Mặc định Tìm lỗi sai trong bài tập mảng

    Em sửa được rồi. Cảm ơn các anh nhiều ạ.
    Biến trên là cục bộ

  7. #7
    Ngày gia nhập
    01 2013
    Bài viết
    5

    Trích dẫn Nguyên bản được gửi bởi vudangthinh Xem bài viết
    Các anh giúp em xem bài này sai ở đâu với ạ:
    Đề bài: Viết hàm in vị trí các phần tử nguyên tố trong mảng các số nguyên.

    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<math.h>
    4. #define max 100
    5. int i;
    6. void nhapmang(int a[],int n);
    7. void xuatmang(int a[], int n);
    8. int nguyento(int k);
    9. void vitringuyento(int a[], int n);
    10.  
    11. int main()
    12. {
    13.     int a[max],n;
    14.     printf("\nNhap n: ");
    15.     scanf("%d",&n);
    16.     nhapmang(a,n);
    17.     xuatmang(a,n);
    18.     vitringuyento(a,n);
    19.    
    20.     getch();
    21. }
    22.  
    23. void nhapmang(int a[],int n)
    24. {
    25.     for(i=0;i<n;i++)
    26.     {
    27.         printf("a[%d]= ",i);
    28.         scanf("%d",&a[i]);
    29.     }
    30. }
    31.  
    32. void xuatmang(int a[], int n)
    33. {
    34.     printf("\nNoi dung mang:");
    35.     for(i=0;i<n;i++)
    36.     printf("%d    ",a[i]);
    37. }
    38.  
    39.  
    40.  
    41. int nguyento(int k)
    42. {
    43.     int ok=1;
    44.     for(i=2;i<(int)sqrt(k);i++)
    45.     if(k%i==0)
    46.     {
    47.         ok=0;
    48.         break;
    49.        
    50.     }  
    51.     if(ok=1)
    52.     return 1;
    53. }
    54.  
    55. void vitringuyento(int a[], int n)
    56. {
    57.     for(i=0;i<n;i++)
    58.     {
    59.         if(nguyento(a[i]))
    60.         printf("\nVi tri cua cac so nguyen to trong mang la: %d",i);
    61.     }
    62. }
    Sao không ai phát hiện ra
    C Code:
    1.  if(ok=1)

  8. #8
    Ngày gia nhập
    01 2013
    Nơi ở
    Học viện Kỹ thuật Quân Sự
    Bài viết
    247

    Trích dẫn Nguyên bản được gửi bởi vudangthinh Xem bài viết
    Các anh giúp em xem bài này sai ở đâu với ạ:
    Đề bài: Viết hàm in vị trí các phần tử nguyên tố trong mảng các số nguyên.

    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<math.h>
    4. #define max 100
    5. [COLOR="red"]int i;[/COLOR]
    6. void nhapmang(int a[],int n);
    7. void xuatmang(int a[], int n);
    8. int nguyento(int k);
    9. void vitringuyento(int a[], int n);
    10.  
    11. int main()
    12. {
    13.     int a[max],n;
    14.     printf("\nNhap n: ");
    15.     scanf("%d",&n);
    16.     nhapmang(a,n);
    17.     xuatmang(a,n);
    18.     vitringuyento(a,n);
    19.    
    20.     getch();
    21. }
    22.  
    23. void nhapmang(int a[],int n)
    24. {
    25.     for(i=0;i<n;i++)
    26.     {
    27.         printf("a[%d]= ",i);
    28.         scanf("%d",&a[i]);
    29.     }
    30. }
    31.  
    32. void xuatmang(int a[], int n)
    33. {
    34.     printf("\nNoi dung mang:");
    35.     for(i=0;i<n;i++)
    36.     printf("%d    ",a[i]);
    37. }
    38.  
    39.  
    40.  
    41. int nguyento(int k)
    42. {
    43.     [COLOR="Red"]int ok=1;
    44.     for(i=2;i<(int)sqrt(k);i++)
    45.     if(k%i==0)
    46.     {
    47.         ok=0;
    48.         break;
    49.        
    50.     }  
    51.     if(ok=1)
    52.     return 1;[/COLOR]
    53. }
    54.  
    55. void vitringuyento(int a[], int n)
    56. {
    57.     for(i=0;i<n;i++)
    58.     {
    59.         if(nguyento(a[i]))
    60.         printf("\nVi tri cua cac so nguyen to trong mang la: %d",i);
    61.     }
    62. }
    Code của bạn sau khi đã sửa lại, bạn xem được chưa:
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<math.h>
    #define max 100
    void nhapmang(int a[],int n);
    void xuatmang(int a[], int n);
    int nguyento(int k);
    void vitringuyento(int a[], int n);
    
    int main()
    {
        int a[max],n;
        printf("\nNhap n: ");
        scanf("%d",&n);
        nhapmang(a,n);
        xuatmang(a,n);
        vitringuyento(a,n);
        getch();
    }
    
    void nhapmang(int a[],int n)
    {
    	int i;
        for(i=0;i<n;i++)
        {
            printf("a[%d]= ",i);
            scanf("%d",&a[i]);
        }
    }
    
    void xuatmang(int a[], int n)
    {
    	int i;
        printf("\nNoi dung mang: ");
        for(i=0;i<n;i++)
        printf("%d ",a[i]);
    }
    
    
    
    int nguyento(int k)
    {
    	if (k <= 2)
    		return 1;
        int gioiHan = sqrt(k), i;
        for (i = 2; i <= gioiHan; i++)
        	if (k%i == 0)
        		return 0;
        return 1;
    }
    
    void vitringuyento(int a[], int n)
    {
    	int i;
    	printf ("\nCac vi tri la so nguyen to: ");
    	for (i = 0; i < n; i++)
    		if (nguyento(a[i]))
    			printf ("%d ",i);
    }
    Đã được chỉnh sửa lần cuối bởi bachgist : 24-02-2013 lúc 05:17 PM.
    Nếu cần giúp đỡ, hỗ trợ:
    Bài Tập. Đồ Án. Tools. Phần mềm. Liên hệ:
    Facebook: http://www.facebook.com/thuecodedoan
    Website: https://thuecodedoan.wordpress.com
    Email: thuecodedoan@gmail.com
    Sđt: 094.76.76.854

Quyền hạn của bạn

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