2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 
Сообщение26.12.2008, 14:51 


20/10/08
28
bekas, что же вы так резко выступили с критикой в мой адрес? Я не претендую на звание лучшего программиста, я примерно на уровне автора этого топика, ну может чуть опытнее(сейчас изучаю пользовательские классы, наследование, полиморфизм) Т.е. ещё самое начало. Лучше бы написали, что конкретно плохо в программе, чтобы я взял на заметку и чтобы учился. Разве этот форум не для этого? А просто так испортили настроение. Я лишь помочь хотел.
P.S. при n==1 всё работает. при n==0 max выдаст мусор, но это легко исправить.

 Профиль  
                  
 
 
Сообщение26.12.2008, 19:00 


27/11/05
183
Северодонецк
Вся проблема в вашем операторе if(i==0) max=B[i];

Обратите внимание, что в локальном массиве B по определению будет мусор - самые произвольные значения.

Обычно, но не всегда, там будут большие отрицательные числа. И если вы тестировали свой код при n = 1, то наверняка вводили A[0][0] как положительное число, что и скрывало дефект вашей программы. Если бы ввели число где-то -999999999, то очень вероятно в качестве максимума получили бы не то, что ожидали...

А что касается критики - это скорее в адрес ваших преподавателей, которые не могут научить своих студентов
читабельному оформлению своих программ (смотрите бурные дебаты по этому поводу в "Помогите найти ошибку в программе").

 Профиль  
                  
 
 
Сообщение26.12.2008, 22:00 


20/10/08
28
bekas, Я самоучка, только в школе был Паскаль. Так что критика именно в мой адрес.
Можно было отдельно заполнить массив B[i], потом инициализировать max путем присваивания B[0], и находить дальше его. Тогда явления, которое вас так беспокоит, не будет.
Код:
...
int temp=0;
   for(i=0;i<n;i++)
   {
   temp=0;
      for(j=0;j<n;j++)
      temp=temp+A[i][j];   
   B[i]=temp;
   }

   int max=B[0];
   for(i=0;i<n;i++)
   if(B[i]>max) max=B[i];
...

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

 Профиль  
                  
 
 
Сообщение26.12.2008, 22:41 


27/11/05
183
Северодонецк
Явление, о котором я вам сказал, должно в первую очередь беспокоить автора
кода.

Код:

// Это ваша версия, с оставленной семантикой, но написанная
// хоть с каким-то стилем:

#include <iostream>
using namespace std;

int main()
{
  int n;
  int A[50][50];
  int B[50];
  int i = 0, j = 0; // Какой смысл здесь инициализировать, если далее см. for

  cout << "Enter n= " << endl;
  cin >> n;
  cout << " Enter matrix A[n][n] = " << endl;

  for(i = 0; i < n; ++i)
  {
    for(j = 0; j < n; ++j)
    {
       cin >> A[i][j];
    }
  }

  cout << "\n matrix A[n][n] = " << endl;
  for(i = 0; i < n; ++i)
  {
    for(j = 0; j < n; ++j)
    {
      cout << A[i][j] << "\t ";
    }
    cout << endl;
  }

  int temp = 0,max; // Какой смысл здесь инициализировать, если далее см. temp = 0
  for(i = 0; i < n; ++i)
  {
    if(i == 0)
      max = B[i];
    temp = 0;
    for(j = 0; j < n; ++j)
    {
      temp = temp + A[i][j];
    }
    B[i] = temp;
    if(B[i] > max)
      max = B[i];
  }

  cout << " B[i] = " << endl;
  for(i = 0; i < n; ++i)
  {
    cout << B[i] << endl;
  }

  cout << " max = " << max;
  return 0;
}

// Могу предложить свою версию:
#include <iostream>
using namespace std;

int main()
{
  int n, i, j, temp, max = 1 << (sizeof(int) * 8 - 1);
  int A[50][50];
  int B[50];

  cout << "Enter n = ";
  cin >> n;
  cout << "Enter matrix A[n][n] = ";

  for(i = 0; i < n; ++i)
  {
    for(j = 0; j < n; ++j)
    {
       cin >> A[i][j];
    }
  }

  cout << "\nmatrix A[n][n] = " << endl;
  for(i = 0; i < n; ++i)
  {
    for(j = 0; j < n; ++j)
    {
      cout << A[i][j] << "\t ";
    }
    cout << endl;
  }

  for(i = 0; i < n; ++i)
  {
    for(j = temp = 0; j < n; ++j)
    {
      temp += A[i][j];
    }
    if((B[i] = temp) > max)
      max = temp;
  }

  cout << "B[i] = ";
  for(i = 0; i < n; ++i)
  {
    cout << B[i] << ' ';
  }
  cout << endl;

  cout << "max = " << max << endl;
  return 0;
}


Выбирайте сами...

 Профиль  
                  
 
 
Сообщение27.12.2008, 01:29 


12/09/08

2262
bekas в сообщении #171810 писал(а):
Код:
int i = 0, j = 0; // Какой смысл здесь инициализировать, если далее см. for

Да их и объявлять тут незачем. C++ все таки.
bekas в сообщении #171810 писал(а):
Код:
  int A[50][50];
  int B[50];
Плохое объявление. Но уж если и поленились динамически брать сколько нужно, то хотя бы должна быть проверка, что введен n <= 50.
bekas в сообщении #171810 писал(а):
Код:
temp += A[i][j];
A[i] хорошо бы вычислять один раз на каждый i, а не n раз.

 Профиль  
                  
 
 
Сообщение27.12.2008, 01:54 


20/10/08
28
bekas, у меня недостаточно знаний, чтобы понять, что значит
Код:
<< (sizeof(int) * 8 - 1)

Но мне понравилось, спасибо. Теперь хотя бы понимаю, к чему претензии.

Добавлено спустя 4 минуты 1 секунду:
вздымщик Цыпа писал(а):
Плохое объявление. Но уж если и поленились динамически брать сколько нужно, то хотя бы должна быть проверка, что введен n <= 50.

вздымщик Цыпа, пытался сделать проще для автора темы, а динамически сложнее. Если не ошибаюсь, можно как-то ещё воспользоваться STL.

 Профиль  
                  
 
 
Сообщение27.12.2008, 02:29 


12/09/08

2262
apatic писал(а):
bekas, у меня недостаточно знаний, чтобы понять, что значит
Код:
<< (sizeof(int) * 8 - 1)

Но мне понравилось, спасибо. Теперь хотя бы понимаю, к чему претензии.

BTW, это не максимальное значение для типа int.
Код:
(int)((~(0U)) >> 1)
почти вдвое больше.

Добавлено спустя 2 минуты 44 секунды:

apatic в сообщении #171915 писал(а):
пытался сделать проще для автора темы, а динамически сложнее.
Это не к Вам претензии.
apatic в сообщении #171915 писал(а):
Если не ошибаюсь, можно как-то ещё воспользоваться STL.
Можно. И более того, STL знать полезно. Только использовать его в серьезных программах не нужно.

 Профиль  
                  
 
 
Сообщение27.12.2008, 09:49 


27/11/05
183
Северодонецк
Конечно, не максимальное, а с точностью до наоборот - минимальное. Опять же, читайте мои комментарии - я не собирался переделывать код автора (менять его семантику - вводить дополнительный контроль или динамические массивы или оптимизацию), а всего лишь устранял явный дефект поиска максимума и, в первую очередь, обращал внимание на "читабельность" кода не компилятором, но человеком...

 Профиль  
                  
 
 
Сообщение27.12.2008, 12:29 


25/12/08
115
FORTRAN77

dimension b(1000)
read(*,*)n
do 2 j=1,n
do 1 i=1,n
read(1,*)a ________ ПОСТРОЧНЫЙ ввод ("1"-канал ввода )
b(j)=b(j)+a
write(2,*)b(j) _______ вывод ("2"-канал вывода)
1 continue
if(b(j).ge.b(j-1)) then
MAX=b(j)
endif
2 continue
write(2,*)'MAX=',MAX
end

 Профиль  
                  
 
 
Сообщение27.12.2008, 15:52 


12/09/08

2262
bekas в сообщении #171937 писал(а):
Конечно, не максимальное, а с точностью до наоборот - минимальное.
Тьфу, блин, ну да.

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

Только вот в MAX будет совсем не то, что требовалось в задаче.

Danila88,
что означает 'if(b(j).gt.b(j-1)) then ...' при 'j = 1'?
Что будет в переменной 'MAX' если условие ни разу не выполниться?
Что будет в переменной 'MAX', если в какой-то строке встретятся '.., 1000000, -1000000, ...' при том, что остальные значения будут совсем невелики.

 Профиль  
                  
 
 
Сообщение27.12.2008, 16:03 


25/12/08
115
1.)По умолчанию, b(0)=0, (св-во языка: если переменной не присвоено значение, она=0);
2.)условие не выполниться, если все эл-ты равны, извините, надо поставить ge;
3.)ничего, т.к нас интересует их сумма.

 Профиль  
                  
 
 
Сообщение27.12.2008, 16:17 


12/09/08

2262
Danila88 в сообщении #172000 писал(а):
1.)По умолчанию, b(0)=0, (св-во языка: если переменной не присвоено значение, она=0);
Это в том случае, если переменная есть. Если за 20 лет я не забыл, то в фортране массивы индексируются с 1, значит никакого b(0) нет.
Danila88 в сообщении #172000 писал(а):
3.)ничего, т.к нас интересует их сумма.

Еще раз, на входе:
Код:
1 2
10000 -10000

Суммы: 3, 0
Максимум: 3. А Ваша программа даст 10000. Как минимум проверку надо вынести за пределы цикла по i.
Danila88 в сообщении #172000 писал(а):
2.)условие не выполниться, если все эл-ты равны, извините, надо поставить ge;
Условие может не выполниться и в других случаях:
Код:
-1 -2
-5 -6

 Профиль  
                  
 
 
Сообщение27.12.2008, 17:50 


27/12/08
1
Калиниград
Pascal:
Код:
program p;

const
   COUNT = 1000;

type
   TArray = array[1..COUNT] of longint;
   TMatrix = array[1..COUNT] of TArray;

var
   M: TMatrix;
   A: TArray;
   max: longint;
   n, i, j: longword;

begin
   read(n);
   for i:=1 to n do begin
      A[i]:= 0;
      for j:=1 to n do begin
         read(M[i, j]);
         inc(A[i], M[i, j]);
      end;
   end;

   max:=low(max);
   for i:=1 to n do
      if A[i]>max then max: = A[i];
end.

В программе по идее вообще можно обойтись и без матрицы и без массива. Но коль родина сказала - что поделать.


C++ нелюблю за его неудобство, так что извиняйте.

 Профиль  
                  
 
 
Сообщение27.12.2008, 20:01 


27/11/05
183
Северодонецк
Valdemard, последний цикл можно совместить с предпоследним...

 Профиль  
                  
 
 
Сообщение27.12.2008, 22:25 


25/12/08
115
вздымщик Цыпа писал(а):
Danila88 в сообщении #172000 писал(а):
1.)По умолчанию, b(0)=0, (св-во языка: если переменной не присвоено значение, она=0);
Это в том случае, если переменная есть. Если за 20 лет я не забыл, то в фортране массивы индексируются с 1, значит никакого b(0) нет.
Danila88 в сообщении #172000 писал(а):
3.)ничего, т.к нас интересует их сумма.

Еще раз, на входе:
Код:
1 2
10000 -10000

Суммы: 3, 0
Максимум: 3. А Ваша программа даст 10000. Как минимум проверку надо вынести за пределы цикла по i.
Danila88 в сообщении #172000 писал(а):
2.)условие не выполниться, если все эл-ты равны, извините, надо поставить ge;
Условие может не выполниться и в других случаях:
Код:
-1 -2
-5 -6


Массивы индексируются с любого неотриц.числа (FORTRAN77)

Насчёт выноса-Вы правы...

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group