11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
1

ошибка в функции подскажите как исправить

04.11.2011, 04:58. Показов 3404. Ответов 51
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
в функции ввод списка с экрана, там был бесконечный цикл который прерывался операторов Break, препод сказал что это не грамотно прерывать цикл с помощью Break, попытался в while само условие написать но выдает такую ошибку "[BCC32 Error] File3.cpp(119): E2378 Do-while statement missing ;
Full parser context
File3.cpp(106): parsing: sp * fs_enter()" че не так ???
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
using namespace std;
    char bufRus[256];
    char* Rus(const char* text)
    {
        CharToOem(text, bufRus);
    return bufRus;
    }
 
struct lfile{
    char name[15];
    char data[10];
    int upd;
};
struct sp{
    lfile elfile;   // поле данных
    sp *next;   // указатель
};
 
sp*print_list(sp *list);//прототип функции вывод на экран
 
 
sp* ft_enter();//прототип функции ввод из текстового файла
 
sp* fs_enter();// прототип функции ввод с экрана
sp* sort(sp *list);// прототип сортировки
void search(sp *list); // прототип функций поиск по имени и вывод в файл
void fsearch(sp *list); //прототип функции поиск файла с наибольшим количеством обращений
 //
sp* pind(sp *list); //прототип получения адреса
sp* del(sp *list,sp *adr);// прототип функции удаления файла
sp * vst(sp *list,sp *adr);// прототип фунции вставка файла
void zmn(sp *list); // прототип функции замена файла
 
void main()
{
   int v;
   sp *k;
   do{
      cout<<Rus("  1: формирование списка из текстового файла")<<endl;
      cout<<Rus("  2: формирование списка с экрана")<<endl;
      cout<<Rus("  3: поиск по заданному полю с сохранением результатов в файле")<<endl;
      cout<<Rus("  4: выборка файла с наибольшим количеством обращений")<<endl;
      cout<<Rus("  5: замена записи")<<endl;
      cout<<Rus("  6: удаление записи после указанного адреса")<<endl;
      cout<<Rus("  7: вставка записи после указанного адреса")<<endl;
      cout<<Rus("  8: вывод списка")<<endl;
      cout<<Rus("  9: выход")<<endl;
      cout<<Rus("вариант ")<<endl;
      cin>>v;
      switch(v){
        case 1: k = ft_enter(); break;/*вызов функции ввод тектового файла в переменную к, чтоб по ней потом можно было делать сортировку, поиск и тд*/
        case 2: k = fs_enter(); break;// вызов функции ввод с экрана
        case 3: k = sort(k); print_list(k); break;// вызов 2 функций сортировки по переменной к, и вывод списка на экран
        case 4: search(k);break;//вызов функции поиск по переменной к и сохранение в файл одной строки
        case 5: fsearch(k); break;//вызов функции поиск файла с наибольшим количеством обращений к нему
        case 6: zmn(k); print_list(k); break;//вызов функции замена строки по указаному номеру
        case 7: k = del(k,pind(k)); print_list(k); break;// вызов функции удаление строки после указанного номера
        case 8: k = vst(k,pind(k)); print_list(k); break;//вызов функции вставка строки после указанного номера
        case 9: print_list(k);break;//вызов функции вывод списка на экран
        case 10:return; break;
 
        }
    } while(true);//цикл будет повтрятся
}
 
