在添加到动态数组时转义循环 - C

时间:2010-01-30 21:28:18

标签: c

目前我的程序允许用户输入5个用于创建平均数的整数。输入第五个数字后循环被破坏,设置为5。

我正在尝试实现一种方法,让用户可以继续向数组中添加任意数量的数字,然后我可以使用这些数据创建平均数而不限制可输入的数字量。

我遇到了一些问题,首先我无法创建一个dyamic数组,因为我不知道用户可能希望输入多少个数字,这意味着我无法给它一个明确的大小。

其次,我的程序当前创建平均值的方式是循环遍历数组中的元素并连续添加到一个整数,从中生成平均值。如果我无法确定数组,我无法指定循环的限制继续运行。

希望我的例子能更好地解释这一点。

#include <stdio.h>
#include <string.h>

void main()
{
    int i = 0;
    int arrayNum[5];
    int temp = 1;
    int anotherTemp = 0;
    int answer = 0;


    printf("Enter as many numbers as you like, when finished enter a negative number\n");

    for(i = 0; i < 5; i++)
    {
        scanf("%d", &temp);

        arrayNum[i] = temp;

        anotherTemp = anotherTemp + arrayNum[i];
    }

    answer = anotherTemp / 5;

    printf("Average of %d,%d,%d,%d,%d = %d",arrayNum[0],arrayNum[1],arrayNum[2],arrayNum[3],arrayNum[4],answer);
}

虽然这可能不是实现它的最佳方式,但是在事先指定数量时它会起作用。

解决此问题的最佳方法是什么,并允许用户根据需要输入尽可能多的号码?

编辑:虽然我需要使用数组,但我认为没有必要,因为解决方案更简单,不受限制。

4 个答案:

答案 0 :(得分:3)

在代码简单性方面,您可能想要查看realloc()函数;你可以分配一些大小的初始数组,如果用户输入太多数字,请调用realloc()以获得更大的数组并从那里继续。

然而,你根本不需要 来保留数字,至少如果你只关心平均值:

int input;
int sum = 0;
int count = 0;
int average;

while (1) {
    scanf("%d", &input);
    if (input < 0) {
        break;
    }
    sum += input;
    count++;
}

average = sum / count;

答案 1 :(得分:3)

如果您尝试计算平均值,则无需保存数字。节省自己担心阵列的工作。只需将每个数字累加(加)到一个总数中,计算每个数字,然后在完成时进行除法。您需要两个变量。

使用这种方法,你不会有任何溢出数组的风险,所以你可以使用while循环... while(temp!= -1)

答案 2 :(得分:2)

基本上,你从一个具有固定大小的动态分配数组开始,然后分配一个更大的新数组(比如初始大小的两倍),并在运行时将旧数组中的东西复制到新数组中空间不足。

对于问题的第二部分,请保留用户输入的项目数的计数器,并在平均时使用它。

类似于this

答案 3 :(得分:0)

使用动态数组数据结构,例如Vector in Java(java.util.Vector)。

您可以轻松实现这样的动态数组:

  • 分配大小为N的数组
  • 一旦你需要比N更多的元素,分配一个新的更大的数组(例如大小为N + 10),将旧数组的内容复制到新数组中并设置你对新数组和数组的工作引用大小变量N到新大小(例如N + 10)。释放旧阵列。