2010-01-30 61 views
2

目前我的程序允许用户输入5个用于创建平均数的整数。这被设置为5,因为在输入第五个数字之后,循环被破坏。跳转循环,同时添加到动态数组 - C

我试图实现一种方法,它将让用户继续添加尽可能多的数字,因为他们喜欢的数组,然后我可以使用它来创建一个平均没有数量的限制可以输入。

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

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

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

#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); 
} 

虽然这可能不是实现它的最好方法,但它在预先指定数量的数量时工作。

解决此问题并允许用户输入尽可能多的数字的最佳方法是什么?

编辑:虽然我需要使用一个数组,但我决定这不是必须的,因为解决方案在不受限制的情况下简单得多。

+0

你真的有三个问题在这里。一个是处理未指定长度的输入,第二个处理动态数组,第三个是如何最好地形成平均值(答案是你不需要为* this *目的存储数据)。我认为所有这些观点都在下面的答案中得到了解答,并且在网站的其他地方肯定会涉及。 – dmckee 2010-01-30 23:33:45

+0

我知道我不需要将数字存储在数组中以形成平均值,我只是简单地指示尝试使用数组来完成它。 – 2010-01-31 17:47:04

回答

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; 
+0

似乎最简单的解决方案,我不想过度复杂它。谢谢。 – 2010-01-30 22:01:43

+0

在计算平均值时,我似乎有一个额外的价值,我已经设法解决这个问题,只需从计数中删除1以获得正确的金额。你能提出更好的解决方案吗? – 2010-01-30 22:10:59

+1

减去一个没有问题。也许你可以改变循环结尾的语句测试顺序和用于增加变量的语句。 – 2010-01-30 22:41:01

0

使用动态数组,像Java中的Vector(java.util.Vector)。

您可以实现轻松这样一个动态数组自己:

  • 尽快分配的大小N排列的,因为你需要N多的元素,分配一个新的更大的阵列(例如,具有尺寸N + 10 ),将旧数组的内容复制到新数组中,并将您的工作引用设置为新数组,并将您的数组大小变量N设置为新大小(例如N + 10)。释放旧的数组。
+1

这个问题被标记为C!没有这样的奢侈品。 – 2010-01-30 21:40:01

+0

@ Mehrdad Afshari:这就是为什么我添加了“你可以轻松实现这样一个动态数组”并解释它! – Curd 2010-01-30 21:41:29

+0

卡尔和其他人似乎都认同最简单最简单的方法就是完全忽略数组。 – 2010-01-30 22:00:40

2

基本上你开始用一个固定大小的一个动态分配的数组,然后分配一个新的数组,它是更大(比如说,两倍大初始大小),并从旧的阵列复制的东西到新每当你用完空间。

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

类似于this

3

如果您尝试计算平均值,则不需要保存数字。为自己省下担心阵列的工作。只需将每个数字累加(添加)到一个总数中,对每个数字进行计数,然后在完成时进行分割。两个变量都是你需要的。

使用这种方法,你是不是在你的溢出阵列的任何风险,所以你可以使用while循环......而(温度!= -1)

+0

我有同样的想法,请参阅我的编辑=] – 2010-01-30 21:38:39