【问题标题】:C++ : Bizarre Numbers Appearing in OutputC++:输出中出现奇怪的数字
【发布时间】:2015-02-07 03:06:45
【问题描述】:

对于我的学校项目,我应该用(大约)-10 到 10 之间的随机数填充 20 个数组。然后,我必须根据它们是负数、0 还是正数来组织这些数字。我被告知要完成程序打印出原始数组以及新数组。

由于某种原因,有组织的数组在某些空格中打印出随机 (TYPE:long) 数字。我不确定为什么会这样。以下是我的代码:

#include <iostream>
#include <stdlib.h>
#include <time.h>

int main(int argc, const char * argv[]) {
// insert code here...
srand(time(NULL));
int numbers[20], final[20], first = 1, second = 1;

std::cout << "Enter 20 numbers, and without sorting, this program will take them and organize them based on positive, negative, and 0.\n\n";
for(int i = 0; i < 20; i++){
    std::cout << "Enter number " << (i+1) << ": ";
    //std::cin >> numbers[i];
    numbers[i] = (rand()%20 -10);
    std::cout << numbers[i] << std::endl;
}

//Numbers lower than 0
for(int i = 0; i < 20; i++){
    if(numbers[i] < 0){
        final[i] = numbers[i];
        first++;
    }
}
//Numbers equal to 0
for(int i = first; i < 20; i++){
    if(numbers[i] == 0){
        final[i] = numbers[i];
        second++;
    }
}
//Numbers greater than 0
for(int i = second; i < 20; i++){
    if(numbers[i] == 0){
        final[i] = numbers[i];
    }
}

std::cout << "This is your original array: ";
for(int i = 0; i < 20; i++){
    std::cout << numbers[i];
    if(i != 19)
        std::cout << ",";
    std::cout << " ";
    if(i == 19)
        std::cout << std::endl << std::endl << std::endl;
}

std::cout << "This your new, organized, array: ";
for(int i = 0; i < 20; i++){
    std::cout << final[i];
    if(i != 19)
        std::cout << ",";
    std::cout << " ";
    if(i == 19)
        std::cout << std::endl << std::endl << std::endl;
}

system("pause");
return 0;
}

我的输出是这样的:

Enter 20 numbers, and without sorting, this program will take them and organize them based on positive, negative, and 0.

Enter number 1: -6
Enter number 2: 0
Enter number 3: -4
Enter number 4: -5
Enter number 5: 0
Enter number 6: -4
Enter number 7: -5
Enter number 8: -5
Enter number 9: -8
Enter number 10: 5
Enter number 11: 0
Enter number 12: -3
Enter number 13: 5
Enter number 14: -5
Enter number 15: 7
Enter number 16: 2
Enter number 17: 9
Enter number 18: 9
Enter number 19: 3
Enter number 20: 2
This is your original array: -6, 0, -4, -5, 0, -4, -5, -5, -8, 5, 0, -3, 5, -5, 7, 2, 9, 9, 3, 2 


This your new, organized, array: -6, 1879110449, -4, -5, 0, -4, -5, -5, -8, 1, 0, -3, 1606416384, -5, 1606423158, 32767, 1606416416, 32767, 1606416416, 32767"

提前感谢所有回复的人。我真的很感激。

【问题讨论】:

  • 看起来具有意外值的元素从未被初始化。还可以考虑完全在正域中工作,并且仅在向用户展示时偏移 10。
  • 感谢您的偏移提示。我唯一担心的是意外的值是在'final [10]'数组下初始化的。我在 for 循环中初始化它们时犯了错误吗?似乎是对的......
  • 只有 final[i] 元素被设置为 number[i]

标签: c++ arrays sorting random


【解决方案1】:

您没有将数字放在正确的 final 数组位置,请检查现在如何使用 first 标记下一个元素应放入最终数组的位置:

我还删除了未使用的 second 变量

#include <iostream>
#include <stdlib.h>
#include <time.h>

int main(int argc, const char * argv[]) {
// insert code here...
srand(time(NULL));
// changed first = 1 to first = 0 and eliminated second
int numbers[20], final[20], first = 0;

std::cout << "Enter 20 numbers, and without sorting, this program will take them and organize them based on positive, negative, and 0.\n\n";
for(int i = 0; i < 20; i++){
    std::cout << "Enter number " << (i+1) << ": ";
    //std::cin >> numbers[i];
    numbers[i] = (rand()%20 -10);
    std::cout << numbers[i] << std::endl;
}

//Numbers lower than 0
for(int i = 0; i < 20; i++){
    if(numbers[i] < 0){
        // now it is put in final[first] instead of final[i] 
        final[first] = numbers[i];
        first++;
    }
}
//Numbers equal to 0
//changed i to start from 0 again
for(int i = 0; i < 20; i++){
    if(numbers[i] == 0){
        final[first] = numbers[i];
        first++;
    }
}
//Numbers greater than 0
for(int i = 0; i < 20; i++){
    if(numbers[i] > 0){ // Yeah, here was the typo... replaced `==` with `>`
        final[first] = numbers[i];
        // added this increment
        first++;
    }
}

std::cout << "This is your original array: ";
for(int i = 0; i < 20; i++){
    std::cout << numbers[i];
    if(i != 19)
        std::cout << ",";
    std::cout << " ";
    if(i == 19)
        std::cout << std::endl << std::endl << std::endl;
}

std::cout << "This your new, organized, array: ";
for(int i = 0; i < 20; i++){
    std::cout << final[i];
    if(i != 19)
        std::cout << ",";
    std::cout << " ";
    if(i == 19)
        std::cout << std::endl << std::endl << std::endl;
}

system("pause");
return 0;
}

【讨论】:

  • 感谢您的帮助!不幸的是,即使您进行了更改,控制台中的输出仍会显示奇怪的数字。是否有一个原因?再次感谢。
  • 查看我下面的评论“您的代码的另一个问题是//Numbers greater than 0 部分中的 if 语句中的拼写错误。我会让您自己计算一个 :)”跨度>
  • 是的,在大于 0 的循环中有一个 == 而不是 > :),现在应该可以正常运行了。
  • 如果拼写错误是指拼写错误,我看不出您在暗示什么。您是在间接告诉我应该将本节中的“int i = 0”更改为“int i = first”吗?谢谢。 :)
【解决方案2】:

final 数组的索引器应独立于 numbers 数组的索引器 (i) 增加。换句话说:

int idxFinal = 0; // determines where on the 'array' index to insert next

for(int i = first; i < 20; i++){
    if(numbers[i] < 0){
        final[idxFinal] = numbers[i];
        first++;
        idxFinal++;
    }
}

...

//Numbers equal to 0
for(int i = first; i < 20; i++){
    if(numbers[i] == 0){
        final[idxFinal++] = numbers[i];
        second++;
    }
}

您的代码的另一个问题是//Numbers greater than 0 部分中的if 语句中的拼写错误。我会让你自己想出一个:)

【讨论】:

  • 感谢您的快速回复!只是一个问题,变量 'second' 什么时候可以与您在代码版本中放置它的位置一起使用?
  • 如果您想跟踪有多少数字归入第一组(小于 0)和第二组有多少(等于 0)。我会将它们初始化为零的初始值。如果这不是必需的,那么您不需要这两个变量
【解决方案3】:

您在输出时收到奇怪的数字,因为您的代码没有完全填充数组(它会打印出已经在这些内存位置上的内容)。

无需提供代码(您就快到了):

  • 您应该在整个数组大小(0 到 20)中迭代您的 for 循环(所有三个循环),记住在这些循环中您试图检查值,因此您需要遍历所有这些循环.
  • 根据您的计数器(firstsecond)而不是基于i 分配给您的最终阵列。同样,i 仅用于循环遍历数组。这会导致您的阵列在这里有孔。当您输入 if 语句时,您只在它们各自的位置 (i) 为 final 赋值。
  • 您对大于零的数字的if 语句不正确,它检查是否等于。
  • 用 0 而不是 1 初始化 firstsecond

应该这样做。附带说明一下,您实际上并不需要两个单独的计数器,firstsecond。您可以只使用一个,在第一个循环中递增它,然后在第二个循环中继续递增它,依此类推。

【讨论】:

  • 感谢您的帮助!为什么我要迭代第三个 for 循环?我不确定这将如何改变控制台中的输出......
  • 您仍然需要将大于零的值添加到您的 final 数组中。不过,不要分配给final[i]。继续使用你的计数器,如final[second++]final[first++],如果你完全放弃第二个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 2021-12-03
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-29
相关资源
最近更新 更多