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

Ваш аккаунт

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

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

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

Нужно решение. (c++)

7.9K
11 ноября 2005 года
ШМИТ
47 / / 17.10.2005
Народ. Выручайте. Срочно нужно решение данной задачи. Может немного не по теме но рушить нужно именно в Builder'е.
Задана матрица размером NxM. Получить массив B, присвоив его k-му
элементу значение 1, если k-я строка матрицы симметрична, и значение 0 − в
противном случае.
7.7K
12 ноября 2005 года
Anton S.
45 / / 20.03.2005
Определяешь симметричность строки, присваиваешь значение элементу... что тут сложного, в чем проблема, опиши пожалуйста...
7.7K
12 ноября 2005 года
Anton S.
45 / / 20.03.2005
Проверку строки на симметричность я советую сделать вот таким макаром
bool s=true;
for(i=0;i<(n/2);i++){
if((a-a[n-i+1])!=0)s=false;
}
s - показатель симметричности, true - симметрична
a[] - строка размерностью n

вычитаем элементы, если все разности элементов равны нулю, строка симметрична
243
12 ноября 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Anton S.

if((a-a[[color=red]n-i+1[/color]])!=0)s=false;


Задумайся - что здесь не правильно?

292
12 ноября 2005 года
Matush
726 / / 14.01.2004
И зачем отнимать? Сравнил и все.

Но решение типа n-i+1 тоже хорошо. у препода не закрадется мысль что студенту сделали задание :) Хотя судя по http://forum.codenet.ru/showthread.php?s=&threadid=26309
препод вообще может подумать что решение рабочее.
7.7K
12 ноября 2005 года
Anton S.
45 / / 20.03.2005
Я действительно ошибся
bool s=true;
for(i=0;i<(n/2);i++){
if(a!=a[n-i-1])s=false;
}
Будет лучше.
243
13 ноября 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Anton S.
Я действительно ошибся
bool s=true;
for(i=0;i<(n/2);i++){
if(a!=a[n-i-1])s=false;
}
Будет лучше.


Верно, но вычитание ты зря между прочим убрал :)

Цитата:
Originally posted by Matush

И зачем отнимать? Сравнил и все.


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

 
Код:
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++)
    s=!(a - a[n-i-1]);

И зачем сравнивать? Вычел и всё ;).
7.7K
13 ноября 2005 года
Anton S.
45 / / 20.03.2005
bool s=true;
for(i=0;i<(n/2);i++)
s=!(a - a[n-i-1]);

да, так красиво...

а про вычитание
лучше сравнивать, поскольку в моем первом варианте программы сначала было вычитание, потом сравнение... а это уже не оптимально.
7.7K
13 ноября 2005 года
Anton S.
45 / / 20.03.2005
еще красивее код ;);)
for(i=0;i<(n/2);i++)
bool s=!(a - a[n-i-1]);
292
14 ноября 2005 года
Matush
726 / / 14.01.2004
Цитата:
Originally posted by pacific_7

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



даааа... ????? Я собственно про ошибку не говорил. На счет того, что там на низком уровне это уже проблемы компилятора. Неужели ты всюду где у тебя сравнение ставиш вычитание?

243
14 ноября 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Matush
даааа... ?????


Что-то ты это черезчур серьезно воспринял :)

Цитата:
Originally posted by Matush
Неужели ты всюду где у тебя сравнение ставиш вычитание?


Еще бы :D
Конечно нет, просто развил чужую мысль :). Хотя может быть код даже оптимальнее пролучится в итоге.

292
14 ноября 2005 года
Matush
726 / / 14.01.2004
Цитата:
Originally posted by pacific_7
Что-то ты это черезчур серьезно воспринял :)


Да нет, все ОК :) Но Ты меня заинтересовал. Я посмотрел на асм код который генерит VC и только тогда задумался над тем что Ты имел ввиду "на низком уровне". Это на уровне процессора? Бо я подумал что это про код на асме.

243
14 ноября 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Matush
что Ты имел ввиду "на низком уровне". Это на уровне процессора? Бо я подумал что это про код на асме.


