Автор Тема: Вспоминаем Turbo Pascal и решаем задачи на нём  (Прочитано 49085 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #30 : 21 Ноябрь 2009, 02:03:44 »
Цитата: aUruM
2. От goto неплохо бы избавиться, например, использовав цикл until.
Ну я goto использую на даный момент только для повтора (чтобы с конца в начало кинуть ) или же при исключениях , но постараюсь перейти на repeat until , спасибо за совет .

Добавлено позже:
Задание:Напишите программу , которая возводит действительно число , введённое с клавиатуры, в степень, введённую с клавиатуры, в диапазоне от 2 до 9.Исключите несуществующие (меньше 2 и больше 9) степени, и снабдите программу запросом об окончании работы .
Моё решение вот такое :
И здесь мне тоже почемуто кажеться что можно сделать както по другому так как уж больно всё получилось привязано к тому что граница возможной степени дана , а если бы её не было ... Вообщем можно как-то по другому без привязки к граници степени сделать такое упражнение ?

Добавлено позже:
P.S В решении данного примера используется goto так как решал я даный пример ещё до прочтения замечания по поводу употребления goto .

Оффлайн aUruM

  • Emu-Land Team
  • Сообщений: 1793
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #31 : 21 Ноябрь 2009, 02:25:39 »
    2: a:=a*a;
     3: a:=a*a*a;
     4: a:=a*a*a*a;
     5: a:=a*a*a*a*a;
     6: a:=a*a*a*a*a*a;
     7: a:=a*a*a*a*a*a*a;
     8: a:=a*a*a*a*a*a*a*a;
     9: a:=a*a*a*a*a*a*a*a*a
Вот это - действительно индусский код. Во-первых, если мы возводим число в целую степень, то имеет смысл воспользоваться, к примеру, циклом for.

Потом, вас же просят возвести в степень действительное, а не целое число. Почему переменная a у вас имеет тип Integer?

Кроме того, если a - только положительное, то можно воспользоваться известной формулой:



В вашем случае это будет выглядеть примерно так:
a:=exp(x*ln(a));

Оффлайн AnXIouS

  • Пользователь
  • Сообщений: 323
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #32 : 21 Ноябрь 2009, 05:16:28 »
Ну и я вспомню немного что-ли, первый мой курс института.
Цитата
program proga105;
uses crt;
var
   a,x: real;
   b: integer;
   z: char;
BEGIN
repeat
   write('Vvedite 4islo = ');
   readln(a);
   x := a;
   write('Vvedite stepen = ');
   readln(b);
   if (b >= 2) and ( b <= 9) then  // если убрать отсечение, то любая степень,
   begin                                   // в пределах возможностей компилятора или переменной
      while b > 1 do
      begin
         a := a * x;
         dec(b);
      end;
   end
   else
      writeln('Vvedenno chislo >9 ili <2');
   writeln(a:2:4);
   writeln('Continue ? Y/N');
   readln(z);
until z <> 'y';
END.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #33 : 21 Ноябрь 2009, 15:48:59 »
Цитата: AnXIouS
until z <> 'y';
Так там же знак не равно в итоге получиться пока будет нажиматься любая другая кнопка кроме 'y' будет повторяться цикл , или я что-то не так понял ?

Добавлено позже:
Цитата: aUruM
В вашем случае это будет выглядеть примерно так:Код:a:=exp(x*ln(a));
Сейчас постараюсь с этим всем разобраться .

Оффлайн AnXIouS

  • Пользователь
  • Сообщений: 323
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #34 : 21 Ноябрь 2009, 16:40:04 »
Так там же знак не равно в итоге получиться пока будет нажиматься любая другая кнопка кроме 'y' будет повторяться цикл , или я что-то не так понял ?
Цитата
Цитата
repeat  statement   until   expession;
Здесь вначале выполняется оператор statement, а затем вычисляется значение логического выражения expression. Процесс повторяется, пока выражение expression принимает значение «ложь». Как только это значение станет истинным, выполнение цикла прекращается.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #35 : 21 Ноябрь 2009, 18:13:14 »
AnXIouS, понял , что-то затупил я с repeat until'ом .

Добавлено позже:
у меня в учебнике по турбо паскалю (посоветованному в прошлой теме) в многих заданиях типа этого : напишите программу для вычисления функции y=x^2-16x + 32 для x от 1 до 10 с шагом 0,25 , есть вот такое 'x^2', вопрос возможно глупый но что это в программировании ?Степень ? И ещё вопрос как делать шаг не 1 (for a=1 to 10) , а именно 0,25 ну или какоето другое число ?

Оффлайн AnXIouS

  • Пользователь
  • Сообщений: 323
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #36 : 21 Ноябрь 2009, 18:30:51 »
Да, "^", это степень, не совсем в программировании...
Цикл For в некоторых Паскалях имеет ширину шага, кажется так " for i=1 to 10 step 2 do "
А чтобы шагать дробно, использовать проще цикл while.

Оффлайн Fly

  • Пользователь
  • Сообщений: 1896
  • Пол: Мужской
    • Steam
    • Youtube
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #37 : 21 Ноябрь 2009, 18:44:58 »
Цитата: gepar
И ещё вопрос как делать шаг не 1 (for a=1 to 10) , а именно 0,25 ну или какоето другое число ?
Можно сделать цикл с шагом 1, а потом делить переменную на 4.
for a:=1 to 10 do b:=b+a/4

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #38 : 21 Ноябрь 2009, 19:02:25 »
AnXIouS, сейчас попробую и с указанным шагом , но я пока что сделал вот так :
Не все результаты правда влезли в экран (да можно их в одну строчку подряд писать с пробелами , но результаты както всё равно сливаются), а можно ли в паскале както прикрутить полосу для навигации справа чтобы можно было листать результаты ?

Добавлено позже:
Цитата: AnXIouS
Цикл For в некоторых Паскалях имеет ширину шага, кажется так " for i=1 to 10 step 2 do "
В некоторых в каком смысле ?Тоесть не у всех , ну тогда уже наверное действительно лучше пользоваться циклом while . У меня после 10 сразу пишет ожидалось do , у меня паскаль ABC .

Добавлено позже:
Fly, если не лень и есть время напиши пожалуйста свой вариант , ато что-то я не понял как с таким алгоритмом оно будет работать ,а вернее правильно работать , код частично скопируй у меня для экономии времени  :)

Оффлайн AnXIouS

  • Пользователь
  • Сообщений: 323
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #39 : 21 Ноябрь 2009, 20:13:23 »
а можно ли в паскале както прикрутить полосу для навигации справа чтобы можно было листать результаты ?
Никак, разрешение текстовых режимов в DOS три - 80х25, 40х25 и 80х50 символов.
Вывод нужно форматировать writeln(a:1:2); Первая цифра количество символов после запятой, вторая - общее кол-во (кажется †). А потом в цикле делать проверку: if i div 10 = 0 then WriteLn; (если остаток от деления ноль, то перевести строку. выводя при этом write'ом).

Оффлайн Fly

  • Пользователь
  • Сообщений: 1896
  • Пол: Мужской
    • Steam
    • Youtube
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #40 : 21 Ноябрь 2009, 21:12:04 »
Цитата: gepar
Fly, если не лень и есть время напиши пожалуйста свой вариант , ато что-то я не понял как с таким алгоритмом оно будет работать ,а вернее правильно работать , код частично скопируй у меня для экономии времени
Для твоей программы будет выглядеть так:
program proga107;
uses crt;
var
x:byte;
y:real;
Begin
     For x:=1*4 to 10*4 do  {или просто For x:=4 to 40 do}
     Begin
     y:=(sqr(x/4))-(16*x/4)+32;
     write ('x=',x/4,' y=',y,' ');
     writeln;
     end;
end.
PS. Лучше всё-таки while используй.:)

Добавлено позже:
PPS. Перед end точка с запятой не требуется.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #41 : 21 Ноябрь 2009, 21:19:59 »
AnXIouS, усёк , спасибо что разъяснил .
Теперь застрял вот на таком вот упражнении :
Вычислить сумму ряда s=cos(x)+ cos(x)*cos(x)+...+cos(x)*cos(x)*...*cos(x) , для x и n  введённых с клавиатуры .
+...............n...............+
- уже решено  :)

Добавлено позже:
Цитата: Fly
PPS. Перед end точка с запятой не требуется.
Ты об этом :
Цитата: Fly
  writeln;
   end;
end.
?
Я знаю , привычка просто  :)
« Последнее редактирование: 22 Ноябрь 2009, 00:06:38 от gepar »

Оффлайн Fly

  • Пользователь
  • Сообщений: 1896
  • Пол: Мужской
    • Steam
    • Youtube
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #42 : 21 Ноябрь 2009, 21:21:09 »
Ещё раз внимательно посмотрел на программу. Много лишнего нашёл. Хватит этого:
program proga107;
var
x:byte;
Begin
     For x:=4 to 40 do
     writeln ('x=',x/4,' y=',sqr(x/4)-16*x/4+32)
end.
« Последнее редактирование: 21 Ноябрь 2009, 21:23:30 от Fly »

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #43 : 21 Ноябрь 2009, 22:48:03 »
P.S
Цитата:
program proga107;
uses crt;
var
x:byte;
y:real;
Begin
     For x:=1*4 to 10*4 do  {или просто For x:=4 to 40 do}
     Begin
     y:=(sqr(x/4))-(16*x/4)+32;
     write ('x=',x/4,' y=',y,' ');
     writeln;
     end;
end.
Запутанно , но тоже вариант  :)

Добавлено позже:
И ещё вот такой вопрос - это что за обозначение : 'n!' , где n - число , его я что-то тоже часто стал встречать в списке задач .

Оффлайн aUruM

  • Emu-Land Team
  • Сообщений: 1793
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #44 : 21 Ноябрь 2009, 22:50:47 »
Цитата: gepar
И ещё вот такой вопрос - это что за обозначение : 'n!' , где n - число , его я что-то тоже часто стал встречать в списке задач .
Это факториал. По определению,
0!=1,
n!=n*(n-1)! для n>0.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #45 : 21 Ноябрь 2009, 23:11:24 »
Цитата: aUruM
Это факториал. По определению,0!=1,n!=n*(n-1)! для n>0.
Понял , пойду в вики почитаю подробнее .

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #46 : 22 Ноябрь 2009, 18:05:31 »
А кто-то может обьяснить работу random в паскале , желательно с примерами и чтобы попонятнее и поподробнее :) Ну или ссылку на страницу где это всё есть , в гугле что-то нашёл только скупую информацию насчёт random'а .

Оффлайн УльтраБлокС

  • Пользователь
  • Сообщений: 1166
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #47 : 22 Ноябрь 2009, 18:19:58 »
Перед обращением к Random надо вызвать Randomize;

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #48 : 22 Ноябрь 2009, 19:07:40 »
УльтраБлокС, ну это я уже понял , методом тыка выяснил что нужно писать random(по какое число будет генерится с 0) - сколько нужно тобишь random(100)-50 будут генерироваться числа от -51 до 50 , если я гдето неправ то поправьте .
И ещё тут возник такой вопрос можно ли зная что в массиве с 20 ячеек есть где-то цифра 5 узнать где она тобишь можно ли както узнать а в какой же ячейке эта цифра храниться и вывести номер этой ячейки ?

Оффлайн УльтраБлокС

  • Пользователь
  • Сообщений: 1166
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #49 : 22 Ноябрь 2009, 19:14:51 »
Random(100) даёт числа от 0 до 99

И ещё тут возник такой вопрос можно ли зная что в массиве с 20 ячеек есть где-то цифра 5 узнать где она тобишь можно ли както узнать а в какой же ячейке эта цифра храниться и вывести номер этой ячейки ?

var
I: Integer;
I1: Array [0..20] of Integer;
begin
for i := 0 to 20 do if I1[i] = 5 then WriteLn(i);
end.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #50 : 22 Ноябрь 2009, 19:24:44 »
И ещё один вопрос как от новичка : можно ли нескольким константам сразу задать значение 0 , например у меня есть a,b,c и d и все типу real и вот я хочу им всем сразу задать значение 0 , мого намёка ввиде a,b,c,d:=0; паскаль не понял  :) Тогда как нужно было сразу задавать им всем значение 0 , да и реально ли это вообще сделать ?

Добавлено позже:
УльтраБлокС, фенкс , сейчас попробую переделать задание ещё таким способом ато я там схитровал немного при выполнении , результат то конечно получен правильный , но я  хочу знать все нюансы .

