Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многомерные массивы, Пишу программу (контрольную в универ) 
:(
    Опции темы
OuterHeaven
Дата 8.4.2008, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



Я учусь на первом курсе в университете по специальности "Инженер по информационным системам и технологиям. Передо мной стоит задача, написать программу по этому условию: Дано 100 вещественных чисел. Вычислить разность между максимальным и минимальным из них.

Написал исходный текст: на делфи

Цитата

{Нажатие кнопки вычислить}
procedure TForm1.Button1Click(Sender: TObject);


var
   a:   array[1..100] of real;   
   i:   integer;                       
   max: real;                     
   min: real;                         
   rez: real;                            

{Вводим массив}
begin

     for i:= 1 to 100 do
     a[i]:= StrToFloat(StringGrid1.cells [i-1,0]);

     max:= a[1];
     min:= a[1];
      for i:= 1 to 100 do
       begin
            if a[i] > max
             then
              max:= a[i];
              if a[i] < max
               then
               min:= a[i];
       rez:= max - min;

       label1.Caption:='Минимальный элемент массива: ' + FloatToStr(min) + #13 +
       'Максимальный элемент массива: ' + FloatToStr(max) + #13 +
       'Разность между максмильным и минимальным значением: ' + FloatToStr(rez);

       end;
end;


Конечно же я воспользовался формой StringGrid. Задал параметры для 100 чисел (сделал таблицей 10х10), но возникает несколько проблем:

Программа запускается. Я вношу 100 чисел и при нажатии кнопки вычислить программа выдает ошибку Project Project1.exe raised exception class EConvertError with message"' is not a valid floating point value' Process stopped. Use Step or Run to continue.

Я вношу поправку в циклы for, меняю значения (вместо 100 ставлю 5). Программа работает, но при вводе чисел в таком порядке 3 5 1 4 выдает, что минимальный элемент массива 2 (хотя должен быть 1). При вводе по порядку выдает все правильно.

Помогите пожалуйста разобраться...
 smile 
PM MAIL   Вверх
WaReZMEN
Дата 8.4.2008, 04:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



Вопервых ты пишеш 4 элемента 
Цитата
3 5 1 4
 а в масив пытаешся в пихнуть 5 от сюда и ошибка она говорит чтоне может преоброзовать струку и реал...
 
Цитата

Project1.exe raised exception class EConvertError with message"' is not a valid floating point value' Process stopped. Use Step or Run to continue.

Возможно ты напутал с кол-вом строк и столбцов в stringrid.
P.S. можно в строчке 
Код

for i:= 1 to 100 do
     a[i]:= StrToFloat(StringGrid1.cells [i-1,0]);


сделать так
Код

     for i:= 1 to 4 do
     If  StringGrid1.cells [i,1]<>'' then
       a[i]:= StrToFloat(StringGrid1.cells [i,1]);

Но никто не гарантирует что никто туда не впишет букву smile но это тоже можно проверять....

Вот тебе пример все работает как надо..


Это сообщение отредактировал(а) WaReZMEN - 8.4.2008, 04:50

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  Source.rar 2,79 Kb
PM MAIL ICQ   Вверх
OuterHeaven
Дата 8.4.2008, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



Огромное СПС. Это я понял. Но кто мне объяснит это на примере двумерного или многомерного массива? Надо ведь массив для 100 чисел... Помогите пожалуйста, буду очень признателен.

Это сообщение отредактировал(а) OuterHeaven - 8.4.2008, 16:33
PM MAIL   Вверх
OuterHeaven
Дата 8.4.2008, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



Цитата

 for i:= 1 to 4 do
     If  StringGrid1.cells [i,1]<>'' then
       a[i]:= StrToFloat(StringGrid1.cells [i,1]);


И еще вопрос мне не понятно, что это за параметры StringGrid.cells? (выделено красным цветом)
PM MAIL   Вверх
WaReZMEN
Дата 9.4.2008, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



OuterHeaven ,
Цитата
 [i,1] 
 это столбец и строчка для многомерного масива все тоже очень просто делается .... скажу тебе тока что забивать его из StringGrid ты замучаешся. у вырожение 
Код

If  StringGrid1.cells [i,1]<>'' then
       a[i]:= StrToFloat(StringGrid1.cells [i,1]);
 говорит о том что если текущий элемент стрингрида не пустои то преоброзовать его в Float. Но я повторюсь что  проверку пробелов, букв и прочих символо нужно также сделать...
И еще я себе струдом представляю (а проще говоря вообще не предстовляю) каим образом ты многомерный масив из StringGrid заполнять будеш ну двух мерный реально а трех???? 
Кстате поимоиму у тебя с алгоритмом что то не то ну тебе виднее....
Вот тебе пример 2-х мерного:

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  Source.rar 2,91 Kb
PM MAIL ICQ   Вверх
OuterHeaven
Дата 9.4.2008, 02:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



А как тогда мне поступить? Чем можно воспользоваться еще для ввода многомерного массива как не StringGrid. Мне нужен массив, который сосотоит из таблицы 10x10. В общей сложности я смогу ввести в него 100 чисел. И среди них должен найти наименьшее и наибольшее значение. К стати я пробовал твою программу она показывает неправильно минимальное число (если ввести числа не по порядку) Я только начинающий смотрю в чем проблема...

Это сообщение отредактировал(а) OuterHeaven - 9.4.2008, 03:06
PM MAIL   Вверх
WaReZMEN
Дата 9.4.2008, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



OuterHeaven, ну программа не моя а твоя smile  (к томуже я говорил что она не совсем правельно работает) в алгоритм вообще нивнекал и оно мне ненужно я всего лиш отвечал на вопрос.... по поводу  чем воспользоватся : оставь стрин грид просто сам почуствовал что каждый раз вводить 100 элементов малость утомляет поэтому нужно сделать сохранение в в файл или заполнение генератором случаиных чисел. 
PM MAIL ICQ   Вверх
OuterHeaven
Дата 9.4.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



Может если вам не трудно... Вы поможете мне. Просто я не знаю как исправить код, чтобы программа правильно находила минимальные числа, и как заполнить массив случайными числами? Какие функции используются для этого...

Заранее спасибо.
PM MAIL   Вверх
WaReZMEN
Дата 10.4.2008, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



Ну все просто ошибка твоя в том что ищя минимальный элемент ты сравниваеш текущис максимальным и думаеш что если текущий меньше максимального то это минимальный это не так
Код

          if a[i,j] < max         then          min:= a[i,j];



а нужно так

Код

          if a[i,j] < min         then          min:= a[i,j];

 
Вторая ошибка в том что ты вычисляеш разницу между максимальным и минимальным элементом каждый раз и выводиш тоже каждый раз а это не правельно.
 Карочи вот тебе код учись студент  smile 


Присоединённый файл ( Кол-во скачиваний: 19 )
Присоединённый файл  Source.rar 3,21 Kb
PM MAIL ICQ   Вверх
OuterHeaven
Дата 10.4.2008, 04:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



Надеюсь я тоже так когда нибудь смогу, ОГРОМНОЕ ВАМ СПАСИБО. Буду дальше учиться smile 
PM MAIL   Вверх
OuterHeaven
Дата 10.4.2008, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



Код

procedure TForm1.Button1Click(Sender: TObject);
var

   a:   array[1..200,1..200] of Integer; //массив от 1 до 200 (это значит массив максимум может состоять из таблицы 200х200

   i:   integer; //Индекс колонок ???
   J:Integer;    //индекс строк ???
   max: real;    //Максимальное значение
   min: real;    //Минимальное значение
   rez: real;    //Результат

{Вводим массив}
begin

  For I:=1 To StringGrid1.ColCount-1 Do  //Это индекс колонок ??? (для чего они тут?)
    For J:=1 To StringGrid1.RowCount-1 Do  //Это индекс строк ??? (для чего они тут?)
       If  StringGrid1.cells [i,J]<>'' then  //Если текущий элемент StringGrid не пустой
          a[i,J]:= StrToInt(StringGrid1.cells [i,J]);  //то преобразовать его в Float

  max:=a[1,1];  //Мы предполагаем что максимальный элемент находится в поле [1,1]
  min:=a[1,1];  //Так же мы предполагаем что минимальный элемент находится в поле [1,1]
  For I:=1 To StringGrid1.ColCount-1 Do  //Начинаем цикл в первой колонке (так?)
    For J:=1 To StringGrid1.RowCount-1 Do  //Начинаем цикл в первой строке (так?)
       Begin
         IF a[i,J] > max  Then  max:= a[i,J];//Сравниваем текущий элемент с максимальным значением, если он больше максимального предыдущего то значение найдено
         IF a[i,j] < min  Then  min:= a[i,j];  //Сравниваем текущий элемент с минимальным значением, если он меньше минимального предыдущего то значение найдено
       end;

       rez:= max - min;
       label1.Caption:='Минимальный элемент массива: ' + FloatToStr(min) + #13 +
       'Максимальный элемент массива: ' + FloatToStr(max) + #13 +
       'Разность между максмильным и минимальным значением: ' + FloatToStr(rez);

end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  StringGrid1.RowCount:=StrToInt(Edit2.Text)+1; // ???
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
  StringGrid1.ColCount:=StrToInt(Edit1.Text)+1;  // ???
end;

procedure TForm1.Button2Click(Sender: TObject);  //По нажатии кнопки сгенерировать
var
  I,J:Integer;
begin
  Randomize;

  For I:=1 To StringGrid1.ColCount-1 Do         //Тут заполняем таблицу случайными числами с первой колонки и строки
    For J:=1 To StringGrid1.RowCount-1 Do
       StringGrid1.Cells[I,J]:=IntToStr(Random(1000));  //Генерируем числа от 0 - 1000

end;

end.


Вот у меня есть вопросы, правильно я прокоментировал исходный код? Там где мне не понятно, я выставил вопросы.
Заранее спс.

Это сообщение отредактировал(а) OuterHeaven - 10.4.2008, 22:11
PM MAIL   Вверх
Kaboom
Дата 10.4.2008, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 25.5.2007

Репутация: нет
Всего: нет



Все верно.

Маленькие замечания:

Код

For I:=1 To StringGrid1.ColCount-1 Do  //Это индекс колонок ??? (для чего они тут?)
    For J:=1 To StringGrid1.RowCount-1 Do  //Это индекс строк ??? (для чего они тут?)
        a[i,J]:= StrToInt(StringGrid1.cells [i,J]);

Этими циклами мы проходим весь StringGrid и загоняем значения ячеек в массив: сначала получаем ячейку [1,1],[1,2],...[1, StringGrid1.RowCount-1] - это первый ряд StringGrid'а, потом второй ..., третий и т. д.

Код

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  StringGrid1.RowCount:=StrToInt(Edit2.Text)+1; // ???
end;

При нажатии на кнопку SpeedButton1 количество строк в StringGrid'e станет равным числу введенному в Edit2 + 1

Код

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
  StringGrid1.ColCount:=StrToInt(Edit1.Text)+1;  // ???
end;

Аналогично для колонок.
PM MAIL   Вверх
WaReZMEN
Дата 11.4.2008, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



OuterHeaven, Да правельно с учетами канечно с коректировкой Kaboom. 
PM MAIL ICQ   Вверх
OuterHeaven
Дата 12.4.2008, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 8.4.2008

Репутация: нет
Всего: нет



Cпасибо БОЛЬШОЕ! smile  
PM MAIL   Вверх
Alex133
Дата 15.11.2009, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



А можно попросить вас написать это на Паскале? ну пожалуйста..
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0539 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.