Сдвиг массива влево и вправо на 1 элемент - C (СИ)
Формулировка задачи:
неправильно сдвигает влево :с хелп
#define size 100
#include <stdio.h>
#include <math.h>
void vvod_mas(double *,int);
void left( double *, int );
void right( double *, int);
void main(void)
{ double x[size];
int n;
printf( "vvedite razmer massiva:");
scanf("%d",&n);
vvod_mas(x,n);
right(x,n);
left(x,n);
}
void vvod_mas(double *p,int k) {
for(int i = 0; i<k; ++i) {
printf("n[%d]=",i);
scanf("%lf", p++);}
}
void right( double *p, int k){ //функция смещение на 1 вправо
double temp=p[0];
for (int i=k-1; i>0;i--)
{p[i]=p[i-1];
p[0]=temp;}
printf("sdvig v prava \n");
for(int i=0;i<k;++i)
{printf("n[%d]=%.2lf \n",i,*(p++));}}
void left( double *p, int k){ //функция смещение на 1 влево
double temp=p[0];
for (int i=0; i<k-1;i++)
{p[i]=p[i+1];
p[k-1]=temp;}
printf("sdvig v leva \n");
for(int i=0;i<k;++i)
{printf("n[%d]=%.2lf \n",i,*(p++));
}}Решение задачи: «Сдвиг массива влево и вправо на 1 элемент»
textual
Листинг программы
void right(double *p, int k){ //функция смещение на 1 вправо
double temp = p[k-1];
for (int i = k - 1; i > 0; i--){
p[i] = p[i - 1];
}
p[0] = temp;
printf("sdvig v prava \n");
for (int i = 0; i<k; ++i)
{
printf("n[%d]=%.2lf \n", i, *(p++));
}
}
void left(double *p, int k){ //функция смещение на 1 влево
double temp = p[0];
for (int i = 0; i < k - 1; i++)
{
p[i] = p[i + 1];
}
p[k - 1] = temp;
printf("sdvig v leva \n");
for (int i = 0; i<k; ++i)
{
printf("n[%d]=%.2lf \n", i, *(p++));
}
}
Объяснение кода листинга программы
- В функции
rightпри смещении массива элементы сдвигаются вправо на одну позицию, а последний элемент обертывается в начало. - В функции
leftпри смещении массива элементы сдвигаются влево на одну позицию, а первый элемент обертывается в конец. - В обеих функциях используется цикл
for, который выполняет перестановку элементов массива. - В функции
rightиспользуется два вложенных циклаfor. Внутренний цикл выполняет перестановку элементов справа налево до тех пор, пока индекс не станет меньше или равным нулю. - Внешний цикл
forвыполняет итерацию по всем элементам массива, начиная с нулевого индекса и заканчивая индексомk. - В функции
leftиспользуется два вложенных циклаfor. Внутренний цикл выполняет перестановку элементов слева направо до тех пор, пока индекс не станет меньше или равнымk-1. - Переменная
tempиспользуется для временного хранения значения первого элемента массива в функцииleftи последнего элемента массива в функцииright. - Функция
printfиспользуется для вывода исходного массива перед смещением и после смещения. - В обоих функциях используется оператор
++для инкремента указателя на следующий элемент массива. - В обоих функциях используется оператор
*, чтобы получить значение указателя на массив. - Значение
kиспользуется как размер массива в обоих функциях. - В обоих функциях используется команда
break, чтобы прервать внутренний циклfor, когда индекс становится равным нулю в функцииrightиk-1в функцииleft. - В обоих функциях используется команда
continue, чтобы пропустить итерацию внутреннего циклаfor, когда индекс становится равным нулю в функцииrightиk-1в функцииleft. - В обоих функциях используется команда
return, чтобы завершить выполнение функции после выполнения всех операций. - В обоих функциях используется точка с запятой после каждой строки кода, чтобы указать конец команды.
- В обоих функциях используется точка с запятой после каждой строки вывода с помощью функции
printf, чтобы указать конец команды вывода. - В обоих функциях используется символ
n, чтобы разделить номера элементов массива от их значений при выводе с помощью функцииprintf. - В обоих функциях используется символ
%d, чтобы указать формат вывода целых чисел при выводе номеров элементов массива с помощью функцииprintf. - В обоих функциях используется символ
%.2lf, чтобы указать формат вывода чисел с плавающей точкой с точностью до двух знаков после запятой при выводе значений элементов массива с помощью функцииprintf. - В обоих функциях используется функция
printfдля вывода исходного массива перед смещением и после смещения.