Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

Đề tài: Nhờ mọi người tìm lỗi sai trong bài này

  1. #1
    Ngày gia nhập
    03 2007
    Nơi ở
    Nhà hát của những giấc mơ
    Bài viết
    33

    Mặc định Nhờ mọi người tìm lỗi sai trong bài này

    Cho dãy số , xác định dãy tăng , giảm hay ko tăng ko giảm

    nếu là dãy ko tăng ko giảm thì tìm dãy tăng con có nhiều phần tử nhất

    Đây là code
    Code:
    #include <iostream.h>
    #include <conio.h>
    void daymax(float x[],int m)
    {
    	int index,luu_size;
    	index=luu_size=0;
    	float luu[m];
    	for(int i=1;i<m;i++)
    	{
     		if(x[i-1]<=x[i])
    		{
    			index++;
    		}
    		if(x[i-1]>x[i])
    		{
    			luu_size++;
    			luu[luu_size-1]=index;
    			index=0;	
    		}	
    	}
    	float max=luu[0];
    	for(int i=0;i<luu_size;i++)
    	{
    		if(max<=luu[i])
    		{
    			max=luu[i];	
    		}
    	}
    	cout << "Day con tang lon nhat co " << max << " phan tu";
    }
    int main()
    {
    	int n;
    	cout << "n = "; cin >> n;
    	float a[n];
    	for(int i=0;i<n;i++)
    	{
    		cin >> a[i];	
    	}
    	//xac dinh day tang , giam , ko tang ko giam
    	float tang_index,giam_index;
    	tang_index=giam_index=a[0];
    	int tang,giam;
    	tang=giam=0;
    	for(int	i=1;i<n;i++)
    	{
    		if(tang_index<=a[i])
    		{
    			tang_index=a[i];
    			tang++;		
    		}
    		if(giam_index>=a[i])
    		{
    			giam_index=a[i];
    			giam++;	
    		}
    	}
    	if(tang==(n-1))
    		cout << "Day la day tang \n";	
    	else if(giam==(n-1))
    		cout << "Day la day giam \n";
    	//day ko tang ko giam , tim day tang con co nhieu phan tu nhat
    	else
    	{
    		cout << " Day ko tang ko giam \n";
    		daymax(a,n);
    	}
    	getch();
    }
    giả sử nhập dãy 1 2 3 5 2 3 9 2 5 6 1

    Thì đã xác định được dãy là ko tăng ko giảm , có hàm daymax() để in ra dãy con tăng lớn nhất nhưng sao nó ko in ra , mong mọi người giúp đỡ
    Đã được chỉnh sửa lần cuối bởi Xcross87 : 03-05-2007 lúc 06:37 AM. Lý do: Yêu cầu viết trong thẻ CODE

  2. #2
    Ngày gia nhập
    03 2007
    Bài viết
    6

    Để xác dinh dãy có tang hay giảm hay ko?thì ta nên dung địa chỉ đi để biết.
    Đấu tiên ta nên gán nó vào một mảng nào đó .sau đó ta xắp xếp cái mảng vừa gán ,sau đó ta so sánh giá trị của mảng vừa gán với mảng ban đầu.

  3. #3
    Ngày gia nhập
    03 2007
    Nơi ở
    Nhà hát của những giấc mơ
    Bài viết
    33

    Hix , bác nói rõ hơn được ko

    Em muốn xác định dãy tăng con có số phần tử lớn nhất trong dãy ko tăng ko

    giảm mà

  4. #4
    Ngày gia nhập
    02 2007
    Nơi ở
    TP.HCM - dưới cầu SG
    Bài viết
    12

    Bạn làm khá rối, chưa hiểu rõ ngôn ngữ C lắm và cách sử dụng các vòng lặp cũng chưa được thành thạo. Chẳng hạn như:
    + Khai báo float luu[m]; trong hàm daymax() và float a[n]; trong hàm main(). Khi dịch, C chắc chắn sẽ báo lỗi vì nó ko thể xác định được số phần tử của mảng ngay tại thời điểm biên dịch nên ko thể cấp phát bộ nhớ cho mảng này được. Bạn nên dùng số phần tử cố định ( miễn sao đủ lớn cho ứng dụng của bạn ) chẳng hạn 20, 50, 100... Bạn cũng có thể sử dụng cấp phát động để xin cấp phát vừa đủ một mảng các phần tử ( đối với ứng dụng nhỏ thì cũng ko cần thiết lắm ).
    + Bạn nên dùng while() cho những vòng lặp ko xác định, dù rằng for cũng có thể làm được. Chẳng hạn để kiểm tra một dãy là tăng, giảm hay ko tăng, ko giảm có thể dựa vào: nếu 1 dãy đang tăng( giảm ) mà gặp phần tử tiếp theo ko phù hợp với điều kiện tăng (giảm) đó thì kết luận ngay dãy là ko tăng, ko giảm. Nếu đến cuối dãy thì kết luận dãy tăng (giảm).
    + Trong hàm daymax() bạn chỉ quan tâm đến dãy tăng thì có thể làm như sau:
    Code:
    int chisodau = 0; // chỉ số của phần tử đầu tiên của dãy tăng
    int sopt = 0; // số phần tử của dãy tăng
    Khi chưa hết dãy, duyệt từ đầu dãy để tìm 1 dãy tăng;
    if( số phần tử của dãy này > sopt ) {
      lưu sopt này lại;
      lưu chỉ số đầu của dãy này;
    }
    else
      tăng chỉ số duyệt của dãy lên;
    Như vậy khi kết thúc hàm, ta lấy được chỉ số đầu tiên của dãy tăng lớn nhất và số phần tử của nó ( có lẽ bạn quan tâm đến dữ liệu này ). Có thể in dãy ra nếu cần.
    Thân!
    Nơi nào khiến anh dừng bước, nơi đó có em.

  5. #5
    Ngày gia nhập
    03 2007
    Nơi ở
    Nhà hát của những giấc mơ
    Bài viết
    33

    Trích dẫn Nguyên bản được gửi bởi whoru Xem bài viết
    Bạn làm khá rối, chưa hiểu rõ ngôn ngữ C lắm và cách sử dụng các vòng lặp cũng chưa được thành thạo. Chẳng hạn như:
    + Khai báo float luu[m]; trong hàm daymax() và float a[n]; trong hàm main(). Khi dịch, C chắc chắn sẽ báo lỗi vì nó ko thể xác định được số phần tử của mảng ngay tại thời điểm biên dịch nên ko thể cấp phát bộ nhớ cho mảng này được. Bạn nên dùng số phần tử cố định ( miễn sao đủ lớn cho ứng dụng của bạn ) chẳng hạn 20, 50, 100... Bạn cũng có thể sử dụng cấp phát động để xin cấp phát vừa đủ một mảng các phần tử ( đối với ứng dụng nhỏ thì cũng ko cần thiết lắm ).
    + Bạn nên dùng while() cho những vòng lặp ko xác định, dù rằng for cũng có thể làm được. Chẳng hạn để kiểm tra một dãy là tăng, giảm hay ko tăng, ko giảm có thể dựa vào: nếu 1 dãy đang tăng( giảm ) mà gặp phần tử tiếp theo ko phù hợp với điều kiện tăng (giảm) đó thì kết luận ngay dãy là ko tăng, ko giảm. Nếu đến cuối dãy thì kết luận dãy tăng (giảm).
    + Trong hàm daymax() bạn chỉ quan tâm đến dãy tăng thì có thể làm như sau:
    Code:
    int chisodau = 0; // chỉ số của phần tử đầu tiên của dãy tăng
    int sopt = 0; // số phần tử của dãy tăng
    Khi chưa hết dãy, duyệt từ đầu dãy để tìm 1 dãy tăng;
    if( số phần tử của dãy này > sopt ) {
      lưu sopt này lại;
      lưu chỉ số đầu của dãy này;
    }
    else
      tăng chỉ số duyệt của dãy lên;
    Như vậy khi kết thúc hàm, ta lấy được chỉ số đầu tiên của dãy tăng lớn nhất và số phần tử của nó ( có lẽ bạn quan tâm đến dữ liệu này ). Có thể in dãy ra nếu cần.
    Thân!
    Cảm ơn whoru nhiều nhé

    Nhân tiện ở đây cho mình hỏi mọi người một câu là int* a; và int *a

    có tương đương với nhau ko (đỡ phải lập topic mới )

  6. #6
    Ngày gia nhập
    03 2007
    Nơi ở
    Nhà hát của những giấc mơ
    Bài viết
    33

    Mặc định Nhờ mọi người tìm lỗi sai trong bài này

    cho index++ trong if thứ hai nó lại chạy được mất roài

  7. #7
    Ngày gia nhập
    02 2007
    Nơi ở
    TP.HCM - dưới cầu SG
    Bài viết
    12

    Nhân tiện ở đây cho mình hỏi mọi người một câu là int* a; và int *a
    Ko có gì khác nhau đâu bạn. Tuy nhiên người ta thường dùng int *a ( ý nói khai báo a là một con trỏ - tức là dấu *báo hiệu con trỏ là thuộc về biến *a) để tránh nhầm lẫn. Trường hợp khai báo theo cách thứ nhất VD int* a, b; có thể gây hiểu sai vì quan niệm a, b đều là con trỏ ( thực tế theo khai báo đó a là con trỏ, b là biến int ).
    Nếu post code, bạn nên chú thích 1 chút về mục đích sử dụng các biến, người khác đọc đỡ đau đầu hơn.
    Thân!
    Nơi nào khiến anh dừng bước, nơi đó có em.

  8. #8
    Ngày gia nhập
    03 2007
    Nơi ở
    Nhà hát của những giấc mơ
    Bài viết
    33

    Cảm ơn whoru nhiều

  9. #9
    Ngày gia nhập
    04 2007
    Bài viết
    16

    Hàm kiểm tra tăng hay giảm thì rất dể làm bạn nào cũng biết
    còn kiểm tra dãy con tăng có nhiều phần tử nhất thì mình nghỉ làm thế này ngắn gọn hơn
    có thể là:
    int max = 0,index = 0;
    for(int i = 0;i < m;i++)
    {
    if(x[i]<=x[i+1])
    {
    index++;
    }
    if(x[i]>x[i+1])
    {
    if(index >= max)
    max = index;
    index=0;
    }
    }

    nhưng khi in ra thì phải có max+1 phần tử vì phần tử đầu tiên ko so sánh
    3 phần tử mình sao so sánh 2 lần thì max = 2 nhưng có 3 phần tử ví du 1 3 5

  10. #10
    Ngày gia nhập
    03 2007
    Nơi ở
    Nhà hát của những giấc mơ
    Bài viết
    33

    Hix , mình thiếu đề rồi , giờ muốn in ra dãy con lớn nhất đó luôn thì làm sao đây

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