Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача по массивам, Что я сделал неправильно 
:(
    Опции темы
Xenon
Дата 13.5.2006, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Вообщем задача такова ... Надо было массив заполнить случайными числами, затем найти все столбцы, в которых есть нуль и создать из этих столбцов новый массив ...
Код

#include "iostream"
#include "conio.h"
#include <ctime>
#include <stdlib.h>
const int HEIGHT=5;
const int WIDTH=4;
using namespace std;
int main ()
{
    int width=WIDTH;
    srand(time(0));
    int arr[WIDTH][HEIGHT];
    for (int i=0;i<WIDTH;i++)
    {
        for (int j=0;j<HEIGHT;j++)
        {
            arr[i][j]=rand()%(5)-1;
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
    for (int i=0;i<HEIGHT;i++)
    {
        bool is_zero=false;
        for (int j=0;j<WIDTH;j++)
        {
            if (arr[j][i]==0)
            {
                is_zero=true;
                break;
            }
        }
        if (is_zero==false)
        {
            --width;
        }
    }
    int* arrnew=new int [HEIGHT*width];
    int z=-1;
    for (int i=0;i<HEIGHT;i++)
    {
        bool is_zero=false;
        for (int j=0;j<WIDTH;j++)
        {
            if (arr[j][i]==0)
            {
                is_zero=true;
                break;
            }
        }
        if (is_zero==true)
        {
            z++;
            for (int x=0;x<HEIGHT;x++)
            {
                arrnew[x*width+z]=arr[x][i];
            }
        }
    }
    cout  << " -----" << endl;
    for (int i=0;i<width;i++)
    {
        for (int j=0;j<HEIGHT;j++)
        {
            cout << arrnew[i*width+j] << " ";
        }
        cout << endl;
    }
    _getch();
}
 


--------------------
user posted image  
PM MAIL   Вверх
bsa
Дата 14.5.2006, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



А зачем в несколько проходов?!?
Код
#include <vector>
#include <iostream>
#include <cstdlib>
#include <ctime>

#define WIDTH 4
#define HEIGHT 5

typedef std::vector<int> TColumn;
typedef std::vector<TColumn> TMatrix;

bool checkZero(const TColumn & col ) {
    for( TColumn::const_iterator i = col.begin(); i != col.end(); ++i )
        if ( *i == 0 )
            return true;
    return false;
}

void printMatrix(const TMatrix & matrix ) {
    for( TMatrix::const_iterator i = matrix.begin(); i != matrix.end(); ++i ) {
        for(TColumn::const_iterator j = i->begin(); j != i->end(); ++j )
            std::cout << *j << " ";
        std::cout << std::endl;
    }
}

int main(int, char *[]) {
    TMatrix matrix, matrix_z;
    srand( time(0) );
    //заполняем матрицу случайными числами
    for(int i = 0; i < WIDTH; ++i  ) {
        TColumn col;
        for( int j = 0; j < HEIGHT; ++j ) {
            int val = ( rand() % 5 ) - 1;
            col.push_back( val );
        }
        matrix.push_back( col );
    }
    printMatrix( matrix );
    std::cout << std::endl;
    //находим столбцы с нулями и помещаем в другую матрицу
    for( TMatrix::iterator i = matrix.begin(); i != matrix.end(); ++i )
        if ( checkZero( *i ) )
            matrix_z.push_back( *i );
    printMatrix( matrix_z );
    return 0;
}

Данная программа при выводе путает строки со столбцами (выводит транспонированную матрицу). Но на ее работу это не сказывается.  

Это сообщение отредактировал(а) bsa - 14.5.2006, 00:50
PM   Вверх
Voldemar2004
Дата 14.5.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Цитата(XenonSk @  14.5.2006,  00:32 Найти цитируемый пост)
Надо было массив заполнить случайными числами
Код
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>

void main(void)
{
const n = 6, m = 5;
int a[n][m];
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++) a[i][j]=rand();
    }

    cout<<"Random Matrix: "<<"\n";

    a[0][0]=0; a[1][1]=0; a[4][5]=0; a[5][3]=0;  // пусть здесь будут нули

    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
        cout<<a[i][j]<<"\t";
        if(j==m-1) cout<<"\n";

           if(!a[i][j]) {/* условие */ ;};
        }
    }

getch();
}
Цитата(XenonSk @  14.5.2006,  00:32 Найти цитируемый пост)
создать из этих столбцов новый массив

XenonSk, используй динамический массив.[quote] 


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Xenon
Дата 14.5.2006, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



bsa Это ты на С что ли написал? Или просто привычка писать define?

Voldemar2004 Чего-то я не совсем допер ... 
Код

        cout<<a[i][j]<<"\t";    
        if(j==m-1) cout<<"\n";

Это ты что делаешь?

