Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 11
1

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

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

Author24 — интернет-сервис помощи студентам
скажите, плиз, кто-нибудь, как перекочевать, то бишь, скопировать один элемент в другой в рамках такого массива?
C++
1
char *name[COUNT][NAME];
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.08.2013, 01:16
Ответы с готовыми решениями:

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

Скопировать все элементы массива в другой массив такого же размера
Дорогие форумчане, прошу помочь с решение задачи. Дан массив. Скопировать все его элементы в...

Скопировать элементы исходного массива в новые массивы: отрицательные - в один, положительные - в другой
Помогите разобраться с этой темой: https://www.cyberforum.ru/cpp-beginners/thread794490.html И...

Скопировать все элементы в другой массив такого же размера
Помогите пожалуйста,очень нужно :scratch: Дан массив Х.Скопировать все элементы в другой массив...

21
Jupiter
25.08.2013, 01:21
  #2

Не по теме:

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

3
IGPIGP
25.08.2013, 01:46
  #3

Не по теме:

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

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

Не по теме:


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

донт край, мэн, зэрэ вил би окэй туморроу
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
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
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 11
25.08.2013, 21:38  [ТС] 6
Грейт! Фенк ю вери матч!
Ай хоуп айл кэн дан май таск тунайт
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
25.08.2013, 21:58 7
Цитата Сообщение от Ko4evnik Посмотреть сообщение
Грейт! Фенк ю вери матч!
Ай хоуп айл кэн дан май таск тунайт
Ю ар вэлкам.
Бивэйр оф чар эррэйз виз ту димэншенз,
Ху ноуз эбаут, вотил хэппэнд, бат донт мэншон...
Ай шюр, ол хэз бин биинг вэл туморроу,
Лэт фар эвэй фром ю би эни сорроу.
Гуд лак!
0
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
15 / 15 / 7
Регистрация: 27.10.2012
Сообщений: 112
27.08.2013, 01:30 9
В этих двух строчках написано одно и тоже. Просто во второй надо будет дополнительно выделять и освобождать память, когда в первой записи ты уже выделил для неё [NAME] элементов.
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
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
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
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
28.08.2013, 18:27 12
Цитата Сообщение от Ko4evnik Посмотреть сообщение
Но неужели нет более простого способа, не прибегая к дополнительным массивам, скопировать [i+1] запись в [i] запись?
ну типа как в обычном массиве
Что-то небыстро дело движется. Чувствуется основательность.
Если длина строк совпадает, то в динамическом массиве можно. Если массив const char, то только долото и молоток помогут. Не пораньтесь.
0
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
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
28.08.2013, 19:28 14
Цитата Сообщение от Ko4evnik Посмотреть сообщение
а в случае, если я хочу сделать массив строк (1 столбец), пока что статический
Это загадочное заявление. Как и весь вопрос. "А если" тут пример совершенно неверного планирования. Давайте Вы полностью приведёте условие Вашей задачи и код который удалось написать. Предварительно можно почитать о строках в стиле Си. При выделении памяти на стеке перевыделить её не получится. Что касается отличия строки как массива и массива строк как таковых, то они не являются типами детерминированной длины. В этом смысле копирование их элементов отличается от копирования элементов в массивах вроде int Arr[].
Расскажите задачу или вопрос будет висеть долго. Have fun!
0
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
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
28.08.2013, 20:09 16
Цитата Сообщение от Ko4evnik Посмотреть сообщение
Итак, заполняется таблица.
Зачем? Задано ли количество строк?
Дело в том, что для инициализации двумерного массива, нужно сначала инициализировать одномерный массив. Это массив указателей, которые будут указывать на массивы. В С++ 2-х мерный массив это массив массивов. И тут важно даже не то, что изменять размер первого массива нельзя, (легче создать новый двухмерный), а то что Вы не создали даже такой массив, и пытаетесь инициализировать массив строк name[0][0] = new char[sz+1];
когда массива указателей вроде указателя name[0] = new char*[some_const_int] у Вас нет. А должен быть целый массив таких. Смотрите пример. Там всё есть, но без литературы тут не обойтись. Или почитайте или упростите себе задачу. Но сначала бы понять в чём она состоит. Просто "создаётся таблица" не подходит. Попробуйте сказать, что хотите сделать. Ещё невредно нарисовать как выглядит одномерный массив char*.
Но главное, похоже, у Вас трудности с пониманием как выделить память под массив даже int. Как одномерный так и двухмерный. Советую позаниматься этим. К char* приступайте только когда тема указателей и массивов на int будет от зубов отскакивать.
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,519
28.08.2013, 20:14 17
Цитата Сообщение от Ko4evnik Посмотреть сообщение
Одним из этих пунктов является удаление ненужного нам поля и сдвиг всех нижестоящих элементов вверх.
я бы записал на место удаленной строки пустую строку и не мучался
1
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
28.08.2013, 21:00 18
Цитата Сообщение от ValeryS Посмотреть сообщение
я бы записал на место удаленной строки пустую строку и не мучался
Хорошо, что Вы понимаете, что нужно сделать. Мне и правду непонятно.
Нужно ли поведение прямоугольного массива или нужен как раз зубчатый? В чём задача? Зачем смешаны библиотеки ввода-вывода. Может вектор векторов строк string самое то? Непонятно.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,519
28.08.2013, 21:19 19
Цитата Сообщение от IGPIGP Посмотреть сообщение
Хорошо, что Вы понимаете, что нужно сделать. Мне и правду непонятно.
мне тоже не понятно что нужно ТС
я говорю как бы я сделал
например есть строка
C++
1
char str[]="Мама"
которая в памяти будет лежать как
C++
1
char str[]={'М', 'а','м','а', 0}
ну можно так написать
C++
1
char str[]={'М', 'а','м','а',\0}
теперь мне нужно удалить строку
в первый (нулевой) элемент массива записываем 0(конец строки)
C++
1
char str[]={0, 'а','м','а', 0}
и все у нас пустая строка
которая ничего не делает( даже на экран не выводится)
но это если только удаление а если вставка то без динамического распределения памяти не обойтись
тогда бы я наплевал на массив и работал бы со списком
1
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
28.08.2013, 21:38 20
ValeryS, да можно и так.
Если знать максимальный возможный размер например 100 то можно:
char buf[100]
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
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
int main()
{
    SetConsoleCP (1251); SetConsoleOutputCP (1251);
typedef char Buff[100];
 
Buff ch_matrix[3][4];
for(int i=0; i<3; ++i)
for(int j=0; j<4; ++j)strcpy(ch_matrix[i][j],"mama");
 
for(int i=0; i<3; ++i){
for(int j=0; j<4; ++j)cout<<ch_matrix[i][j]<<" ";
cout<<endl;
}
cout<<"-------------------"<<endl;
strcpy(ch_matrix[0][0],"dusya");
strcpy(ch_matrix[1][1],"busya");
strcpy(ch_matrix[2][3],"papa");
 
for(int i=0; i<3; ++i){
for(int j=0; j<4; ++j)cout<<ch_matrix[i][j]<<" ";
cout<<endl;
}
 
cin.get();
    return 0;
}
0
28.08.2013, 21:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2013, 21:38
Помогаю со студенческими работами здесь

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

Как скопировать все свойства из одного класса в другой класс такого же типа
Здравствуйте. Представим, что есть класс со множеством свойств. Как скопировать все свойства из...

Дан массив. Скопировать все его элементы в другой массив такого же размера
Пожалуйста помогите решить на C#!Срочно надо!Дан массив. Скопировать все его элементы в другой...

Скопировать один файл в другой
· с перестановкой местами четных и нечетных строк А как строки легко проверить на чётность и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru