Форум программистов, компьютерный форум CyberForum.ru

Есть ли разница в коде? - C++

Восстановить пароль Регистрация
 
Svid
 Аватар для Svid
5 / 5 / 1
Регистрация: 02.03.2011
Сообщений: 40
02.03.2011, 11:43     Есть ли разница в коде? #1
Добрый день!
Такой вот вопрос: необходимо написать функцию, ищущую максимальный элемент, на главной диагонали массива, скажем 4х4. Придумал уже как минимум два разных варианта, но не могу понять, корректны ли они, и есть ли между ними принципиальная разница (ну, кроме той, что второй вариант перебирает все элементы массива)?
Вариант первый:
C++
1
2
3
4
5
6
7
8
9
int poisk (int x[I][J])
{
  int i, j, max;
  max = x[0][0];
  for (i=0,j=0; i<I,j < J;j++,i++)
        if ( (x[i][j] > max) && (i=j))
    max = x [i][j];
  return (max);
}
Вариант второй:
C++
1
2
3
4
5
6
7
8
9
10
int fmaxglavdig( int x [I][J] )
{
  int i, j, max;
  max = x[0][0];
  for (i=0; i<I; i++)
    for ( j=0; j < J; j++)
      if ((x[i][j] > max)&&(i=j))
    max = x [i][j];
  return (max);
}
Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
02.03.2011, 12:35     Есть ли разница в коде? #2
C
1
2
3
4
5
6
7
8
9
int foo (int base[n][m])
{
    max = base[0][0];
    for (i = 0; i < n && i < m; ++i)
        if (max < base[i][i])
            max = base[i][i];
    
    return max;
}
Добавлено через 1 минуту
Цитата Сообщение от Svid Посмотреть сообщение
i=j
оба варианты некорректны ииз-за этого момента, видимо здесь должно быть сравнение ==, а не присваивание =.
Svid
 Аватар для Svid
5 / 5 / 1
Регистрация: 02.03.2011
Сообщений: 40
02.03.2011, 16:31  [ТС]     Есть ли разница в коде? #3
Большое спасибо!
оба варианты некорректны из-за этого момента
это плохо, потому что у меня десять таких функций - видимо все неправильные

Но все равно, основной вопрос по циклу:
есть ли разница между первым вариантом, когда один цикл используется, и вообще корректна ли сама запись (
C++
1
for (i=0,j=0; i<I,j < J;j++,i++)
) и вторым - когда два цикла?
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
02.03.2011, 17:14     Есть ли разница в коде? #4
А это на C++? Если да, то как у вас это компилится?
C++
1
poisk (int x[I][J]){}
Sokolov
 Аватар для Sokolov
42 / 42 / 3
Регистрация: 04.01.2011
Сообщений: 125
02.03.2011, 17:24     Есть ли разница в коде? #5
Цитата Сообщение от Svid Посмотреть сообщение
for (i=0,j=0; i<I,j < J;j++,i++)
Цитата Сообщение от Svid Посмотреть сообщение
массива, скажем 4х4
то есть I=J
тогда,
Цитата Сообщение от Svid Посмотреть сообщение
for (i=0,j=0; i<I,j < J;j++,i++)
можно просто записать как
C++
1
for(i=0;i<I;i++)
и тут будет перебираться только главная диагональ
C++
1
a[i][i]
а если использовать такой вариант
C++
1
2
for (i=0; i<I; i++)
    for ( j=0; j < J; j++)
то сначала перебираются все элементы первой строки, потом второй и тд.
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
02.03.2011, 17:30     Есть ли разница в коде? #6
Если матрица квадратная, то достаточно
C++
1
2
for (int i = 0; i < matrix_size; i++)
    if (x[i][i] > max) max = x [i][i];
Не сразу понял, у вас I и J глобальные константы. Весь код показывать надо
Svid
 Аватар для Svid
