함수선언을 main()의 안에 하면 안 되는 건가요?

조회수 1777회

함수의 변수가 1개일때는 큰 문제가 없었습니다. 그런데 변수를 많게 해서 선언도 많이 하니 문제가 생겼습니다.

이 프로그램은 전체에 avg(평균을 저장할 곳), std(표준편차를 저장할 곳)이 적용되면서 10자리 숫자의 평균과 표준편차를 구할 수 있습니다. 그런데...

#include <stdio.h>
#include <math.h>
#define NUM  10

float avg, std;

void read_array(float n[], int size);
float average(float n[], int size);
float std_dev(float n[], int size, float average);
void print(float avg, float std);

int main()
{
    float a[NUM];


    read_array(a, NUM);
    average(a, NUM);
    std_dev(a, NUM, avg);
    print(avg, std);

    return 0;
}

void read_array(float n[], int size)
{
    int i;
    printf("%d개의 숫자를 차례로 입력하세요.\n", size);
    for (i = 0; i < size; ++i)
    {
        scanf_s("%f", &(n[i]));
    }
}

float average(float n[], int size)
{
    float sum = 0;
    int i;

    for (i = 0; i < size; ++i)
    {
        sum += n[i];
    }
    avg = sum / size;

    return avg;
}

float std_dev(float n[], int size, float average)
{
    float sum = 0;
    int i;

    for (i = 0; i < size; ++i)
    {
        sum += (n[i] - average)*(n[i] - average);
    }
    std = sqrt(sum / size);

    return std;
}

void print(float avg, float std)
{
    printf("평균     = %.2f\n", avg);
    printf("표준편차 = %.2f\n", std);
}

제가 의도하려고 했던건 main 함수 안에 평균값과 표준편차가 남아서 계산이 되도록 한거였는데 ...ㅠㅠ

이렇게요("float avg, std;"자리만 바꿨습니다.)

#include <stdio.h>
#include <math.h>
#define NUM  10



void read_array(float n[], int size);
float average(float n[], int size);
float std_dev(float n[], int size, float average);
void print(float avg, float std);

int main()
{
    float a[NUM];
    float avg, std;

    read_array(a, NUM);
    average(a, NUM);
    std_dev(a, NUM, avg);
    print(avg, std);

    return 0;
}

void read_array(float n[], int size)
{
    int i;
    printf("%d개의 숫자를 차례로 입력하세요.\n", size);
    for (i = 0; i < size; ++i)
    {
        scanf_s("%f", &(n[i]));
    }
}

float average(float n[], int size)
{
    float sum = 0;
    int i;

    for (i = 0; i < size; ++i)
    {
        sum += n[i];
    }
    avg = sum / size;

    return avg;
}

float std_dev(float n[], int size, float average)
{
    float sum = 0;
    int i;

    for (i = 0; i < size; ++i)
    {
        sum += (n[i] - average)*(n[i] - average);
    }
    std = sqrt(sum / size);

    return std;
}

void print(float avg, float std)
{
    printf("평균     = %.2f\n", avg);
    printf("표준편차 = %.2f\n", std);
}

그런데 이렇게 작성하여 실행하면 avg와 std가 선언되지 않았다고 뜹니다. ㅠㅠ 메인함수 안에서 선언해 놓으면 된거 아니었나요? 어디를 손봐야 하는지... 아니면 처음것 밖에 방법이 없는지 궁금합니다.

1 답변

  • 전역변수, 지역변수에 대해 학습을 해보시기 바랍니다.

    아래 함수에서 avg, std 라는 변수는 선언이 안된겁니다. 명시적으로 지역변수를 선언해야 합니다.

    float average(float n[], int size)
    {
        float sum = 0;
        int i;
    
        for (i = 0; i < size; ++i)
        {
            sum += n[i];
        }
        //avg = sum / size;
        float avg = sum / size; // ! 수정
    
        return avg;
    }
    
    float std_dev(float n[], int size, float average)
    {
        float sum = 0;
        int i;
    
        for (i = 0; i < size; ++i)
        {
            sum += (n[i] - average)*(n[i] - average);
        }
        //std = sqrt(sum / size);
        float std = sqrt(sum / size); //! 수정
    
        return std;
    }
    
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)