Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
klynxe
11 / 11 / 4
Регистрация: 07.09.2012
Сообщений: 542
#1

Смена местами элементов массива - C++

20.09.2012, 21:29. Просмотров 845. Ответов 10
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
while(sch2>0){
j=sch;
while(j>1)
{
j--;
double f=strcmp(a[j-1], a[j]);
if(f>0)
{
AnsiString s1;
AnsiString s2;
s1=a[j-1];
s2=a[j];
int lo1=s1.Length();
int lo2=s2.Length();
 int f1=*a[j];
 int f2=*a[j-1];
delete []f1;
delete []f2;
 
a[j]=new char [lo1];
a[j-1]=new char [lo2];
a[j-1]=s2.c_str();
a[j]=s1.c_str();
}
}
sch2--;
}
Как удалить элемент a[j] и a[j-1] из массива? что бы поменять их местами т.к. они могут быть разных размеров, а после создать обратно и записать в низ значения в другом порядке?

Добавлено через 1 минуту
Я объявлял так:
char **a;
a = new char*[n];
a[j]=new char [k+1];
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2012, 21:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Смена местами элементов массива (C++):

Сдвиг элементов массива вправо и смена местами первого и последнего элемента - C++
Есть массив с n-ным колличеством элементов. Нужно сдвинуть значение каждого элемента вправо на один, а первый и последний элемент поменять...

Смена элементов массива структур - C++
Всем привет! Есть 1 вопрос: имеется функция void sorting(){ //сортировка списка по возрастанию номера группы bool f=...

Поменять местами минимальный и максимальный элемент массива V[25] и подсчитать количество парных элементов массива - C++
Поменять местами минимальный и максимальный элемент массива V и подсчитать количество парных элементов массива

Поменять местами значения элементов массива - C++
Задача 2: Даны целые массивы A, B и значения К и L (0<=K<=9, 0<=L<=9). Требуется пpеобpазовать массивы следующим обpазом: в...

Поменять местами значения двух элементов массива - C++
Дано одномерный массив, содержащий 10 элементов. поменять местами значение n-го i k-го элементов.

Поменять местами значения i и j элементов массива с пользовательскими функциями - C++
Я вам буду очень благодарен если вы ответите мне как можно скорее . . .

10
Пaтрик
416 / 391 / 39
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
20.09.2012, 21:29 #2
Используйте контейнеры.
0
klynxe
11 / 11 / 4
Регистрация: 07.09.2012
Сообщений: 542
20.09.2012, 21:32  [ТС] #3
А можно чуть подробнее?
0
Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
20.09.2012, 21:33 #4
попробуйте
C++
1
2
delete []a[j]
delete [](a+j)
*одно из них
0
Пaтрик
416 / 391 / 39
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
20.09.2012, 21:33 #5
std::vector<T>
0
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,598
Записей в блоге: 12
20.09.2012, 21:38 #6
klynxe, надо применить memset(только функция чуть по другому называется, для перекрывающихся областей)
memset(a[j+1],a[j],size_a-j); // только не memset а другую её разновидность

Добавлено через 34 секунды
а лучше используй
Цитата Сообщение от Пaтрик Посмотреть сообщение
std::vector<T>
C++
1
std::vector <int> a;
0
klynxe
11 / 11 / 4
Регистрация: 07.09.2012
Сообщений: 542
20.09.2012, 22:26  [ТС] #7
Я сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
while(sch2>0){
j=sch;
while(j>1)
{
j--;
double f=strcmp(a[j-1], a[j]);
if(f>0)
{
char* l1=a[j];
char* l2=a[j-1];
AnsiString s1=NULL;
AnsiString s2=NULL;
s1=a[j-1];
s2=a[j];
int lo1=s1.Length();
int lo2=s2.Length();
a[j]=NULL;
a[j-1]=NULL;
a[j]=new char [lo1];
a[j-1]=new char [lo2];
a[j-1]=l1;
a[j]=l2;
}
}
sch2--;
}
Не знаю почему, но работает!)
0
Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
20.09.2012, 22:30 #8
C++
1
2
a[j]=NULL;
a[j-1]=NULL;
память не освободили, будет утечка. Вы с помощью new выделили память, а затем просто переменной, указывающей на эту память присвоили NULL. на эту память ничего не указывает, но она не сможет быть использована.
Посмотрите, я выше писал как освободить память.
0
klynxe
11 / 11 / 4
Регистрация: 07.09.2012
Сообщений: 542
20.09.2012, 22:36  [ТС] #9
И delete ни один, ни второй ничего не удаляет.

Добавлено через 2 минуты
Я вот и парился с delete, все комбинации букв перепробовал, но нифига не удаляет... Я вообще удивлен что оно работает)

Добавлено через 3 минуты
delete []a[j]; на это программа вылетает, а на второе просто ничего не происходит.
0
Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
20.09.2012, 22:41 #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
 
using std::cout;
 
int main()
{
    //выделяем память
    char **a = new char*[10];
    for(int i = 0; i < 10; ++i)
        a[i] = new char[10];
 
    //заполняем 2 строку
    for(int i = 0; i < 10; ++i)
        a[1][i] = 65+i;
 
    //смотрим что там
    for(int i = 0; i < 10; ++i)
        cout << a[1][i];
        cout << "\n";
    //освобождаем память
    delete []a[1];
 
    //смотрим что там
    for(int i = 0; i < 10; ++i)
        cout << a[1][i];
    
    return 0;
}
попробуйте и убедитесь что память освобождается
0
klynxe
11 / 11 / 4
Регистрация: 07.09.2012
Сообщений: 542
20.09.2012, 22:54  [ТС] #11
Да у меня тоже есть рабочий пример где она освобождается) А конкретно в моей программе, как мне кажется, delete в моих переменных видит не адрес, а какие-то значения, которые просто фильтрует.

Добавлено через 1 минуту
Вот полный код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{
Form1->ComboBox1->SetFocus();       // Передача фокуса ComboBox1
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1KeyDown(TObject *Sender, WORD &Key,TShiftState Shift)
{
if (Key == 13)  {
        ComboBox1->Items->Add(ComboBox1->Text);  
// Строка из окна редактирования заносится в ComboBox1
        ComboBox1->Text="";             // Очистка окна
}
}
void __fastcall TForm1::ComboBox1Select(TObject *Sender)
{
int n, i, nst,kod;
String got;
nst = ComboBox1->ItemIndex;             // Определение номера строки
AnsiString st = ComboBox1->Items->Strings[nst];
char* ss = st.c_str();  // Запись выбранной строки st
if (st[1] != ' ')   n = 1;              // Здесь и ниже ' ' - пробел
            else   n = 0;
for(i=1; i<st.Length(); i++)                // Просмотр символов строки st
            if(st[i] == ' ' && st[i+1] != ' ')
                     {
                         n++;}
 
if(n>1)
{
char **a;
int j=0;
a = new char*[n];
int lo=st.Length();
int k=0;
for(i=0;i<lo+1; i++)
{
c:
if(i==lo&&ss[i]=='\0'){goto v;}
if(k<0) {k=0;}
if(ss[i]!=' ')
{
k++;
}
else if((ss[i]==' '&&ss[i-1]==' ')||(ss[i]==' '&&i==0)){i++;goto c;}
else
{
v:
if(k>0)
{
a[j]=new char [k+1];
if(i!=lo){a[j][k]='\0';}
if(i==lo&&ss[i]==' '){goto x;}
for(int f=i;k>-1;a[j][k]=ss[f-1],f--)
k--;
}
else {
goto x;}
j++;
}
}
x:
int sch2,sch;
sch=sch2=j;
while(sch2>0){
j=sch;
while(j>1)
{
j--;
double f=strcmp(a[j-1], a[j]);
if(f>0)
{
char* l1=a[j];
char* l2=a[j-1];
AnsiString s1=NULL;
AnsiString s2=NULL;
s1=a[j-1];
s2=a[j];
int lo1=s1.Length();
int lo2=s2.Length();
a[j]=NULL;
a[j-1]=NULL;
a[j]=new char [lo1];
a[j-1]=new char [lo2];
a[j-1]=l1;
a[j]=l2;
}
}
sch2--;
}
for (int i=0;i<sch ;i++){
Memo1->Lines->Add(a[i]);
}
Memo1->Lines->Add("");
delete []a;
}
}
//---------------------------------------------------------------------------
Какя понял причина в строке char* ss = st.c_str();

Добавлено через 1 минуту
А вообще мне главной что работает) А то уже с этой одной фигней мелкой уже запарился
0
20.09.2012, 22:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2012, 22:54
Привет! Вот еще темы с ответами:

Поменять местами значения максимального и минимального элементов массива - C++
Задать одномерный массив из 10 целых чисел из отрезка от 0 до 50 с использованием датчика случайных чисел. Поменять местами значения...

Поменяйте местами первый из наибольшых элементов и k-ый элемент массива размерностью n (n < 50) - C++
Формат входных данных n - количество элементов в массиве Arr Arr - элементы массива (-50 &lt; Arr &lt; 50) k, - элемент массива,...

Переставить местами выбранный элемент и первый из максимальных элементов массива - C++
3).Объединим первый и второй приёмы. Решив задачу, суть которой не в том, чтобы переставить местами два выбранных элемента, а в том, чтобы...

Ввести значения элементов массива, поменять местами min/max элементы - C++
Помогите пожалуйста, нада написать программу которая позволяет ввести 10 елементов одного массива, результат выводилоб на екран,также...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru