Составление циклических алгоритмов

Способы программирования

 

Базовые элементы языка программирования C(Си)

 

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

Виртуальная машина ­– это программный комплекс, имитирующий работу реальной машины с определённым входным языком на ЭВМ с другим машинным языком, т.е. реализующий входной язык программирования.

Виртуальная машина содержит транслятор и интерпретатор и может включать библиотеки стандартных подпрограмм, отладчик, компоновщик и другие сервисные средства.

Транслятор представляет собой программу, осуществляющую перевод текстов с входного языка на машинный язык.

Одной из разновидностей транслятора является компилятор, обеспечивающий перевод программ с языка высокого уровня (приближённого к человеку) на язык более низкого уровня (близкий к ЭВМ). Текст программы, записанный на языке высокого уровня и введённый с клавиатуры в память компьютера, называется исходным модулем.

Программы, написанные в интегрированных средах Borland C, Visual C++, Builder C++ - .cpp.

Результатом обработки исходного модуля компилятором является объектный модуль с расширением .obj. На этом этапе компилятор выделяет лексемы (слова), затем на основе грамматики распознает выражения и операторы, построенные из этих лексем. При этом компилятор выявляет синтаксические ошибки и в случае их отсутствия создаёт объектный модуль. Исполняемый модуль (загрузочный) создаёт вторая специальная программа – компоновщик. Её ещё называют редактором связи (Linker). Она и создаёт загрузочный модуль с расширением .exe на основе одного или нескольких объектных модулей – это программный модуль, представленный в форме, пригодной для выполнения.

Любая программа, написанная на языке высокого уровня, состоит из последовательности инструкций, оформленных в строгом соответствие с набором правил, составляющих синтаксис данного языка. При создании программ разработчик может допустить следующие ошибки:

1) синтаксические;

2) логические.

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

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

Алфавит языка составляет совокупность символов – тех неделимых знаков при помощи которых записываются все тексты на данном языке.

Алфавит языка Си включает прописные и строчные буквы латинского алфавита и знак подчёркивания (код 95), арабские цифры от 0 до 9. Специальные символы, пробельные символы (пробел, символы табуляции, перевода строки, возврата каретки новой страницы и новой строки.

К специальным символам относятся: точка(.), запятая(,), “, ’, :, ;, +, -, _, *, /, \, |, <, >, =, !, ?, #, %, (, ), [, ], {, }, ~, ^, &.

Неделимые последовальтельности спец.символов образуют составные символы: ++, --, ==, !=, <=, >=, >>, <<, ||, &&, +=, -=, *=, /=, /*, */, //, ?:.

/*, */ - используются как ограничители комментариев, которые можно записать как в одну, так и в несколько строк.

// - начинает однострочный комментарий. Окончанием такого комментария служит невидимый символ перехода на новую строку.

Из символов алфавита формируются лексемы. Единицы текста программы, которые при компиляции воспринимаются как единое целое и не могут быть разделены на более мелкие элементы.

К лексемам относятся идентификаторы, служебные слова, знаки операции, константы и разделители. Последовательность латинских букв, цифр и знака подчеркивания является идентификатором, другие спец. символы не допускаются. Идентификатор должен начинаться только с буквы или знака подчёркивания.

Служебные слова (ключевые) – это идентификаторы, назначение которых однозначно определено в языке. Они не могут быть использованы как свободно выбираемые имена.

Служебными словами являются: имена стандартных типов данных, функции операторов. Все слова как правило записываются строчными буквами: (int, while, cos).

В языке Си существуют различия между строчными и прописными буквами. Некоторые служебные слова начинаются с символа подчёркивания. Поэтому, во избежания совпадения с ними не рекомендуется записывать пользовательские идентификаторы начиная с символа подчёркивания.

 

Классификация типов данных

В языке Си применяются данные двух категорий: простые (скалярные) и сложные (составные).

К базовым типам данных относятся: целый, вещественный и символьный. В свою очередь целые типы подразделяются на короткий (short), длинный (long), беззнаковый ( unsigned). Знаковый (signed – c минусом) тип подразумевается по умолчанию.

 

Базовые типы данных:

Наименования Тип данных Объём в памяти Диапазон значений
Символьный char -128…127
Целый int -32768..32767
Короткий short 2(1) -32768..32767
Длинный long -2147483648.. 2147483647
Беззнаковый целый unsigned int 0..65535
Беззнаковый длинный unsigned long 0..424967295
Вещественный float -3.14*10^-38..3.14*10^38
Вещ. с двойной точностью double -1.7*10^-308..1.7*10^308

 

В языке Си величины типа char могут рассматриваться в программе как символы и как целые числа. Всё зависит от способа использования этой величины.

сhar c=65;/* объявление символьной переменной с указанием начального значения 65 */

printf (“%c”, c); /* на экран выведется символ А */

printf (“%d”, c); /* выведеится число 65 */

Функция printf осуществляет вывод информации на экран, в ковычках после символа % указывается спецификатор формата вывода. %с – означает вывод символьных данных, %d – вывод числовых данных целого типа.

Сложные типы данных подразделяются на массивы, структуры, объединения и перечисления.

 

Декларирование (объявления) объекта

Все объекты (переменные, константы, массивы и т.д.), с которыми работает программа на Си необходимо декларировать. При декларировании объекты можно инициализировать, т.е. задать начальное значение.

Например:

int a = 5, b; /*объявление двух переменных, причём значение а известно */

float x, y = 7.15 /*объявление двух вещественных переменных*/

При объявлении констант перед именем типа должно указываться слово const.

Рекомендуется имена констант задавать большими буквами.

Например:

const float PI=3.1415;

Длина идентификатора определяется реализацией транслятора Си и редактора связи. Современная тендеция – снятие ограничений длины идентификатора.

 

Структура программы

Программа, написанная на языке Си состоит из директив препроцессора, объявления глобальных переменных, одной или нескольких функций, среди которых одна главная функция управляет работой всей программы. Общая структура программы на языке Си имеет вид:

<директивы препроцессора>

<определение типов пользователя – typedef>

<прототипы функций>

<определение глобальных объектов>

<функции>

Функции в свою очередь имеют свою структуру:

<класс памяти><тип><имя функции>(<параметры>)

{ // начало функции

<определение локальных объектов> } тело функции
<операции и операторы>

} // конец функции

 

Тело функции является блоком и поэтому заключается в фигурные скобки.

Функции не могут быть вложены друг в друга. Перед компиляцией программы на языке Си автоматические выполняется предварительная (препроцессорная) обработка текста программы. С помощью директив препроцессора задаются необходимые действия по преобразованию текста программы перед компиляцией. Директивы записываются по следующим правилам:

1) Все препроцессорные директивы должны начинаться с символа #.

2) Директивы записываются с первой позиции

3) Сразу за символом решётка должно следовать наименование директивы, указываюшее текущую операцию препроцессора.

Наиболее распространёнными являются директивы:

#define

#include

Директива #define (определить) создаёт макро константу и её действие распространяется на весь файл, например:

#define PI 3.1415927

В ходе препроцессорной обработки программы идентификатор PI заменяется указанным значением.

Директива #include используется для подключения к программе заголовочных файлов с декларацией стандартных библиотечных функций. При заключении имени файла в угловые скобки < > поиск данного файла производится в стандартной директории с этими файлами. Если же имя файла заключено в двойные кавычки, то поиск осуществляется в текущей папке.

#include <stdio.h> /*stdio.h – библиотечный файл, содержащий функции ввода/вывода*/

#include <conio.h> /*Файл, содержащий функции для работы с консолью (с экраном).

clrscr(): - очистка экрана

getch(); - функция ввода символа, используется для задержки выполнения программы до нажатия любого символа */

#include <math.h> /* подключение файла с мат.формулами */

 

Пример программы:

#define PI 3.1415927

#include <stdio.h>

#include <conio.h>

void main (); // заголовок главной функции

{ int num = 13; //объявление целочисленной переменной num с инициализацией

clrscr ();

printf (“\n Число pi=%7.5f\n %d – это опасное число\n”, PI, num);

getch();

}

 

Слово void означает, что главная функция main не возвращает никакого результата.

В функции printf единый символ \n означает перевод в начало новой строки. Число pi=, а также «-это опасное число» - это пояснительный текст, который один к одному выводится на экран. %7.5f означает: f – вещественное значение, вместо которого подставляется константа PI, 7.5 – ширина поля вывода для этого значения, 7 – всё значение, из них 5 – под дробную часть. %d – вместо него подставляется значение переменной num.


 

-//-

Если нужно ввести длинную целую константу, то указывается признак L(l). Например, 25L (без L – это обычный int формат), с L – long.

Восьмеричные константы: последовательность цифр от 0 до 7-ми, первая из которых должна быть 0. Например, 020(8)=16(10).

Шестнадцатеричные константы – это последовательность цифр от 0 до 9-ти и букв от A до F, начинающиеся символами 0x (0X). Например, 0x1F(16)=31(10)

Восьмиричные и шестнадатиричные константы могут так же заканчиваться буквой L – long. Константы вещественного типа размещаются в памяти по формату double. А во внешнем представлении могут иметь две формы: формат записи с фиксированной дессятичной точкой ±n.m и в формате записи с плавающей точкой ±n.m E±p или ±n.m e±p. Например, 25.41 0.2541E+2.

Символьная константа – это символ, заключенный в апострофы. Так же используются специальные последовательности символов, которые рассматриваются как единое целое. Например, \n – перевод курсора на новую строку, \t – табуляция, \0 – нулевой символ или нуль термината, означает конец строки.

Строковые константы представляют собой последовательность символов, заключённую в двойные ковычки. Во внутреннем представлении к строковым константам добавляется нулевой символ, отмечающий конец строки. Этот символ на печать не выводится. И в кодовой таблице имеет код 0.

Константы перечисляемого типа. Данное средство языка позволяет определять последовательность целочисленных именованных констант. Описание перечисляемого типа начинается со служебного слова enum, а последующий список констант заключается в фигурные скобки. Например, enum {A,B,C,D}; По умолчанию, значение первой константы равно нулю. В результате A=0, B=1, C=2, D=3. Для любой константы можно явно указать значение. Например, enum {A=10, B, C, D}; В результате – A=10, B=11, C=12, D=13.

Можно также задать константы следующим образом: enum {A=20, B=30, C=35, D,=40}. Если перечисляемому типу дать имя, то его можно использовать при описании переменной. Например, Color enum {Red, Green, Blue}; Color C1,C2; Тогда переменные C1 и C2 могут принимать одно из указанных выше значений.

 

Обзор операций в языке Си

Операция в языке Си предназначены для управления данными. Для их использования необходимо знать синтаксис и порядок выполнения. Выражения состоят из операндов, операций, скобок и используются для вычисления некоторого значения определённого типа. Каждый операнд может быть в свою очередь выражением. Операции, применяемые к одному операнду называются унарными. Унарная – -5, двум операндам – бинарная: 2+3, к трём операндам – тернарная: к ней основится условная операция ?: .

Большинство операций выполняются слева направо, например, a+b+c à (a+b)+c. Исключение составляют унарные операции присваивания и условные операции, которые выполняются справа налево.

Арифметические операции. К ним относятся +, -, *, /, % - остаток от деления двух целых чисел, ++ - увеличение целого значения на единицу, -- - уменьшение целого значения на единицу. Операции +,-,*,/ применяются к любым типам данных. При выполнении операций деления результатом будет частное – если хотя бы один из операндов вещественного типа и целая часть отделения, если оба операнда целые. Операция % применяется только к целым числам. Операции ++ и – могут применяться только к переменным и не могут к константам и выражениям. Оба знака операции могут записываться как перед операндом как префиксная форма, так и после операнда (пост-фисная форма). Например, x=x+1; x++; ++x; дают один и тот же результат.

Различие проявляется при использовании префиксной и постфиксной форм выражения. Например, в постфиксной форме int a=3, b=2, y; y=a++*b++; в результате получим a=4, b=3, y=6. В префиксной форме: а=4, b=3< y=12. Т.е. при использовании постфиксной формы операции ++ и -- выполняются после того, как значение переменной было использовано выражение, а префиксные операции – до использования. 1)y=a*b, 2)a++, 3)b++. 1)++a, 2)++b, 3)y=a*b.

Операции присваивания. Формат операции - <идентификатор>=<выражение>; Присваивание значения в языке Си в отличие от традиционной интерпретации рассматривается как выражение, имеющее значение левого операнда после присваивания. Т.о. присваивание может включать несколько операций присвания. Например, i=j=k=0; ßà k=0, j=k, i=j. x=2+(y=1)-(z=0); ßà y=1; z=0; x=2+1-0. Операции присваивания могут иметь сокращенную запись +=, -=, *=, /=, %=. Например, x+=2; ßà x=x+2; x-=a+b; ßà x=x-(a+b); d%=2; ßà d=d%2.

 

Преобразование типов операндов арифметических операций

Если при выполнении операций используются операнды различных типов, то они преобразуются общему типу, в соответствие с небольшим набором правил. Типы операндов преобразуются в порядке увеличения их размера памяти.

Схема выполнения преобразований char, short à int à unsigned à long à double

float à double

Стрелки отмечают преобразования даже однотипных операндов перед выполнением операций, т.е. действуют след. правила:

- значения типов char и short всегда преобразуются в int

- если любой операнд имеет тип double, то второй преобразуется в тип double

При присваивании значения правой части преобразуется к типу левой, который и является типом результата. Если объявлены переменные int i,j; float x; то операторы x=i; и i=x; оба выполняют преобразование. В первом случае целое значение преобразуется в формат float, во втором случае тип float преобразуется в тип int с отбрасыванием дробной части. Тип double преобразуется во float округлением.

Операция приведения типа – её формат:

(тип) выражение

int a, b; float y;

a=5; b=2;

y=5/2; //y=2, т.е. целая часть от деления

y=(float)a/b; //y=2.5 – т.к. а преобразовываются к типу float.

 


 

Операции сравнения

 

Логические операции

 

a+b>0 && b+c>0

a>b || a>c

При выполнении первой операции, если значение a+b>0 – ложно, то второе условие не проверяется.

При выполнении операции, если значение a>b то второе выражение (a>c) не вычисляется.

 

Побитовые операции

Эти операции предусмотрены для работы с отдельными битами слов. Их нельзя применять к переменным вещественного типа.

Перечень операций:

1) ~ - дополнение или инвертирование, или поразрядное отрицание НЕ.

2) & - амперсант, побитовое И.

3) | - побитовое включающее ИЛИ.

4) ^ - побитовое исключающее ИЛИ.

5) >> - сдвиг вправо.

6) << - сдвиг влево.

Операндами операций над битами могут быть только выражения, приводимые к целому типу. 4-ре первых операции выполняются поразрядно над всеми битами операндов. Унарная операция ~ даёт дополнение к целому. Это означает, что каждый бит со значением 1 получает значение 0 и наоборот.

Операции сдвига осуществляют соответственно сдвиг вправо (влево) своего левого операнда на число битовых позиций, задаваемых правым операндом. Т.о. x<<2 сдвигает x влево на 2 позиции, заполняя освобождающиеся биты нулями, что эквивалентно умножению на 4. Операции сдвигов на k-разрядов вправо эффективны для деления целых чисел на 2k. А сдвиг влево – для умножения целых чисел на 2k.

x<<2 ßà x*22

x>>2 ßà

