Hỏi về thứ tự khai báo biến trong C++

Em muốn hỏi thứ tự khai báo biến trong c++ có ảnh hưởng đến kết quả chương trình không ạ ? Trước kia em cứ nghĩ trước khi dùng khai báo là được nhưng nay em làm bài gặp 1 vấn đề :(( nếu em khai báo biến vitrixoa ngay từ đầu hàm main thì chương trình trả về kết quả đúng, còn nếu khai báo biến vitrixoa trước khi nhập thì chương trình trả về kết quả sai ạ…Các bác giải thích giúp em với ạ…Dưới là code của em ạ:

//Chèn mảng,Xóa mảng

#include <iostream>

using namespace std;

void nhapmang(int a[], int n)

{

for(int i=0;i<n;i++)

cin>>a[i];

}

void xuatmang(int a[],int n)

{

for(int i =0;i<n;i++) cout<<a[i]<<"\t";

}

void chen(int a[],int &n,int vitri,int socanchen)

{

int i;

for(i=n;i>=vitri;i--)// n = 5 thì có 4 vị trí 0 1 2 3 4, i bắt đầu từ n là 5 nghĩa là có thêm 1 phần tử

{

a[i] = a[i-1];

}

a[vitri] = socanchen;

n++;

}

void xoa(int a[],int &n, int vitrixoa)

{

for(int i = vitrixoa;i<=n;i++)

a[i] = a[i+1];

n--;//Quên không giảm n sẽ không giảm số lượng phần tử và xuất hiện phần tử thưà

}

int main()

{

int i,n;

int vitrixoa;

cout<<"So luong phan tu: n = ";

cin>>n;

int a[n];

cout<<"Nhap lan luot tung phan tu:\n";

nhapmang(a,n);

cout<<"Mang da nhap la:\n";

xuatmang(a,n);

int vitrichen;

cout<<"\nvitrichen = ";

cin>>vitrichen;

int socanchen;

cout<<"So can chen = ";

cin>>socanchen;

chen(a,n,vitrichen,socanchen);//&n hay n ???

cout<<"Mang sau khi chen la: "<<endl;

xuatmang(a,n);

cout<<"vitrixoa = ";

cin>>vitrixoa;

xoa(a,n,vitrixoa);

cout<<"Mang sau khi xoa la: "<<endl;

xuatmang(a,n);

return 0;

}

Mình đã thử khai báo vitrixoa cả hai trường hợp (ngay dưới main() và trước cin >> vitrixoa; và thấy không có vấn đề gì mà. (Bản thân cả hai trường hợp khai báo trên cũng không sai)

Bạn cũng nên kiểm tra điều kiện nhập của vitrichenvitrixoa (0 <= vtc,vtx <= số phần tử mảng).

2 Likes

mình thử với mảng 4 phần tử vẫn bị lỗi bạn ơi :((

image

MÌnh thấy có vấn đề gì đâu nhỉ. :thinking:

2 Likes
//Chèn mảng,Xóa mảng
#include <iostream>
using namespace std;
void nhapmang(int a[], int n)
{
    for(int i=0;i<n;i++)
    cin>>a[i];
}
void xuatmang(int a[],int n)
{
    for(int i =0;i<n;i++) cout<<a[i]<<"\t";

}
void chenmang(int a[],int &n,int vitri,int socanchen)
{
    int i;
    for(i=n;i>=vitri;i--)// n = 5 thì có 4 vị trí 0 1 2 3 4, i bắt đầu từ n là 5 nghĩa là có thêm 1 phần tử 
    {
        a[i] = a[i-1];

    }
    a[vitri] = socanchen;
    n++;
}
void xoamang(int a[],int &n, int vitrixoa)
{
    for(int i = vitrixoa;i<=n;i++)
    a[i] = a[i+1];
    n--;//Quên không giảm n sẽ không giảm số lượng phần tử và xuất hiện phần tử thưà
}

void sapxep(int a[],int n)
{
    int tmp = 0;
    int i,j;
    for(i=0;i<n;i++){
        for(j=i+1;j<n;j++) if(a[i]>a[j])
        {
            tmp = a[i];
            a[i]=a[j];
            a[j]=tmp;

        } 
    }
}
int main()
{
   int i,n;
//    int vitrixoa;
   cout<<"So luong phan tu: n = ";
   cin>>n;
   int a[n];
   cout<<"Nhap lan luot tung phan tu:\n";
   nhapmang(a,n);
   cout<<"Mang da nhap la:\n";
   xuatmang(a,n);
   int vitrichen;
   cout<<"\nvitrichen = ";
   cin>>vitrichen;
   int socanchen;
   cout<<"So can chen =  ";
   cin>>socanchen;   
   chenmang(a,n,vitrichen,socanchen);//&n hay n ???
   cout<<"Mang sau khi chen la: "<<endl;
   xuatmang(a,n);
    int vitrixoa;
   cout<<"vitrixoa = ";
   cin>>vitrixoa;
   xoamang(a,n,vitrixoa);
   cout<<"Mang sau khi xoa la: "<<endl;
   xuatmang(a,n);
   cout<<endl<<"Mang sau khi sap xep la:\n";
   sapxep(a,n);
   xuatmang(a,n);
   return 0;
}

Dưới là kết quả khi mình khai báo biến vitrixoa ngay trước khi nhập

Lạ nhỉ IDE của bạn có vấn đề chăng.
image

Code mình test
#include <iostream>

using namespace std;

void nhapmang(int a[], int n) {
	for(int i=0; i<n; i++)
		cin>>a[i];
}

void xuatmang(int a[],int n) {
	for(int i =0; i<n; i++)
		cout<<a[i]<<"\t";
}

void chen(int a[],int &n,int vitri,int socanchen) {
	int i;
	for(i=n; i>=vitri; i--) { // n = 5 thì có 4 vị trí 0 1 2 3 4, i bắt đầu từ n là 5 nghĩa là có thêm 1 phần tử
		a[i] = a[i-1];
	}
	a[vitri] = socanchen;
	n++;
}

void xoa(int a[],int &n, int vitrixoa) {
	for(int i = vitrixoa; i<=n; i++)
		a[i] = a[i+1];
	n--;//Quên không giảm n sẽ không giảm số lượng phần tử và xuất hiện phần tử thưà
}

int main() {
	int i,n;
	cout<<"So luong phan tu: n = ";
	cin>>n;
	int a[n];
	cout<<"Nhap lan luot tung phan tu:\n";
	nhapmang(a,n);
	cout<<"Mang da nhap la:\n";
	xuatmang(a,n);
	int vitrichen;
	cout<<"\nvitrichen = ";
	cin>>vitrichen;
	int socanchen;
	cout<<"So can chen = ";
	cin>>socanchen;
	chen(a,n,vitrichen,socanchen);//&n hay n ???
	cout<<"Mang sau khi chen la: "<<endl;
	xuatmang(a,n);
	cout<<"vitrixoa = ";
	int vitrixoa;
	cin>>vitrixoa;
	xoa(a,n,vitrixoa);
	cout<<"Mang sau khi xoa la: "<<endl;
	xuatmang(a,n);
	return 0;
}
2 Likes

Lạ thật, mình thử bằng atom vẫn vậy :v:

C++ ko có kiểu khai báo này nha :V Khai báo mảng kiểu này chỉ có ở C.

thêm #include <vector> và khai báo avector<int>: vector<int> a(5);
sửa lại mấy cái int a[] trnog mấy cái hàm kia thành vector<int>& a hết là truyền a vô hàm đó được.

4 Likes
// Chèn mảng,Xóa mảng
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

void nhapmang(vector<int>& a)
{
    for (size_t i = 0; i < a.size(); i++)
        cin >> a[i];
}

void xuatmang(const vector<int>& a)
{
    for (size_t i = 0; i < a.size(); i++)
        cout << a[i] << "\t";
}

void chenmang(vector<int>& a, int vitri, int socanchen)
{
    a.insert(begin(a) + vitri, socanchen);
}

void xoamang(vector<int>& a, int vitrixoa)
{
    a.erase(begin(a) + vitrixoa);
}

void sapxep(vector<int>& a)
{
    sort(begin(a), end(a));
}

int main()
{
    int i, n;
    cout << "So luong phan tu: n = ";
    cin >> n;
    vector<int> a(n);
    cout << "Nhap lan luot tung phan tu:\n";
    nhapmang(a);
    cout << "Mang da nhap la:\n";
    xuatmang(a);
    int vitrichen;
    cout << "\nvitrichen = ";
    cin >> vitrichen;
    int socanchen;
    cout << "So can chen =  ";
    cin >> socanchen;
    chenmang(a, vitrichen, socanchen); //&n hay n ???
    cout << "Mang sau khi chen la: " << endl;
    xuatmang(a);
    int vitrixoa;
    cout << "vitrixoa = ";
    cin >> vitrixoa;
    xoamang(a, vitrixoa);
    cout << "Mang sau khi xoa la: " << endl;
    xuatmang(a);
    cout << endl << "Mang sau khi sap xep la:\n";
    sapxep(a);
    xuatmang(a);
}

dzậy cho đỡ nhức đầu :V :V :V

5 Likes

Để một trong hai vị trí cũng như nhau thôi bạn.

Mình cũng có chạy thử đoạn code trên Visual Studio and Dev C++ thì đều ra đúng kết quả mà=)))

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?