Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi] Циклы, Число Амстронга и последовательность 
V
    Опции темы
krendel
Дата 13.11.2006, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.11.2006

Репутация: нет
Всего: нет



Уже две недели все думаю и думаю и не могу сделать программу по следующей поставленной задачи:
1)Определить является ли введенное число числом Амстронга.Число Амстронга можно представить так: 153=1(в 3 степени)+5(в 3 степени)+3(в 3 степени)..
И вот второй вопрос, который также никак не могу сообразить как это организовать..
2)В последовательности целых чисел найти количество максимальных чисел этой последовательности..

PM MAIL   Вверх
anwe
Дата 13.11.2006, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 9
Всего: 23



Деля на сотни, десятки, единицы, получишь разложение.
На твоем примере:
153/100-> 1 сотня - первая цифра
(153-1*100)/10-> 5 десятков - вторая цифра
3 - единицы (делитьт не надо)

Это сообщение отредактировал(а) anwe - 13.11.2006, 22:41
PM MAIL   Вверх
Kuvaldis
Дата 13.11.2006, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 32
Всего: 61



krendel, 
Код

  n, digit, res, temp: integer;
  len, i : integer;
  degree_sum : integer;
begin
  write('n = ');
  readln(n);
  res := 0;
  temp := n;

  while (temp > 0) do
  begin
     temp := temp div 10;
     Inc(len);
  end;

  temp := n;
  while (temp > 0) do
  begin
      digit := temp mod 10;
      degree_sum := 1;
      for i := 1 to len do
          degree_sum := degree_sum * digit;
      res := res + degree_sum;
      temp := temp div 10;
  end;

  writeln('res = ', res);
  if (res = n) then
    writeln('Armstrong number')
  else
    writeln('not Armstrong number');
  readln;
end.


Код

Числа Армстронга. Число из n цифр является числом Армстронга, если 
сумма цифр, возведенных в n-ю степень, равна самому числу. Таким числом является, 
например, 153 = 13+53+33
Числом Армстронга из 4-х цифр является 1634:

На будущее, постарайся точнее ставить задачу, а то пришлось в Сети искать строгое определение
...

P.S. Думаю, что графическую оболочку ты уже сам прикрутишь...  smile 

Это сообщение отредактировал(а) Kuvaldis - 13.11.2006, 23:00


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
anwe
Дата 13.11.2006, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 9
Всего: 23



Ну вот как для чисел до 1000:
Код

uses
     Math;
...
var
q,     //введенное число
t,     //тысячи
s,     //сотни
d,     //десятки
e:Integer;     //единницы
a:Extended; //число твоего дяди, как там его?
begin
q:=StrToInt(Edit1.Text);
if q<1000 then
        begin
        s:=q div 100;
        d:=(q-s*100) div 10;
        e:=(q-s*100-d*10);
        end;
Edit1.Text:=IntToStr(s)+';'+IntToStr(d)+';'+IntToStr(e);  //это необязательно
a:=IntPower(s,3)+IntPower(d,3)+IntPower(e,3);
if a=q then
     ShowMessage('Число то что надо')
else
     ShowMessage('Число что не надо');
end;


М-да, поздно!

Это сообщение отредактировал(а) anwe - 13.11.2006, 22:57
PM MAIL   Вверх
kali
Дата 13.11.2006, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 9.11.2006
Где: Минск

Репутация: 18
Всего: 20



Если я правильно понял второй вопрос  то в последовательности
1 2 3 2 3 2 1
максимальным является 3 и необходимо определить число его вхождений в последовательность
если так то вот алгоритм:

 1) заводишь: 
     счетчик и выставляешь его в 1
     переменную для хранения текущего максимального значения и присваиваешь ей значения первого элемента
 2) перебираешь остальные элементы и сравниваешь их с текущим максисальным
     если значения равны inc(счетчик)
     если текущее максимальное меньше сбрасываешь счетчик в 1 и переприсваиваешь максимальное
--------------------
Работая над решением задачи, всегда полезно знать ответ.
PM MAIL Skype   Вверх
anwe
Дата 13.11.2006, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 9
Всего: 23



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

procedure TForm1.Button1Click(Sender: TObject);
var i,l,j,max,kol_vo:Integer;
posled:array of String;
chisla:array of Integer;
ss:String;
label l1;
begin
ss:=Edit1.Text;
l:=Length(ss);
i:=1;
j:=0;
repeat
if ss[i]<>' ' then
        begin
        inc(j);
        SetLength(posled,j);
        SetLength(chisla,j);
        end;
while ss[i]<>' 'do
        begin
        posled[j-1]:=posled[j-1]+ss[i];
        chisla[j-1]:=StrToInt(posled[j-1]);
        inc (i);
        if i=l+1 then goto l1;
        end;
inc(i);
until i>l;
l1:
kol_vo:=1;
max:=chisla[0];
for i:=1 to j-1 do
        if chisla[i]>max then
                begin
                dec(kol_vo);
                max:=chisla[i];
                inc(kol_vo);
                end
        else if chisla[i]=max then
                inc(kol_vo);
ShowMessage('Число повторений равно'+IntTostr(kol_vo));
end;

PM MAIL   Вверх
kali
Дата 14.11.2006, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 9.11.2006
Где: Минск

Репутация: 18
Всего: 20



