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

Đề tài: Bài tập menu, ngôn ngữ C?

  1. #1
    No Avatar
    Aptechite Khách

    Mặc định Bài tập menu, ngôn ngữ C?

    Cái bài menu này em làm đã hai hôm rồi mà vẫn chưa ổn. Sau rất nhiều lần sửa của em thì các phần khác chắc là ok rồi (em nghĩ là ok rồi nhưng vẫn chưa kiểm tra kĩ) nhưng riêng cái hàm tìm số lẻ lớn nhất đến giờ em vẫn không biết là sai ở đâu, mà nó toàn in ra những giá trị "trời ơi". Đôi khi sau khi nhập xong một lượt lại còn không nhập được tiếp nữa mới chết chứ(Chắc vấn đề không chỉ nằm ở hàm tìm số lẻ lớn nhất).
    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. #include <stdlib.h>
    4.  
    5. //1 Nhap vao cac phan tu cua mang
    6. int *nhapso(int n,int *p)
    7. {
    8. int i;
    9. p=(int*)malloc(n*sizeof(int));
    10. for(i=0;i<n;i++)
    11.    {
    12.       printf("\na[%d]=",i);
    13.       scanf("%d",p+i);
    14.    } return (p);
    15. }
    16. //2 chuyen doi
    17. void modify(int n,int *p)
    18. {
    19.     int change;int i;
    20.     printf("\nBan muon thay doi phan tu thu may: ");
    21.     scanf("%d",&i);
    22.     if((i>0)&&(i<n))
    23.     {
    24.         printf("\nBan muon chuyen phan tu %d thanh so may: ",p[i]);
    25.         scanf("%d",&change);
    26.         p[i]=change;
    27.     }
    28.     else printf("\nNhap lai so can doi");
    29. }
    30. //3 Tim so le lon nhat
    31. void maxodd(int n,int *p)
    32. {
    33. int i, max=0,j=0,*tmp;
    34. for (i=0;i<n;i++)
    35. if((p[i]%2)!=0)
    36.       {
    37.          tmp[j]=p[i];
    38.          j++;
    39.       }
    40. if((tmp[0]%2)!=0)
    41.   {
    42.   max=tmp[0];
    43.   for(j=0;j<=i;j++)
    44.       {
    45.           if(max<p[j])
    46.           max=p[j];
    47.       }
    48.     printf("\nSo le lon nhat la: %d",max);
    49.     getch();
    50.   }
    51. else
    52.     printf("\nMang khong co phan tu le");
    53.     getch();
    54. }
    55. //4 tong cua tat ca cac phan tu trong mang
    56. int sum (int n,int *p){
    57. int sum=0; int i;
    58. for(i=0;i<n;i++)
    59.     sum=sum+p[i];
    60. return sum;
    61. }
    62. //5 tong cua tat ca cac so chan
    63. int sumeven(int n,int *p)
    64. {
    65. int sumeven=0,i;
    66. for(i=0;i<n;i++)
    67.   {
    68.     if((p[i]%2)==0)
    69.     sumeven =sumeven+p[i];
    70.   }
    71. return sumeven;
    72. }
    73. //6 tong cua tat ca cac so nguyen to
    74. int prime(int n)
    75. {
    76. int ok=0; int i;
    77.  for(i=2;i<n;i++)
    78.   if((n%i)==0)
    79.     {
    80.       ok=1;
    81.       break;
    82.     }
    83. if(ok==1) return 1;//not prime number
    84.  
    85. else return 0;//prime number
    86. }
    87. int sumprim(int n,int *p)
    88. {
    89. int i,sumprim=0;
    90. for(i=0;i<n;i++)
    91.     if(prime(p[i])==0) sumprim=sumprim+p[i];
    92. return sumprim;
    93. }
    94. void main()
    95. {
    96. int n, *p,sl,exit=0;
    97.    do{
    98.         clrscr();
    99.         printf("\n\n  Menu");
    100.         printf("\n\n1.Nhap vao mot mang so nguyen");
    101.         printf("\n\n2.Chuyen doi mot phan tu cua mang");
    102.         printf("\n\n3.Tim so le lon nhat");
    103.         printf("\n\n4.Tim tong cua tat ca phan tu cua mang");
    104.         printf("\n\n5.Tim tong cua cac so chan");
    105.         printf("\n\n6.Tim tong cua cac so nguyen to");
    106.         printf("\n\n7.Exit\n");
    107.         scanf("%d",&sl);
    108.         switch(sl){
    109.         case 1: printf("\nSo phan tu can nhap: ");
    110.                 scanf("%d",&n);
    111.                 p=nhapso(n,p);
    112.                 break;
    113.         case 2: modify(n,p);
    114.                 break;
    115.         case 3: maxodd(n,p);
    116.                 break;
    117.         case 4: sum(n,p);
    118.                 printf("\nTong cua tat ca cac phan tu cua mang la: %d",sum(n,p));
    119.                 getch();
    120.                 break;
    121.         case 5: sumeven(n,p);
    122.                 printf("\nTong cua tat ca cac so chan la: %d",sumeven(n,p));
    123.                 getch();
    124.                 break;
    125.         case 6: sumprim(n,p);
    126.                 printf("\nTong cua tat ca cac so nguyen to la: %d",sumprim(n,p));
    127.                 getch();
    128.                 break;
    129.         case 7: exit=1; break;
    130.         default: printf("\nBan hay chon lai tu 1-7");  getch();
    131.         }
    132.    }while(exit!=1);
    133. }

  2. #2
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Cái này của bạn , mình trích ra để phân tích nè :
    C Code:
    1. //3 Tim so le lon nhat
    2. void maxodd(int n,int *p)
    3. {
    4. int i, max=0,j=0,*tmp;
    5. for (i=0;i<n;i++)
    6. if((p[i]%2)!=0)
    7.       {
    8.          tmp[j]=p[i];
    9.          j++;
    10.       }
    11. if((tmp[0]%2)!=0)
    12.   {
    13.   max=tmp[0];
    14.   for(j=0;j<=i;j++)
    15.       {
    16.           if(max<p[j])
    17.           max=p[j];
    18.       }
    19.     printf("\nSo le lon nhat la: %d",max);
    20.     getch();
    21.   }
    22. else
    23.     printf("\nMang khong co phan tu le");
    24.     getch();
    25. }

    1. Bạn để ý nhé : bạn lấy các phần tử lẻ gán vào mảng *tmp : >> sau khi gán hết thì >> tmp[] chỉ có j-1 phần tử
    toàn số lẻ nên câu if : if ( ( tmp[0]%2) != 0 ) === kô cần thiết
    2. Vì chỉ có j phần tử nên vòng for chỉ chạy từ 0 -> j-1

    Có gì sai sửa giùm nha ^o^!
    Đã được chỉnh sửa lần cuối bởi Xcross87 : 07-11-2006 lúc 07:40 AM.
    None!

  3. #3
    Ngày gia nhập
    10 2006
    Nơi ở
    Hà Nội
    Bài viết
    146

    Có thể các nhận xét của Pete là đúng rồi. Nhưng mình có góp ý như thế này.
    Thao tác thứ nhất:
    for (i=0;i<n;i++)
    if((p[i]%2)!=0)
    {
    tmp[j]=p[i];
    j++;
    }
    là để lọc ra mảng số lẻ, nếu mảng này không có phần tử nào thì trả lại giá trị False cho hàm (Không có phần tử lẻ.)
    Việc thứ hai, sau khi có mảng các số lẻ thì việc tìm phần tử max của mảng (j+1) phần tử là hoàn toàn đơn giản.
    for(i=0;i<=j+1;i++)
    {
    if(max<tmp[i])
    max=temp[i];
    }
    Và cuối cùng là in ra phần tử lẻ lớn nhất là max.

    Cái chương trình của bạn mình thấy rườm ra quá à.

  4. #4
    No Avatar
    Aptechite Khách

    Code:
    toàn số lẻ nên câu if : if ( ( tmp[0]%2) != 0 ) === kô cần thiết
    Cái phần này là để phòng trường hợp mảng nhập vào toàn số chẵn. Nhưng vấn đề chính ở đây là em không hiểu tại sao cái hàm tìm số lẻ lớn nhất toàn in ra những giá trị lăng nhăng, không biết là do chương trình em viết bị sai hay là cái
    Turbo C++ 3.0 của em nó bị trục trặc nhỉ?

  5. #5
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Mình viết hàm khác để tìm số lẻ lớn nhất đây :
    C Code:
    1. void maxodd(int list[], int quantity)
    2. {
    3.      int i, j = 0,oddarray[100] ,max = 0;
    4.      // assign odd value
    5.      for ( i = 0 ; i < quantity ; i++ )
    6.          if ( list[i] % 2 != 0 )
    7.             oddarray[j++] = list[i];
    8.      // find max
    9.      for ( i = 0 ; i < j ; i++ )
    10.          if ( oddarray[i] > max ) max = oddarray[i];
    11.      // result
    12.      if ( max == 0 ) printf("\n Mang ko co phan tu le .. ");
    13.      else printf("\n So le lon nhat = %d " , max );
    14. }

    Giá trị max = 0 là default , nếu ko có phần tử lẻ thì nó không thay đổi vì chẳng được gán cho cái gì cho nên mình mới nói :
    Code:
            if ( tmp[0] %2 != 0 )
    là kô cần thiết .

    Khi bạn đã lọc ra được các phần tử lẻ rồi thì không cần quan tâm phần tử chẵn làm gì ^o^
    Đã được chỉnh sửa lần cuối bởi Xcross87 : 07-11-2006 lúc 10:04 AM.
    None!

  6. #6
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Mặc định Bài tập menu, ngôn ngữ C?

    Thêm nữa : trong hàm của bạn kô thấy giá trị khởi tạo cho tmp[] >> thành ra nếu như cả mảng p[] toàn số chẵn >> tmp[0] = cái số to đùng nếu xài Dev-C++ nếu xài borland chắc có warning về initializing .

    Nhìn kĩ hơn vào bài của bạn mình thấy cái vô lý :
    Bạn lọc ra các phấn tử lẻ vào tmp[] nhưng sau đó để lọc ra số lớn nhất bạn dùng phép so sánh
    Code:
     if(max<p[j])
    		  max=p[j];
    >> so sánh luôn cả số chẵn trong mảng ban đầu ?_?

    Mình chỉ góp ý vậy thôi . Chúc bạn sớm complete nha ^0^
    None!

Các đề tài tương tự

  1. Dựng 1 menu Asp.net bằng thẻ <ul> <li> hay Control [ Menu , SiteMap , Repeater , Treeview]
    Gửi bởi teodainhan trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 8
    Bài viết cuối: 30-05-2013, 01:04 PM
  2. Source Code menu thêm item vào Menu Context
    Gửi bởi babyboy_pk trong diễn đàn Dự án & Source code C#, ASP.NET
    Trả lời: 0
    Bài viết cuối: 25-03-2013, 01:56 PM
  3. Googlechomre không hiển thị menu con khi dùng sitemapth để load menu đa cấp
    Gửi bởi thitcholaotien trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 6
    Bài viết cuối: 09-04-2012, 02:19 PM
  4. Tạo menu theo dạng Menu cha - con như thế nào?
    Gửi bởi tuanvu199x trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 3
    Bài viết cuối: 06-11-2011, 10:45 PM
  5. Hight light menu trong C như của Menu HirentBoot?
    Gửi bởi manhdt trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 08-09-2011, 09:54 AM

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