Ну понятно, что лучше заинклудить vector и с его помощью сделать, но я хотел без STL 


--------------------
user posted image  
PM MAIL   Вверх
Xenon
Дата 14.5.2006, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Если с вектором, то я думал что-то типа этого ... Но оно тоже не работает smile)
Код

#include <vector>
#include "iostream"
#include "conio.h"
#include <ctime>
#include <stdlib.h>
const int HEIGHT=5;
const int WIDTH=4;
using namespace std;
int main ()
{
    vector<int>arrnew;
    srand(time(0));
    int arr[WIDTH][HEIGHT];
    for (int i=0;i<WIDTH;i++) // Заполню массив случайными числами
    {
        for (int j=0;j<HEIGHT;j++)
        {
            arr[i][j]=rand()%(5)-1;
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
    for (int i=0;i<HEIGHT;i++)
    {
        bool is_zero=false;
        for (int j=0;j<WIDTH;j++)
        {
            if (arr[j][i]==0) //Если найдем в столбце хотя бы один нулевой элемент, то ...
            {
                is_zero=true; 
                break; 
            }
        }
        if (is_zero==true) //Если в столбце был найден нулевой элемент, то ...
        {
            for (int x=0;x<HEIGHT;x++)//... пихаем весь столбец в вектор
            {
                arrnew.push_back(arr[x][i]);
            }
        }
    }
    cout  << " -----" << endl;
    for (int i=0;i<HEIGHT;i++)
    {
        for (int j=0;j<arrnew.size()/HEIGHT;j++) // arrnew.size()/HEIGHT - находим типа ширину вектора (ну это чтобы отобразить не в строчку все элементы, а как матрицу)
        {
            cout << arrnew[i*j];
        }
        cout << endl;
    }
    _getch();
}
   

Это сообщение отредактировал(а) XenonSk - 14.5.2006, 13:08


--------------------
user posted image  
PM MAIL   Вверх
bsa
Дата 14.5.2006, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Я тебе дал 100% рабочий вариант. Сам проверил перед публикацией. Что тебя не устраивает?
Ты слишком сильно усложнил свой алгоритм. Посмотри как у меня. Имхо, ни одной лишней операции.

Про #define я что-то не понял. Почему в С++ его не нужно использовать?
В #include кавычки означают "подключение из текущей директории", а угловые скобки "подключение стандартных". Таким образом, в кавычках нужно задавать только то, что сам написал.

В твоем примере я заметил ошибку в выводе надо выводить не arrnew[i*j], а arrnew[i*arrnew.size()/HEIGHT + j]. 
PM   Вверх
Xenon
Дата 14.5.2006, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



bsa Хм, а мне твой посложнее показался smile Сильно не пинать, кодим около недели smile
Блин, запустил ... хрень выводиться какая-то ... Если поменять то, что ты предложил. 

Это сообщение отредактировал(а) XenonSk - 14.5.2006, 13:24


--------------------
user posted image  
PM MAIL   Вверх
MAKCim
Дата 14.5.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Про #define я что-то не понял. Почему в С++ его не нужно использовать?

Цитата

Первое правило о макросах: не используйте их если вы не обязаны делать этого. Практически каждый макрос свидетельствует о недостатке в языке программирования, программе или программисте.

Страуструп

в данном случае без макросов можно обойтись 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 14.5.2006, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



MAKCim
Хорошо, исправлюсь.

XenonSk
Зато работает. Эту ошибку я нашел при беглом просмотре твоей программы. Не удивлюсь, если есть еще ошибки. 
PM   Вверх
Voldemar2004
Дата 14.5.2006, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Цитата(XenonSk @  14.5.2006,  13:01 Найти цитируемый пост)
Voldemar2004 Чего-то я не совсем допер ... 
Код
        cout<<a[i][j]<<"\t";     
        if(j==m-1) cout<<"\n";
Просто перенос на новую строку - закомментируй - посмотри, что получится. smile 
 


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
bsa
Дата 14.5.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Вместо cout<<"\n" надо использовать cout<<endl - нагляднее новичкам. 
PM   Вверх
Xenon
Дата 14.5.2006, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



if(j==m-1)
Я вот этого не понял smile 


--------------------
user posted image  
PM MAIL   Вверх
bsa
Дата 14.5.2006, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Это звучит так, если j достиг последнего значения (конца строки), то... 
PM   Вверх
Xenon
Дата 14.5.2006, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



а, тогда понятно, а если рассматривать именно ту реализацию последнюю, что я предложил ... Где там ошибка? Просто хочу понять, где я промахнулся. Альтернативная реализация - хорошо, но интересно где я неправильно мыслю smile 


--------------------
user posted image  
PM MAIL   Вверх
Xenon
Дата 16.5.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Не брезгуйте пользоваться тегами [code=cpp]['/code] 


--------------------
user posted image  
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0839 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.