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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2014, 15:47   #1
Костяхалк
Пользователь
 
Регистрация: 22.01.2014
Сообщений: 21
По умолчанию создание програмы на делфи циклы:ввести натуральное число и определять, можно ли число представить в виде суммы двух простых чисел

1. Разработать приложение «Разложение на простые слагаемые».
Приложение должно позволять пользователю ввести натуральное число и определять, можно ли данное число представить в виде суммы двух слагаемых, каждое из которых является простым числом.
Определение возможности представления числа в виде суммы двух простых слагаемых должно быть реализовано в потоке.
Результаты («да» или «нет» и, слагаемые – для случая «да») должны выводиться в поле Memo.
Костяхалк вне форума Ответить с цитированием
Старый 22.01.2014, 16:55   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Костяхалк Посмотреть сообщение
благодорю))) давайте со второй разберемся
Пожалуйста!

А со второй тоже всё просто (если не брать во внимание реализацию в потоке)...

Без потока.
берём функцию проверки числа на простоту
(например, вот эту:
Код:
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;
пишем цикл от 2 до N-2 и в нём проверяем оба слагаемых на простоту.
если да - прерываем цикл и выходим. Нет - значит не вышло:

Код:
isFound := false;
i:=2;
while i<=(N-2) and Not isFound do 
   if  isPrime(i) and isPrime(N-i) then isFound := true
   else Inc(i);
 
if isFound then Memo1.Append('ДА') else Memo1.Append('НЕТ!')
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.01.2014, 17:56   #3
Костяхалк
Пользователь
 
Регистрация: 22.01.2014
Сообщений: 21
По умолчанию

грусть печаль

Последний раз редактировалось Костяхалк; 22.01.2014 в 18:04.
Костяхалк вне форума Ответить с цитированием
Старый 22.01.2014, 18:03   #4
Костяхалк
Пользователь
 
Регистрация: 22.01.2014
Сообщений: 21
По умолчанию

мне кажеца что я совсем потеряный человек . и тупо не выходит подобное
Вложения
Тип файла: zip Архив ZIP - WinRAR.zip (428.5 Кб, 12 просмотров)
Костяхалк вне форума Ответить с цитированием
Старый 22.01.2014, 18:21   #5
Костяхалк
Пользователь
 
Регистрация: 22.01.2014
Сообщений: 21
По умолчанию

ссори м
Костяхалк вне форума Ответить с цитированием
Старый 22.01.2014, 18:22   #6
Костяхалк
Пользователь
 
Регистрация: 22.01.2014
Сообщений: 21
По умолчанию

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TfrmMain = class(TForm)
memResults: TMemo;
btnOk: TButton;
edNum: TEdit;
edNum2: TEdit;
lbNum: TLabel;
procedure btnOkClick(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

TmyTread = class(TThread) // описание типа потока
private
// переменные, которые нужны потоку для работы
number: cardinal; // исходное число (задается из основного потока при запуске текущего потока)
number2: cardinal;
result: string; // результат, сформированный в формате строки

// процедура обращения к визуальному компоненту (Memo)
procedure WriteRes;
{ Private declarations }
protected
procedure Execute; override;
end;


var
frmMain: TfrmMain;

implementation



{$R *.dfm}

procedure TfrmMain.btnOkClick(Sender: TObject);
var s: string; // вспомогательная строковая переменная
s2: string;
num: cardinal; // введенное пользователем число
num2: cardinal;
cod: integer; // код преобразования строка -> число
cod2: integer;

Thr: TmyTread; // переменная типа "поток TmyThread"

begin
s:=edNum.Text; // "считываем" введенное пользователем значение
s2:= edNum2.Text;
val(s,num,cod); // пытаемся преобразовать считанный текст в число
val(s2,num2,cod2);
if (cod<>0) OR (num=0)
then // если преобразовать введенное пользователем значение в целое число не удалось или пользователь ввел ноль
begin
memResults.Lines.Add(s+' - некорректное значение'); // добавляем запись в Memo
edNum.clear; // выделяем введенное пользователем значение
edNum.SetFocus; // устанавливаем фокус в поле для ввода исходного числа
exit; // выходим из процедуры обработки события
end;

// если пользователь ввел корректное данное
edNum.Clear; // очищаем поле ввода
edNum.SetFocus; // устанавливаем в него фокус

edNum2.Clear; // очищаем поле ввода
edNum2.SetFocus;

Thr := TmyTread.Create(True); // вызываем конструктор (метод Create) для нашего потока, т.е. создает новый поток
Thr.FreeOnTerminate := True; // устанавливаем свойство FreeOnTerminate в true (когда поток будет завершен, он освободит ресурсы)
Thr.number:=num; // передаем число
Thr.number2:=num2;
Thr.Resume; // запускаем поток

end;

procedure TmyTread.Execute;
var i,count: cardinal;
begin
{
count:=2; // у любого числа (кроме единицы) есть два делителя: единица и оно само
for i:=2 to number-1 do
if number mod i =0 // если заданное пользователем число без остатка делится на i
then inc(count); // мы нашли еще один делитель, поэтому увеличиваем количество делителей.
str(count,result); // преобразуем полученное кол-во делителей в строковый тип
// sleep(50); // задержка (не нужна для вычислений, используется толко для демонстрации
}

while (number<>0) and (number2<>0) do
if number2>number
then number2:=number2 mod number;
else number:=number mod number2;
if number2=0
then count:=number;
else count:=number2;

str(count,result);

Synchronize(WriteRes);
end;

procedure TmyTread.WriteRes;
begin
frmMain.memResults.lines.add('исход ные числа: ' + IntToStr(number)+ ' , ' + IntToStr(number2)+ '; НОД:'+ result + ' .');
end;


end.
Костяхалк вне форума Ответить с цитированием
Старый 22.01.2014, 18:22   #7
Костяхалк
Пользователь
 
Регистрация: 22.01.2014
Сообщений: 21
По умолчанию

как сделать чтоб это работало?
Костяхалк вне форума Ответить с цитированием
Старый 22.01.2014, 18:55   #8
Костяхалк
Пользователь
 
Регистрация: 22.01.2014
Сообщений: 21
По умолчанию

вот что получаеца
Изображения
Тип файла: jpg Новый точечный рисунок.jpg (123.8 Кб, 126 просмотров)
Костяхалк вне форума Ответить с цитированием
Старый 22.01.2014, 23:39   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
if number2>number 
 then number2:=number2 mod number; 
 else number:=number mod number2;
 if number2=0 
 then count:=number; 
 else count:=number2;
как минимум, нужно везде перед ELSE удалить точку с запятой (для примера я пометил красным).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.01.2014, 01:05   #10
Костяхалк
Пользователь
 
Регистрация: 22.01.2014
Сообщений: 21
По умолчанию

unit1.pas(109,24) Error: Incompatible type for arg no. 1: Got "untyped", expected "<procedure variable type of procedure of object;Register>"
Synchronize(WriteRes);
ошибка
Костяхалк вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ЦИКЛЫ (паскаль) - представить N в виде суммы факториалов натуральных чисел, содержащей наименьшее число слагаемых Katya20 Помощь студентам 7 09.01.2012 01:21
Можно ли число N представить в виде сумы двух квадратов натуральных чисел? Dima170792 Помощь студентам 2 24.06.2011 08:53
всякое целое число можно представить в виде трех простых stasey91 Помощь студентам 3 14.04.2011 21:44
Дано натуральное число n. Можно ли представить его в виде суммы двух квадратов натуральных чисел? Сеня Помощь студентам 3 29.01.2009 01:17