Асм - почти код процессора, но не совсем. Т.е. тамошние команды условных переходов и сравнений выглядят ни как sub'ы. А в итоге - производится через вычитание и проверку того, что осталось. Не являюсь спецом в асме (скорее наоборот). Если не ошибаюсь устанавливается соответсвующий флаг - признак нуля (ZF?).
А может я и понапутал все с асмом :) Но проц работает через вычитание - как ты еще заставишь его сравнивать?

292
15 ноября 2005 года
Matush
726 / / 14.01.2004
Цитата:
Originally posted by pacific_7
Но проц работает через вычитание - как ты еще заставишь его сравнивать?


Ну к примеру вычел он, и что. С нулем ведь тоже сравнить надо. Темное это дело...


P.S.
СЛОЖЕНИЕ И ВЫЧИТАНИЕ
--------------------
Команды ADD и SUB выполняют сложение и вычитание байтов или слов, содержащих двоичные данные. Вычитание выполняется в компьютере по методу сложения с двоичным дополнением: для второго операнда устанавливаются обратные значения бит и прибавляется 1, а затем происходит сложение с первым операндом. Во всем, кроме первого шага, операции сложения и вычитания идентичны.

(взято из Ассемблер для IBM PC, глава 12).

7.9K
15 ноября 2005 года
ШМИТ
47 / / 17.10.2005
Большое спасибо всем за помощь. К счастью задача уже решена. )))
243
15 ноября 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Matush
Ну к примеру вычел он, и что. С нулем ведь тоже сравнить надо. Темное это дело...


Ничего тёмного нет. Если немного разбираешься в цифровой схемотехнике. Если в ячейке памяти (аккумуляторе наверное :))образовался 0, то на выходе дизъюнктора (логический элемент "ИЛИ") образуется 0. Если хотя бы в одном из разрядов ячейки образовалась единичка (т.е. результат вычитания !=0), то на выходе получаем 1. Каждый из разрядов аккумулятора (например) подключен к одному из входов дизъюнктора.
Т.е. с нулем сравнить просто - он или ноль, или нет. А вот 2 разных числа друг с другом непосредственно - проблема будет.

Цитата:
Originally posted by Matush

P.S.
СЛОЖЕНИЕ И ВЫЧИТАНИЕ
--------------------
Команды ADD и SUB выполняют сложение и вычитание байтов или слов, содержащих двоичные данные. Вычитание выполняется в компьютере по методу сложения с двоичным дополнением: для второго операнда устанавливаются обратные значения бит и прибавляется 1, а затем происходит сложение с первым операндом. Во всем, кроме первого шага, операции сложения и вычитания идентичны.

(взято из Ассемблер для IBM PC, глава 12).


И??? Что-то не понял к чему?

292
15 ноября 2005 года
Matush
726 / / 14.01.2004
в цифровой схемотехникик разбираюсь чутарь. Была она у нас семестр. Мы даже на лабораторных небольшие логические схема собирали (на К155 ЛА3, ЛА7, ЛИ вроде). Иеперь когда Ты напомнил стало яснее.

На счет моего P.S. то это так, для развития мысли. У нас же вначале было вычитание, потом сравнение, потом пришли к вычитанию, а процессор на самом деле плюсует.
243
16 ноября 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Matush
На счет моего P.S. то это так, для развития мысли. У нас же вначале было вычитание, потом сравнение, потом пришли к вычитанию, а процессор на самом деле плюсует.


Это нам так кажется :) Т.е. с точки зрения человеческой логики. А в реальности процессор не складывает и не вычитает. Он просто изменяет состояния выходов в зависимости от состояния входов :D
Ладно, хватит наверное ерундой страдать уже :)

2.2K
20 ноября 2005 года
123tk
57 / / 28.06.2003
Цитата:
Originally posted by Anton S.
bool s=true;
for(i=0;i<(n/2);i++)
s=!(a - a[n-i-1]);

да, так красиво...

а про вычитание
лучше сравнивать, поскольку в моем первом варианте программы сначала было вычитание, потом сравнение... а это уже не оптимально.

Может красиво, но неэффективно, неправильно, и "решает" не ту задачу.

Код:
for(int j=0; j<m; j++)
{
  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;
}
7.7K
20 ноября 2005 года
Anton S.
45 / / 20.03.2005
но неэффективно, неправильно, и "решает" не ту задачу.

1. насчет неэффективности согласен, я и не претендую на оптимальность кода..
2. неправильно, что именно?
3. решает не ту задау - еще раз говорю, я не предлагал полного решения задачи, это только кусок кода... я хотел показать алгоритм...
2.2K
20 ноября 2005 года
123tk
57 / / 28.06.2003
Цитата:
Originally posted by Anton S.
2. неправильно, что именно?

 
Код:
bool s=true;
for(i=0;i<(n/2);i++)
  s=!(a - a[n-i-1]);
Если равны ТОЛЬКО две средние элементы, то последним для s присваивается true, и строка принимается за симметричное. Но это не твоя ошибка, а pacific_7.
 
Код:
for(i=0;i<(n/2);i++)
  bool s=!(a - a[n-i-1]);
s определена внутри цикла, поэтому за пределами цикла нет доступа к его значению.
7.7K
20 ноября 2005 года
Anton S.
45 / / 20.03.2005
согласен P( P(
243
20 ноября 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:

Originally posted by 123tk

Если равны ТОЛЬКО две средние элементы, то последним для s присваивается true, и строка принимается за симметричное. Но это не твоя ошибка, а pacific_7
.


Уважаемый, мне было абсолютно чихать на верность кода касательно сравнения всей строки. Я говорил исключительно про сравнение 2-х элементов. А строку конечно трудно сравнить на симметричность, спору нет :)

Цитата:
Originally posted by 123tk

 
Код:
for(i=0;i<(n/2);i++)
  bool s=!(a - a[n-i-1]);
s определена внутри цикла, поэтому за пределами цикла нет доступа к его значению.


Не понял мысли. И что? Тогда ваш код вообще ничего не делает.
Или я чего-то глобально недопонял.

2.2K
20 ноября 2005 года
123tk
57 / / 28.06.2003
Цитата:
Originally posted by pacific_7
Не понял мысли. И что? Тогда ваш код вообще ничего не делает.
Или я чего-то глобально недопонял.

Мой код решает задачу. А определение переменной внутри цикла ошибочна, потому что эта переменная и ее значение видны, только внутри цикла.

 
Код:
for(int j=0; j<m; j++)
{
  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;
}
Можно обойтись и без доп.переменной.
Код:
for(int j=0; j<m; j++)
{
  b[j] = 1;
  for(int i=0, k=n-1;i<k;i++,k--)
  {
    if(a[j]!=a[j][k])
    {
      b[j] = 0;
      break;
    }
  }    
}
243
20 ноября 2005 года
pacific_7
1.9K / / 06.09.2004
Друг дорогой, объясни мне пожалуйста, откуда ты взял этот насквозь кривой кусок кода? Я про тот, в котором ты нашел массу багов.
Далее:
Цитата:
Originally posted by 123tk
Можно обойтись и без доп.переменной.
Код:
for(int j=0; j<m; j++)
{
  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]? Элемент массива булевых значений??? Это судя по контексту. Если уж захотел помочь студентам, то пиши все от и до, либо выложи только саму идею. Иначе - все твои старания пропадут даром, т.к. человек не осиливший самостоятельно такую "сложную" задачу в твоем коде не очень то разберется.

2.2K
21 ноября 2005 года
123tk
57 / / 28.06.2003
Цитата:
Originally posted by pacific_7
Ты знаешь, или я насквозь деревянный, или с комментариями этот код было бы понять значительно легче.Что за b[j]? Элемент массива булевых значений??? Это судя по контексту. Если уж захотел помочь студентам, то пиши все от и до, либо выложи только саму идею. Иначе - все твои старания пропадут даром, т.к. человек не осиливший самостоятельно такую "сложную" задачу в твоем коде не очень то разберется.



ШМИТ задал вопрос: Задана матрица размером NxM. Получить массив [color=red]B[/color], присвоив его k-му
элементу значение [color=red]1[/color], если k-я строка матрицы симметрична, и значение 0 в
противном случае.

Пока ты здесь в основном флюдил, о чем говорит: "...мне было абсолютно чихать на верность кода касательно сравнения всей строки", я привел два решения.

Код:
for(int j=0; j<m; j++)
{
  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;
}
Код:
for(int j=0; j<m; j++)
{
  b[j] = 1;
  for(int i=0, k=n-1;i<k;i++,k--)
  {
    if(a[j]!=a[j][k])
    {
      b[j] = 0;
      break;
    }
  }    
}
Естественно, это решение, скорей всего, нужно оформить в виде ф-ии. Организовать ввод матрицы A, и вывод решения: вектора В. Но это уже рутинная работа, если чел и этого не знает, то ему нет смысла с программированием заниматься. И это - в программировании искать нечего - касается и тебя, если ты без комментария не можешь понять кусок кода состоящий из 6-и комманд. Особенно, если этот "спец" из кода b[j] = 1; делает вывод, что b имеет логический тип. :)
243
21 ноября 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by 123tk
ШМИТ задал вопрос: Задана матрица размером NxM. Получить массив [color=red]B[/color], присвоив его k-му
элементу значение [color=red]1[/color], если k-я строка матрицы симметрична, и значение 0 в
противном случае.

