Come as guests, stay as family.

I ♥ 4MGHC


Hướng dẫn sử dụng diễn đàn Với mong muốn có một Website hỏi đáp chất lượng 4MGHC đã ra đời. Đây là cộng đồng hỏi đáp dành cho lập trình viên, sinh viên, các bạn ưu thích lập trình... Việt Nam. Huy vọng các bậc tiền bối, các bằng hữu gần xa chung tay chia sẽ, giúp đỡ, giải đáp các thắc mắc trên Website. Cùng nhau củng cố, đóng góp cho sự nghiệp phát triển thông tin, công nghệ của đất nước.
Trong diễn đàn bạn có thể
  1. Hỏi đáp trong diễn đàn
  2. Đánh giá và like bài post
Đăng ký

Số người đang xem trên diễn đàn: 1107
12
  1. Tân thế giới
    Posts:
    784319
    Vote:
    2
    Like:
    4
    Liệt kê các phần tử lớn hơn tất cả các phần tử đứng trước nó trong mảng
    Image
    Image
    Users online on this topic: 1
    thu910
    Thành viên mới
    Ngày gia nhập: 01 2011
    Bài viết: 8
    -------------------------
    Liệt kê các phần tử lớn hơn tất cả các phần tử đứng trước nó trong mảng
    Bài này mình test thử rồi! Nhưng thấy cách giải nó hơi dài.

    Mọi người có ý tưởng nào khác chia sẻ với mình nhé!

    C Code:
    Code: Select all

    Lựa chọn code | Ẩn/Hiện code
    #include"stdio.h"
    #include"conio.h"
    // s là mảng thực
    // a là mảng để xác định các giá trị không thỏa mãn
    // t= số các giá trị không thỏa mãn
    //n = số phần tử của mảng s[]

    int tim(float*s,int *a, int n)
    {int i,j,t=0;
    for( i=1;i<n;i++)
    {a[i]=0;
    for(j=0;j<i;j++)// so sánh s[i] với phần tử đứng trước nó
    if(s[j]>=s[i]){a[i]=1;t++; break;}
    //Nếu tìm thấy giá trị không thỏa mãn thì gán a[i]=1; t tăng 1 và thoát ra quay lại vong for của i
    }
    return t;
    }
    void main()
    { float s[100];int a[100],n,i;
    clrscr();

    printf("\nBan muon nhap bao nhieu phan tu?\n");scanf("%d",&n);

    printf("\nNhap chuoi:\n");
    for(i=0;i<n;i++)scanf("%f",&s[i]);

    if( tim(s,a,n)==n-1){printf("Khong ton tai.");getch();return;}

    printf("Cac phan tu can tim la:\n");
    for(i=1;i<n;i++)
    if(a[i]==0)printf("s[%d] = %0.2f\n",i,s[i]);

    getch();
    }

    Đã được chỉnh sửa lần cuối bởi
    Image 0
    Image
  2. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    birthis
    Thành viên nhiệt tình
    Ngày gia nhập: 03 2010
    Nơi ở: Nơi nào đó trong vũ trụ
    Bài viết: 550
    -------------------------
    Thử cách này xem:

    C Code:
    Code: Select all

    Lựa chọn code | Ẩn/Hiện code
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>

    void findElem(float* a,int n)
    {
    float max;
    if (n<1)
    {
    printf("\nMang rong");
    }
    else
    {
    printf("\nDanh sach cac phan tu lon hon tat ca cac phan tu truoc no la:");
    max = a[0];
    printf("%6.2f",a[0]);//Nếu không lấy phần tử đầu tiên thì bỏ nó đi
    for (int i=1;i<n;i++)
    {
    if (a[i] > max)
    {
    printf("%6.2f",a[i]);
    max = a[i];
    }
    }
    }
    }
    int main()
    {
    float* a;
    int n,i;
    printf("\nNhap so phan tu: ");
    scanf("%d",&n);

    a = (float*) malloc(sizeof(float)*n);
    if (a == NULL)
    {
    printf("\nBum");
    fflush(stdin);
    getch();
    return 0;
    }

    printf("\nNhap mang:");
    for(i=0;i<n;i++)
    {
    printf("\na[%d] = ",i);
    scanf("%f",&a[i]);
    }

    findElem(a,n);
    free(a);
    getch();
    }

    __________________

    Gió thu lạnh lẽo hắt hiu lòng!
    Đã được chỉnh sửa lần cuối bởi
    Image 0
    Image
    Image
  3. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    kitti
    Nguy hiểm cấm nhìn
    Ngày gia nhập: 09 2010
    Nơi ở: Hà Nội
    Bài viết: 382
    -------------------------
    Trích dẫn:
    Nguyên bản được gửi bởi thu910
    Quote: Select all

    Bài này mình test thử rồi! Nhưng thấy cách giải nó hơi dài.

    Mọi người có ý tưởng nào khác chia sẻ với mình nhé!
    C Code:

    Code: Select all

    Lựa chọn code | Ẩn/Hiện code
    #include"stdio.h"
    #include"conio.h"
    // s là mảng thực
    // a là mảng để xác định các giá trị không thỏa mãn
    // t= số các giá trị không thỏa mãn
    //n = số phần tử của mảng s[]

    int tim(float*s,int *a, int n)
    {int i,j,t=0;
    for( i=1;i<n;i++)
    {a[i]=0;
    for(j=0;j<i;j++)// so sánh s[i] với phần tử đứng trước nó
    if(s[j]>=s[i]){a[i]=1;t++; break;}
    //Nếu tìm thấy giá trị không thỏa mãn thì gán a[i]=1; t tăng 1 và thoát ra quay lại vong for của i
    }
    return t;
    }
    void main()
    { float s[100];int a[100],n,i;
    clrscr();

    printf("\nBan muon nhap bao nhieu phan tu?\n");scanf("%d",&n);

    printf("\nNhap chuoi:\n");
    for(i=0;i<n;i++)scanf("%f",&s[i]);

    if( tim(s,a,n)==n-1){printf("Khong ton tai.");getch();return;}

    printf("Cac phan tu can tim la:\n");
    for(i=1;i<n;i++)
    if(a[i]==0)printf("s[%d] = %0.2f\n",i,s[i]);

    getch();
    }


    bạn nên bỏ cái xác định không tồn tại thuật toán sẽ nhanh hơn. bởi trong mảng luôn luôn có phần tử đầu tiên lớn hơn tất cả các phần tử trước nó!
    __________________



    skype: hvphu2010

    Yahoo: hvphu2010

    Sdt: 0129 609 4567
    Image 0
    Image
    Image
  4. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    dragonbk91
    Thành viên tích cực
    Ngày gia nhập: 01 2011
    Bài viết: 116
    -------------------------
    Mình nghĩ thuật toán thì đã quá rõ ràng, chắc là bạn muốn rút ngắn code. mình làm thế này bạn xem thử xem được không:

    C Code:
    Code: Select all

    Lựa chọn code | Ẩn/Hiện code
    #include <stdio.h>
    #include <conio.h>

    int main(){
    int n,i,j,ok;
    float s[1000];
    printf("n= "); scanf("%d",&n);
    for(i=0;i<n;i++) scanf("%f",&s[i]);
    printf("cac phan tu can tim: \n");
    printf("s[%d] = %0.2f\n",0,s[0]);
    for(i=1;i<n;i++){
    ok=1;
    for(j=0;j<i;j++)
    if ( s[j] >=s[i]){
    ok=0;
    break;
    }
    if (ok) printf("s[%d] = %0.2f\n",i,s[i]);
    }
    getch();
    }

    __________________

    C++ Code:
    Code: Select all

    Lựa chọn code | Ẩn/Hiện code
    while ( you_live) {
    if (you_failed) try_again();
    else if ( you_won) find_new_challenge();
    }
    system("DEATH");
    return HELL;
    Image 0
    Image
    Image
  5. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    azurelonely
    Thành viên nhiệt tình
    Ngày gia nhập: 12 2010
    Nơi ở: Cần thơ
    Bài viết: 274
    -------------------------
    Tớ viết bài này thử

    Code:
    Code: Select all

    #include <stdio.h>
    #include <conio.h>

    char tim(float s[],int input)
    {
    char tim= 't';
    for (int i=0;i<input;i++)
    if (s[input]<=s[i])
    tim= 'f';
    return(tim);
    }
    void main()
    {
    float s[100];
    int n,i,vl=0;

    clrscr();
    printf("\nSo luong phan tu: ");scanf("%d",&n);
    for (i=0;i<n;i++)
    {
    printf("\nNhap phan tu thu %d: ",i+1);
    scanf("%f",&s[i]);
    }
    for (i=1;i<n;i++) if (tim(s,i)=='t') vl=1;

    if (vl==0) printf("Khong co phan tu de tim!"); else
    { 
    printf("Cac phan tu can tim la:");
    for(i=1;i<n;i++) if (tim(s,i)=='t') printf(" %.2f",s[i]);
    }
    getch();
    }
    Image 0
    Image
    Image
  6. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    thu910
    Thành viên mới
    Ngày gia nhập: 01 2011
    Bài viết: 8
    -------------------------
    Trích dẫn:
    Nguyên bản được gửi bởi dragonbk91
    Quote: Select all

    Mình nghĩ thuật toán thì đã quá rõ ràng, chắc là bạn muốn rút ngắn code. mình làm thế này bạn xem thử xem được không:

    C Code:

    Code: Select all

    Lựa chọn code | Ẩn/Hiện code
    #include <stdio.h>
    #include <conio.h>

    int main(){
    int n,i,j,ok;
    float s[1000];
    printf("n= "); scanf("%d",&n);
    for(i=0;i<n;i++) scanf("%f",&s[i]);
    printf("cac phan tu can tim: \n");
    printf("s[%d] = %0.2f\n",0,s[0]);
    for(i=1;i<n;i++){
    ok=1;
    for(j=0;j<i;j++)
    if ( s[j] >=s[i]){
    ok=0;
    break;
    }
    if (ok) printf("s[%d] = %0.2f\n",i,s[i]);
    }
    getch();
    }


    Cảm ơn dragonbk91 rất nhiều!

    Đúng là mình đang muốn rút ngắn code lại.

    Nhưng theo yêu cầu của thầy phải tách riêng hàm tính toán ra

    tức là phải sử dụng ít nhất 2 hàm

    Bạn có cách nào khác ko chỉ luôn cho mình nhé!
    Image 0
    Image
    Image
  7. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    cfan
    Thành viên chính thức
    Ngày gia nhập: 10 2010
    Bài viết: 60
    -------------------------
    Bạn xem thử code của mình.

    PHP Code:
    Code: Select all


    #include<stdio.h>
    #include<conio.h>

    static float s[100]; float max = s[0];
    int n;

    void Find(int k){
    if(k <= n){
    if(s[k] >= max){
    printf("%.2f ", s[k]); max = s[k];
    }
    Find(k + 1);
    }
    }

    int main(){
    void Find(int );
    printf("\n Total N = "); scanf("%d",&n);
    printf("\n Please input:\n");
    for(int i = 0; i < n; i++){
    printf(" S[%d]:", i); scanf("%f", &s[i]);
    }
    printf(" Result:\n ");
    Find(0);
    getch();
    return 0;
    }

    Image 0
    Image
    Image
  8. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    mp121209
    Newbie Member
    Ngày gia nhập: 08 2010
    Nơi ở: Moscow, Russia Federation
    Bài viết: 916
    -------------------------
    Trích dẫn:
    Nguyên bản được gửi bởi cfan
    Quote: Select all

    Bạn xem thử code của mình.

    PHP Code:

    Code: Select all


    #include<stdio.h>
    #include<conio.h>

    static float s[100]; float max = s[0];
    int n;

    void Find(int k){
    if(k <= n){
    if(s[k] >= max){
    printf("%.2f ", s[k]); max = s[k];
    }
    Find(k + 1);
    }
    }

    int main(){
    void Find(int );
    printf("\n Total N = "); scanf("%d",&n);
    printf("\n Please input:\n");
    for(int i = 0; i < n; i++){
    printf(" S[%d]:", i); scanf("%f", &s[i]);
    }
    printf(" Result:\n ");
    Find(0);
    getch();
    return 0;
    }



    Bài của bạn sử dụng ý tưởng đệ quy khá hay,

    Nhưng còn một số vấn đề

    1. Dùng biến tĩnh toàn cục không linh hoạt

    2. Trong hàm đệ quy Find của bạn, phép so sánh k <= n là không chính xác. Bạn gọi hàm từ 0, chạy đến cả n là n + 1 phần tử rồi! Nếu mảng của bạn chỉ có 100 phần tử, bạn nhập vào 100 phần tử, mà bạn lại gọi đến phần tử thứ 101 là không được phép!
    __________________

    Mời các bạn ghé thăm blog cá nhân của tôi
    Image 0
    Image
    Image
  9. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    mp121209
    Newbie Member
    Ngày gia nhập: 08 2010
    Nơi ở: Moscow, Russia Federation
    Bài viết: 916
    -------------------------
    Thực ra đây là một bài toán khá đơn giản, nó quy về việc tìm đoạn con tăng lớn nhất trong dãy. Hay nói cách khác là tìm phần tử đầu tiên giảm, so sánh số a với số đứng ngay sau nó là b, nếu a > b thì dừng, in ra các số từ đầu đến a!

    Mình dùng mảng động để giải quyết bài toán,

    Mong các bạn cho ý kiến nhé!

    C++ Code:
    Code: Select all

    Lựa chọn code | Ẩn/Hiện code
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <iterator>
    #include <functional>

    int main () {
    // declaration of array and iterators
    std::vector<int> vect;
    std::vector<int>::const_iterator First, Last;
    std::size_t size;

    // input size of array
    std::cout << "Enter size of array: ";
    std::cin >> size;

    // read data to array
    int val;
    for (std::size_t _size = 1; _size <= size; ++ _size)
    {
    std::cin >> val;
    vect.push_back(val);
    }

    // find elements, from which sequence is going down
    std::vector<int>::const_iterator it;
    First = vect.begin();
    Last = vect.end();
    it = adjacent_find(First, Last, std::greater<int>());

    // output result
    it != Last ? it ++ : it;
    std::ostream_iterator<int> OIt(std::cout, " ");
    std::copy(First, it, OIt);

    return 0;
    }

    __________________

    Mời các bạn ghé thăm blog cá nhân của tôi
    Image 0
    Image
    Image
  10. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    birthis
    Thành viên nhiệt tình
    Ngày gia nhập: 03 2010
    Nơi ở: Nơi nào đó trong vũ trụ
    Bài viết: 550
    -------------------------
    Trích dẫn:
    Nguyên bản được gửi bởi mp121209
    Quote: Select all

    Thực ra đây là một bài toán khá đơn giản, nó quy về việc tìm đoạn con tăng lớn nhất trong dãy. Hay nói cách khác là tìm phần tử đầu tiên giảm, so sánh số a với số đứng ngay sau nó là b, nếu a > b thì dừng, in ra các số từ đầu đến a!

    Mình dùng mảng động để giải quyết bài toán,

    Mong các bạn cho ý kiến nhé!


    Hình như là không đúng với đề bài: "liệt kê các phần tử". Bài của anh chỉ tìm ra đoạn đầu tiên, còn mấy đoạn sau thì không in ra được.

    Ví dụ với dãy này: 2 4 5 3 6

    Thì phải in ra là: 2 4 5 6
    __________________

    Gió thu lạnh lẽo hắt hiu lòng!
    Image 0
    Image
    Image
  11. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    mp121209
    Newbie Member
    Ngày gia nhập: 08 2010
    Nơi ở: Moscow, Russia Federation
    Bài viết: 916
    -------------------------
    Trích dẫn:
    Nguyên bản được gửi bởi birthis
    Quote: Select all

    Hình như là không đúng với đề bài: "liệt kê các phần tử". Bài của anh chỉ tìm ra đoạn đầu tiên, còn mấy đoạn sau thì không in ra được.

    Ví dụ với dãy này: 2 4 5 3 6

    Thì phải in ra là: 2 4 5 6


    Anh lại hiểu theo ý khác, các phần tử lớn hơn tất cả các phần tử đứng trước nó trong mảng, tức là tìm đoạn tăng đầu tiên thôi!

    Chẳng hiểu đề bài muốn cái gì nữa!
    __________________

    Mời các bạn ghé thăm blog cá nhân của tôi
    Image 0
    Image
    Image
12