Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
4 / 4 / 1
Регистрация: 10.12.2019
Сообщений: 176

Как передать указатель в функцию?

09.02.2020, 18:24. Показов 2691. Ответов 28

Студворк — интернет-сервис помощи студентам
Здравствуйте. Делал свою лабораторную по программированию. Вот её суть:

Нужно написать процедуру, которая, получив в качестве параметра указатель на один из элементов двусвязного списка действительных чисел и два числа, добавляет первое число в начало списка, а второе в его конец.
Реализовал я это без передачи указателя и тупо вставил одно число в начало (функция addf()), другое в конец списка(функция add()). Преподавателю это не понравилось, она сказала, что надо вывести эти указатели (то есть, их адреса в памяти). Затем, ввести это шестнадцатеричное число, найти по нему этот элемент и двигаться влево (к началу) и вправо (к концу), и таким образом вставлять.

Но, дело в том, что это оказалось не так то просто (знающие люди наверное поймут). Пожалуйста, подскажите, как подрихтовать код в этом случае.

Мой код под спойлером

Кликните здесь для просмотра всего текста
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
#include <iostream>
 
using namespace std;
 
struct List {
    float num;
    List *next;
    List *prev;
};
List *Head = NULL, *Tail = NULL;
 
void fill_list(){
    List *tmp;
    for (int i = 0; i < 11; i++){
        tmp = new List;
        tmp->num = i;
        tmp->next = NULL;
        if (Head != NULL){
            tmp->prev = Tail;
            Tail->next = tmp;
            Tail = tmp;
        }
        else {
            tmp->prev = NULL;
            Head = Tail = tmp;
        }
    }
}
 
void show(){
    List *tmp = new List;
    tmp = Head;
    while (tmp != NULL){
        cout << tmp->num << " ";
        tmp = tmp->next;
    }
    cout << "\n";
}
 
void addf(float x){
    List *tmp = new List;
    tmp->next = NULL;
    tmp->prev = NULL;
    tmp->num = x;
    if (Head != NULL){
        tmp->next = Head;
        tmp->prev = tmp;
        Head = tmp;
    }
    else {
        Head = Tail = tmp;
    }
}
 
void add(float x){
    List *tmp = new List;
    tmp->next = NULL;
    tmp->num = x;
    if (Head != NULL){
        tmp->prev = Tail;
        Tail->next = tmp;
        Tail = tmp;
    }
    else {
        tmp->prev = NULL;
        Head = Tail = tmp;
    }
}
 
void func(float a, float b){
    addf(a);
    add(b);
}
 
int main()
{
    float a,b;
    fill_list();
    int sw;
    while (1)
    {
        cout << "1 - show(), 2 - func(a,b), 3 - exit" << endl;
        cin >> sw;
        switch (sw) {
            case 1:
                show();
            break;
            case 2:
                cout << "Input a, b " << endl;
                cin >> a;
                cin >> b;
                func(a,b);
            break;
            case 3:
                return 0;
        }
    }
 
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.02.2020, 18:24
Ответы с готовыми решениями:

Как правильно передать аргументы в шаблон функцию принимающую вектор класса?
Пытаюсь сделать функцию которая будет принимать вектор для класса Vehicle, выводить этот вектор и записывать его в файл. Проблема в том что...

как передать функции в качестве аргумента указатель на функцию описанной в другом классе?
Есть два класса A и B в классе A есть две функции funcA_1 и funcA_2 в классе B - funcB в funcA_1 создается экземпляр класса B и...

В функцию передать указатель на струкруру
Всем привет:! Мне нужно создать собственную функцию и передать туда указатель на созданную мной структуру. Структура есть, она описана...

28
4 / 4 / 1
Регистрация: 10.12.2019
Сообщений: 176
11.02.2020, 12:06  [ТС]
Студворк — интернет-сервис помощи студентам
XLAT, а как всё таки решить задачу?
Мне нужно:
1) Вывести адреса указателей
2) Ввести адрес элемента списка, чтобы передать его потом в func()
3) Затем идти сначала влево, потом вправо от этого элемента (так искать голову и хвост) , чтобы вставить числа
4) Потом вставить эти числа перед первым элементом и после последнего

Как вывести адреса указателей я знаю (в show написать
C++
1
cout << tmp << endl;
),
но, как реализовать остальное так и не понял. Помогите пожалуйста разобраться
0
Just Do It!
 Аватар для XLAT
