2016-06-24 32 views
0

我有一个现有的程序,可以找到最高,最低和平均的用户输入数字。然而,不是,我正在试图将这些计算并将其分为单独的功能。我的问题是,我不明白如何将这些共享变量的计算等等,并将它们放入他们自己的单独函数中。下面是我的代码,在底部的评论是我尝试和失败的。需要采取现有的程序和中断计算功能

工作代码:

#include <stdio.h> 

int main(){ 

int grades [100]; /*variables defining the array, the iterator, and input; which lets us take the input and validate before passing to the array*/ 
int i = 0; 
int small, big, input; 

printf("Enter a series of grades. When done, enter any number above 100.\n\n"); 

while (i <= 100) { //while loop to set maximum for array 
    printf("Enter grade:"); 

    if (scanf("%d", &input) == 1) { 
     if (input >= 0 && input <=100) { //validate and impose constraints on grade values 
      grades[i] = input; //if good, add to array 
      i++; 
      } 
     else { 
      printf("\n\nExiting entry.\n"); 
      printf("\n\nGrades entered:\n\n"); 
      break; //exiting loop 
      } 
     } 
    } 
int x, y; 


big = small = grades[0]; 
for (y = 0; y < i; y++) { 
    if (grades[y] > big) { 
     big = grades[y]; 
     } 
    else if (grades[y] < small) { 
     small = grades[y]; 
     } 
    } 
int sum = 0, avg = 0; 
for (y = 0; y < i; y++) { 
    sum += grades[y]; 
    } 
avg = (double) sum/i;  //formula for determining average 
printf("Highest number : %d\n", big); 
printf("Smallest number: %d\n", small); 
printf("Average: %d\n", avg); 



return 0; 
} 

故障代码:

int x, y; 

for (x = 0; x < i; x++) { 
    printf("Grade: %d\n", grades[x]); //print array 
    } 
big = small = grades[0]; 
for (y = 0; y < i; y++) { //for loop 
    large(grades,y); 
    smallest(grades,y); 
    } 
int sum = 0, avg = 0; 
for (y = 0; y < i; y++) { //for loop for determining sum of grades 
    sum += grades[y]; 
    } 
avg = (double) sum/i;  //formula for determining average 
printf("Highest number : %d\n", big); 
printf("Smallest number: %d\n", small); 
printf("Average: %d\n", avg); 



    return 0; 
} 

void large(int grades[], int y); 
void smallest(int grades[], int y); 
+0

传递的参数类型不正确,例如'grades'是'int',所以'grades [y]'会导致错误。 – ameyCU

回答

0

你在这里 有多个问题,你不对齐调用函数的语法与函数原型 和你都没有通过等级阵列正确地作为功能参数 尝试

for (y = 0; y < i; y++) { //for loop 
largest(grades, y); 
smallest(grades, y); 
} 

与功能定义:

void largest(int grades[], int y); 
void smallest(int grades[], int y) 

这样说来,在性能方面可以计算最小值,最大值和平均值的飞行,以避免多次循环

+0

测试它给了我各种警告和错误。警告:'大'的冲突类型和'小'的相同错误。此外,对于“大”的未定义引用的错误,对于小的相同。然后给出退出状态错误。我确信我正在做一些愚蠢的事情,我修改了上面的代码以匹配我为你解释的内容。 –

+0

这可能是因为你使用2个不同的文件没有?在这种情况下,您需要确保第二个文件可以看到变量(在第一个文件中声明为全局变量,通过添加extern int small,large等等 – claudio06

0

由于@Cherubim阿南德已经说过:问题是grades的范围,您可以使变量全局变量,如@Cherubim Anand已经提出或者将其作为参数发送给函数。

int largest(int *grades) 
{ 
    int i,big; 
    big = grades[0]; 
    for (i = 1;grades[i] != -1;i++) { 
     if(grades[i] > big){ 
      big = grades[i]; 
     } 
    } 
    return big; 
} 

,并调用它通过

big = largest(grades); 

另一个问题:如果输入的不是数字,while循环不会再停下来,因为i如果输入的是一个数字只增加。

确切的方法或多或少的口味的问题,这里是我的:

puts("Enter a series of grades between 0 (zero) and 100 (one hundred)."); 
    puts("When done, enter 'done'."); 
    while (i <= 100) { 
    printf("Enter grade:"); 
    if (scanf("%d", &input) == 1) { 
     // if the number is in the right range: keep it 
     if (input >= 0 && input <= 100) { 
     grades[i] = input; 
     i++; 
     } else { 
     // if not: print a hint 
     printf("\nGrades are between 0 (zero) and 100 (one hundred).\n"); 
     } 
    } else { 
     // anything else, including the string "done", ends the sampling 
     grades[i] = -1; 
     printf("\n\nExiting entry.\n"); 
     printf("\n\nGrades entered:\n\n"); 
     break; 
    } 
    } 

BTW:你应该成为一个习惯,最终main()exit(EXIT_SUCCESS),而不是仅仅返回0(零),并与exit(EXIT_FAILURE)以防发生致命错误。没有必要像你的例子那样简单的事情,但稍后有用。您可以查看exit(3)了解更多详情。

1

虽然其他的答案推荐使用的全球使在从main调用的函数可用grades阵列,普遍接受的方式,使提供给一个函数的值是传递值(或指针的值)作为参数的函数。你应该避免使用全球变量,除非他们是绝对必要的(你开始学习C时不可能遇到的情况)。

当您将参数传递给函数时,该函数将收到副本。如果传递一个值,如整数或浮点数,则该函数将对该值的副本进行操作,并且除非该值为返回的分配为,否则而不是在调用函数中可见。

当你传递一个指针作为参数,功能还是接收副本,但指向的地址复制是在调用函数(main这里)由原始的阻碍非常相同的地址。因此,对调用函数中指向的值的任何更改都立即可见。这是一个什么样你会听到如按值传递通过引用传递(即使两者实际上是按引用传递)

在你的情况概要,填写整数值数组(grades),其您想循环查找值以及average。你希望这可以在一个或多个功能中完成。将函数分解为maxmin函数和average函数将提供将指针传递给某个值的示例,并将这些更改显示在mainmaxmin的情况下)以及返回并分配值(在average的情况下)

首先,让我们来看一个简单的函数来找到grades中的最大值和最小值。您需要通过数组grades(实际上将指针传递给成绩),则需要传递grades数组中的值的数目,然后,要更改main中提供的maxmin的值,您将将指针指向maxmin作为参数。例如: -

void maxmin (int *arr, int n, int *max, int *min) 
{ 
    int i; 

    if (!arr || !max || !min) return; /* validate pointers */ 
    *max = INT_MIN, *min = INT_MAX;  /* initialize max/min */ 

    for (i = 0; i < n; i++) {   /* update max/min pointers */ 
     if (arr[i] > *max) *max = arr[i]; 
     if (arr[i] < *min) *min = arr[i]; 
    } 
} 

上面,你只是想初始化的maxmin值足够低/高使所有最大/最小值记录。 (例如,如果你的价值观是-100 to 10你初始化既0,你的最大永远不会改变)

对于一般的,你会通过grades和值的方法相同的数,但是在这里你会return的价值average从功能。您必须将返回值指定为main中的值,以使该值可见。

注:函数可以返回其类型的值,但它不能返回一个指针的函数中声明的静态对象。为什么?因为这些值驻留在函数返回时被销毁的函数堆栈中。只有返回被保留给调用者(稍后担心这一点)。对于一般的,你可以这样做:

float average (int *arr, int n) 
{ 
    int i, sum = 0; 

    if (!arr) { 
     fprintf (stderr, "average() error: invalid array.\n"); 
     return -1.0;     /* validate pointer */ 
    } 
    for (i = 0; i < n; i++)   /* compute average */ 
     sum += arr[i]; 

    return (float)sum/n; 
} 

现在把所有的作品一起在很短的例子(注意输入的结束通常由手动生成EOF这是按ctrl + d在Linux或指示CTRL + Z上windoze),你可以不喜欢以下(同时仍允许超过100的任何值导致返回)

#include <stdio.h> 
#include <limits.h> 

enum { MAXG = 100 }; 

void maxmin (int *arr, int n, int *max, int *min); 
float average (int *arr, int n); 

int main (void) { 

    int grades[MAXG] = {0}, i, idx = 0, input, max, min; 
    float avg = 0.0; 

    printf ("Enter a series of grades. [ctrl+d] when done:\n\n"); 

    while (idx < MAXG && printf ("grade[%3d]: ", idx) && 
     scanf ("%d", &input) == 1 && 0 <= input && input <= 100) 
     grades[idx++] = input; 

    maxmin (grades, idx, &max, &min);  /* compute max/min */ 
    if ((avg = average (grades, idx)) < 0) /* compute average */ 
     return 1; 

    printf ("\nThe grades entered were:\n\n"); 
    for (i = 0; i < idx; i++) 
     printf (" grades[%3d] : %d\n", i, grades[i]); 

    printf ("\n maximum : %d\n minimum : %d\n average : %.2f\n\n", 
      max, min, avg); 

    return 0; 
} 

void maxmin (int *arr, int n, int *max, int *min) 
{ 
    int i; 

    if (!arr || !max || !min) return; /* validate pointers */ 
    *max = INT_MIN, *min = INT_MAX;  /* initialize max/min */ 

    for (i = 0; i < n; i++) {   /* update max/min pointers */ 
     if (arr[i] > *max) *max = arr[i]; 
     if (arr[i] < *min) *min = arr[i]; 
    } 
} 

float average (int *arr, int n) 
{ 
    int i, sum = 0; 

    if (!arr) { 
     fprintf (stderr, "average() error: invalid array.\n"); 
     return -1.0;     /* validate pointer */ 
    } 
    for (i = 0; i < n; i++)   /* compute average */ 
     sum += arr[i]; 

    return (float)sum/n; 
} 

示例使用/输出

$ ./bin/grades1 <dat/grades.txt 
Enter a series of grades. [ctrl+d] when done: 

<snip entry> 

The grades entered were: 

grades[ 0] : 80 
grades[ 1] : 97 
grades[ 2] : 72 
grades[ 3] : 78 
grades[ 4] : 94 
grades[ 5] : 91 
grades[ 6] : 78 
grades[ 7] : 94 
grades[ 8] : 89 
grades[ 9] : 72 

    maximum : 97 
    minimum : 72 
    average : 84.50 

看一下,然后告诉我知道,如果你有任何问题,并且记住全球只有在绝对必要作为一般规则。