Другие языки программирования и технологии

Как удалить нулевые строки из матрицы в turbo c++?

АА
Артем А
506
читайтте о функциях maloc realock
/* realloc example: rememb-o-matic */
#include <stdio.h>
#include <stdlib.h>

int main ()
{
int input,n;
int count=0;
int * numbers = NULL;
int * more_numbers;

do {
printf ("Enter an integer value (0 to end): ");
scanf ("%d", &input);
count++;

more_numbers = (int*) realloc (numbers, count * sizeof(int));

if (more_numbers!=NULL) {
numbers=more_numbers;
numbers[count-1]=input;
}
else {
free (numbers);
puts ("Error (re)allocating memory");
exit (1);
}
} while (input!=0);

printf ("Numbers entered: ");
for (n=0;n < count;n++) printf ("%d ",numbers[n]);
free (numbers);

return 0;
}
КП
Константин Пустовалов
35 594
Лучший ответ
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <clocale>
using namespace std;
bool is_null(int *, const size_t);
int ** remove_row(int **, size_t &, const size_t, const size_t);
int ** copy_mx(int **, int **, const size_t, const size_t);
int ** create_mx(int **, const size_t, const size_t);
void show_mx(int **, const size_t, const size_t);
void random_mx(int **, const size_t, const size_t);
void destroy_mx(int **, const size_t);
void remove_zero_lines(int **, size_t &, const size_t);
int main () {
   srand(unsigned(time(0)));
   setlocale(LC_CTYPE, "Russian_russia.1251");
   // Рекомендуемые размеры: 40, 2
   cout << " Введите размеры матрицы: ";
   size_t rs, cs;
   cin >> rs >> cs;
   int ** mx = NULL;
   mx = create_mx(mx, rs, cs);
   random_mx(mx, rs, cs);
   cout << "\n\tИсходная матрица: \n\n";
   show_mx(mx, rs, cs);
   remove_zero_lines(mx, rs, cs);
   cout << "\n\tИзменённая матрица: \n\n";
   show_mx(mx, rs, cs);
   destroy_mx(mx, rs);
   cin.get(); cin.get();
   return 0;
}
void remove_zero_lines(int ** _mx, size_t & _rs, const size_t _cs) {
   for (size_t r = 0; r < _rs; r++)
      if (is_null(_mx[r], _cs)) {
         remove_row(_mx, _rs, _cs, r);
         --r;
      }
}
bool is_null(int * _r, const size_t _size) {
   for (size_t n = 0; n < _size; n++) if (_r[n]) return false;
   return true;
}
void show_mx(int ** _mx, const size_t _rs, const size_t _cs) {
   for (size_t r = 0; r < _rs; r++, cout << endl) for (size_t c = 0; c < _cs; c++) cout << setw(4) << _mx[r][c];
}
void random_mx(int ** _mx, const size_t _rs, const size_t _cs) {
   for (size_t r = 0; r < _rs; r++) for (size_t c = 0; c < _cs; c++) _mx[r][c] = rand() % 2;
}
int ** remove_row(int ** _mx, size_t & _rs, const size_t _cs, const size_t _index) {
   int ** copy = NULL;
   size_t rs = _rs;
   copy = copy_mx(copy, _mx, _rs, _cs);
   destroy_mx(_mx, _rs);
   const size_t ns = --rs;
   _mx = create_mx(_mx, ns, _cs);
   size_t next = 0;
   for (size_t r = 0; r < _rs; r++) {
      for (size_t c = 0; c < _cs; c++) if (r != _index) _mx[next][c] = copy[r][c];
      if (r != _index) ++next;
   }
   destroy_mx(copy, _rs);
   _rs = ns;   
   return _mx;
}
int ** copy_mx(int ** _copy, int ** _source, const size_t _rs, const size_t _cs) {
   _copy = create_mx(_copy, _rs, _cs);
   for (size_t r = 0; r < _rs; r++) for (size_t c = 0; c < _cs; c++) _copy[r][c] = _source[r][c];
   return _copy;
}
int ** create_mx(int ** _mx, const size_t _rs, const size_t _cs) {
   _mx = new int * [_rs];
   for (size_t r = 0; r < _rs; r++) _mx[r] = new int [_cs];
   return _mx;
}
void destroy_mx(int ** _mx, const size_t _rs) {
   for (size_t r = 0; r < _rs; r++) delete[] _mx[r];
   delete[] _mx;
}
проверить на 0 строку, если все нули, не переписывать в другую матрицу и т. д.