1 Востаннє редагувалося Ярослав (14.05.2015 21:21:03)

Тема: Як складати блок-схеми алгоритмів

Вітаю!

На дисципліні "Інформатика" студентів вчать складати блок-схеми, оскільки вони допомагають дослідити процес виконання програми і спрощують її написання в майбутньому. Більше ви можете прочитати в Вікіпедії.

Давайте розглянемо процес складання блок-схем на прикладі 2 програм, написаних на мові C (Сі).

1) Програма Hello, world!

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("Hello, world!\n");
    return 0;
}

Аналізуємо:
Головним чином, наша програма виконує єдину функцію - вивід рядка за допомогою функції printf(), давайте зобразимо це за допомогою блок-схем
https://i.imgur.com/UvFCg6F.png

2) Програмний код, представлений користувачем koala

#include<stdio.h>
#include<limits.h>
 
#define TYPE unsigned char
 
char *toBinary(TYPE number, char *buffer, int bufferSize)
{
  int i;9:52 06.05.2013
  for(i = bufferSize-2; i >= 0; i--, number /= 2)
    buffer[ i ] = (number % 2) + '0';
  buffer[bufferSize-1] = '\0';
  return buffer;
}
 
int main()
{
  TYPE x = 73, mask1 = 9, mask2 = 128;
  const int binaryXSize = CHAR_BIT * sizeof(TYPE) + 1;
  char binaryX[binaryXSize];

  printf("pochatkove chislo = %d\n", x);
  printf("chyslo u dviykoviy systemi = %s\n", toBinary(x,binaryX,binaryXSize) );

  x &= ~mask1;
  x ^= mask2;

  printf("chislo z maskamy = %d\n", x);
  printf("chyslo u dviykoviy systemi = %s\n", toBinary(x,binaryX,binaryXSize) );
 
  getchar();
  return 0;
}

Аналізуємо:

  1. В першому блоці опишемо ініціалізацію змінних та масиву, які будуть в подальшому використовуватись

  2. Перший блок виводу (двічі використана функція printf()) зобразимо паралелограмом.

  3. Так як ф-я toBinary() надається printf() в якості аргументу, то зобразимо її прямокутником для зображення підпроцесів (із відрізками всередині), до того ж цей прямокутник зобразимо обабіч printf() для наочності. Запишемо назву функції та аргументи, які будуть їй передані в цій фігурі.

  4. Наступним кроком буде застосовування побітових операцій відносно змінної x, зобразимо це в прямокутнику, його ж розмістимо уже під паралелограмом.

  5. Після цього знову ж зобразимо блок printf() по аналогії із кроком 3 та 4.

  6. Наступними будуть викликані функції getch() та return, тож додамо іще два прямокутники під паралелограмом і запишемо в них назву цих функцій відповідно.

  7. В результаті цієї роботи отримаємо таку схему:
    https://i.imgur.com/24LjDJT.png

Також треба описувати підпроцеси. В цьому прикладі в якості підпроцесу виступає функція toBinary(). koala склав блок-схему для її опису, обов’язково переглянте її: http://replace.org.ua/post/10786/#p10786.

Програмісти значно спростили нам життя тим, що написали купу програм для побудови блок-схем автоматично, ось деякі з них:
http://vicking.narod.ru/flowchart/
http://www.gliffy.com/gliffy/#templateI … p;signup=1
http://www.smartdraw.com/specials/block-diagram.htm
Я робив схеми в MS Visio

Надзвичайно вичерпна інформація разом із прикладами знаходиться в додкатку

2

Re: Як складати блок-схеми алгоритмів

Тему зафіксовано вгорі Розділу як важливу.
Може, завдяки їй поменшає халяво-тем...

Re: Як складати блок-схеми алгоритмів

Будемо відсилати сюди горе студентів, які просять скрафтити їм блок-схему.

Подякували: ostap34PHP, 221VOLT2

4 Востаннє редагувалося koala (01.05.2013 22:40:31)

Re: Як складати блок-схеми алгоритмів

Дуже шкідлива стаття, що чудово ілюструє стандартні помилки, які роблять студенти (і, на жаль, деякі викладачі, що не стикалися із програмуванням за межами свого ВНЗ) стосовно блок-схем.

