从用户那里获得无限量的输入而不是打印最大的 3 ,而不使用数组

getting infinte amount of inputs from the user than printing the biggest 3 , without using arrays

第一次,第一次学习编写任何代码。对不起我的无知。 所以我被要求编写一个程序,从用户那里获取无限数量的数字,直到他提交我设法做得很好的数字,但我还需要打印以下三个输入的最大总和,例如,用户输入 4,20,2,4,11,9,8,1 程序应该打印 11,9,8 因为这 3 个的总和大于所有其他 3 个。 我必须告诉你我不能使用数组,我知道它是个笨蛋,但我知道没有数组也是可以的。

我试图构建一个函数,它试图像一个数组一样工作,但我真的不能给她回电话,因为它是一个双变量函数,其中一个是输入,我显然不知道.已经在这个问题上工作了 5 个小时了,我想请教你的智慧

cout << " enter numbers as long as you wish" << endl;
cout << "when you wish to stop enter the number 1" << endl;
int n;
int sum;
int i = 1;


while (n != 1) { 

    cin >> n;
    remember(i, n);
    if (n == 1) {
        cout << "you choosed to stop " << endl;
        break;
    }
    i++;
}

我尝试构建的函数非常简单,但我无法调用任何特定值,例如 remember(1, n),当我想将它们相加并查看谁更大时。

int remember(int i, int n){
    return n;
}

*** 请注意,正在测试的总和是按照用户提交的确切顺序排列的数字总和,因此 11、9、8 是输出,而不是 20、11、9

首先,n 未初始化,因此当您执行 while (n != 1){ 时它是未定义的行为。所以从技术上讲,不能保证任何事情都可以通过。您应该初始化它,例如将其设置为 0(或任何其他不是 1 的值,在这种情况下):

int n = 0;

但是您观察到的问题是因为您的循环中有另一个 int n;,它遮蔽了外部 n(在 while 条件下检查的那个)。所以 cin >> n; 只会修改内部的 n。外部的将保持相同的未初始化值。因此,如果该值使其进入循环,它将永远不会退出循环,因为 n != 1 始终是 true.

把循环里面的int n;去掉就解决了

基本上,您需要 4 个变量来计算实际列表及其总和(3 个用于列表,1 个用于总和)

您还需要 3 个变量来计算实际列表。

在每次互动中,您有两件事要做:

  • 将实际列表的总和与存储的列表进行比较。如果实际列表的总和大于存储的总和,则将其实际化
  • 对于每个新数字,轮换占实际列表的变量。

在伪代码中:

v3 = v2;
v2 = v1;
v1 = new_number;

您需要七个变量:三个是您当前正在阅读的 "window",您可以用它来检查总和;三是 "biggest sum" 三元组;还有一个是当前输入。

对于您读入 "current input" 变量的每个输入,您 将 window 向下移动一个值并将顶部变量设置为刚刚读取的输入.

然后你取 window 中所有三个值的总和,并检查它是否大于当前 "biggest sum" 三元组的总和。如果是,则使 "biggest sum" 三倍等于当前 window 值。

迭代直到没有更多输入,然后打印 "biggest" 个值。


关于三个 window 值的 shifting,假设您有三个变量,分别命名为 window1window2window3 那么你可以这样移动:

window1 = window2;
window2 = window3;
window3 = current;

检查总和就像

一样简单
if ((window1 + window2 + window3) > (biggest1 + biggest2 + biggest3))

所有 window 和最大的变量都需要初始化为该类型的可能的最低值(对于 int,即 std::numeric_limits<int>::min())。

由于您初始化了所有值,因此不需要为第一个和第二个输入设置特殊情况。

在有输入时进行迭代可以通过

来完成
while (std::cin >> current)