Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Разное

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Задача на Паскале
 
 автор: Mookapek   (17.12.2007 в 23:47)   письмо автору
 
 

Здравствуйте!
Помогите, пожалуйста решить такую задачу на Паскале:
В одномерном массиве, состоящем из N целочисленных элементов, вычислить:
1. Минимальный по модулю элемент массива.
2. Сумму модулей элементов массива, расположенных после первого элемента, равного нулю.
Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в четных позициях, а во второй половине - элементы, стоявшие в нечетных позициях.

P.S. я в Паскале слаб, поэтому надеюсь на вашу помощь.

   
 
 автор: cheops   (18.12.2007 в 00:30)   письмо автору
 
   для: Mookapek   (17.12.2007 в 23:47)
 

1) Эту задачу можно решить следующим образом
program minabs;
Uses Crt;
Var
   InpValue, i, MinValue, MaxValue :Integer;
   A :Array[1..50] of Integer;
begin
   Write('Введите целое число N (0 < N < 51) ');
   Readln(InpValue);
   if InpValue < 0 then InpValue := 1;
   if InpValue > 50 then InpValue := 50;
   for i:=1 to InpValue do
   begin
     Write('Введите значение (', i, '): ');
     Readln(A[i]);
   end;
   MinValue := abs(A[i]);
   for i:=1 to InpValue do
   begin
     if MinValue > abs(A[i]) then MinValue := abs(A[i]);
   end;
   WriteLn('Результат: ', MinValue);
end.

   
 
 автор: Mookapek   (18.12.2007 в 00:32)   письмо автору
 
   для: cheops   (18.12.2007 в 00:30)
 

Большое спасибо Вам! Очень выручили!

   
 
 автор: Mookapek   (18.12.2007 в 00:44)   письмо автору
 
   для: cheops   (18.12.2007 в 00:30)
 

а почему здесь вводится ограничение именно на 50 элементов массива?

   
 
 автор: cheops   (18.12.2007 в 00:51)   письмо автору
 
   для: Mookapek   (18.12.2007 в 00:44)
 

Поставьте 100, если мало, я если честно смутно помню как на Pascal выделять динамический объём памяти...

   
 
 автор: Mookapek   (18.12.2007 в 01:05)   письмо автору
 
   для: cheops   (18.12.2007 в 00:51)
 

А можно объявить массив так:
A :array[1..N] of Integer;

?

   
 
 автор: Trianon   (18.12.2007 в 01:26)   письмо автору
 
   для: Mookapek   (18.12.2007 в 01:05)
 

только если N уже имеет значение к этому моменту. Да и то не во всех диалектах.

   
 
 автор: sim5   (18.12.2007 в 01:50)   письмо автору
 
   для: Mookapek   (18.12.2007 в 01:05)
 

В Delphi так, Pascal не помню :)

//объявили ссылку на область памяти
var A:array of real;
//создали массив состоящий из 25 элементов начиная с 0
SetLength(A,25);
//а для определения верхний границы используем функцию Hihg
I:=High(A);
//I - верхняя граница. Определения длины Length(A), 
//определения нижней границы Low(A). 
//при нулевой длине массива High, возращает -1. 
//Пример:
var
a,b: array of integer;
begin
  SetLength(a,2);
  SetLength(b,2);
  a[0]:=2;
  b[0]:=3;
  a:=b;
  b[0]:=4;
end;

   
 
 автор: Mookapek   (18.12.2007 в 01:02)   письмо автору
 
   для: cheops   (18.12.2007 в 00:30)
 

2) Вот вторую часть попробовал написать:

var summ: integer;
...
...
for i:=1 to InpValue do
begin
if A[i]:=0 then begin k:=i; break; end;
end;

summ:=0;
for k to InpValue do 
begin
summ:=summ+abs(A[k]);
end;

WriteLn('Сумма=', summ);


Правильно или нет?

   
 
 автор: kasmanaft   (18.12.2007 в 08:12)   письмо автору
 
   для: Mookapek   (18.12.2007 в 01:02)
 

>> if A[i]:=0 then begin k:=i; break; end;

Исправьте на if A[i] = 0.. Ну и логичнее было бы k присваивать i+1 - хотя тут в результате из-за нуля разницы не будет.

   
 
 автор: Mookapek   (18.12.2007 в 19:05)   письмо автору
 
   для: kasmanaft   (18.12.2007 в 08:12)
 

Да, конечно A[i] = 0, а не ":=". ":=" - это же операция присваивания, а не сравнения.

   
 
 автор: Mookapek   (18.12.2007 в 19:45)   письмо автору
 
   для: cheops   (18.12.2007 в 00:30)
 

А здесь по-моему в девятой строке надо писать if InpValue < 1... Или нет?

   
 
 автор: Mookapek   (18.12.2007 в 19:20)   письмо автору
 
   для: Mookapek   (17.12.2007 в 23:47)
 

Ну вот, осталась последняя часть:
"Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в четных позициях, а во второй половине - элементы, стоявшие в нечетных позициях."
Как я понимаю, позиция - это индекс массива имеется в виду? Если нет, то поправьте.
Вот, чтоя попытался сделать, но кажется, что неправильно:
array: B[1..50] of Integer;
...
...
{Третья часть}
m:=1;
for  i:=1 to InpValue do
begin
  if (i/2)=0 then begin B[m]=A[i]; m:=m+1; end;
end;

for  i:=1 to InpValue do
begin
  if (i/2)!=0 then begin B[m]=A[i]; m:=m+1; end;
end;

   
 
 автор: kasmanaft   (18.12.2007 в 19:58)   письмо автору
 
   для: Mookapek   (18.12.2007 в 19:20)
 

Если можно завести еще один массив - тогда можно и так.
Только (i/2) замените на "i mod 2", а != на <>

>> А здесь по-моему в девятой строке надо писать if InpValue < 1... Или нет?
Да, точно..

   
 
 автор: Mookapek   (18.12.2007 в 20:07)   письмо автору
 
   для: kasmanaft   (18.12.2007 в 19:58)
 

А как можно реализовать задачу без дополнительного массива?

   
 
 автор: Mookapek   (18.12.2007 в 21:57)   письмо автору
 
   для: Mookapek   (18.12.2007 в 20:07)
 

Помогите кто-нибудь, пожалуйста!

   
 
 автор: Mookapek   (19.12.2007 в 19:28)   письмо автору
 
   для: Mookapek   (18.12.2007 в 21:57)
 

.

   
 
 автор: Mookapek   (20.12.2007 в 00:55)   письмо автору
 
   для: Mookapek   (18.12.2007 в 19:20)
 

Вот сколько уже пытаюсь, а без дополнительного массива никак не получается третью часть сделать :(
Форумчане, помогите!

   
 
 автор: ddhvvn   (20.12.2007 в 11:00)   письмо автору
 
   для: Mookapek   (20.12.2007 в 00:55)
 

Я думаю тут несколько вариантов, но мне приходит пока только один:
Увеличить размер массива, четные элементы добавлять с позиции 51...75, а нечетные 76...100, потом удалить элементы 0...50 (51..100 переместить в начало)

   
 
 автор: Trianon   (20.12.2007 в 22:21)   письмо автору
 
   для: ddhvvn   (20.12.2007 в 11:00)
 

увеличить размер смассива или воспользоваться дополнительным - разница невелика

   
 
 автор: Mookapek   (20.12.2007 в 22:41)   письмо автору
 
   для: Trianon   (20.12.2007 в 22:21)
 

А все! Прокатило с дополнительным массивом :-) А с одним массивом, наверное надо использовать временную переменную и вложенный цикл. Но конкретно не знаю.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования