Announcement

Collapse
No announcement yet.

[chỉ dùng 1 vòng for]! Tìm phần tử MAX và số lần xuất hiện của pt đó!

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [C++] [chỉ dùng 1 vòng for]! Tìm phần tử MAX và số lần xuất hiện của pt đó!

    Hôm qua mình có đọc được trên group KTPM bài tập loại này: tuy nhiên, cũng ko ít bạn thắc mắc là bài này hơi "kỳ". "Kỳ" ở chỗ là làm sao chỉ dùng 1 vòng for để thực hiện được đồng thời 3 nhiệm vụ (nhập, đếm và tìm MAX). Cuối cùng topic đã dừng lại với một bài code hơi "lạ" và theo nhiều bạn đã nói bài code này quá "dài" và kiến thức không được phổ thông cho lắm! Ngoài ra, bài code cũng được một bạn đánh giá là phù hợp với chuẩn của Microsoft gì đó.... Và nó đây:

    BT : nhập mảng 1 chiều, xuất ra phần tử max, và số lần xuất hiện xủa
    max
    (DÙNG 1 VÒNG LẶP FOR)

    #include <stdio.h>
    #include <windows.h>
    #define MAX 100
    int main()
    {
    int a[MAX], n, max, sl;
    printf("nhap so phan tu : ");
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
    {
    printf("nhap a[%d] ", i + 1);
    scanf("%d", a + i);
    printf("\n");
    if (i == 0)
    {
    max = *(a + i);
    sl = 1;
    }
    else
    {
    if (*(a + i) > max)
    {
    max = *(a + i);
    sl = 1;
    }
    else
    {
    if (*(a + i) == max)
    {
    sl += 1;
    }
    }
    }
    }
    printf("\n max la %d, so luong %d \n", max, sl);
    system("pause");
    return 0;
    }


    Sau gần 1h đồng hồ đọc từng dòng code trên đây mình chẳng hiểu gì cả! Ko hiểu được ý đồ của bạn ấy là gì? Và kiểu gọi địa chỉ scanf("%d", a+1) cùng thư viện <window.h> ko biết bạn ấy học ở đâu ra. Nó quá cao siêu chăng? Mình nghĩ nó chỉ là kiến thức của người học trước thì biết trước thôi!
    In my opinion, trong lớp học đến đâu thì chỉ áp dụng giới hạn của lượng kiến thức ấy có lẽ sẽ hay hơn rất nhiều! Sau một hồi tra tài liệu mình đã tìm thấy đáp số
    tối ưu cho bài này. Đặt biệt, chỉ dùng ~ kiến thức phổ thông thì cũng có thể thực hiện tốt, thậm chí còn ngắn hơn bài trên một chút nữa!. Tùy theo cảm nhận của các bạn thôi!
    Ý tưởng trong cuốn sách như sau:
    - Đặt vấn đề nếu chỉ dùng một vòng for thì việc nhập vào một mảng, quá trình đếm và tìm MAX phải diễn ra đồng thời trong vòng lặp! Ta sẽ tiến hành cả 3 quá trình trong từng lần nhập các phần tử của mảng. Ví dụ, khi nhập a[1] thì đồng thời các quá trình tìm MAX, quá trình đếm cũng được lồng ghép vào đây, cho đến khi cả 3 quá trình hoàn tất. Tiếp đó, trong quá trình nhập a[2] cũng diễn ra đồng thời 2 quá trình trên, vòng for sẽ cứ tiếp diễn như thế cho đến a[n].
    Chú ý, sau mỗi quá trình thì giá trị "MAX và dem" có một giá trị cụ thể.


    Và cuối cùng là đoạn code:

    #include<stdio.h>
    #include<conio.h>
    main()
    {
    int i, a[20], n, max, dem;
    printf("So phan tu = "); scanf("%d",&n);
    printf("Nhap a[1] = "); scanf("%d",&a[0]);
    dem = 0;
    max = a[0];
    for(i=1;i<n;i++)
    {
    printf("Nhap a[%d] = ",i+1);
    scanf("%d",&a[i]);
    if(a[i] == max)
    dem++;
    if(a[i]>max)
    {
    max = a[i];
    dem = 1;
    }
    }
    printf("MAX = %d, gia tri nay da xuat hien %d lan trong mang.", max, dem);
    getch();
    }
    Last edited by lytieulong_269; 14-11-2011, 04:58.

  • #2
    trời ah, chi vậy
    người ta dùng windows.h là để gọi hàm "system" ấy mà.
    thik người này vì họ muốn được ở cấp độ cao hơn, tạo một nền tảng cho những ngôn ngữ phức tạp hơn sau này!
    đừng trách móc, chê bai bậy bạ nha Pro, Pro có nghĩ mình là người đó ko? ko phải nhé!
    Thân!

    Comment


    • #3
      Originally posted by lytieulong_269 View Post
      Cuối cùng topic đã dừng lại với một bài code hơi "lạ" và theo nhiều bạn đã nói bài code này quá "dài" và kiến thức không được phổ thông cho lắm! Ngoài ra, bài code cũng được một bạn đánh giá là phù hợp với chuẩn của Microsoft gì đó.... Và nó đây:


      Sau gần 1h đồng hồ đọc từng dòng code trên đây mình chẳng hiểu gì cả! Ko hiểu được ý đồ của bạn ấy là gì? Và kiểu gọi địa chỉ scanf("%d", a+1) cùng thư viện <window.h> ko biết bạn ấy học ở đâu ra. Nó quá cao siêu chăng? Mình nghĩ nó chỉ là kiến thức của người học trước thì biết trước thôi!
      In my opinion, trong lớp học đến đâu thì chỉ áp dụng giới hạn của lượng kiến thức ấy có lẽ sẽ hay hơn rất nhiều! Sau một hồi tra tài liệu mình đã tìm thấy đáp số
      tối ưu cho bài này. Đặt biệt, chỉ dùng ~ kiến thức phổ thông thì cũng có thể thực hiện tốt, thậm chí còn ngắn hơn bài trên một chút nữa!.
      1. <windows.h> thì không phải là thư viện chuẩn nhưng bài của bạn gọi <conio.h> cũng không phải thư viện chuẩn nên rốt cục chẳng hơn gì.
      2. *(a+i) là kiến thức cơ bản về con trỏ, không có gì là lạ
      3. Không nên đánh giá code qua việc nó dài hay ngắn, dài mà chạy nhanh, dễ đọc còn tốt gấp mấy lần ngắn.
      4. Tinh thần học hỏi vầy là tốt nhưng lần sau code thì dùng thẻ [code] hoặc thẻ [php] chứ không phải thẻ [color] để post nha.

      Comment


      • #4
        Mình nhận xét đoạn code thứ nhất: Thể hiện trình độ code đang cố vươn tới đẳng cấp pro (Vì đa số SV rất sợ con trỏ). Nhưng mà vẫn còn đang vướng víu về logic suy nghĩ và nếu không sửa đổi ngay từ lúc này thì bạn đó sẽ bị tẩu hỏa nhập ma chắc luôn. Và nếu lầm đường lạc lối có thể sau này viết code rác rất nhiều. Thứ 2 là nó chẳng có phù hợp gì với chuẩn của Microsoft cả. Thứ 3 là bạn này nếu đọc topic này thì mình có lời khuyên là bạn nên dùng p++ thay vì a + i bởi vì a + i chẳng khác gì a[i] cả. Mà dù bạn có tối ưu hơn thì cũng chả nhanh hơn bao nhiêu còn code thì lại phức tạp lên
        Đoạn code thứ 2 : Vẫn chưa sửa đc bug sau đây: (nếu n = 1 000 000 thì sao ? Bởi vì trong máy vi tính thì có thể dùng chương trình để thay người dùng nhập vào bàn phím.) Ngoài ra lại tạo thêm 1 bug là dãy 9 8 7 6 5 4 3 2 1 sẽ cho MAX = 9 và Dem = 0
        @Bạn Hiếu : Mình không hiểu ý bạn. Ý bạn là pro thì phải code phức tạp ? Nếu vậy quan niệm bạn hơi bị sai lầm đấy vì pro thì code ngắn và chuẩn. Ngắn để dễ debug. Cùng 1 bài code 600 trong và code 100 dòng thì cái nào dễ debug hơn ? Mà cũng chưa chắc đoạn 100 dòng chạy chậm hơn đâu Mà cũng chưa chắc thằng code 100 dòng gà hơn đâu. Code dài không có khó. Mà code ngắn mới khó )

        Code:
        #include <stdio.h>
        #include <conio.h>
        int main()
        {
            int max = 0,num = 0,t,i,n;
            printf("So phan tu = "); scanf("%d",&n);
            for (i = 1;i <= n;++i)
            {
                printf("a[%d] = ",i);scanf("%d",&t);
                if (max < t || num == 0)
                {
                        max = t;
                        num = 1;
                }
                else if (max == t) ++num;
            }
            if (num == 0) printf("Mảng rỗng\n"); else printf("Max = %d, num = %d\n", max, num);
            getch();
            return 0;
        }
        Last edited by 09520019; 14-11-2011, 12:53.
        Khoảng cách giữa bạn và ước mơ của bạn là bao xa ?

        Comment


        • #5
          Sau gần 1h đồng hồ đọc từng dòng code trên đây mình chẳng hiểu gì cả! Ko hiểu được ý đồ của bạn ấy là gì? Và kiểu gọi địa chỉ scanf("%d", a+1) cùng thư viện <window.h> ko biết bạn ấy học ở đâu ra. Nó quá cao siêu chăng? Mình nghĩ nó chỉ là kiến thức của người học trước thì biết trước thôi!
          In my opinion, trong lớp học đến đâu thì chỉ áp dụng giới hạn của lượng kiến thức ấy có lẽ sẽ hay hơn rất nhiều! Sau một hồi tra tài liệu mình đã tìm thấy đáp số
          tối ưu cho bài này. Đặt biệt, chỉ dùng ~ kiến thức phổ thông thì cũng có thể thực hiện tốt, thậm chí còn ngắn hơn bài trên một chút nữa!. Tùy theo cảm nhận của các bạn thôi!
          Nếu ko học KHMT chắc bạn phải theo thầy toàn 1 khóa phân tích thiết kế thuật toán thôi

          Comment


          • #6
            Trời ạ! ý mình ko phải chê bai đoạn code này hay gì! Mà là rằng post một đoạn code như thế trong một forum toàn ~ bạn mới làm quen với C thì ai có thể hiểu được chứ và post nó để nhằm mục đích gì?? Để thể hiện mình là một PRO cho mọi người biết đến hay sao!

            Comment


            • #7
              Đoạn code trên ko có vấn đề gì!
              Mình chép nhầm dem = 1 mới đúng!
              #include<stdio.h>
              #include<conio.h>
              main()
              {
              int i, a[20], n, max, dem;
              printf("So phan tu = "); scanf("%d",&n);
              printf("Nhap a[1] = "); scanf("%d",&a[0]);
              dem = 1;
              max = a[0];
              for(i=1;i<n;i++)
              {
              printf("Nhap a[%d] = ",i+1);
              scanf("%d",&a[i]);
              if(a[i] == max)
              dem++;
              if(a[i]>max)
              {
              max = a[i];
              dem = 1;
              }
              }
              printf("MAX = %d, gia tri nay da xuat hien %d lan trong mang.", max, dem);
              getch();
              }

              Comment


              • #8
                Originally posted by lytieulong_269 View Post
                Trời ạ! ý mình ko phải chê bai đoạn code này hay gì! Mà là rằng post một đoạn code như thế trong một forum toàn ~ bạn mới làm quen với C thì ai có thể hiểu được chứ và post nó để nhằm mục đích gì?? Để thể hiện mình là một PRO cho mọi người biết đến hay sao!
                Người ta code để làm gì thì kệ người ta. Có thể thằng bạn em nó code để nó nhớ, để nó luyện tập, để thử nghiệm kiến thức mới xem có vận dụng được không, và nhất là ĐỂ NÓ HỌC, chứ nó không có nghĩa vụ code để làm mẫu cho cả lớp. Share là tự giác bản thân chứ không phải chuyện ép buộc. Post code dở thì bị chê là ngu, vận dụng ít kiến thức vào để ôn bài cho mau nhớ thì bị chửi là "thể hiện cái gì đó". Ép nhau kiểu đó sống sao nổi. Bài này dễ, ngó qua ngó lại code cũng không quá 1 trang mìn hình, có đáng để phải reg nguyên một cái nick không phải MSSV để lên đây mà "nói khéo" và mặt nhau vậy không.

                PS: Giờ này mà vẫn còn làm bài này thì chắc là năm nhất nên tôi gọi em là em hy vọng không sai. Thứ hai là đã nói code thì cho vào tag [php] hoặc tag [code] cho dễ đọc rồi mà

                Comment

                LHQC

                Collapse
                Working...
                X