Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Бедный студент нуждается в помощи!!!


Автор: Pusillanimous 3.1.2003, 14:49
Я все мучаюсь с массивами. Паскаль начал только неделю назад серьезно юзать, т е с БОЛЬШИМ хотением его познать. А началась все с парой задачек. Ну типа составить прогу с помощью которой можно будет квадратные ур-ия решать. Это я сжелал, а вот массивы меня достали. ИНикик ошибку не пойму. Может кто поможет
заполнить линейный массив целых чисел а(n) по правилу а[i]=b * i!

2. Замена элементов в массиве.
В линейном массиве целых чисел d(25) заменить все элементы, меньшие нуля на квадрат этих элементов.

3. Двумерные массивы.
Найти сумму всех четных элементов двумерного массива целых чисел a(20,30).


Помогите пожалуйста (крик души!) :exclamation  Может у кого похожие проги уже есть? Мыльте на [email protected]

Автор: neutrino 3.1.2003, 17:41
Здравствуйте, Pusillanimous.

I)
const
 n: Integer = 25; //Размер массива
type
 TMyArray = array[0..n] of Byte;
var
 Idx, B: Integer; //B - коэффициент
 A: TMyArray;
begin
 B := 2;
 for Idx := 0 to n do
   //Заполнение по вашей формуле
   A[Idx] := B*Idx;
end;

II)
 for Idx := 0 to 24 do
   //Если элемент<0, то записать вместо него квадрат
   if B[Idx]<0 then B[Idx] := B[Idx]*B[Idx];

III)
 Sum := 0; //Обнуляем сумму в начале
 for I := 0 to n do //Первый цикл по строкам, второй по столбцам
   for J := 0 to m do
     //Если элемент кратен 2-м (делится на 2 без остатка), добавить его в сумму.
     if A[I,J] mod 2 = 0 then Sum := Sum + A[I,J];

Удачи в дальнейшем познании программирования.


Автор: Kleo 3.1.2003, 21:12
Pusillanimous пиши, что у тебя не получается...с подобными задачами и я тебе помочь могу :)) а вообще здесь на форуме есть очень умные, отзывчивые, добрые, понятливые и тд и тп...в общем - тебе всегда помогут!!! :)) я тебе тоже желаю успехов !

Автор: Pusillanimous 4.1.2003, 08:18
neutrinoKleo

Нет слов! Спасибо БОЛЬШОЕ!!! Думаю, что я тут на долго прописался :) Честно говоря не ожидал, что кто-то ответит. Это как подарок к Рождеству, всегда неожиданно и приятно, что "есть очень умные, отзывчивые, добрые, понятливые.. которые ..тебе всегда помогут!!! :))"

Снимаю шляпу!

Автор: Pusillanimous 4.1.2003, 09:35
Цитата(neutrino @ 03.1.2003, 09:41)


Автор: Pusillanimous 4.1.2003, 09:37
neutrino


В чем ошибся???

Автор: Pusillanimous 4.1.2003, 09:41
Цитата(neutrino @ 03.1.2003, 09:41)

Я сразу не догадался как сюда картинку поместить. Это по первой задаче, что сам делал. Ошибку аналогичную выдает

Автор: Pusillanimous 4.1.2003, 09:43
neutrino

И почему у меня не получается ???  :(

Автор: Medved 4.1.2003, 10:01
Лучше вместо картинки приведи текст ошибки. Картинку не видно, видимо битая ссылка.

Автор: Wowa 4.1.2003, 10:13
Ссылка вот такая :) :
file:///C:/Documents%20and%20Settings/Никита/Desktop/RR/tp2.gif

Pusillanimous, Мы ведь не имеем доступ к твоему компьютеру, поэтому не можем посмотреть картинку. Ее надо сначала в Интернете где-то выложить, а затем здесь ссылку указать.

Автор: Medved 4.1.2003, 10:19
И еще Никита, лучше не храни на рабочем столе никаких папок и файлов, кроме ярлыков...Это ненадежно...для этих файлов и папок..

Автор: Pusillanimous 4.1.2003, 10:26
Pegas

а почему не надежно? У меня обычно рабочий стол похож на рабочий :) Т е я там храню только что скаченныен и оперативные файлы, т е те, которые часто нужны.

Автор: Pusillanimous 4.1.2003, 10:31
Значит это то что neutrino подсказал, но в моем исполнении не все пошло.


Program massiv;
const
n: Integer = 25;
type
TMyArray = array[0..n] of Byte;
var
Idx, B: Integer;
A: TMyArray;
begin
B := 2;
for Idx := 0 to n do
 
  A[Idx] := B*Idx;
end.

Для проверки нажимаю CTRL+F9, он курсор ставит на n (в

строке [0..n] ) и пишет ERROR 133: Cannot evaluate this

expression.

А вот то что я сам написал по первой задече, прежде чем помощь искать. Тут ошибку замаялся искать, никак не пойму. Тут курсор ставит на i в строке [i..n] и пишет Error 3: Unknown identifier

Program massiv;

Uses crt;
Var
a:array [i..n] of integer;
i,b,n:integer;

Begin
Writeln ('Введите первый элемент b=');
Readln (b);

Writeln ('Введите индекс i=');
readln (i);

Writeln ('Введите второй элемент n=');
readln (n);

for i to n do
Begin
a[i]:=b*fact(i);
Readln;
end;
end.

Автор: Medved 4.1.2003, 10:42
ну если n у тебя константа и всегда равна 25 то напиши следущее:

Код

Program massiv;
type
TMyArray = array[0..25] of Byte;
var
Idx, B: Integer;
A: TMyArray;
begin
B := 2;
for Idx := 0 to 25 do
 A[Idx] := B*Idx;
end.


я убрал объявление n как константы, и везде заменил ее на 25.

Автор: Pusillanimous 4.1.2003, 10:47
Pegas

Задачка была такая: заполнить линейный массив целых чисел а(n) по правилу а[i]=b * i!

Блин! Не люблю не конкретных задач!

Я думаю, по замыслу того, кто придумал эту задачку, нужно эту самую n вводить по мере выполнения программы, что я сам и пытался сделать. Конечно, если n заменить на число, ошибка пропадает. :) Но все же в чем причина?

>>Шекспир: Вот в чем ответ, во в чем причина того, что снова к вам иду. :)

Автор: Medved 4.1.2003, 11:03
const
n: Integer = 25; //Размер массива
TMyArray = array[0..n] of Byte;

- такого объявления массива вообще в Delphi я не видел...

Бывают три типа массива:

1) Статистический;
2) Динамический;
3) Открытый;

в свою очередь, статистический массив делиться на одномерный (он же линейный) и двухмерный и т.д.

а вообще вот тебе линк : http://mdelphi.far.ru/pascal/4_1.htm


Автор: Pusillanimous 4.1.2003, 11:07
Pegas
Я тоже не видел :) Кстати, я именно по этой ссылке собирал свой код. Говорю же, что всю литру в инете по паскалю проштудировал. Наверное ответ может дать только сам neutrino :) Ждемс.

Автор: Medved 4.1.2003, 11:13
Если же в условии задачи четко сказано, что количество элементов массива должно устанавливаться пользователем, то тогда надо использовать не линейный (читай как одномерный статистический массив) а динамический, и при задании длины этого динамического массива

Код

var
MyArray: array of integer;
LenghtArray: integer;
...
SetLenght(MyArray, LenghtArray);


переменной LenghtArray присваивать значение, заданное пользователем.

но судя по тексту твоей задачи, тебе нужно использовать именно линейный массив, а он как известно объявляется жестко, т.е. TMyArray = array[0..25] of Byte;


Автор: Pusillanimous 4.1.2003, 11:18
Pegas
В смысле линейный массив это всегда только от 0 до 25? Я Читал что есть линейные и двумерный массивы.
т. е. я правильно понимаю, что когда условие задачи содержит фразу заполнить лилейный массив и не дано что-то вроде "массив целых чисел a(n)" то обьявлять его нужно только так: TMyArray = array[0..25] of Byte

Да?

Автор: Medved 4.1.2003, 11:27
Цитата

Pegas
В смысле линейный массив это всегда только от 0 до 25? Я Читал что есть линейные и двумерный массивы.
т. е. я правильно понимаю, что когда условие задачи содержит фразу заполнить лилейный массив и не дано что-то вроде "массив целых чисел a(n)" то обьявлять его нужно только так: TMyArray = array[0..25] of Byte

Да?


Линейный (одномерный) массив – массив, у которого в описании задан только один индекс, если два индекса – то это двумерный массив и т.д. Одномерные массивы часто называют векторами, т.е. они представляют собой конечную последовательность пронумерованных элементов.

Т.Е. да, ты правильно понял, это грубо говоря, когда точно известно количество эллементов массива.

Автор: Pusillanimous 4.1.2003, 11:27
Pusillanimous

те наоборот, дано :)

Автор: Pusillanimous 4.1.2003, 11:30
Pegas

Спасибо! С этим разобрался.
И все же, почему  не рекомендуется хранить на рабочем столе никаких папок и файлов, кроме ярлыков.. ???

Автор: Medved 4.1.2003, 11:31
Цитата

те наоборот, дано  


Я не понял о чем ты...

Я прочел твои задачи еще раз, и судя по всему, в первой задаче по ее условию, тебе придется использовать динамический массив. Поскольку в первой задаче не задано точное количество элеиментов массива.

Автор: Medved 4.1.2003, 11:33
Цитата

Pegas
Спасибо! С этим разобрался.
И все же, почему  не рекомендуется хранить на рабочем столе никаких папок и файлов, кроме ярлыков..


Задай этот вопрос в разделе флейма, тебе там очень подробно все объяснят. (Или наоборот, опровергнут мое утверждение :) )


Автор: Pusillanimous 4.1.2003, 11:46
Pegas

Нет! Все верно! Только от 0 до 25!!!

Хотел вот что спросить. Факториал я правильно обозначил? fact(i)
А то neutrino написал по другому,  Idx это одно и то же?
Idx и fact(i)  ???

Автор: Pusillanimous 5.1.2003, 09:33
С первой справился. Со второй:
<<Замена элементов в массиве.
В линейном массиве целых чисел d(25) заменить все элементы, меньшие нуля на квадрат этих элементов.

- не уверен :(  Смотрите,
Program massiv;
const
n: Integer = 25;
type
TMyArray = array[0..25] of Byte;
var
Idx, B: Integer;
d: TMyArray;
begin

for Idx := 0 to 24 do
 
  if d[Idx]<0 then d[idx]:=d[idx]*d[Idx];
Writeln ('Решение=',d[idx]);

end.

Ошибки есть? По-моему тут чего-то не то. В результате получается 0. Так и должно быть?

С третьей
<<3. Двумерные массивы.
Найти сумму всех четных элементов двумерного массива целых чисел a(20,30).

Я написал:

Program massiv;
const
n: Integer = 25;
type
TMyArray = array[0..25] of Byte;
var
m,i,j,Idx, B: Integer;
a: TMyArray;
begin
i:=20;
j:=30;

Sum:=0;
for i:= to n do
for j:= to m do
if a[i,g] mod 2 =0 then sum:=sum+a[i,j];
Writeln ('Reshenie=',sum);
Readln;

end.

Тут ругается на sum при первом же её упоминании. Тут я наверное конкретно загнался. Исправте меня, пожалуйста. Я сразу не смог проверить все коды, т.к мало времени было, экзамены видите ли. :)
Двумерные массивы это по-моему штука в n раз посложней одномерных. :) Но все равно, хочу научиться ПРАВИЛЬНО писать программы!

Автор: МММ 5.1.2003, 14:26
А если так
var
a: array [0..25] of integer;
c: array [0..25] of integer;

b,i,j: integer;
begin
// первый вопрос
b:=2;
for i:=0 to 25 do
a[i]:=b*i;
for i:=0 to 25 do
memo1.lines.add(inttostr(a[i]));

// второй вопрос
for i:=0 to 25 do
if c[i]<>0 then c[i]:=sqr(c[i]);

for i:=0 to 25 do
memo2.lines.add(inttostr(c[i]));

а насчет третьего, я не понял там нечетный элемент массива , то есть a[1,3]  или а[13, 7]

for i:=0 to 20 do
for j:=0 to 30 do
   if ((i mod 2)=0 ) and ((j mod 2)=0) then sum:=sum+d[i,j];

или все таки значение массива не четное ( a[1,1]=3 )


for i:=0 to 20 do
for j:=0 to 30 do
   if (d[i,j] mod 2)=0 then sum:=sum+d[i,j];

Автор: Pusillanimous 5.1.2003, 14:46
Должно быть четное :)

Спасибо.

Автор: МММ 5.1.2003, 14:47
чуть не забыл:
var
d[i,j]: array [0..20,0..30] of integer;
sum: integer;

и еще

sum:=0;

Автор: neutrino 5.1.2003, 20:31
Привет!
Да, я может погорячился с константами. Напиши просто:
const n=25;
Удобно ими пользоваться, когда ты делаешь много обработок массива, т.к. если ты решил увеличить длину, просто изменяешь значение константы. А в третьей задаче, извиняюсь за неаккуратность: не объявил массив.

program Array;

const
 n = 20; //Количество строк
 m = 30; //Количество колонок
type
 TMyArray = array[0..n][0..m] of Byte; //Объявление типа двухмерного массива из байтов
var
 Sum, I, J: Integer;//Сумма и два счетчика по строкам и столбцам
 A: TMyArray; //Наш массив
begin
 Sum := 0; //Обнуляем сумму в начале
 for I := 0 to n do //Первый цикл по строкам, второй по столбцам
   for J := 0 to m do
     //Если элемент кратен 2-м (делится на 2 без остатка), добавить его в сумму.
     if A[I,J] mod 2 = 0 then Sum := Sum + A[I,J];
end.

Удачи!

2МММ: Тут не Delphi, а просто паскаль. как я понял.


Автор: neutrino 5.1.2003, 20:46
Цитата
чуть не забыл:
var
d[i,j]: array [0..20,0..30] of integer;
sum: integer;

и еще

sum:=0;

Так объявлять нельзя.
надо так:
var
 d: array [0..20,0..30] of integer;

Автор: Pusillanimous 5.1.2003, 22:10
МММ

Я только не понял что значит: memo2.lines.add(inttostr(c[i]))
Три недели за Паскалем только работаю, до этого пару раз пересекался, но так программировать и не научился. Вот, с помощью всеминого разума осваиваю пока только азы, самое основное. А токой строчки я не встречал. Можно разьяснить поконкретней, что она делает?

Автор: neutrino 5.1.2003, 22:23
Это вот как раз уже к Delphi относится. Не обращай внимания, пока.
Цитата

а насчет третьего, я не понял там нечетный элемент массива , то есть a[1,3]  или а[13, 7]

for i:=0 to 20 do
for j:=0 to 30 do
  if ((i mod 2)=0 ) and ((j mod 2)=0) then sum:=sum+d[i,j];

Так четные места, или сами значения массива? Я так понял, что значения. А если места, то нет смысла проверять. Просто начинаем цикл с 0 и увеличиваем на 2 каждый шаг.

Автор: Medved 6.1.2003, 01:36
Цитата

Привет!
Да, я может погорячился с константами. Напиши просто:
const n=25;
Удобно ими пользоваться, когда ты делаешь много обработок массива, т.к. если ты решил увеличить длину, просто изменяешь значение константы. А в третьей задаче, извиняюсь за неаккуратность: не объявил массив.

program Array;

const
n = 20; //Количество строк
m = 30; //Количество колонок
type
TMyArray = array[0..n][0..m] of Byte; //Объявление типа двухмерного массива из байтов
var


Да neutrino ты погорячился с константами, ни в Pascal ни в Delphi так объявлять массивы нельзя! Мы же уже обсуждали в этом топике эту тему, прочитай 2-3 страницу.


Автор: Pusillanimous 6.1.2003, 02:04
Pegas

Можно пояснить мои представления.Когда задается массив например целых чилел a(20,30) то это значит, что массив сожержит 20 строк и 30 столбцов (мысленно представляю таблицу Экселя). Т е объявляя массив  
d: array [0..20,0..30] of integer;

Я даю понять PC, что имеется некие ячейки данных в пределе этого объявленного массива. А как тогда PC заполняет эти ячейки? Т е изначально, я так понимаю, они пусты, нужно задать, какими числами массив заполнен. Вот в прирмерах выше массив заволняет Byte (да?), или я все не так понимаю. Т е хотелось бы вывести этот массив на экран, что бы видеть значения, корорые потом обрабатываются, как в третей задаче.
  Можно про это пояснить?

Автор: Black_Joker 6.1.2003, 04:19
Когда только объявляешь массив, т.е.
var d: array [] of

begin

Далеко не всегда он заполнен нулями, я сталкивался с тем, что там был всякий мусор, вписанный наусмотрение системы.
И еще, Sum, как переменную использовать не желательно, т.к. это функция из одного юнита (к сожаленю забыл из какого, но кажется что-то про массивы)

Автор: Pusillanimous 6.1.2003, 07:09
Итак. Вот три программы, ошибок при проверки нет, но меня волнует

не это. Хочу спросить, какой результат должен быть выведен на

экран, после завершения расчетов программы? Например в третей

программе он вывел 0. Так и должно быть, или чего-то получается?

Первая програма, по-моему работает корректно. Напомню, нужно

было  заполнить линейный массив целых чисел а(n) по правилу а[i]=b

* i!

Program massiv1;
const
n: Integer = 25;
type
TMyArray = array[0..25] of Byte;
var
Idx, b: Integer;
а: TMyArray;
begin
Writeln ('inter 1 element b=');
Readln (b);
for Idx := 0 to 25 do
a[idx]:=b*idx;
Writeln ('Reshenie=',a[idx]);
Readln;
end.

На счет второй программы я сомневаюсь, похоже, я тут что-то

напутал, т е не вижу результатов своих (и наших :)) трудов.  Замена

элементов в массиве.
В линейном массиве целых чисел d(25) заменить все элементы,

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

увидеть результат замены?

Program massiv2;
const
n: Integer = 25;
type
TMyArray = array[0..25] of Byte;
var
Idx, B: Integer;
d: TMyArray;
begin

for Idx := 0 to 24 do
 
  if d[Idx]<0 then d[idx]:=d[idx]*d[Idx];   //может лютче Sqr(d[idx])  ?
Writeln ('Reshenie=',d[idx]);
Redln;
end.


Ну и третья :) В конце традиционно выводит Reshenie=0  :(

program massiv3;
const
n = 20;
m = 30;
type
TMyArray = array[0..n,0..m] of Byte;
var
Sum,i,j : integer;
a: TMyArray;

Begin

Sum:=0;
for i:=0 to n do
for j:=0 to m do

if a[i,j] mod 2 =0 then sum:= sum+a[i,j];
Writeln ('Reshenie =' sum);
Readln;
end.

Так чего тут нуль всегда в ответе

Автор: Pusillanimous 6.1.2003, 07:13
Black_Joker

"И еще, Sum, как переменную использовать не желательно"

А что можно использовать в альтернативу? Неужели вручную 600 значений суммировать??? :)

Автор: Spawn 6.1.2003, 07:30
Цитата(Pusillanimous @ 05.1.2003, 23:09)
for Idx := 0 to 24 do
 
  if d[Idx]<0 then d[idx]:=d[idx]*d[Idx];   //может лютче Sqr(d[idx])  ?
Writeln ('Reshenie=',d[idx]);
Redln;
end.

Ты перед тем как проверять заполнял массив????? Если ты этого я не делал, то я думаю ни чего работать и не будет)) Ты сначала должен заполнить массив числами, например случаяными:

Randomize;
for Idx := 0 to 24 do
d[Idx]:=Random(-100-100);

То же самое можно сказать про третий массив.

Автор: Spawn 6.1.2003, 07:32
[quote=Spawn,05.1.2003,23:30][quote=Pusillanimous,05.1.2003,23:0]

"И еще, Sum, как переменную использовать не желательно"

А что можно использовать в альтернативу? Неужели вручную 600 значений суммировать??? :)quote]

Все что придет в голову, хоть abrakadabra  ))  Но лучше переменным давать осмысленные значения, иначе потом можно запутаться в них( особенно ели программа большая)

P.S. Только там есть пара исключений с которых не может начинаться переменная, например с цифры нельзя начинать ее обозначение, с таких знаков как !,",№,;,%,:,?,*(Такие занки и внутри переменной запрещены)  и т.д.

Автор: Pusillanimous 6.1.2003, 09:20
Цитата(Spawn @ 05.1.2003, 23:30)

"Ты перед тем как проверять заполнял массив?????"


Ну наконец, я дополз до этого! Конечно не заполнял. И откуда я знал, что они не заполнены?

Я уже спрашивал, но мой вопрос оставлен был без внимания:

"Можно пояснить мои представления.Когда задается массив например целых чилел a(20,30) то это значит, что массив сожержит 20 строк и 30 столбцов (мысленно представляю таблицу Экселя). Т е объявляя массив  
d: array [0..20,0..30] of integer;

Я даю понять PC, что имеется некие ячейки данных в пределе этого объявленного массива. А как тогда PC заполняет эти ячейки? Т е изначально, я так понимаю, они пусты, нужно задать, какими числами массив заполнен. Вот в прирмерах выше массив заволняет Byte (да?), или я все не так понимаю. Т е хотелось бы вывести этот массив на экран, что бы видеть значения, корорые потом обрабатываются, как в третей задаче.
 Можно про это пояснить? "


Читал про массивы я , конечно немного, страниц 5, но там не нашел, как их заполнять. Я подумал, объявление массива само собой подразумевает его заполнение, а byte значит, что он заполнен целыми числами. Теперь конечно я так не думаю. А можно про заполнение массива какую-нить ссылочку?


"Если ты этого я не делал, то я думаю ни чего работать и не будет)) Ты сначала должен заполнить массив числами, например случаяными:"
А как заполнить массив не случайными, а целыми :) [/B]

Автор: Pusillanimous 6.1.2003, 09:21
;-)

Автор: Pusillanimous 6.1.2003, 09:24
И откуда я знал, что они не заполнены?

Автор: Pusillanimous 6.1.2003, 09:34
Риторический вопрос, просьба не обращать внимания :)

Автор: Spawn 6.1.2003, 18:24
Цитата(Pusillanimous @ 06.1.2003, 01:20)
[quote=Spawn,05.1.2003,23:30][/quote]
"Ты перед тем как проверять заполнял массив?????"
А как заполнить массив не случайными, а целыми :) [/B]

Я уже приводил пример))):

Randomize;
for Idx := 0 to 24 do
d[Idx]:=Random(-100-100); //заполнение числами от -100 до 100

Поставь ето перед проверкой значений элементов массива.

Автор: neutrino 6.1.2003, 20:55
2Black_Joker: Если бы Sum была бы функцией, ей нельзя было присвоить значение, а значит, компилятор не дал бы сделать так. Так что Sum можно использовать свободно.

2Pegas: Посмотрел, оказывается я был прав. В Turbo Pascal можно объявлять тип констант:
Код

 CONST n : INTEGER = 10;



Автор: Spawn 6.1.2003, 21:38
Цитата(neutrino @ 06.1.2003, 12:55)
2Spawn: Если бы Sum была бы функцией, ей нельзя было присвоить значение, а значит, компилятор не дал бы сделать так. Так что Sum можно использовать свободно.

Вообще то про Sum не я писал)), а Black Joker. Я же просто разьяснил объявление переменных.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)