4211 / 2668 / 655
Регистрация: 23.09.2014
Сообщений: 9,082
Записей в блоге: 3
11.02.2020, 12:56
Цитата Сообщение от ive_karp Посмотреть сообщение
Нужно написать процедуру, которая, получив в качестве параметра указатель на один из элементов двусвязного списка действительных чисел и два числа, добавляет первое число в начало списка, а второе в его конец.
C++
1
2
3
4
void add2number(float n1, float n2)
{   addf(n1);
    add(n2);
}
процедура с двумя числами в агрументах,
добавляет первое число в голову,
а второе число в хвост списка.

Вопрос: нафиг нам указатель:
Цитата Сообщение от ive_karp Посмотреть сообщение
указатель на один из элементов двусвязного списка действительных чисел ...
?

его можно занести конеш в аргументы, но где мы его будем использовать???

Добавлено через 3 минуты
Если так
C++
1
2
3
4
5
void add2number(List* p, float n1, float n2)
{   
    addf(p->num);
    add(p->num);
}
то тогда нафиг нам два числа???

Добавлено через 10 минут
очевидно что препод желает чтобы бы вы переписали всё содержимое
из addf(..) и add(..) в add2number(..)
чтобы это выглядело как поиск головы и хвоста по имеющемуся указателю.

так сделайте это.

Вот по текущему указателю мы добавляем число в хвост.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void add(List* p, float x)
{   while(p->next) p = p->next;
    ///----------------------------|
    /// Ура мы нашли хвост!        |
    /// он теперь у нас в p        |
    ///----------------------------:
    List* tmp = new List;
    tmp->next = NULL;
    tmp->num = x;
    if (Head != NULL)
    {   tmp->prev = Tail;
        p->next = tmp;
        p = tmp;
    }
    else
    {   tmp->prev = NULL;
        Head = p = tmp;
    }
    Tail = p;
}
чуть теперь подправьте код выше для головы.
C++
1
2
3
4
5
6
7
void addf(List* p, float x)
{   while(p->prev) p = p->prev;
    ///----------------------------|
    /// Ура мы нашли голову!       |
    /// она теперь у нас в p       |
    ///----------------------------:
...
Тогда можно будет так:
C++
1
2
3
4
5
void add2number(List* p, float n1, float n2)
{   
    addf(p, n1);
    add(p, n2);
}
Добавлено через 3 минуты
новые написанные процедуры являются перегруженными,
т.е. внимание: старые удалять необязательно!
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
11.02.2020, 13:13
Цитата Сообщение от XLAT Посмотреть сообщение
while(p->next)
Цитата Сообщение от XLAT Посмотреть сообщение
while(p->prev)
а что если p == nullptr ?
0
Just Do It!
 Аватар для XLAT
4211 / 2668 / 655
Регистрация: 23.09.2014
Сообщений: 9,082
Записей в блоге: 3
11.02.2020, 13:28
Цитата Сообщение от nalbe666 Посмотреть сообщение
В стандарте нет никаких упоминаний про "процедуры"
анекдот придумал:

Программиста на С++ спросили:
- Ты веришь в бога?
- Нет!
- Почему же?
- Про него ничего не написано в стандарте!!!


Добавлено через 5 минут
Цитата Сообщение от zayats80888 Посмотреть сообщение
а что если p == nullptr ?
меня студенты замучивали вопросом: почему мой код у них не компилируется.
и я задолбался им отвечать: Замените nullptr на 0!


но если по вашему вопросу, то в релизе, автор сделает всё ничтяк: т.е. все 100500 проверок.

Добавлено через 1 минуту
zayats80888, слава догу,
наконец то гуру к нам подошли.
Передаю тему вам.
2
11.02.2020, 13:38

Не по теме:

Цитата Сообщение от XLAT Посмотреть сообщение
zayats80888, слава догу,
наконец то гуру к нам подошли.
Передаю тему вам.
Я так то год всего лишь c С++, спс не нужно :)

0
11.02.2020, 13:43

Не по теме:

Цитата Сообщение от zayats80888 Посмотреть сообщение
Я так то год всего лишь c С++, спс не нужно :)
дык, а я даже стандарт в глаза не видел :D

0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
11.02.2020, 14:52

Не по теме:

Кликните здесь для просмотра всего текста

Процедура — порядок действий, направленных на достижение результата в плане оказания помощи людям у которых проблемы со здоровьем

Казалось бы, причём здесь С++?



Добавлено через 1 минуту
Цитата Сообщение от XLAT Посмотреть сообщение
и я задолбался им отвечать: Замените nullptr на 0!
0
4 / 4 / 1
Регистрация: 10.12.2019
Сообщений: 176
12.02.2020, 19:03  [ТС]

Не по теме:

Цитата Сообщение от XLAT Посмотреть сообщение
Программиста на С++ спросили:
- Ты веришь в бога?
- Нет!
- Почему же?
- Про него ничего не написано в стандарте!!!
Второй день смеюсь над ним, спасибо большое! XD XD XD



А программу я немножко переработал, и примерно должно было выглядеть это так (но, всё равно её нужно будет подправить )

Кликните здесь для просмотра всего текста
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
119
120
121
122
123
124
125
126
127
#include <iostream>
 
using namespace std;
 
struct List {
    float num;
    List *next;
    List *prev;
};
typedef List *PList;
PList Head = NULL, Tail = NULL;
 
PList createElement(float x) {
    PList newElement = new List;
    newElement->num = x;
    newElement->next = NULL;
    newElement->prev = NULL;
    return newElement;
}
 
void addElement(PList newElement) {
    PList tmp = Head; // временная переменная для прохода по списку
    if (!Head) {
        Head = newElement;
        Tail = newElement;
    }
    else {
        while (tmp->next) {
            tmp = tmp->next;
        }
        tmp->next = newElement;
        newElement->prev = tmp;
        Tail = newElement;
    }
}
 
void fill_list(){
    for (int i = 0; i < 11; i++)
        addElement(createElement(i));
}
 
void show(){      // Выводит список
    PList tmp = Head;
    int id = 0;
    while (tmp){
        id++;
        cout << tmp->num << " " << tmp << endl;
        tmp = tmp->next;
    }
    cout << "\n";
}
 
PList find(int id) {
    PList tmp = Head;
    for (int i = 1; i < id; i++) {
        if (tmp->next) tmp = tmp->next;
    }
    return tmp;
}
 
void add(PList p,float x){
    while (p->next) p = p->next;
    List *tmp = new List;
    tmp->next = NULL;
    tmp->num = x;
    if (Head != NULL){
        tmp->prev = Tail;
        p->next = tmp;
        p = tmp;
    }
    else {
        tmp->prev = NULL;
        Head = p = tmp;
    }
    Tail = p;
}
 
void addf(PList p,float x){
    while (p->prev) p = p->prev;
    List *tmp = new List;
    tmp->prev = NULL;
    tmp->num = x;
    if (Head != NULL) {
        tmp->next = Head;
        tmp->prev = tmp;
        Head = tmp;
    }
    else {
        Head = Tail = tmp;
    }
}
 
void func(){
    float a,b,x;
    cout << "Input a " << endl;
    cin >> a;
    cout << "Input b " << endl;
    cin >> b;
    cout  << "Input x " << endl;
    cin >> x;
    addf(find(x),a);
    add(find(x),b);
    cout << "Elements inserted" << endl;
}
 
int main()
{
    fill_list();
    int sw;
    while (1)
    {
        cout << "1 - show(), 2 - func(a,b,x), 3 - exit" << endl;
        cin >> sw;
        switch (sw) {
            case 1:
                show();
            break;
            case 2:
                func();
            break;
            case 3:
                return 0;
        }
    }
 
    return 0;
}
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.02.2020, 15:17
Цитата Сообщение от ive_karp Посмотреть сообщение
Программиста на С++ спросили:
- Ты веришь в бога?
- Нет!
- Почему же?
- Про него ничего не написано в стандарте!!!
Кстати интересно упоминается ли в стандарте создатель Б.Страуструп.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.02.2020, 15:17
Помогаю со студенческими работами здесь

Если в класс нужно передать указатель на указатель на массив строк неизвестной длинны?
Как проинициализировать массив строк wchar_t * (произвольного размера) , если его нужно передать в конструктор класса ? wchar_t *A1 =...

Как передать функцию в поток
Имеется стандартный пример пример создания потока в C++Builder Unit2: ...

Как передать в функцию параметр цвета
Помогите пожалуйста перевести начало функции из дельфи на си procedure sector(clr:TColor;angle1,angle2:real;msg:string); Я записываю...

Как в поток передать разные функцию ?
Есть поток и две функции как передать их в метод Execute //unit1.cpp #include &quot;Unit2.h&quot; void m1() { ...

Как передать в функцию двумерный массив ?
Блин заморочился уже.. Надо передать двумерные массивы в функцию, обработать их там и вернуть .. помогите.. float Mnozh (float...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru