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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2012, 17:51   #1
Антонолол
 
Регистрация: 07.11.2012
Сообщений: 7
По умолчанию Одномерные массивы.

Добрый день. помогите решить.

Дан массив A(N). Если в массиве несколько минимальных элементов, то поменять местами элементы:1-N,2-N-1 и тд.

Заранее спасибо
Антонолол вне форума Ответить с цитированием
Старый 03.12.2012, 19:54   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Если в массиве несколько минимальных элементов
Неужели Вам задания так криво формулируют? Не может быть "несколько минимальных". Может быть - несколько элементов со значением, равным минимальному.

Ну начнем по порядку: что у Вас уже есть? Ввод массива хотя бы осилили?
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 03.12.2012 в 19:58.
Sciv вне форума Ответить с цитированием
Старый 05.12.2012, 08:32   #3
Антонолол
 
Регистрация: 07.11.2012
Сообщений: 7
По умолчанию

Получилось что то в этом роде. посмотрите, мб что не правильно


Код:
program zaz;
const n = 5;
var
  z, s, x: real;
  a: array[1..n] of real;
  i, y: integer;
begin
  for i := 1 to n do
    readln(a[i]);
  x := a[1];
  for i := 1 to n do
    if x > a[i] then
      x := a[i];
  for i := 1 to n do
    if x = a[i] then
      z := z + 1;
  if z > 1 then
    for i := 1 to n do
      for y := n downto 1 do begin
        s := a[i];
        a[i] := a[y];
        a[y] := s;
      end;
  for i := 1 to n do
    writeln(a[i]);
end.


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 05.12.2012 в 08:41.
Антонолол вне форума Ответить с цитированием
Старый 05.12.2012, 08:53   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1-х. форматируйте код. (я позволил себе отформатировать ваш код, пользуясь служебным положением, ибо читать плоскую простыню чрезвычайно неудобно)

2-х. Запомните правило, пригодится. Любая переменная, перед тем, как из неё прочитано значение должна быть проиницилизирована. Обязательно!
Поясню. Допустим, Вы дали Васе одно яблоко. Сколько яблок теперь у Васи?
Ответ: Сколько угодно, потому что Вы не знаете, сколько у него яблок было изначально!

Вы забыли проиницилизровать переменную z
Код:
  for i := 1 to n do
    if x > a[i] then
      x := a[i];
  z := 0;
  for i := 1 to n do
    if x = a[i] then
      z := z + 1;
ну и последнее.
Цитата:
то поменять местами элементы:1-N,2-N-1 и тд.
лучше бы вы написали так:
1 <-> N
2 <-> N-1
и т.д.
т.е поменять нужно 1-й с последним, 2-й с предпоследним и т.д.

в вашей программе, имхо, меняется не так!
я бы предложил такой вариант:
Код:
  if z > 1 then
    for i := 1 to n div 2 do begin
        s := a[i];
        a[i] := a[n-i+1];
        a[n-i+1] := s;
      end;

  for i := 1 to n do
    write(a[i]:0:2,' ');
  WriteLn;
  Readln
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.12.2012, 09:06   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Неправильно. Ввод-вывод замечательно, но вот двойной цикл тут не только лишний - он вообще не решает поставленной задачи.

Поскольку операция полностью симметрична относительно середины массива - не надо проходить цикл от 1 до n, достаточно от 1 до n div 2. Второй вложенный цикл убираем совсем, как я сказал выше - с его помощью Вы не меняете элементы, а "протаскиваете" их через весь массив.
И еще - переменная z нигде не инициализируется.

Позволил себе несколько подредактировать код:

Код:
program zaz;
const n=5;
var
z,s,x:real;
a:array[1..n] of real;
i,y:integer;
begin
  for i:=1 to n do readln (a[i]);
  x:=a[1];
  for i:=1 to n do
    if x>a[i] then
      x:=a[i];
  z:=0;
  for i:=1 to n do
    if x=a[i] then
      z:=z+1;
  y:=n;
  if z>1 then
    for i:=1 to (n div 2) do begin
        s:=a[i];
        a[i]:=a[y];
        a[y]:=s;
        y:=y-1;
      end;
for i:=1 to n do writeln(a[i]);
end.
Вот так считает правильно, и работает как при четном, так и при нечетном n.

Еще замечу, что в данном случае не обязательно искать минимум отдельным циклом - достаточно его просто при вводе вычислять. Примерно так (используя Ваш код):

Код:
  readln(a[1]);
  x:=a[1];
  for i:=2 to n do begin
    readln (a[i]);
    if x>a[i] then x:=a[i];
  end;
Ну и итоговая программа:

Код:
program zaz;
const n=5;
var
z,s,x:real;
a:array[1..n] of real;
i,y:integer;
begin
  readln(a[1]);
  x:=a[1];
  for i:=2 to n do begin
    readln (a[i]);
    if x>a[i] then x:=a[i];
  end;
  z:=0;
  for i:=1 to n do
    if x=a[i] then
      z:=z+1;
  y:=n;
  if z>1 then
    for i:=1 to (n div 2) do begin
        s:=a[i];
        a[i]:=a[y];
        a[y]:=s;
        y:=y-1;
      end;
for i:=1 to n do writeln(a[i]);
end.
Ну и на будущее - пользуйтесь процедурами и функциями, это намного удобней. Например, этот код можно задать в таком виде:

Код:
program zaz;

const n=5;

type TArray=array [1..n] of real;

var min_a,s:real;
    a:TArray;
    i,y:integer;

Function InputArray(var m: TArray): real;
var j: integer;
    x: real;
begin
  readln(m[1]);
  x:=m[1];
  for j:=2 to n do begin
    readln (m[j]);
    if x>m[j] then x:=m[j];
  end;
  InputArray:=x;
end;

Function MinQuant(m: TArray;min: real): integer;
var j: integer;
    z: integer;
begin
  z:=0;
  for j:=1 to n do
    if min=m[j] then
      z:=z+1;
  MinQuant:=z;
end;

begin
  min_a:=InputArray(a);
  y:=n;
  if MinQuant(a,min_a)>1 then
    for i:=1 to (n div 2) do begin
        s:=a[i];
        a[i]:=a[y];
        a[y]:=s;
        y:=y-1;
      end;
for i:=1 to n do writeln(a[i]);
end.

UPDATE Чтоб не было непонимания - Сергей, мое "неправильно" обращено топикстартеру
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 05.12.2012, 18:25   #6
Антонолол
 
Регистрация: 07.11.2012
Сообщений: 7
По умолчанию

Спасибо большое, понял свои ошибки) буду исправляться)
Антонолол вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одномерные массивы, двумерные массивы, строки Sand093 C++ Builder 11 20.05.2012 21:48
одномерные массивы repchic Общие вопросы C/C++ 2 17.12.2011 23:17
Одномерные массивы kazzz Помощь студентам 5 18.11.2010 13:16
Одномерные массивы maloy-rom Общие вопросы C/C++ 11 23.12.2009 18:47
Даны одномерные массивы А и В. Сформировать массивы, состоящие из элемент LyaLya Помощь студентам 15 20.12.2009 14:12