Vấn đề về truyền tham biến, tham trị là mảng

Các anh chị và các bạn cho mình hỏi có cách nào truyền mảng vào hàm mà không làm thay đổi giá trị của mảng sau khi xử lí trong hàm đó ko? xin cảm ơn

[QUOTE=14520234;304916]Các anh chị và các bạn cho mình hỏi có cách nào truyền mảng vào hàm mà không làm thay đổi giá trị của mảng sau khi xử lí trong hàm đó ko? xin cảm ơn[/QUOTE]

Tạo ra cái mảng mới, copy các phần tử qua rồi truyền cái mảng mới vào

cách này độ phức tạp e nghĩ không ổn, còn dùng con trỏ thì nó sẽ trỏ về địa chỉ của mảng trc thành ra vẫn bị thay đổi, à e quên nói trước là công việc trong hàm sẽ thực hiện n lần

[QUOTE=truonganpn;304917]Tạo ra cái mảng mới, copy các phần tử qua rồi truyền cái mảng mới vào[/QUOTE]
cách này độ phức tạp e nghĩ không ổn, còn dùng con trỏ thì nó sẽ trỏ về địa chỉ của mảng trc thành ra vẫn bị thay đổi, à e quên nói trước là công việc trong hàm sẽ thực hiện n lần
Lần sửa cuối bởi 14520234; Hôm nay lúc 16:45

[QUOTE=truonganpn;304917]Tạo ra cái mảng mới, copy các phần tử qua rồi truyền cái mảng mới vào[/QUOTE]
cách này độ phức tạp e nghĩ không ổn, còn dùng con trỏ thì nó sẽ trỏ về địa chỉ của mảng trc thành ra vẫn bị thay đổi, à e quên nói trước là công việc trong hàm sẽ thực hiện n lần
Lần sửa cuối bởi 14520234; Hôm nay lúc 16:45

[QUOTE=14520234;304918]cách này độ phức tạp e nghĩ không ổn, còn dùng con trỏ thì nó sẽ trỏ về địa chỉ của mảng trc thành ra vẫn bị thay đổi, à e quên nói trước là công việc trong hàm sẽ thực hiện n lần[/QUOTE]
Cách này có gì phức tạp mà không ổn em?
Thông thường ta truyền mảng vào hàm là để điều chỉnh nó cho phù hợp.
Nếu em không muốn nó thay đổi thì tạo ra bản sao của nó (có thể truyền mảng cũ vào, rồi tạo bản sao ở trong hàm con và thao tác trên mảng con này)

[QUOTE=13520747;304922]Cách này có gì phức tạp mà không ổn em?
Thông thường ta truyền mảng vào hàm là để điều chỉnh nó cho phù hợp.
Nếu em không muốn nó thay đổi thì tạo ra bản sao của nó (có thể truyền mảng cũ vào, rồi tạo bản sao ở trong hàm con và thao tác trên mảng con này)[/QUOTE]
Nếu e có một mảng, cứ mỗi vòng lặp e muốn sử dụng lại mảng ban đàu thì có giải pháp gì không ạ? Tại truyền tham biến mảng trong C khác Pascal quá :smiley:

[QUOTE=14520234;304923]Nếu e có một mảng, cứ mỗi vòng lặp e muốn sử dụng lại mảng ban đàu thì có giải pháp gì không ạ? Tại truyền tham biến mảng trong C khác Pascal quá :D[/QUOTE]
Cụ thể là em làm gì ở trong vòng lặp đó?
Anh vẫn chưa nghĩ ra em làm như thế để làm gì :look_down:

[QUOTE=13520747;304924]Cụ thể là em làm gì ở trong vòng lặp đó?
Anh vẫn chưa nghĩ ra em làm như thế để làm gì :look_down:[/QUOTE]
À e đang code bài NKSEQ trên spoj. http://vn.spoj.com/problems/NKSEQ/
Ý tưởng của e là lặp lại mảng a, tạo thành vòng tròn, có một mảng S tính tổng từ 1-2n.
For từ 1 - n, sort lại mảng s từ i- n+i-1, nếu s*-s[i-1] <0 thì điểm đó không phải điểm tốt

[QUOTE=14520234;304927]À e đang code bài NKSEQ trên spoj. http://vn.spoj.com/problems/NKSEQ/
Ý tưởng của e là lặp lại mảng a, tạo thành vòng tròn, có một mảng S tính tổng từ 1-2n.
For từ 1 - n, sort lại mảng s từ i- n+i-1, nếu s*-s[i-1] <0 thì điểm đó không phải điểm tốt[/QUOTE]
Đọc sơ qua đề thì bài này kiểm tra j có phải là “tốt” hay không tốn một lần duyệt mảng, có tổng cộng n cái j trong mảng vậy tốn n lần duyệt mảng. Còn cách của em có n lần sort mảng s. Sort thì chắc chắn lâu hơn rất nhiều so với duyệt nên có vẻ như cách của em không có ổn cho lắm.

