以下是我的一些代码: 我无法弄清楚如何通过perfectTest int传递数组。我有选项,如果n是-1,则打印出它是一个有缺陷的数字,如果n为0,则打印出它是一个完美的数字,如果n为1,则打印出它是一个丰富的数字数字,但我需要在其中包含数组。我需要一些提示。
//prototype
int perfectTest(int n);
//function
int perfectTest(int n)
{ bool perfect;
int answer;
int perfectSum = 0;
perfect = false;
for(int i=1; i<=n/2; i++)
{
if(n % i==0)
perfectSum = i;
}
if(perfectSum == n)
perfect = true;
answer = perfectSum;
}
//main function
int main()
{
char option;
int n, m;
bool InService = true;
char perfectTestingOption;
int perfectNum;
bool perfect = true;
int factor;
while (InService == true)
{
cout << "\t\t\nWelcome! Choose an option below\n" << endl;
cout << "A = Perfect number testing" << endl;
cout << "B = Greatest common divisors and least common multiples" << endl;
cout << "C = Factorization of natural numbers" << endl;
cout << "Q = Quit the program\n" << endl;
cout << "Enter your choice:" << endl;
cin >> option;
if (option == 'A' || 'a')
{
cout << "\t\t\nWhich option would you like?\n" << endl;
cout << "1" << endl;
cout << "2" << endl;
cout << "3" << endl;
cout << "4" << endl;
cin >> perfectTestingOption;
if (perfectTestingOption == '1')
{
cout << "Enter a positive integer to check if it is a perfect number." << endl;
cin >> perfectNum;
perfectTest(0);
for( );
if (n == -1)
{
cout << "That number is a deficient number" << endl;
}
else if (n == 0)
{
cout << "That number is a perfect number" << endl;
}
else if (n == 1)
{
cout << "That number is a abundant number" << endl;
}
else
{
cout << "Number is invalid" << endl;
}
}
答案 0 :(得分:0)
数组只不过是通过偏移内存中的某个基址寻址的数据块。如果您有基本地址,元素数量和元素的数据类型,则您有足够的信息将数据视为数组。
您可以直接声明数组 -
int array[SIZE];
其中SIZE
是一个整数,表示数组中的元素数。请注意,对于SIZE
的大值,声明此逐字是坏主意,因为此语法在堆栈上分配数组,该数组相对于主内存的大小具有严格的大小限制。
相反,您可以分配指针,然后将它们初始化为指向某个堆空间 -
int * array = new int[SIZE];
这会为一小块动态分配一些内存,并为您提供第一个&#39;插槽的地址。事实证明这就足够了,因为下一位的括号语法可以作为一个&#39;偏移&#39;操作
要声明数组变量,要访问单个元素:
int foo = array[idx]
其中idx
是一些int。例如,如果idx
等于1(将其替换为文字1,或者将变量或表达式替换为整数1),我们将获得插槽1插槽中的整数到& #34;右&#34;第一个元素回想一下,C(++)中数组中的第一个元素有索引0,因为程序员很疯狂,喜欢用0索引事物(并且因为括号运算符指定了一个 offset 来自地址第一个要素)。
我们如何将数组传递给函数?如果我们知道每个数组元素的数据类型以及数组长度,那么传递它们的内存地址就足够了。 传递并检查数组长度非常重要!不这样做可能会导致可怕的后果,因为您超出了数组的边界并开始覆盖程序中的其他值。 (更高级的数据结构和其他编程语言可以自动进行边界检查。由于我们使用裸阵列,边界检查是我们的责任。)
现在让我们回到原来的问题。假设我们有一个函数int f(int i)
,可以对任何内容做一些很酷的事情。我们希望对数组进行排序。这个函数使得它也需要数组并返回数组。
我们将利用这样一个事实,即我们确切地知道我们的数组有多长,因为在我们的情况下输出数组与输入数组的大小相同。因此,我们不必担心将该数字传递出阵列化函数,尽管有一些简单的技术可以做到这一点。
我们这样做:
int * __f(int * __i, int ilen)
{
int * output = new int[ilen];
for(int offset = 0; offset < ilen; offset++)
{
output[offset] = f(__i[offset]);
}
return output;
}
此函数采用包含ilen
整数的整数数组,并将f
的结果输出到每个整数。请注意,此函数会分配新内存,以后您需要delete[]
。通过一些简单的修改,您可以更改此函数以就地修改数组。
让我们逐行分解:
int * __f(int * __i, int ilen)
功能签名。这告诉我,我将地址转换为ilen
整数数组,并将地址返回给另一个这样的数组。
int * output = new int[ilen];
为我们的输出分配新内存。如果您已完成内存块foo
,则在完成后应delete[] foo
;否则内存将保持分配并占用空间,直到程序终止。如果您想了解更多信息,请阅读动态内存分配。
for(int offset = 0; offset < ilen; offset++)
{
output[offset] = f(__i[offset]);
}
对于数组中的每个元素(由offset
计数器索引),我们对输入数组f
的相应元素执行__i
,并设置{的正确元素{1}}数组到结果。
output
最后,我们返回我们构造的数组。从技术上讲,我们返回一个 return output;
,但这只是一种奇特的方式来说明&#34;一个或多个整数的内存地址&#34;。
我在整篇文章中一直使用指针语法(int *
)。对指针的深刻理解需要一些时间来为很多人开发(包括我自己;我几年没有得到指针!)。简而言之,但是:
*
形式的变量包含内存地址。从语义上讲,该存储器地址被指定为指向int * foo
。但实际上,地址只是一个地址。 (存储器地址是对应于存储器中特定单元的数字。从我们的角度来看,您可以将存储器单元视为连续的地址;即,单元100与单元101相邻。我们编号内存,我们使用1字节的单元格大小。更大的构造的地址,如4字节int
或int
的数组,是第一个元素的地址。) int
后,foo
本身就是指存储在其中的地址。如果我们想要foo
指向的值,我们会说foo
。在这种情况下,*foo
是取消引用运算符:它需要一个内存地址并返回那里的内容。*
的地址,我们说bar
。此上下文中的&bar
是地址 - 运算符:它接受一个变量并告诉您它的位置。&
是一个完全有效的内存地址。小心,你呢!每个&#34; 1&#34;加法和减法不是一个存储单元,而是多个存储单元等于数组封装的类型的大小。在我们的例子中,由于foo + 3
在大多数现代平台上都是4个字节,int
将3 * 4 = 12个内存单元添加到foo + 3
的地址,而不是3。foo
适用于任何n值,就像您预期的那样。