Алгоритмирование и программирование

Если у вас есть вопросы по написанию программ на C/C++ или код, которым вы хотите поделиться, это можно сделать здесь

Модератор: Вася Сташевский

Ответить
Аватара пользователя

Автор темы
Вася Сташевский
Автор статей и описаний
Автор статей и описаний
Сообщения: 55
Зарегистрирован: 24 мар 2015, 20:21
Репутация: 23
Контактная информация:
Статус: Не в сети

Алгоритмирование и программирование

Сообщение Вася Сташевский » 02 апр 2015, 01:03


Алгоритмизация – это важная часть программирования. С помощью алгоритмов мы легко можем перевести код, например с С++ на PHP и т.д..

Теория:


Алгоритм – это последовательность команд, выполнение которых приводит к решению поставленной задачи. Простым языком: это определенные действия, с указанной последовательностью, которые приводят нас к результату.

Свойства алгоритмов


Различные определения алгоритма в явной или неявной форме содержат следующий ряд общих требований:
  1. Дискретность – алгоритм должен представлять процесс решения задачи как последовательное выполнение некоторых простых шагов. При этом для выполнения каждого шага алгоритма требуется конечный отрезок времени, то есть преобразование исходных данных в результат осуществляется во времени дискретно. Кому интересно, то пробейте в гугле: Дискретная математика.
  2. Детерминированность (или определённость). В каждый момент времени следующий шаг работы однозначно определяется состоянием системы. Каждое правило алгоритма должно быть четким, однозначным и не оставлять места для произвола. Благодаря этому свойству выполнение алгоритма носит формальный характер и не требует никаких дополнительных указаний или сведений о решаемой задаче.
  3. Понятность – алгоритм для исполнителя должен включать только те команды, которые ему (исполнителю) доступны, которые входят в его систему команд. Короче говоря, алгоритм должен быть понятным!
  4. Результативность (или конечность). Это свойство состоит в том, что при корректно заданных исходных данных алгоритм должен завершать работу (приводить к решению задачи) и выдавать результат за конечное число шагов.
  5. Массовость – универсальность. Это означает, что алгоритм решения задачи разрабатывается в общем виде, т.е. он должен быть применим для некоторого класса задач, различающихся лишь исходными данными. При этом исходные данные могут выбираться из некоторой области, которая называется областью применения алгоритма. Но это правило не всегда действует, в основном разрабатывается один или несколько алгоритмов для решения одной задачи . Например можно решить задачу с помощью if-then-else или с использованием switch-case.

Алгоритмы содержащие ошибки, приводит к получению неправильных результатов либо не дадут результатов вовсе. Например некоторые неправильные функции, операторы или комбинации операторов в С++ или С могут привести к краху операционной системы, в лучшем случае программа аварийно завершится, вызвав функцию abort(). Неправильно реализованный массив. [CPP]int a[10], j;//массив из десяти элементов int и переменная j типа int
for(i=0; i<100; i++) a=i;//Мы хотим, что бы цикл for выводил 100 интераций, не смотря на то, что массив из десяти элементов,
//он может привести к краху вашей ОС'и и возможно перезапишит важную информацию в памяти. [/CPP] И компилятор не выдаст ошибку, потому что С++ предназначен для профи программистов, и его задача - предоставить им возможность создать максимально эффективный код, любая проверка средствами С++ существенно замедлит выполнение программы. Если вы кодите на ассемблере и пишете неправильный код, то беды не миновать, ну кроме того, что вас остановит компилятор.

Каждое действие можно представить , как алгоритм. Следует, что алгоритмы нас окружат во всех сферах деятельности: [I]учеба, работа, производство металов
, ect.

Типы алгоритмов:
Решение любых задач состоит, как правило, из двух этапов: первый – составление алгоритма решения задачи, второй – исполнение алгоритма.
В алгоритме команды записаны одна за другой в определенном порядке. Исполняются они не обязательно в том же порядке. В зависимости от того, каков порядок исполнения команд, можно выделить три типа алгоритмов: линейные алгоритмы, разветвляющиеся алгоритмы и алгоритмы с повторениями.

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

Алгоритм решения задачи называется линейным, если исполнитель все команды алгоритма исполняет одну за другой в порядке их записи. Например рассмотрим алгоритм с чайником.


Разветвляющиеся алгоритмы

В ходе решения задач часто возникают различные ситуации, которые исполнителю приходится учитывать. От того, какая складывается ситуация, может зависеть дальнейший ход решения задачи.
Например, любые вычисления прекращаются, если выясняется, что нужно делить на нуль. При нахождении корней квадратного уравнения ход решения зависит от знака дискриминанта. Зонтик раскрывают, если идет дождь или светит жаркое солнце. Возможные ситуации учитываются при составлении алгоритма.
Ситуации оцениваются при помощи условий. Условие понимается как вопрос, на который исполнитель дает один из двух ответов – условие выполняется (условие истинно, true - T) или условие не выполняется (условие ложно, false - F).

Пример. На стоянке при въезде в гараж находится легковая или грузовая машина с работающим двигателем. Если машина легковая, то исполнитель Загонщик должен загнать её в бокс А и выключить двигатель. Если машина грузовая, то ёё нужно загнать в бокс С и выключить двигатель. Составим алгоритм действий исполнителя Загонщик.
Сначала исполнитель должен определить, какая машина находится на стоянке. Это можно сделать проверкой условия – «машина легковая». Если на стоянке находится легковая машина, то ответ будет «*да» – условие выполняется (условие истинно). Если на стоянке находится грузовая машине, то ответ будет «*нет» – условие не выполняется (условие ложно).
Используя условие «машина» легковая», запишем алгоритм.



В зависимости от ситуации исполняется одна из двух разных последовательностей команд. Рассмотрим возможные ситуации.
Ситуация 1: на стоянке легковая машина. Исполняются команды 1, 2, 4.
Ситуация 2: на стоянке грузовая машина. Исполняются команды 1, 3, 4.
Действительно, после проверки условия в команде 1 в разных ситуациях исполняются разные наборы команд. Их называют ветвями алгоритма. Исполнение алгоритма всегда идет только по одной ветви. Здесь можно провести аналог с разветвлением дороги: после разветвления одна машина может ехать только по одной дороге.
Алгоритм называется разветвляющимся, если после проверки условия в разных ситуациях исполняется один из двух разных наборов команд.
Запись алгоритма мало меняется, если для проверки ситуации выбирается противоположное условие. В алгоритме Заезд, например, можно использовать условие «машина грузовая». В этом случае изменится только команда 1, и алгоритм будет иметь вид:



Алгоритмы с повторениями
При анализе алгоритмов, рассмотренных в примерах 1 и 2, можно заметить одно общее свойство: при их исполнении каждая команда исполняется один раз или не исполняется ни разу. Но часто встречаются задачи, при решении которых одно и то же действие (или набор действий) нужно исполнить несколько раз подряд. Например, наполнить бочку водой из ведер (переливать воду в бочку из ведер, пока бочка не заполнится до краев); покрасить забор (красить дощечки забора, пока есть незакрашенные); до упора завернуть гайку (закручивать гайку, пока не завернешь её до упора). Для описания алгоритмов решения таких задач используется способ организации команд, который называют повторением. Повторение – это набор команд, который исполняется до тех пор, пока выполняется некоторое условие. При исполнении алгоритма этот набор команд может исполниться несколько раз или не исполниться ни разу. Алгоритмы, которые содержат команду повторения, называют алгоритмами с повторением.

Пример. Имеется пустое ведро. Исполнитель имеет бочку с водой и кружку. Составим алгоритм наполнения ведра водой из бочки.

Команда 1 называется командой повторения или командой цикла. Команда 2 составляет тело цикла. После того, как ведро наполнится водой, команда 2 (тело цикла) больше не исполняется. Исполнитель переходит к команде, следующей за телом цикла.
В записи алгоритма «Наполнение» команда «Налить в ведро кружку воды» встречается один раз. При исполнении алгоритма она будет исполняться до тех пор, пока ведро не наполнится водой.
В других алгоритмах тело цикла может состоять из нескольких команд. В командах повторения могут содержаться команды ветвления; в ветвях алгоритма – команды повторения.

Способы представления алгоритмов:
1. Словесная форма представления алгоритмов.Можно назвать техническим языком.
2. Блок-схемы.
3. Языки программирования.Самый основной.

