Операторы циклов. Массивы
Цель работы: Изучить особенности использования операторов цикла while, for и do-while, а также специальных операторов break и continue. Ознакомиться с понятием «массив», получить навыки ввода, вывода и обработки одномерных и двумерных массивов.
Программа работы:
Изучить операторы цикла while, for и do-while, получить навыки составления программ с использовани этих операторов (выполнить два задания из п.1. Методических указаний).
Изучить специальные операторы break и continue.
Ознакомиться с понятием «массив», получить навыки ввода, вывода и обработки одномерных и двумерных массивов. Выполнить индивидуальное задание, согласно выданному преподавателем варианту.
Методические указаниия
К п.1. Операторы цикла.
Циклы организуются, чтобы выполнить некоторый оператор или группу операторов определенное число раз. В языке Си три оператора цикла: for, while и do - while. Первый из них for формально записывается, в следующем виде:
for (выражение1; выражение2; выражение3) {тело_цикла}Тело цикла составляет либо один оператор, либо несколько операторов, заключенных в фигурные скобки {... }. В выражениях 1, 2, 3 фигурирует специальная переменная, называемая управляющей. По ее значению устанавливается необходимость повторения цикла или выхода из него.
|
|
Выражение1 присваивает начальное значение управляющей переменной, выражениеЗ изменяет его на каждом шаге, а выражение2 проверяет, не достигло ли оно граничного значения, устанавливающего необходимость выхода из цикла.
Например, простейший оператор цикла имеет вид:
for(i=0; i<10; i++)
printf("%d\n",i);
При выполнении этого оператора будут распечатаны в столбик цифры: от 0 до 9.
Задание: напишите программу на языке Си для вывода на экран цифр в обратном порядке (от 9 до 0).
Любое из трех выражений в цикле for может отсутствовать, однако точка с запятой должна оставаться. Таким образом, for (;;) {...} - это бесконечный цикл.
Оператор while формально записывается в таком виде:
while (выражение) тело_циклаВыражение в скобках может принимать ненулевое (истинное) или нулевое (ложное) значение. Если оно истинно, то выполняется тело цикла и выражение вычисляется снова. Если выражение ложно, то цикл while заканчивается.
Пример программы с циклом while:
...
int n=0;
while(n!=20) // пока n не равно 20
{
printf(" %d \n", 2*n); //вывести произведение n*2
n++; // увеличить n на 1
}
...
Рисунок 6. Результаты выполнения программы с циклом while
На первом этапе задается n=0. Затем программа осуществляет сравнение числа n c числом 20. Т.к. выражение (n!=20) истинно (т.е. n≠20) – программа начинает выполнение тела цикла - вывод произведения n*2 (произведение=0) и увеличение значения n на единицу. Далее программа снова возвращается к проверке условия цикла, т.е. сравнивает уже новое (увеличенное на единицу) значение n с числом 20 и т.к. условие остается истинным (n≠20) - снова производит вывод произведения n*2 (теперь произведение=2) и увеличение числа n на единицу. Так будет продолжаться до тех пор, пока значение n не станет равным числу 20 – в этом случае программа осуществит выход из цикла.
|
|
Оператор do-while формально записывается следующим образом:
do {тело_цикла} while (выражение);Основным отличием между циклами while и do - while является то, что тело в цикле do - while выполняется по крайней мере один раз. Тело цикла будет выполняться до тех пор, пока выражение в скобках не примет ложное значение. Если оно ложно при входе в цикл, то его тело выполняется ровно один раз.
Приведем пример программы с циклом do – while, результат выполнения которой аналогичен программе с циклом while (см. рисунок 6.)
...
int n=0;
do
{
printf(" %d \n", 2*n);
n++;
}
while(n!=20);
...
Допускается вложенность одних циклов в другие, т.е. в теле любого цикла могут появляться операторы for, while и do - while.
Задание: Используя оператор while напишите текст программы, которая предлагает пользователю ввести число от 0 до 10. Пока пользователь вводит числа меньше 10 предложение должно повторяться. Как только пользователь введет число больше 10 – программа должна завершить свое выполнение (примерный результат работы программы представлен на рисунке 7.).
Рисунок 7. Примерный результат работы программы с использованием цикла (задание)
К п.2 .Операторы break и continue.
В теле цикла могут использоваться специальные операторы break и continue. Оператор break обеспечивает немедленный выход из цикла, оператор continue вызывает прекращение очередной и начало следующей итерации. Рассмотрим эти операторы на примере следующей программы:
Пример: нужно вводить числа с клавиатуры, если число больше нуля, то выводим на экран сообщение «number>0», если меньше, то - «number<0». Если, вдруг, оказывается, что мы ввели 0, то продолжаем дальше вводить значения. Условием выхода из цикла будет значение -100.
Решение:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int number;
for (;;)
{
printf("Enter number \n");
scanf ("%d", &number);
if (number == -100)
{break;}
if (number == 0)
{continue;}
if (number > 0)
{printf ("number>0 \n");}
if (number < 0)
{printf ("number<0 \n");}
}
system("PAUSE");
return 0;
}
Результат работы данной программы необходимо представить в отчете.
К п.3. Массивы.
Массивы - это последовательная группа ячеек памяти, имеющих одинаковое имя, при этом обратится к элементу массива можно, указав в квадратных скобках индекс, который указывает на его относительную позицию. Число элементов массива назначается при его определении и в дальнейшем не изменяется. Массивы определяются так же, как и переменные:
int a[100]; char b[20]; float d[50];В первой строке объявлен массив а из 100 элементов целого типа: а[0], а[1],..., а[99] (индексация всегда начинается с нуля). Во второй строке элементы массива b имеют тип char, а в третьей - float.
Язык Си также позволяет инициализировать массив при его определении. Для этого используется следующая форма:
тип имя_массива[...]... [...] = {список значений};
Примеры:
int a[5] = {0, 1, 2, 3, 4}; char ch[3] = {'d', 'e', '9'}; int b[2][3] = {1, 2, 3, 4, 5, 6};В последнем случае представлен двумерный массив: b[0][0] = 1, b[0][1] = 2, b[0][2] = 3, b[1][0] = 4, b[1][1] = 5, b[1][2] = 6.
Двумерные массивы состоят из строк и столбцов, содержащих элементы одного типа, пример двумерного массива - матрица размерностью nxn. Объявление двумерного массива в программе имеет следующийформат:
тип_данных название_массива[размер_по_у][размер_по_х];
Примеры:
int A[10][10]; /объявление целочисленного массива размерностью 10х10 элементов
|
|
float MyArray[5][5]; /матрица из действительных чисел, размерность матрицы 5х5
char An_Array_For_Char_Data[1000][1000]; /это двумерный массив (матрица) из
/ символов, размерность1000х1000.
Отдельный элемент матрицы – это по сути переменная того типа данных, который указан при объявлении массива.
Обратиться к элементу матрицы можно по его номеру, у элемента матрицы есть два номера – номер строки (i) и номер столбца (j).
Пример1:
A[0][0], A[5][5] – элементы матрицы с номерами (0;0) и (5;5) соответственно.
Пример 2: Присвоить элементу матрицы А с номером (1;4) значение 5.
Решение:
...
A[1][4]=5;
...
Пример 3: Если элемент матрицы MyArray с номером (5;1) равен 8, вывести на экран сообщение “Элемент равен восьми”
Решение:
...
if(MyArray[5][1]==8)
{
printf(“\n Элемент равен восьми”);
}
...
Так же, как и для одномерных массивов, при вводе и выводе значений элементов массивов необходимо перебирать весь диапазон индексов. В случае двумерного массива – два диапазона индексов.
Фрагмент кода, реализующий ввод значений элементов двумерного массива А(5х6):
...
int i,j;
int A[5][6]; // Объявляем матрицу из 5 строк и 6 столбцов
for(i=0;i<5;i++) // i от 0 до 5, поскольку матрица содержит 5 строк
{
for(j=0;j<6;j++) // j до 6, поскольку в каждой строке 6 элементов
{
printf("Input please A[%d][%d]: ", i, j);
scanf("%d", &A[i][j]); // Ввод одного элемента матрицы...
}
}
...
Фрагмент кода, реализующий вывод значений элементов массива А(5х6) на экран:
...
for(i=0;i<5;i++)
{
for(j=0;j<6;j++)
{
printf("%5d", A[i][j]);
}
printf("\n");
}
...
Пример: Подсчитать количество элементов матрицы, значение которых больше пяти.
Решение:
...
int A[3][2];
int i,j;
printf("Massive A 3x2: \n");
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
{
printf("Input A[%d][%d]: ", i, j);
scanf("%d", &A[i][j]);
}
}
int kolichestvo=0;
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
{
if(A[i][j]>5)
{
kolichestvo++;
}
}
}
printf("Bolshe 5 bilo %d elementov \n", kolichestvo);
...
Задание к лабораторной работе №3
1. Осуществите ввод с клавиатуры целочисленные элементы матрицы 3x4. Выведите исходную матрицу на экран. Умножьте каждый отрицательный элемент матрицы на 3 и выведите результат на экран.
|
|
2. Осуществите ввод с клавиатуры двумерного массива 4x2. Выведите его на экран. Посчитайте количество нулевых элементов в нечетных столбцах.
3. Осуществите ввод с клавиатуры двумерного массива 3x3. Выведите его на экран. Вычислите сумму всех элементов.
4. Осуществите ввод с клавиатуры двумерного массива 2х4 целочисленных элементов и определите среди них минимальное значение.
5. Создайте двумерный массив X, имеющий четыре строки и три столбца. Найдите в нем максимальный элемент.
6. Создайте двумерный массив вещественных чисел, имеющий 3 строки и 5 столбцов, выведите его на экран. Затем разделите каждый элемент массива на значение первого элемента строки, в которой они расположены и результат выведите на экран.
7. Осуществите ввод с клавиатуры двумерного массива 5x3. Выведите его на экран. Посчитайте количество отрицательных элементов в четных строках.
8. Осуществит ввод с клавиатуры двумерного массива 4x2. Выведите его на экран. Поменяйте местами вторую и четвертую строку. Выведите результат
9. Осуществит ввод с клавиатуры двумерного массива 3x3. Выведите его на экран. Поменяйте местами первый и третий столбец. Выведите результат на экран.
10. Осуществите ввод с клавиатуры целочисленные элементы матрицы 5x2. Выведите исходную матрицу на экран. Если элемент матрицы меньше 10, умножить его на 2. Результат необходимо вывести на экран.