Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];

Вниз

Вывести числа от 1 до 100 без циклов и условий   Найти похожие ветки 

 
Kerk ©   (2005-12-05 02:08) [0]

Сабж. Такая вот задачка.


 
Kerk ©   (2005-12-05 02:09) [1]

Будем считать что

> Вывести числа от 1 до N без циклов и условий

для ясности


 
Джо ©   (2005-12-05 02:17) [2]

WriteLn (1);
WriteLn (2);
WriteLn (3);
...
WriteLn (100);

В чем прикол-то?


 
Kerk ©   (2005-12-05 02:20) [3]

Джо ©   (05.12.05 2:17) [2]

См [1].
Количество чисел до запуска программы не известно.


 
Джо ©   (2005-12-05 02:28) [4]


>  [3] Kerk ©   (05.12.05 02:20)
> Количество чисел до запуска программы не известно.

Не видел [1], когда писал.

Все равно не понимаю. Где-то ведь эти числа хранятся? От того, где и как хранятся эти N чисел и зависит, как их выводить. Нужно, имхо, строже задачу описать, а то непонятно, в чем соль. Мне, по крайней мере. Что значит N чисел? Каких чисел? И откуда их брать?


 
Kerk ©   (2005-12-05 02:31) [5]

Джо ©   (05.12.05 2:28) [4]
От того, где и как хранятся эти N чисел и зависит, как их выводить.


Нигде не хранятся. Они должны генерировать по ходу выполнения программы. Числа от 1 до N выводить, скажем, в консоль по типу того, как у тебя в [2].


 
Джо ©   (2005-12-05 02:32) [6]

Или как раз и нужно придумать такой способ хранения, чтобы обойтись при выводе без и циклов и сравнений? Тогда и
S := "сюда пишем числа, разделенные концом каретки и возвратом строки";
WriteLn (S);
подходит... Или я невероятно туп?


 
Джо ©   (2005-12-05 02:33) [7]


>  [6] Джо ©   (05.12.05 02:32)

Тю, опять поспешил, не видел [5], сорри. Теперь, кажется, понял :)


 
Джо ©   (2005-12-05 02:36) [8]

Рекурсия подходит?


 
Kerk ©   (2005-12-05 02:37) [9]

Джо ©   (05.12.05 2:36) [8]
Рекурсия подходит?


Подходит все что угодно, что ты сможешь сделать без циклов и условий.


 
Джо ©   (2005-12-05 03:07) [10]

Сорри за еще один тупой вопрос, но спрошу: блок case считается за сравнение? Подозреваю, что да, но все-же.


 
Джо ©   (2005-12-05 03:11) [11]

Что-то DMClient заглючил и не показывает (у меня) мой последний пост, продублирую:
Сорри за еще один тупой вопрос, но спрошу: блок case считается за сравнение? Подозреваю, что да, но все-же.


 
Kerk ©   (2005-12-05 03:11) [12]

Джо ©   (05.12.05 3:07) [10]
блок case считается за сравнение?


Ну конечно. Тот же самый условный переход.


 
Profi ©   (2005-12-05 03:20) [13]

Вроде задача не решаема. Если только как-то исхитриться с рекурсией + метки. Еще подумаю.


 
Джо ©   (2005-12-05 03:31) [14]


program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils;

var
 MaxN: Integer;

procedure NextN (N: Integer);
var
 Dummy: Double;
begin
 Dummy := 1 / (N-MaxN-1);
 WriteLn (N);
 Inc (N);
 NextN (N);
end;

begin
 ReadLn (MaxN);
 try
   NextN(1);
 except
 end;
 ReadLn;
end.


Ни одного цикла и сравнения, всё тип-топ ;->
П.С. Отключить оптимизацию.


 
Profi ©   (2005-12-05 03:35) [15]

Джо ©   (05.12.05 3:31) [14]
Блин, опередил, я только Delphi запустил, хотел проверить. Правда, я try думал в функции использовать. Сейчас свой вариант приведу.


 
Profi ©   (2005-12-05 03:48) [16]

Джо ©   (05.12.05 3:31) [14]
Ага, с оптимизацией не катит!

Код:

program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils;

var
 S,N:Integer;

Procedure Wr(S:integer);
var
 i:extended;
begin
 Try
   i:=1/(N-S);
   writeln(S);
   inc(S);
   Wr(S);
 Except
   exit;
 end;
end;

begin
 write("Введите N ");
 readln(N);
 Wr(0);
 readln;
end.


 
Profi ©   (2005-12-05 03:49) [17]

Profi ©   (05.12.05 3:48) [16]
Немного переделал:

program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils;

var
 S,N:Integer;

Procedure Wr(S:integer);
var
 i:extended;
begin
 Try
   inc(S);
   writeln(S);
   i:=1/(N-S);
   Wr(S);
 Except
   exit;
 end;
end;

begin
 write("Введите N ");
 readln(N);
 Wr(-1);
 readln;
end.


 
Джо ©   (2005-12-05 04:03) [18]


> [17] Profi ©   (05.12.05 03:49)

У меня код короче :p


 
Lamer@fools.ua ©   (2005-12-05 08:14) [19]

>>Джо ©   (05.12.05 03:31) [14]

>П.С. Отключить оптимизацию.
Эх. Учи, учи, одни двойки :o)

program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils;

var
MaxN: Integer;

function NextN(N: Integer): Double;
var
 Dummy: Double;
begin
 Result := 1 / (N - MaxN - 1);
 WriteLn(N);
 NextN(N + 1);
end;

begin
 ReadLn(MaxN);
 try
   NextN(1);
 except
 end;
 ReadLn;
end.


 
Гость1   (2005-12-05 10:31) [20]

try
except

по большому счету тот же условный переход, только завуалированный :)

можно и без него обойтись :)

type
 TMyEvent = procedure (n, maxn: integer) of object;

 TForm1 = class(TForm)
   Button1: TButton;
   Edit1: TEdit;
   ListBox1: TListBox;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   fEvents: array [boolean] of TMyEvent;
   procedure NextN(n, maxn: integer);
   procedure StopN(n, maxn: integer);

 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}
{ TForm1 }

procedure TForm1.NextN(n, maxn: integer);
begin
 ListBox1.Items.Add(IntToSTr(n));
 fEvents[n=maxn](n+1, maxn);
end;

procedure TForm1.StopN(n, maxn: integer);
begin
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ListBox1.Clear;
 fEvents[true]:=StopN;
 fEvents[false]:=NextN;
 NextN(0, StrToInt(Edit1.Text));
end;

но здесь, конечно, тоже "мухлеж"
условный переход замаскирован под обращение  к элементу массива :)

А так, задача решения не имеет.


 
Anatoly Podgoretsky ©   (2005-12-05 10:34) [21]

Рекурсия это тоже цикл - рекурсивный цикл


 
Sandman29 ©   (2005-12-05 10:37) [22]

А так, задача решения не имеет.

Имеет. Выводим все числа в вечной рекурсии начиная с 1.
То, что программа не должна выводить N+1, не написано. То, что программа не должа вылетать по переполнению стека или числа, тоже не написано :)


 
Труп Васи Доброго ©   (2005-12-05 10:58) [23]

Sandman29 ©   (05.12.05 10:37) [22]
Выводим все числа в вечной рекурсии начиная с 1.

Тогда уж проще некуда, и без всякой рекурсии, GOTO рулит!


 
Гость1   (2005-12-05 11:02) [24]


> Труп Васи Доброго ©   (05.12.05 10:58) [23]

GOTO - типа цикл :)


 
umbra ©   (2005-12-05 11:04) [25]

2 Гость1   (05.12.05 11:02) [24]

GOTO - не цикл, а безусловный переход. Циклы и условные переходы сего помощью организуются.


 
КаПиБаРа ©   (2005-12-05 11:15) [26]

// Извеняюсь за свой ассемблер, последний раз писал больше 10 лет назад и
// то под Z80

program Project2;

{$APPTYPE CONSOLE}

uses
 SysUtils;

var
 N, MaxN, c, m: Longword;

 procedure SetLabel; // Корявенькая процедура определения текущего местоположения в памяти
 begin
 asm
   pop EDX;          // Загружаем в адрес процедуы вывода числа
   push EDX;         // По адресу ECX-4 ,будет расположен указатель на точку выхода
   push EDX;         // По адресу ECX-8 ,будет расположен указатель на процедуру вывода числа
   push EDX;         // Адресс возврата из подпрограммы
   add EDX, $20;     // Задаем адресс точки выхода
   mov [ESP+8], EDX; // Заносим его в стек
 end;
 end;

 procedure Output;   // Процедура вывода числа
 begin
   writeln(MaxN-N+1);
   dec(N);
   c := 2 * N div (N + 1); // Возвращает 0 если N = 0 или 1 если N > 0;
                             // Если 0 - заканчиваем расчет
                             // Если 1 - продолжаем;
   c := (c + 1) * 4;       // Определяем смещение для точки перехода
 end;

begin
 ReadLN(MaxN);
 N := MaxN;

 // Определяем местоположение программы в памяти и точки перехода
 asm
   Push EDX
   Push ECX;          // Освобождаем регистр
   mov ECX, ESP;      // Запоминаем в него адрес вершины стека;
   call SetLabel;     // Задаем метки
   push ECX;          // Сохраняем региистр, что бы не затерся во время вывода
 end;

 // Выводим число
 Output;

 // Определяем точку перехода
 asm
   pop ECX;           // Загружаем регистр
   push EAX;          // Сохраняем регистры для операций по вычислению адреса перехода
   push EBX;
   mov EAX, c;
   mov EBX, ECX;
   sub EBX, EAX;
   mov EDX, [EBX];
   pop EBX            // Загружаем регистры
   pop EAX;
   jmp EDX;
   nop;   // В этом районе находится точка выхода (лень точно вычислять)
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   nop;
   pop ECX; // Освобождаем память от переменной в которой хранили адресс перехода
   pop ECX; // Освобождаем память от переменной в которой хранили адресс перехода
   pop ECX;
   pop EDX;
 end;
 ReadLN

end.


 
КаПиБаРа ©   (2005-12-05 11:20) [27]

Практически то же что и в Гость1   (05.12.05 10:31) [20]


 
Kerk ©   (2005-12-05 11:59) [28]

Гость1   (05.12.05 10:31) [20]

Я почти также решил :)


 
Владислав ©   (2005-12-05 17:12) [29]

unit Unit2;

interface

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

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   Button1: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
 private
   procedure OutputAll(Count: Integer);
   procedure Output(Number: Integer);
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Output(Number: Integer);
begin
 Memo1.Lines.Add(IntToStr(Number));
end;

procedure TForm1.OutputAll(Count: Integer);
asm
   PUSH  EBX
   PUSH  EBP
   MOV   EBP, ESP
   LEA   ECX, @@done
   PUSH  ECX
   LEA   ECX, @@output
   PUSH  ECX
   MOV   ECX, EDX
@@output:
   PUSH  EAX
   PUSH  EDX
   PUSH  ECX
   SUB   EDX, ECX
   ADD   EDX, 1
   CALL  TForm1.Output
   POP   ECX
   POP   EDX
   POP   EAX
   SUB   ECX, 1

   TEST  ECX, ECX
   PUSHF
   POP   BX
   AND   EBX, $40
   SHR   EBX, $04
   LEA   EBX, [EBP + EBX - $08]
   JMP   [EBX]
@@done:
   POP   ECX
   POP   ECX
   POP   EBP
   POP   EBX
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Count: Integer;
begin
 Count := StrToIntDef(Edit1.Text, 3);
 OutputAll(Count);
end;

end.


 
VirEx ©   (2005-12-05 17:40) [30]

! TEST  ECX, ECX


 
Владислав ©   (2005-12-05 17:47) [31]


> VirEx ©   (05.12.05 17:40) [30]
> ! TEST  ECX, ECX


:)

procedure TForm1.OutputAll(Count: Integer);
asm
   PUSH  EBX
   PUSH  EBP
   MOV   EBP, ESP
   LEA   ECX, @@done
   PUSH  ECX
   LEA   ECX, @@output
   PUSH  ECX
   MOV   ECX, EDX
@@output:
   PUSH  EAX
   PUSH  EDX
   PUSH  ECX
   SUB   EDX, ECX
   ADD   EDX, 1
   CALL  TForm1.Output
   POP   ECX
   POP   EDX
   POP   EAX
   SUB   ECX, 1

   MOV   EBX, ECX
   AND   EBX, EBX

   PUSHF
   POP   BX
   AND   EBX, $40
   SHR   EBX, $04
   LEA   EBX, [EBP + EBX - $08]
   JMP   [EBX]
@@done:
   POP   ECX
   POP   ECX
   POP   EBP
   POP   EBX
end;


 
Метроном   (2005-12-05 17:49) [32]

procedure TForm1.Button1Click(Sender: TObject);
begin
 Timer1.Tag := StrToInt(Edit1.Text);
 Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Timer1.Tag := Timer1.Tag-1;
 Memo1.Lines.Add(IntToStr(StrToInt(Edit1.Text)- Timer1.Tag));
 Timer1.Enabled := Boolean(Timer1.Tag);
end;


 
Владислав ©   (2005-12-05 18:17) [33]

Немного поупражнялся :)

procedure TForm1.OutputAll(Count: Integer);
asm
   PUSH  EBP
   MOV   EBP, ESP
   PUSH  OFFSET @@done
   PUSH  OFFSET @@output
   PUSH  EAX
   PUSH  EDX
   ADD   EDX, 1
   PUSH  EDX
@@output:
   SUB   EDX, [EBP - $10]
   CALL  TForm1.Output

   SUB   [EBP - $10], 1

   MOV   EAX, [EBP - $0C]
   MOV   EDX, [EBP - $14]

   PUSHF
   POP   CX
   AND   ECX, $40
   SHR   ECX, $04
   JMP   [EBP + ECX - $08]
@@done:
   ADD   ESP, $14
   POP   EBP
end;


 
VirEx ©   (2005-12-05 18:41) [34]


> Метроном   (05.12.05 17:49) [32]

негодится - условие от "1 до ...", но "финт ушами" удался :) (хотя всёже проблема решена на техническом уровне но не на логическом, т.е. не все языки это переварят)


> Владислав ©   (05.12.05 18:17) [33]

аналогично (в смысле решения задачи) :) всякие "хитрые" сдвиги, умножения и переходы по фикс. адресу


 
Метроном   (2005-12-05 19:07) [35]


> негодится - условие от "1 до ...", но "финт ушами" удался
> :) (хотя всёже проблема решена на техническом уровне но
> не на логическом, т.е. не все языки это переварят)


А ты попробуй. Выводятся числа именно от 1 до ...


 
VirEx ©   (2005-12-05 19:20) [36]


> Метроном   (05.12.05 19:07) [35]


> А ты попробуй. Выводятся числа именно от 1 до ...

а ну да тыже тэг уменьшаешь а результат как разница... ай эм сорри :)


 
Verg ©   (2005-12-05 20:30) [37]


> Гость1   (05.12.05 11:02) [24]


Вызов процедуры - разновидность "goto", значит вызов процедуры тоже цикл?
см. [21]


 
Gero ©   (2005-12-05 22:29) [38]


procedure WriteFrom1ToN(N: Integer);

 procedure NextN(Num: Integer);
 var
   E: Integer;
 begin
   E := Round(0 / (Num - N - 1));
   Writeln(Num);
   NextN(Num + 1);
 end;

begin
 NextN(1);
end;


 
Владислав ©   (2005-12-06 07:47) [39]


> VirEx ©   (05.12.05 18:41) [34]
>
> аналогично (в смысле решения задачи) :) всякие "хитрые"
> сдвиги, умножения и переходы по фикс. адресу


Ну и? :)


 
Гость1   (2005-12-06 09:56) [40]


> Verg ©   (05.12.05 20:30) [37]
>
> > Гость1   (05.12.05 11:02) [24]
>
>
> Вызов процедуры - разновидность "goto", значит вызов процедуры
> тоже цикл?
> см. [21]


> umbra ©   (05.12.05 11:04) [25]
> 2 Гость1   (05.12.05 11:02) [24]
>
> GOTO - не цикл, а безусловный переход. Циклы и условные
> переходы сего помощью организуются.


Не надо вырывать слов из контекста.

> Гость1   (05.12.05 11:02) [24]
>
> > Труп Васи Доброго ©   (05.12.05 10:58) [23]
>
> GOTO - типа цикл :)


было сказано в конексте 23, которое было ответом на 22.

Или вы считаете, что

lb1: writeln(n)
inc(n)
GOTO lb1;

это не цикл?



Страницы: 1 2 вся ветка

Форум: "Потрепаться";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.011 c
11-1115879438
Thaddy
2005-05-12 10:30
2006.01.01
Menu bug


1-1133526751
Ugrael
2005-12-02 15:32
2006.01.01
как задать нужный переход по ENTER ?


14-1134008667
boalse
2005-12-08 05:24
2006.01.01
Вечная тема - пользователи.


14-1133712022
vladik
2005-12-04 19:00
2006.01.01
проблема при установки системы


14-1133602424
Kerk
2005-12-03 12:33
2006.01.01
Soviet dream / Russians are stupid (most of them)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский