Элементарные средства программирования

Деление операторов языка Си на группы

Каждый исполняемый оператор определяет действия программы на очередном шаге ее выполнения. У оператора (в отличие от выражения) нет значения. По характеру действий различают два типа операторов: операторы преобразования данных и операторы управления работой программы.

Наиболее типичные операторы преобразования данных – операторы присваивания и произвольные выражения, завершающиеся символом “;”.

Так как вызов функции является выражением с операцией "круглые скобки" и операндами "имя функции", "список фактических параметров", к операторам преобразования данных можно отнести и оператор вызова или обращения к функции:

имя_функции (список_фактических_параметров);

Операторы управления работой программы называют управляющими конструкциями программы. К ним относятся: 1) составные операторы; 2) операторы выбора; 3) операторы циклов; 4)операторы перехода.

К составным операторам относят собственно составные операторы и блоки. В обоих случаях это последовательность операторов, заключенная в фигурные скобки. Отличие блока от составного оператора – наличие определений в теле блока. Например, приведенный ниже фрагмент программы – составной оператор:

{

n++;

summa+=(float)n;

}

а этот фрагмент – блок:

{

int n=0;

n++;

summa+=(float)n;

}

Наиболее часто блок употребляется в качестве тела функции.

Операторы выбора – это условный оператор (if) и переключатель (switch).

Операторы циклов в языке Си трех видов – с предусловием (while), с постусловием (do) и параметрический (for).

Операторы перехода выполняют безусловную передачу управления: goto (безусловный переход), continue (завершение текущей итерации цикла), break (выход из цикла или переключателя), return (возврат из функции).

Условный оператор имеет сокращенную форму:

if (выражение_условие) оператор;

где в качестве выражения _условия могут использоваться: арифметическое выражение, отношение и логическое выражение. Оператор, включенный в условный, выполняется только в случае истинности (т.е. при ненулевом значении) выражения_условия. Пример:

if (х < 0 && х > -10) х=-х;

Кроме сокращенной формы, имеется еще и полная форма условного оператора:

if {выражение_условие)

оператор_1;

Else

оператор_2;

Здесь в случае истинности выражения-условия выполняется только оператор_1, при нулевом значении выражения-условия выполняется только оператор_2.

Например:

if (х > 0) b=х; else b=-х ;

Оператор в сокращенном варианте оператора if, и операто_1 и оператор_2 в полном операторе ifмогут быть как отдельными, так и составными операторами.

Метки и пустой оператор.Метка – это идентификатор, помещаемый слева от оператора и отделенный от него двоеточием ":". Например,

label: z+=-8;

Чтобы можно было поставить метку в любом месте программы (или задать пустое тело цикла), в язык С введен пустой оператор, изображаемый только одним символом ";"

Оператор перехода.Оператор безусловного перехода имеет следующий вид:

gotoидентификатор;

где идентификатор – одна из меток программы.

Ввод данных.

Для ввода данных с клавиатуры ЭВМ в программе будем использовать функцию (описана в заголовочном файле stdio.h):

scanf (форматна _строка, список_аргументов);

Функция scanf( ) выполняет "чтение" кодов, вводимых с клавиатуры. Это могут быть как коды видимых символов, так и управляющие коды, поступающие от вспомогательных клавиш и от их сочетаний. Функция scanf() воспринимает коды, преобразует их во внутренний формат и передает программе. При этом программист может влиять на правила интерпретации входных кодов с помощью спецификаций форматной строки. И форматная строка, и список аргументов для функции scanf() обязательны. Форматную строку для функции scanf() будем формировать из спецификаций преобразования вида:

% * ширина_поля модификатор спецификатор

Среди элементов спецификации преобразования обязательны только % и спецификатор. Для ввода числовых данных используются спецификаторы:

d – для целых десятичных чисел (тип int);

u – для целых десятичных чисел без знака (тип unsigned int);

f – для вещественных чисел (тип float);

е – для вещественных чисел (тип float).

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

