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

Нужны советы по задачам - C++

Восстановить пароль Регистрация
 
Рейвол
2 / 2 / 0
Регистрация: 06.10.2012
Сообщений: 44
27.03.2013, 22:53     Нужны советы по задачам #1
У меня при написании программ возникли проблемы.
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#include <conio.h>
#include <stdio.h>
#include <iostream>
using namespace std;
 
struct STack
{
    int *number;
};
 
void Print(const STack* st)
{
    cout <<"\n<"<<st->number<<">";
    for(int i=0; i<st->number; i++)
        cout<<st->number[i]<<"\t";
    
}
 
void Input(STack* const st)
{
    cout <<"\nSay number:";
    cin >>st->number;
    for(int i=0; i<st->number; i++) 
        cin>>st->number[i];
 
}
 
struct STnum
{STack *data; // данные числа
STnum *prev; // указатель на предыдущий элемент
STnum *next; // указатель на последний элемент списка
STnum();
};
 
STnum::STnum()
{data = NULL;
prev = next = NULL;
}
 
 
struct Tlist
{
    STnum *head; // указатель на начало списка
    STnum *tail; // указатель на конец списка
 
    Tlist();
    void AddToHead(STack*); // добавить число в начало списка
    void DelFirst ();
    void Clear();
    void PrintN();
};
 
    Tlist::Tlist()
    {
        head=tail = NULL;
    }
 
    void Tlist::AddToHead(STack* st)
    {
        STnum *p = new STnum;
        p->data = st;
        if(!head)
        {
            head=tail=p;
        }
        else
        {
            p->prev = head;
            p->next = head->next;
            head = tail = p;
        }
    }
    void Tlist::DelFirst()
    {
        if(head)
        {
            if(head==tail)
            {
                delete head;
                head=tail=NULL;
            
            }
            else
            {   STnum *p = head;
                head = head->next;
                delete p->data;
                delete p;
            }
        }
    }
 
    void Tlist::Clear()
    {
        STnum *p = head;
        while(p!=NULL)
        {
            DelFirst();
            p=p->next;
        }
    }
 
    void Tlist::PrintN()
    {
        STnum *p = head;
        while(p!=NULL)
        {
            Print(p->data);
            p=p->next;
        }
    }
 
    int Menu()
    {   system("clr");
        cout<<"\n Menu\n";
        cout<<"1. New number\n";
        cout<<"2. Delete first number\n";
        cout<<"3. Delete all numbers\n";
        cout<<"4. Show numbers\n";
        cout<<"0. close menu\n";
        cout<<"choose function of menu =>";
        int punkt;
        do
        cin>>punkt;
        while(punkt <0 || punkt >4);
        return punkt;
    }
 
    int main()
    {
        
        Tlist group;
        
 
        int subPunkt;
        do{
            subPunkt = Menu();
            switch(subPunkt)
            {
case 1:{
                cout<<"\nNew number";
                STack *st = new STack;
                Input(st);
                group.AddToHead(st);
      }
       break;
case 2: group.DelFirst(); 
    break;
case 3: group.Clear();
    break;
case 4: 
    {
        cout<<"\n Show Num\n";
        if(!group.head)
            cout<<"\n you have no Num!\n";
        else
            group.PrintN();
    }
    break;
            };
            getch();
        }
        while(subPunkt!= 0);
        group.Clear();
    }
я абсолютно не знаю, как написать ф-ю считывания списка с файла(блокнота). Здесь мне нужна помощь конкретно с написанием самой ф-и, так как с работой с файлами, я вообще не бум-бум.

2) в этой же программе возникла такая проблема, что при выполнении заполнения списка, я могу ввести 1 элемент, после чего посмотреть, что он присутствует в списке через ф-ю показа списка. Но вводя второй элемент, он показывает только последний элемент списка, не показывая первый. Как можно с этим справится?


3) Эта проблема с другой задачей, но тут мне нужен лишь совет. Как в одномерном массиве, поставить после максимального элемента, все минимальные? я так понимаю, что нужно найти индексы максимального и минимального элемента, но что делать с ними дальше, я не знаю.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
eocron
Кактус
 Аватар для eocron
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
27.03.2013, 23:13     Нужны советы по задачам #2
1) Вот документация по считыванию, с конкретным примером - http://www.cplusplus.com/reference/f...ifstream/open/

2) Для печати списка вам нужно пробежаться по всем элементам от головы до хвоста и последовательно их распечатать. Для этого заводите "итератор" типа (STnum *iter=head; ) (грубо говоря это ссылка, которая сообщает на каком узле вы находитесь в данный момент), в начале iter=голове списка. Далее, Вы последовательно делаете шаги вглубь - iter=iter->next до тех пор пока iter не равен NULL.

3) Вы реализуете сортировку? В таком случае лучше ее назвать. Если же это НЕ сортировка и вам просто нужно поставить все минимальные вправо - вы находите максимальный элемент и меняете его с первым. И все.
Рейвол
2 / 2 / 0
Регистрация: 06.10.2012
Сообщений: 44
27.03.2013, 23:47  [ТС]     Нужны советы по задачам #3
eocron, с третьим у меня вопрос, мне нужно найти минимальное значение и максимальное, я его нашел, но нужно именно определить позицию максимального(с этим проблем нет), и после него всем последующим элементам присвоить значение одного единственного минимального, то есть условно говоря, есть массив:
4 1 3 9 8 7 5 6 и получить:
4 1 3 9 1 1 1 1. Мне кажется, что через ваш способ не подходит для этого, или я ошибаюсь? может просто я вас немного не понял.

Добавлено через 4 минуты
eocron, и ещё, во втором, мне этим способом, нужно работать с ф-й заполнения списка или ф-й вывода на экран списка?
eocron
Кактус
 Аватар для eocron
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
27.03.2013, 23:51     Нужны советы по задачам #4
Тогда все просто, вы сохраняет индекс минимального элемента в min и максимального элемента в max, далее простенький цикл:
for(int i=max+1; i<n;i++) a[i]=a[min];
Дословно он говорит следующее: начиная со следующей позиции после позиции максимального элемента, заполнять все минимальным элементом.

где n - число элементов в массиве, a[] - сам массив.


----------------
Во втором, на итераторы в интернете есть хорошая документация. Он позволяет множество вещей вытворять со структурой данных. В данном случае, да, вам всего лишь с помощью итератора нужно пробежать по всем элементам пошагово - начиная от головы делать iter=iter->next и в вплоть до NULL не включая.
Yandex
Объявления
27.03.2013, 23:51     Нужны советы по задачам
Ответ Создать тему
Опции темы

Текущее время: 23:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru