Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.01;
Скачать: CL | DM;

Вниз

Вывести числа от 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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.03 c
6-1127234353
Galiaf
2005-09-20 20:39
2006.01.01
Проверка наличия сервера на определённом порте.


2-1134687534
crazycorpse
2005-12-16 01:58
2006.01.01
Динамический массив n x m


3-1131684069
kblc
2005-11-11 07:41
2006.01.01
Компонент для работы заточенный для MSSQL


1-1133549249
ZeFiR
2005-12-02 21:47
2006.01.01
Как заблокировать вывод ошибок


14-1134231300
cdtnf
2005-12-10 19:15
2006.01.01
я тут книгу...