数组和函数
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 结束迭代器。当它找到元素时,我们可以通过减去开始迭代器来计算迭代器的索引。
让我们直接进入,我的建议是尽可能保持 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;
}
我正在尝试让函数在主函数中调用,尽量保持“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 结束迭代器。当它找到元素时,我们可以通过减去开始迭代器来计算迭代器的索引。
让我们直接进入,我的建议是尽可能保持 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;
}