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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2012, 20:05   #1
radich
Новичок
Джуниор
 
Регистрация: 24.11.2012
Сообщений: 3
По умолчанию Работа с файлами (Паскаль)

Здравствуйте. Помогите,пожалуйста, с решением 5 задач. Вообще плохо понимаю этот язык.

1.дан текст в котором слова отделяются пробелами,в конце стоит точка.определить кол-во слов в тексте и найти среднюю длину слова
2.с клавиатуры вводится целое число,которое имеет четное кол-во цифр не менее 50. найти средние цифры числа и переставить их местами
3.дан натуральный отрезок чисел [А,B]. найти те числа этого отрезка,которые в своей записи имеют только четные цифры. проверку, имеет ли данное число в своей записи только четные цифры,сделать с помощью логической функции пользователя
4.даны три числа,могут ли эти числа быть стороными треугольника. если треугольник существует,то вычислить длины высот этого треугольника.вычисление длины высоты треугольника оформить в виде функции пользователя
5.даны 2 целых числа. определить с помощью логической функции пользователя простые эти числа или нет
Заранее спасибо!

Последний раз редактировалось radich; 24.11.2012 в 21:04. Причина: Нужно удалить сообщение из этого раздела
radich вне форума Ответить с цитированием
Старый 24.11.2012, 21:53   #2
Nik Raider
Пользователь
 
Регистрация: 03.02.2012
Сообщений: 14
По умолчанию

Цитата:
Здравствуйте. Помогите,пожалуйста, с решением 5 задач. Вообще плохо понимаю этот язык.
Помочь многие рады, но есть ли смысл оказывать медвежью услугу? Будьте добры показать свои попытки решения и Вас поправят, направят, на крайний случай допишут. Какой смысл будет от того, что напишут кучу Вам непонятных строк?
Nik Raider вне форума Ответить с цитированием
Старый 24.11.2012, 23:17   #3
radich
Новичок
Джуниор
 
Регистрация: 24.11.2012
Сообщений: 3
По умолчанию

Кто захочет, тот разберется в каждой непонятной букве. Литературы валом, но легче разобраться на примере. Если есть возможность - поделись,пожалуйста,примитивным примером, от которого можно плясать. Буду благодарен
radich вне форума Ответить с цитированием
Старый 25.11.2012, 02:07   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Кто захочет, тот разберется в каждой непонятной букве. Литературы валом, но легче разобраться на примере.
Ладно. Попробуем.

Задача №5
Код:
program TestPrim;

function isPrime(X: LongInt): boolean;
var i: integer;
Begin
     isPrime:=false;
     if x<2 then Exit;
     if not odd(x) and (x<>2) { проверяем на чётность  }
          then exit;
     i:=3;
     while i <= sqrt(x) do { проверяем только нечётные }
     begin
          if x mod i = 0 then Exit;
          inc(i,2);
     end;
     isPrime:=true;
End;

var
  A,B : longint;
begin
  WriteLn('Введите два целых числа для проверки на простоту: ');
  Readln(A,B);
  if isPrime(A) then
      WriteLn('Первое число простое')
  else
      WriteLn('Первое число не простое');

  if isPrime(B) then
      WriteLn('Второе число простое')
  else
      WriteLn('Второе число не простое');

  WriteLn('Программа закончила работу.');
  Readln;
end.
не понятно, какое отношение название темы имеет к задачам!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.11.2012, 13:18   #5
radich
Новичок
Джуниор
 
Регистрация: 24.11.2012
Сообщений: 3
По умолчанию

Спасибо большое!!!
radich вне форума Ответить с цитированием
Старый 26.11.2012, 15:28   #6
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Опять же, всё написанное далее возможно является ложья, так что ...
Цитата:
while i <= sqrt(x) do
1) Т.к. в while условие выхода из цикла, проверяются при каждой итерацие, и sqrt (x) будет высщитан много раз (возможно i/2) так что можно завести переменную, туда один единственный раз посчитать sqrt(x) и уже баловаться её (переменной в цикле).
Можно этого и не делать (как говорится на спичках не экономят), но если вдруг данный алгоритм будет использоваться в других алгоритмах (например являются 1000000 введеных чисел простыми), то эта эффективность будет хоть чуть-чуть но заметна (даже если 0,01 секунды).

2) Опятьже
Цитата:
while i <= sqrt(x) do
как уже писал TinMan, то в какой-то момент времени, sqrt(49) (например) может быть равен не 7, а 6, (9). А при в цикле, мы дойдем до 7, отбросим наши цифирки после запятой, и получим 7 <= 6, нас не пусят в тушку цикла, и придется вывести что число 49 - простое.

Подчеркиваю, это всё мои догадки, предположения, домыслы, которые могут оказаться не TRUE
Poma][a вне форума Ответить с цитированием
Старый 26.11.2012, 15:56   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
sqrt(49) (например) может быть равен не 7, а 6, (9)
Вполне возможно, но чуть подправив избежим такой участи
Код:
while i <= sqrt(x)+0.1
или чтобы наверняка
Код:
while i*i <= x
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.11.2012 в 16:04.
Аватар вне форума Ответить с цитированием
Старый 26.11.2012, 16:10   #8
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
чуть подправив избежим такой участи
Хитро
Но на проверке 100000000 числе на простоту, придется за кофем в ларек бежать, а можно один разик Round'нуть
Poma][a вне форума Ответить с цитированием
Старый 26.11.2012, 16:20   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Сто миллионов маловато, а вот для пары миллиардов можно и поспать Нужно проверить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.11.2012, 16:23   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Poma][a, согласен с обоими замечаниями.

по первому.
Действительно, функция sqrt(x) будет вызываться многократно (я проверил, это так!), примерно (в худшем случае) (sqrt(x) div 2) раз.
И, хотя это может влиять только на быстродействие, тем не менее, согласен, лучше заменить вычисление этой функции переменной, вычисленной один раз до цикла.

по поводу второго замечания.
теоретически, то, что Вы говорите, практически - не подверждается.

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

вот, прошу оценить:
Код:
program PrimeNumbers;
{$APPTYPE CONSOLE}
uses SysUtils, Windows;

function isPrime(X: LongInt): boolean;
var i: integer;
Begin
     isPrime:=false;
     if x<2 then Exit;
     if not odd(x) and (x<>2) { проверяем на чётность  }
          then exit;
     i:=3;
     while i <= sqrt(x) do { проверяем только нечётные }
     begin
          if x mod i = 0 then Exit;
          inc(i,2);
     end;
     isPrime:=true;
End;

function isPrimeEx(X: LongInt): boolean;
var i, HighBound: integer;
Begin
     isPrimeEx:=false;
     if x<2 then Exit;
     if not odd(x) and (x<>2) { проверяем на чётность  }
          then exit;
     i:=3;
     HighBound := trunc(sqrt(x))+1;
     while i <= HighBound do { проверяем только нечётные }
     begin
          if x mod i = 0 then Exit;
          inc(i,2);
     end;
     isPrimeEx := true;
End;


var i, cnt1, cnt2 : longint;
  wTick1, wTick2 : Dword;
begin
  wTick1 := GetTickCount();
  cnt1 := 0;
  for i:=1 to 1000000 do
    if isPrime(i) then Inc(cnt1);
  wTick2 := GetTickCount();

  WriteLn('First variant found ', cnt1,' prime numbers for ',
                  (wTick2-wTick1)/1000:0:1,' seconds ');

  wTick1 := GetTickCount();
  cnt2 := 0;
  for i:=1 to 1000000 do
    if isPrimeEx(i) then Inc(cnt2);
  wTick2 := GetTickCount();

  WriteLn('Second variant found ', cnt2,' prime numbers for ',
                   (wTick2-wTick1)/1000:0:1,' seconds ');

  Readln
end.
результат на моём достаточно стареньком компьютере (специально проверил на предложенном вами диапазоне - от 1 до 1000000 подсчитал количество простых чисел ):
Цитата:
Код:
First variant found 78498 prime numbers for 0.4 seconds
Second variant found 78498 prime numbers for 0.1 seconds

p.s. если нужно найти все простые числа, то предложенный метод перебора использовать крайне неэффективно и непродуктивно!!!
давно уже известны нормальные эффективные способы поиска множества простых чисел.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с Файлами (паскаль) Anny_Apple Помощь студентам 1 29.05.2011 14:05
Работа с файлами (паскаль) street_spirit Помощь студентам 2 24.11.2010 15:40
Работа с файлами (паскаль) patisson74 Помощь студентам 1 15.04.2010 01:18
работа с файлами в паскаль... Оксаночка:) Помощь студентам 1 19.06.2009 09:59
работа с файлами(паскаль) WF7 Паскаль, Turbo Pascal, PascalABC.NET 2 03.06.2009 16:02