2013-05-15 6 views
-4

예 :오름차순 및 내림차순 배열을 어떻게 만듭니 까?

나는 최소값과 최대 값 및 홀수 또는 짝수 일 수있는 증분 수를가집니다.

최소 = 3이고 최대 = 10 단위 = 15은 I 원하는 I이 있다면 :

3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3 

그러나, 단위 = 16 I는 (중간에 2 개의 10 년대 통지) 할 :

3, 4, 5, 6, 7, 8, 9, 10, 10, 9, 8, 7, 6, 5, 4, 3 

나는 min, max 및 증분 수를 사용하여 추가 배열을 추가해야합니다.

는 UPDATE :

이 명확 단위의 개수가 배열 될 상기 아이템은 소수이다해야 항목의 수와 동일하게한다.

정도로 분 = 5.0 최대 = 15.0 증분 = 6은 어레이 포함한다면 :

5.0, 10.0, 15.0, 15.0, 10.0, 5.0 
+1

LINQ를 사용할 수 있습니까, 아니면 "직접"할 수 있습니까? – Yuck

+3

숙제입니까? – Xaruth

+0

@ Yuck : Linq는 – descf

답변

1

의 LINQ 방법 :

int min = 3; 
int max = 10; 
int increments = 15; 

Enumerable 
    .Range(min, max - min + 1) 
    .Concat(Enumerable 
     .Range(min, max - min + 1) 
     .Reverse() 
     .Skip(increments % 2)) 
    .ToArray(); 
+0

안녕하세요, 질문에 제공된 정보를 업데이트하여 문제를 조금 더 명확하게했습니다. – descf

1

이 작동해야

public static IEnumerable<decimal> NewMethod(decimal min, decimal max, int count) 
{ 
    var increment = (max - min)/(int)((count - 1)/2); 

    for (var i = min; i < max; i += increment) 
     yield return i; 

    if (count % 2 == 0) 
     yield return max; 

    for (var i = max; i >= min ; i -= increment) 
     yield return i; 
} 

샘플 테스트 :

var min = 3.0m; 
var max = 10.0m; 
var count = 16; 

MessageBox.Show(string.Join(", ", NewMethod(min, max, count))); 

편집 : 부동 소수점 형식이 정확하지 않으면 대처해야합니다. 그렇지 않으면 최종 결과 집합에 요소가 누락됩니다. 및 i -= 부분에 Math.Round의 약간 땜장이가 있습니다. double을 더 신뢰할 수있는 코드로 업데이트했습니다. decimal 유형입니다. 그러나 매번 실패하지 않아야한다는 보장은 없습니다. { 1, 2.2, 3.4 } 등의 결과에 십진 형식이 필요한 경우를 피하는 것이 더 쉽습니다.

+0

7 또는 8로 계산하면 잘못된 결과가 나타납니다. – descf

+0

예제 세트를 사용하십시오. 최대? – nawfal

+0

카운트를 7 또는 8로 변경하면 다른 모든 것은 동일하게 유지됩니다. 부동 소수점 연산으로 바인딩되는 정밀 오류가 발생하는 경우를 나타냅니다. – descf

0

여기에 부동 소수점 값을 올바르게 처리하는 일방 통행 램프가 있습니다. 삼각형 파형을 만들기 위해 그것을 수정할 수 있어야합니다. 진입로를 구현할 때는 여러 입력에 대해 반올림 오류 또는 하나씩 오류가 누적되지 않도록주의해야합니다.

void Packet::SetRamp(const SampleType start /*= Signal::One*/, 
         const SampleType finish /*= -Signal::One */) 
{ 
    SampleType slope, current; 
    SampleOffsetType len; 
    len = GetLength(); 
    if (len < 2) 
     throw std::range_error("packet is not large enough to set ramp into"); 
    slope = (finish - start)/(len - 1); 
    for (SampleOffsetType row = 0; row < len; row++) 
    { 
     current = slope * row + start; 
     SetSample(row, current); 
    } 
} 
관련 문제