[QUOTE=14520234;304927]À e đang code bài NKSEQ trên spoj. http://vn.spoj.com/problems/NKSEQ/
Ý tưởng của e là lặp lại mảng a, tạo thành vòng tròn, có một mảng S tính tổng từ 1-2n.
For từ 1 - n, sort lại mảng s từ i- n+i-1, nếu s*-s[i-1] <0 thì điểm đó không phải điểm tốt[/QUOTE]
Anh chưa test, nhưng rõ ràng ý tưởng của em “nghe là thấy nản” rồi :smiley:
Em thử cách dưới xem :wink:

int count_good_position = 0;
for(int i = 0; i < n; i++)
{
int sum = 0;
int count = 0;
int flag = 1;
for(int j = i; count < n; count++)
{
sum += a[j];
if(sum < 0)
{
flag = 0;
break;
}
j++;
j = j % n;
}
if (flag == 1)
count_good_position++;
}

[QUOTE=truonganpn;304928]Đọc sơ qua đề thì bài này kiểm tra j có phải là “tốt” hay không tốn một lần duyệt mảng, có tổng cộng n cái j trong mảng vậy tốn n lần duyệt mảng. Còn cách của em có n lần sort mảng s. Sort thì chắc chắn lâu hơn rất nhiều so với duyệt nên có vẻ như cách của em không có ổn cho lắm.[/QUOTE]
Tại e tính độ phức tạp chỉ có nlgn :smiley:
E dùng quicksort

[QUOTE=13520747;304932]Anh chưa test, nhưng rõ ràng ý tưởng của em “nghe là thấy nản” rồi :smiley:
Em thử cách dưới xem :wink:


int count_good_position = 0;

for(int i = 0; i < n; i++)
{
	int sum = 0;
	int count = 0;
	int flag = 1;
	for(int j = i; count < n; count++)
	{
		sum += a[j];
		if(sum < 0)
		{	
			flag = 0;
			break;
		}
			
		j++;
		j = j % n;
	}
	
	if (flag == 1)
		count_good_position++;
}

[/QUOTE]
Để e thử xem :smiley:

[QUOTE=14520234;304936]Tại e tính độ phức tạp chỉ có nlgn :smiley:
[/QUOTE]
Học CTDL đó giờ anh chả biết cái độ phức tạp tính ra sao nữa :salute:

[QUOTE=13520747;304960]Học CTDL đó giờ anh chả biết cái độ phức tạp tính ra sao nữa :salute:[/QUOTE]
Cách tính được độ phức tạp là nội dung môn “Phân tích thiết kế thuật toán” nhé, em học thêm đi rồi biết

[QUOTE=14520234;304936]Tại e tính độ phức tạp chỉ có nlgn :smiley:
E dùng quicksort[/QUOTE]

Không cần dùng đến kiến nlgn gì gì cho cao siêu cả, tui chỉ biết chắc chắn là sắp xếp thì sẽ lâu hơn duyệt thôi em :smiley:

Bài này em có thể dùng QHĐ để tính, ĐPT chỉ khoảng O(N) :

  • Gọi F* là giá trị nhỏ nhất trong các dãy a*, a* + a[i+1], .. , a* + a[i+1] + a[i+2] + … a[n] + a[1] + a[2] + … + a[i-1].
  • Công thức QHĐ : F* = Min(A*, F[i + 1] + A*), i = n-1 -> 1.
    Điều kiện để i là 1 vị trí tốt là A* > 0 và F* > 0

[QUOTE=12520527;305031]Bài này em có thể dùng QHĐ để tính, ĐPT chỉ khoảng O(N) :

  • Gọi F* là giá trị nhỏ nhất trong các dãy a*, a* + a[i+1], .. , a* + a[i+1] + a[i+2] + … a[n] + a[1] + a[2] + … + a[i-1].
  • Công thức QHĐ : F* = Min(A*, F[i + 1] + A*), i = n-1 -> 1.
    Điều kiện để i là 1 vị trí tốt là A* > 0 và F* > 0[/QUOTE]
    Dạ e cảm ơn, mà dạo này học quân sự lại hk có lap nên khó luyện quá :smiley:

[QUOTE=14520234;304916]Các anh chị và các bạn cho mình hỏi có cách nào truyền mảng vào hàm mà không làm thay đổi giá trị của mảng sau khi xử lí trong hàm đó ko? xin cảm ơn[/QUOTE]
Khai báo tham số const được không ta?

#include <stdio.h>
void f( const int a[])
{
a[2]=0;
}
main()
{
int a[4]={1,2,3,4};
for(int i=0; i<4; ++i)
printf("%d", a*);
}