2anwe goto smile(( имхо некрасиво
--------------------
Работая над решением задачи, всегда полезно знать ответ.
PM MAIL Skype   Вверх
anwe
Дата 14.11.2006, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 9
Всего: 23



Без, без нее.
PM MAIL   Вверх
krendel
Дата 14.11.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.11.2006

Репутация: нет
Всего: нет



Ребят за первую задачу спасибо обоим .. Очень помогли.. Графический интерфейс прикрутил сам все ок..
А вот со второй ... ЧТо-то не понятно..
Это как-то легче можно сделать. Мне училка сказала...
я просто операторы и нужный код знаю, но применить к поставленной задачи у меня не получается..
ВОт это рассуждение кстати правильно.. Я тоже так думаю, но как осуществить не знаюю

 1)заводишь: 
     счетчик и выставляешь его в 1
     переменную для хранения текущего максимального значения и присваиваешь ей значения первого элемента
 2) перебираешь остальные элементы и сравниваешь их с текущим максисальным
     если значения равны inc(счетчик)
     если текущее максимальное меньше сбрасываешь счетчик в 1 и переприсваиваешь максимальное 

PM MAIL   Вверх
kali
Дата 14.11.2006, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 9.11.2006
Где: Минск

Репутация: 18
Всего: 20



2anwe  у тебя в алгоритме ошибочка

Цитата

Код

for i:=1 to j-1 do
        if chisla[i]>max then
                begin
                dec(kol_vo);
                max:=chisla[i];
                inc(kol_vo);
                end
        else if chisla[i]=max then
                inc(kol_vo);



код
Код

           dec(kol_vo);
           max:=chisla[i];
           inc(kol_vo); 

при строке (3 3 4 2 1) выдает ответ 2

правильный код
Код

           kol_vo:=1;
           max:=chisla[i]; 



--------------------
Работая над решением задачи, всегда полезно знать ответ.
PM MAIL Skype   Вверх
kali
Дата 14.11.2006, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 9.11.2006
Где: Минск

Репутация: 18
Всего: 20



Код

procedure TForm1.Button1Click(Sender: TObject);
var
  num:array of integer;
  s:string;
  n,tmp,i,count:integer;
begin
// Преобразуем строку в массив integer
// Числа вводятся через пробел
// строка начинается числом изаканчивается числом
// если нет добавишь дополнительные проверки
  s:=edit1.Text;
  n:=0;
  tmp:=0;
  for i:= 1 to length(s) do
  begin
    if s[i]=' ' then
    begin
      inc(n);
      SetLength(num,n);
      num[n-1]:=tmp;
      tmp:=0;
    end else begin
      tmp:=tmp*10+strtoint(s[i]);
    end;
  end;
  inc(n);
  SetLength(num,n);
  num[n-1]:=tmp;

//основной код
  count:=1;
  tmp:=num[0];
  for i:=1 to n-1 do
  begin
    if tmp = num[i] then inc(count);
    if tmp < num[i] then
    begin
      tmp:=num[i];
      count:=1;
    end;
  end;

//Ответ
  Showmessage('Ответ: '+inttostr(count));
end;


Цитата

Это как-то легче можно сделать. Мне училка сказала...


Недумаю что как-то можно упростить основной код
--------------------
Работая над решением задачи, всегда полезно знать ответ.
PM MAIL Skype   Вверх
krendel
Дата 15.11.2006, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.11.2006

Репутация: нет
Всего: нет



У меня почему то делфи все время вот эту строку
procedure TForm1.Button1Click(Sender: TObject);
Красным выделяет, как бы не понимает что с ней делать..Может что не так с установленной Delphi 7(У нас такая и аудитории стоит)?
А ошибки вот такие высвечиваются при запуске..

[Error] Project1.dpr(8): ';' expected but '.' found
  [Error] Project1.dpr(18): Undeclared identifier: 'edit1'
  [Error] Project1.dpr(51): Undeclared identifier: 'Showmessage'
  [Error] Project1.dpr(54): Declaration expected but end of file found

ну я думаю showmessage можно заменить на Writeln или нет?
PM MAIL   Вверх
anwe
Дата 15.11.2006, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 9
Всего: 23



Не понятно, где ты этого нахватался?
Над листингом кода есть кнопочка "Выделить все". Ее нажимаешь и вставляешь себе в проект. Это по поводу
Цитата
[Error] Project1.dpr(8): ';' expected but '.' found
...
...
  [Error] Project1.dpr(54): Declaration expected but end of file found

А по поводу 
Цитата

  [Error] Project1.dpr(18): Undeclared identifier: 'edit1'
  [Error] Project1.dpr(51): Undeclared identifier: 'Showmessage'
два варианта: либо ты не кинул на форму edit1 и у тебя не подключен модуль Dialogs, хотя странно: он прописывается автоматом, либо тебе енто все надо на Паскале. Судя по теме и по
Цитата

У меня почему то делфи

у тебя первый вариант.
PM MAIL   Вверх
krendel
Дата 16.11.2006, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.11.2006

Репутация: нет
Всего: нет



Вот в этом и проблема.. Что ошибка:
[Error] Project1.dpr(8): ';' expected but '.' found
...
...
  [Error] Project1.dpr(54): Declaration expected but end of file found
Повторяется все равно, хоть как не копируй..
Нас пока не научили подрубать модули Dialogs и кидать форму.(Извени конечно, но я думаю нам не могли задать, то что мы еще не проходили.... Может все такие как-то можно это обойти другим способом?)
PM MAIL   Вверх
Kuvaldis
Дата 16.11.2006, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 32
Всего: 61



krendel, 
1. Создай голый виндозный проект в Delphi
2. Кинь на форму кнопку (по умолчанию будет Button1) и поле ввода Edit ( по умолчанию будет Edit1)
2. Создай пустой обработчик события OnClick для кнопки
3. Замени этот обработчик (procedure TForm1.Button1Click(Sender: TObject);) на тот, что тебе дали выше
4. Возрадуйся от его работы  


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0763 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.