2014-04-29 3 views
0

Учитывая целочисленное значение, обозначающее номер строки записи (начиная с 0 , заканчивающийся на текущий размер 1), удалите запись студента, переместите вверх по всей следующей записи строку вверх в электронной таблице. Если пользователь ввел целое число из числа (< 0 или> = размер), подскажите «Нет такой строки. Невозможно удалить строку ??.»Заменить ?? с номером строки.Перемещение значений массива Вниз 1

Ime не уверен, что не так с кодом. Он не будет перемещать информацию массива о ней вниз 1;

void drop(string names[], int sections[], int grades[], int size){ 
    int i; 
    int drop; 
    cin >> drop; 
    if (drop > size){ 
     cout << "No such row. Can not drop row" << drop << " /n"; 

    }else{ 
     for (i = 0; i <= drop; i++){ 
      if (i == drop){ 
       names[drop] = {""}; 
       sections[drop] = {}; 
       grades[drop] = {}; 
       for (i = drop; drop < size-1; i++){ 
        names[i] = names[i + 1]; 
        sections[i] = sections[i + 1]; 
        grades[i] = grades[i + 1]; 
       } 
      } 

     } 

    } 
} 
+0

спасибо. очень полезно – DaneelD

ответ

1

Попробуйте это:

void drop(string names[], int sections[], int grades[], int size){ 
    int i; 
    int drop; 
    cin >> drop; 
    if (drop >= size){  //NOTE: >=, not > 
     cout << "No such row. Can not drop row" << drop << " /n"; 
     return; 
    } 
    for(i=drop; i<size-1; i++) 
     names[i] = names[i + 1]; 
     sections[i] = sections[i + 1]; 
     grades[i] = grades[i + 1]; 
    } 
} 

}

Конечно, если вы хотите изменить размер массива, было бы лучше использовать векторы.

Однако вы не можете сделать следующее, так как name_of_array [drop] - это элемент в массиве, а не массив в массиве. В любом случае это незаконный код.

names[drop] = {""};  //should be names[drop] = ""; 
sections[drop] = {};  // '' '' sections[drop] = 0; 
grades[drop] = {};  // '' '' grades[drop] = 0; 
1

Изменение линии

  for (i = drop; drop < size-1; i++){ 

в

  for (i = drop; i < size-1; i++){ 

код под else блок может быть упрощена дальше:

  for (i = drop; i < size-1; i++){ 
       names[i] = names[i + 1]; 
       sections[i] = sections[i + 1]; 
       grades[i] = grades[i + 1]; 
      } 

Вам не нужен линии до этого.

0

Как вы относитесь к использованию стандартных библиотечных алгоритмов? Вы можете использовать следующие вместо исходных контуров:

void drop(string names[], int sections[], int grades[], int size) { 
    int drop; 
    cin >> drop; 
    if (drop >= size) { 
     cout << "No such row. Can not drop row" << drop << " \n"; 
    } else { 
     std::move( &names[drop + 1], &names[size], &names[drop]); 
     std::move(&sections[drop + 1], &sections[size], &sections[drop]); 
     std::move( &grades[drop + 1], &grades[size], &grades[drop]); 
    } 
} 

Если ваш компилятор не поддерживает C++ 11 просто изменить std::move к std::copy в приведенном выше коде.

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