Пока ты здесь в основном флюдил, о чем говорит: "...мне было абсолютно чихать на верность кода касательно сравнения всей строки", я привел два решения.
Код:
for(int j=0; j<m; j++)
{
  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;
}
Код:
for(int j=0; j<m; j++)
{
  b[j] = 1;
  for(int i=0, k=n-1;i<k;i++,k--)
  {
    if(a[j]!=a[j][k])
    {
      b[j] = 0;
      break;
    }
  }    
}
Естественно, это решение, скорей всего, нужно оформить в виде ф-ии. Организовать ввод матрицы A, и вывод решения: вектора В. Но это уже рутинная работа, если чел и этого не знает, то ему нет смысла с программированием заниматься. И это - в программировании искать нечего - касается и тебя, если ты без комментария не можешь понять кусок кода состоящий из 6-и комманд. Особенно, если этот "спец" из кода b[j] = 1; делает вывод, что b имеет логический тип. :)


Ну опустил ниже плинтуса :D
Про задание - я честно говоря и забыл уже его :) В этом и ошибка.
А по поводу того, как ты его оформил - читай для кого создана данная ветка форума. Как раз для тех, кто не в состоянии сам заниматься программированием и не может справиться даже с рутинным заданием. Мне например твоих творений понимать не надо, т.к. подобное обычно сам пишу :), а тот, кому надо, может и не понять.
Ладно, тут можно с тобой чувстую спорить (флудить) до бесконечности. Завязываю, и тебе советую.

243
21 ноября 2005 года
pacific_7
1.9K / / 06.09.2004
Стоп, последний вопрос (попытка флуда :)):
Цитата:
Originally posted by 123tk
b[j] = 1; делает вывод, что b имеет логический тип. :)


Можешь объяснить, почему b[j] не может иметь логический тип? Или ты считаешь, что переменная типа bool может быть только true или false? Мне показалось вполне логичным задать ему логический тип (какая тавтология получилась однако), если значений может быть только 2.

2.2K
21 ноября 2005 года
123tk
57 / / 28.06.2003
Цитата:
Originally posted by pacific_7
Стоп, последний вопрос (попытка флуда :)):

Можешь объяснить, почему b[j] не может иметь логический тип? Или ты считаешь, что переменная типа bool может быть только true или false? Мне показалось вполне логичным задать ему логический тип (какая тавтология получилась однако), если значений может быть только 2.

Может иметь, но более привычно присваивать false/true.

Тоже считаю, что лучше закруглять. Особенно, что вроде эта задача уже была решена 6 дней тому назад.

243
21 ноября 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by 123tk
Может иметь, но более привычно присваивать false/true.


Кому как, особенно если учесть что в Си (не ++) изначально небыло таких значений.

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