Блок-схемы. Общий вид и назначение элементов блок-схем
Словесная форма достаточно удобна для записи небольших алгоритмов. Если алгоритм содержит десятки команд, то в такой форме довольно трудно проследить всевозможные разветвления. Поэтому на практике иногда используют другую форму записи алгоритмов – графическую. Графическая форма записи алгоритма называется блок-схемой.
Блок-схемы алгоритмов состоят из блоков, которые дополнены элементами словесной формы записи. Приведем графические изображения основных блоков:
http://i60.fastpic.ru/big/2013/0921/dc/44a4e28d32721adab3923f8d6e9ab6dc.jpg
Внутри блока дается описание команд или условий. В блок действий записывают команду, не содержащую условий. В блок проверки условия записывают условие.
Все блоки, кроме блока Начало и блока Конец, можно нумеровать. Блоки на схемах соединяют стрелками, которые показывают последовательность исполнения алгоритма.

"Материал из икипедии"
[SPOILER="Википедия о программировании"]http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5

"ЯП бываю разные:"
Из вики
Неполнофункциональные языки


Робик
X++
ABAP/4
Awk
BCPL
GPSS
ML
MQL4
PostScript
Tcl/Tk
Pixilang
Matlab

Языки СУБД


D4
Visual DataFlex
Progress 4GL
DataFlex
Clarion
FoxPro

SQL

PL/SQL
SQL-92

xBase

dBase
Clipper

Полнофункциональные языки (по парадигмам)

Планкалкюль — первый язык высокого уровня
Ассемблеры

Аспектно-ориентированные языки


AspectC++
AspectJ
AspectLua (расширение Lua)
CaesarJ
Compose*
ObjectTeams

Структурные

ПЛ/1
PL/M
Алгол
Алгол 68
Basic
Cg
JOVIAL
QBASIC
Модула
Фортран
Pascal
REXX
sh
Упрощённый Алгол
Фокал

Процедурные

Occam
Алгоритмический язык
Би
Си
Euphoria
КОБОЛ
Limbo
Lua
Maple
MATLAB
Модула-2
Оберон
Паскаль
PureBasic — компилируемая модификация Basic
Рапира

Логические

Prolog
Mercury

Программирование в ограничениях


Mozart

Объектно-ориентированные

Ada
Активный Оберон
Action Script
C++
C++/CLI
C#
ColdFusion
D
Delphi
Dylan
Eiffel
Groovy
haXe
Io
Java
JavaScript
Компонентный Паскаль
MC#
Модула-3
Оберон
Objective-C
Object Pascal
Perl
Pike
PHP
Python
Ruby
Self
Simula
Smalltalk
Visual Basic
Visual DataFlex
Vala
Zonnon

Функциональные

Cat
Clean
Dylan
Erlang
F#
Gentee
Haskell
Hope
J
OCaml
Mathematica
Scheme
АПЛ
Лисп
Лого
РЕФАЛ

Мультипарадигмальные


Активный Оберон
Delphi (язык программирования)
Curry
Erlang
Компонентный Паскаль (Component Pascal)
Mozart
Mathematica
Nemerle
Scala
Zonnon

По отдельному признаку

Графические языки

FBD
ДРАКОН
Visual DataFlex

Для промышленной автоматизации


(стандарта IEC61131-3)

FBD
IL
ST или SCL
Sequential Function Chart
Ladder Diagram
SPCLK

Стековые

PostScript
Forth
NetP

Параллельные

Ada
Активный Оберон — созданный на основе языка Oberon
Afnix — ранее назывался Aleph, не имеет отношения к Alef
Alef — для системного программирования в ранних версиях Plan 9 из лаборатории Bell
ChucK
Cilk
C#
Active C#
Cω — C Omega, расширение C#
MC#
Parallel C#
Clojure диалект Lisp для Java Virtual Machine
ConcurrentLua — расширение Lua
Concurrent Pascal от Brinch-Hansen
Corn
Curry
E (язык программирования)
Eiffel — через SCOOP механизм (Simple Concurrent Object-Oriented Computation)
Erlang
Java
Join Java
X10
Join-calculus
Joule
Limbo — относится к Alef, используется в Inferno (операционная система)
MultiLisp — вариант Scheme с поддержкой паралльности
occam —
occam-π — современный вариант occam, which π-исчислением
Oz — мультипарадигмальный язык
Mozart — мультиплатформенный Oz
Pict
SR
Zonnon — созданный на основе языков Активный Оберон и Модула-2
Т++
"Докладное сравнение всех ЯП"
http://ru.wikipedia.org/wiki/%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F



