Bởi vì đây là tham chiếu, thực chất chỉ là cái tên mới của biến chúng ta đang xử lý mà thôi, khác với con trỏ.tại sao trong thân hàm hoán vị ta không dùng
temp=&a
&a=&b
&b=temp
Bài toán là có 2 mảng 1 chiều một mảng tăng dần và một mảng giảm dần , bi giờ lưu hết vào mảng thứ ba tăng dần nhưng không được sắp xếp trên mảng này .
Một câu hỏi nữa về các đối số của hàm :
kid ví dụ như có 2 hàm hoán vị thế này :
Ví dụ 1:
void hoanvi(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
{
Ví dụ 2:
void hoanvi(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
ở 2 thì ta phải dùng *a
temp=*a
....
mà ở 1 ta chỉ dùng
temp=a
....
kid nghĩ rằng *a ,&a đều là để trỏ đến địa chỉ của tham biến đưa vào
ví dụ ở main ta gọi hàm là :
1:
hoanvi(x,y);
2:
hoanvi(&x,&y);
thì ở đây cả a và *a đều trỏ đến địa chỉ của a mà vậy tại sao trong thân hàm hoán vị ta không dùng
temp=&a
&a=&b
&b=temp
Khó nghĩ quá
Bởi vì đây là tham chiếu, thực chất chỉ là cái tên mới của biến chúng ta đang xử lý mà thôi, khác với con trỏ.tại sao trong thân hàm hoán vị ta không dùng
temp=&a
&a=&b
&b=temp
Bài này chỉ cần cho 1 vòng for đi từ 0 đến m+n, ý tưởng là cho mảng a chạy từ 0 đến n, mảng b chạy từ m-1 về 0, so sánh và chọn giá trị tương ứng để cho vào mảng c. Đây là code chương trình, có gì khó hiểu thì hỏi thêm nhé:Bài toán là có 2 mảng 1 chiều một mảng tăng dần và một mảng giảm dần , bi giờ lưu hết vào mảng thứ ba tăng dần nhưng không được sắp xếp trên mảng này .
Code:void insert(int a[],int b[],int c[],int m,int n){ int i = 0,j = n-1; for (int k = 0;k < m+n;++k) if ((a[i] < b[j])&&(i < m)&&(j >= 0)) c[k] = a[i++]; else if ((a[i] >= b[j])&&(i < m)&&(j >= 0)) c[k] = b[j--]; else if (i >= m) c[k] = b[j--]; else c[k] = a[i++]; }
Đã được chỉnh sửa lần cuối bởi huynguyen : 25-01-2007 lúc 09:07 AM.
Chào bạn huynguyen!
Thực sự khi đọc thấy dòng tên của bạn tui rất vui
Và hôm trước có hơi vội vàng nên tui cũng cảm thấy áy náy quá hà
sorry bạn nhiều.
__________________________________________________ _______________
Điều quan trọng nhất là sự chao đổi đưa chúng ta tiếp cận và tiếp thu nhanh
được kiến thức?
__________________________________________________ _______________
Đây là code của bạn>>>>>
void insert(int a[],int b[],int c[],int m,int n){
int i = 0,j = n-1;
for (int k = 0;k < m+n;++k)
if ((a[i] < b[j])&&(i < m)&&(j < n)) //chỗ này bao giờ j chẳng <n phải là j>0 chứ
c[k] = a[i++];
else
if ((a[i] >= b[j])&&(i < m)&&(j < n)) //chỗ này cũng dzậy nè
c[k] = b[j--];
else
if (i >= m)
c[k] = b[j--];
else c[k] = a[i++];
}
_______________________________
Ngoài ra chúng ta có thể so sánh hai giới hạn của mảng A và B để sắp xếp cũng được.Đây là code của tôi ,xin được góp ý
void insert_C(int A[],int B[],int C[],int gha,int ghb)
{
int ia=0,jb=ghb-1,c;
for(c=0;c<gha+ghb;c++)
{
if(ia<gha&&jb>=0)
{
if(A[ia]<B[jb]) C[c]=A[ia++];
else C[c]=B[jb--];
}
else if(ia>=gha) C[c]=B[jb--]
else C[c]=A[ia++];
}
}
À đúng rồi, viết vội quá nên nhầm, thx nhiều nhé.
Nhìn sơ qua thì thấy code bạn có vẻ lạ lạ nhưng thực tế thì nó cải tiến 1 chút so với code mà mình đã đưa ra, câu lệnh if của mình có 4 cấp còn câu lệnh if của bạn có 2 cấp, trong mỗi cấp thì lại có 2 cấp nhỏ hơn, vị chi cũng là 4 cấp, nhìn có vẻ thoáng hơn 1 chút nhưng nguyên lý thì cả 2 đều giống nhau, minh họa rõ ràng hơn thì bạn có thể xem dưới đây:
So sánh với code ban đầu:Code:void insert(int a[],int b[],int c[],int m,int n){ int i = 0,j = n-1; for (int k = 0;k < m+n;++k) if ((i < m)&&(j >= 0)) if ((a[i] < b[j]) c[k] = a[i++]; else c[k] = b[j--]; else if (i >= m) c[k] = b[j--]; else c[k] = a[i++]; }
Code:void insert(int a[],int b[],int c[],int m,int n){ int i = 0,j = n-1; for (int k = 0;k < m+n;++k) if ((a[i] < b[j])&&(i < m)&&(j >= 0)) c[k] = a[i++]; else if ((a[i] >= b[j])&&(i < m)&&(j >= 0)) c[k] = b[j--]; else if (i >= m) c[k] = b[j--]; else c[k] = a[i++]; }
uh kid cũng nghĩ là phải so sánh từng phần tử như vậy nhưng thấy 1 số thắc mắc , tại đây thì chưa giải thích được để về nghiên cứu xem sao , cảm ơn mấy pa trước đã , còn code nào hay thì tiếp ha
Ồ có gì đâu chứ,quan trọng nhất là chúng ta đưa ra được thuật giải đúng nhất thui mà.
Hôm nay không làm hợp đồng kết nối Internet nên hơi buồn à
Giá mà làm song sớm thì tui có nhiều thời gian Online rùi , hơi tiếc
Mong chia sẻ
Thuật toán thì kid có rùi , nhưng khi triển khai ra code thì chạy lại không đúng , khi đọc bài của 2 pro trên thì mới ngấm ngấm chút à.
Chỉ có điều không hiểu sao code trên chạy vẫn sai ???
Check rồi, code của tui chạy ngon lành mà, còn code của you bị sai ở đâu thì you cứ post lên đây cho mọi người cùng xem xét.
ặc code mình cũng giống như của bạn mà (chẳng biết nữa nhưng chưa check)
chắc là mình thiếu sót gì đó , để hôm nao tới giờ thực hành check lại thử coi còn bi giờ là một bài .... cũng về mảng nhưng là mảng 2 chiều (ma trận đó)
Hơi bị khó gặm , nên nhờ anh em góp ý coi
Giả sử có một mà trận như sau:
Đấy với ma trận trên mình phải in ra : 1 22 333 4444 55555 6666 777 88 91 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9
theo đường chéo đó , kid chỉ nghĩ ra để có thể in được nữa phía đường chéo trên thôi ...