Звездочка '*' в спецификации преобразования позволяет пропустить во входном потоке байты соответствующего вводимого значения.

В качестве модификаторов используются символы:

h – для ввода значений типа short int(hd);

l – для ввода значений типа long int(ld) или double (lf, le);

L – для ввода значений типа long double(Lf, Le).

В отличие от функции printf() аргументами для функции scanf() могут быть только адреса объектов программы, в частном случае – адреса ее переменных.

Например, для ввода с клавиатуры значений переменных n, z, х можно записать оператор:

scanf ("%d%f%f",&n,&z,&x);

В данном примере спецификации преобразования в форматной строке не содержат сведений о размерах полей и точностях вводимых значений. Это разрешено и очень удобно при вводе данных, диапазон значений которых определен не строго. Если переменная n описана как целая, z и х – как вещественные типа float,то после чтения с клавиатуры последовательности символов 18 18 -0.431 переменная n получит значение 18, z-значение 18.0, х – значение -0.431.

До нажатия клавиши <Enter> разрешено редактировать (исправлять) данные, подготовленные в строке ввода.

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

Пример 1.

/* Комментарии:*/

/*Определить объем и площадь боковой поверхности цилиндра с заданными радиусом основания r и высотой h.*/

/*подключаем стандартные заголовочные файлы:*/

#include<CONIO.H>

#include<STDIO.H>

#define pi 3.1415 /*определяем с помощью препроцессорной директивы значение π*/