Оффлайн topos84

  • Emu-Land Team
  • Сообщений: 2762
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #51 : 22 Ноябрь 2009, 19:26:59 »
Цитата: gepar
a,b,c,d:=0; паскаль не понял
Столбиком присвой.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #52 : 22 Ноябрь 2009, 19:33:29 »
Цитата: topos84
Столбиком присвой.
Пример ?

Оффлайн topos84

  • Emu-Land Team
  • Сообщений: 2762
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #53 : 22 Ноябрь 2009, 19:35:50 »
a:= 0;
b:= 0;
c:= 0;
d:= 0;

Цитата: gepar
намёка ввиде a,b,c,d:=0; паскаль не понял
Он не очень умен, дедушка Паскаль-то, потому не любит, когда кто-то пытается облегчить себе работу с ним при помощи всяких хитростей. ;)

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #54 : 22 Ноябрь 2009, 19:40:04 »
И ещё вопросик : можно както определить наибольший или наименьший элемент массива ?Ну кроме способа сравнивания типа
?

Добавлено позже:
topos84,вообщем как я понял сходу нельзя сразу всем , нужно по очереди .Спс за ответ .

Оффлайн AnXIouS

  • Пользователь
  • Сообщений: 323
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #55 : 22 Ноябрь 2009, 19:41:25 »
В паскале никак.

Оффлайн topos84

  • Emu-Land Team
  • Сообщений: 2762
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #56 : 22 Ноябрь 2009, 19:47:03 »
gepar, вот здесь можно найти полезную инфу про Паскаль (краткие и не очень метод. рекомендации и учебники, некоторые примеры решения задач и пр.):


Добавлено позже:
Цитата: gepar
И ещё вопросик : можно както определить наибольший или наименьший элемент массива ?Ну кроме способа сравнивания типа
Задачи на работу с массивами в вузовских курсах программирования (до динамического программирования/объектно-ориентированного) - одни из самых трудных и для большинства из них есть стандартные решения, так что ничего нового сам не выдумаешь, что было бы легче/удобнее этих.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #57 : 22 Ноябрь 2009, 20:43:16 »
topos84, да книг уже накачал  я достаточно,  просто зачастую перечитав страницы относящиеся например к операторам постусловия  кое-что не совсем понимаешь и приходиться спрашивать здесь на форуме дабы местные специалисты  по паскалю объяснили некоторые нюансы за что всем отписавшимся в этой теме ещё раз спасибо  .

Добавлено позже:
Застрял на вот такой вот задачке :
Напишите программу , которая вводит с клавиатуры 10 реальных чисел , и организовывает их хранение в массиве. После этого массив пересортировывается по закону:первый элемент меняеться с последним , второй с предпоследним и т.д ...
Начало решения :
Как сделать правильно дальше я что-то догадаться не могу , ну разве что могу написать так называемый "индусский код" поназначав элементы массива 10 переменным , а потом поназначать значения переменных нужным элементам массива , но это будет долго и точно уж неправильно  :)

Оффлайн topos84

  • Emu-Land Team
  • Сообщений: 2762
  • Пол: Мужской
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #58 : 22 Ноябрь 2009, 21:25:26 »
gepar, лови:

Цитата
program proga184;
uses crt;
var
m:array[1..10] of real;
r: real;
n,i,j,k:integer;
Begin
  clrscr;
  for i:=1 to 10 do
    begin
      write('Enter m[',i,']=');
      read(m);
      writeln;
    end;
  writeln('Your array is:');
  for n:=1 to 10 do write(m[n]:5:3,'  ');
  writeln;
  for j:=1 to 4 do
    begin
      r:=m[j];
      m[j]:=m[11-j];
      m[11-j]:=r;
    end;
  writeln;
  writeln('Symmetrical one:');
  for k:=1 to 10 do write(m[k]:5:3,'  ');
  writeln;
  writeln('Press any button');
  readln;
  readln;
end.
« Последнее редактирование: 22 Ноябрь 2009, 21:27:36 от topos84 »

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Вспоминаем Turbo Pascal и решаем задачи на нём
« Ответ #59 : 22 Ноябрь 2009, 22:14:33 »
topos84, что-то сложное в итоге получилось , сейчас буду пошагово разбираться .