Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 13.06.2016
Сообщений: 79
1

Добавление нового указателя в конец массива указателей, удаление указанного элемента, добавление указателей

29.09.2016, 13:15. Показов 2112. Ответов 5
Метки нет (Все метки)

Здравствуйте. Помогите, пожалуйста, разобраться с одним большим заданием. Задание пока в процессе написания, но уже наверное есть ошибки. Наработки чуть ниже. Хочу понять правильно ли мыслю. Если можете объясните, пожалуйста. Спасибо заранее за помощь.

Есть указатель на указатель char **pp (он будет содержать адрес массива указателей на строки) и размер этого массива int size, который изначально равен 0. Надо написать функции и добавить в одну программу их вызов:
- char **AddPtr (char **pp, int size, char *str) - функция, которая будет добавлять в конец массива указателей новый указатель на новую строку (*str), которую введет пользователь.
- char **DelPtr (char **pp, int size, int ncell) – функция, которая будет удалять указанный пользователем элемент (ncell) из массива указателей и освобождать память занимаемую строкой и указателем на неё.
- char **InsPtr (char **pp, int size, int ncell, char *str) - функция, которая будет добавлять в указанный элемент массива указателей (ncell) новый указатель на новую строку (*str), которую введет пользователь. Номер строки- вставки (ncell) указывает пользователь. В результате этого массив указателей «раздвинется» на один элемент.
- void ShowPtr (char **pp, int size) - функция, которая будет выводить на экран массив с текущим количеством строк.
- void FreePtr (char **pp, int size) - функция, которая будет освобождает память в конце программы.

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
114
115
116
117
118
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<ctime>
 
using namespace std;
 
char **AddStr(char **, int, char *);
char **InsStr(char **, int, char *,  int n);
char **AddPtr(char **, int, char *);
char **DelPtr(char **, int, int ncell);
char **InsPtr(char **, int, char *);
void Free(char **pp, int size);
void ShowPtr(char **pp, int size);
void FreePtr(char **pp, int size);
 
void main()
{
    setlocale(0, "");
    srand(time(NULL));
    int size = 0;
    char **pp=0;
    pp = AddStr(pp, size, "text1");
    size++;
    pp = AddStr(pp, size, "text2");
    size++;
    pp = AddStr(pp, size, "text3");
    size++;
    int n = 2;
    pp=InsStr(pp, size, "text5", n);
    size++;
 
    for (int i = 0; i < size; i++)
        cout << pp[i] << endl;
    Free(pp, size);
}
    
    
    char **AddStr(char **pp, int size, char *str)
    {
        if (size == 0)
        {
            pp = new char *[size + 1]; // выделяем память для нашего указателя
        }
        else
        {
            char ** temp = new char *[size + 1];
 
            for (int i = 0; i < size; i++) //перекладываем все строки
            {
                temp[i] = pp[i];
            }
            delete[]pp;
            pp = temp;//перекладываем адрес, положить в новую строку, которую мы передаем
        }
        pp[size] = new char[strlen(str) + 1];//выделяем место, размером как наша строка
            strcpy(pp[size], str);
        return pp;
    }
        
    char **InsStr(char **pp, int size, char *str, int n)
    {
        char ** temp = new char *[size + 1];
 
        for (int i = 0; i < n; i++) //перекладываем все строки
        {
            temp[i] = pp[i];
        }
 
        temp[n] = new char[strlen(str) + 1];//выделяем место, размером как наша строка
        strcpy(temp[n], str);
        for (int i = n; i < size; i++) //перекладываем все строки
        {
            temp[i + 1] = pp[i];
        }
 
        delete[]pp;
        pp = temp;
        return pp;
    }
 
    char **AddPtr(char **pp, int size, char *str);
    {
        if (size == 0)
        {
            pp = new char *[size + 1]; // выделяем память для нашего указателя
        }
        else
        {
            char ** temp = new char *[size + 1];
 
            for (int i = 0; i < size; i++) //перекладываем все строки
            {
                temp[i] = pp[i];
            }
            delete[]pp;
            pp = temp;//перекладываем адрес, положить в новую строку, которую мы передаем
        }
        pp[size] = new char[strlen(str) + 1];//выделяем место, размером как наша строка
        strcpy(pp[size], str);
        return pp;
    }
 
    char **DelPtr(char **pp, int size, int ncell);
 
    char **InsPtr(char **pp, int size, int ncell, char *str);
 
    
    void ShowPtr(char **pp, int size);
 
    void FreePtr(char **pp, int size);
 
    void Free (char **pp, int size)
    {
        for (int i = 0; i<size; i++)
        delete[]pp[i];
        delete[]pp;
    }
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.09.2016, 13:15
Ответы с готовыми решениями:

Добавление нового элемента в список после указанного элемента по значению информационного поля
Добавление нового элемента в список после указанного элемента по значению информационного поля.

Добавление нового элемента в конец односвязного списка
Здравствовать всем ! Заклинило меня на одной ,довольно простой задаче. Есть код реализации...

Осуществить добавление и удаление указанного элемента списка
1.реализовать динамические структуры данных список, очередь, стеки. В каждом случае осуществить...

Добавление элемента в конец массива
В общем есть такая прога. using System; using System.Collections; using...

5
59 / 59 / 53
Регистрация: 05.05.2013
Сообщений: 150
29.09.2016, 14:30 2
Если ООП не знаете, то наработки верные, ошибок не нашел.
Три функции, которые делают одно и тоже, это, как я понимаю, пока недоработка.
Мой совет не затягивайте с ООП, потом отучить себя от процедурного программирования будет сложнее, а данный код смотрится по динозавровски, так надо писать на С, ане на С++.
0
0 / 0 / 0
Регистрация: 13.06.2016
Сообщений: 79
29.09.2016, 14:41  [ТС] 3
VAN0, Все правильно. Это язык С с элементами С++. Просто в С толком не нахожу ответов, поэтому ориентируюсь на С++.
0
nmcf
29.09.2016, 14:44
  #4

Не по теме:

Золушка_я, graphics.h ожидать? :)

0
0 / 0 / 0
Регистрация: 13.06.2016
Сообщений: 79
30.09.2016, 23:43  [ТС] 5
задание сделано. можно удалять тему.
0
Эксперт С++
4974 / 3082 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
30.09.2016, 23:51 6
Цитата Сообщение от Золушка_я Посмотреть сообщение
задание сделано. можно удалять тему.
Зачем удалять то? Пусть на золушку посмотрят!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.09.2016, 23:51

Добавление элемента в конец массива
Добрый вечер! Сделала согласно мануалу, а н-нет - не работает. $students = array();...

Добавление элемента в конец массива
Собственно как это сделать, если размер массива заранее не изветен? :)

Добавление элемента в конец динамического массива
Не понимаю почему у меня не выходит данный код (еще только учусь) void pushBack(int* arr, int*...

Добавление элемента в конец динамического массива!
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;malloc.h&gt; using namespace std; int main()...

Добавление в программу указателей
Необходимо в этом коде использовать указатели. Начал изучать указатели, не знаю где применить. ...

QSet. Добавление указателей на значение
Доброго времени суток. Программирую под Qt 4.7, поэтому возник вопрос по использованию QSet. При...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru