c++ 将用户输入的int作为大小,int作为数组,然后显示数组,最后一个索引到第一个索引

1u4esq0p  于 2023-06-07  发布在  其他
关注(0)|答案(3)|浏览(236)

我是C++的初学者。我花了几个小时试图弄清楚循环和数组的结构。
目标:获取用户输入并将其设置为数组的大小分配。接受另一个用户输入并将值添加到数组中。向后显示数组的输出。[last index.....first ind`ex]
我到处都读到过,在我的教科书中,空格不被cin >>计数,但我的代码显示了空格。我已经试着测试我的循环是否正确地将输入值添加到循环中。也许我的输出循环是错误的?我不知道问题出在哪里。
这些是我得到的示例输出。如果我有一个5个元素的数组,为什么只有3个元素输出?在向后输出循环中,我没有看到所有的数组项,它重复3。
我有很多评论来记录我的思考过程。谢谢你帮我看了一下,帮了我一把!!
我的测试用例示例:

5

1 2 3 4 5

print array 

123

backwards array 
3 3 2 1 

...Program finished with exit code 0
Press ENTER to exit console.

预期示例:(用户输入)5
(user输入)1 2 3 4 5(按回车)
预期输出:
五四三二一

#include <iostream>
#include <string>
using namespace std;

int main() {
    
  //write your solution here
  //define variables
  //int sizeofArray;
  
  //need to account for spaces
  //no you don't they are accounte for
  //int array[sizeofArray];
  int num;
  
  int sizeofArray;
  int array[sizeofArray];
  
  cin >> sizeofArray;

  //think about 2 for loops
  
  //store values to the array
  for (int i=0; i < sizeofArray; ++i) {
      
      //for each index, populate the array
      cin >> array[i];
  }//end of populate array
  
  cout << "\nprint array \n";
  
  //print the array
  for (int k=0; k < (sizeofArray); k++) {
      cout << array[k];
  }//end of print array
  
    
  //output values of the arrray backwards
  cout << "\nbackwards array \n";
  
  for (int j=sizeofArray; j >=0; --j) {
      cout << array[j] << " ";
  }
  
  
                   
  return 0;
}//end of main
  • 我试着把数组打印出来看看系统能看到什么。我得到一个不正确的输出
  • 我尝试学习和使用正确的递增/递减语法,i或i
  • 我尝试通过向“sizeofArray”添加乘数2来解决空格问题
w6lpcovy

w6lpcovy1#

当你想在运行时创建一个指定大小的数组时,你必须使用动态分配(在堆上)。您可以在互联网上搜索动态分配。
你也可以考虑使用std::vector来完成这个任务,因为它实际上是在做同样的事情。
我用动态分配的int数组重新编写了你的代码。值得注意的是,每次使用动态分配时,都必须使用delete或delete[]与数组一起释放内存以防止内存泄漏。
我还使用了std::reverse来简化代码。它反转数组,因此您不必以相反的顺序打印它。但是,如果不想更改数组,可以使用程序中的循环。

#include <iostream>
#include <algorithm>


int main(int argc, char *argv[]) {
    //take user input
    int array_size;
    std::cin >> array_size;
    
    //dynamically allocate the array with non constant size
    int* array = new int[array_size];
    
    //read input
    for (int i = 0; i < array_size; i++) {
        std::cin >> array[i];
    }
    
    for (int i = 0; i < array_size; i++) {
        std::cout << array[i] << ' ';
    }
    std::cout << std::endl;
    //use std::reverse from algorithm library
    std::reverse(array, array + array_size);
    
    for (int i = 0; i < array_size; i++) {
        std::cout << array[i] << ' ';
    }
    std::cout << std::endl;
    
    //free the dynamically allocated memory
    delete[] array;
    
    return 0; 
}

请注意,当您在数组创建后更改array_size时,它不会调整数组的大小。
我建议你阅读更多关于C++中内存管理的内容。当你完全理解内存是如何工作的,你的代码会有更少的bug。

zour9fqk

zour9fqk2#

你犯了一些小的逻辑错误。
你仍然是一个学生,所以这将随着时间的推移,但始终有一个重点,了解C++是如何工作的。语义错误比句法错误更难发现。
你的代码的第一个问题是,你在询问用户要做多大的数组之前就初始化了它。如果您稍后询问,它将更改sizeofArray变量,但不会调整已创建数组的大小。实际上,要调整数组大小,必须分配一个新数组,并将旧元素复制到新数组中,然后删除旧数组。
我想你还没有学习向量,因此,让我们弄清楚如何在实现数组时修复此代码。
密码:

int sizeofArray;    //int whose size is garbage
  int array[sizeofArray];  // Array is made of garbage size
  
  cin >> sizeofArray;

//用于获取输入的变量现在是所需的大小,//然而,原始数组仍然是垃圾大小。
您可以通过简单地更改顺序来解决此问题,以便计算机知道要创建的数组的大小。

int sizeofArray;
  cin >> sizeofArray;

  int array[sizeofArray];

现在,将创建具有从用户读取的大小的数组。
第二个错误:当向后打印数组时,如果从sizeofArray开始,您将尝试打印出不存在的索引。
假设sizeofArray = 4,你有索引0,1,2,3,因为我们从0开始计数。如果最高索引为3,并且您尝试从sizeofArray开始打印,则会尝试打印不存在的Array[4]。
如何解决这个问题:简单,我们从sizeofArray中减去1。现在它将打印索引3,2,1,0

for (int j = sizeofArray - 1 ; j >=0; --j) {
  cout << array[j] << " ";

}

ax6ht2ek

ax6ht2ek3#

int sizeofArray;

这将声明一个名为sizeofArrayint。这个int没有初始化,所以它包含随机垃圾。

int array[sizeofArray];

这是错误的,原因有二。这不是有效的C++。在C中,所有数组的大小***是在编译时指定的固定常量***。这就是C数组的工作方式。int a[4]是有效的数组声明。这个数组的大小是4。它在编译时指定。不能通过非常数表达式指定数组的大小。你的C编译器只接受这个结构作为 C 的非标准扩展,但即使假设你愿意使用这个非标准C++,这也会因为另一个原因而失败:

cin >> sizeofArray;

这现在从cin读取sizeofArray。您显然希望这将导致前面声明的数组具有此大小。这是不会发生的(这是数组声明的第二个错误)。数组是使用未初始化的变量作为其大小声明的,这是未定义的行为。
C不是这样工作的,C不像电子表格那样工作。如果声明一个数组,其大小由变量指定(使用非标准C扩展),然后更改变量的值,这不会追溯更改先前声明的数组的大小。C代码一次执行一个语句:你声明一个东西,它就被声明了你声明了别的东西,别的东西被声明了;你改变了某个变量的值,它就改变了如果先前基于该变量的内容设置了不同的变量,则先前设置的变量的值不会仅仅因为该变量现在具有不同的值而自动改变。这是电子表格的工作方式,而不是C++。
您必须更正所有这些问题才能修复程序。如果你想继续使用非标准C++,你可以在***声明array之前***cin >> sizeofArray
或者,如果你真的想学习如何使用标准C正确地做到这一点,你可以继续阅读你的C教科书,直到你得到一个描述和解释什么是std::vector,以及它是如何工作的,然后采取这种方法。

for (int j=sizeofArray; j >=0; --j) {
      cout << array[j] << " ";
}

又一个逻辑缺陷。假设sizeofArray是3。数组中有三个值。它们是array[0]array[1]array[2]
如果你在纸上和铅笔上计算出上面的内容,它会尝试打印array[3],然后是array[2],然后是array[1],最后是array[0]。很明显,没有array[3],所以这个循环的逻辑也需要调整。注意,必须打印的第一个值,即循环的第一次迭代,应该比数组的大小小***一。你可以简单地通过在***打印每个数组元素的值之前***递减索引变量j--来实现,而不是在打印之后(作为循环迭代的一部分)。

相关问题