2014-09-10 2 views
0

Моя проблема связана с последней функцией print_valid_data. Я должен удалить второе минимальное значение из массива A[]. После того, как значение будет удалено, элементы в массиве должны быть сдвинуты, а последнее открытое пятно в массиве должно быть пустым. То, что я делал в своей функции, это пропустить ее и распечатать, что осталось. Как я мог бы это сделать, удалив, а потом переместившись?Как удалить элемент из массива, а затем переместить другие элементы?

Сторона примечания: Var.h - это файл только с данными «const int NUM = 10», которые могут быть изменены, это для индекса массива. Файл data.txt имеет некоторые целые числа (программа учитывает> 10 номеров или < 10 номеров), которые считываются с помощью функции Load_file_to_array.

#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. – 2014-09-10 05:02:38

+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

Смежные вопросы