Задача с двумерным массивом, C++
#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> Указатели не использовал намеренно. Пока хочу сделать хороший вариант без них.
только если пишешь на с++, то используй для ввода cin, сие есть идеологически верно. и в заголовке есть лишние либы, конио и йоманип. getch мона заменить на system("pause");
А iomanip здесь, чтобы setw() работал. Или как то еще можно?
#include <stdlib.h>
для С++ стоит писать ctime, cstdlib...
#include "stdafx.h" - длай Empty Project и добавляй свой .cpp файл, тогда этот заголовок не нужен будет
дальше уже лично мои мнения по коду:
for (int j = 0; [COLOR="Blue"]j<K[/COLOR]; j++)
я предпочитаю операторы сравнения писать с пробелами, т.е. i < S, j < K, так читабельнее на мой взгляд
имхо, если в if/while внутри скобок есть составные выражения, то лучше добавлять скобок, хотя бы для большей читабельности кода, т.е.
так будет читабельнее на мой взгляд)
*это важно, когда пытаешься разобрать свой же старый код:)
п.с. ах да... Visual Studio плюётся варнингами на getch(), поэтому лучше использовать _getch() (вроде как рекомендация Мелкософта)
А вот stdafx.h - я так понял, что он ускоряет повторную и следующие компиляции. Или пользы от него мало?
может быть я ослеп, но кажись ни чего похожего на setw() и работу с манипуляторами у вас в коде не наблюдается. покажите мне где это есть и я сам на попутках поеду к окулисту!:D
и еще: вот на фиг "засеевать" рандомизатор, если массив заполняется юзером???
А вот stdafx.h - я так понял, что он ускоряет повторную и следующие компиляции. Или пользы от него мало?
я не особо вдавался в подробности зачем он нужен... но это из-за того, что периодически перекидываю свой код из VS в gcc, а там точно этой штуки нет + ну и ещё в gcc нет conio.h и main нужно делать int main(/*разные варианты параметров*/)
и еще: вот на фиг "засеевать" рандомизатор, если массив заполняется юзером???
Ну я молодееец!)))) Это я так переписывал внимательно, изначально setw() был). Я вообще функцию на вывод массива забыл!. Да и в задании указан массив 3x4, а у меня он 2x4. Ну и рандомизатор - рудимент. В общем ай ай ай, буду внимательней в дальнейшем).
а вообще в C++ для массивов есть такая штука как vector ;)
Полезу в MSDN ознакамливаться.
это STL)) С++ не есть детище Мелкософта)) поэтому MSDN это совсем не библия для человека программирующего на C++ :)
вообще то вектор идеологически не то, не так и не тут, так что не смущай автора стл'ем понапрасну. всему свое место. пускай для начала указатели освоит и т.п.
вообще то как библия, и весьма не плохая, бо как бы я не любил мелкософтовцев в общности и билли в частности, но доки писать они умеют. круче мздн тока стандарт, но стандарт тут катируется скорее как заповеди на скрижалях, то есть вещь вообще святая.
вообще то как библия, и весьма не плохая, бо как бы я не любил мелкософтовцев в общности и билли в частности, но доки писать они умеют. круче мздн тока стандарт, но стандарт тут катируется скорее как заповеди на скрижалях, то есть вещь вообще святая.
для С++ предпочитаю Шилдта и Лишнера, как справочники, MSDN там и рядом не валялась)
а так... ну мне справка Qt больше по вкусу, чем MSDN)
ну да) указатели нужно 100% осваивать) забыл уже)) я это тыщу лет назад прошёл))
первое, книга по с++ и доки это совсем разные вещи.
во вторых, ты очевидно мздном не пользовался, бо не осознаешь его удобства и обширности.
а так... ну мне справка Qt больше по вкусу, чем MSDN)
да, у тролей весьма не хилые доки, вот минус один, они только по их либе, то бишь относительно самого языка, стандартных функций и прочего там ни чего нет, а значит для начинающего(к примеру автора) на данном этапе они бесполезны. в мздн же присутствует описание и стандартных функций, и конструкций языка, и ключевых слов, и стл, и винапи, и еще куча всего. моральное превосходство на лицо.
зы: пора нам с тобой завязывать тут холиварить, а то сейчас придут живодеры модераторы и дадут нам по носу для профилактики!:D
во вторых, ты очевидно мздном не пользовался, бо не осознаешь его удобства и обширности.
под Шилдтом и Лишнером я имел ввиду их справочники)) они таки достаточно близки по формату к документации)
а так да, согласен, возможно я недооцениваю МСДН, ибо не пользовался ей особо)) но всё впереди ещё))
п.с. завязываю:D
Если вкратце, то нужен он для того чтобы организовать проект так, что при сборке не придется перекомпилировать те исходные файлы которые, фактически, не менялись.
Вообще man-ы по gcc пестрят информацией о precompiled headers.
+ ну и ещё в gcc нет conio.h и main нужно делать int main(/*разные варианты параметров*/)
Известна самая короткая программа которой обычно начинается тестирование gcc - это "main(){}".
Так ты свою версию написал? Можешь показать код?
мне не жалко. пжлста смотри :)
#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);
}
За то, что массив не надо вводить вручную - зачёт.
Критика:
1. Функцию ввода (генерации) массива лучше вынести из main.
2. Указатель на указатель не нужен, так как в матрице все столбцы и строки одной длины. Хватит простого указателя.
3. Какой смысл использовать способы выделения памяти из C, если используем C++?
4. Какой смысл создавать этот массив динамически?
5. Почему используется самодельная функция sort? Чем она лучше тех, что уже есть в C, C++?
Критика:
1. Функцию ввода (генерации) массива лучше вынести из main.
2. Указатель на указатель не нужен, так как в матрице все столбцы и строки одной длины. Хватит простого указателя.
3. Какой смысл использовать способы выделения памяти из C, если используем C++?
4. Какой смысл создавать этот массив динамически?
5. Почему используется самодельная функция sort? Чем она лучше тех, что уже есть в C, C++?
согласен, спасибо за критику.
1. Тут согласен
2. Ну тут видимо зависит от того, кому как удобно
3. Некоторые не знают как делать, в университете спрашивают(конечно можно было и new сделать, не спорю)
4. Привычка - вторая натура :)
5. Дык, студенты сами должны уметь писать сортировку(университет все таки), использовать функции из встроенных библиотек всегда успеется
ЗЫ: Сам студент, почти самоучка, учусь на Заочной форме, думаю мне можно такие погрешности ляпать :) Время научит всей красоте и правильности, а пока тренеруюсь на бумажке.
#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, программист должен быть ленивым, дабы не городить лишних велосипедов, сие есть проф качество.=)))
Если читаешь третий том Кнута (или в каком там сортировка), решаешь задачки, то тогда безусловно надо писать сортировку. Тут может быть даже попытка посоревноваться.
А вообще, студенту полезнее приучаться обходиться без глобальных переменных. Это больше пригодится, если есть надежды писать не одноразовый код.
{
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 заюзан)?
Ленивые программисты не едят бутерброды с красной икрой, я думаю ты понял про что я :)
ЗЫ: По поводу проф качества, у тебя exe вышает в пределах 70 кб, когда у меня всего 38 кб. Каждый метод, должен оправдан, а мериться у кого больше не к чему (я про мозг, а вы о чем подумали:))
Использование глобальных переменных.
А слабо убрать циклы (раз уж STL заюзан)?
глобальные переменные были константами, сие не очень красиво, но не есть критично, или я не прав?(кажись советуют так делать в замен дефайнам)
без циклов, так без циклов.
#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
зы: вывод правда не красивый, но мне лень колдовать.
Ленивые программисты не едят бутерброды с красной икрой, я думаю ты понял про что я
ЗЫ: По поводу проф качества, у тебя exe вышает в пределах 70 кб, когда у меня всего 38 кб. Каждый метод, должен оправдан, а мериться у кого больше не к чему (я про мозг, а вы о чем подумали)
ленивые программисты пишут код быстро и без мороки, в то время когда не ленивые программисты изобретают мего оптимизированный и заточенный под задачу велосипед. в итоге ленивый программист уже сдает код и получает деньги, в то время как не ленивый программист занят отловом блох в своем велосипеде. а так как заказчика интересует результат, решение поставленной задачи, а не на сколько круто там все написано, то не ленивый программист остается голодным!=)))
70 кб, ну и чего? это, мне кажется, ты что то принял на свой счет и начал мерятся, хотя тут ни кто ни чего подобного не имел.:) надо ориентироваться от поставленной задачи, а не от веса экзешника или объема кода. на работе мы пишем под микроконтроллеры, так там не то что врукопашную все, там порой думаешь использовать ли массив или руками по жонглировать. или второй вариант, писали мы распознование образов, оптимизировали мама не горюй, половину на чистом асме написали, алгоритм отрабатывал меньше 5 миллисекунд, пришло оборудование и оказалось, что там такие мего камеры, с такой частотой, что можно было на шарпе как попало наколбасить и не напрягаться вообще ни разу, бо железяка не способна картинку выдать так быстро.:)