Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

матрица-массив удалить строку(С++)

28K
07 декабря 2007 года
vorovaika
21 / / 07.12.2007
Матрица А из N стpок и N столбцов размещена в одномерном массиве по строкам. Удалить К-ю строку матрицы (К задано) из одномерного массива. Результат напечатать по строкам.

кто знает,помогите,пожалуйста!!
242
07 декабря 2007 года
Оlga
2.2K / / 04.02.2006
Помощь без твоего кода только в Студентах.
Потом неплохо бы указать язык, на котором писать надо, да и задание описано немного туманно. Из твоего описания пришла к выводу, что речь о двухмерной, квадратной матрице, с которой надо работать как с одномерным массивом.
28K
07 декабря 2007 года
vorovaika
21 / / 07.12.2007
язык C++
дело в том, что я сама получила задание и не оч его понимаю.но, судя по всему,вы правы... матрицу преобразовать в одномерный массив и далее циклом for пробегать K*N элементов начиная с (K*N)+1 элемента удалять N элементов и распечатывать...
320
08 декабря 2007 года
m_Valery
1.0K / / 08.01.2007
Вот решение с использоваением STL.Создаем вектор векторов(матрицу)записываем ее в одномерный динамический массив.Вводим номер строки,которую хотим удалить и удаляем из одномерного массива нужный диапазон.
Код:
#include <iostream>
#include  <vector>
#include <algorithm>
#include <ctime>
#include <iomanip>
using namespace std;
typedef vector< vector<int> > T;
ostream &operator<<(ostream &output,const T &mass)
{
     for(size_t i = 0;i<mass.size();++i){
        for(size_t j = 0;j<mass.size();++j)
               output<<setw(5)<<mass[j];
      output<<"\n\n";
    }
     return output;
}
int _tmain(int argc, _TCHAR* argv[])
{
     srand(time(0));
    size_t n;
    do{
    cout<<"Enter SIZE of matrix,SIZE > 0"<<endl;
    cin>>n;
    }while(n <= 0);
    T mass(n, vector<int>(n));
    for(size_t i = 0;i<n;++i){
      for(size_t j = 0;j<n;++j)
                  mass[j] = rand() % 100;
    }
    cout<<mass;
    vector<int> coll;
    size_t k;
    do{
      cout<<"Enter number of  n < k >= 0"<<endl;
      cin>>k;
    }while(k < 0||k > n);
    for(size_t i = 0;i<n;++i){
      for(size_t j = 0;j<n;++j)
          coll.push_back(mass[j]);
    }
    copy(coll.begin(),coll.end(),
        ostream_iterator<int>(cout," "));
    cout<<endl;
    vector<int> coll1(mass[k]);
    copy(coll1.begin(),coll1.end(),
        ostream_iterator<int>(cout," "));
    cout<<endl;
    vector<int>::iterator first = find(coll.begin(),coll.end(),
        *coll1.begin());
    vector<int>::iterator last = find(coll.begin(),coll.end(),
        *(--coll1.end()));
    coll.erase(first,++last);
    copy(coll.begin(),coll.end(),
        ostream_iterator<int>(cout," "));
    cout<<endl;
    return 0;
}
28K
10 декабря 2007 года
vorovaika
21 / / 07.12.2007
спасибо огромное...теперь буду разбираться....так все сложно и непонятно(((
28K
10 декабря 2007 года
vorovaika
21 / / 07.12.2007
а Вы не могли бы пояснить вторую часть работы?
вот он пишет введите к, а дальше?? coll begin?vektor?coll end. спасибо
320
10 декабря 2007 года
m_Valery
1.0K / / 08.01.2007
 
Код:
...for(size_t i = 0;i<n;++i){
      for(size_t j = 0;j<n;++j)
          coll.push_back(mass[j]);
    }...

coll - динамический массив или вектор(класс,который реализует динамический массив)Это одномерный массив,заполняем его элементами матрицы,для чего вызываем ф-ию push_back(),т.е. вставляем элемент в конец массива.Далее...
 
Код:
...copy(coll.begin(),coll.end(),
        ostream_iterator<int>(cout," "));
    cout<<endl;...
Распечатываем массив coll при помощи алгоритма copy,можно распечатать его и по другому,например
 
Код:
for(size_t i = 0;i < coll.size();++i)
    cout<<coll<<' ';
Потом обьявляем массив,где хранится строка,которую будем удалять,она известна,мы ее ввели,ее номер
к.Распечатывем удаляемую строку.
 
Код:
...vector<int> coll1(mass[k]);
    copy(coll1.begin(),coll1.end(),
        ostream_iterator<int>(cout," "));
    cout<<endl;...
coll.begin(),coll.end() - итераторы,начала и конца вектора.Итераторы - обьекты указательного типа,служат для обхода контейнеров.
 
Код:
...vector<int>::iterator first = find(coll.begin(),coll.end(),
        *coll1.begin());
    vector<int>::iterator last = find(coll.begin(),coll.end(),
        *(--coll1.end()));...
Тут ищем диапазон в массиве при помощи алгоритма find(... где ищем, что ищем).Т.е поскольку coll1.begin() - это итератор,для получения его значения пишем *сoll.1begin(),в coll1 хранится удаляемая строка.
 
Код:
...
coll.erase(first,++last);
...

Тут происходит удаление.И потом опять распечатываем массив,но уже без удаляемой строки.Что STL не учите ? Какое решение надо ?
28K
10 декабря 2007 года
vorovaika
21 / / 07.12.2007
большое спасибо.мы работем в visual studio win32 console application
28K
10 декабря 2007 года
vorovaika
21 / / 07.12.2007
а это в какой программе написано?
320
10 декабря 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: vorovaika
а это в какой программе написано?



Это Visual Studio 2005 , Win32 Console Application.Вопрос в другом - вы STL учите ? Или надо решение без STL.

28K
10 декабря 2007 года
vorovaika
21 / / 07.12.2007
честно говоря,не знаю даже что это...не учим
320
10 декабря 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: vorovaika
честно говоря,не знаю даже что это...не учим


Вот код без STL.

Код:
#include <iostream>
#include <ctime>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    srand(time(0));
    size_t row,col;
    cout<<"Input row > 0"<<endl;
    do{
        cin>>row;
    }while(row < 0);
    cout<<"Input row > 0"<<endl;
    do{
        cin>>col;
    }while(col < 0);
   int **mass = new int*[row];
   for(size_t i = 0;i < row;++i){
       mass = new int[col];
       for(size_t j = 0;j < col;++j)
           mass[j] = rand() % 100;
   }
   for(size_t i = 0;i < row;++i){
       for(size_t j = 0;j < col;++j)
           cout<<'\t'<<mass[j];
       cout<<"\n\n";
    }
   int *array = new int[row * col];
   size_t k = 0;
   for(size_t i = 0;i < row;++i){
       for(size_t j = 0;j < col;++j){
           array[k] = mass[j];
           ++k;
       }
   }
   for(size_t i = 0;i < row * col;++i)
       cout<<array<<' ';
   cout<<endl;
   int *arr = new int[col];
   size_t number;
   cout<<"Input row < number > 0"<<endl;
    do{
        cin>>number;
    }while(number < 0||number >= row);
   k = 0;
   int count = 0;
   for(size_t i = 0;i < row;++i){
       for(size_t j = 0;j < col;++j){
           
           if(i == number){
               arr[k] = count;
               ++k;
           }
           ++count;
       }
   }
   for(size_t i = 0;i < col;++i)
       cout<<arr<<' ';
   cout<<endl;
   int m = 0;
   int l = 0;
   int *temp = new int[row * col - col];
   for(size_t i = 0;i < row * col;++i){
       if(i != arr[m]){
           temp[l] = array;
           ++l;
       }
       else ++m;
   }
   delete[] array;
   array = new int[row * col - col];
   for(size_t i = 0;i < row * col - col;++i)
       array = temp;
   for(size_t i = 0;i < row * col - col;++i)
       cout<<array<<' ';
   cout<<endl;
   for(size_t i = 0;i < row;++i)
      delete[] mass;
   delete[] mass;
   delete[] array;
   delete[] arr;
   delete[] temp;
   return 0;
}

На самом деле без STL труднее решать.STL - Standart Templates Library, библиотека стандартных шаблонов.Если не учите в институте - учи самостоятельно.Один известный программист,как то рассуждая об STL выразился так:
STL напоминает, в некотором роде, как-будто вы многие годы сражались с курсами алгебры и высшей математики, а после этого вам дали великолепный научный калькулятор,который может делать за вас все то чему вы научились.

28K
11 декабря 2007 года
vorovaika
21 / / 07.12.2007
спасибо Вам большущее!!!
28K
15 декабря 2007 года
vorovaika
21 / / 07.12.2007
я, наверное, уже всем надоела..но вот тут еще вопрос....блин...нужно программу cдать эту срочно...ту строку,которую нужно удалить(number)
нужно выделить красным цветом в массиве и в матрице ....ПРОСТИТЕ,но у меня не получается решить этe проблемe...

Код:
#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <windows.h>
#include <stdio.h>
#include <conio.h>

HANDLE hStdout;

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
        hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
       
    SetConsoleTextAttribute(hStdout, BACKGROUND_INTENSITY);
     
      SetConsoleTextAttribute(hStdout, FOREGROUND_GREEN);
    srand(time(0));
    size_t row,col,  number;
   

    cout<<"Input row > 0\n";
        cin>>row;
    cout<<"Input col> 0\n";
        cin>>col;
       cout<<"Input row < number > 0\n";
       cin>>number;

   int **mass = new int*[row];
   for(size_t i = 0;i < row;++i){
       mass = new int[col];
       for(size_t j = 0;j < col;++j)
           mass[j] = rand() % 100;
   }
   for(size_t i = 0;i < row;++i){
       for(size_t j = 0;j < col;++j)
           cout<<'\t'<<mass[j];
       cout<<"\n\n";
    }
   int *array = new int[row * col];
   size_t k = 0;
   for(size_t i = 0;i < row;++i){
       for(size_t j = 0;j < col;++j){
           array[k] = mass[j];
           ++k;
       }
   }
   for(size_t i = 0;i < row * col;++i)
       cout<<array<<' ';
   cout<<endl;
   int *arr = new int[col];
 
   k = 0;
   int count = 0;
   for(size_t i = 0;i < row;++i){
       for(size_t j = 0;j < col;++j){
           
           if(i == number){
               arr[k] = count;
               ++k;
           }
           ++count;
       }
   }
   for(size_t i = 0;i < col;++i)
       
   cout<<endl;
   int m = 0;
   int l = 0;
   int *temp = new int[row * col - col];
   for(size_t i = 0;i < row * col;++i){
       if(i != arr[m]){
           temp[l] = array;
           ++l;
       }
       else ++m;
   }
   delete[] array;
   array = new int[row * col - col];
   for(size_t i = 0;i < row * col - col;++i)
       array = temp;
   for(size_t i = 0;i < row * col - col;++i)
       cout<<array<<' ';

   for(size_t i = 0;i < row;++i)
      delete[] mass;
   delete[] mass;
   delete[] array;
   delete[] arr;
   delete[] temp;
   return 0;
}
28K
17 декабря 2007 года
vorovaika
21 / / 07.12.2007
help,please
320
17 декабря 2007 года
m_Valery
1.0K / / 08.01.2007
Вот,работает...Почти ж сделала сама.В MSDN заглядывай почаще,там всяких примеров вагон.;)
Код:
#include <iostream>
#include <ctime>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
using namespace std;
HANDLE hStdout, hStdin;
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
DWORD NewColor(WORD &);
int _tmain(int argc, _TCHAR* argv[])
{
    DWORD   fdwOldMode;
    WORD wOldColorAttrs;
    hStdin = GetStdHandle(STD_INPUT_HANDLE);
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    srand(time(0));
    size_t row,col,  number;
    wOldColorAttrs = csbiInfo.wAttributes;
    cout<<"Input row > 0\n";
        cin>>row;
    cout<<"Input col> 0\n";
        cin>>col;
       cout<<"Input row < number > 0\n";
       cin>>number;
   if (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
    {
        MessageBox(NULL, TEXT("GetConsoleScreenBufferInfo"),
            TEXT("Console Error"), MB_OK);
        return 0;
    }
   int **mass = new int*[row];
   for(size_t i = 0;i < row;++i){
       mass = new int[col];
       for(size_t j = 0;j < col;++j)
           mass[j] = rand() % 100;
   }
   for(size_t i = 0;i < row;++i){
       for(size_t j = 0;j < col;++j){
           if(i != number){
                cout<<'\t'<<mass[j];
           }else
           {
               NewColor(wOldColorAttrs);
                cout<<'\t'<<mass[j];
                if (! GetConsoleMode(hStdin, &fdwOldMode))
                {
                  cout<<"Console Error"<<endl;
                   return 0;
                 }
                SetConsoleMode(hStdin, fdwOldMode);
                SetConsoleTextAttribute(hStdout, wOldColorAttrs);
           }           
       }
       cout<<"\n\n";
    }
   int *array = new int[row * col];
   size_t k = 0;
   for(size_t i = 0;i < row;++i){
       for(size_t j = 0;j < col;++j){
           array[k] = mass[j];
           ++k;
       }
   }
   int *arr = new int[col];
   k = 0;
   int count = 0;
   for(size_t i = 0;i < row;++i){
       for(size_t j = 0;j < col;++j){  
           if(i == number){
               arr[k] = count;
               ++k;
           }
           ++count;
       }
   }
   size_t j = 0;
   for(size_t i = 0;i < row * col;++i){
       if(i == arr[j]){
                NewColor(wOldColorAttrs);
                cout<<array<<' ';
                if (! GetConsoleMode(hStdin, &fdwOldMode))
                {
                  cout<<"Console Error"<<endl;
                   return 0;
                 }
                SetConsoleMode(hStdin, fdwOldMode);
                SetConsoleTextAttribute(hStdout, wOldColorAttrs);
                ++j;
       }else
           cout<<array<<' ';
   }
   cout<<"\n\n";    
   int m = 0;
   int l = 0;
   int *temp = new int[row * col - col];
   for(size_t i = 0;i < row * col;++i){
       if(i != arr[m]){
           temp[l] = array;
           ++l;
       }
       else ++m;
   }
   delete[] array;
   array = new int[row * col - col];
   for(size_t i = 0;i < row * col - col;++i)
       array = temp;
   for(size_t i = 0;i < row * col - col;++i)
       cout<<array<<' ';

   for(size_t i = 0;i < row;++i)
      delete[] mass;
   delete[] mass;
   delete[] array;
   delete[] arr;
   delete[] temp;
   return 0;
}
DWORD NewColor(WORD &wOldColorAttrs)
{
     if (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
    {
       cout<<"Console Error!!!"<<endl;
       return 0;
    }
    wOldColorAttrs = csbiInfo.wAttributes;
    if (! SetConsoleTextAttribute(hStdout, FOREGROUND_RED |
            FOREGROUND_INTENSITY))
    {
        cout<<"Console Error"<<endl;
        return 0;
    }
    return 0;
}
28K
18 декабря 2007 года
vorovaika
21 / / 07.12.2007
СПАСИБО!!!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог