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

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

Войти
Регистрация
Восстановить пароль
 
 
Ko4evnik
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 11
#1

Скопировать один элемент в другой в рамках такого массива - C++

25.08.2013, 01:16. Просмотров 1127. Ответов 21
Метки нет (Все метки)

скажите, плиз, кто-нибудь, как перекочевать, то бишь, скопировать один элемент в другой в рамках такого массива?
C++
1
char *name[COUNT][NAME];
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2013, 01:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Скопировать один элемент в другой в рамках такого массива (C++):

Скопировать все элементы массива в другой массив такого же размера - C++
Дан массив. Скопировать все его элементы в другой массив такого же размера: а) в том же порядке расположения элементов; б) в обратном...

Скопировать один файл в другой - C++
Создаю 2 файл, в первый записываю цифры. Почему в файле они выводятся в битой кодировке, даже не в кодировке, в в каракулях?) И второе,...

Скопировать один динамический массив в другой - C++
Доброго времени суток. int *Array = new int; int *B_Array = new int; Первый массив я наполняю содержимым и мне нужно потом его...

Скопировать один массив char в другой - C++
у меня двухмерный символьный и одномерный массивы символов. Что в общем то мне нужно. После небольших манипуляций над одномерным массивом,...

Скопировать один символьный массив в другой - C++
Привет всем, многоуважаемые пользователи не могу сделать программу. Нам даны два массива s1 и s2 пользователь вводит фразу в массив s2 а...

Скопировать один массив в другой, используя указатели - C++
всем привет. простейшая задачка на копирование массива при помощи указателей. все работает, но хочу, чтобы массив рисовался в ряд. а...

21
Jupiter
25.08.2013, 01:21
  #2

Не по теме:

Цитата Сообщение от Ko4evnik Посмотреть сообщение
эбаут поинтс, вот хев ай ду!
это надо сохранить пока не переименовали тему

3
IGPIGP
25.08.2013, 01:46
  #3

Не по теме:

Цитата Сообщение от Jupiter Посмотреть сообщение
это надо сохранить пока не переименовали тему
Ноу бады ноуз, вот хэз би дан, тунайт...
Ол лив ин фэйл зис сэд анд лонли найт!

0
Ko4evnik
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 11
25.08.2013, 01:52  [ТС] #4
Цитата Сообщение от IGPIGP Посмотреть сообщение

Не по теме:


Ноу бады ноуз, вот хэз би дан, тунайт...
Ол лив ин фэйл зис сэд анд лонли найт!

донт край, мэн, зэрэ вил би окэй туморроу
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6486 / 3130 / 307
Регистрация: 04.12.2011
Сообщений: 8,644
Записей в блоге: 5
25.08.2013, 02:28 #5
Цитата Сообщение от Ko4evnik Посмотреть сообщение
донт край, мэн, зэрэ вил би окэй туморроу
Ай ду белив ю вил.
Куда ж Вы денетесь.

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
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
char *what_has_be_done[ ][3]={
    {"No",   "body","knows,"},
    {"what", "has", "be"}, 
    {"done", "to",  "night..."}
};
 
int main()
{
    SetConsoleCP (1251); SetConsoleOutputCP (1251);
char **let_it_be_done[3];
int sz;
    for(int i=0; i<3; ++i){
let_it_be_done[i] = new char*[3];//
for(int j=0; j<3; ++j){
sz=strlen(what_has_be_done[i][j]);
let_it_be_done[i][j] = new char[sz+1];//
}
cout<<endl;
    }
 
for(int i=0; i<3; ++i){
for(int j=0; j<3; ++j){
strcpy(let_it_be_done[i][j], what_has_be_done[i][j]);
cout<<let_it_be_done[i][j]<<" ";
}
cout<<endl;
}
cout<<"Фор ту континьить плиз,\nпрэсс э кей brave knight..."<<endl; 
cin.get();
    return 0;
}
1
Ko4evnik
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 11
25.08.2013, 21:38  [ТС] #6
Грейт! Фенк ю вери матч!
Ай хоуп айл кэн дан май таск тунайт
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6486 / 3130 / 307
Регистрация: 04.12.2011
Сообщений: 8,644
Записей в блоге: 5
25.08.2013, 21:58 #7
Цитата Сообщение от Ko4evnik Посмотреть сообщение
Грейт! Фенк ю вери матч!
Ай хоуп айл кэн дан май таск тунайт
Ю ар вэлкам.
Бивэйр оф чар эррэйз виз ту димэншенз,
Ху ноуз эбаут, вотил хэппэнд, бат донт мэншон...
Ай шюр, ол хэз бин биинг вэл туморроу,
Лэт фар эвэй фром ю би эни сорроу.
Гуд лак!
0
Ko4evnik
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 11
27.08.2013, 01:14  [ТС] #8
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ю ар вэлкам.
Бивэйр оф чар эррэйз виз ту димэншенз,
Ху ноуз эбаут, вотил хэппэнд, бат донт мэншон...
Ай шюр, ол хэз бин биинг вэл туморроу,
Лэт фар эвэй фром ю би эни сорроу.
Гуд лак!
так я понимаю, что мне и не нужен такого вида массив
C++
1
char *name[COUNT][NAME];
мне сразу надо брать
C++
1
char **name[COUNT];
и с ним уже оперировать? так же проще, я правильно понял?
0
san92der
14 / 14 / 3
Регистрация: 27.10.2012
Сообщений: 109
27.08.2013, 01:30 #9
В этих двух строчках написано одно и тоже. Просто во второй надо будет дополнительно выделять и освобождать память, когда в первой записи ты уже выделил для неё [NAME] элементов.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6486 / 3130 / 307
Регистрация: 04.12.2011
Сообщений: 8,644
Записей в блоге: 5
27.08.2013, 02:07 #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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
char *what_has_be_done[ ][3]={
    {"No",   "body","knows,"},
    {"what", "has", "be"}, 
    {"done", "to",  "night..."}
};
 
int main()
{
    SetConsoleCP (1251); SetConsoleOutputCP (1251);
char **let_it_be_done[3];
int sz;
    for(int i=0; i<3; ++i){
let_it_be_done[i] = new char*[3];//
for(int j=0; j<3; ++j){
sz=strlen(what_has_be_done[i][j]);
let_it_be_done[i][j] = new char[sz+1];//
}
cout<<endl;
    }
 
for(int i=0; i<3; ++i){
for(int j=0; j<3; ++j){
strcpy(let_it_be_done[i][j], what_has_be_done[i][j]);
cout<<let_it_be_done[i][j]<<" ";
}
}
cout<<endl;
//теперь поменяем значение в последнем элементе со строки "night..." на строку "knight..."
//строка источник длинее строки назначения и значит нужно освободить память от строки 9 симолов
//выделить тамже место под 10 и скопировать туда "knight..."
delete let_it_be_done[2][2];
char *newStr = "knight...";
sz=strlen(newStr);//9
let_it_be_done[2][2] = new char[sz+1];
strcpy(let_it_be_done[2][2],newStr);
//готово, теперб выводим...
for(int i=0; i<3; ++i){
for(int j=0; j<3; ++j){
cout<<let_it_be_done[i][j]<<" ";
}
}
cout<<endl;
cout<<"Фор ту континьить плиз,\nпрэсс э кей brave knight..."<<endl; 
cin.get();
    return 0;
}
Тут видно как перевыделить память и записать новую строку.
1
Ko4evnik
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 11
28.08.2013, 18:13  [ТС] #11
Но неужели нет более простого способа, не прибегая к дополнительным массивам, скопировать [i+1] запись в [i] запись?
ну типа как в обычном массиве
C++
1
2
3
char name[i][j];
 
strcpy(name[i],name[i+1]);
???
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6486 / 3130 / 307
Регистрация: 04.12.2011
Сообщений: 8,644
Записей в блоге: 5
28.08.2013, 18:27 #12
Цитата Сообщение от Ko4evnik Посмотреть сообщение
Но неужели нет более простого способа, не прибегая к дополнительным массивам, скопировать [i+1] запись в [i] запись?
ну типа как в обычном массиве
Что-то небыстро дело движется. Чувствуется основательность.
Если длина строк совпадает, то в динамическом массиве можно. Если массив const char, то только долото и молоток помогут. Не пораньтесь.
0
Ko4evnik
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 11
28.08.2013, 19:04  [ТС] #13
А значит, нужно выделять новую память для [n] элемента в размере памяти [n+1] элемента каждый раз?

C++
1
2
3
4
5
6
7
8
char **let_it_be_done[3];
int sz;
    for(int i=0; i<3; ++i){
let_it_be_done[i] = new char*[3];
for(int j=0; j<3; ++j){
sz=strlen(what_has_be_done[i][j]);
[B]let_it_be_done[i][j] = new char[sz+1];[/B]//
}
а в случае, если я хочу сделать массив строк (1 столбец), пока что статический
C++
1
char *name[COUNT][1];
то мне стоит сделать так?
C++
1
2
3
sz = strlen(what_has_be_done[1][0]);
    what_has_be_done[0][0] = new char[sz+1];
    strcpy(what_has_be_done[0][0], what_has_be_done[1][0]);
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6486 / 3130 / 307
Регистрация: 04.12.2011
Сообщений: 8,644
Записей в блоге: 5
28.08.2013, 19:28 #14
Цитата Сообщение от Ko4evnik Посмотреть сообщение
а в случае, если я хочу сделать массив строк (1 столбец), пока что статический
Это загадочное заявление. Как и весь вопрос. "А если" тут пример совершенно неверного планирования. Давайте Вы полностью приведёте условие Вашей задачи и код который удалось написать. Предварительно можно почитать о строках в стиле Си. При выделении памяти на стеке перевыделить её не получится. Что касается отличия строки как массива и массива строк как таковых, то они не являются типами детерминированной длины. В этом смысле копирование их элементов отличается от копирования элементов в массивах вроде int Arr[].
Расскажите задачу или вопрос будет висеть долго. Have fun!
0
Ko4evnik
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 11
28.08.2013, 19:42  [ТС] #15
Ок. Итак, заполняется таблица. Но поскольку я застрял, она состоит из одного столбца и определенного количества строк [COUNT]. При помощи switch-case выбирается пункт из меню. Одним из этих пунктов является удаление ненужного нам поля и сдвиг всех нижестоящих элементов вверх.

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 "stdafx.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"
#include "windows.h"
#include <iostream>
 
using namespace std;
 
void vvod(void);
void deleterec();
void show();
 
#define NAME 1
#define COUNT 3
 
char *name[COUNT][NAME];
 
 
int main()
{
    system("cls");
    char ch='0';
 
    printf("1. Enter record\n");
 
    printf("3. Delite\n");
 
    printf("Select from the menu: \n");
    
    while ((ch!='1') && (ch!='2') && (ch!='3') && (ch!='4') && (ch!='5'))
    {ch = getchar();
 
        switch(ch)
        {
            case '1':
                vvod();
            case '2':
                edit();
            case '3':
                deleterec();
            case '4':
                exit(0);
            case '5':
                fuckmeiamfamous();
        }
    }
 
    return 0;
}
 
void vvod(void)
{
    system("cls");
 
    for (int i=0;i<COUNT;i++)
    {
        printf("Input %d name:\n",i);
        //scanf("%s",list[i]);
        scanf("%s",name[i]);
        if(!name[i]) break;
    }
 
    main();
}
 
void deleterec()
{
    system("cls");
    show();
 
    int n;
    char ch;
    
    printf("Which record would you want to delete?\n");
    scanf("%d",&n);
    
    printf("Are you sure? y/n\n");
    
    do
    {
        ch=getchar();
    } while ((ch != 'y' && ch != 'n'));
 
    if(ch=='y')
    {
        for(int i=n-1;i<COUNT;++i)
        {
//Здесь-то и начинается вся заварушка
//          int sz;
 
//          sz = strlen(name[1][0]);
//          name[0][0] = new char[sz+1];
//          strcpy(name[0][0], name[1][0]);
        }
 
        printf("Successfull delete...\n");
 
        getch();
        main();
    }
    
    if (ch=='n') main();
}
 
void show(void)
{
    for(int i=0;i<COUNT;i++)
    {
        //printf("%d: %s\n", i+1, list[i]);
        printf("%d: %s\n", i+1, name[i]);
    }
}
Так вот, это удаление я и пытаюсь реализовать копированием всех элементов на [n-1] позицию.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2013, 19:42
Привет! Вот еще темы с ответами:

Скопировать один файл в другой средствами experimental/filesystem - C++
Хочу скопировать один файл в другой с помощью experimental/filesystem. Вот так получается: #include &lt;fstream&gt; #include...

Скопировать из исходного вектора положительные элементы в один массив, а отрицательные - в другой - C++
Переписать отдельно в разные массивы положительные и отрицательные элементы вектора.

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

Если елементы массива соседние одинаковы то один из них заменяется на 0 а другой увеличиваетмя на один - C++
#include &quot;stdafx.h&quot; #include&lt;string&gt; #include &lt;cmath&gt; #include &lt;iostream&gt; #include&lt;locale&gt; using namespace std; const int...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
28.08.2013, 19:42
Ответ Создать тему
Опции темы

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