void main(void) /*главная функция*/ {

float r,h,v,s;/*v - объем, s – площадь – объявление переменных вещественного типа*/

clrscr(); /*очистка экрана*/

printf("Введите высоту цилиндра: ");

/*вывод строки на экран*/

scanf("%f",&h); /*получение значения переменной

вещественного типа с клавиатуры*/

printf("Введите радиус основания: ");

scanf("%f",&r);

v=pi*r*r*h; /*операция присваивания*/

s=2*pi*r*h;

printf("\nОбъем цилиндра=%f",v);

printf("\nПлощадь боковой поверхности \

цилиндра=%f",s);

printf("\nНажмите любую клавишу...");

getch(); /*ожидание нажатия клавиши*/

}

Пример 2.

/*Найти произведение цифр заданного целого четырехзначного числа.*/

#include<CONIO.H>

#include<STDIO.H>

#include<STDLIB.H>

#include<MATH.H>

void main(void){

int num, /*заданное число целого типа*/

i,j,k,l, /*цифры числа*/

p; /*произведение цифр*/

clrscr(); /*очистка экрана*/

printf("Введите четырехзначное число: ");

scanf("%d",&num);

num=abs(num);

printf("Цифры числа %d: ",num);

i=num/1000;

j=num/100%10;

k=num/10%10;

l=num%10;

printf("%d %d %d %d\n",i,j,k,l);

p=i*j*k*l;

printf("Произведение цифр числа %d равно: %d",num,p);

printf("\nНажмите любую клавишу...");

getch(); /*ожидание нажатия клавиши*/

}

Пример 3.

Вычислить значение функции:

Элементарные средства программирования - student2.ru , диапазон изменения аÎ(0;19] с шагом изменения Da=0.5.

#include<STDLIB.H>

#include<CONIO.H>

#include<STDIO.H>

#include<MATH.H>

void main(){

float a,y,da,a1,a2;

int i=0;

clrscr();

printf("Введите значение шага изменения:");

scanf("%f",&da);

printf("Введите левую границу интервала:");

scanf("%f",&a1);

printf("Введите правую границу интервала:");

scanf("%f",&a2);

for(a=a1;a<a2;a+=da){

i++;

if(1<a && a<5)/*условный оператор: если 1<a и a<5*/

{y=a;printf("При a=%.2f y=%.3f",a,y);}

if(9<a && a<19)

{y=a*a;printf("При a=%.2f y=%.3f",a,y);}

if(a>=5 && a<=9)

{y=a*a*a;printf("При a=.2%f y=%.3f",a,y);}

printf("\n");

if(i>24)

{getch();i=0;}

}

getch();

}

Контрольные вопросы:

1.Алфавит, идентификаторы, служебные слова.

2.Константы. Предельные значения и типы арифметических констант.

3.Переменные. Предельные значения переменных. Инициализация переменных.

4.Операции. Ранги операций. Унарные и бинарные операции.

5.Отношения и логические выражения. Оператор присваивания.

6.Приведение типов. Правила преобразования типов.

7.Директивы #include<> и #define.

8.Структура программы на языке С.

9.Функции форматированного ввода и вывода.

Задание на выполнение:

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

2. Вычислить периметр и площадь прямоугольного треугольника по длинам двух катетов. Предусмотреть проверку вводимых данных на отрицательность.

3. По координатам трех вершин некоторого треугольника найти его площадь и периметр. Предусмотреть проверку возможности построения треугольника с заданными вершинами.

4. Вычислить дробную часть среднего геометрического трех заданных положительных чисел. Предусмотреть проверку вводимых данных на отрицательность.

5. Определить, является ли заданное целое число А нечетным двузначным числом. Предусмотреть проверку вводимых данных на отрицательность.

6. Определить, имеется ли среди заданных целых чисел A, B, C хотя бы одно четное. Предусмотреть проверку вводимых данных на отрицательность.

7. Даны три числа. Выбрать те из них, которые принадлежат заданному отрезку [a,b].

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

9. Для заданных вещественных чисел а, b, c определить, имеет ли уравнения ax2+bx+c=0, хотя бы одно вещественное решение.

10. Определить, равен ли квадрат заданного целого трехзначного числа кубу суммы цифр этого числа.

11. Определить, есть ли среди цифр заданного целого трехзначного числа одинаковые.

12. Заданы площади круга и квадрата. Определить, поместится ли квадрат в круге.

13. Для задачи 12 определить, поместится ли круг в квадрате.

14. Заданы координаты двух точек. Определить, лежат ли они на одной окружности с центром в начале координат.

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

16. Проверить, можно ли построить треугольник из отрезков с длинами x, y, z. Предусмотреть проверку вводимых данных на отрицательность.

17. Поверить, можно ли построить параллелограмм из отрезков с длинами x, y, u, w. Предусмотреть проверку вводимых данных на отрицательность.

18. Выбрать наибольшее из трех заданных чисел.

19. Два прямоугольника заданы длинами сторон. Стороны прямоугольников параллельны. Определить, можно ли первый прямоугольник целиком разместить во втором. Предусмотреть проверку вводимых данных на отрицательность.

20. Решить линейное уравнение ax=b.

21. Определить номер квадранта, в котором находится точка с заданными координатами x, y.

22. Идет k-я секунда суток. Определить, сколько полных часов и полных минут прошло к этому моменту. Предусмотреть проверку вводимых данных на отрицательность.

ЛАБОРАТОРНАЯ РАБОТА №2

Тема: Организация циклов типа ДЛЯ и ПОКА на языке С

(4 часа)

В языке С используются три различных оператора цикла, обозначаемых соответственно служебными словами while, for, do.

Циклы типа for (для) используются, когда число повторений цикла известно к началу его выполнения.

Циклы типа while (пока) используются, когда число повторений цикла не известно к началу его выполнения.

Циклы while и for построены по схеме:

заголовок_цикла

тело_цикла

Во всех трех операторах цикла тело цикла – это либо отдельный, либо составной оператор, т. е. последовательность операторов, заключенная в операторные скобки {}. Тело цикла может быть и пустым оператором.

Цикл while (цикл с предусловием) имеет вид:

while (выражение_условие)

тело_цикла

В качестве выражения_условия чаще всего используется отношение или логическое выражение. Если оно истинно, т. е. не равно 0, то тело цикла выполняется до тех пор, пока выражение_условие не станет ложным. Проверка истинности выражения осуществляется до каждого выполнения тела цикла (до каждой итерации). Таким образом, для заведомо ложного выражения_условия тело цикла не выполнится ни разу. Выражение_условие может быть и арифметическим выражением. В этом случае цикл выполняется, пока значение выражения_условия не равно 0.

Цикл с предусловием:

...

i=2;

b=1.0;

r=x;

while(r>eps || r<eps)/*операция ||– логическое или */

{

b=b+r;

r=r*x/i;

i++;

}

Цикл for (параметрический) имеет вид:

for(выражение_1;выражение_условие;выражение_2)

тело_цикла

Первое и третье выражения в операторе for могут состоять из нескольких выражений, разделенных запятыми. Выражение_1 определяет действия, выполняемые до начала цикла, т. е. задает начальные условия для цикла; чаще всего это выражение присваивается. Выражение_условие – обычно логическое или арифметическое. Оно определяет условия окончания или продолжения цикла. Выражение_2 обычно задает необходимые для следующей итерации изменения параметров или любых переменных тела цикла. После выполнения выражения_2 вычисляется истинность выражения_условия и все повторяется. Таким образом, выражение_1 вычисляется только один раз, а выражение_условие и выражение_2 вычисляются после каждого выполнения тела цикла. Цикл продолжается до тех пор, пока не станет ложным выражение_условие. Любое из выражений в операторе for может отсутствовать, но разделяющий символ “;” должен присутствовать всегда. Если отсутствует выражение_условие, то считается, что оно истинно и нужны специальные средства для выхода из цикла. В заголовок цикла for может быть внесена инициализация всех переменных в качестве выражения выражение_1 и, кроме того, все исполнимые операторы цикла, например:

Исходный вариант:

b=1.0;

r=x;

for(i=2;r>eps||r<-eps;i++){

b=b+r;

r=r*x/i;

}

Преобразованный цикл:

for(i=2,b=1.0,r=x;r>eps||r<-eps; b+=r, r*=x/i, i++);

В данном случае тело цикла – пустой оператор.

Цикл do (цикл с постусловием) имеет вид:

do

тело_цикла

while (выражение_условие)

Выражение_условие логическое или арифметическое, как и в цикле while. В цикле do тело цикла всегда выполняется, по крайней мере, один раз. После каждого выполнения тела цикла проверяется истинность выражения_условия (на равенство 0), и если оно ложно (т. е. равно 0), то цикл заканчивается. В противном случае тело цикла выполняется вновь.

Цикл с постусловием:

i=1;

b=0.0;

r=1.0;

do {

b=b+r;

r=r*x/i;

i++;

} while (r>=eps || r<=-eps);

Контрольные вопросы:

1.Оператор цикла for.

2.Оператор цикла while.

3.Оператор цикла do.

4.Оператор break.

5.Оператор continue.

Задание на выполнение:

1. Вычислить сумму Z=1+2+3+... . Вычисления прекратить, когда значение Z превысит заданное значение А.

2. Имеется последовательность чисел a1, a2, ... ,aN, образована по правилу аi=random(N). Найти сумму первых из них (считая слева направо), произведение которых не превышает заданного числа М.

3. Последовательность Элементарные средства программирования - student2.ru образована по правилу аi=1/i. Найти сумму аi.

4. Дано натуральное N. Выяснить, сколько цифр оно содержит.

5. Дано натуральное число N. Вычислить произведение первых N сомножителей: 1/2*7/8*13/14*19/20*... .

6. Найти сумму цифр заданного натурального числа.

7. Дано натуральное число N. Вычислить Элементарные средства программирования - student2.ru

8. Цифры заданного натурального числа переписать в обратном порядке.

9. Подсчитать сумму квадратов чисел заданной последовательности.

10. Вычислить сумму Z=1+2-3+4-5... . Вычисления прекратить, когда значение Z превысит заданное значение А.

11. Вычислить значение функции z=(a+b)/i, если а изменяется от 0 с шагом 1, b изменяется от 5 с шагом 1, i=1,...,N. а и b изменяются одновременно с i.

12. Дано вещественное число А. Найти среди чисел 1, 1+1/2, 1+1/2+1/3+... первое число, большее А.

13. Вычислить значение sinx+sin2x+...+sinnx

14. Числа Фибоначчи определяются по формулам F0=F1=1; Fi=Fi-1+Fi-2 при i=2,3,... Найти первое из чисел Фибоначчи, которое превосходит заданное число М (М>0).

15. Вычислить значение sinx+sinx2+...+sinxn

16. Определить, является ли заданное целое число палиндромом (палиндром – число, одинаково читаемое слева направо и справа налево).

17. Для заданного набора коэффициентов a, b, c, d найти наименьшее значение функции y=ax3+bx2+cx+d и значение аргумента, при котором оно получено. Значение x изменяется от 0 до 2 с шагом 0,2.

18. Найти число, значение которого получено изменением первой и последней цифры заданного натурального числа.

19. Дано натуральное N. Вычислить сумму тех элементов серии i3-3*i*N+N, i=1,2,...,N, которые являются удвоенными нечетными числами.

20. Подсчитать сумму и произведение членов заданной последовательности. Считывание производится до тех пор, пока не будет введен 0.

ЛАБОРАТОРНАЯ РАБОТА №3

Тема: Массивы. Вложение операторов цикла на языке С

(4 часа)

Массив – это набор объектов одинакового типа, доступ к которым осуществляется по индексу в массиве. Массивы можно описывать следующим образом:

тип_данных имя_массива [размер массива];

Компилятор отводит под массив память размером (sizeof(тип)*размер_массива) байтов. Нумерация элементов любого массива всегда начинается с 0, т. е. индекс изменяется от 0 до N-1, где N – количество значений индекса.

Используя имя массива и индекс, можно адресоваться к элементам массива:

имя_массива [значение_индекса].

Примеры описания массивов:

char name [20];

int grades [125];

float income [30];

double m [1500];

В соответствии с синтаксисом языка С существуют только одномерные массивы, однако элементами одномерного массива, в свою очередь, могут быть массивы. Поэтому двумерный массив определяется как массив массивов. Таким образом, float Z[13][10] – это массив Z из 13 элементов-массивов, каждый из которых, в свою очередь, состоит из 10 элементов типа float.

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

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

int m[]={1,2,3,4,5};

После такого определения m[0]=1, m[1]=2, m[2]=3, m[3]=4, m[4]=5.

int m1[3][2]={{1,2},{3,4},{5,6}};

После такого определения m1[0][0]=1, m1[0][1]=2, m1[1][0]=3, m1[1][1]=4, m1[2][0]=5, m1[2][1]=6. Тот же результат можно получить с одним списком инициализации:

int m1[3][2]={1,2,3,4,5,6};

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

Вложенные циклы.В теле цикла разрешены любые исполнимые операторы, в том числе и циклы, т. е. можно конструировать вложенные циклы.

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

for(параметры цикла){

оператор1;

операторN;

for(параметры цикла){

оператор1;

операторN;

}

}

Аналогичным образом оформляются вложенные циклы while и do…while.

while(условие){

оператор1;

операторN;

while(условие){

оператор1;

операторN;

}

}

При работе с вложенными циклами следует обратить внимание на правила выполнения операторов break и continue.Каждый из них действует только в том операторе, в теле которого он непосредственно использован. Оператор break прекращает выполнение ближайшего внешнего для него оператора цикла. Оператор continueпередает управление на ближайшую внешнюю проверку условия продолжения цикла.

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

Контрольные вопросы:

1.Массивы и размерность массивов.

2.Индексирование массивов.

3.Инициализация массивов.

4.Вложенные циклы.

5.Использование операторов break и continue во вложенных циклах.

Задание на выполнение:

Наши рекомендации