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, Супермодераторы



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

Сейчас этот форум просматривают: mihaild


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

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