//ввод списка из текстового файла
sp* ft_enter(){
    char name[10];// символьный тип которое будет именем файла и его типом не больше 10знаков
    cout<<Rus("введи имя входн тип.файла")<<endl;
    cin>>name;// ввод имени и типа
    sp* list = new sp;    //создаем указатель на голову списка
    sp *ptr;  //указатель на элемент списка
    bool on=true; //флажок, который определяет, читаем ли мы первый элемент списка или последующие
    ifstream inf(name);//считывание файла по имени name в inf
    while (!inf.eof()){ // цикл пока не будет достигнут конец файла
        if(on){     //если до этого список был пуст, то
            ptr=list;  //записываем в него первый элемент
            on=false;
        }else{  //если список не пуст, то записываем в него текущий элемент (настраиваем указатель на след. элемент)
            ptr->next=new sp; //выделяем память под следующий элемент списка
            ptr=ptr->next;//ptr теперь указывает на тот элемент который был выделен строкой выше
        }
        inf>> ptr->elfile.name;   //читаем конкретные данные в текущий элемент списка
        inf>> ptr->elfile.data;
        inf>> ptr->elfile.upd;
        inf.ignore();
    }
    ptr->next=NULL; //для последнего элемента списка указатель на следующий элемент не определен/пуст (установлен в NULL)
    inf.close();//закрытие файла
    return list;  //  возвращаем указатель на первый элемент списка
}
 
 
//ввод списка с экрана
sp* fs_enter(){
    sp* list =new sp; //выделяем память под список
    sp *ptr; //указатель на элемент списка
    char name; // символьный тип которое будет именем файла и его типом
    cout<< Rus("Введиде имя, дату создания, кольчество обращений к файлу")<<endl;
    ptr=list; //теперь ptr указывает на список
   do   {
        cin>>ptr->elfile.name;
        cin>>ptr->elfile.data;
        cin>>ptr->elfile.upd;
        cout<<Rus("ещё (y/n)")<<endl;
        cin>>name;
        }while (name=='n')
        ptr->next=new sp; //выделяем память под строку
        ptr=ptr->next;//указываем на эту строку
 
   return list;} //возвращаем указатель на первый элемент списка
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2011, 04:58
Ответы с готовыми решениями:

ошибка подскажите как исправить!!
1&gt;d:\calcu\calcu\Form1.h(343): error C3861: strtoint32: идентификатор не найден int a; int b; a...

Подскажите в чем ошибка, и как исправить
Программа еще не полностью готова, но есть парочка ошибок, сам не разобрался, прошу вашей помощи,...

Подскажите что за ошибка и как исправить
&quot;Во время создания модели обнаружены ошибки...

Ошибка 150 подскажите как исправить
create table `ВУЗ`( `Наименование ВУЗа` varchar (20) not null primary key, `Адрес` varchar (30)...

51
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
05.11.2011, 05:19  [ТС] 21
Author24 — интернет-сервис помощи студентам
да строка с нулем исчезла но появился другой дефект, если ввожу больше одной строки то вылетает и выдает такое окно Project Project3.exe raised exception class Eaccess Violetion with message 'Eaccess Violetion'

Добавлено через 14 минут
Цитата Сообщение от accept Посмотреть сообщение
C++
1
2
3
4
5
6
7
        name = 'y';
        while (name == 'y'){
            cin >> ptr->elfile.name;
            cin >> ptr->elfile.data;
            cin >> ptr->elfile.upd;
            cin.get();
            ptr->next = NULL:
( вот эту строчку не пропускает выдает ошибку)
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.11.2011, 05:20 22
C++
1
2
3
4
        case 2:
            k = fs_enter();
            cout << "fs_enter: ok" << endl;
            break;
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
05.11.2011, 05:22  [ТС] 23
а тут что не так?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.11.2011, 05:25 24
у тебя сама структура содержит маленькие массивы
тебе надо сделать их с запасом и учитывать нуль-символ, который добавляется в конце

Добавлено через 1 минуту
Цитата Сообщение от lexflax
а тут что не так?
поставь вывод сообщения, когда функция отработала
чтобы знать, что ошибка в ней/не в ней
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
05.11.2011, 05:27  [ТС] 25
не совсем понял, вы имели ввиду что при вызове функции допустим удаления , тужа же внести функцию вывода на экран чтоб сразу видеть результат? помогите плиз еще с функцией удаления и вставки они у меня тоже косячно работают(((
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.11.2011, 05:30 26
когда функция готова, нужно после её вызова вывести сообщение, что она выполнилась
иначе можно увидеть ошибку, произошедшую в другой функции, и принять её за ошибку, произошедшую в этой функции
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
05.11.2011, 05:42  [ТС] 27
понял, у меня ошибка в функции вставки элемента...
//вставка нового элемента после элемента с адресом adr
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sp * vst(sp *list,sp *adr){
    lfile rab;
    sp *pt=list,*q=new sp;
    cout<<"name=";
    cin>>rab.name;
    cout<<"data=";
    cin>>rab.data;
    cout<<"up=";
    cin>>rab.upd;
    q->elfile=rab;// в список на который ссылался q присваиваем строки rab
    if(adr==list->next){
        pt=q;
        q->next=adr;
    }else{
        q->next= adr->next;
        adr->next=q;
    }
    return pt;
}
вот в чем ошибка:
Допустим я открываю текстовый файл и оттуда считываю список
1 ron.txt 12.11.2001
2 fen.txt 11.11.2008 ( о щас проверил работает все))))) а вот удаление не работает как надо если ввожу удалить первую строчку то удаляет, если вторую то никак не реагирует...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//удаление элемента с адресом adr
sp* del(sp *list,sp *adr){
    sp *pt=list, *q;
    if(adr==list){// если номер совпал то...
        pt=adr->next;//  перейти на другую строку
        q=adr;// запомнить ее
    }else{
        q = adr->next;
        adr=adr->next;
     }
    delete(q); //удаляет строку после указанного номера
    return pt;
}
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.11.2011, 06:03 28
Цитата Сообщение от lexflax
C++
1
//удаление элемента с адресом adr
это неправильный подход
нужно удалять элемент с определённым номером
при удалении там должен быть цикл, пропускающий элементы до нужного
вставка - точно так же
0
24 / 24 / 3
Регистрация: 17.05.2011
Сообщений: 141
05.11.2011, 06:19 29
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
struct ecl{
    ecl* next;
    char* str;
};
 
struct string{
    ecl* head;
    int size;
};
 
int main()
{
    string str;
    //нчало списка
    str.size=10;
    str.head=new ecl;
    //итератор
    ecl* p;
    p=str.head;
    char* c=new char;
 
    //чтение
    while(1){
        p->str=new char[str.size+1];
        int i;
        for(i=0; i<str.size ;i++){
            std::cin.read(c,1);
            p->str[i]=*c;
            if(*c=='\n'){i++ ;break;}
        }
        p->str[i]=0;
        if(*c=='\n')break;
        p->next=new ecl;
        p=p->next;
        p->next=NULL;
    }
    std::cout<<"\n";
    for(p=str.head;p;p=p->next)
        std::cout<<p->str;
 
    //редактирование
    char* tmp=new char[str.size*2];
    int rez;
    for(p=str.head; p ;p=p->next){
        rez=0;
        for(int i=0; i<str.size*2 && i-rez!=str.size+1 ; i++){
            if(p->str[i]==',' || p->str[i]=='.'){
                tmp[i]=p->str[i-rez];
                tmp[i+1]=' ';
                i++;
                rez++;
            }
            else tmp[i]=p->str[i-rez];
        }
        
        delete p->str;
        p->str=new char[strlen(tmp)+1];
        strcpy(p->str,tmp);
    }   
 
    for(p=str.head;p;p=p->next)
        std::cout<<p->str;
    //удаление
    p=str.head->next;
    for(;p;str.head=p,p=p->next){
        delete str.head->str;
        delete str.head;
    }
    delete str.head;
    return 0;
}
можно как-то так)
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.11.2011, 06:31 30
Цитата Сообщение от Глупец
C++
1
char* c=new char;
C++
1
    char c;
Добавлено через 1 минуту
Цитата Сообщение от Глупец
можно как-то так)
это какая-то другая задача
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
05.11.2011, 15:09  [ТС] 31
все таки функция вставки после введеного номера у меня работает не корректно((( замучался варианты с ней перебирать... во всех случаяъ работает норм кроме одного... суть функции если я выбираю номер строки 1 и ввожу допустим ter.txt 12.11.2009 4
допустим до вставки были такие списки то после ввода один файл тер должен добавится и оказаться вот где
1 bor.txt 12.11.2009 3
2 bir.txt 11.11.2009 4


1 bor.txt 12.11.2009 3
2 ter.txt 12.11.2009 4
3 bir.txt 11.11.2009 4(это правильное отображение) а получается вот такое

1 ter.txt 12.11.2009 4
2 bir.txt 11.11.2009 4(тоесть происходит замена первого а не вставка после первого, такое только в случае когда нажимаю первую строку... когда выбераю 2 или последущие то работает нормально) помогите исправить, весь день с ней уже мучаюсь(
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//вставка нового элемента после элемента с адресом adr
sp * vst(sp *list,sp *adr){
    lfile rab;
    sp *pt=list,*q=new sp;
    cout<<"name=";
    cin>>rab.name;
    cout<<"data=";
    cin>>rab.data;
    cout<<"up=";
    cin>>rab.upd;
    q->elfile=rab;// в список на который ссылался q присваиваем строки rab
    if(adr==list){
        pt=q;
        q->next=adr->next;
    }else{
        q->next= adr->next;
        adr->next=q;
    }
    return pt;
}
Добавлено через 1 час 11 минут
help me
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.11.2011, 17:20 32
её нужно переписать на номер элемента
иначе она не имеет смысла, так как адрес каждого элемента произвольный

Цитата Сообщение от lexflax
C++
1
//вставка нового элемента после элемента с адресом adr
перечисли адресы всех элементов списка
допустим, нужно вставить перед последним элементом, какой адрес у элемента перед ним ?
1
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
05.11.2011, 17:42  [ТС] 33
напишите плиз я своим умом это явно не сооброжу ....

Добавлено через 1 минуту
может вы имеели такую функцию ввиду
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//получить адрес
sp* pind(sp *list){
    sp *prt = list;
    int i=1,j=0;
    cout<<Rus("Введите номер")<<endl;
    cin>>j; //номер строки
    while (prt != NULL){
        if(i==j){
            return prt; //строка под этим номером
            break;
        }
        prt=prt->next;
        i++;
    } }
Добавлено через 16 минут
вот весь листинг моей контрольной
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
# include <iostream>              // класс для работы с вводом-выводом
# include <windows.h>             // для функции  CharToOem();
# include <fstream>           // класс для работы с файлом
 
using namespace std;
    char bufRus[256];
    char* Rus(const char* text)
    {
        CharToOem(text, bufRus);
    return bufRus;
    }
 
struct lfile{
    char name[15];
    char data[10];
    int upd;
};
struct sp{
    lfile elfile;   // поле данных
    sp *next;   // указатель
};
 
sp*print_list(sp *list);//прототип функции вывод на экран
 
 
sp* ft_enter();//прототип функции ввод из текстового файла
 
sp* fs_enter();// прототип функции ввод с экрана
sp* sort(sp *list);// прототип сортировки
void search(sp *list); // прототип функций поиск по имени и вывод в файл
void fsearch(sp *list); //прототип функции поиск файла с наибольшим количеством обращений
 //
sp* pind(sp *list); //прототип получения адреса
sp* del(sp *list,sp *adr);// прототип функции удаления файла
sp * vst(sp *list,sp *adr);// прототип фунции вставка файла
void zmn(sp *list); // прототип функции замена файла
 
void main()
{
   int v;
   sp *k;
   do{
      cout<<Rus("  1: формирование списка из текстового файла")<<endl;
      cout<<Rus("  2: формирование списка с экрана")<<endl;
      cout<<Rus("  3: поиск по заданному полю с сохранением результатов в файле")<<endl;
      cout<<Rus("  4: выборка файла с наибольшим количеством обращений")<<endl;
      cout<<Rus("  5: замена записи")<<endl;
      cout<<Rus("  6: удаление записи после указанного адреса")<<endl;
      cout<<Rus("  7: вставка записи после указанного адреса")<<endl;
      cout<<Rus("  8: вывод списка")<<endl;
      cout<<Rus("  9: выход")<<endl;
      cout<<Rus("вариант ")<<endl;
      cin>>v;
      switch(v){
        case 1: k = ft_enter(); break;/*вызов функции ввод тектового файла в переменную к, чтоб по ней потом можно было делать сортировку, поиск и тд*/
        case 2: k = fs_enter(); break;// вызов функции ввод с экрана
        case 3: search(k);break;//вызов функции поиск по переменной к и сохранение в файл одной строки
        case 4: fsearch(k); break;//вызов функции поиск файла с наибольшим количеством обращений к нему
        case 5: zmn(k); print_list(k); break;//вызов функции замена строки по указаному номеру
        case 6: k = del(k,pind(k)); print_list(k); break;// вызов функции удаление строки после указанного номера
        case 7: k = vst(k,pind(k)); print_list(k); break;//вызов функции вставка строки после указанного номера
        case 8: print_list(k);break;//вызов функции вывод списка на экран
        case 9:return; break;
 
        }
    } while(true);//цикл будет повтрятся
}
 
//ввод списка из текстового файла
sp* ft_enter(){
    char name[10];// символьный тип которое будет именем файла и его типом не больше 10знаков
    cout<<Rus("введи имя входн тип.файла")<<endl;
    cin>>name;// ввод имени и типа
    sp* list = new sp;    //создаем указатель на голову списка
    sp *ptr;  //указатель на элемент списка
    bool on=true; //флажок, который определяет, читаем ли мы первый элемент списка или последующие
    ifstream inf(name);//считывание файла по имени name в inf
    while (!inf.eof()){ // цикл пока не будет достигнут конец файла
        if(on){     //если до этого список был пуст, то
            ptr=list;  //записываем в него первый элемент
            on=false;
        }else{  //если список не пуст, то записываем в него текущий элемент (настраиваем указатель на след. элемент)
            ptr->next=new sp; //выделяем память под следующий элемент списка
            ptr=ptr->next;//ptr теперь указывает на тот элемент который был выделен строкой выше
        }
        inf>> ptr->elfile.name;   //читаем конкретные данные в текущий элемент списка
        inf>> ptr->elfile.data;
        inf>> ptr->elfile.upd;
        inf.ignore();
    }
    ptr->next=NULL; //для последнего элемента списка указатель на следующий элемент не определен/пуст (установлен в NULL)
    inf.close();//закрытие файла
    return list;  //  возвращаем указатель на первый элемент списка
}
 
 
//ввод списка с экрана
sp *fs_enter()
{
        sp *list, *ptr;
        char name;
 
        cout << Rus("Введиде имя, дату создания, кольчество обращений к файлу") << endl;
        list = ptr = new sp;
        name = 'y';
        while (name == 'y'){
            cin >> ptr->elfile.name;
            cin >> ptr->elfile.data;
            cin >> ptr->elfile.upd;
            cin.get();
            ptr->next=NULL;
 
            cout << Rus("ещё (y/n)") << endl;
            cin >> name;
            cin.get();
            if (name == 'y') {
                ptr->next = new sp;
                ptr = ptr->next;
            }
        }
        return list;
}
 
//Функция вывода списка на экран, как параметр берёт указатель на список.
sp* print_list(sp *list){
    sp *prt = list;
    int i=0;
    do {
        cout<<++i<<"  ";// первый файл
        cout<<prt->elfile.name<<"      ";
        cout<<prt->elfile.data<<"      ";
        cout<<prt->elfile.upd<<endl;
        prt=prt->next;//следующий
 
    } while (prt!=0);
}
 
 
 
//поиск файла по имени и вывод его в текстовый файл
void search(sp *list){
    sp *prt = list;
    char f[15],r[15];
    cout<<Rus("введите текст")<<endl;
    cin>>f;
    cout<<Rus("введите выходной файл")<<endl;
    cin>>r;
    ofstream inf(r);
    while (prt!=NULL){
        if(strstr(prt->elfile.name,f)){ // сравнивает имя файла введенное с теми что в списке, если совпадает то выводит о нем всю информацию в другой файл
          inf<<prt->elfile.name<<"  ";
          inf<<prt->elfile.data<<"  ";
          inf<<prt->elfile.upd<<endl;
          prt=NULL;
        } else{
        prt=prt->next;}//переход на другую строку
    }
}
 
//Файл с наибольшим кольчеством обращений
void fsearch(sp *list){
     sp *prt = list;
     int p=-1;
     sp *r;
     while (prt != NULL){
        if(prt->elfile.upd > p){//если первое обращение больше другого
            p = prt->elfile.upd; // присвоить его значение в р
            r = prt; //запомнить максимум
 
        prt=prt->next;
        }
        else
     {
     cout<<Rus("Файл с наиольшим кольчеством обращений")<<endl;
     cout<<r->elfile.name<<" ";
     cout<<r->elfile.data<<" ";
     cout<<r->elfile.upd<<endl;
     }} prt=NULL;
}
 
//получить адрес
sp* pind(sp *list){
    sp *prt = list;
    int i=1,j=0;
    cout<<Rus("Введите номер")<<endl;
    cin>>j; //номер строки
    while (prt != NULL){
        if(i==j){
            return prt; //строка под этим номером
            break;
        }
        prt=prt->next;
        i++;
    } }
 
 
//удаление элемента с адресом adr
sp* del(sp *list,sp *adr){
    sp *pt=list, *q;
    if(adr==list){// если номер совпал то...
        q=adr->next;
        pt=q;
        q=adr->next;//
 
    }else{
        q = adr;
        adr=adr->next;
     }
    delete(q); //удаляет строку после указанного номера
    return pt;
}
 
//вставка нового элемента после элемента с адресом adr
sp * vst(sp *list,sp *adr){
    lfile rab;
    sp *pt=list,*q=new sp;
    cout<<"name=";
    cin>>rab.name;
    cout<<"data=";
    cin>>rab.data;
    cout<<"up=";
    cin>>rab.upd;
    q->elfile=rab;// в список на который ссылался q присваиваем строки rab
    if(adr==list){
        pt=q;
        pt->next=adr;
    }else{
        q->next= adr->next;
        adr->next=q;
    }
    return pt;
}
 
//заменить поле
void zmn(sp *list){
    sp *prt = list;
    int i=1,j=0;
    cout<<Rus("Введите номер")<<endl;
    cin>>j; // номер поля которое заминить
    while (prt != NULL){
        if(i==j){// если номер есть тоесть равен то..
        cout << Rus (" Введите имя нового файла");
    cin>>prt->elfile.name;
    cout << Rus (" Введите дату создания файла");
    cin>>prt->elfile.data;
    cout << Rus (" Введите количество обращений к файлу");
    cin>>prt->elfile.upd;
            break;
        }
        prt=prt->next;
 
        i++;
    }
}
Добавлено через 2 минуты
корректно не работает две функции это вставки и удаления... уже не знаю как исправить... переставлял по разному внутри функций все... но вставке все работает как надо только в одно случае работает не так когда ввожу допустим адрес один то он вставляет новый элемент не после первого а перед собой, в других случаях когда ввожу 2 или 3 или 4 то после вставляет вот как исправить не знаю(((
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.11.2011, 17:48 34
Цитата Сообщение от lexflax
может вы имеели такую функцию ввиду
а, ну да, похоже, эта функция используется для получения адреса

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// вставка в список list нового элемента elem
// после элемента с номером n
sp *vst(sp *list, int n, sp *elem)
{
    sp *tmp;
    
    if (n == 0) {
        elem->next = list;
        return elem;
    }
 
    for (tmp = list;
         tmp->next != NULL && --n > 0;
         tmp = tmp->next)
        ;
    
    elem->next = tmp->next;
    tmp->next = elem;
    return list;
}
здесь нет создания элемента внутри функции
так должно быть везде
1
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
06.11.2011, 04:15  [ТС] 35
спасибо, щас мозги уже не соображают, завтра с утра попробую ваш вариант подставить или видо изменить под свой, отпишусь как получилось может по этому типу и удаление получится сделать корректным

Добавлено через 10 часов 23 минуты
Цитата Сообщение от accept Посмотреть сообщение
здесь нет создания элемента внутри функции
так должно быть везде
а почему так должно быть? мне ведь все таки надо вставить элемент а чтоб его вставить его надо создать и заполнить
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
06.11.2011, 07:45 36
Цитата Сообщение от lexflax
а почему так должно быть?
функция должна выполнять только свою задачу
она не должна делать то, что не относится к ней
например, где-то уже есть данные и надо только добавить эти данные в список
ты запускаешь функцию и она начинает у тебя запрашивать данные, зачем

поэтому ввод данных должен быть до вызова этой функции
в список можно добавлять по-разному:
1) можно передать узел, сформированный ранее
2) можно передать элементы, чтобы они были записаны в узел, создаваемый в функции
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
06.11.2011, 14:05  [ТС] 37
функция вставки у меня заработала как надо наконец то, вот листинг до изменения который был косячный
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//вставка нового элемента после элемента с адресом adr
sp * vst(sp *list,sp *adr){
        lfile rab;
        sp *pt=list,*q=new sp;
        cout<<"name=";
        cin>>rab.name;
        cout<<"data=";
        cin>>rab.data;
        cout<<"up=";
        cin>>rab.upd;
        q->elfile=rab;// в список на который ссылался q присваиваем строки rab
        if(adr==list){
                pt=q;
                q->next=adr->next;
        }else{
                q->next= adr->next;
                adr->next=q;
        }
        return pt;
}
вот после изменений
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sp * vst(sp *list,sp *adr){
    lfile rab;
    sp *pt=list,*q=new sp;
    cout<<"name=";
    cin>>rab.name;
    cout<<"data=";
    cin>>rab.data;
    cout<<"up=";
    cin>>rab.upd;
    q->elfile=rab;// в список на который ссылался q присваиваем строки rab
    if(adr->next==list){
        q=list->next;
        pt=q;
 
    }else{
        q->next= adr->next;
        adr->next=q;
    }
    return pt;
}
с удалением пока что попрежнему не получается((( может сможите с удалением подсказать?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
06.11.2011, 14:12 38
Цитата Сообщение от lexflax
вот после изменений
утечка памяти
q может потерять своё значение - адрес выделенного блока памяти
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
06.11.2011, 14:14  [ТС] 39
в каких случаях оно может потерять свое значение? че опять косяк какой то серьезный в функции? поясните пожалуйста подробней
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
06.11.2011, 14:20 40
Цитата Сообщение от lexflax
C++
1
        q=list->next;
вот в q записывается новый адрес, а старый теряется
0
06.11.2011, 14:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.11.2011, 14:20
Помогаю со студенческими работами здесь

Какая-то ошибка, подскажите как исправить
Sub Programma() Dim A(5, 5) As Integer Dim I As Byte Dim Proizv As Single Dim J As Byte Sub...

Ошибка в XML. Подскажите как исправить ситуацию
Недавно появилась вот такая ошибка (см. приложение) и не понятно что с ней делать, так как нет...

Подскажите, в чем здесь ошибка? И как ее исправить...плиз!
//Ошибка здесь!!!! void power (ulong m, ulong &amp;s, ulong &amp;t) { for (t=0, s=m; s%2==0; t++) ...

Подскажите, пожалуйста, что это за ошибка и как её исправить?
Подскажите пожалуйста что это за ошибка и как её исправить? (см. скрин во вложении)


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

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

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