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

Ваш аккаунт

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

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

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

Задача с двумерным массивом, C++

60K
06 июня 2010 года
S_Goodman
6 / / 28.05.2010
Здравствуйте. Есть задание - определить, отсортирован ли по возрастанию данный целочисленный двумерный массив 3х4. Я написал свое решение:
Код:
#include "stdafx.h"
#include <time.h>
#include <stdlib.h>
#include <iostream>
#include <conio.h>
#include <iomanip>
using namespace std;

const int S = 2, K = 4;

void arr_init(int arr[K]);
int arr_check(int arr[K]);

int main()
{
    srand(time(NULL));
    int arr[K];
    arr_init(arr);
    if (arr_check(arr))
        cout << "Massiv otsortirovan po vozrastaniju" << endl;
    else
        cout << "Massiv ne otsortirovan" << endl;
    getch();
    return 0;
}

void arr_init(int arr[K])
{
    for (int i = 0; i<S; i++)
        for (int j = 0; j<K; j++)
            scanf("%d", &arr[j]);
}

int arr_check(int arr[K])
{
    int i, j;
    bool flag = true;
    for(i = 0; flag && i < S; i++) {
        for(j = 0; j < K - 1; j++) {
            if(arr[j] > arr[j + 1]) {
                flag = false;
                break;
            }
        }
        if(flag && i + 1 < S && arr[j] > arr[i +1][0])
        flag = false;
    }
    return flag;
}
Это вторая версия, первую, совсем ужасную, помогли поправить на Доброчане. Так вот можно ли это считать приемлимым кодом? Или это жуткая кака, и здесь есть глупости, которых я не вижу? Отругайте пожалуйста.

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

P.S> Указатели не использовал намеренно. Пока хочу сделать хороший вариант без них.
307
06 июня 2010 года
Artem_3A
863 / / 11.04.2008
нормально. я так полагаю, для первого курса, очень даже пойдет.

только если пишешь на с++, то используй для ввода cin, сие есть идеологически верно. и в заголовке есть лишние либы, конио и йоманип. getch мона заменить на system("pause");
60K
06 июня 2010 года
S_Goodman
6 / / 28.05.2010
Ок, спасибо большое, про getch() и cin ясно.
А iomanip здесь, чтобы setw() работал. Или как то еще можно?
2.1K
06 июня 2010 года
Norgat
452 / / 12.08.2009
 
Код:
#include <time.h>
#include <stdlib.h>


для С++ стоит писать ctime, cstdlib...

#include "stdafx.h" - длай Empty Project и добавляй свой .cpp файл, тогда этот заголовок не нужен будет

дальше уже лично мои мнения по коду:
 
Код:
for (int i = 0;[COLOR="blue"] i<S[/COLOR]; i++)
for (int j = 0; [COLOR="Blue"]j<K[/COLOR]; j++)


я предпочитаю операторы сравнения писать с пробелами, т.е. i < S, j < K, так читабельнее на мой взгляд

 
Код:
if(flag && i + 1 < S && arr[j] > arr[i +1][0])


имхо, если в if/while внутри скобок есть составные выражения, то лучше добавлять скобок, хотя бы для большей читабельности кода, т.е.

 
Код:
if(flag && [COLOR="blue"]([/COLOR]i + 1 < S[COLOR="blue"])[/COLOR] && [COLOR="blue"]([/COLOR]arr[j] > arr[i +1][0][COLOR="blue"])[/COLOR])


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


п.с. ах да... Visual Studio плюётся варнингами на getch(), поэтому лучше использовать _getch() (вроде как рекомендация Мелкософта)
60K
06 июня 2010 года
S_Goodman
6 / / 28.05.2010
Ага, на счет читабельности согласен, учту).

А вот stdafx.h - я так понял, что он ускоряет повторную и следующие компиляции. Или пользы от него мало?
307
06 июня 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: S_Goodman
А iomanip здесь, чтобы setw() работал. Или как то еще можно?



может быть я ослеп, но кажись ни чего похожего на setw() и работу с манипуляторами у вас в коде не наблюдается. покажите мне где это есть и я сам на попутках поеду к окулисту!:D

и еще: вот на фиг "засеевать" рандомизатор, если массив заполняется юзером???

2.1K
06 июня 2010 года
Norgat
452 / / 12.08.2009
Цитата: S_Goodman
Ага, на счет читабельности согласен, учту).

А вот stdafx.h - я так понял, что он ускоряет повторную и следующие компиляции. Или пользы от него мало?



я не особо вдавался в подробности зачем он нужен... но это из-за того, что периодически перекидываю свой код из VS в gcc, а там точно этой штуки нет + ну и ещё в gcc нет conio.h и main нужно делать int main(/*разные варианты параметров*/)

60K
06 июня 2010 года
S_Goodman
6 / / 28.05.2010
Цитата:
может быть я ослеп, но кажись ни чего похожего на setw() и работу с манипуляторами у вас в коде не наблюдается. покажите мне где это есть и я сам на попутках поеду к окулисту!

и еще: вот на фиг "засеевать" рандомизатор, если массив заполняется юзером???



Ну я молодееец!)))) Это я так переписывал внимательно, изначально setw() был). Я вообще функцию на вывод массива забыл!. Да и в задании указан массив 3x4, а у меня он 2x4. Ну и рандомизатор - рудимент. В общем ай ай ай, буду внимательней в дальнейшем).

2.1K
06 июня 2010 года
Norgat
452 / / 12.08.2009
Цитата: S_Goodman
Ну я молодееец!)))) Это я так переписывал внимательно, изначально setw() был). Я вообще функцию на вывод массива забыл!. Да и в задании указан массив 3x4, а у меня он 2x4. Ну буду внимательней в дальнейшем).



а вообще в C++ для массивов есть такая штука как vector ;)

60K
06 июня 2010 года
S_Goodman
6 / / 28.05.2010
Цитата: Norgat
а вообще в C++ для массивов есть такая штука как vector ;)



Полезу в MSDN ознакамливаться.

2.1K
06 июня 2010 года
Norgat
452 / / 12.08.2009
Цитата: S_Goodman
Полезу в MSDN ознакамливаться.



это STL)) С++ не есть детище Мелкософта)) поэтому MSDN это совсем не библия для человека программирующего на C++ :)

307
06 июня 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: Norgat
а вообще в C++ для массивов есть такая штука как vector ;)



вообще то вектор идеологически не то, не так и не тут, так что не смущай автора стл'ем понапрасну. всему свое место. пускай для начала указатели освоит и т.п.

Цитата: Norgat
поэтому MSDN это совсем не библия для человека программирующего на C++ :)



вообще то как библия, и весьма не плохая, бо как бы я не любил мелкософтовцев в общности и билли в частности, но доки писать они умеют. круче мздн тока стандарт, но стандарт тут катируется скорее как заповеди на скрижалях, то есть вещь вообще святая.

2.1K
06 июня 2010 года
Norgat
452 / / 12.08.2009
Цитата: Artem_3A

вообще то как библия, и весьма не плохая, бо как бы я не любил мелкософтовцев в общности и билли в частности, но доки писать они умеют. круче мздн тока стандарт, но стандарт тут катируется скорее как заповеди на скрижалях, то есть вещь вообще святая.



для С++ предпочитаю Шилдта и Лишнера, как справочники, MSDN там и рядом не валялась)

а так... ну мне справка Qt больше по вкусу, чем MSDN)

Цитата: Artem_3A
вообще то вектор идеологически не то, не так и не тут, так что не смущай автора стл'ем понапрасну. всему свое место. пускай для начала указатели освоит и т.п.



ну да) указатели нужно 100% осваивать) забыл уже)) я это тыщу лет назад прошёл))

307
06 июня 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: Norgat
для С++ предпочитаю Шилдта и Лишнера, как справочники, MSDN там и рядом не валялась)



первое, книга по с++ и доки это совсем разные вещи.
во вторых, ты очевидно мздном не пользовался, бо не осознаешь его удобства и обширности.

Цитата: Norgat

а так... ну мне справка Qt больше по вкусу, чем MSDN)



да, у тролей весьма не хилые доки, вот минус один, они только по их либе, то бишь относительно самого языка, стандартных функций и прочего там ни чего нет, а значит для начинающего(к примеру автора) на данном этапе они бесполезны. в мздн же присутствует описание и стандартных функций, и конструкций языка, и ключевых слов, и стл, и винапи, и еще куча всего. моральное превосходство на лицо.

зы: пора нам с тобой завязывать тут холиварить, а то сейчас придут живодеры модераторы и дадут нам по носу для профилактики!:D

2.1K
06 июня 2010 года
Norgat
452 / / 12.08.2009
Цитата:
первое, книга по с++ и доки это совсем разные вещи.
во вторых, ты очевидно мздном не пользовался, бо не осознаешь его удобства и обширности.



под Шилдтом и Лишнером я имел ввиду их справочники)) они таки достаточно близки по формату к документации)

а так да, согласен, возможно я недооцениваю МСДН, ибо не пользовался ей особо)) но всё впереди ещё))

п.с. завязываю:D

14
07 июня 2010 года
Phodopus
3.3K / / 19.06.2008
Цитата: Norgat
я не особо вдавался в подробности зачем он нужен... но это из-за того, что периодически перекидываю свой код из VS в gcc, а там точно этой штуки нет


Если вкратце, то нужен он для того чтобы организовать проект так, что при сборке не придется перекомпилировать те исходные файлы которые, фактически, не менялись.
Вообще man-ы по gcc пестрят информацией о precompiled headers.

Цитата: Norgat

+ ну и ещё в gcc нет conio.h и main нужно делать int main(/*разные варианты параметров*/)


Известна самая короткая программа которой обычно начинается тестирование gcc - это "main(){}".

392
08 июня 2010 года
cronya
421 / / 03.01.2009
Ну у меня, так получилось :)
60K
10 июня 2010 года
S_Goodman
6 / / 28.05.2010
Цитата: cronya
Ну у меня, так получилось :)



Так ты свою версию написал? Можешь показать код?

392
10 июня 2010 года
cronya
421 / / 03.01.2009
Цитата: S_Goodman
Так ты свою версию написал? Можешь показать код?


мне не жалко. пжлста смотри :)

Код:
#include<iostream>
#define row 5
#define column 4
using namespace std;

void output(int **matrix);
void test(int **matrix);
int sort(int **matrix);

int main(int argc, char *argv[])
{
    bool flag=false;
    int **matrix=(int **)malloc(row*sizeof(int));
    for(int idx=0;idx<row;idx++)
        matrix[idx]=(int *)malloc(column*sizeof(int));
    for(int idx=0;idx<row;idx++)
        for(int jdx=0;jdx<column;jdx++)
            matrix[idx][jdx]=rand()%10;
    cout<<"Matrix:"<<endl;
    output(matrix);
    test(matrix);
    **matrix=sort(matrix);
    cout<<"Sort Matrix:"<<endl;
    output(matrix);
    test(matrix);
    for(int idx=0;idx<row;idx++)
    free(matrix[idx]);
    free(matrix);
    system("pause");
    return 0;
}

int sort(int **matrix)
{
    bool flag=false;
    int temp=0, buf=-1;
    int *mas=(int*)malloc(row*column*sizeof(int));
    for(int idx=0;idx<row;idx++)
        for(int jdx=0;jdx<column;jdx++)
        {
            buf++;
            mas[buf]=matrix[idx][jdx];
        }
    do
    {
        flag=false;
        for(buf=0;buf<row*column-1;buf++)
            if(mas[buf]>mas[buf+1])
            {
                temp=mas[buf];
                mas[buf]=mas[buf+1];
                mas[buf+1]=temp;
                flag=true;
            }
    }
    while(flag);
    buf=-1;
    for(int idx=0;idx<row;idx++)
        for(int jdx=0;jdx<column;jdx++)
        {
            buf++;
            matrix[idx][jdx]=mas[buf];
           
        }
    free(mas);
    return **matrix;
}

void output(int **matrix)
{
    for(int idx=0;idx<row;idx++)
    {
        for(int jdx=0;jdx<column;jdx++)
            cout<<matrix[idx][jdx]<<" ";
        cout<<endl;
    }
}

void test(int **matrix)
{
    int buf=-1;
    int *mas=(int*)malloc(row*column*sizeof(int));
    for(int idx=0;idx<row;idx++)
        for(int jdx=0;jdx<column;jdx++)
        {
            buf++;
            mas[buf]=matrix[idx][jdx];
        }
    bool flag=false;
    for(buf=0;buf<row*column-1;buf++)
        if(mas[buf]<=mas[buf+1])flag=true;
        else flag=false;
    if(flag==true)cout<<"Massive Sort by up!"<<endl;
    else cout<<"Massive don't Sort by up!"<<endl;
    free(mas); 
}
87
10 июня 2010 года
Kogrom
2.7K / / 02.02.2008
Цитата: cronya
мне не жалко. пжлста смотри



За то, что массив не надо вводить вручную - зачёт.

Критика:

1. Функцию ввода (генерации) массива лучше вынести из main.
2. Указатель на указатель не нужен, так как в матрице все столбцы и строки одной длины. Хватит простого указателя.
3. Какой смысл использовать способы выделения памяти из C, если используем C++?
4. Какой смысл создавать этот массив динамически?
5. Почему используется самодельная функция sort? Чем она лучше тех, что уже есть в C, C++?

392
10 июня 2010 года
cronya
421 / / 03.01.2009
Цитата: Kogrom
За то, что массив не надо вводить вручную - зачёт.

Критика:

1. Функцию ввода (генерации) массива лучше вынести из main.
2. Указатель на указатель не нужен, так как в матрице все столбцы и строки одной длины. Хватит простого указателя.
3. Какой смысл использовать способы выделения памяти из C, если используем C++?
4. Какой смысл создавать этот массив динамически?
5. Почему используется самодельная функция sort? Чем она лучше тех, что уже есть в C, C++?


согласен, спасибо за критику.
1. Тут согласен
2. Ну тут видимо зависит от того, кому как удобно
3. Некоторые не знают как делать, в университете спрашивают(конечно можно было и new сделать, не спорю)
4. Привычка - вторая натура :)
5. Дык, студенты сами должны уметь писать сортировку(университет все таки), использовать функции из встроенных библиотек всегда успеется
ЗЫ: Сам студент, почти самоучка, учусь на Заочной форме, думаю мне можно такие погрешности ляпать :) Время научит всей красоте и правильности, а пока тренеруюсь на бумажке.

307
10 июня 2010 года
Artem_3A
863 / / 11.04.2008
внесу свои пять копеек во всеобщий разброд и шатание.:D

Код:
#include <vector>
#include <algorithm>
#include <iostream>
#include <ctime>

using std::vector;
using std::sort;
using std::cout;
using std::endl;

const int row_count(3);
const int column_count(4);
const int elem_count(row_count * column_count);

void fill_matrix(vector<int>& m)
{
    for(int i(0); i<elem_count; i++)
        m = rand()%10;
}

void print(const vector<int>& m)
{
    for(int i(0); i<row_count; i++)
    {
        for(int j(0); j<column_count; j++)
            cout << m[i * row_count + j] << "\t";
        cout << endl;
    }
    cout << endl;
}

void is_sort(const vector<int>& m)
{
    for(int i(1); i<elem_count; i++)
        if(m[i-1] > m)
        {
            cout << "Result: No"<< endl;
            return;
        }
    cout << "Result: Yes"<< endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    srand(time(0));

    vector<int> matrix(elem_count);

    fill_matrix(matrix);

    cout << "Random matrix"<< endl;

    print(matrix);

    is_sort(matrix);

    sort(matrix.begin(), matrix.end());

    cout << endl<< "Sort matrix"<< endl;

    print(matrix);

    is_sort(matrix);

    system("pause");
    return EXIT_SUCCESS;
}


зы: cronya, программист должен быть ленивым, дабы не городить лишних велосипедов, сие есть проф качество.=)))
87
10 июня 2010 года
Kogrom
2.7K / / 02.02.2008
Цитата: cronya
5. Дык, студенты сами должны уметь писать сортировку(университет все таки), использовать функции из встроенных библиотек всегда успеется



Если читаешь третий том Кнута (или в каком там сортировка), решаешь задачки, то тогда безусловно надо писать сортировку. Тут может быть даже попытка посоревноваться.

А вообще, студенту полезнее приучаться обходиться без глобальных переменных. Это больше пригодится, если есть надежды писать не одноразовый код.

3
11 июня 2010 года
Green
4.8K / / 20.01.2000
Цитата: Artem_3A

Код:
void fill_matrix(vector<int>& m)
{
    for(int i(0); i<elem_count; i++)
        m = rand()%10;
}

void print(const vector<int>& m)
{
    for(int i(0); i<row_count; i++)
    {
        for(int j(0); j<column_count; j++)
            cout << m[i * row_count + j] << "\t";
        cout << endl;
    }
    cout << endl;
}

void is_sort(const vector<int>& m)
{
    for(int i(1); i<elem_count; i++)
        if(m[i-1] > m)
        {
            cout << "Result: No"<< endl;
            return;
        }
    cout << "Result: Yes"<< endl;
}


Как-то не спортивно... :)
Использование глобальных переменных.
А слабо убрать циклы (раз уж STL заюзан)?

392
11 июня 2010 года
cronya
421 / / 03.01.2009
Да ладно вам, все таки это же для студентов раздел. Сделал рабочий код, потратил минут 5-10, я же не дипломную писал :)
Цитата: Artem_3A
программист должен быть ленивым, дабы не городить лишних велосипедов, сие есть проф качество.=)))

Ленивые программисты не едят бутерброды с красной икрой, я думаю ты понял про что я :)
ЗЫ: По поводу проф качества, у тебя exe вышает в пределах 70 кб, когда у меня всего 38 кб. Каждый метод, должен оправдан, а мериться у кого больше не к чему (я про мозг, а вы о чем подумали:))

307
11 июня 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: Green
Как-то не спортивно...
Использование глобальных переменных.
А слабо убрать циклы (раз уж STL заюзан)?



глобальные переменные были константами, сие не очень красиво, но не есть критично, или я не прав?(кажись советуют так делать в замен дефайнам)

без циклов, так без циклов.

Код:
#include <vector>
#include <algorithm>
#include <iostream>
#include <ctime>

using std::vector;
using std::generate;
using std::equal;
using std::copy;
using std::sort;
using std::cout;
using std::endl;

typedef std::ostream_iterator<int> iter_out;

int generate_random(void)
{
    static const int range(10);
    return rand()%range;
}

bool min_or_eq(int l,
           int r)
{
    return l <= r;
}

void fill(vector<int>& m)
{
    generate(m.begin(),
         m.end(),
         generate_random);
}

void print(const vector<int>& m,
       iter_out& o)
{
    copy(m.begin(), m.end(), o);
    cout << endl;
}

void is_sort(vector<int>& m)
{
    if( equal(m.begin(),
          --m.end(),
          ++m.begin(),
          min_or_eq)    )
        cout << "Result: Yes"<< endl;
    else
        cout << "Result: No"<< endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    static const int elem_count(12);
    iter_out output(cout, " ");
    srand(time(0));

    vector<int> matrix(elem_count);
    fill(matrix);

    cout << "Random matrix"<< endl;

    print(matrix, output);
    is_sort(matrix);

    sort(matrix.begin(), matrix.end());

    cout << endl<< "Sort matrix"<< endl;

    print(matrix, output);
    is_sort(matrix);

    system("pause");
    return EXIT_SUCCESS;
}


ну теперь это точно не спортивно!!!:D

зы: вывод правда не красивый, но мне лень колдовать.

Цитата: cronya

Ленивые программисты не едят бутерброды с красной икрой, я думаю ты понял про что я
ЗЫ: По поводу проф качества, у тебя exe вышает в пределах 70 кб, когда у меня всего 38 кб. Каждый метод, должен оправдан, а мериться у кого больше не к чему (я про мозг, а вы о чем подумали)



ленивые программисты пишут код быстро и без мороки, в то время когда не ленивые программисты изобретают мего оптимизированный и заточенный под задачу велосипед. в итоге ленивый программист уже сдает код и получает деньги, в то время как не ленивый программист занят отловом блох в своем велосипеде. а так как заказчика интересует результат, решение поставленной задачи, а не на сколько круто там все написано, то не ленивый программист остается голодным!=)))

70 кб, ну и чего? это, мне кажется, ты что то принял на свой счет и начал мерятся, хотя тут ни кто ни чего подобного не имел.:) надо ориентироваться от поставленной задачи, а не от веса экзешника или объема кода. на работе мы пишем под микроконтроллеры, так там не то что врукопашную все, там порой думаешь использовать ли массив или руками по жонглировать. или второй вариант, писали мы распознование образов, оптимизировали мама не горюй, половину на чистом асме написали, алгоритм отрабатывал меньше 5 миллисекунд, пришло оборудование и оказалось, что там такие мего камеры, с такой частотой, что можно было на шарпе как попало наколбасить и не напрягаться вообще ни разу, бо железяка не способна картинку выдать так быстро.:)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог