Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Задача по массивам


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

#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();
}
 

Автор: bsa 14.5.2006, 00:48
А зачем в несколько проходов?!?
Код
#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;
}

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

Автор: Voldemar2004 14.5.2006, 11:54
Цитата(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] 

Автор: Xenon 14.5.2006, 12:01
bsa Это ты на С что ли написал? Или просто привычка писать define?

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

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

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

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

Автор: Xenon 14.5.2006, 12:52
Если с вектором, то я думал что-то типа этого ... Но оно тоже не работает 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();
}
   

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

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

В твоем примере я заметил ошибку в выводе надо выводить не arrnew[i*j], а arrnew[i*arrnew.size()/HEIGHT + j]. 

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

Автор: MAKCim 14.5.2006, 16:10
Цитата

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

Цитата

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

Страуструп

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

Автор: bsa 14.5.2006, 18:37
MAKCim
Хорошо, исправлюсь.

XenonSk
Зато работает. Эту ошибку я нашел при беглом просмотре твоей программы. Не удивлюсь, если есть еще ошибки. 

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

Автор: bsa 14.5.2006, 18:39
Вместо cout<<"\n" надо использовать cout<<endl - нагляднее новичкам. 

Автор: Xenon 14.5.2006, 19:08
if(j==m-1)
Я вот этого не понял smile 

Автор: bsa 14.5.2006, 19:22
Это звучит так, если j достиг последнего значения (конца строки), то... 

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

Автор: Xenon 16.5.2006, 17:13
Не брезгуйте пользоваться тегами [code=cpp]['/code] 

Автор: ffldove 16.5.2006, 17:35
сори срочняк надо а на форуме у вас в первый раз 

Автор: bsa 16.5.2006, 18:03
XenonSk, ты в цикле (втором) перепутал j и i. В итоге, вместо arr[width][height] ты работаешь с arr[height][width]. В этом основная ошибка.
Там где я тебе раньше сказал заменить - надо заменить на newarr.size()/HEIGHT.
А также, имей в виду, что по умолчанию у тебя в начале программы матрица выводится в транспонированном виде (чтобы сделать наоборот нужно строки с for поменять местами).
И вообще, учись сам искать ошибки - искать свои ошибки сложно, а чужие - в двойне! 

Автор: Xenon 16.5.2006, 22:15
bsa Я просто в безнадеге выложил ... не получалось и хоть ты тресни, хотя на Паскале такую же штуку сделал и она работа ...
В любом случае спасибо!smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)