Mong mọi người trợ giúp chỉnh sửa code về con trỏ trong C
Chào mấy bạn , chẳng qua là mình đang học về con trỏ. và có một bài tập như thế này
Viết hàm tìm kiếm một giá trị nào đó trong mảng. Chương trình phải có code minh họa.
Hàm này có dạng như sau
int* TimKiem(int *a, int n, int GiaTri)
Hàm truyền vào một mảng số nguyên (a), số lượng phần tử (n) và giá trị cần tìm kiếm.
Hàm trả về địa chỉ của phần tử = GiaTri xuất hiện đầu tiên trong mảng. Nếu không tìm
được thì trả về NULL.
Ví dụ: cho mảng a = { 5, 9, 1, 6, 7, 3, 7 }
Gọi hàm TimKiem (a, 6, 7) sẽ trả về địa chỉ của a[4] => xuất ra vị trí là 4.
Gọi hàm TimKiem (a, 6, 9) sẽ trả về địa chỉ của a[1] => xuất ra vị trí là 1.
Gọi hàm TimKiem (a, 6, 2) sẽ trả về NULL => xuất ra kết quả “không tìm thấy”.
và đây là code của mình
#include <stdio.h>
#include <stdlib.h>
int timkiem(int *,int,int);
int nhaparray(int,int);
int xuatarray(int,int);
int main()
{
int a[50],n=0,x=0;
do
{
printf("Nhap kich thuoc mang
");
scanf("%d",&n);
}while(n<0&&n>50);
nhaparray1(a,n);
printf("mang sau khi nhap la
");
xuatarray1(a,n);
printf("
Nhap gia tri can tim x = ");
scanf("%d",&x);
timkiem1(a,n,x);
return 0;
}
int nhaparray1(int a[],int n)
{
for(int i=0;i<n;i++)
{
printf("Nhap a[%d]: ",i+1);
scanf("%d",&a[i]);
}
}
int xuatarray1(int a[],int n)
{
for(int i=0;i<n;i++)
{
printf("%5d",a[i]);
}
}
int timkiem1(int *a,int n,int x)
{
int i=0;
for(i=0;i<n;i++)
{
if(a[i]==x)
return a[i];
printf("phan tu %d xuat hien tai vi tri %d
",x,*(a+i));
}
}
cái vấn đề mình gặp phải là ở hàm timkiem1
lỗi đầu tiên mình gặp là khi mình đặt hàm
printf("phan tu %d xuat hien tai vi tri %d
",x,a[i]);
ở ngoài vòng lặp thì khi chạy chương trình nó sẽ không hiện ra kết quả nào cả, chương trình sẽ đóng lại.
còn khi mình đặt hàm printf("phan tu %d xuat hien tai vi tri %d
",x,a[i]);
, ở trong vòng lặp thì chương trình hoạt động tuy nhiên nó có một số lỗi sau,
ví dụ khi mình nhập nhập mảng có 4 phần tử gồm a={1,2,3,4}
1 khi mình nhập vào phần tử từ phần tử thứ 0 => 1, thì chương trình nó không hoạt động, còn khi mình nhập vào phần tử thứ 1 => 2 thì chương trình sẽ in ra kết quả đúng, 2 xuất hiện tại vị trí 1.
2 Nhưng bắt đầu từ phần tử thứ 2 => chương trình khi in ra kết quả sẽ in thêm một kết quả nữa
Vd; khi mình nhập vào 3 thì nó sẽ in ra kết quả là 3 ở vị trí thứ nhất, sau đó 3 ở vị trí thứ 2 .
hình dưới là kết quả khi in ra và tương tự với 4 cũng vậy.
Mình biết là khi để trong vòng lặp thì kết quả nó sẽ như vậy , nhưng nếu không để trong vòng lặp thì chương trình sẽ không hoạt động, vậy làm cách nào để hàm
printf("phan tu %d xuat hien tai vi tri %d
",x,a[i]);
ở ngoài vòng lặp mà vẫn hoạt động được hoặc để trong vòng lặp nhưng chương trình vẫn chạy đúng,không bị lỗi Logic ?. Mong mọi người giúp mình, mình xin cảm ơn trước P/s mình tự học nên không có ai chỉ bảo cả, nên có thể code sẽ sai sót , mà công nhận phần con trỏ đúng là khó thật, mình thấy một số bạn học ở trường, có thầy cô trợ giúp mà còn gặp khó khăn về phần này, người tự học như mình chắc còn khó khăn gấp bội lần , mong mọi người giúp đỡ cho một người tự học như mình, xin cảm ơn trước
Cái này không phải là do con trỏ mà bạn đã bị hổng kiến thức thì đúng hơn tới
return
là thoát ra khỏi hàm rồi.bạn đưa cái mảng vào hàm như 1 con trỏ thì khi bạn lấy giá trị của nó cũng phải lấy giá trị như 1 con trỏ chứ nhỉ
thế không
return
thì phải làm sao ạMà con trỏ không thể sử dụng tùy tiện, cái hay nhất của nó là phép ++ và – . Để luyện tập sử dụng con trỏ, bạn nên làm những bài xử lí chuỗi vì dùng cú pháp mảng rất rườm rà với việc duyệt chuỗi.
Không cần thiết.
a[i] := *(a+i)
.ở chỗ lệnh if bạn viết thiếu mấy cái dấu ngoặc nên thành ra code nó mới như z
mình có một cách giải quyết như thế này
mình sẽ khai báo một con trỏ
count
và sau đó sẽ gán nó = giá trị của mảng Asau đó mình sẽ xuất ra giá trị của biến
count
, và đây là đoạn code của mình, kết quả thì chính xác, chương trình cho ra kết quả đúng , bạn thấy như thế đã tối ưu chưa ?
Vấn đề là bạn sẽ deref NULL nếu không tìm thấy
mình vẫn chưa nghĩ tới trường hợp đó , mình có thử qua nhiều cách nhưng không thành , nên thôi
Giờ bạn suy nghĩ đơn giản, dẹp con trỏ qua một bên, bài này không thích hợp để làm bằng con trỏ đâu.
Um bạn, tại mình đang học con trỏ và có một phần bài tập này làm theo kiểu con trỏ, nên mình mới làm
, chứ kiểu thường thì mình có thể làm được
Ý tưởng nhé
Dùng 1 biến đếm. Nếu số x xuất hiện thì tăng biến đếm, dùng break để thoát vòng
Nếu biến đếm =1 in ra vị trí
Còn lại in ra ko tìm thấy
Cảm ơn