Добрый день. Помогите, пожалуйста, составить функцию, которая переставляет в обратном порядке k элементов массива
A, начиная i-го (числа i и k задается пользователем):
A[1], A[2], …, A[i–1], A[i+k], A[i+k–1], …, A[i+1], A[i], A[i+k+1], …, A[n].
Массив динамический.
Другие языки программирования и технологии
Как сделать такую перестановку в массиве Си?
Все возможные перестановки элементов заданного массива - C++
↓
http ://www .cyberforum. ru/cpp-beginners/thread780746.html

↓
http ://www .cyberforum. ru/cpp-beginners/thread780746.html

#include <stdio.h>
#define BUFF 25
void swap(int* av, int* bv) {
int tmp = *av;
*av = *bv;
*bv = tmp;
}
void reverse(int* arr, int start, int count) {
int* begin;
int* end;
int* last;
if (start < 0) start = 0;
begin = arr + start;
end = arr + BUFF;
last = begin + count - 1;
if (begin >= end - 1) return;
if (last > end) last = end - 1;
while (begin < last) {
swap(begin, last);
++begin;
--last;
}
}
void fill(int* arr) {
int i;
for (i = 0; i < BUFF; ++i) arr[i] = i;
}
void print(int* arr) {
int* begin;
int* end = arr + BUFF;
for (begin = arr; begin != end; ++begin) printf("%3i", *begin);
printf("\n");
}
int main(void) {
int box[BUFF];
int start, count;
fill(box);
print(box);
printf(" Start index: ");
scanf_s("%i", &start);
printf(" Amount of elements: ");
scanf_s("%i", &count);
reverse(box, start, count);
print(box);
getchar();
getchar();
return 0;
}
#define BUFF 25
void swap(int* av, int* bv) {
int tmp = *av;
*av = *bv;
*bv = tmp;
}
void reverse(int* arr, int start, int count) {
int* begin;
int* end;
int* last;
if (start < 0) start = 0;
begin = arr + start;
end = arr + BUFF;
last = begin + count - 1;
if (begin >= end - 1) return;
if (last > end) last = end - 1;
while (begin < last) {
swap(begin, last);
++begin;
--last;
}
}
void fill(int* arr) {
int i;
for (i = 0; i < BUFF; ++i) arr[i] = i;
}
void print(int* arr) {
int* begin;
int* end = arr + BUFF;
for (begin = arr; begin != end; ++begin) printf("%3i", *begin);
printf("\n");
}
int main(void) {
int box[BUFF];
int start, count;
fill(box);
print(box);
printf(" Start index: ");
scanf_s("%i", &start);
printf(" Amount of elements: ");
scanf_s("%i", &count);
reverse(box, start, count);
print(box);
getchar();
getchar();
return 0;
}
У тебя ошибка в определении. Если менять так, как ты написал, то в перестановке будут участвовать k+1 элементов, а не k!
Вот считай: A[i+k], A[i+k–1], …, A[i+1], A[i] - это сколько получится?
Должно быть так:
A[1], A[2], …, A[i–1], A[i+k–1], …, A[i+1], A[i], A[i+k], A[i+k+1],…, A[n].
Вот считай: A[i+k], A[i+k–1], …, A[i+1], A[i] - это сколько получится?
Должно быть так:
A[1], A[2], …, A[i–1], A[i+k–1], …, A[i+1], A[i], A[i+k], A[i+k+1],…, A[n].
Ставь диван напротив телека
#include "stdafx.h"//Убрать, если не будет компилироваться.
#include "stdio.h"//Поменять "" на <>
#include "windows.h"//Поменять "" на <>
#include "locale.h"//Поменять "" на <>
#include "conio.h"//Поменять "" на <>
const int N=50;//Размерность массива.
void reverse(int* A,int i,int k);//Объявление функции перестановки.
int main()
{
int i=0,k=0;
bool err=0;//Индикатор ошибок.
char c;
setlocale(0,"Rus");//Включаем русскую кодировку в консоли.
do //Проверка ввода.
{
printf("Введите номер элемента массива, начиная с которого будет начата перестановка. \n");
scanf("%d", &i);//Счет элементов массива, при вводе, будем вести от единицы до N включительно.
printf("Введите количество элементов массива, для перестановки. \n");
scanf("%d", &k);
if((i>N || !i) || (k>N || !k) || ((N+1-i-k)<0))//Проверка пользовательского ввода. Выражения! i и! k равносильны i==0 и k==0, соответственно.
err=1;
else
err=0;
if(err)
{
printf("Ошибка! Некорректный ввод. Нажмите любую клавишу для повторного ввода. ""ESC""-Выход из программы. \n");
c=getch();//Считывание введеного символа, в переменную c.
}
if(!(c-27))//27-код клавиши "ESC".
exit(0);
system("cls");//Очистка консоли.
}while(err);//Если ввод некорректный, то пользователю будет предложенно ввести значения переменных заново.
i--;//Корректируем значение индекса, т. к. в C++ массивы индексируются от нуля до N-1, включительно.
int *A=new int[N];//Выделяем память под динамический массив A, размерности N-1.
for(int j=0; j<N; j++)//Заполняем элементы массива числами от 1 до N, включительно.
A[j]=j+1;
reverse(A,i,k);//Вызов функции перестановки.
for(int j=0; j<N; j++)//Счет элементов массива, при вводе, будем вести от единицы до N включительно.
printf("A[%d]=%d, ",j+1,A[j]);
printf("Press any key for continue . .\n");
getch();
delete[] A;//Освобождаем память, выделенную под массив.
return 0;
}
void reverse(int* A,int i,int k)//Реализация функции перестановки.
{
int tmp, l=i+k-1;//tmp-Переменная для временного хранения значения элемента массива. l-Индекс конечного элемента перестановки.
for(int j=i;j<=k/2.0+i-1;j++)//"k/2.0+i-1"-Индекс среднего элемента, участка массива, в котором будет произведена перестановка, уменьшенный на единицу.
{//j-Индекс начального элемента перестановки.
tmp=A[j];//Сохраяем значение j-го элемента массива в переменной tmp.
A[j]=A[l];//Записываем значение l-го элемента в j-й элемент массива.
A[l]=tmp;//Записываем сохраненное в переменной tmp значение j-го элемента массива в l-й элемент массива.
l--;//Уменьшаем значение переменной l на единицу.
//Функция перестановки меняет местами первый и последний элемент, участка массива, в котором производится перестановка.
//С каждым новым шагом цикла, размер этого участка уменьшаяется на два элемента. Индекс первого элемента увеличивается на единицу, а последнего уменьшается на единицу,
//И так, пока не будут поменяны местами значения всех граничных элементов, уменьшаюшегося на два элемента, с каждым шагом цикла, участка массива, в котором производится перестановка.
}
}
#include "stdio.h"//Поменять "" на <>
#include "windows.h"//Поменять "" на <>
#include "locale.h"//Поменять "" на <>
#include "conio.h"//Поменять "" на <>
const int N=50;//Размерность массива.
void reverse(int* A,int i,int k);//Объявление функции перестановки.
int main()
{
int i=0,k=0;
bool err=0;//Индикатор ошибок.
char c;
setlocale(0,"Rus");//Включаем русскую кодировку в консоли.
do //Проверка ввода.
{
printf("Введите номер элемента массива, начиная с которого будет начата перестановка. \n");
scanf("%d", &i);//Счет элементов массива, при вводе, будем вести от единицы до N включительно.
printf("Введите количество элементов массива, для перестановки. \n");
scanf("%d", &k);
if((i>N || !i) || (k>N || !k) || ((N+1-i-k)<0))//Проверка пользовательского ввода. Выражения! i и! k равносильны i==0 и k==0, соответственно.
err=1;
else
err=0;
if(err)
{
printf("Ошибка! Некорректный ввод. Нажмите любую клавишу для повторного ввода. ""ESC""-Выход из программы. \n");
c=getch();//Считывание введеного символа, в переменную c.
}
if(!(c-27))//27-код клавиши "ESC".
exit(0);
system("cls");//Очистка консоли.
}while(err);//Если ввод некорректный, то пользователю будет предложенно ввести значения переменных заново.
i--;//Корректируем значение индекса, т. к. в C++ массивы индексируются от нуля до N-1, включительно.
int *A=new int[N];//Выделяем память под динамический массив A, размерности N-1.
for(int j=0; j<N; j++)//Заполняем элементы массива числами от 1 до N, включительно.
A[j]=j+1;
reverse(A,i,k);//Вызов функции перестановки.
for(int j=0; j<N; j++)//Счет элементов массива, при вводе, будем вести от единицы до N включительно.
printf("A[%d]=%d, ",j+1,A[j]);
printf("Press any key for continue . .\n");
getch();
delete[] A;//Освобождаем память, выделенную под массив.
return 0;
}
void reverse(int* A,int i,int k)//Реализация функции перестановки.
{
int tmp, l=i+k-1;//tmp-Переменная для временного хранения значения элемента массива. l-Индекс конечного элемента перестановки.
for(int j=i;j<=k/2.0+i-1;j++)//"k/2.0+i-1"-Индекс среднего элемента, участка массива, в котором будет произведена перестановка, уменьшенный на единицу.
{//j-Индекс начального элемента перестановки.
tmp=A[j];//Сохраяем значение j-го элемента массива в переменной tmp.
A[j]=A[l];//Записываем значение l-го элемента в j-й элемент массива.
A[l]=tmp;//Записываем сохраненное в переменной tmp значение j-го элемента массива в l-й элемент массива.
l--;//Уменьшаем значение переменной l на единицу.
//Функция перестановки меняет местами первый и последний элемент, участка массива, в котором производится перестановка.
//С каждым новым шагом цикла, размер этого участка уменьшаяется на два элемента. Индекс первого элемента увеличивается на единицу, а последнего уменьшается на единицу,
//И так, пока не будут поменяны местами значения всех граничных элементов, уменьшаюшегося на два элемента, с каждым шагом цикла, участка массива, в котором производится перестановка.
}
}
Клавиша меняет.
В самолете на соседних креслах блондинка и адвокат. Лететь долго. Блондинка молча отворачивается и смотрит в иллюминатор. Адвокат блондинке: — Давайте я Вам задаю вопрос, если вы не знаете ответ — Вы мне 5 долларов. Потом Вы мне задаете вопрос, если я не знаю ответ — я Вам 500 долларов. Блондинка соглашается. Адвокат: — Каково расстояние от Луны до Земли? Блондинка молча отдает ему 5 долларов. Блондинка: — Кто поднимается в гору на трех ногах, а спускается на четырех? Проходит пару часов. Адвокат обзвонил всех друзей, перерыл Интернет, ответа найти не может. Делать нечего, отдает блондинке 500 долларов и спрашивает: — Кто это??? Блондинка молча отдает ему 5 долларов и отворачивается к иллюминатору.
У тебя ошибка в определении. Если менять так, как ты написал, то в перестановке будут участвовать k+1 элементов, а не k!
Вот считай: A[i+k], A[i+k–1], …, A[i+1], A[i] - это сколько получится?
Должно быть так:
A[1], A[2], …, A[i–1], A[i+k–1], …, A[i+1], A[i], A[i+k], A[i+k+1],…, A[n].
Вот считай: A[i+k], A[i+k–1], …, A[i+1], A[i] - это сколько получится?
Должно быть так:
A[1], A[2], …, A[i–1], A[i+k–1], …, A[i+1], A[i], A[i+k], A[i+k+1],…, A[n].
Просто забиваеш на си и идёш в ждаву xDD
ytn
A[1], A[2], …, A[i–1], A[i+k–1], …, A[i+1], A[i], A[i+k], A[i+k+1],…, A[n].
Похожие вопросы
- Разработка в среде TURBO PASCA программы перестановки элементов массива.
- Помогите пожалуйста решить задачи по информатике, одномерные массивы. Си шарп. Очень срочно. Пожалуйста!!!!
- Разработка в среде TURBO PASCAL программы перестановки элементов массива.
- помогите пожалуйста сделать мне практическую по массивам, пожалуйста!!!
- Массив Си. Почему если я ввожу asd то в консоль выводятся dasd?
- Динамические массивы. СИ
- Массив Си
- Как правильно присвоить строку двойному массиву СИ. Спасибо! Вопрос внутри
- Можно ли сделать оператор сложения двух массивов в С++ ?
- Объясните, что означает "доступ к любому элементу массива"? (СИ++) Если можно - на примере)