Нужно решение. (c++)
Задана матрица размером NxM. Получить массив B, присвоив его k-му
элементу значение 1, если k-я строка матрицы симметрична, и значение 0 − в
противном случае.
bool s=true;
for(i=0;i<(n/2);i++){
if((a-a[n-i+1])!=0)s=false;
}
s - показатель симметричности, true - симметрична
a[] - строка размерностью n
вычитаем элементы, если все разности элементов равны нулю, строка симметрична
if((a-a[[color=red]n-i+1[/color]])!=0)s=false;
Задумайся - что здесь не правильно?
Но решение типа n-i+1 тоже хорошо. у препода не закрадется мысль что студенту сделали задание :) Хотя судя по http://forum.codenet.ru/showthread.php?s=&threadid=26309
препод вообще может подумать что решение рабочее.
bool s=true;
for(i=0;i<(n/2);i++){
if(a!=a[n-i-1])s=false;
}
Будет лучше.
Я действительно ошибся
bool s=true;
for(i=0;i<(n/2);i++){
if(a!=a[n-i-1])s=false;
}
Будет лучше.
Верно, но вычитание ты зря между прочим убрал :)
И зачем отнимать? Сравнил и все.
Ведь на низком уровне сравнение производится именно при помощи вычитания одного из другого, следовательно первом варианте в случае с вычитанием ошибки не было, просто так более удобочитаемо, следовательно лучше сделать так.
for(i=0;i<(n/2);i++){
if(a!=a[n-i-1])s=false;
}
Если на то пошло, то данное выражение можно было привести к следующему:
for(i=0;i<(n/2);i++)
s=!(a - a[n-i-1]);
И зачем сравнивать? Вычел и всё ;).
for(i=0;i<(n/2);i++)
s=!(a - a[n-i-1]);
да, так красиво...
а про вычитание
лучше сравнивать, поскольку в моем первом варианте программы сначала было вычитание, потом сравнение... а это уже не оптимально.
for(i=0;i<(n/2);i++)
bool s=!(a - a[n-i-1]);
Ведь на низком уровне сравнение производится именно при помощи вычитания одного из другого, следовательно первом варианте в случае с вычитанием ошибки не было, просто так более удобочитаемо, следовательно лучше сделать так.
даааа... ????? Я собственно про ошибку не говорил. На счет того, что там на низком уровне это уже проблемы компилятора. Неужели ты всюду где у тебя сравнение ставиш вычитание?
даааа... ?????
Что-то ты это черезчур серьезно воспринял :)
Неужели ты всюду где у тебя сравнение ставиш вычитание?
Еще бы :D
Конечно нет, просто развил чужую мысль :). Хотя может быть код даже оптимальнее пролучится в итоге.
Что-то ты это черезчур серьезно воспринял :)
Да нет, все ОК :) Но Ты меня заинтересовал. Я посмотрел на асм код который генерит VC и только тогда задумался над тем что Ты имел ввиду "на низком уровне". Это на уровне процессора? Бо я подумал что это про код на асме.
что Ты имел ввиду "на низком уровне". Это на уровне процессора? Бо я подумал что это про код на асме.
Асм - почти код процессора, но не совсем. Т.е. тамошние команды условных переходов и сравнений выглядят ни как sub'ы. А в итоге - производится через вычитание и проверку того, что осталось. Не являюсь спецом в асме (скорее наоборот). Если не ошибаюсь устанавливается соответсвующий флаг - признак нуля (ZF?).
А может я и понапутал все с асмом :) Но проц работает через вычитание - как ты еще заставишь его сравнивать?
Но проц работает через вычитание - как ты еще заставишь его сравнивать?
Ну к примеру вычел он, и что. С нулем ведь тоже сравнить надо. Темное это дело...
P.S.
СЛОЖЕНИЕ И ВЫЧИТАНИЕ
--------------------
Команды ADD и SUB выполняют сложение и вычитание байтов или слов, содержащих двоичные данные. Вычитание выполняется в компьютере по методу сложения с двоичным дополнением: для второго операнда устанавливаются обратные значения бит и прибавляется 1, а затем происходит сложение с первым операндом. Во всем, кроме первого шага, операции сложения и вычитания идентичны.
(взято из Ассемблер для IBM PC, глава 12).
Ну к примеру вычел он, и что. С нулем ведь тоже сравнить надо. Темное это дело...
Ничего тёмного нет. Если немного разбираешься в цифровой схемотехнике. Если в ячейке памяти (аккумуляторе наверное :))образовался 0, то на выходе дизъюнктора (логический элемент "ИЛИ") образуется 0. Если хотя бы в одном из разрядов ячейки образовалась единичка (т.е. результат вычитания !=0), то на выходе получаем 1. Каждый из разрядов аккумулятора (например) подключен к одному из входов дизъюнктора.
Т.е. с нулем сравнить просто - он или ноль, или нет. А вот 2 разных числа друг с другом непосредственно - проблема будет.
P.S.
СЛОЖЕНИЕ И ВЫЧИТАНИЕ
--------------------
Команды ADD и SUB выполняют сложение и вычитание байтов или слов, содержащих двоичные данные. Вычитание выполняется в компьютере по методу сложения с двоичным дополнением: для второго операнда устанавливаются обратные значения бит и прибавляется 1, а затем происходит сложение с первым операндом. Во всем, кроме первого шага, операции сложения и вычитания идентичны.
(взято из Ассемблер для IBM PC, глава 12).
И??? Что-то не понял к чему?
На счет моего P.S. то это так, для развития мысли. У нас же вначале было вычитание, потом сравнение, потом пришли к вычитанию, а процессор на самом деле плюсует.
На счет моего P.S. то это так, для развития мысли. У нас же вначале было вычитание, потом сравнение, потом пришли к вычитанию, а процессор на самом деле плюсует.
Это нам так кажется :) Т.е. с точки зрения человеческой логики. А в реальности процессор не складывает и не вычитает. Он просто изменяет состояния выходов в зависимости от состояния входов :D
Ладно, хватит наверное ерундой страдать уже :)
bool s=true;
for(i=0;i<(n/2);i++)
s=!(a - a[n-i-1]);
да, так красиво...
а про вычитание
лучше сравнивать, поскольку в моем первом варианте программы сначала было вычитание, потом сравнение... а это уже не оптимально.
Может красиво, но неэффективно, неправильно, и "решает" не ту задачу.
{
int s = 1;
for(int i=0, k=n-1;i<k;i++,k--)
{
if(a[j]!=a[j][k])
{
s = 0;
break;
}
}
b[j] = s;
}
1. насчет неэффективности согласен, я и не претендую на оптимальность кода..
2. неправильно, что именно?
3. решает не ту задау - еще раз говорю, я не предлагал полного решения задачи, это только кусок кода... я хотел показать алгоритм...
2. неправильно, что именно?
for(i=0;i<(n/2);i++)
s=!(a - a[n-i-1]);
bool s=!(a - a[n-i-1]);
Originally posted by 123tk
Если равны ТОЛЬКО две средние элементы, то последним для s присваивается true, и строка принимается за симметричное. Но это не твоя ошибка, а pacific_7
.
Уважаемый, мне было абсолютно чихать на верность кода касательно сравнения всей строки. Я говорил исключительно про сравнение 2-х элементов. А строку конечно трудно сравнить на симметричность, спору нет :)
bool s=!(a - a[n-i-1]);
Не понял мысли. И что? Тогда ваш код вообще ничего не делает.
Или я чего-то глобально недопонял.
Не понял мысли. И что? Тогда ваш код вообще ничего не делает.
Или я чего-то глобально недопонял.
Мой код решает задачу. А определение переменной внутри цикла ошибочна, потому что эта переменная и ее значение видны, только внутри цикла.
{
for(int i=0, k=n-1;i<k;i++,k--)
{
bool s; // еще один баг: переменная не инициализирована.
if(a[j]!=a[j][k])s = false;
}
// в этой точке s неопределен.
b[j] = s : 1 ? 0;
}
{
b[j] = 1;
for(int i=0, k=n-1;i<k;i++,k--)
{
if(a[j]!=a[j][k])
{
b[j] = 0;
break;
}
}
}
Далее:
Можно обойтись и без доп.переменной.
{
b[j] = 1;
for(int i=0, k=n-1;i<k;i++,k--)
{
if(a[j]!=a[j][k])
{
b[j] = 0;
break;
}
}
}
Ты знаешь, или я насквозь деревянный, или с комментариями этот код было бы понять значительно легче. Что за b[j]? Элемент массива булевых значений??? Это судя по контексту. Если уж захотел помочь студентам, то пиши все от и до, либо выложи только саму идею. Иначе - все твои старания пропадут даром, т.к. человек не осиливший самостоятельно такую "сложную" задачу в твоем коде не очень то разберется.
Ты знаешь, или я насквозь деревянный, или с комментариями этот код было бы понять значительно легче.Что за b[j]? Элемент массива булевых значений??? Это судя по контексту. Если уж захотел помочь студентам, то пиши все от и до, либо выложи только саму идею. Иначе - все твои старания пропадут даром, т.к. человек не осиливший самостоятельно такую "сложную" задачу в твоем коде не очень то разберется.
ШМИТ задал вопрос: Задана матрица размером NxM. Получить массив [color=red]B[/color], присвоив его k-му
элементу значение [color=red]1[/color], если k-я строка матрицы симметрична, и значение 0 в
противном случае.
Пока ты здесь в основном флюдил, о чем говорит: "...мне было абсолютно чихать на верность кода касательно сравнения всей строки", я привел два решения.
{
int s = 1;
for(int i=0, k=n-1;i<k;i++,k--)
{
if(a[j]!=a[j][k])
{
s = 0;
break;
}
}
b[j] = s;
}
{
b[j] = 1;
for(int i=0, k=n-1;i<k;i++,k--)
{
if(a[j]!=a[j][k])
{
b[j] = 0;
break;
}
}
}
ШМИТ задал вопрос: Задана матрица размером NxM. Получить массив [color=red]B[/color], присвоив его k-му
элементу значение [color=red]1[/color], если k-я строка матрицы симметрична, и значение 0 в
противном случае.
Пока ты здесь в основном флюдил, о чем говорит: "...мне было абсолютно чихать на верность кода касательно сравнения всей строки", я привел два решения.
{
int s = 1;
for(int i=0, k=n-1;i<k;i++,k--)
{
if(a[j]!=a[j][k])
{
s = 0;
break;
}
}
b[j] = s;
}
{
b[j] = 1;
for(int i=0, k=n-1;i<k;i++,k--)
{
if(a[j]!=a[j][k])
{
b[j] = 0;
break;
}
}
}
Ну опустил ниже плинтуса :D
Про задание - я честно говоря и забыл уже его :) В этом и ошибка.
А по поводу того, как ты его оформил - читай для кого создана данная ветка форума. Как раз для тех, кто не в состоянии сам заниматься программированием и не может справиться даже с рутинным заданием. Мне например твоих творений понимать не надо, т.к. подобное обычно сам пишу :), а тот, кому надо, может и не понять.
Ладно, тут можно с тобой чувстую спорить (флудить) до бесконечности. Завязываю, и тебе советую.
b[j] = 1; делает вывод, что b имеет логический тип. :)
Можешь объяснить, почему b[j] не может иметь логический тип? Или ты считаешь, что переменная типа bool может быть только true или false? Мне показалось вполне логичным задать ему логический тип (какая тавтология получилась однако), если значений может быть только 2.
Стоп, последний вопрос (попытка флуда :)):
Можешь объяснить, почему b[j] не может иметь логический тип? Или ты считаешь, что переменная типа bool может быть только true или false? Мне показалось вполне логичным задать ему логический тип (какая тавтология получилась однако), если значений может быть только 2.
Может иметь, но более привычно присваивать false/true.
Тоже считаю, что лучше закруглять. Особенно, что вроде эта задача уже была решена 6 дней тому назад.
Может иметь, но более привычно присваивать false/true.
Кому как, особенно если учесть что в Си (не ++) изначально небыло таких значений.