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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2010, 10:02   #1
Solnze2
Пользователь
 
Регистрация: 09.06.2010
Сообщений: 32
По умолчанию Указатели.Динамическая память

1) Заданы три натуральных числа А, В, С, которые обозначают число, месяц и год. Найти порядковый номер даты, начиная отсчет с начала года.
2) . Дано натуральное число N (N > 9). Определить сумму цифр в первой половине числа (старшие разряды). Пример. N = 12 345 678. Сумма составляет 1 + 2 + 3 + 4 = 10.
3) Дано целое n > 2. Напечатать все простые числа из диапазона [2, n].
4) Дано натуральное число N. Определить количество цифр в цифровой записи данного числа, которые имеют наименьшее значение. Пример. N = 4548. Количество цифр с наименьшим значением равно двум (две цифры 4).
5) Используя все цифры от 1 до 9 по одному разу и операции сложения и вычитания, получить в сумме 100, при условии, что цифры появляются в возрастающем или убывающем порядке.
Например,
123 + 4 - 5 + 67 - 89 = 100,
9 – 8 + 76 – 5 + 4 + 3 + 21 = 100.

Народ решите пожалуйста хотя бы 2-3 задачки.Очень надо отчёт сдать
Solnze2 вне форума Ответить с цитированием
Старый 11.06.2010, 10:51   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

первая задача:
Код:
const
   DaysInMonth: array[1..12] of Byte =
     (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

  {функция возращает високосный ли год }
  {*                    TPDATE.PAS 5.05                    *}
  {*        Copyright (c) TurboPower Software 1988.        *}
  function IsLeapYear(Year : Integer) : Boolean;
  begin
    IsLeapYear := (Year mod 4 = 0) and
                  ((Year mod 100 <> 0) or (Year mod 400 = 0));
  end;

var
  a,b,c : integer;
  i, Days, NNDay  : integer;
  

begin
  WriteLn;
  Write('VVedite datu v vide treh chisel (den` mesac god):');
  Readln(a,b,c);

  {проверка корректности введённой даты!}
  if (c<1700) or (c>3000) then 
  begin 
    WriteLn('Tokoy god nedopustim!');
    Halt(101)
  end;
  if (b<1) or (b>12) then 
  begin 
    WriteLn('Net takih mesacev v nashem kalendare!');
    Halt(102)
  end;

  Days := DaysInMonth[b] + ord((c mod 4 = 0) and (b = 2));
  if (a<1) or (a>Days) then 
  begin 
    WriteLn('V mesace ',b:1,' net stolko dney!');
    Halt(103)
  end;

  {подсчёт порядкового номера этой даты в году}
  NNDay := a;
  for i:=1 to (b-1) do 
    NNDay := NNDay + DaysInMonth[i] + ord((c mod 4 = 0) and (i = 2));


  {вывод результатов}
  WriteLn('Nomer dnya = ',NNDay:1);

  Readln;

end.
{если не нужно - проверку даты на допустимость можно выкинуть! 
    ну, только месяц проверять >1 и меньше-равно 12}
2-ю задачу легче всего решать через преобразование числа в строку (STR(..) )

3-я задача. буквально вчера/позавчера решение было на форуме. поищите.


А почему заголовок такой?! Где здесь "указатели"? Где - "Динамическая память" ?!

Последний раз редактировалось Serge_Bliznykov; 11.06.2010 в 18:38.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.06.2010, 11:39   #3
Solnze2
Пользователь
 
Регистрация: 09.06.2010
Сообщений: 32
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
первая задача:
Код:
const
   DaysInMonth: array[1..12] of Byte =
     (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

  {функция возращает високосный ли год }
  {*                    TPDATE.PAS 5.05                    *}
  {*        Copyright (c) TurboPower Software 1988.        *}
  function IsLeapYear(Year : Integer) : Boolean;
  begin
    IsLeapYear := (Year mod 4 = 0) and
                  ((Year mod 100 <> 0) or (Year mod 400 = 0));
  end;

var
  a,b,c : integer;
  i, Days, NNDay  : integer;
  

begin
  WriteLn;
  Write('VVedite datu v vide treh chisel (den` mesac god):');
  Readln(a,b,c);

  {проверка корректности введённой даты!}
  if (c<1700) or (c>3000) then 
  begin 
    WriteLn('Tokoy god nedopustim!');
    Halt(101)
  end;
  if (b<1) or (b>12) then 
  begin 
    WriteLn('Net takih mesacev v nashem kalendare!');
    Halt(102)
  end;
  if (b<1) or (b>12) then 
  begin 
    WriteLn('Net takih mesacev v nashem kalendare!');
    Halt(102)
  end;

  Days := DaysInMonth[b] + ord((c mod 4 = 0) and (b = 2));
  if (a<1) or (a>Days) then 
  begin 
    WriteLn('V mesace ',b:1,' net stolko dney!');
    Halt(103)
  end;

  {подсчёт порядкового номера этой даты в году}
  NNDay := a;
  for i:=1 to (b-1) do 
    NNDay := NNDay + DaysInMonth[i] + ord((c mod 4 = 0) and (i = 2));


  {вывод результатов}
  WriteLn('Nomer dnya = ',NNDay:1);

  Readln;

end.
{если не нужно - проверку даты на допустимость можно выкинуть! 
    ну, только месяц проверять >1 и меньше-равно 12}
2-ю задачу легче всего решать через преобразование числа в строку (STR(..) )

3-я задача. буквально вчера/позавчера решение было на форуме. поищите.


А почему заголовок такой?! Где здесь "указатели"? Где - "Динамическая память" ?!
Надо решить с помощью указателей.

Эта задача решается с помощью указателей.То есть используется такой ^.

Последний раз редактировалось Stilet; 11.06.2010 в 11:57.
Solnze2 вне форума Ответить с цитированием
Старый 11.06.2010, 14:40   #4
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Я нашёл решение третьей задачи на форуме, однако почему-то данное решение у меня не работает!
Я написал свою программку и, после пятнадцатиминутных мучений она заработала так как надо:
Код:
Uses CRT;
Function Prost(M:integer):boolean;
var i,x:integer;
begin
       x:=0;
       Prost:=True;
       for i:=2 to M-1 do
       if M mod i = 0 then x:=x+1;
       if x>0 then Prost:=False;
end;
var i,n:integer;
begin
       write('n = ');
       readln(n);
       for i:=2 to n do
       if Prost(i) = True then write(i,' ');
       readln;
end.
_-Re@l-_ вне форума Ответить с цитированием
Старый 11.06.2010, 21:51   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

_-Re@l-_
Вы уж не обижайтесь, но и пройти мимо такого я не могу!
Функция написано _крайне_ неоптимально!
1) зачем цикл крутить до M-1 когда достаточно до sqrt(M)
2) а уж зачем считать в X сколько делителей?! Как только же первый делитель встретили - всё, дальше можно не продолжать!
Представить, для числа 2000000 сколько выполнится лишних делений, наращиваний X ?!!

предлагаю такую функцию определения простоты числа:
Код:
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;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.06.2010, 09:05   #6
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

А почему именно до корня из x?
И ещё: я проверил вашу программу, ввёл 20000, и программа выводит все числа от 2 до 20000

Последний раз редактировалось _-Re@l-_; 12.06.2010 в 09:26.
_-Re@l-_ вне форума Ответить с цитированием
Старый 12.06.2010, 10:08   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
А почему именно до корня из x?
Это чистая математика, если число имеет делитель БОЛЬШЕ, чем корень из этого числа, значит есть делитель МЕНЬШЕ, чем корень из этого числа
Пусть есть число X
Тогда
X = SQRT(X) * SQRT(X)
и пусть имеются такие целые A и B, что X = A * B
очевидно, что если A > SQRT(X) Тогда B МЕНЬШЕ SQRT(X)
поэтому если мы не нашли делитель меньший корня из числа, то дальше уже можно не искать, его не будет!


Цитата:
И ещё: я проверил вашу программу, ввёл 20000
я не знаю, как и что Вы проверяли.
Всё РАБОТАЕТ!
На всякий случай, выкладываю ПОЛНЫЙ код:
Код:
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 i,n:longint;
  {лучше использовать тип LongInt
   а то integer d TurboPacal совсем уж маловместительный.. :) }
begin
       write('n = ');
       readln(n);
       for i:=2 to n do
         if isPrime(i) = True then write(i,' ');
       readln;
end.
надеюсь, скриншот работы выкладывать не надо?! поверите мне на слово?!

Последний раз редактировалось Serge_Bliznykov; 12.06.2010 в 10:17.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатели. Динамическая память. Kazik Помощь студентам 2 18.01.2014 00:17
Динамическая память MadDog__ Помощь студентам 2 22.11.2007 00:05