По-перше, блок-схеми є допоміжним засобом зображення алгоритму, призначеним для прочитання людиною. Відповідно, нема жодного сенсу копіювати програму до блок-схеми 1 в 1; більше того, таке копіювання тільки погіршує зрозумілість схеми (якби людина хотіла прочитати всю програму, вона б і читала всю програму, правда ж?). Відповідно, все, що є несуттєвим для розуміння роботи алгоритму, можна сміливо пропускати або замінювати на загальний опис (кандидати на викидання: проголошення змінних, вивід для забезпечення діалогу, директиви компілятору).

По-друге, блок-схему бажано складати до написання програми або під час написання - хоча б в загальних рисах, а не в результаті того, що ви набидлокодили. Спочатку думаємо, потім пишемо. Ну, або взагалі не складати (розумію, що є вимоги неадекватних викладачів. На жаль.)

По-третє, у блок-схем є стандарт, без дотримання якого блок-схема стає простим малюнком. В Україні, наскільки мені відомо, діє радянський  ГОСТ 19.701-90; існує міжнародний ISO 5807:1985. Так:
- в скругленому прямокутнику зазначається вхід до програми з оточення і вихід до нього відповідними поясненнями (зазвичай словами "вхід" і "вихід" або "початок" і "кінець"); з якого переляку автор вирішив розмістити в скруглених прямокутниках включення бібліотек(!) і вивід програми(!!!) - можна тільки здогадуватися, мабуть, тому, що вони в його схибленій уяві йдуть на початку і в кінці роботи програми.
- Цикл позначається ім'ям циклу в обох керівних блоках і умовою завершення в відповідному (передумова чи постумова). Тупе копіювання конструкції for не відповідає цьому визначенню. І взагалі, зазвичай цикл позначають умовним переходом вгору.
- Всі операцію мають бути у відповідних графічних структурах, і посеред циклу також.
- Операції вводу і виводу (такі, як printf) позначаються паралелограмом.

По-четверте, програми на 30 рядків треба писати так, щоб без блок-схеми було очевидно, що вони роблять. http://uk.wikibooks.org/wiki/%D0%9D%D0% … 8F_C%2B%2B. Порівняйте:

Прихований текст
#include<stdio.h>
#include<limits.h>

#define TYPE unsigned char

char *toBinary(TYPE number, char *buffer, int bufferSize)
{
  int i;
  for(i = bufferSize-2; i >= 0; i--, number /= 2)
    buffer[ i ] = (number % 2) + '0';
  buffer[bufferSize-1] = '\0';
  return buffer;
}

int main()
{
  TYPE x = 73, mask1 = 9, mask2 = 128;
  const int binaryXSize  = CHAR_BIT * sizeof(TYPE) + 1;
  char binaryX[binaryXSize];
  
  printf("pochatkove chislo = %d\n", x);
  printf("chyslo u dviykoviy systemi = %s\n", toBinary(x,binaryX,binaryXSize) );
  
  x &= ~mask1;
  x ^=  mask2;
  
  printf("chislo z maskamy = %d\n", x);
  printf("chyslo u dviykoviy systemi = %s\n", toBinary(x,binaryX,binaryXSize) );

  getchar();
  return 0;
}
Подякували: leofun01, ostap34PHP2

5

Re: Як складати блок-схеми алгоритмів

@koala
Мені подобається ваш підхід до праці, але блок-схеми це лише дурний ритуал, що втратив сенс. Його змушують студентів робити викладачі. сьогодні актуально UML, але кому воно треба? Тож треба змиритись з цим маразмом.

Подякували: leofun01, ostap34PHP, 221VOLT3

6

Re: Як складати блок-схеми алгоритмів

koala написав:

Дуже шкідлива стаття, що чудово ілюструє стандартні помилки, які роблять студенти (і, на жаль, деякі викладачі, що не стикалися із програмуванням за межами свого ВНЗ) стосовно блок-схем.
...

Шановний пане. Я не прагнув написати статтю для конкурсу. І я запевняю вас, що моя уява цілком здорова.

7 Востаннє редагувалося koala (02.05.2013 07:23:05)

Re: Як складати блок-схеми алгоритмів

Ярослав написав:

Шановний пане. Я не прагнув написати статтю для конкурсу. І я запевняю вас, що моя уява цілком здорова.

Шановний пане, вибачте, будь ласка, за, можливо, надто різкий тон. Але я, в будь-якому разі, висловив конкретні зауваження стосовно статті. Виправте хоча б це. А то хтось прочитає, зробить за порадами і отримає двійку.

Очі.завидющі написав:

Мені подобається ваш підхід до праці, але блок-схеми це лише дурний ритуал, що втратив сенс. Його змушують студентів робити викладачі. сьогодні актуально UML, але кому воно треба? Тож треба змиритись з цим маразмом.

Блок-схеми, на жаль, найчастіше використовують саме як дурний ритуал з примусу викладачів; але проблема тут в тому, що кожна людина має свій власний підхід до програмування, і для декого блок-схема - дуже зручний робочий інструмент, тому вивчати їх, на мою думку, треба (хоча і UML було б непогано). Втім, UML зав'язаний на ООП - що ж робити тим, хто програмує поза цією парадигмою, або в кого основний сенс програми - саме алгоритм, а не тривіальна класова структура?

Подякували: leofun011

8

Re: Як складати блок-схеми алгоритмів

@koala, дана тема справді використовується тут для redirect'у халявщиків.
У реальній практиці я частіше писав алгоритми псевдокодом, аніж блок-схемами (оскільки важкий метал типу UML був занадто кропіткий та громіздкий). По суті, пост Ярослава містить не стільки приклад оформлення блок-схем, скільки живильні лінки під ним. :D

9

Re: Як складати блок-схеми алгоритмів

Я ж кажу - в кожного свій спосіб. Комусь псевдокод, комусь блок-схема, комусь скінчений автомат зручніший.

10 Востаннє редагувалося Очі.завидющі (03.05.2013 10:04:49)

Re: Як складати блок-схеми алгоритмів

Втім, UML зав'язаний на ООП - що ж робити тим, хто програмує поза цією парадигмою, або в кого основний сенс програми - саме алгоритм, а не тривіальна класова структура?

Я сам недолюблюю ООП, але в тому-то й справа, що UML універсальна мова моделювання, включно із алгоритмами і бізнес процесами, що занадто, як на мене.
Оце також ЮМЛ:
http://www.csci.csusb.edu/dick/cs201/coffee.gif
Втім. любимо ми UML не за це :) Просто при усіх рівних можливостях "класичних" та "UML" останній використовується у айті індустрії.

Подякували: Chemist-i, koala, leofun01, 221VOLT4

11

Re: Як складати блок-схеми алгоритмів

Оновив тему, прошу коментувати та критикувати.

12 Востаннє редагувалося koala (06.05.2013 12:32:03)

Re: Як складати блок-схеми алгоритмів

Ще треба додати щось на кшталт

https://www.lucidchart.com/publicSegments/view/51878682-62f0-485d-abf5-64120a0040d9/image.png

(вибачте за криві руки :) )
Це, власне, і є основний алгоритм.

13

Re: Як складати блок-схеми алгоритмів

koala, що у вас за блок з описанням "записати в кінець масиву"? Коментар, деталізація, чи ще щось?

14 Востаннє редагувалося koala (06.05.2013 12:43:18)

Re: Як складати блок-схеми алгоритмів

Коментар. Так, дійсно, там же пунктир має бути. Дякую, що помітили. Зараз...

Так, і можна оригінальний код повернути, щоб було, що порівнювати?

15

Re: Як складати блок-схеми алгоритмів

koala написав:

Так, і можна оригінальний код повернути, щоб було, що порівнювати?

Маєте на увазі - з попереднім варіантом того блоку? Чи то питання було не до мене? :)

З.І: Можете для зручності згортати великі світлинки у спойлери.

16

Re: Як складати блок-схеми алгоритмів

Так, питання було до Ярослава.
І я в курсі про спойлери і свідомо залишив блок-схему поза спойлером - бо її і обговорюємо. Буде вона (чи аналог) в старттопіку - приберу в спойлер, не питання.