2010-04-14 3 views
0

콘솔 코드의 막대 다이어그램을 나타내는 주파수 프로그램을 작성하려고합니다. 문제는이 주파수를 정확하게 계산하는 방법이 정확히 무엇인지 또는 주파수 (물결 계산)에 따라 바의 높이를 정확히 지정하는 방법을 알 수 없다는 것입니다.무작위 값이있는 빈도 테이블

주파수 높이는 21로 제한되며 막대가 1에서 21로 바뀌므로 최대 막대 높이는 예를 들어 21 개의 별 (* 막대 자체의 표시 기호로 사용)입니다.

I는 주파수 (정확한 경우 비록 확인되지 않음) 지금까지이 계산은이 배열이 랜덤 값 생성 얻어 이하이다

:

이 0과 21 사이의 값을 초래
for (int j = 0; j < T.Length; j++) 
{ 
    T[j] = (MaxHeight* T[j])/Ber.GreatestElement(T); 
    Console.Write("{0,7}", T[j]); 
} 

를 바탕으로 내 막대가 다른 모든 빈도 값과 비교하여 특정 높이를 제공해야하는 값입니다. 예를 들어 8000은 높이가 21이고 39는 1을 가질 수 있습니다.

이 다이어그램을 표현하기 위해 나는 높이와 너비를 표시하기 위해 루프를 사용했습니다 (단, using System;을 "기본"으로 유지하는 것을 염두에 두십시오).

for (int height= 1; height<= 21; height++) 
{ 
    for (int width= 0; width<= 10; width++) 
    { 
     if(...??) 
     { 
      Console.Write("{0,7}", bar); // string bar= ("*"); 
     } 
     else 
     { 
      Console.Write("{0,7}", empty); 
     } 
    } 

    Console.WriteLine(); 
} 

지금까지 I *이 AND (I는 주파수 값을 올바르게 계산되면 모를지라도) 그 주파수 값과 함께 생성 된 랜덤 값으로 채워진 필드 전체를 갖는다. 두 번째 forif (...)이 필요하다고 가정합니다.하지만 이보다 더 이상 나을 수는 없습니다.

+0

여기에 어떤 질문이 있는지 잘 모르겠습니다. 전체 프로그램을 작성하길 원하십니까? – RedFilter

+0

아닙니다. 내 질문은 막대의 높이입니다 다른 주파수 사이의 상대적인 비율을 나타냅니다 예를 들어, 가장 높은 값은 두 번째로 높은 값은 단지 18 막대 heigh 21 막대를 가질 수 있습니다. 어떤 방향으로이 문제를 찾아야할지 확실하지 않습니다. – Sef

답변

2

코드의 일부 비트는 분석을 위해 실제로 정의되지 않지만 기본 선형 보간 함수를 사용하여 범위에 따라 보간 된 값을 얻을 수 있습니다 (예 : 매핑 0-> 8000에서 0-> 21).

public static float MapToRange(float valueMeasured, float minMeasured, float maxMeasured, float minMapped, float maxMapped) 
{ 
    float mappedValue = minMapped + ((valueMeasured - minMeasured)/(maxMeasured - minMeasured)) * (maxMapped - minMapped); 
    return mappedValue; 
} 

그래서 당신은 450의 최소 주파수, 8000의 최대 측정 가정 해 봅시다, 당신은 당신이의 라인을 따라 부를 수 (21)에 0의 범위에 모든 값을 매핑 할 (가정하여 전류 측정)는 2700 말하자면,이다 :

float mappedValue = MapToRange(2700, 450, 8000, 0, 21); 

이 얻을 것이다 : 0 + ((2700-450)/(8000-450)) * (21-0) =

6.25827815 그래서 캐스팅 값을 int로 만들고 6 별을 그립니다.

1

편집 : 죄송합니다. 서둘러서 썼습니다. 제 해결책이 잘못되었습니다. 버퍼는 올바른 것을 썼습니다.

for (int j = 0; j < T.Length; j++) 
    { 
     T[j] = (MaxHeight* T[j])/Ber.GreatestElement(T); 
     Console.Write("{0,7}", T[j]); 
    } 

당신은 할 수 있도록하려는 것입니다 :이 같은 코드로 시작하는 경우

즉, (덜 일반적인 방법으로는)

int starsNum = (int)((currentValue - lowestValue)/(highestValue - lowestValue) * 21); 
0

그래서, T는 주파수의 배열이다 이 코드를 받아서 그래프로 표현 하시겠습니까?당신은 최대 값이 이제

double max = 0.0; 
for (int j = 0; j < T.Length; j++) 
{ 
    T[j] = (MaxHeight* T[j])/Ber.GreatestElement(T); 
    if (T[j] > max) max = T[j]; 
} 

:

이렇게하려면 다음 화면에 적절한 수의 별을 쓰기 수행, 최대 규모의 T 값을 캡처하는 수학을 조금 할 것 SECOND for 루프를 통해 별의 수를 결정할 수 있습니다.

for (int j = 0; j < T.Length; j++) 
{ 
    int numStars = Convert.ToInt32((max/21) * T[j]); 
    Console.Write("{0,7}", T[j]); 
    Console.WriteLine("".PadLeft(numStars, '*'); 
} 

희망 사항입니다.