所以我应该做一个函数,它接受一个数组并“删除”偶数,只吐出奇数。我们已经获得了部分代码,如下:
int arr1[] = {1, 4, 7, 1, 2, 10, 1};
int size = sizeof(arr1) / sizeof(int);
keepOdd(arr1, size);
for (int i = 0; i < size; i++)
cout << arr1[i] << " ";
cout << endl << "Totally " << size << " values left.";
我接受了它并对其进行扩展,然后我想到了:
void keepOdd(int[], int);
void keepOdd(int& arr, int& size) {
int counter, newarr[size];
counter = 0;
for (int i = 0; i < size; i++) {
if (arr[i] % 2 == 1) {
counter++;
newarr[i]= arr[i];
}
}
size = counter;
for (int i = 0; i < size; i++)
arr[i]=newarr[i];
}
int main () {
int arr1[] = {1, 4, 7, 1, 2, 10, 1};
int size = sizeof(arr1) / sizeof(int);
keepOdd(arr1, size);
for (int i = 0; i < size; i++)
std::cout << arr1[i] << " ";
std::cout << endl << "Totally " << size << " values left.";
}
但是我的代码根本无法运行。
这是错误消息:
extra credit.cpp: In function 'void keepOdd(int&, int&)':
extra credit.cpp:15:13: error: invalid types 'int[int]' for array subscript
if (arr[i] % 2 == 1) {
^
extra credit.cpp:17:23: error: invalid types 'int[int]' for array subscript
newarr[i]= arr[i];
^
extra credit.cpp:22:9: error: invalid types 'int[int]' for array subscript
arr[i]=newarr[i];
^
extra credit.cpp: In function 'int main()':
extra credit.cpp:36:14: error: 'endl' was not declared in this scope
std::cout << endl << "Totally " << size << " values left.";
^~~~
extra credit.cpp:36:14: note: suggested alternative:
iostream:39:0,
from extra credit.cpp:1:
ostream:590:5: note: 'std::endl'
endl(basic_ostream<_CharT, _Traits>& __os)
^~~~
我必须使用数组,但是我看不到如何正确使用数组。
答案 0 :(得分:2)
问题在这里:
void keepOdd(int& arr, int& size) {
^^^^^^^^
名称为arr
的函数的第一个参数的类型是“对整数的引用”。
函数中的这一行:
newarr[i]= arr[i];
^^^^^^
您在引用的整数上应用下标运算符。没有这样的运算符,其中左侧参数(arr
)和右侧参数(i
)都是整数。这样,程序格式不正确。因此,编译器错误:
error: invalid types 'int[int]' for array subscript newarr[i]= arr[i];
该参数的相同问题也是其他类型不匹配错误的原因。
我怀疑您可能打算改用指针参数。
error: 'endl' was not declared in this scope
您已在程序中使用标识符endl
。您的程序中没有endl
的声明。那就是编译器告诉你的。
编译器还为您找到了潜在的解决方案:
note: suggested alternative: iostream:39:0 note: 'std::endl'
编译器告诉您的是,标题std::endl
中声明了<iostream>
。 <iostream>
是标准库头。如果您确实打算使用std::endl
(并且我怀疑您这样做过),则可以通过键入std::endl
而不是endl
来使用它。
P.S,您可能不需要使用std::endl
。 '\n'
对您来说足够了,不会因为刷新输出流而不必要地降低程序速度。
int counter, newarr[size];
size
不是编译时间常数。自动数组的长度必须是编译时间常数。因此,该程序格式不正确。
如果需要一个其长度在运行时确定的数组,则可以动态分配该数组。动态分配数组的最简单方法是使用std::vector
。
答案 1 :(得分:1)
要使代码正常工作,需要进行一些更改:
首先,用于传递数组和大小的函数标头如下所示:
int keepOdd(int* arr, int size);
请注意,我们将返回一个int:这是数组的新大小。
那么可以大大简化keepOdd的逻辑:
int keepOdd(int* arr, int size) {
int counter;
counter = 0;
for (int i = 0; i < size; i++) {
if (arr[i] % 2 == 1) {
arr[counter++]= arr[i];
}
}
return counter;
}
这里您不需要创建新的数组:您将使用下一个奇数元素重写偶数元素并返回新的数组大小。
然后,只需使用新的尺寸来打印元素:
int main () {
int arr1[] = {1, 4, 7, 1, 2, 10, 1};
int size = sizeof(arr1) / sizeof(arr1[0]);
std::cout << "size is " << size << "\n";
int newSize = keepOdd(arr1, size);
for (int i = 0; i < newSize; i++)
std::cout << arr1[i] << " ";
std::cout << std::endl << "Totally " << size << " values left.";
}