-4

私はC++を初めて使用し、ベクトル内の要素を読み取る関数と要素を出力する関数を作成しました。問題は、印刷機能がうまく動作しないことです。

 #include <iostream>
    using namespace std;

1)

int read()
{
    int elements,i;
    cout<<"Give the number of elements:";
    cin>>elements;
    int v[elements];
    for(i=1;i<=elements;i++)
    {
        cout<<"v["<<i<<"]=";
        cin>>v[i];
    }
    return elements;
}

2)

void print_vector(int elements)
{
    int i;
    int v[elements];
    for(i=1;i<=elements;i++)
    {
        cout<<v[i];
    }
}

int main()
{
    int n=read();
    print_vector(n);
    return 0;
}

Example:
Give the number of elements:5
v[1]=1
v[2]=2
v[3]=3
v[4]=4
v[5]=5
1348

12345 ではなく 1348 と表示されます。関数のどこが間違っているのでしょうか?また、正しい要素を出力するように変更するにはどうすればよいでしょうか?

4

3 に答える 3

3
int v[elements];

これにより、整数の新しい配列が作成されます。

メモリの割り当てを処理する方法に注意する必要があるため、配列を渡すのは比較的難しく、C.

学習しているC++ときに、 を使用しclassてメモリの問題を管理できます。std::vector構文的には配列に似ていますが、割り当てとサイズ変更を自動的に処理し、そのサイズも記憶しています。

参照によってオブジェクトを関数に渡すことができます&。関数内では、渡されたオブジェクトを変更でき、関数が終了した後も効果が持続します。

void read(vector<int>& elements) {
    // in here you can resize the vector
}

void print(const vector<int>& elements) {
    // passing in elements by const reference means you can't modify it
}

したがって、完全に:

int main() {
    vector<int> elements;
    read(elements);
    print(elements);
}

あるいは、オブジェクト指向になりたい場合は、データと関数を一緒にグループ化して、データを完全に受け渡さないようにする方法を探す必要があります。この場合、ベクトルと読み取りおよび印刷関数をグループ化できます。多分それを呼んでUserIntegersください:

class UserIntegers {
public:
    void process() {
        read();
        print();
    }
private:
    vector<int> numbers;
};

使用法:

int main() {
    UserIntegers userIntegers;
    userIntegers.process();
}
于 2013-03-15T20:51:40.687 に答える
2

印刷機能にエラーがあります

for(i=1;i<=elements;i++)
{                   //^^^^^
    cout<<v[i];
    ++i;  //You would like to skip some elements?
}

インデックス i を 2 回インクリメントすると、配列インデックスは 1 ではなく 0 から始まります。要素ではなく数字(要素-1)で終わりますが、ベクトルではなく配列を使用しています。

于 2013-03-15T20:49:27.563 に答える
2

ではread()、要素をローカル配列に読み込みますv。関数が終了すると、配列も消えます。で同じことが起こりprint_vector()ます。

別のエラーは、配列のインデックス付けです。1からelementsinclusive までの要素にアクセスします。これは、最初の要素を無視し0、配列の境界を超えて最終的に 1 つの要素にアクセスします ( elements)。

std::vector両方の関数の外側に配列、より良い a を割り当て、それread()を入力print_vector()用と印刷用に渡す必要があります。

#include <iostream>
#include <vector>

void read(std::vector<int> &v)
{
    int elements,i, n;
    std::cout<<"Give the number of elements:";
    std::cin>>elements;
    for(i = 0; i < elements; i++)
    {
        std::cout<<"v["<<i<<"]=";
        std::cin>> n;
        v.push_back(n);
    }
}

void print_vector(const std::vector<int> &v)
{
    for(auto i = v.begin(); i != v.end(); ++i)
    {
        std::cout << *i;
    }
}

int main()
{
    std::vector<int> v;
    read(v);
    print_vector(v);
    return 0;
}
于 2013-03-15T21:15:30.693 に答える