
- •«Омский государственный технический университет» программирование и основы алгоритмизации
- •Лабораторная работа 1
- •Алфавит языка, зарезервированые слова, операторы
- •Структура программы
- •Основные типы данных
- •Оператор присваивания, процедуры ввода-вывода
- •Printf(“строка форматов”, [список выводимых аргументов]
- •% [Флаг] [ширина] [.Точность]символ формата
- •Scanf(“%строка форматов”, &имя переменной);
- •Лабораторная работа 2 програмирование разветленых алгоритмов. Операторы передачи управления
- •Лабораторная работа 3 програмирование циклических алгоритмов с заданым числом повторений
- •Лабораторная работа 4 структурированные типы данных. Программирование алгоритмов обработки массивов
- •Лабораторная работа 5 обработка символьных и строковых данных
- •Лабораторная работа 6 указатели
- •Лабораторная работа 8 программирование с использованием функций
- •Лабораторная работа 9 структуры и объединения
- •Индивидуальные задания
Лабораторная работа 3 програмирование циклических алгоритмов с заданым числом повторений
Для любого оператора цикла вход в цикл возможен только через его начало, выход осуществляется как вследствие естественного окончания цикла, так и путем выполнения оператора перехода GOTO или процедур выхода, содержащихся внутри цикла.
В языке С/С++ известно три вида оператора цикла:
1) итерационный цикл (оператор цикла со счетчиком) (for (инициализация; выражение_условие; список_выражений;) тело_цикла;
цикл с предусловием (while (выражение_условие) тело_цикла;)
цикл с постусловием (do тело_цикла while(выражение_условие;).
Тело_цикла – это либо отдельный оператор (в том числе и пустой), либо составной оператор, либо блок.
Оператор цикла со счетчиком (итерационный цикл):
for (<выражение инициализации>;<выражение проверки условия>;<выражение коррекции>) <тело цикла>;
где <выражение инициализации> служит для инициализации счетчика, и оно осуществляется только один раз при входе в цикл; <выражение коррекции> вычисляется на каждой итерации (вычислительном шаге) после выполнения операторов тела цикла.
Примеры записи оператора for():
for (n=10;n<0;n--) // переменная n в цикле на каждом шаге уменьшается на 1 до тех пор пока не станет равной 0
for (x=1; y<=75; y=5*x+++15) // выражение коррекции представляет собой сложное алгебраическое выражение, в котором одновременно х увеличивается с шагом 1, а у рассчитывается по формуле
for (x=1,y=1.5;y<=5.5;x++,y+=x*0.3) // выражения инициализации и коррекции могут состоять более чем из одной операции
for(; ;) // бесконечный цикл
При работе с операторами цикла самыми распространенными являются ошибки:
организация «бесконечного» цикла, в случае если выражение проверки условия записано некорректно;
«лишний шаг» возникает при работе с массивами, когда программа должна обратиться к несуществующему элементу. Компилятор не выдает сообщений об ошибках такого рода.
Оператор цикла с предусловием:
while ( <выражение условие> ) <оператор>;
Оператор может быть простым, составным или пустым оператором. Цикл выполняется до тех пор, пока условие принимает значение «истинно» (т.е. отлично от нуля). Когда же условие примет значение «ложно», программа передаст управление следующему оператору программы. Так же, как и в цикле for, в цикле while сначала проверяется условие, а затем выполняется оператор – это, так называемый, цикл с предусловием. Тип «условия» должен быть арифметическим или приводимым к нему.
Пример: while (i<100) p++;
Оператор цикла с постусловием
В отличие от предыдущих циклов в цикле do - while условие проверяется в конце оператора цикла.
do {<операторы>} while ( <условие выполнения> );
Пример: do {
n *= i;
i++;
}
while (i <= 100);
Пример 2. Вычислить сумму элементов s=1+1/2+1/3+…+1/n. Для любого целого значения n.
Данная задача является классическим примером использования операторов цикла. На рис. 3. показан алгоритм ее решения.
#include <stdio.h> // библиотека, содержащая описание
// операторов ввода/вывода
# include <conio.h> // библиотека, содержащая описание
// операторов для работы с экраном
void main() // заголовок главной функции программы
{int i, n; // описание целых переменных
float s=0, r; // описание вещественных переменных
clrscr(); // очистка экрана
printf (“Vvedite n”); // вывод информационного сообщения
scanf (“%d”,&n); // ввод с клавиатуры значения n
for(i=1;i<=n;i++) // итерационный цикл i от 0 до n
{r=1/(i*i); // вычисление текущего элемента ряда
s+=r; // расчет суммы ряда
}
printf (“Summa S=%3.1 f\n”); // вывод результата
getch(); // процедура задержки экрана, пока не
// нажата любая клавиша
}
|
|
Рис. 3. |
Рис. 4. |
Пример.
Вычислить
значение двух функций F1(x)=tg(x)
и F2(x)=sin(x)
в точка, равномерно распределенных на
интервале
,
где
,
Алгоритм решения задачи показан на рис. 4.
#include <stdio.h> // библиотека, содержащая описание
// операторов ввода/вывода
# include <conio.h> // библиотека, содержащая описание
// операторов для работы с экраном
# include <math.h> // библиотека, содержащая описание
//математических операторов
void main() // заголовок главной функции программы
{const float a=M_PI_4, b=M_PI;
int i=1, n; // описание целых переменных
float f1, f2, x=a, dx; // описание вещественных переменных
clrscr(); // очистка экрана
printf (“Vvedite n”); // вывод информационного сообщения
scanf (“%d”,&n); // ввод с клавиатуры значения n
printf(“-------------------------------------------------”);
printf(“| i | X | F1 | F2 |”);
printf (“|--------|-----------|--------------|-------------|”)
dx=(b-a)/(n-1); // вычисление шага изменения аргумента х
while (x<=b) // оператор цикла с предусловием, пока х<=b
{f1=tan(x); // вычисление функции f1
f2=sin(x); // вычисление функции f2
x+=dx; // шаг изменения х
i++; // номер точки
printf (“%3d %3.2f %3.2f %3.2f\n”, i,x,f1,f2); // вывод результата
}
printf (“________________________________”); // вывод результата
getch(); // процедура задержки экрана, пока не
// нажата любая клавиша
}