Практика:


Изобразим алгоритм с чайником в виде блок схемы.
http://i60.fastpic.ru/big/2013/0921/ef/79fb2e22ff08611dc8af08ae945dfeef.jpg
Алгоритм заезд.
http://i57.fastpic.ru/big/2013/0921/2f/73d36a9cdb5760f7fc56907d3dec692f.jpg
Алгоритм ведро. Здесь мы используем цикл вайл, который наполняет ведро, если ведро полное, завершаем действие.
http://i57.fastpic.ru/big/2013/0921/70/5a19f13a9a7e37f2ca2bc7d01c280070.jpg
Кто знает другие ЯП и не лень перевести этот код для примера, переведите. Жаль, но кроме С++ и немного паскаль не знаю ничего.

Код: Выделить всё

#include <iostrem>
#include <conio.h>
using namespace sdt;
int main(){
int a;
cout << "Enter a: \n";
cin >> a;
if (a<0) cout << "Chislo " << a << "otricatelno.";
else cout << "Chislo " << a << "pologitelno.";
_getch();
return 0;
}

"Для программов"
Тех. речь
Нужно создать целочисленную переменную.
Вывести на экран сообщение "Введите а"
Задаем переменной а значение
Если а меньше 0, то вывести на экран "Число а отрицательно"
Если а больше нуля вывести на экран "Число а положительно"


pwcode перевел на делфи

Код: Выделить всё

var i: integer;
begin
ShowMessage('Введите a в eidt1');
a:= strtoint(edit1.text);
if a<0 then ShowMessage('Число a  - отрицательно') else if a>0 then ShowMessage('Число a - положительно');
end;
   

Я перевел на паскаль

Код: Выделить всё

program rubu;
var a : integer;
begin
     write('Vvedite a ');
     readln(a);
     if a<0 then
        begin
             writeln('Chislo otricatelno ',a)
        end
     else
         begin
              writeln('Chislo polositelno ',a);
         end;
 readln
   
end.


ZoRKeG перевел на PHP

Код: Выделить всё

<?php
$a = $_POST["a"];
if(!empty($a)){
if($a<0){echo 'Число а отрицательно';}
elseif($a>0){echo 'Число а положительно';}
else{echo ('<form method="post"><br><input name="a" size="25"><br><input type="submit" value="send">');
}
?>


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

Пример перевода.


Используя тех.речь переводим. Перевод: Создайте переменную i целочисленного типа.
Код снизу будет на Pascal

Код: Выделить всё

var i : integer;

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

*да - true(T)
*нет - false(F)

В статье использовались разные источники, в основном из книг Герберта Шилдта + vladyxa13 материал.
P.S. Предлагаю создать раздел программирования.

Аватара пользователя

solomax
Автор статей и описаний
Автор статей и описаний
Сообщения: 80
Зарегистрирован: 22 май 2014, 22:17
Репутация: 16
Откуда: Саратов
Контактная информация:
Статус: Не в сети

Алгоритмирование и программирование

Сообщение solomax » 27 апр 2015, 01:20


Вася Сташевский писал(а):Источник цитаты P.S. Предлагаю создать раздел программирования.

Полностью согласен :) Сам не против от создания такого раздела.

Аватара пользователя

DesignerMix
Администратор
Администратор
Сообщения: 4451
Зарегистрирован: 25 апр 2014, 10:51
Есть ответ: 170
Репутация: 547
Откуда: Белгород
Контактная информация:
Статус: Не в сети

Алгоритмирование и программирование

Сообщение DesignerMix » 27 апр 2015, 11:02


solomax, я не против, но только при условии что либо вы либо Вася Сташевский будут поддерживать темы в этом разделе так как у меня совсем нет ни опыта ни знаний в области программирования. Хотя опыт небольшой есть в PHP, но это было давно...

Аватара пользователя

Автор темы
Вася Сташевский
Автор статей и описаний
Автор статей и описаний
Сообщения: 55
Зарегистрирован: 24 мар 2015, 20:21
Репутация: 23
Контактная информация:
Статус: Не в сети

Алгоритмирование и программирование

Сообщение Вася Сташевский » 29 апр 2015, 22:12


DesignerMix писал(а):solomax, либо Вася Сташевский
я согласен, готов поддерживать раздел.

Аватара пользователя

DesignerMix
Администратор
Администратор
Сообщения: 4451
Зарегистрирован: 25 апр 2014, 10:51
Есть ответ: 170
Репутация: 547
Откуда: Белгород
Контактная информация:
Статус: Не в сети

Алгоритмирование и программирование

Сообщение DesignerMix » 29 апр 2015, 22:33


Вася Сташевский, Понял. Значит в ближайшее время попробую сделать. На сколько я понимаю нужно будет этот раздел разбить по языкам программирования?
Я вижу структуру примерно так:
1. Категория называется "Программирование"
2. В категории есть форумы вроде "Программирование на C++", "Программирование на PHP" и т.д. Но вот тут вопрос - в чем именно вы готовы поддерживать пользователей?
3. В форумах можно сделать подфорумы, например "Вопросы о программировании на C++", "Примеры программ на C++" и т.д. Но можно ограничиться только форумом без подфорумов.

Прошу сориентировать меня, что-бы создать категорию удобную для пользователей. Спасибо.

Аватара пользователя

Автор темы
Вася Сташевский
Автор статей и описаний
Автор статей и описаний
Сообщения: 55
Зарегистрирован: 24 мар 2015, 20:21
Репутация: 23
Контактная информация:
Статус: Не в сети

Алгоритмирование и программирование

Сообщение Вася Сташевский » 30 апр 2015, 12:58


DesignerMix писал(а):Вася Сташевский, Понял. Значит в ближайшее время попробую сделать. На сколько я понимаю нужно будет этот раздел разбить по языкам программирования?
Я вижу структуру примерно так:
1. Категория называется "Программирование"
2. В категории есть форумы вроде "Программирование на C++", "Программирование на PHP" и т.д. Но вот тут вопрос - в чем именно вы готовы поддерживать пользователей?
3. В форумах можно сделать подфорумы, например "Вопросы о программировании на C++", "Примеры программ на C++" и т.д. Но можно ограничиться только форумом без подфорумов.

Прошу сориентировать меня, что-бы создать категорию удобную для пользователей. Спасибо.

Предлагаю сделать 2 раздела "с/с++" и "другие языки", с первым все понятно в во втором сделать подразделы "php, Delphi,Java, и другие". Готов помогать пользователям с первым разделом.

Аватара пользователя

DesignerMix
Администратор
Администратор
Сообщения: 4451
Зарегистрирован: 25 апр 2014, 10:51
Есть ответ: 170
Репутация: 547
Откуда: Белгород
Контактная информация:
Статус: Не в сети

Алгоритмирование и программирование

Сообщение DesignerMix » 30 апр 2015, 13:49


Вася Сташевский, Создал раздел и форум, перенес эту тему в него. Сейчас выдам вам права модератора в разделе программирование.

Подумаю как лучше поступить дальше. Спасибо за участие!


sanktum
Постоянный пользователь
Сообщения: 66
Зарегистрирован: 16 июл 2014, 22:36
Есть ответ: 1
Репутация: 1
Статус: Не в сети

Алгоритмирование и программирование

Сообщение sanktum » 31 июл 2015, 22:06


рассмотрим программу "Hello, world":

using System;
class Hello{
static void Main() {
Console.WriteLine("hello, world");
}
}
Поместите эту программу в файл hello.cs и скомпилируйте ее командой
csc hello.cs
В результате вы получите файл hello.exe, запустив который, вы увидите надпись "hello, world".
В C# была унифицирована система типов, теперь вы можете рассматривать каждый тип как объект. Несмотря на то, используете вы класс, структуру, массив или встроенный тип, вы можете обращаться к нему как к объекту. Объекты собраны в пространства имен (namespaces), которые позволяют программно обращаться к чему-либо. Это значит что вместо списка включаемых файлов заголовков в своей программе вы должны написать какие пространства имен, для доступа к объектам и классам внутри них, вы хотите использовать. В C# выражение using позволяет вам не писать каждый раз название пространства имен, когда вы используете класс из него. Например, пространство имен System содержит несколько классов, в том числе и Console. И вы можете писать либо название пространства имен перед каждым обращением к классу либо использовать using как это было показано в примере выше.
Статический метод Main - точка входа в программу. Этот метод обязательно должен быть статическим. Далее в нашем примере используется метод WriteLine из класса System.Console. Этот метод отправляет строку на стандартный вывод.