Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.11.2015, 01:04
EnumaElish EnumaElish вне форума
Прохожий
 
Регистрация: 30.11.2015
Сообщения: 6
Версия Delphi: pascal
Репутация: 10
По умолчанию Самое простое vol.1

Только начал изучать delphi с паскаля, буквально несколько дней
уже прошел циклы немного процедур итд...
никак не могу понять как решить задачки простые с книги 'песни о паскале'
-------------------------------------------
a)Почтальон разносит газеты по улице, состоящей из N домов. Четные и
нечетные номера расположены по разные стороны улицы. В здравом уме
почтальон не рискует лишний раз переходить её. Ваша программа должна
напечатать последовательность номеров, по которым будут разнесена почта, когда
почтальон начинает работу:
· с первого дома;
· со второго дома;
· с N-го (то есть последнего) дома.
--------------------------------------------
я так понимаю тут с помощью счетчика.. уже много всяких задачек решил.. но тут не пойму ((
--------------------------------------------
b) Создайте процедуру, печатающую все числа, кроме единицы, на которые
без остатка делится число N, где N — параметр процедуры. Напишите программу
для проверки этой процедуры.

Последний раз редактировалось EnumaElish, 30.11.2015 в 01:14.
Ответить с цитированием
  #2  
Старый 30.11.2015, 06:03
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

а) Ну, если нет ограничения на саму почту (т.е. почта есть для всех домов), то, видимо, разговор идет о циклах с шагом 2. Т.е. сначала проходимся по одной стороне улицы, потом по второй. Третий подвопрос - обратный цикл.

б) Ну тут просто. Идем циклом от 2 до SQRT(N)+1 и смотрим отсаток от деления. Если он 0, то печатаем число.
Ответить с цитированием
  #3  
Старый 30.11.2015, 21:58
EnumaElish EnumaElish вне форума
Прохожий
 
Регистрация: 30.11.2015
Сообщения: 6
Версия Delphi: pascal
Репутация: 10
По умолчанию

Спасибо.
По почтальону получилось но не через for to do
Код:
var a,c:integer;
begin
c:=1; //если начинаем с 1 дома
readln(a); //вводим количество домов 
 repeat
  c:=c+2;
  writeln(c);
  until (c=a) or (c=a+1) or (c=a-1);
 if c=a then
   begin
    c:=a-1;
    writeln(c);
  end;
repeat
c:=c-2;
writeln(c);
until (c=1) or (c=0);
end

Ответить с цитированием
  #4  
Старый 01.12.2015, 01:05
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А никто и не говорил, что for решает любые задачи. Персонально, я не очень люблю цикл repeat-until, предпочитаю while-do, он более читабельный.
Ответить с цитированием
  #5  
Старый 04.12.2015, 01:56
EnumaElish EnumaElish вне форума
Прохожий
 
Регистрация: 30.11.2015
Сообщения: 6
Версия Delphi: pascal
Репутация: 10
По умолчанию

Спасибо там все решил все было просто...
Вот новая делема на тему применения функций..
-===================-
Для введенной пользователем строки напечатать позиции всех входящих в
неё символов (кроме пробелов) в алфавитном порядке. Для символов, которые
встречаются несколько раз, напечатать их позиции в одной строке. Например, для
слова «PASCAL»:
-===================-
понятно что цифры нужно раскидыть по цифре ASCII ... как максимальное и минимальное найти в цикле все эт понятно.. но как их в итоге по порядку раскидать...
делаю так
Код:
function swap(var a:string):string;
var i:integer; x:char;
begin
for i:=0 to length(a) do
if a[i]<a[i+1] then
if i+1>length(a) then break 
else
begin
x:=a[i]; a[i]:=a[i+1]; a[i+1]:=x; //свапаем местами
end;
end;
но эта функция пробегается по строке всего 1 раз
вводим abbassa получаем bbassa
как зациклить чтобы пока не станет верным условие
Код:
a[i]>a[i+1]

p.s.поясните в каких случаях нужно ставить ссылку на переменную в функцию или процедуру типа
Код:
function swap(var a:string):string;
а когда не нужно.. перечитал много источников ни чего не пойму...((
p.s.s. и как из паскаля копировать текст куда нибудь?) постоянно приходится руками на форум набирать )

Последний раз редактировалось EnumaElish, 04.12.2015 в 03:08.
Ответить с цитированием
  #6  
Старый 04.12.2015, 20:34
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

сортировка делается двойным циклом.
Если есть возможность, то можно использоваться TStringList добавив не только значение, но и объект, в которм хранить список позиций.
На самом деле задача решается в 3 приема.
1. Сначала в какой-нить список пишем все буквы и их позиции.
2. Сортируем полученный список по буквам.
3. Делаем вывод результата из списка.
Ответить с цитированием
  #7  
Старый 04.12.2015, 20:55
EnumaElish EnumaElish вне форума
Прохожий
 
Регистрация: 30.11.2015
Сообщения: 6
Версия Delphi: pascal
Репутация: 10
По умолчанию

TStringList это на delphi ... а я к дельфи решил через паскаль пробираться... не знаю правильно это или нет...
пусть это не буквы а просто числа
как числа так перетосовать??
мой код один раз пробегается по строке.. а нужно что бы бегал пока условие не будет выполнено (
типа
Код:
while a[i]<a[i+1] do
.. не знаю как это выразить (

Последний раз редактировалось EnumaElish, 04.12.2015 в 23:08.
Ответить с цитированием
  #8  
Старый 04.12.2015, 23:38
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Дык вложенным циклом же ж...
Код:
function Swap(var S : String; I, J : Integer);
var
  ch : char;
begin
  ch := S[i];
  S[i] := S[J];
  S[J] := ch;
end;

...

S := 'mama myla ramy';

// Standard bubble sort
For i := 1 To Length(S)-1 Do
  For j := i+1 To Length(S) Do
    If S[i]>S[j] Then Swap(S,i,j);
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
EnumaElish (06.12.2015)
  #9  
Старый 07.12.2015, 06:56
EnumaElish EnumaElish вне форума
Прохожий
 
Регистрация: 30.11.2015
Сообщения: 6
Версия Delphi: pascal
Репутация: 10
По умолчанию

Pascal: Работа с файлами + немного криптографии.
2 процедуры:
1- Шифровка:берет исходный текст из файла A шифрует и записывает в файл B
2 -Дешифровка: берет исходный файл B расшифровывает и записывает в файл C;
Код:
procedure Crypts(var T,G:text); //Ссылаемся на 2 текстовых файла
var S:string; i:integer;
 begin
  reset(t);  //открываем для чтения Файл T
 while not Eof(T) do 
  begin
    readln(t,s);     //Присваеваем строке S строку текстового файла T
     for i:=0 to length(s) do
       begin
        ord(s[i]):=ord(s[i])+Ckey;
    {после прибавления ключа проверяем не ушел ли за границы ASCII}
          if ord(s[i])>256 then ord(s[i]):=ord(s[i])-256+32;
    {+32 так как первые 32 цифры - управляющие символы ASCII}
          end;
        writeln(G,S);              //впиываем в файл G строку S
  end;
  close(t);
 end;


Procedure Uncrypts(var G,Y:text);
var S:string; i:integer;
begin
 reset(g);
  while not Eof(g) do
   begin
    readln(g,s);
     for i:=0 to length(s) do
      begin
       ord(s[i]):=ord(s[i])-3;
        if ord(s[i])<32 then ord(s[i]):=ord(s[i])+256-32;
      end;
     writeln(Y,S);
    end;
   close(G);
 end;

Шифрует нормально, но все равно добавляет лишние символы
из True получается - Wuxhvvv
из I - Luxh откуда берутся эти лишние символы???

При дешифрации сначала вылетали непонятно почему ошибки потом
вроде стало дешифроваться но в файле дешифровке например
получилось не обратно I а-
Код:
Truessssэээ    ЊюAB       xюA                                . ёШ_            ёШ_    |      аюAF?u`   Ђ @       дюAТV@ ·   дЧ^дЧ^ъС^иЧ^дM@ 0   tѓ@     vA@ p`@ tѓ@  А¦@ §@ ,яAТV@ ·   tѓ@ <яAТV@ D

Последний раз редактировалось EnumaElish, 07.12.2015 в 18:13.
Ответить с цитированием
  #10  
Старый 09.12.2015, 05:18
EnumaElish EnumaElish вне форума
Прохожий
 
Регистрация: 30.11.2015
Сообщения: 6
Версия Delphi: pascal
Репутация: 10
По умолчанию

все решилось... затупил с управляющими символами
Код:
procedure Crypts(var T,G:text); //Ссылаемся на 2 текстовых файла
var S:string; i:integer;
 begin
  reset(t); //открываем для чтения Файл T
 while not Eof(T) do
  begin
    readln(t,s);     //Берем строку из файла T
     for i:=0 to length(s) do
       begin
         if ord(s[i])>=32 then
           ord(s[i]):=ord(s[i])+Ckey;
            if ord(s[i])>256 then ord(s[i]):=ord(s[i])-256+32;
          end;
        writeln(G,S);              //впиываем в файл G строку S
  end;
  close(t);
 end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:31.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter