2014-09-10 5 views
0

제 문제는 마지막 함수 print_valid_data입니다. 배열 A[]에서 두 번째 최소값을 삭제해야합니다. 값이 삭제 된 후 배열의 요소는 비어 있어야하며 배열의 마지막 열린 자리는 비어 있어야합니다. 필자가 수행 한 작업에서 건너 뛴 다음 남은 것을 인쇄합니다. 나는 그것을 삭제하고 다음으로 이동함으로써 어떻게 할 수 있습니까?배열에서 요소를 제거한 다음 다른 요소를 이동하는 방법은 무엇입니까?

사이드 노트 : Var.h는 "const int NUM = 10"데이터 만있는 파일이므로 변경 될 수 있습니다. 이는 배열의 인덱스를위한 것입니다. "data.txt"파일에는 Load_file_to_array 함수를 사용하여 읽은 일부 정수 (프로그램 번호가 10보다 큰 숫자 또는 < 10 개의 숫자가 있음)가 있습니다.

#include <iostream> 
#include "Var.h" 
#include <fstream> 
#include <string> 

using namespace std; 

void Load_File_To_Array(int A[], string filename, int size); 
int Get_2nd_Smallest(int A[], int size); 
void Print_valid_data(int A[], int SecondMin, int size); 

int main() 
{ 
    int A[NUM]; 
    int size = NUM; 
    int SecondMin = 0; 
    string filename = "Data.txt"; 

    Load_File_To_Array(A, filename, size); 
    Get_2nd_Smallest(A, size); 
    Print_valid_data(A, SecondMin, size); 

    cout << endl; 

    system("Pause"); 
    return 0; 
} 

void Load_File_To_Array(int A[], string filename, int size) 
{ 
    ifstream infile; 
    infile.open(filename); 

    cout << "The array is: "; 

    for (int i = 0; i < NUM; i++) 
    { 
     if (infile.eof()) 
     break; 

     infile >> A[i]; 
     cout << A[i] << ", "; 
    } 

    return; 
} 

int Get_2nd_Smallest(int A[], int size) 
{ 
    int Min = A[0]; 
    int SecondMin = 0; 

    for (int i = 0; i < NUM; i++) 
    { 
     if (Min > A[i]) 
      Min = A[i]; 
    } 

    //Exchange-sort to sort the array in descending order 
    int j, k; 
    int counter; 
    for (j = 0; j < (size - 1); j++) 
    { 
     for (k = (j + 1); k < size; k++) 
     { 
      if (A[j] < A[k]) 
      { 
       counter = A[j]; 
       A[j] = A[k]; 
       A[k] = counter; 
      } 
     } 
    } 

    for (int n = (NUM - 1); n > -1; n--) 
    { 
     SecondMin = A[n]; 
     if (SecondMin >= 0) 
     { 
      SecondMin = A[n - 1]; 
      break; 
     } 
     else; 
    } 

    cout << endl << "The minimum number is: " << Min << endl; 
    cout << "The second smallest integer is: " << SecondMin << endl; 

    return SecondMin; 
} 

void Print_valid_data(int A[], int SecondMin, int size) 
{ 
    cout << "The new array is: "; 

    for (int i = 0; i < size; i++) 
    { 
     if (A[i] != SecondMin) 
     { 
      cout << A[i] << ", "; 
     } 
    } 

    return; 
} 
+1

이 잘 신속하고 더러운 방법은 인덱스를 잡아하는 것 두 번째로 작은 숫자를 찾은 다음 배열을 다시 반복하여 다음 위치의 값을 빈 곳에서 시작하여 다시 지정합니다. 배열의 끝에 도달하면 마지막 위치 인 null을 할당하면됩니다. –

+1

지우기 방법이있는 벡터 컨테이너를 사용해보십시오. – Tracer

+0

@Tracer 벡터를 사용할 수 있다는 것을 알고 있지만이 프로그램을 작성하는 방식이 아닙니다. –

답변

1

도움이 될 수 있습니다 후, 제거는 이전을 통해 복사 값에 의해 수행됩니다

const int size = 6; 
int v[] = {5, 6, 8, 2, 3, 1}; 

std::partial_sort(std::begin(v), std::begin(v) + 2, std::end(v)); 

std::cout << "The minimum number is: " << v[0] << std::endl; 
std::cout << "The second smallest integer is: " << v[1] << std::endl; 

std::copy(std::begin(v) + 2, std::end(v), std::begin(v) + 1); 
std::cout << "remaining values: "; 
for (int i = 0; i != size - 1; ++i) { 
    std::cout << v[i] << ", "; 
} 

Live example

관련 문제