数组和函数

Array and Function

我正在尝试让函数在主函数中调用,尽量保持“main”的干净。 所以我做了一个函数来从用户那里获取大小数组,然后用户输入函数的元素,但是我被线性搜索函数卡住了,所以需要帮助“仍然是绝对的初学者”

#include <iostream>
using namespace std;
int* Array_Elements () {
    static int arr [5] {}, i, size;
    cout << "Enter Array size: ";
    cin >> size;
    cout << "Enter Array Elements: " << endl;
    for (i=0; i<size; i++) {
        cin >> arr[i];
    }
    return arr;
}
void Array_Search (int arr [], int n) {
    int temp = -1;
    for (int i = 0; i < 5; i++) {
        if (arr [i] == n) {
            cout << "Element found at position: " << i + 1 << endl;
            temp = 0;
            break;
        }
 }
 
  if (temp == -1) {
    cout << "No Element Found" << endl;
  }    
    }
int num () {
    cout << "Please enter an element to search" << endl;
    int num;
    cin >> num;
    return num;
}

int main () {
    Array_Search (Array_Elements(), num());
    return 0;
}

... trying to keep "main" as clean as possible.

好的,这是一个很好的动力。坦率地说,我发现您的 main 相当混乱。您尝试在一行中执行 3 个单独的步骤,并且可能被函数参数的未指定评估顺序绊倒。我必须承认,我不记得是否或在哪个版本的 C++ 中指定了函数参数的计算顺序。我建议你甚至不要试图记住它。而是编写在单独的步骤中执行单独步骤的代码。

您的 main 可能如下所示:

int main() {
    auto arr = Array_Elements();
    int number = num();
    Array_Search(arr,number);
}

即使没有 Array_Elements()num()Array_Searcher 的定义,也可以大致了解此处的三个步骤。


接下来,全局状态不干净。您的 Array_Elements () 不能合理地被调用两次:

int* first_array = Array_Element();
int* second_array = Array_Element();

两个指针指向同一个arr。第二次调用 Array_Element 将覆盖第一次调用分配的内容。

static int arr [5] {} 作为传递数组的解决方法是一种 hack。这不是解决该问题的正确方法。草率地说,它并不比意大利面条干净main


当你想要一个在编译时大小已知的堆栈分配数组时使用std::array,对于动态数组使用std::vector。它们可以在函数之间传递,你不需要跟踪与数组分开的大小:

std::vector<int> Array_Elements() {
    std::cout << "Enter Array size: ";
    unsigned size = 0;
    std::cin >> size;
    std::vector<int> result(size);
    std::cout <<  "Enter Array Elements: \n";
    for (auto& element : result){
        std::cin >> element;
    }
    return result;
}

循环是 range based for-loop。简而言之,它迭代了result中的所有元素,而element是对元素的引用。


习惯标准算法。他们没有做您自己无法编写的事情。尽管如此,它们有助于编写更清晰的代码,因为我们可以用一个有意义的名称调用一个函数,而不是让几行代码都处理一件事,“找到一个元素”:std::find.

void Array_Search(const std::vector<int>& arr,int n){
    auto it = std::find(arr.begin(),arr.end(),n);
    if (it == arr.end()) {
        std::cout << "No Element Found\n";
    } else {
        std::cout << "Element found at position: " << (it - arr.begin()) << "\n"; 
    }
}

如果找不到元素,它 returns 结束迭代器。当它找到元素时,我们可以通过减去开始迭代器来计算迭代器的索引。


Live Demo

让我们直接进入,我的建议是尽可能保持 main 干净,使用 class 然后实例化它的对象,然后使用该对象调用 main 中的 class 方法。这是最佳做法。

您的代码使编译器感到困惑,因为函数 num() 在计算顺序方面先于函数 Array_Elements()。我相信你想要相反的方式。

修复方法如下:删除函数 num(),并对您的代码进行以下更改


int* Array_Elements(int size) {
    int* arr, i;
    cout << "Enter Array Elements: " << endl;
    arr = new int[size];
    for (i=0; i<size; i++) {
        cin >> arr[i];
    }
    return arr;
}

void Array_Search (int *arr, int size) { 
    int temp = -1, num;
    cout << "Please enter an element to search" << endl;
    cin >> num;
    for (int i = 0; i < size; i++) {
        if (arr [i] == num) {
            cout << "Element found at position: " << i + 1 << endl;
            temp = 0;
            delete [] arr;
            break;
        }
    }
    if (temp == -1) {
    cout << "No Element Found" << endl;
    }    
}

int main () {
    int size;
    cout << "Enter Array size: ";
    cin >> size;
    Array_Search(Array_Elements(size),size);
    return 0;
}