5 / 5 / 1
Регистрация: 02.03.2011
Сообщений: 40
02.03.2011, 17:40  [ТС]     Есть ли разница в коде? #7
Еще раз большое всем спасибо!
Все понял (всю глубину своих заблуждений)
остался только один вопрос: что делали мои первоначальные варианты?
оба варианты некорректны ииз-за этого момента, видимо здесь должно быть сравнение ==, а не присваивание =.
видимо в моем неправильном варианте с один циклом
C++
1
for (i=0,j=0; i<I,j < J;j++,i++)
- не важно сравнение это или присвоение, так как I и J и так всегда будут равны, а вот во втором варианте, а не могу понять, что она в таком случае считает??
А это на C++? Если да, то как у вас это компилится?
нормально, без ошибок, а что?
Sokolov
 Аватар для Sokolov
42 / 42 / 3
Регистрация: 04.01.2011
Сообщений: 125
02.03.2011, 17:46     Есть ли разница в коде? #8
Svid, по-моему, оба варианта верны, если исправить
Цитата Сообщение от Svid Посмотреть сообщение
C++
1
if ((x[i][j] > max)&&(i=j))
на
C++
1
if ((x[i][j] > max)&&(i==j))
Это при условии, что I==J
Svid
 Аватар для Svid
5 / 5 / 1
Регистрация: 02.03.2011
Сообщений: 40
02.03.2011, 18:03  [ТС]     Есть ли разница в коде? #9
А если не исправлять? Я просто для себя не могу понять, что начинает делать эта функция в варианте с вложенным циклом...
То есть, при первом шаге I становится 1, и начинают перебираться все J от 0 до 4, но при моей записи (i=j)).... что происходит, я не могу понять...
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
02.03.2011, 18:49     Есть ли разница в коде? #10
Цитата Сообщение от Svid Посмотреть сообщение
То есть, при первом шаге I становится 1, и начинают перебираться все J от 0 до 4
почти верно, только i становится равно 0. i равно 1 на втором шаге.
Цитата Сообщение от Svid Посмотреть сообщение
но при моей записи (i=j)).... что происходит, я не могу понять...
выполняется правая часть условия if ((x[i][j] > max)&&(i=j)), только видимо i==j - проверка на равенство
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
02.03.2011, 18:54     Есть ли разница в коде? #11
Цитата Сообщение от Svid Посмотреть сообщение
А если не исправлять? Я просто для себя не могу понять, что начинает делать эта функция в варианте с вложенным циклом...
То есть, при первом шаге I становится 1, и начинают перебираться все J от 0 до 4, но при моей записи (i=j))....
Любая запись в блоке поверки условия (if/for/while...) в итоге приводится к булевому выражению (true/false - истина/ложь). Если в таком блоке стоит число, то оно тоже приводится к булевому, любое ненулевое число - истина, ноль - ложь.
Если рассматривать запись вида
C
1
if (a = b)
, переменной 'a' присваивается значение переменной 'b', получается, что условие зависит от 'b', и блок не сработает только в случае, если b равна 0.
Цитата Сообщение от Svid Посмотреть сообщение
что происходит, я не могу понять...
А теперь подумайте
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2011, 19:45     Есть ли разница в коде?
Еще ссылки по теме:

C++ Есть ли разница между Visual C++, Borland C++ и C++ Builder?
C++ Есть ли разница между этими записями?
C++ Конец файла. Есть ли разница в windows и linux?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Svid
 Аватар для Svid
5 / 5 / 1
Регистрация: 02.03.2011
Сообщений: 40
02.03.2011, 19:45  [ТС]     Есть ли разница в коде? #12
[QUOTE=fasked;1415103]Любая запись в блоке поверки условия (if/for/while...) в итоге приводится к булевому выражению (true/false - истина/ложь). Если в таком блоке стоит число, то оно тоже приводится к булевому, любое ненулевое число - истина, ноль - ложь.
Если рассматривать запись вида
C
1
if (a = b)
, переменной 'a' присваивается значение переменной 'b', получается, что условие зависит от 'b', и блок не сработает только в случае, если b равна 0.

То есть, в случае b>0 запись if (a = b) - просто пустое условие, которое ничего не добавляет, а при b=0 - выпадает из поиска столбец, правильно?
Yandex
Объявления
02.03.2011, 19:45     Есть ли разница в коде?
Ответ Создать тему
Опции темы

Текущее время: 07:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru