30/09/2018, 21:19

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!

Gió viết 23:23 ngày 30/09/2018

Realloc có vấn đề rồi.

Người bí ẩn viết 23:28 ngày 30/09/2018

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 ?

Gió viết 23:30 ngày 30/09/2018

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ứa int 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,...)

Người bí ẩn viết 23:31 ngày 30/09/2018

À, em làm được rồi. Thật ra:

for (int i = n + (Soluongthem - 1); i >= n; i--)

for (int j = n - (Soluongthem + 1); j >= ViTriThem; j--)

em gán sai cho hai thằng ij nên nó chỉ đúng với 1 ví dụ duy nhất

Bài liên quan
0