Операция запятая – данная операция используется при организации строго гарантированной последовательности вычисления выражений.

Форма записи <выражение1>,…,<выражение N> вычисляются гарантированно последовательно и результатом операции становится значение выражения N. Данная операция используется там, где по синтаксису допустима только одна операция, а нам необходимо разместить несколько последовательно выполняемых операций.

M=(i=1, j=i++, k=6, n=i+j+k); ßà i=1, j=i++ (j=1), k=6. n=2+1+6=9àm=9

j=i, i++

 

Операция sizeof()

Эта операция имеет две формы записи:

1) sizeof (тип)

2) sizeof (выражение)

Результатом операции является целое число, равное количеству байтов, которое занимает в памяти величина явно указанного типа или величина, полученная в результате вычисления выражения. Последняя определяется так же по типу результата выражения. Приоритет этой операции выше, чем у бинарных арифметических операций, логических операций и отношений.

Примеры: sizeof(int) результат будет 2 или 4, в зависимости от процесса (сколько байт занимает).

sizeof(1.5) результат 8.

 

Условная операция ?:

Это тернарная операция (3), предназначенная для реализации алгоритмической структуры – ветвление (аналогично if).

Формат:

(<выражение 1>)?<выражение2>:<выражение 3>;

Выполняется операция следующим образом:

- сначала вычисляется выражение 1, которое чаще всего представляет собой некоторые условия и если оно истинно, то вычисляется выражение 2, результат которого является результатом операции, иначе результатом операции будет результат выражения 3.

max=(a>b)?a:b;

(a>b)?puts(«функция выводит строки на экран», “истина”):puts(“ложь”).

 

В языке Си круглые и квадратные скобки так же являются операциями, они имеют наивысший приоритет ( ) и [ ].

 

Функции вывод информации

1) putchar () – обеспечивает вывод одиночного символа без перехода на новую строку

2) puts (s) – обеспечивает вывод строки символов с переходом на начало новой строки

3) printf () – предназначена для форматированного вывода данных.

Пример: printf (<упр. строка>, <список аргументов>);

Управляющая строка заключается в кавычки и указывает компилятору вид выводимой информации. Она может включать спецификации преобразования и управляющие символы.

Спецификация преобразования имеет вид:

%<флаг><размер поля>.<точность>спецификация

Где <флаг> может принимать следующие значения:

1) «-» - выравнивание влево выводимого числа (по умолчанию выполняется выравнивание вправо

2) «+» - выводится знак положительного числа.

<размер поля> - задаёт минимальную ширину поля, то есть минимальную величину числа, при недостаточной ширине поля выполняется автоматическое расширение.

<точность> - задаёт кол-во цифр в дробной части числа.

спецификация – указывает вид выводимой информации.

Основные форматы функции печати:

%d или %i – формат десятичного целого числа.

%c – один символ

%s – строка символов

%e – число с плавающей точкой

%f – число с плавающей точкой десятичной записи

%u – десятичное число без знака

%о – восьмеричное число без знака

%x – 16ричное число без знака

%p – указатель

%ld – длинное целое число

%lf – вещественное число с удвоенной точностью, т.е. тип double

При необходимости вывода символа % его нужно указать два раза (%%).

printf(

Упраляющая строка может содержать следующие управляющие символы:

\n – переход на новую строку

\t – табуляция

\v – вертикальная табуляция

\b – возврат на один символ

\r - возврат в начало строки

\a – звуковой сигнал

\? – знак вопроса

Cписок аргументов – печатаемые объекты (константы, переменные или выражения), перечисляемые перед выводом. Кол-во аргументов и их типы должны соответствовать спецификациям преобразования в управляющей строке.

 

Функции ввода информации

1) getch () – используется для ввода одиночных символов.

2) gets (s); - обеспечивает ввод строки символов до нажатия клавиши Enter

3) scanf () – предназначена для форматированного ввода информации любого вида.

Общий вид функции:

scanf(<управляющая строка>,<список адресов>);

Управляющая строка может содержать только вид вводимой информации, т.е. спецификации преобразований, и управляющие символы. В списке адресов используются указатели для переменных. Перед именем переменной обязательно описывается символ &, обозначающей адрес переменной для ввода строковых переменных или значений – символ & не используется.

Математические функции

 

Для использования математических функций необходимо подключить заголовочный файл math.h . Все математические функции, кроме abs возвращают результат типа double.

abs(x) - |x| - модуль или абсолютная величина, x-целое.

acos(x) – arccos (x)

asin(x) – arcsin (x)

atan(x) – arctg (x)

cos(x) – cos x

cosh (x) – ch x

ceil(x) - наименьшее целое >=x

exp(x) - ex

fabs(x) - |x|, x – вещественное

floor(x) – наибольшее целое число <=x

fmod (x/y) – остаток от деления x на y

log(x) – ln x

log10(x) – lg x

pow(x,n) – xn

sin(x) – sin x

sinh(x) – sh x

sqrt(x) – корень из x

tan(x) – tg x

tanh(x) – th x


 

Операторы языка Си

Операторы языка Си можно разделить на 3 группы:

- операторы декларации

- операторы преобразования объектов

- операторы управления процессом выполнения алгоритма

Программирование процесса преобразования объектов производится посредством записи операторов. Простейший вид операторов – выражение, заканчивающееся «;». К простым операторам относятся:

1) Оператор присваивания

2) Оператор вызова функций

3) Пустой оператор используется когда по синтаксису оператор требуется, а по смыслу – нет.

Любой оператор может помечаться меткой – идентификатор и символ «:». Область действия метки – функция, где эта метка определена.

К управляющим операторам относятся: операторы условного и безусловного переходов, оператор выбора альтернатив (переключатель), операторы организации циклов и передачи управления.

Допускается вложенность операторов. В случае необходимости, можно использовать составной оператор – блок состоящий из нескольких операторов, заключённых в фигурные скобки «{}», причём после закрывающей скобки символ «;» не ставится.

Условные операторы:

Условный оператор ifc используется для разветвления процесса выполнения кода программы на 2 направления. Имеется 2 разновидности условного оператора:

- простой

- полный

Синтаксис простого оператора:

if (выражение) оператор;

Выражение – это логическое или арифметическое выражение, вычисляемое перед проверкой. Если выражение истинно – то выполняется оператор, иначе он игнорируется. Оператор может быть простым или составным. Примеры записи условного оператора if.

if (x>) x=0;

if (i!=1) j+1, s=1; // если i не равно единице, используется запятая.

 

if (i!=1)

{ j+1; s=1;} //

if (getch () !=27) k=0; // если нажата любая клавиша, кроме escape.

if (i>0 && i<n) k++; // использование сложного условия

if (a++) b++; // использования арифметического выражения a++

 

Синтаксис полного оператора:

if (выражение) оператор 1;

else оператор 2;

Если выражение не равно нулю, то выполняется оператор 1, иначе выполняется оператор 2. Операторы 1 и 2 могут быть или простыми или составными. Наличие «;» перед else обязательно.

1) if (x>0) j=k+10;

else m=i*10;

2) if (x>0 && k!=0) {j=x/k; x+10;}

else m=k*i+10;

Операторы 1 и 2 могут быть любыми операторами, в том числе и условными, тогда если есть вложенная последовательность операторов if-else, то фраза else связывается с ближайшим к ней предыдущим if, не содержащим ветвь else.

if (n>0)

if (a>b) z=a;

else z:=b;

Здесь ветвь else связана со вторым if (a>b). Если же необходимо связать фразу else с внешним if, то используются операторные скобки.

if (n>0) {

if (a>b) z=a; }

else z:=b;

Теперь относится к 1-ому if.

Замечание!

Наиболее распространённой ошибкой при создании условных операторов является использование в выражении-условии операции присваивании «=» вместо операции сравнения на равенство операндов «==».

 

Оператор выбора альтернатив (перключатель)

Оператор switch (переключатель) предназначен для разветвления процесса вычислений на несколько направлений.

Общий вид оператора:

switch (выражение) {

case константа1: список операторов1

case константа2: список операторов2

case константаN: список операторовN

default: список операторов N+1

}

Выполнение оператора начинается с вычисления выражения, значение которого должно быть целого или символьного типа. Это значение сравнивается со значениями констант и используется для выбора ветви, которую нужно выполнить. В данной конструкции константы фактически выполняют роль меток. Если значение выражения совпало с одной из перечисленных констант, то управление передаётся в соответствующую ветвь. После этого если выход из переключателя (оператор break) в данной ветви явно не указан последовательно выполняются остальные ветви. Все константы должны разные значения, но быть одного и того же типа. Несколько меток могут следовать подряд и тогда переход в указанную ветвь будет происходить при совпадении хотя бы одной из них. Порядок следования ветвей не регламентируется. В случае несовпадения значения выражения ни с одной из констант выбора происходит переход на метку default либо при её отсутствии к оператору, следующему за оператором switch. Управляющий оператор break (разрыв) выполняет выход из оператора switch.

Пример оператора switch с использованием оператора break

int i=2;

switch (i) {

case 1: puts(“Случай 1”); break;

case 2: puts(“Случай 2”); break;

case 3: puts(“Случай 3”); break;

default: puts(“Случай default”); break; }

 

Результатом выполнения будет случай 2. Если в каждой ветви break отсутствует, то результат будет следующий:

- выполнятся все три случая и default.

Пример реализации простейшего калькулятора на 4 действия с контролем правильности ввода символа нужной операции. Ввод данных осуществляется следующим образом: операнд1, символ операции, операнд2.

 

#include <stdio.h>

void main ()

{

double a,b,c; char s;

m1: fflush (stdin); // Очистка буфера ввода stdin

printf(“\n Введите операнд 1, символ операции, операнд 2:”);

scanf(“%lf%c%lf”,&a,&s,&b);

switch(s) {

case ‘+’: c = a+b; break;

case ‘-’: c = a-b; break;

case ‘*’: c = a*b; break;

case ‘/’: c = a/b; break;

default: printf (“\n Ошибка, повторите ввод!”); goto m1;

}
printf(“\n a %c b = %lf”, s, c);

printf(“\n Продолжим? (Y/y)”);

s = getch();

if((s==’Y’)||(s==’y’)) goto m1;

printf(“\n Good bye!”);

}

 

После запуска программы на экран выводится подсказка, нужно набрать соответствующие значения без пробелов, например как показано ниже. И нажать клавишу Enter:

Введите операнд 1б символ операцию операнд 2: 2.4+3.6

На экран будет выведен результат и дальнейший диалог:

a + b = 6.000000

Продолжим? (Y/y)

Введя символ y (Y), вернемся в начало функции и на экране вновь появится:

Введите операнд 1, символ операции, операнд 2:

Если ошибочно ввести – 2r3, появится следующие сообщения:

Ошибка, повторите ввод!

Введите операнд 1, символ операции, операнд 2: 2*3

a*b = 6.000000

Continue? (Y/y)

Нажимаем любую клавишу, кроме y или Y – следует сообщение

Good bye!

Программа закончена


Составление циклических алгоритмов

Понятие Циклического кода

Любой цикл состоит из кода цикла, т.е. тех операторов, которые выполняются несколько раз, начальных установок, модификации параметра цикла и проверки условия продолжения выполнения цикла.

Один проход цикла называется шагом или итерацией. Проверка условия продолжения цикла происходит на каждой итерации либо до выполнения кода цикла (с предусловием), либо после выполнения (с постусловием).

Для организации циклов используются специальные операторы. Перечень разновидностей операторов цикла языка Си следующий:

- оператор цикла с предусловием

- оператор цикла с постусловием

- оператор цикла с предусловием и коррекцией