Member 13767798 Ответов: 2

Как сдвинуть массив 2 dim в C++


хии
как я могу сдвинуть 2 тусклых массива
это массив для курсов и оценок , а также размер массива, введенного пользователем в начале программы.
кроме того, у меня есть строковый массив для имен.
это будет так, если это 4 курса :
имя grade1 grade2 grade3 grade4
я хочу удалить строку, а затем сдвинуть ее так, чтобы последняя строка была равна нулю.
я покажу вам всем только ту часть сдвига, которую я пробовал, но это не сработало, когда я ввожу имя, курсор опускается вниз, ничего не делая :

Что я уже пробовал:

index=0;
	cout<<"Enter your name :";
	cin>>name;
for(int p=0;p<i;p++){
   if (arn[p]==name)
    index=p;}

for(int row=index;row<i;row++){
  for (int colm1=0;colm1<j;colm1++)
  	arcg[row][colm1]=arcg[row-1][colm1-1];}
  	
  	for(int colm2=0;colm2<j;colm2++)
  	arcg[i-1][colm2]=0;

    for (int row3=0;row3<i;i++) {
    	if (arn[row3]==name)
    	arn[row3]=arn[row3+1];
    	arn[i-1]="0";}
    	
    	for(int row=0;row<i;row++){
  for (int colm1=0;colm1<j;colm1++){
  	cout<<arcg[row][colm1]<<"/t";
  }
  }
    for(int colm2=0;colm2<j;colm2++){
    	cout<<arn[colm2]<<"/t";
	}

2 Ответов

Рейтинг:
2

Dave Kreskowiak

Ты же ничего не передвигаешь. Создайте новый массив, скопируйте элементы из старого массива в новый, пропуская удаленные элементы, уничтожьте старый массив и верните новый массив.


CPallini

Это выглядит не очень эффективно.

Dave Kreskowiak

А почему бы и нет? Вот что .NET делает это, когда вы изменяете размер массива или превышаете внутреннюю емкость коллекции.

CPallini

Это хорошо, когда вам нужно больше места, а не меньше.

Рейтинг:
0

CPallini

Попробуй

#include <iostream>
#include <string>
using namespace std;
int main()
{
  string name;
  int index;
  cout << "Enter your name :";
  cin >> name;

  int i=3;
  int j=4;


  const int ROWS=i;
  const int COLS=j;

  string arn[ROWS] = {"foo", "boo", "goo"};
  int arcg[ROWS][COLS] = { { 0, 1, 2, 3}, {10, 11, 12, 13}, {20, 21, 22, 23}};

  index = ROWS;
  for(int p=0;p<ROWS;p++)
  {
    if (arn[p]==name)
    {
      index = p;
      break;
    }
  }

  // shift
  for ( int row = index; row<ROWS-1; ++row)
  {
    arn[row] = arn[row+1];
    for ( int col= 0; col < COLS; ++col)
      arcg[row][col] = arcg[row+1][col];
  }
  // reset last row
  if ( index != ROWS )
  {
    arn[ROWS-1] = "-";
    for ( int col= 0; col < COLS; ++col)
      arcg[ROWS-1][col] = 0;
  }

  // show the arrays
  for ( int row = 0; row<ROWS; ++row)
  {
    cout << arn[row];
    for ( int col= 0; col < COLS; ++col)
      cout << "\t" <<  arcg[row][col];
    cout << endl;
  }
}


Пожалуйста, обратите внимание, C++ (особенно современный C++) предлагает гораздо более мощные инструменты:
#include <iostream>
#include <unordered_map>
#include <array>
using namespace std;

int main()
{
  constexpr int COLS = 4;
  unordered_map < string, array < int, COLS > > m;

  m["foo"] = array<int,COLS>{0,1,2,3};
  m["boo"] = array<int,COLS>{10,11,12,13};
  m["goo"] = array<int,COLS>{20,21,22,23};

  string name;

  cout << "Enter your name: ";
  cin >> name;

  auto it = m.find(name);
  if (it != m.end())
    m.erase(it);

  for (const auto & p : m)
  {
    cout << p.first;
    for (const auto & i : p.second)
      cout << "\t" << i;
    cout << endl;
  }
}


Member 13767798

большое вам спасибо , это так полезно :)

CPallini

Добро пожаловать.