[ Обновленные темы · Новые сообщения · Участники · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Моддинг » Программирование (Уроки, Вопросы, Идеи) » Алгоритмы
Алгоритмы
ReadMe
Проверенные
Сообщений: 1307
Реп: 77 / Инв: 3
Пока варилась картошка и нечего было делать, еле выбрался из майна... и решил написать сие тутор.
Продолжу за Шаманом, и Лексом и буду няшкой ^-^.
Ну начнём:
Выполнение арифметических действий:
Паскаль великая штука, с помощью которой можно сделать практически всё, так вот: С помощью процедур вывода информации на экран можно выводить результаты арифметических операций.
Вот простая запись:
Code
Begin
Writeln('37*23+4='37*23+4);
End.

На экране появиться:
37*23+4=855
А почему так?
Да потому что мы вначале указали простое сообщение, не функцию, это как сказать: "Тридцать семь умножить на двадцать три плюс четыре."
А в уме уже сосчитали 855.
Вам помогут в этом таблицы:






В выше указанных таблицах вполне достаточно функций, чтобы выполнять нужные нам алгебраические действия)
Например, для того чтобы вычислить значение арксинуса, достаточно иметь в наличии моск и арктангенс:
Code
arcsin(x) = arctg([x(-2)-1](-1/2);

А длят ого чтобы возвести неотрицательное число в любую степень, можно использовать функции exp() и обратную ей ln(): a(b)=exp(b*ln(a)).
Заметьте! Есть ещё одна фигня, которую надо обязательно запомнить.
Если мы захотим вывести значение выражения 3500/7, то вместо числа 50 мы увидим а экране следующее: 5.000000000000E+02.
Why? о_О
Чтобы так не было надо указывать формат, рассмотрим пример:
Code
Writeln(3500/7:9:2);

На экране появиться:____50.00(символ "_" означает пробел)
Можно сказать так: Под вывод числа отведено 9 позиций(знакомест xD), из них 2 - под кол-во знаков после запятой.
Думаю тут всё ясно...

Переменные

Для того чтобы юзать переменную в Паскале, её необходимо описать.
Для описания переменных служит специальный раздел программы или как я бы сказал "тег":
Var
Этот тег должен быть до начала исполнения, то есть до начала Begin!
Приведём пример, который выводит на экран значение квадратного корня числа:
Code
Var A: real;
Begin
Write('Введите число');
Readln(A);
Writeln('квадратный корень числа', A:0:5, ' равен ', sqrt(A):0:5);
Readln;
End.

Слово real обозначает собой тип, к которому относиться переменная A.
Процедура Readln() предназначена для ввода значения переменной.
Вот такая бадья...

Ну так вот, давайте составим алгоритм решения задачи, которая будет вычислять сколько времени будет падать тело, брошенное с высоты h вниз без учёта сопротивления воздуха.
В программе мы будем юзать 2 переменные H и T0
Code
Var
Begin
Write('Введите начальную высоту тела, м');
ReadLn(H);
T0:=sqrt(2*H/9.8);
Writeln('Тело будет падать с высоты ', H:0:2, ' м ', T0:0:2,' сек.');
End.


Тут думаю объяснять особо не надо.

Линейные алгоритмы

Как говорила моя знакомая учительница, с хорошим чувством юмора: "Для решения линейных уравнений, линейка не нужна".
Пример: Требуется написать программу, которая решала бы самое простое линейное уравнение ax + b = 0
Как говорит кэп, должны рассматриваться случаи, когда a равно нулю и a не равно нулю, кроме того, при a = 0 возможны 2 случая: если b = 0, то уравнение обращается в тождество.
Сделаем простую программу для решения уравнений:
Code
Var
Begin
Write('Введите коэффициенты A и B: ');
Readln(A, B);
if A=0 then
if B=0 then Writeln(' Бесконечное множество решений ')
else Writeln(' Решений нет ')
else Writeln('x=',-b/a:0:3);
Readln
End.

Рассмотрим ещё 1 пример:
Code
Var C,D,F: real;
Begin
Write('Введите числа C и D'_;
ReadLn(C,D);
if C<D then begin
F:=C;
C:=D;
D:=F;
end;
Writeln('C=',C:0:2,' D=',:0:2);
Readln;
End.



Циклические алгоритмы

Картошка почти сварилась, но и мы уже почти заканчиваем)
Очень часто надо заставить некоторый фрагмент программы повторяться много раз.
Кол-во повторений мб фиксированным., а мб заранее неизвестным, далее рассмотрим, что это за фигня...

Рассмотрим вначале с фиксированным числом повторов , это - Цикл For.
В Паскале есть 2 формы записи for:цикл с автоинкрементом и цикл с автодекрементом о_О.
Но это не так сложно, как кажется.
В первом случае будет увеличиваться на 1, а во втором уменьшаться на 1.
С автоинкрементом.
(For цикловая переменная: = начальное значение
to конечное значение do оператор)
С автодекрементом.
(For цикловая переменная: = начальное значение
downto конечное значение do оператор)
Пример 1, вывести в строку числа 1,2,3,...10:
Code
Var i: integer;
Begin
For i:=to 10 do Write(i:4);
End.


Пример 2, Вычислить сумму чисел 0(2)+0.1(2)+...+0.9(2)+1(2).
Code
Var
i: integer;
sum: real;
Begin
sum:=0;
For i:=0 to 10 do
sum:=sum+sqr(i/10);
Writeln(sum);
End.

Вот такие пирожки.

Уж перестану вас мучить и закончу, а на преобразовании условий и циклов, и остальную инф-ию, которая будет разлагать ваш моск оставлю на потом.

Ух ты! Вы прочитали до конца! :D Значит вам реально интересно...
А теперь составьте несколько прог и поставьте мне плюсик ^-^
А да...и не забудьте назвать меня Няшкой!


R.I.P.
 
Вормус
Проверенные
Сообщений: 565
Реп: 20 / Инв: 14
ReadMe, название темы смени - оно мне мозги сверлит.

Rorshach, Hitman 27 и многие прочие уже нас покинули - кто следующий?....
 
Lex-Serest
Админы
Сообщений: 825
Реп: 83 / Инв: 14
Мои уроки были хоть и были бредовыми, но тем не менее я не совершал ошибок в исходниках...
Очень много информации которая была в прошлых уроках...
Если уж начинать все с начала, то разъясни что есть что, например, что такое типы переменных и их числовые значения...


:3
 
ReadMe
Проверенные
Сообщений: 1307
Реп: 77 / Инв: 3
Lex-Serest, а этого не было в твоих уроках? оО

R.I.P.
 
God
Заблокированные
Сообщений: 164
Реп: 1
Не хочу резко осуждать сие творения, но не заметить такие грубые ошибки очень сложно.
Во-первых: Я не шаман, бл*ать.
Во-вторых: Кто отменял приведение типов?
Code

Begin  
Writeln('37*23+4='+inttostr(37*23+4));  
End.

Либо используем операцию конкатенации и функцию перевода типа, либо
Code

Begin  
Writeln('37*23+4=',37*23+4);  
End.

ставим запятую. На сколько я знаю в обычном паскале так делать можно и это тоже является некоторым подобием того что сверху.
В-третьих, готов поклястся, что вчера операция вычитание обозначалась "-". Возможно, можно и вопросиком, но такое, честно, вижу в первый раз.
Quote (ReadMe)
? вычитание Writeln(8?9); -1

Опять же, процитирую лекса, очень много информации из прошлых уроков.
В-пятых, мне не нравится то, что урок не посвещён чему-то одному. Получается так что я читаю про выполнение арефметических действий, а потом вдруг читаю про переменные и циклы О_о ИМХО, но мозг от этого сильно плющит.
Опять же, нужно стараться писать как можно проще. Я помнимаю, преинкремент, предекремент - это хорошие, годные и главное нужные слова, но когда задачи такие:
Quote

Вычислить сумму чисел 0(2)+0.1(2)+...+0.9(2)+1(2).

то, тут уже *пф*! Возможно я просто устал и сейчас не в состоянии решать это, но блин что в скобках я не понимаю Т_Т.
И ещё раз цитирую лекса: начни с переменных. Он уже рассказывал о них, а ты добавь. Расскажи к примеру о приведении типов, о том что можно делать со строками (функции которые произхводят операции над строками О_о чё сказал?), ну ты понел, (наверное). А так, неплохо.
 
ReadMe
Проверенные
Сообщений: 1307
Реп: 77 / Инв: 3
God, всё ясно.
Просто новичок и многое могу не так понять и разъяснить
Постараюсь всё исправить.
А насчёт в скобках, я забыл указать это степени числа
Code
тег <sup>


R.I.P.
 
God
Заблокированные
Сообщений: 164
Реп: 1
ReadMe, а ну тогда всё ясно. Это... как бы... ты бы хоть подправил сабж.
 
Форум » Моддинг » Программирование (Уроки, Вопросы, Идеи) » Алгоритмы
  • Страница 1 из 1
  • 1
Поиск: