Задание
Сформировать массив простых множителей заданного числа.
Теоретический материал
Операторы создают то, что в обыденном сознании ассоциируется с понятием алгоритм – описание последовательности действий, выполняемых программой, или логика ее работы. В Си реализован общий для большинства языков программирования «джентльменский набор» управляющих конструкций:
· линейная последовательность действий;
· условная конструкция (если-то-иначе);
· конструкция повторения (цикл);
· переход (и его разновидности).
Управляющая конструкция - линейная последовательность действий является основной в языках программирования.
В соответствии с принципом вложенности элементами последовательности могут быть не только элементарные действия (простые операторы), но и вложенные синтаксические конструкции, которые на текущем уровне также выполняются последовательно друг за другом.
В Си используется такой принцип: если составной частью управляющей конструкции является единственный оператор, то он никак синтаксически не выделяется. Если же составной частью является последовательность операторов, то она заключается в фигурные скобки ({}) и образует блок.
Блок, или составной оператор выступает как единая синтаксическая единица, вложенная в конструкцию верхнего уровня. В начале его могут быть определены собственные переменные блока, действие которых не распространяется за его пределы, а время существования совпадает с временем его выполнения. Операторы, составляющие блок, выполняются последовательно друг за другом.
Единственный условный оператор имеет две разновидности: с else и без него.
В качестве условия выступает выражение, которое может иметь любой целый результат и интерпретируется в соответствии с принятыми в Си соглашениями о логических значениях: 0 –«ложь», не 0 – «истина». Действует он как и во всех языках программирования: если значение выражения есть «истина», то выполняется первый оператор, если «ложь» - второй (после else). Конструкция является структурированной, обе ветви – прямая и альтернативная – «сливаются» в одну
В Си имеется три вида циклических конструкций. Общее у них одно: все условия в них являются условиями продолжения, то есть циклы продолжаются, пока значение этих условных выражений – «истина». Операторы цикла состоят из заголовка, в котором определяется характер циклического процесса и оператора - тела цикла. Скобки в заголовке цикла являются неотъемлемым элементом синтаксиса языка.
Массив – совокупность элементов одного типа.
тип имя_массива[количество_элементов]
тип – задает тип элемента массива и может быть как стандартный так и определенный пользователем.
имя_массива – задается пользователем и используется для обращения к массиву, может состоять из символов английского алфавита, цифр и символов подчеркивания но недолжно начинаться с цифры и недолжно совпадать с зарезервированными словами среды разработки.
количество_элементов – целочисленная константа определяющая сколько элементов будет в массиве.
Доступ к элементу массива осуществляется с помощью индекса, например A[0] – первый элемент, A[1] – второй элемент, A[n] – n-й элемент массива. Нумерация элементов начинается с нуля. В памяти элементы массива хранится последовательно т.е A[0], A[1], A[2]…A[n]. Имя массива это адрес ячейки памяти по которому находится первый элемент.
Описание алгоритма
Дано:
Целое число
Результат:
Массив простых множителей заданного числа
Метод решения:
Путем перебора всех целых чисел до значения заданного числа (исключая единицу, так как единица при умножении на себя дает единицу и так может продолжаться до окончания места в массиве), находятся все множители числа. Далее они проверяются путем деления на себя, являются ли они простыми (равен ли остаток их деления на самих себя нулю).
Найденный простой множитель вносится в формирующийся массив и выводится на экран.
После этого для продолжения поиска следующего простого множителя, заданное число делится на найденный множитель, и цикл повторяется с остатком от деления, пока не разложится до последнего множителя без остатка.
Описание реализации
Подключаемые библиотеки:
#include "stdio.h"
#include "conio.h"
Используемые переменные:
m - размер массива (количество элементов)
mas[] - массив чисел
val – переменная для заданного числа (value)
i - счетчик для перебора всех целых чисел для нахождения множителя
mn – переменная для множителя
Используемые конструкции:
if - для исключения ввода единицы, для которой нет решения.
for – для обхода всех значений последовательности (массива), и условие для проверки множителя, простой ли он, путем деления на себя
Функции, используемые в программе:
printf() – вывод форматированного на экран
scanf_s() – считывание введенного пользователем числа
_getch() – остановка программы до нажатия любой клавиши с клавиатуры
Основной блок программы void main () инициализирует переменные, массив, вызывает функцию ввода/вывода значения для переменной, находит множители, проверят, являются ли они простыми, вносит в массив и выводит его на экран.
Пример работы программы
Результат работы программы.
Пример №1.
Пользователь вводит число. Программа раскладывает его на простые множители
Пример №2.
Пример №3.
Пример работы, если пользователь вводит единицу.
Выводы
В ходе выполнения лабораторной работы были изучены основные принципы работы с массивом. Использование массива для хранения полученных данных, а также использование цикла for для обхода всех элементов массива и введения условия для проверки каждого множителя, является ли он простым.
На приведенном наборе тестов программа работает корректно.
Приложение. Текст программы с комментариями.
#include<conio.h>
#include<stdio.h>
#define m 1000
void main()
{
int mas[m];
int val; //переменная для заданного числа, разлагаемого на множители
int i; //переменная-счетчик
int mn; //множитель
printf("vvedite tseloe chislo, neravnoe edinnitse: ");
scanf_s("%d", &val);//ввод пользователем числа, которое нужно разложить на множители
if (val == 1) //исключение единицы
{
printf("Resheniya net");
_getch();
}
else{
for (i = 1; i <= val; i++) //счетчик-поиск множителей
{
for (mn = 2; val%mn!= 0; mn++); //проверка, является ли множитель простым путем деления самого на себя без остатка
val /= mn; //уменьшение заданного числа делением на найденный множитель
mas[i] = mn; //внесение найденного значения в массив
printf(" %d", mas[i]); //вывод значения массива на экран
}
_getch();
}
}
Защита.