diff --git a/kumir/KumirLexer.g4 b/kumir/KumirLexer.g4 new file mode 100644 index 0000000000..814bf4400f --- /dev/null +++ b/kumir/KumirLexer.g4 @@ -0,0 +1,143 @@ +// KumirLexer.g4 +// ANTLR v4 Lexer Grammar for the Kumir language. +// Source: Refined based on official documentation and extensive testing +// against K.Y. Polyakov's examples. Developed collaboratively. +// Author: [Your Name/GitHub Handle] +// License: MIT License + +lexer grammar KumirLexer; + +options { caseInsensitive = true; } + +// --- Keywords (Core Language) --- +// Keywords are case-insensitive (both lowercase and uppercase Cyrillic are matched). +MODULE : 'модуль'; +ENDMODULE : ('конец' WS 'модуля' | 'конецмодуля' | 'конец_модуля'); +ALG_HEADER : 'алг'; +ALG_BEGIN : 'нач'; +ALG_END : 'кон'; +PRE_CONDITION : 'дано'; +POST_CONDITION : 'надо'; +ASSERTION : 'утв'; +LOOP : 'нц'; +ENDLOOP_COND : ('кц' WS 'при' | 'кц_при'); +ENDLOOP : 'кц'; +IF : 'если'; +THEN : 'то'; +ELSE : 'иначе'; +FI : 'все'; +SWITCH : 'выбор'; +CASE : 'при'; +INPUT : 'ввод'; +OUTPUT : 'вывод'; +ASSIGN : ':='; +EXIT : 'выход'; +PAUSE : 'пауза'; +STOP : 'стоп'; +IMPORT : 'использовать'; +FOR : 'для'; +WHILE : 'пока'; +TIMES : 'раз'; +FROM : 'от'; +TO : 'до'; +STEP : 'шаг'; +NEWLINE_CONST : 'нс'; +NOT : 'не'; +AND : 'и'; +OR : 'или'; +OUT_PARAM : 'рез'; +IN_PARAM : 'арг'; +INOUT_PARAM : ('аргрез' | 'арг' WS 'рез' | 'арг_рез'); +RETURN_VALUE : 'знач'; + +// --- Data Types --- +INTEGER_TYPE : 'цел'; +REAL_TYPE : 'вещ'; +BOOLEAN_TYPE : 'лог'; +CHAR_TYPE : 'сим'; +STRING_TYPE : 'лит'; +TABLE_SUFFIX : 'таб'; +// Actor-specific types +KOMPL_TYPE : 'компл'; +COLOR_TYPE : 'цвет'; +SCANCODE_TYPE : 'сканкод'; +FILE_TYPE : 'файл'; +// Explicit array/table types (handle variations with space, no space, underscore) +INTEGER_ARRAY_TYPE : ('цел' WS? 'таб' | 'цел_таб'); +REAL_ARRAY_TYPE : ('вещ' WS? 'таб' | 'вещ_таб'); +CHAR_ARRAY_TYPE : ('сим' WS? 'таб' | 'сим_таб'); +STRING_ARRAY_TYPE : ('лит' WS? 'таб' | 'лит_таб'); +BOOLEAN_ARRAY_TYPE : ('лог' WS? 'таб' | 'лог_таб'); + +// --- Constants --- +TRUE : 'да'; +FALSE : 'нет'; +// Color constants +PROZRACHNIY : 'прозрачный'; +BELIY : 'белый'; +CHERNIY : 'чёрный' | 'черный'; +SERIY : 'серый'; +FIOLETOVIY : 'фиолетовый'; +SINIY : 'синий'; +GOLUBOY : 'голубой'; +ZELENIY : 'зелёный' | 'зеленый'; +ZHELTIY : 'жёлтый' | 'желтый'; +ORANZHEVIY : 'оранжевый'; +KRASNIY : 'красный'; + +// --- Operators --- +POWER : '**'; +GE : '>=' | '≥'; +LE : '<=' | '≤'; +NE : '<>' | '≠'; +PLUS : '+'; +MINUS : '-'; +MUL : '*'; +DIV : '/'; +EQ : '='; +LT : '<'; +GT : '>'; +LPAREN : '('; +RPAREN : ')'; +LBRACK : '['; +RBRACK : ']'; +LBRACE : '{'; +RBRACE : '}'; +COMMA : ','; +COLON : ':'; +SEMICOLON : ';'; +ATAT : '@@'; +AT : '@'; +DIV_OP : 'div'; +MOD_OP : 'mod'; + +// --- Literals --- +CHAR_LITERAL : '\'' ( EscapeSequence | ~['\\\r\n] ) '\'' ; +STRING : '"' ( EscapeSequence | ~["\\\r\n] )*? '"' + | '\'' ( EscapeSequence | ~['\\\r\n] )*? '\'' + ; +REAL : (DIGIT+ '.' DIGIT* | '.' DIGIT+) ExpFragment? + | DIGIT+ ExpFragment + ; +INTEGER : DecInteger | HexInteger ; + +// --- Identifier --- +ID : LETTER (LETTER | DIGIT | '_' | '@')* ; + +// --- Comments --- +LINE_COMMENT : '|' ~[\r\n]* -> channel(HIDDEN); +DOC_COMMENT : '#' ~[\r\n]* -> channel(HIDDEN); + +// --- Whitespace --- +WS : [ \t\r\n]+ -> skip; + +// --- Fragments --- +fragment DIGIT : [0-9]; +fragment HEX_DIGIT : [0-9a-fA-F]; +fragment LETTER : [a-zA-Zа-яА-ЯёЁ]; +fragment DecInteger : DIGIT+; +fragment HexInteger : '$' HEX_DIGIT+; +fragment ExpFragment: [eE] [+-]? DIGIT+; +fragment EscapeSequence + : '\\' [btnfr"'\\] + ; \ No newline at end of file diff --git a/kumir/KumirParser.g4 b/kumir/KumirParser.g4 new file mode 100644 index 0000000000..b9db926ea0 --- /dev/null +++ b/kumir/KumirParser.g4 @@ -0,0 +1,385 @@ +// KumirParser.g4 +// ANTLR v4 Parser Grammar for the Kumir language. +// This version correctly handles complex algorithm names (including keywords/numbers) +// by using a specific rule `algorithmNameTokens` in the header. +// Source: Refined based on official documentation and extensive testing +// against K.Y. Polyakov's examples. Developed collaboratively. +// Author: [Your Name/GitHub Handle] +// License: MIT License + +parser grammar KumirParser; + +options { tokenVocab=KumirLexer; } // Use tokens from KumirLexer.g4 + +/* + * ============================================================================= + * Helper Rules: Literals, Identifiers, Expressions + * (Defined first as they are used by higher-level rules) + * ============================================================================= + */ +qualifiedIdentifier + : ID // Currently simple ID, can be extended for module.member later + ; + +literal + : INTEGER | REAL | STRING | CHAR_LITERAL | TRUE | FALSE | colorLiteral | NEWLINE_CONST + ; + +colorLiteral + : PROZRACHNIY | BELIY | CHERNIY | SERIY | FIOLETOVIY | SINIY | GOLUBOY | ZELENIY | ZHELTIY | ORANZHEVIY | KRASNIY + ; + +expressionList // Used inside array literals {} + : expression (COMMA expression)* + ; + +arrayLiteral // e.g., {1, 2, 3} + : LBRACE expressionList? RBRACE + ; + +// Expressions are defined from lowest to highest precedence +primaryExpression // The most basic elements + : literal + | qualifiedIdentifier // Variable or function call without arguments + | RETURN_VALUE // 'знач' keyword + | LPAREN expression RPAREN // Parenthesized expression + | arrayLiteral + ; + +argumentList // e.g., (a, b+c, 5) + : expression (COMMA expression)* + ; + +indexList // e.g., [i], [i, j], [k:m] + : expression (COLON expression)? // Single index or slice + | expression COMMA expression // 2D index + ; + +postfixExpression // Handles array/string access and function calls after a primary expression + : primaryExpression ( LBRACK indexList RBRACK | LPAREN argumentList? RPAREN )* + ; + +unaryExpression // Handles unary plus, minus, not + : (PLUS | MINUS | NOT) unaryExpression | postfixExpression + ; + +powerExpression // Handles exponentiation (**) + : unaryExpression (POWER powerExpression)? + ; + +multiplicativeExpression // Handles *, /, div, mod + : powerExpression ((MUL | DIV | DIV_OP | MOD_OP) powerExpression)* + ; + +additiveExpression // Handles +, - + : multiplicativeExpression ((PLUS | MINUS) multiplicativeExpression)* + ; + +relationalExpression // Handles <, >, <=, >= + : additiveExpression ((LT | GT | LE | GE) additiveExpression)* + ; + +equalityExpression // Handles =, <> + : relationalExpression ((EQ | NE) relationalExpression)* + ; + +logicalAndExpression // Handles 'и' (AND) + : equalityExpression (AND equalityExpression)* + ; + +logicalOrExpression // Handles 'или' (OR) + : logicalAndExpression (OR logicalAndExpression)* + ; + +expression // Top-level expression rule + : logicalOrExpression + ; + +/* + * ============================================================================= + * Data Types and Variable Declarations + * ============================================================================= + */ +typeSpecifier // Defines the type of a variable or parameter + : arrayType // e.g., целтаб + | basicType TABLE_SUFFIX?// e.g., цел, лит таб (if not matched as arrayType by lexer) + | actorType // e.g., цвет, файл + ; + +basicType // Basic built-in types + : INTEGER_TYPE | REAL_TYPE | BOOLEAN_TYPE | CHAR_TYPE | STRING_TYPE + ; + +actorType // Actor-specific types + : KOMPL_TYPE | COLOR_TYPE | SCANCODE_TYPE | FILE_TYPE + ; + +arrayType // Explicit array type tokens from lexer + : INTEGER_ARRAY_TYPE | REAL_ARRAY_TYPE | BOOLEAN_ARRAY_TYPE | CHAR_ARRAY_TYPE | STRING_ARRAY_TYPE + ; + +arrayBounds // e.g., [1:N] + : expression COLON expression + ; + +// Describes a single item in a variable declaration list, allowing optional initialization with '=' +variableDeclarationItem + : ID (LBRACK arrayBounds (COMMA arrayBounds)* RBRACK)? ( EQ expression )? + ; + +// List of variables in a declaration, e.g., i, j, k +variableList + : variableDeclarationItem (COMMA variableDeclarationItem)* + ; + +// Local variable declaration (inside нач...кон) +variableDeclaration + : typeSpecifier variableList + ; + +// Global variable declaration (outside algorithms) +globalDeclaration + : typeSpecifier variableList SEMICOLON? + ; + +// Global assignment (using :=) +globalAssignment + : qualifiedIdentifier ASSIGN (literal | unaryExpression | arrayLiteral) SEMICOLON? + ; + +/* + * ============================================================================= + * Algorithm Parameters + * ============================================================================= + */ +// Single parameter declaration (e.g., арг цел n, рез лит s) +parameterDeclaration + : (IN_PARAM | OUT_PARAM | INOUT_PARAM)? typeSpecifier variableList + ; + +// List of parameters in parentheses +parameterList + : parameterDeclaration (COMMA parameterDeclaration)* + ; + +/* + * ============================================================================= + * Algorithm Names + * ============================================================================= + */ +/** + * algorithmNameTokens: Captures all tokens that constitute the algorithm name. + * It consumes any token (.) as long as the lookahead (LA(1)) is not one of the + * stop tokens (LPAREN, ALG_BEGIN, PRE_CONDITION, POST_CONDITION, SEMICOLON, EOF). + * This allows names like "Сумма И счетчик" or "Факториал 100". + * The `+` ensures at least one token is consumed for the name. + */ +algorithmNameTokens + : ~(LPAREN | ALG_BEGIN | PRE_CONDITION | POST_CONDITION | SEMICOLON | EOF)+ + ; + +/** + * algorithmName: Used only for checking the name after the 'кон' keyword. + * Kept stricter (ID+) for this purpose. + */ +algorithmName: ID+ ; + + +/* + * ============================================================================= + * Algorithm Structure + * ============================================================================= + */ +/** + * algorithmHeader: Defines the algorithm header. + * Structure: алг [type]? NAME [(parameters)]? [;]? + * Uses algorithmNameTokens to capture the potentially complex name. + */ +algorithmHeader + : ALG_HEADER typeSpecifier? algorithmNameTokens (LPAREN parameterList? RPAREN)? SEMICOLON? + ; + +// Pre-condition block (дано) +preCondition + : PRE_CONDITION expression SEMICOLON? + ; + +// Post-condition block (надо) +postCondition + : POST_CONDITION expression SEMICOLON? + ; + +// Algorithm body (sequence of statements) +algorithmBody + : statementSequence + ; + +// Sequence of statements +statementSequence + : statement* + ; + +/** + * lvalue: Left-hand side of an assignment (what is being assigned to). + * Can be a variable, array element, or the special 'знач'. + */ +lvalue + : qualifiedIdentifier (LBRACK indexList RBRACK)? // Variable or array element + | RETURN_VALUE // 'знач' for function return + ; + +// Assignment statement (using :=) or an expression statement (like a procedure call) +assignmentStatement + : lvalue ASSIGN expression + | expression + ; + +// Argument for I/O statements (вывод/ввод) +ioArgument + : expression (COLON expression (COLON expression)?)? // Expression with optional formatting + | NEWLINE_CONST // 'нс' + ; + +ioArgumentList + : ioArgument (COMMA ioArgument)* + ; + +ioStatement + : (INPUT | OUTPUT) ioArgumentList + ; + +// If statement (если ... то ... иначе ... все) +ifStatement + : IF expression THEN statementSequence (ELSE statementSequence)? FI + ; + +// Case block inside a switch (при условие : ...) +caseBlock + : CASE expression COLON statementSequence + ; + +// Switch statement (выбор ... при ... иначе ... все) +switchStatement + : SWITCH caseBlock+ (ELSE statementSequence)? FI + ; + +// Loop ending condition (кц при ...) +endLoopCondition + : ENDLOOP_COND expression + ; + +// Loop specifiers (для, пока, N раз) +loopSpecifier + : FOR ID FROM expression TO expression (STEP expression)? + | WHILE expression + | expression TIMES + ; + +// Loop statement (нц ... кц) +loopStatement + : LOOP loopSpecifier? statementSequence (ENDLOOP | endLoopCondition) + ; + +// Exit statement (выход) +exitStatement + : EXIT + ; + +// Pause statement (пауза) +pauseStatement + : PAUSE + ; + +// Stop statement (стоп) +stopStatement + : STOP + ; + +// Assertion statement (утв) +assertionStatement + : ASSERTION expression + ; + +// Procedure call statement (can also be handled via expression) +procedureCallStatement + : qualifiedIdentifier (LPAREN argumentList? RPAREN)? + ; + +// General statement rule +statement + : variableDeclaration SEMICOLON? + | assignmentStatement SEMICOLON? + | ioStatement SEMICOLON? + | ifStatement SEMICOLON? + | switchStatement SEMICOLON? + | loopStatement SEMICOLON? + | exitStatement SEMICOLON? + | pauseStatement SEMICOLON? + | stopStatement SEMICOLON? + | assertionStatement SEMICOLON? + | SEMICOLON // Allow empty statements + ; + +/** + * algorithmDefinition: Defines a complete algorithm structure. + */ +algorithmDefinition + : algorithmHeader (preCondition | postCondition | variableDeclaration)* + ALG_BEGIN + algorithmBody + ALG_END algorithmName? SEMICOLON? // Use stricter 'algorithmName' for check after 'кон' + ; + +/* + * ============================================================================= + * Module Structure + * ============================================================================= + */ +moduleName + : qualifiedIdentifier + | STRING + ; + +importStatement + : IMPORT moduleName SEMICOLON? + ; + +// Item that can appear at the program/module top level or inside module body +programItem + : importStatement + | globalDeclaration + | globalAssignment + ; + +moduleHeader + : MODULE qualifiedIdentifier SEMICOLON? + ; + +moduleBody // Body of an explicit module + : (programItem | algorithmDefinition)* + ; + +implicitModuleBody // Content of a file without explicit 'модуль' header/footer + : (programItem | algorithmDefinition)+ + ; + +moduleDefinition // Either an explicit or implicit module structure + : moduleHeader moduleBody ENDMODULE qualifiedIdentifier? SEMICOLON? + | implicitModuleBody + ; + +/* + * ============================================================================= + * Program Structure (Start Rule) + * ============================================================================= + */ +/** + * program: The main entry point for the grammar. + * A program consists of optional top-level items (imports, globals) + * followed by one or more module or algorithm definitions. + */ +program + : programItem* moduleDefinition+ EOF + ; + +// End of KumirParser.g4 \ No newline at end of file diff --git a/kumir/README.md b/kumir/README.md new file mode 100644 index 0000000000..225efa2ab7 --- /dev/null +++ b/kumir/README.md @@ -0,0 +1,51 @@ +# Kumir Grammar for ANTLR v4 + +This directory contains ANTLR v4 grammars (Lexer and Parser) for the Kumir (КуМир) programming language. Kumir is a +Russian algorithmic language primarily used for teaching programming in schools. + +## Language Features Covered + +* Core language keywords (алг, нач, кон, если, то, иначе, все, нц, кц, для, пока, etc.) +* Basic data types (цел, вещ, лог, сим, лит) and table types (целтаб, etc.) +* Common actor types (файл, цвет - others can be added if needed) +* Variable declarations (including initialization with `=`) +* Assignment (`:=`) including function result assignment (`знач := ...`) +* Expressions (arithmetic, logical, comparison) with standard operator precedence +* Control flow structures (if-then-else, switch-case, various loops: for, while, N times, simple loop) +* Procedure and function definitions (including parameters: арг, рез, аргрез) +* Algorithm names: Supports multi-word names, including those containing numbers or keywords (like `И`), as observed in + the reference Kumir IDE. This is handled by the `algorithmNameTokens` rule in the parser. +* Basic module structure (`использовать`, `модуль`, `конец модуля`) +* Comments (`|` and `#`) +* Literals (integers, reals, strings, chars, booleans `да`/`нет`, color constants) +* Array literals (`{...}`) + +## Grammar Files + +* `KumirLexer.g4`: Defines the tokens for the Kumir language. Uses UTF-8 encoding. Handles case-insensitivity for + Cyrillic keywords. It is recommended to use UTF-8 encoding **without BOM** for Kumir source files. +* `KumirParser.g4`: Defines the parsing rules based on the tokens from the lexer. Uses `tokenVocab` option. The `algorithmNameTokens` rule has been refined to robustly capture complex algorithm names without relying on target-specific semantic predicates. + +## Integration with grammars-v4 + +* `desc.xml`: This file is provided for integration with the `antlr/grammars-v4` testing infrastructure. It specifies Python 3 as the target language for this grammar and points to the example files located in the `examples/` directory. + +## Origin and Testing + +The grammar was developed based on: + +1. Official Kumir documentation (DocBook XML format). +2. Extensive iterative testing against a suite of 60 example programs (from K.Y. Polyakov's collection). +3. Analysis of the behavior of the reference Kumir 2.1.0 IDE's parser/interpreter. +4. Collaborative refinement process. + +The final version successfully parses all 60 provided test examples. + +## Usage + +These grammars are intended for use with the standard ANTLR v4 toolchain. + +Target language example (Python 3): + +```bash +antlr4 -Dlanguage=Python3 KumirLexer.g4 KumirParser.g4 -visitor -o output_dir \ No newline at end of file diff --git a/kumir/desc.xml b/kumir/desc.xml new file mode 100644 index 0000000000..2253c97bbd --- /dev/null +++ b/kumir/desc.xml @@ -0,0 +1,5 @@ + + + Python3 + examples/**/*.kum + \ No newline at end of file diff --git a/kumir/examples/2+2.kum b/kumir/examples/2+2.kum new file mode 100755 index 0000000000..bca8b2850e --- /dev/null +++ b/kumir/examples/2+2.kum @@ -0,0 +1,17 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 2. Оператор вывода +| Вход: +| нет +| Результат: +| 2+2=? +| Ответ: 4 +алг Оператор вывода +нач +вывод '2+' +вывод '2=?', нс +вывод 'Ответ: 4' +кон + + diff --git a/kumir/examples/a+b.kum b/kumir/examples/a+b.kum new file mode 100755 index 0000000000..1370012264 --- /dev/null +++ b/kumir/examples/a+b.kum @@ -0,0 +1,19 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 4. Операторы ввода, вывода, присваивания +| Вход: +| 5 7 +| Результат: +| 5+7=12 +алг Сумма чисел с оформлением +нач +цел a, b, c +вывод "Введите два целых числа: " +ввод a, b +c := a + b +вывод a,'+',b,'=', c +кон + + + diff --git a/kumir/examples/and.kum b/kumir/examples/and.kum new file mode 100755 index 0000000000..150c6f4607 --- /dev/null +++ b/kumir/examples/and.kum @@ -0,0 +1,22 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 10. Сложные условия +| Вход: +| 27 +| Результат: +| подходит +алг Сложные условия +нач +цел v +вывод 'Введите возраст: ' +ввод v +если v >= 25 и v <= 40 то +вывод 'подходит' +иначе +вывод 'не подходит' +все +кон + + + diff --git a/kumir/examples/arr-bsort-reverse.kum b/kumir/examples/arr-bsort-reverse.kum new file mode 100755 index 0000000000..cfe9b0b388 --- /dev/null +++ b/kumir/examples/arr-bsort-reverse.kum @@ -0,0 +1,39 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 42. Сортировка "камнем" +| Вход: +| 5 +| 1 +| 3 +| 5 +| 2 +| 4 +| Результат: +| После сортировки: +| 1 2 3 4 5 +алг Сортировка пузырьком +нач +цел i, N +вывод 'Введите размер массива: ' +ввод N +вывод 'Введите элементы массива:', нс +целтаб A[1:N] +нц для i от 1 до N +ввод A[i] +кц +цел j, c +нц для i от 1 до N-1 +нц для j от 1 до N-i +если A[j+1] < A[j] то +c:=A[j]; A[j]:=A[j+1]; A[j+1]:=c +все +кц +кц +вывод 'После сортировки:', нс +нц для i от 1 до N +вывод A[i], " " +кц +кон + + diff --git a/kumir/examples/arr-bsort.kum b/kumir/examples/arr-bsort.kum new file mode 100755 index 0000000000..a616363c84 --- /dev/null +++ b/kumir/examples/arr-bsort.kum @@ -0,0 +1,39 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 42. Сортировка пузырьком +| Вход: +| 5 +| 1 +| 3 +| 5 +| 2 +| 4 +| Результат: +| После сортировки: +| 1 2 3 4 5 +алг Сортировка пузырьком +нач +цел i, N +вывод 'Введите размер массива: ' +ввод N +вывод 'Введите элементы массива:', нс +целтаб A[1:N] +нц для i от 1 до N +ввод A[i] +кц +цел j, c +нц для i от 1 до N-1 +нц для j от N-1 до i шаг -1 +если A[j+1] < A[j] то +c:=A[j]; A[j]:=A[j+1]; A[j+1]:=c +все +кц +кц +вывод 'После сортировки:', нс +нц для i от 1 до N +вывод A[i], " " +кц +кон + + diff --git a/kumir/examples/arr-empty.kum b/kumir/examples/arr-empty.kum new file mode 100755 index 0000000000..d32ad69100 --- /dev/null +++ b/kumir/examples/arr-empty.kum @@ -0,0 +1,18 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 31. Объявление массивов +| Вход: +| нет +| Результат: +| нет +алг Объявление массивов +нач +целтаб A[1:5] +вещтаб V[0:5] +логтаб L[-5:5] +симтаб S[65:90] +кон + + + diff --git a/kumir/examples/arr-input.kum b/kumir/examples/arr-input.kum new file mode 100755 index 0000000000..05a413cee6 --- /dev/null +++ b/kumir/examples/arr-input.kum @@ -0,0 +1,32 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 33. Ввод элементовмассива с клавиатуры +| Вход: +| 5 +| 1 +| 2 +| 3 +| 4 +| 5 +| Результат: +| Массив задом наперёд: +| 5 4 3 2 1 +алг Ввод элементов массива с клавиатуры +нач +цел i, N +вывод 'Введите размер массива: ' +ввод N +целтаб A[1:N] +вывод 'Введите элементы массива:', нс +нц для i от 1 до N +вывод 'A[',i,']=' +ввод A[i] +кц +вывод 'Массив задом наперёд: ', нс +нц для i от N до 1 шаг -1 +вывод A[i], ' ' +кц +кон + + diff --git a/kumir/examples/arr-kvad.kum b/kumir/examples/arr-kvad.kum new file mode 100755 index 0000000000..0acb0178f1 --- /dev/null +++ b/kumir/examples/arr-kvad.kum @@ -0,0 +1,24 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 32. Заполнение и вывод массива +| Вход: +| 5 +| Результат: +| 1 4 9 16 25 +алг Заполнение И Вывод массива +нач +цел i, N +вывод 'Введите размер массива: ' +ввод N +целтаб A[1:N] +нц для i от 1 до N +A[i]:= i*i +кц +нц для i от 1 до N +вывод A[i], ' ' +кц +кон + + + diff --git a/kumir/examples/arr-msort.kum b/kumir/examples/arr-msort.kum new file mode 100755 index 0000000000..26016acb8d --- /dev/null +++ b/kumir/examples/arr-msort.kum @@ -0,0 +1,43 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 43. Сортировка выбором +| Вход: +| 5 +| 1 +| 3 +| 5 +| 2 +| 4 +| Результат: +| После сортировки: +| 1 2 3 4 5 +алг Сортировка выбором +нач +цел i, N +вывод 'Введите размер массива: ' +ввод N +целтаб A[1:N] +вывод 'Введите элементы массива: ', нс +нц для i от 1 до N +ввод A[i] +кц +цел nMin, j, c +нц для i от 1 до N-1 +nMin:= i +нц для j от i+1 до N +если A[j] < A[nMin] то +nMin:= j +все +кц +если i <> nMin то +c:=A[i]; A[i]:=A[nMin]; A[nMin]:=c +все +кц +вывод 'После сортировки:', нс +нц для i от 1 до N +вывод A[i], " " +кц +кон + + diff --git a/kumir/examples/arr-qsort.kum b/kumir/examples/arr-qsort.kum new file mode 100755 index 0000000000..2f1de7fb1b --- /dev/null +++ b/kumir/examples/arr-qsort.kum @@ -0,0 +1,43 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 44. Быстрая сортировка (QuickSort) +| Вход: +| нет +| Результат: +| После сортировки: +| 6 34 44 55 67 78 82 +цел N = 7 +целтаб A[1:N] = {78, 6, 82, 67, 55, 44, 34 } +алг Быстрая сортировка +нач +цел i +вывод 'До сортировки:', нс +нц для i от 1 до N +вывод A[i], " " +кц +qSort(1, N) +вывод нс, 'После сортировки:', нс +нц для i от 1 до N +вывод A[i], " " +кц +кон +алг qSort(цел nStart, nEnd) +нач +цел L, R, c, X +если nStart >= nEnd то выход все +L:= nStart; R:= nEnd; +X:= A[div(L+R,2)] +нц пока L <= R | разделение +нц пока A[L] < X; L:= L + 1 кц +нц пока A[R] > X; R:= R - 1 кц +если L <= R то +c:= A[L]; A[L]:= A[R]; A[R]:= c +L:= L+1; R:= R-1 +все +кц +qSort(nStart, R) | рекурсивные вызовы +qSort(L, nEnd) +кон + + diff --git a/kumir/examples/arr-rand.kum b/kumir/examples/arr-rand.kum new file mode 100755 index 0000000000..b23b5310cd --- /dev/null +++ b/kumir/examples/arr-rand.kum @@ -0,0 +1,25 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 34. Заполнение массива случайными числами +| Вход: +| 5 +| Результат: +| <5 случайных чисел от 10 до 20> +алг Заполнение массива случайными числами +нач +цел i, N +вывод 'Введите размер массива: ' +ввод N +целтаб A[1:N] +нц для i от 1 до N +A[i]:=irand(10,20) +кц +вывод 'Массив:', нс +нц для i от N до 1 шаг -1 +вывод A[i], ' ' +кц +кон + + + diff --git a/kumir/examples/arr-rev.kum b/kumir/examples/arr-rev.kum new file mode 100755 index 0000000000..c9716f8e4c --- /dev/null +++ b/kumir/examples/arr-rev.kum @@ -0,0 +1,38 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 39. Реверс массива +| Вход: +| 5 +| 1 +| 2 +| 3 +| 4 +| 5 +| Результат: +| После реверса: +| 5 4 3 2 1 +алг Реверс массива +нач +цел i, N +вывод 'Введите размер массива: ' +ввод N +целтаб A[1:N] +вывод 'Введите элементы массива: ', нс +нц для i от 1 до N +ввод A[i] +кц +цел c +нц для i от 1 до div(N,2) +c:= A[i] +A[i]:= A[N+1-i] +A[N+1-i]:= c +кц +вывод 'После реверса:', нс +нц для i от 1 до N +вывод A[i], " " +кц +кон + + + diff --git a/kumir/examples/arr-search.kum b/kumir/examples/arr-search.kum new file mode 100755 index 0000000000..53639f0776 --- /dev/null +++ b/kumir/examples/arr-search.kum @@ -0,0 +1,42 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 37. Линейный поиск с break +| Вход: +| 5 +| 1 +| 2 +| 3 +| 4 +| 5 +| 3 +| Результат: +| A[3]=3 +алг Поиск в массиве с break +нач +цел i, N +вывод 'Введите размер массива: ' +ввод N +целтаб A[1:N] +вывод 'Введите элементы массива: ', нс +нц для i от 1 до N +ввод A[i] +кц +цел X, nX +вывод 'Что ищем? ' +ввод X +nX:= 0 +нц для i от 1 до N +если A[i] = X то +nX:= i +выход +все +кц +если nX > 0 то +вывод "A[", nX, "]=", X +иначе вывод "Не нашли!" +все +кон + + + diff --git a/kumir/examples/arr-shift.kum b/kumir/examples/arr-shift.kum new file mode 100755 index 0000000000..61e9e3e3bc --- /dev/null +++ b/kumir/examples/arr-shift.kum @@ -0,0 +1,36 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 40. Циклический сдвиг массива +| Вход: +| 5 +| 1 +| 2 +| 3 +| 4 +| 5 +| Результат: +| После сдвига влево: +| 2 3 4 5 1 +алг Циклический сдвиг массива влево +нач +цел i, N +вывод 'Введите размер массива: ' +ввод N +целтаб A[1:N] +вывод 'Введите элементы массива: ', нс +нц для i от 1 до N +ввод A[i] +кц +цел c +c:= A[1] +нц для i от 1 до N-1 +A[i]:= A[i+1] +кц +A[N]:= c +вывод 'После сдвига влево:', нс +нц для i от 1 до N +вывод A[i], " " +кц +кон + diff --git a/kumir/examples/arr-sum.kum b/kumir/examples/arr-sum.kum new file mode 100755 index 0000000000..43984ee13a --- /dev/null +++ b/kumir/examples/arr-sum.kum @@ -0,0 +1,43 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 35. Сумма и количество элементов массива, +| удовлетворяющих условию +| Вход: +| 5 +| 180 +| 185 +| 170 +| 188 +| 190 +| Результат: +| Элементы 180 < x < 190: +| Количество: 2 +| Сумма: 373 +| Среднее: 186.5 +алг Сумма И счетчик в массиве +нач +цел i, N +вывод 'Введите размер массива:', нс +ввод N +целтаб A[1:N] +вывод 'Введите элементы массива:', нс +нц для i от 1 до N +ввод A[i] +кц +цел count = 0, sum = 0 +нц для i от 1 до N +если 180 < A[i] и A[i] < 190 то +count:= count + 1 +sum:= sum + A[i] +все +кц +вывод 'Элементы 180 < x < 190:', нс +вывод 'Количество: ', count, нс +вывод 'Сумма: ', sum, нс +вывод 'Среднее: ', sum/count +кон + + + + diff --git a/kumir/examples/downto.kum b/kumir/examples/downto.kum new file mode 100755 index 0000000000..621886e6ad --- /dev/null +++ b/kumir/examples/downto.kum @@ -0,0 +1,21 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 18. Цикл с перемнной (downto) +| Вход: +| 5 +| Результат: +| 32 16 8 4 2 +алг Цикл for с downto +нач +цел n, k, M +ввод M +n:= 2**M +нц для k от M до 1 шаг -1 +вывод n, " " +n:= div(n,2) +кц +кон + + + diff --git a/kumir/examples/empty.kum b/kumir/examples/empty.kum new file mode 100755 index 0000000000..59ee95e8ea --- /dev/null +++ b/kumir/examples/empty.kum @@ -0,0 +1,13 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 1.Минимальная программа на алг. языке +| Вход: нет +| Результат: нет +алг Пустая +нач +| основная программа +кон + + + diff --git a/kumir/examples/file-eof.kum b/kumir/examples/file-eof.kum new file mode 100755 index 0000000000..df73e8bcbc --- /dev/null +++ b/kumir/examples/file-eof.kum @@ -0,0 +1,32 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 59. Кумир 2.0+. +| Обработка неизвестного количества чисел +| Вход: +| целые числа в файле input_2.txt в текущем каталоге +| Результат: +| сумма чисел в файле output_2.txt в текущем каталоге +алг Чтение неизвестного количества чисел +нач +файл Fin, Fout +Fin:= открыть на чтение('input_2.txt') +цел S, x +S:= 0 +нц пока не конец файла(Fin) +ввод Fin, x +S:= S + x +кц +закрыть(Fin) +Fout:= открыть на запись('output_2.txt') +вывод Fout, S +закрыть(Fout) +кон + + + + + + + + diff --git a/kumir/examples/file-simple.kum b/kumir/examples/file-simple.kum new file mode 100755 index 0000000000..dcaf358d38 --- /dev/null +++ b/kumir/examples/file-simple.kum @@ -0,0 +1,24 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 58. Кумир 2.0+. Чтение и запись в файл +| Вход: +| целое число в файле intput_1.txt в текущем каталоге +| Результат: +| удвоенное число в файле output_1.txt в текущем каталоге +алг Работа с файлами +нач +файл Fin, Fout +цел x +Fin:= открыть на чтение('input_1.txt') +Fout:= открыть на запись('output_1.txt') +ввод Fin, x +вывод Fout, 2*x +закрыть(Fout) +закрыть(Fin) +кон + + + + + diff --git a/kumir/examples/file-sort.kum b/kumir/examples/file-sort.kum new file mode 100755 index 0000000000..cb94fd469f --- /dev/null +++ b/kumir/examples/file-sort.kum @@ -0,0 +1,49 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 60. Кумир 2.0+. +| Сортировка массива из файла +| Вход: +| массив в файле input_3.txt в текущем каталоге +| Результат: +| отсортированный массив в файле output_3.txt +| в текущем каталоге +алг Сортировка массива из файла +нач +цел MAX = 100 +целтаб A[1:MAX] + +файл Fin, Fout +Fin:= открыть на чтение('input_3.txt') +цел N = 0 +нц пока не конец файла(Fin) и N < MAX +N:= N + 1 +ввод Fin, A[N] +кц +закрыть(Fin) + +цел i, j, c +нц для i от 1 до N-1 +нц для j от N-1 до i шаг -1 +если A[j]>A[j+1] то +c:=A[j]; A[j]:=A[j+1]; A[j+1]:=c +все +кц +кц +Fout:= открыть на запись('output_3.txt') +нц для i от 1 до N +вывод Fout, A[i], нс +кц +закрыть(Fout) +кон + + + + + + + + + + + diff --git a/kumir/examples/file-str.kum b/kumir/examples/file-str.kum new file mode 100755 index 0000000000..a60a2dd736 --- /dev/null +++ b/kumir/examples/file-str.kum @@ -0,0 +1,44 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 61. Кумир 2.0+. +| Обработка символьных строк в файле +| Вход: данные о собаках в файле input_4.txt +| в текущем каталоге +| <кличка> <возраст> <порода> +| Результат: данные о собаках, которым < 5 лет, +| в файле output_4.txt в текущем каталоге +алг Обработка строк +нач +лит s, s0, sAge +цел age, p +лог OK +файл Fin, Fout +Fin:= открыть на чтение('input_4.txt') +Fout:= открыть на запись('output_4.txt') +нц пока не конец файла(Fin) +ввод Fin, s0 +s:= s0 +p:= позиция(' ', s) +s:= s[p+1:длин(s)] +p:= позиция (' ',s) +sAge:= s[1:p-1] +age:= лит_в_цел(sAge, OK) +если age < 5 то +вывод Fout, s0, нс +все +кц +закрыть(Fin) +закрыть(Fout) +кон + + + + + + + + + + + diff --git a/kumir/examples/for.kum b/kumir/examples/for.kum new file mode 100755 index 0000000000..ca28c794bb --- /dev/null +++ b/kumir/examples/for.kum @@ -0,0 +1,20 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 17. Цикл с переменной +| Вход: +| 5 +| Результат: +| 2 4 8 16 32 +алг Цикл for +нач +цел n, k, M +ввод M +n:= 2 +нц для k от 1 до M +вывод n, ' ' +n:= n * 2 +кц +кон + + diff --git a/kumir/examples/format.kum b/kumir/examples/format.kum new file mode 100755 index 0000000000..949229c120 --- /dev/null +++ b/kumir/examples/format.kum @@ -0,0 +1,23 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 6. Кумир 2.0+. Форматный вывод +| Вход: +| нет +| Результат: +| > 123< +| 1.234568 +| > 1.235< +алг Форматный Вывод +нач +цел a=123 +вывод ">", a:5, "<", нс +вещ x=1.2345678 +вывод x, нс +вывод ">", x:7:3, "<" +кон + + + + + diff --git a/kumir/examples/func-prime.kum b/kumir/examples/func-prime.kum new file mode 100755 index 0000000000..4db1f1dbce --- /dev/null +++ b/kumir/examples/func-prime.kum @@ -0,0 +1,37 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 25. Логическая функция +| Вход: +| 5 +| 7 +| 12 +| Результат: +| 5 - простое число +| 7 - простое число +алг Простые числа с логической функцией +нач +цел n +вывод 'Введите число: ' +ввод n +нц пока isPrime(n) +вывод n, ' - простое число', нс +вывод 'Введите число: ' +ввод n +кц +кон +алг лог isPrime(цел n) +нач +цел count = 0, k +k:= 2 +нц пока k*k <= n и count = 0 +если mod(n,k) = 0 то +count:=count+1 +все +k:= k + 1 +кц +знач:= (count = 0) +кон + + + diff --git a/kumir/examples/func-sumdig.kum b/kumir/examples/func-sumdig.kum new file mode 100755 index 0000000000..c223e40c78 --- /dev/null +++ b/kumir/examples/func-sumdig.kum @@ -0,0 +1,26 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 23. Функция +| Вход: +| 12345 +| Результат: +| Сумма цифр 15 +алг Сумма цифр +нач +цел N +вывод 'Введите целое число: ' +ввод N +вывод 'Сумма цифр ', sumDigits(N) +кон +алг цел sumDigits(цел n0) +нач +цел sum = 0, n +n:= n0 +нц пока n <> 0 +sum:= sum + mod(n,10) +n:= div(n,10) +кц +знач:= sum +кон + diff --git a/kumir/examples/if.kum b/kumir/examples/if.kum new file mode 100755 index 0000000000..7fbe1694ae --- /dev/null +++ b/kumir/examples/if.kum @@ -0,0 +1,26 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 9. Вложенные условные операторы +| Вход: +| 5 7 +| Результат: +| Борис старше +алг Вложенные условные операторы +нач +цел a, b +вывод 'Введите возраст Андрея и Бориса: ' +ввод a, b +если a > b то +вывод 'Андрей старше' +иначе +если a = b то +вывод 'Одного возраста' +иначе +вывод 'Борис старше' +все +все +кон + + + diff --git a/kumir/examples/longnum.kum b/kumir/examples/longnum.kum new file mode 100755 index 0000000000..d8f05434aa --- /dev/null +++ b/kumir/examples/longnum.kum @@ -0,0 +1,52 @@ +| Программа к учебнику информатики для 11 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 6. +| Программа № 2. Длинные числа (факториал 100) +| Вход: +| нет +| Результат: +| Факториал числа 100: +| 93326215443944152681... +алг Факториал 100 +нач +цел i, k, r, s, d = 1000000, N = 33 +целтаб A[0:N] +A[0]:= 1 +нц для i от 1 до N + A[i]:= 0 +кц +нц для k от 2 до 100 +r:= 0 +нц для i от 0 до N +s:= A[i]*k + r +A[i]:= mod(s,d) +r:= div(s,d) +кц +кц +вывод 'Факториал числа 100:', нс +i:= N +нц пока A[i] = 0 +i:= i - 1 +кц +вывод A[i] +нц для k от i-1 до 0 шаг -1 +Write6 ( A[k] ) +кц +кон +алг Write6 (цел x) +нач +цел M, xx +xx:= x +M:= 100000 +нц пока M > 0 +вывод div(xx, M) +xx:= mod(xx, M) +M:= div(M, 10) +кц +кон + + + + + + diff --git a/kumir/examples/loopN.kum b/kumir/examples/loopN.kum new file mode 100755 index 0000000000..c93613e1ef --- /dev/null +++ b/kumir/examples/loopN.kum @@ -0,0 +1,21 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 13. Цикл N раз +| Вход: +| 2 +| Результат: +| привет +| привет +алг Цикл N Раз +нач +цел k +вывод 'Сколько раз сделать? ' +ввод k +нц k раз +вывод 'привет', нс +кц +кон + + + diff --git a/kumir/examples/matr-declare.kum b/kumir/examples/matr-declare.kum new file mode 100755 index 0000000000..0b6d1271cf --- /dev/null +++ b/kumir/examples/matr-declare.kum @@ -0,0 +1,17 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 55. Объявление матриц +| Вход: +| нет +| Результат: +| нет +алг Объявления матриц +нач +цел N = 3, M = 4 +целтаб A[1:N,1:M] +вещтаб X[-3:0,-8:M] +логтаб L[1:N,0:1] +кон + + diff --git a/kumir/examples/matr-rand.kum b/kumir/examples/matr-rand.kum new file mode 100755 index 0000000000..ac32cf8810 --- /dev/null +++ b/kumir/examples/matr-rand.kum @@ -0,0 +1,22 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 56. Запонение матрицы случайными числами +| Вход: +| нет +| Результат: +| <случайная матрица 3 на 4> +алг Заполнение матрицы случайными числами +нач +цел N = 3, M = 4, i, j +целтаб A[1:N,1:M] +нц для i от 1 до N +нц для j от 1 до M +A[i,j]:= irand(20,80) +вывод A[i,j], ' ' +кц +вывод нс +кц +кон + + diff --git a/kumir/examples/matr-sum.kum b/kumir/examples/matr-sum.kum new file mode 100755 index 0000000000..3704255a99 --- /dev/null +++ b/kumir/examples/matr-sum.kum @@ -0,0 +1,31 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 57. Сумма элементов матрицы +| Вход: +| нет +| Результат: +| Сумма элементов 54 +алг Сумма элементов матрицы +нач +цел N = 3, M = 4, i, j +целтаб A[1:N,1:M] +вывод 'Матрица: ', нс +нц для i от 1 до N +нц для j от 1 до M +A[i,j]:= i+j +вывод A[i,j], ' ' +кц +вывод нс +кц +цел s=0 +нц для i от 1 до N +нц для j от 1 до M +s:= s + A[i,j] +кц +кц +вывод 'Сумма элементов ', s +кон + + + diff --git a/kumir/examples/prime.kum b/kumir/examples/prime.kum new file mode 100755 index 0000000000..4e80df6d03 --- /dev/null +++ b/kumir/examples/prime.kum @@ -0,0 +1,31 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 19. Вложенные циклы (простые числа) +| Вход: +| 15 +| Результат: +| Простые числа: 2 3 5 7 11 13 +алг Простые числа +нач +цел n, k, M, count +вывод 'Введите максимальное число: ' +ввод M +вывод 'Простые числа: ' +нц для n от 2 до M +count:= 0 +k:= 2 +нц пока k*k <= n +если mod(n,k) = 0 то +count:= count + 1 +все +k:= k + 1 +кц +если count = 0 то +вывод n, ' ' +все +кц +кон + + + diff --git a/kumir/examples/primes.kum b/kumir/examples/primes.kum new file mode 100755 index 0000000000..cdc6886a71 --- /dev/null +++ b/kumir/examples/primes.kum @@ -0,0 +1,41 @@ +| Программа к учебнику информатики для 11 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 6. +| Программа № 1.Решето Эратосфена +| Вход: +| 100 +| Результат: +| Простые числа от 2 до 100: +| ... +алг Решето Эратосфена +нач +цел i, k, N +вывод 'Введите максимальное число: ' +ввод N +логтаб A[2:N] +нц для i от 2 до N +A[i]:= да +кц +k:= 2 +нц пока k*k <= N +если A[k] то +i:= k*k +нц пока i <= N +A[i]:= нет +i:= i + k +кц +все +k:= k + 1 +кц +вывод 'Простые числа от 2 до ', N, ':', нс +нц для i от 2 до N +если A[i] то +вывод i, ' ' +все +кц +кон + + + + + diff --git a/kumir/examples/proc-bin.kum b/kumir/examples/proc-bin.kum new file mode 100755 index 0000000000..2c8d93d27a --- /dev/null +++ b/kumir/examples/proc-bin.kum @@ -0,0 +1,29 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 21. Процедура с параметром +| Вход: +| 99 +| Результат: +| Двоичный код: 01100011 +алг Двоичный код +нач +цел N +вывод 'Введите натуральное число: ' +ввод N +вывод 'Двоичный код: ' +printBin(N) +кон +алг printBin(цел n0) +нач +цел n, k +n:= n0 +k:= 128 +нц пока k > 0 +вывод div(n,k) +n:= mod(n,k) +k:= div(k,2) +кц +кон + + diff --git a/kumir/examples/proc-err.kum b/kumir/examples/proc-err.kum new file mode 100755 index 0000000000..5258146461 --- /dev/null +++ b/kumir/examples/proc-err.kum @@ -0,0 +1,20 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 20. Программа с процедурой +| Вход: +| -1 +| Результат: +| Ошибка программы +алг Программа с процедурой +нач +цел n +ввод n +если n < 0 то Error все +кон +алг Error +нач +вывод 'Ошибка программы' +кон + + diff --git a/kumir/examples/rand.kum b/kumir/examples/rand.kum new file mode 100755 index 0000000000..e8e09e457a --- /dev/null +++ b/kumir/examples/rand.kum @@ -0,0 +1,16 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 7. Псевдослучайные числа +| Вход: +| нет| +| Результат: +| <случайное целое от 10 до 20 включительно> +| <случайное вещественное от [1 до 2)> +алг Псевдослучайные числа +нач +вывод irand(10,20), нс +вывод rand(1,2) +кон + + diff --git a/kumir/examples/rec-bin.kum b/kumir/examples/rec-bin.kum new file mode 100755 index 0000000000..1b4b4ba4da --- /dev/null +++ b/kumir/examples/rec-bin.kum @@ -0,0 +1,24 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 27. Рекурсия. Двоичный код +| Вход: +| 99 +| Результат: +| Двоичный код 1100011 +алг Двоичный код рекурсия +нач +цел N +вывод 'Введите натуральное число: ' +ввод N +вывод 'Двоичный код ' +printBin(N) +кон +алг printBin(цел n) +нач +если n = 0 то выход все +printBin(div(n,2)) +вывод mod(n,2) +кон + + diff --git a/kumir/examples/rec-fact.kum b/kumir/examples/rec-fact.kum new file mode 100755 index 0000000000..48ada4aad9 --- /dev/null +++ b/kumir/examples/rec-fact.kum @@ -0,0 +1,31 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 30. Рекурсия. Факториал +| Вход: +| 2 +| Результат: +| -> N=2 +| -> N=1 +| <- N=1 +| <- N=2 +| 2 +алг Факториал +нач +цел N +вывод 'Введите натуральное число: ' +ввод N +вывод Fact(N) +кон +алг цел Fact(цел N) +нач +вывод '-> N=', N, нс +если N <= 1 то +знач:= 1 +иначе знач:= N * Fact(N - 1) +все +вывод '<- N=', N, нс +кон + + + diff --git a/kumir/examples/rec-hanoi.kum b/kumir/examples/rec-hanoi.kum new file mode 100755 index 0000000000..d56c1fa8f5 --- /dev/null +++ b/kumir/examples/rec-hanoi.kum @@ -0,0 +1,30 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 26. Рекурсия. Ханойские башни +| Вход: +| нет +| Результат: +| 1 -> 3 +| 1 -> 2 +| 3 -> 2 +| 1 -> 3 +| 2 -> 1 +| 2 -> 3 +| 1 -> 3 +алг Ханойские башни +нач +Hanoi(3, 1, 3) +кон +алг Hanoi(цел n, k, m) +нач +если n = 0 то выход все +цел p +p := 6 - k - m +Hanoi(n-1, k, p) +вывод k, ' -> ', m, нс +Hanoi(n-1, p, m) +кон + + + diff --git a/kumir/examples/rec-nod.kum b/kumir/examples/rec-nod.kum new file mode 100755 index 0000000000..6b984bb11a --- /dev/null +++ b/kumir/examples/rec-nod.kum @@ -0,0 +1,29 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 29. Рекурсия. Алгоритм Евклида +| Вход: +| 14 21 +| Результат: +| НОД(14,21) = 7 +алг Алгоритм Евклида с рекурсией +нач +цел a, b +вывод 'Введите два натуральных числа: ' +ввод a, b +вывод 'НОД(', a, ',', b, ')=', NOD(a, b) +кон +алг цел NOD(цел a, b) +нач +если a = 0 или b = 0 то +знач:= a + b +выход +все +если a > b то +знач:= NOD(a - b, b) +иначе знач:= NOD(a, b - a) +все +кон + + + diff --git a/kumir/examples/rec-sumdig.kum b/kumir/examples/rec-sumdig.kum new file mode 100755 index 0000000000..e08aa55c73 --- /dev/null +++ b/kumir/examples/rec-sumdig.kum @@ -0,0 +1,25 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 28. Рекурсия. Сумма цифр +| Вход: +| 12345 +| Результат: +| Сумма цифр 15 +алг Сумма цифр с рекурсией +нач +цел N +вывод 'Введите натуральное число: ' +ввод N +вывод 'Сумма цифр ', sumDig(N) +кон +алг цел sumDig(цел n) +нач +знач:= mod(n,10) +если n >= 10 то +знач:= знач + sumDig(div(n,10)) +все +кон + + + diff --git a/kumir/examples/repeat.kum b/kumir/examples/repeat.kum new file mode 100755 index 0000000000..b48e85647e --- /dev/null +++ b/kumir/examples/repeat.kum @@ -0,0 +1,24 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 16. Цикл с постусловием +| Вход: +| -1 +| 0 +| 2 +| Результат: +| Введено число 2 +| и до него 2 ошибочных значений(я) +алг Цикл repeat +нач +цел n, c = 0 +вывод 'Введите целое положительное число: ' +нц +ввод n +c:=c+1 +кц при n > 0 +вывод 'Введено число ', n, нс +вывод ' и до него ', c-1, ' ошибочных значений(я)' +кон + + diff --git a/kumir/examples/str-ab.kum b/kumir/examples/str-ab.kum new file mode 100755 index 0000000000..ab477ba232 --- /dev/null +++ b/kumir/examples/str-ab.kum @@ -0,0 +1,22 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 46. Посимвольная обработка строк +| Вход: +| аабб +| Результат: +| бббб +алг Замена а на б +нач +лит s +ввод s +цел i +нц для i от 1 до длин(s) +если s[i] = 'а' +то s[i]:= 'б' +все +кц +вывод s +кон + + diff --git a/kumir/examples/str-complex.kum b/kumir/examples/str-complex.kum new file mode 100755 index 0000000000..492196e235 --- /dev/null +++ b/kumir/examples/str-complex.kum @@ -0,0 +1,29 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 49. Кумир 2.0+. Разбор строки +| Вход: +| Василий Алибабаевич Хрюндиков +| Результат: +| Хрюндиков В.А. +использовать Строки +алг ФИО +нач +лит s, name, name2 +цел n +вывод 'Введите имя, отчество и фамилию:' +ввод s +n:= позиция (' ', s); +name:= s[1:n-1] | вырезать имя +удалить(s, 1, n) +n:= позиция (' ', s) +name2:= s[1:n-1] | вырезать отчество +удалить(s, 1, n) | осталась фамилия +s:= s + ' ' + name[1] + '. ' + name2[1] + '.' +вывод s +кон + + + + + diff --git a/kumir/examples/str-func.kum b/kumir/examples/str-func.kum new file mode 100755 index 0000000000..de5e66274c --- /dev/null +++ b/kumir/examples/str-func.kum @@ -0,0 +1,41 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 52. Кумир 2.0+. Строки в фукнциях +| Вход: +| нет +| Результат: +| A12B.A12B.A12B +использовать Строки +алг Строки в функции +нач +лит s = '12.12.12' +s := replaceAll(s, '12', 'A12B') +вывод s +кон +алг лит replaceAll(аргрез лит s0, арг лит wOld, wNew) +нач +лит res +цел p, len +лит s +s:=s0 +len:= длин(wOld) +res:= '' +нц пока длин(s) > 0 +p:= позиция (wOld, s) +если p < 0 то res:= res + s; выход все +если p > 1 то res:= res + s[1:p-1] все +res:= res + wNew +если p+len > длин(s) то +s:='' +иначе s:=s[p+len:длин(s)] +все +кц +знач:=res +кон + + + + + + diff --git a/kumir/examples/str-num.kum b/kumir/examples/str-num.kum new file mode 100755 index 0000000000..76c2765602 --- /dev/null +++ b/kumir/examples/str-num.kum @@ -0,0 +1,36 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 50. Преобразования "строка-число" +| Вход: +| нет +| Результат: +| 246 +| 246.912 +| 123 +| 123.456 +использовать Строки +алг Строка число +нач +лит s +цел N +вещ X +лог OK +s:= '123' +N:= лит_в_цел(s, OK) | N = 123 +если не OK то вывод 'Ошибка!' все +вывод N*2, нс +s:= '123.456'; +X:= лит_в_вещ(s, OK) | X = 123.456 +если не OK то вывод 'Ошибка!' все +вывод X*2, нс +N:= 123 +s:= цел_в_лит(N) | s = '123' +вывод s, нс +X:= 123.456 +s:= вещ_в_лит(X) | s = '123.456' +вывод s, нс +кон + + + diff --git a/kumir/examples/str-ops.kum b/kumir/examples/str-ops.kum new file mode 100755 index 0000000000..1b9a80b403 --- /dev/null +++ b/kumir/examples/str-ops.kum @@ -0,0 +1,33 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 47. Кумир 2.0+. Операции со строками +| Вход: +| нет +| Результат: +| Привет, Вася! +| 34567 +| 129 +| 12ABC3456789 +использовать Строки +алг Операции со строками +нач +лит s, s1, s2 +s1:= 'Привет' +s2:= 'Вася' +s := s1 + ', ' + s2 + '!' +вывод s, нс +s:= '123456789' +s1:= s[3:7] +вывод s1, нс +s:= '123456789' +удалить(s, 3, 6) +вывод s, нс +s:= '123456789' +вставить('ABC', s, 3) +вывод s, нс +кон + + + + diff --git a/kumir/examples/str-proc.kum b/kumir/examples/str-proc.kum new file mode 100755 index 0000000000..052714b715 --- /dev/null +++ b/kumir/examples/str-proc.kum @@ -0,0 +1,39 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 51. Кумир 2.0+.Строки в процедуре +| Вход: +| нет +| Результат: +| A12B.A12B.A12B +использовать Строки +алг Строки в процедуре +нач +лит s = '12.12.12' +replaceAll(s, '12', 'A12B') +вывод s +кон +алг replaceAll(аргрез лит s, арг лит wOld, wNew) +нач +лит res +цел p, len +len:= длин(wOld) +res:= '' +нц пока длин(s) > 0 +p:= позиция (wOld, s) +если p < 0 то res:= res + s; выход все +если p > 1 то res:= res + s[1:p-1] все +res:= res + wNew +если p+len > длин(s) то +s:='' +иначе s:=s[p+len:длин(s)] +все +кц +s:=res +кон + + + + + + diff --git a/kumir/examples/str-rec.kum b/kumir/examples/str-rec.kum new file mode 100755 index 0000000000..17e5aa4469 --- /dev/null +++ b/kumir/examples/str-rec.kum @@ -0,0 +1,31 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 53. Рекурсивный перебор +| Вход: +| нет +| Результат: +| <64 слова> +алг Рекурсивный перебор +нач +лит word = '...'; | из K символов +TumbaWords('ЫШЧО', word, 0) +кон +алг TumbaWords(лит A, w0, цел N) +нач +если N = длин(w0) то | слово построено +вывод w0, нс +выход +все +цел i +лит w +w:= w0 +нц для i от 1 до длин(A) +w[N+1]:= A[i] +TumbaWords(A, w, N+1) | рекурсия +кц +кон + + + + diff --git a/kumir/examples/str-search.kum b/kumir/examples/str-search.kum new file mode 100755 index 0000000000..fb79a038a6 --- /dev/null +++ b/kumir/examples/str-search.kum @@ -0,0 +1,25 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 48. Кумир 2.0+. Поиск подстроки в строке +| Вход: +| нет +| Результат: +| Номер символа 4 +использовать Строки +алг Поиск в строке +нач +лит s +цел n +s:= 'Здесь был Вася.' +n:= позиция('с', s) +если n > 0 то +вывод 'Номер символа ', n +иначе +вывод 'Символ не найден.' +все +кон + + + + diff --git a/kumir/examples/str-sort.kum b/kumir/examples/str-sort.kum new file mode 100755 index 0000000000..b47c1c470d --- /dev/null +++ b/kumir/examples/str-sort.kum @@ -0,0 +1,44 @@ +| Программа к учебнику информатики для 10 класса +| К.Ю. Полякова и Е.А. Еремина. +| Глава 8. +| Программа № 54. Сортировка строк +| Вход: +| 5 +| пароход +| паровоз +| пар +| Пар +| пАр +| Результат: +| Пар +| пАр +| пар +| паровоз +| пароход +алг Сортировка строк +нач +цел i, j, N +вывод 'Введите количество строк: ' +ввод N +литтаб S[1:N] +лит s1 +вывод 'Введите строки: ', нс +нц для i от 1 до N +ввод S[i] +кц +нц для i от 1 до N-1 +нц для j от N-1 до i шаг -1 +если S[j+1] 0 +n:= div(n,10) +count:= count + 1 +кц +вывод 'Цифр в числе: ', count +кон + + +