Gặp lỗi trong bài tập C?
Xin chào. Hôm nay mình có làm 1 bài tập C như sau:
Xây dựng hàm thực hiện chức năng sau trên mảng 1 chiều các số nguyên: Thêm y lần phần tử z vào vị trí có chỉ số x trong mảng
Ví dụ:
Ta có mảng : 1 2 3 4 5
VD: x = 3; y = 4; z = 6 => Tức là thêm 4 lần phần tử mang giá trị 6 vào vị trí 3 trong mảng
=> Mảng sau khi thêm: 1 2 3 6 6 6 6 4 5
Đoạn code giải của mình như sau:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <Windows.h>
void NhapMang(int *a, int n)
{
for (int i = 0; i < n; i++)
{
printf("
Nhap a[%d] = ", i);
scanf("%d", &a[i]);
}
}
void XuatMang(int *a, int n)
{
for (int i = 0; i < n; i++)
printf("%4d", a[i]);
}
void Themphantu(int *a, int &n, int ViTriThem, int PhanTuThem, int Soluongthem)
{
realloc(a, (n + Soluongthem) * sizeof(int *));
for (int i = n + (Soluongthem - 1); i >= n; i--)
a[i] = a[i - Soluongthem];
n += Soluongthem;
for (int j = n - (Soluongthem + 1); j >= ViTriThem; j--)
a[j] = PhanTuThem;
}
int main()
{
int *a, n;
do
{
printf("
Nhap so luong phan tu: ");
scanf("%d", &n);
if (n < 0)
printf("
So luong phan tu khong hop le
");
} while (n < 0);
a = (int *)realloc(0, n * sizeof(int *));
NhapMang(a, n);
XuatMang(a, n);
int ViTriThem, PhanTuThem, Soluongthem;
do
{
printf("
Nhap vi tri them: ");
scanf("%d", &ViTriThem);
if (ViTriThem < 0 || ViTriThem > n)
printf("
Vi tri them khong hop le
");
} while (ViTriThem < 0 || ViTriThem > n);
printf("
Nhap phan tu them: ");
scanf("%d", &PhanTuThem);
printf("
Nhap so luong them: ");
scanf("%d", &Soluongthem);
printf("
Mang sau khi them: ");
Themphantu(a, n, ViTriThem, PhanTuThem, Soluongthem);
XuatMang(a, n);
free(a);
getch();
return 0;
}
Cái lỗi của mình là khi thêm phần tử x vào vị trí y với số lượng z trong mảng thì bị lỗi. Mong mọi người giúp mình nhé.
Xin cảm ơn!
Realloc có vấn đề rồi.
Là sao anh ? Realloc ở hàm Main hay hàm
ThemPhanTu
?Cái thuật toán ở hàm
ThemPhanTu
em nghĩ ra và thử nháp nhiều lần nhưng không hiểu sao khi chạy thì sai kết quảP/S: Mà hình như chỗ sai là thuật toán chứ không phải realloc đâu anh ạ !
Nếu em cho 5 phần tử từ 1 đến 5 và thêm vào vị trí 2 thì nó cho đúng ! Còn nếu cho nhiều phần tử hơn như từ 1 đến 8 hay 9 thì nó cho sai ?
realloc sẽ trả về địa chỉ con trỏ mới, nên bạn phải gán
a=realloc...
Hơn nữa, a là mảng chứaint
nên phải realloc kích thước làn*sizeof(int)
. Mặt khác, nếu truyền a vào hàm thêm phần tử mà nếu a thay đổi địa chỉ thì phải truyền qua con trỏthemphantu(int** a,...)
À, em làm được rồi. Thật ra:
em gán sai cho hai thằng
i
vàj
nên nó chỉ đúng với 1 ví dụ duy nhất