Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2009, 00:43   #1
Sadisto
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 10
По умолчанию Одномерные массивы)

Извиняюсь, что не там создал тему вначале, ув. модератор, спасибо за вежливое указание правил!

У меня такой вопрос был - нужно в заданном одномерном массиве для четных цифр подсчитать сумму.
Я написал прогу, которая считает макс и мин элемент в массиве и его индекс, а сумма у меня не считается, вылетает с ошибкой.
Где тут неверно в коде?

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    lbl1: TLabel;
    lbl2: TLabel;
    lbl3: TLabel;
    lbl4: TLabel;
    lbl5: TLabel;
    edt1: TEdit;
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    lbl6: TLabel;
    strngrd1: TStringGrid;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure edt1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
Var
  n,i,imax: integer;
  max:real;
  a: array[1..10] of real;
begin
  n:=StrToInt(edt1.Text);
  For i:= 1 to n Do
      a[i]:=StrToFloat(strngrd1.Cells[i, 1]);
  imax:=1;
  max:=a[1];
  For i:= 2 to n Do
    If a[i]>max Then
    Begin
      imax:=i;
      max:=a[i]
    End;
    lbl2.Caption :='MAX  = '+  FloatToStr(max);
    lbl3.Caption :='iMAX  = '+ IntToStr(imax);
    strngrd1.col:=imax;
    strngrd1.row:= 1;
  end;


procedure TForm1.btn3Click(Sender: TObject);
var
i:integer;
s:real;
a: array[1..10] of integer;
begin
s:=0;
for i:=1 to a[i] do
  begin
  if Odd(a[i])=false then s:=s+a[i]; //åñëè ýëåìåíò ÷åòíûé, òî äîáàâëÿåì ê ñóììå
  end;
  lbl6.Caption :='SUM  = '+  FloatToStr(s);
end;




procedure TForm1.btn2Click(Sender: TObject);
Var
  n,i,imin: integer;
  min:real;
  a: array[1..10] of real;
begin
  n:=StrToInt(edt1.Text);
  For i:= 1 to n Do
      a[i]:=StrToFloat(strngrd1.Cells[i, 1]);
  imin:=1;
  min:=a[1];
  For i:= 2 to n Do
    If a[i]<min Then
    Begin
      imin:=i;
      min:=a[i]
    End;
    lbl4.Caption :='MIN  = '+  FloatToStr(min);
    lbl5.Caption :='iMIN  = '+ IntToStr(imin);
    strngrd1.col:=imin;
    strngrd1.row:= 1;
  end;



procedure TForm1.edt1KeyPress(Sender: TObject; var Key: Char);
var n, i:integer;
begin
  if key = #13 then
  Begin
    n:=StrToInt(edt1.Text);
    edt1.Enabled:=False;
    strngrd1.RowCount:= 2;
    strngrd1.ColCount :=n+1;
    For i:= 1 to n Do
      strngrd1.Cells[i, 0]:=IntToStr(i);
   strngrd1.setfocus
  End;
end;

end.
Sadisto вне форума Ответить с цитированием
Старый 21.12.2009, 08:20   #2
dr.Chas
***
Участник клуба
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию

Почти везде вы забываете что в stringrid начало столбцов и строк с 0.

Что вы делаете здесь?
Код:
strngrd1.col:=imin-1;
strngrd1.row:= 1;

А тут?
Код:
for i:=1 to a[i] do
И самое последнее если у вас массив объявлен не глобально откуда в последней процедуре там возьмутся значения? Функция odd работает только с целыми числами. Массив у вас не целого типа. Либо берите целую часть числа и проверяйте её, либо используйте целые числа.

Для целого массива поправил:
Код:
var
  Form1: TForm1;
  a: array[1..10] of integer;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
Var
  n,i,imax, max: integer;

begin
  n:=StrToInt(edt1.Text);
  //showMessage(strngrd1.Cells[0, 0]);
  For i:= 1 to n Do
      a[i]:=StrToInt(strngrd1.Cells[i-1, 0]);
  imax:=1;
  max:=a[1];
  For i:= 2 to n Do
    If a[i]>max Then
    Begin
      imax:=i;
      max:=a[i]
    End;
    lbl2.Caption :='MAX  = '+  IntToStr(max);
    lbl3.Caption :='iMAX  = '+ IntToStr(imax);
    strngrd1.col:=imax-1;
    //strngrd1.row:= 1;
  end;

procedure TForm1.btn2Click(Sender: TObject);
Var
  n,i,imin, min: integer;
begin
  n:=StrToInt(edt1.Text);
  For i:= 1 to n Do
      a[i]:=StrToInt(strngrd1.Cells[i-1, 0]);
  imin:=1;
  min:=a[1];
  For i:= 2 to n Do
    If a[i]<min Then
    Begin
      imin:=i;
      min:=a[i]
    End;
    lbl4.Caption :='MIN  = '+  IntToStr(min);
    lbl5.Caption :='iMIN  = '+ IntToStr(imin);
    strngrd1.col:=imin-1;
    //strngrd1.row:= 1;
  end;

procedure TForm1.btn3Click(Sender: TObject);
var
i, s:integer;
begin
s:=0;
for i:=1 to 10 do
  begin
  if not(Odd(a[i])) then s:=s+a[i]; //åñëè ýëåìåíò ÷åòíûé, òî äîáàâëÿåì ê ñóììå
  end;
  lbl6.Caption :='SUM  = '+  IntToStr(s);
end;

procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
  for i := 0 to strngrd1.colcount - 1 do
    strngrd1.Cells[i,0]:=IntToStr(i+5);
end;

procedure TForm1.Edt1KeyPress(Sender: TObject; var Key: Char);
var n, i:integer;
begin
  if key = #13 then
  Begin
    n:=StrToInt(edt1.Text);
    edt1.Enabled:=False;
    strngrd1.RowCount:= 2;
    strngrd1.ColCount :=n+1;
    For i:= 1 to n Do
      strngrd1.Cells[i, 0]:=IntToStr(i);
   strngrd1.setfocus
  End;
end;
но если вам надо всё таки массив с типом real. То для проверки не целого числа на чётность, делайте так:
Код:
i:integer;
s: real;
begin
s:=0;
for i:=1 to 10 do
  begin
  if not(trunc(a[i]) mod 2 = 0) then then s:=s+a[i]; 
  end;
  lbl6.Caption :='SUM  = '+  IntToStr(s);
end;

Последний раз редактировалось dr.Chas; 21.12.2009 в 08:23.
dr.Chas вне форума Ответить с цитированием
Старый 21.12.2009, 12:44   #3
Sadisto
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 10
По умолчанию

dr.Chas, большое спасибо! Мне нужен именно вещественный тип, да.
В Stringrid нулевые строка и столбец фиксированные, поэтому с 1.

Я пробовал подсчитать сумму вот так

Код:
i:integer;
s: real;
begin
s:=0;
for i:=1 to 10 do
  begin
  if not(trunc(a[i]) mod 2 = 0) then s:=s+a[i]; 
  end;
  lbl6.Caption :='SUM  = '+  IntToStr(s);
end;
Такая ошибка - There is no overloaded version of 'IntToStr' that can be called with these arguments

Если преобразовывать значение с плавающей запятой в строку, то компилися, но сумма странная получается)

И еще вопрос, почему в исправленном коде процедура Button1Click идет 2 раза?

Последний раз редактировалось Sadisto; 21.12.2009 в 13:03.
Sadisto вне форума Ответить с цитированием
Старый 21.12.2009, 12:57   #4
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 823
По умолчанию

Если у Вас значение вещественного типа,а Вы пытаетесь преобразовать это значение с помощью IntToStr,то и должна возникать ошибка..в С++ есть процедура FloatToStr,которая преобразует из вещественного в строку,вероятно есть аналог и в Delphi,к сожалению точно сказать не могу.
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 21.12.2009, 12:58   #5
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Цитата:
в С++ есть процедура FloatToStr,которая преобразует из вещественного в строку,вероятно есть аналог и в Delphi
Вы ничего не перепутали?
Levsha100 вне форума Ответить с цитированием
Старый 21.12.2009, 13:55   #6
Sadisto
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 10
По умолчанию

Функция FloatToStr как раз существует в дельфи, и преобразует значение с плавающей запятой в строку
Sadisto вне форума Ответить с цитированием
Старый 21.12.2009, 19:10   #7
dr.Chas
***
Участник клуба
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию

Цитата:
Сообщение от Sadisto Посмотреть сообщение
Такая ошибка - There is no overloaded version of 'IntToStr' that can be called with these arguments
Да согласен, не доглядел. Поправил:

Код:
i:integer;
s: real;
for i:=1 to 10 do
  begin
    if (trunc(a[i]) mod 2=0) then
     s:=s+a[i];
  end;
  label1.Caption :='SUM  = '+  FloatToStr(s);
Цитата:
Сообщение от Sadisto Посмотреть сообщение
И еще вопрос, почему в исправленном коде процедура Button1Click идет 2 раза?
Да это я так stringrid заполнял.
dr.Chas вне форума Ответить с цитированием
Старый 21.12.2009, 19:35   #8
Sadisto
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 10
По умолчанию

Компилится вроде бы без проблем, только сумму всегда считает как 0, независимо от того, какие я ввожу массивы
Sadisto вне форума Ответить с цитированием
Старый 21.12.2009, 20:07   #9
dr.Chas
***
Участник клуба
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию

Всё нормально работает, единственное проверку на 0 надо добавить. Ниже пример я добавил.
Вложения
Тип файла: rar primer.rar (2.9 Кб, 9 просмотров)
dr.Chas вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны одномерные массивы А и В. Сформировать массивы, состоящие из элемент LyaLya Помощь студентам 15 20.12.2009 14:12
Одномерные массивы. Paul Oakenfold Паскаль, Turbo Pascal, PascalABC.NET 0 11.05.2009 16:07
Одномерные Массивы ТРОЯН=) Помощь студентам 4 03.02.2009 00:11
Одномерные массивы Кирилл17 Помощь студентам 2 09.12.2008 23:34