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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 12.12.2012, 00:01   #1
TRANE82
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 10
По умолчанию задача со строками

Задан одномерный массив , каждым элементом которого является строка символов ,
состоящая из одних цифр. Упорядочить элементы массива по убыванию их числовых значений и
вывести на экран . Подсчитать среднее значение всех элементов.
TRANE82 вне форума
Старый 12.12.2012, 05:48   #2
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Упорядочить - нет проблем. Можно применить любой метод, начиная с "пузырька". Условие применяется непосредственно к строками:
Код:
  if s[i]<s[j] then <переставить элементы>
А вот подсчитать среднее - это уже совсем другой вопрос.. Хорошо, если длина строк не более той, которая влезает в целый (или LongInt, или Int64..) тип. Но это совсем не так много (примерно 19 знаков для Int64). А в задаче говорится про строки, длина которых может достигать 255 символов. Для подсчета среднего строк в 20 и более символов придется писать длинную арифметику.
Предпочитаю на "ты".
TinMan вне форума
Старый 12.12.2012, 09:38   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от TinMan
Код:
if s[i]<s[j] then <переставить элементы>
к сожалению, это неверно.

В задании чётко оговорен это момент:
Цитата:
по убыванию их числовых значений
но это просто:
взять функцию StrToInt (или, если речь идёт о обычном TurboPascal, то такую функцию написать несложно:
Код:
function StrToInt(s : string):longint;
var x : longint;
    i : integer;
begin
  val(s, x, i);
  StrToInt := x;
end;
ну и дальше по тексту:
Код:
  if StrToInt( s[i] ) < StrToInt( s[j] ) then <переставить элементы>
Serge_Bliznykov вне форума
Старый 12.12.2012, 10:28   #4
TRANE82
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 10
По умолчанию

Я все сделал) Спасибо всем)
Код:
program Ex_2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
  N=14;
var
  s:array [1..N] of string;
  j,i:Integer;
  per:string;


begin
Writeln('Zapolnite massiv kak skazano v zadanii: ');

for i:=1 to N do
begin
write(i,' element: ');
Readln(s[i]);
end;




for i:=1 to N do
for j:=1 to N do
begin
if StrToInt(s[i])< StrToInt(s[j]) then
begin
per:=s[i];
s[i]:=s[j];
s[j]:=per;
end;
end;


Writeln;
Writeln('Otsortirovsnnuy msssiv:');
for i:=1 to N do
begin
write(s[i],' ');
end;

Readln;
end.
TRANE82 вне форума
Старый 12.12.2012, 10:30   #5
TRANE82
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 10
По умолчанию

Среднее значение я знаю как посчитать))
TRANE82 вне форума
Старый 12.12.2012, 10:31   #6
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

а если строка длиной over200 символов и не влезет в Longint или в любой другой из числовых типов?
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума
Старый 12.12.2012, 11:12   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

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

Код:
for i:=1 to N-1 do
for j:= i+1 to N do
begin
if StrToInt(s[i])< StrToInt(s[j]) then
  begin
     per:=s[i];
     s[i]:=s[j];
     s[j]:=per;
   end;
end;


Цитата:
Сообщение от Mad_Cat
а если строка длиной over200 символов и не влезет в Longint или в любой другой из числовых типов?
тогда StrToInt выдаст ошибку и данный код работать не будет.
Но, когда задание не говорит об этом прямо, то программист сам выбирает для себя ограничения. Зачем плодить трудности там, где они не предусмотрены? (это такая "презумпция невиновности" для программистов ) В этом случае можно легко написать функцию сравнения числовых значений строк (вне зависимости от длины, которая, кстати, будет работать для больших чисел быстрее, чем двойной StrToInt
Точно так же программа не будет работать, если, например, число строк N будет более 700 000 000... и что? Стоит об этом задуматься сейчас, на этапе решения простой УЧЕБНОЙ задачи?
Serge_Bliznykov вне форума
Старый 12.12.2012, 21:41   #8
TRANE82
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 10
По умолчанию

Эту работу я сдал) Все нормально)
TRANE82 вне форума
Старый 13.12.2012, 07:05   #9
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Серж, спасибо за поправку )). И откуда у меня только было это стойкое ощущение, что в Паскале строки сравниваются сначала по длине, а потом уже лексикографически? Странно.. ))
Но все же я не стал бы тут жертвовать длиной (даже если она не нужна такая большая). Достаточно добавить в условие проверку длины:
Код:
  if (Length(s[i])<Length(s[j])) or (Length(s[i])=Length(s[j])) and (s[i]<s[j]) then
    <переставить элементы>
Если условием задачи допускаются впередиидущие нули, то их надо предварительно удалить (либо учесть каким-то другим образом).
Впрочем, думаю, нечто подобное ты имел в виду под этим:
Цитата:
В этом случае можно легко написать функцию сравнения числовых значений строк (вне зависимости от длины, которая, кстати, будет работать для больших чисел быстрее, чем двойной StrToInt
Короче, извиняюсь, как за дезу, так и за запоздалый базар )).
Предпочитаю на "ты".
TinMan вне форума
Старый 13.12.2012, 09:53   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

TinMan, согласен. всё так.

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

Посему, закрываю её.

Всем спасибо, все свободны...
Serge_Bliznykov вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача со строками.си. nexez Помощь студентам 1 16.12.2011 23:29
задача со строками investr Паскаль, Turbo Pascal, PascalABC.NET 0 15.12.2011 00:18
Задача со строками! gylayko Помощь студентам 8 24.11.2011 13:16
Задача со строками. (C++) malisheshka Помощь студентам 6 22.11.2011 23:25