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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
#1

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

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

в функции ввод списка с экрана, там был бесконечный цикл который прерывался операторов 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;} //возвращаем указатель на первый элемент списка
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2011, 04:58     ошибка в функции подскажите как исправить
Посмотрите здесь:

C++ Подскажите, в чем здесь ошибка? И как ее исправить...плиз!
подскажите как исправить ошибку C++
Ошибка 2 error C2447: {: отсутствует заголовок функции. Как исправить?? C++
Подскажите как исправить ошибку C++
ошибка подскажите как исправить!! C++
C++ Ошибка error C2447: {: отсутствует заголовок функции. Как исправить??
Подскажите как исправить ошибку C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
06.11.2011, 15:48  [ТС]     ошибка в функции подскажите как исправить #41
блин но ведь работает то как надо))) или это серьезный косяк? почему тогда работает?

Добавлено через 1 час 25 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//удаление элемента с адресом adr
sp* del(sp *list,sp *adr){
sp *pt=list, *q;
if(adr==list){// если номер совпал то...
q=list->next;
pt=q;
//
 
}else{
q = adr;
adr=adr->next;
}
delete(q); //удаляет строку после указанного номера
return pt;
}
вот эта функция осталась последней которая с косяком работает... удаляет только первый элемент, а другие не хотит
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.11.2011, 16:46     ошибка в функции подскажите как исправить #42
Цитата Сообщение от lexflax
блин но ведь работает то как надо
если есть утечка памяти, то при многократном вызове этой функции программа будет занимать всё больше и больше памяти
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
06.11.2011, 16:48  [ТС]     ошибка в функции подскажите как исправить #43
весомый довод, но пока с ней приторможу работает и ладно щас хотя бы на отработку наладить по функции удаления не можите подсказать в чем косяк?
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.11.2011, 16:48     ошибка в функции подскажите как исправить #44
Цитата Сообщение от lexflax
C++
1
2
3
4
5
        while (prt != NULL){
                if(i==j){
                        return prt; //строка под этим номером
                        break;
                }
это из pind()
а зачем break после return ?
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
06.11.2011, 16:52  [ТС]     ошибка в функции подскажите как исправить #45
Цитата Сообщение от accept Посмотреть сообщение
это из pind()
а зачем break после return ?
не значем , забыл его убрать после передела функции контрольная эта вообще одногрупника моего, правда я сомневаюсь что он сам ее делал, потому что знаю какой он программист сам бы простую программу считывания текста из файла бы не написал не то что таккую контрольную, вот косяки его убираю и пытаюсь понять как че тут сделано, потому что она под мой вариант подходит, вот с фунцией удаления никак не могу справиться
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.11.2011, 16:52     ошибка в функции подскажите как исправить #46
Цитата Сообщение от lexflax
по функции удаления не можите подсказать в чем косяк
1) удаляется не тот элемент
2) нет цикла

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

если это не первый элемент, то надо проматывать в цикле до подходящего элемента (если он есть в списке), а потом сцеплять его соседние элементы и удалять его
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
07.11.2011, 16:09  [ТС]     ошибка в функции подскажите как исправить #47
посмотрите функцию ввода с текстового файла еще раз плиз , по ней хочу кое что спросить ...
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
# 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);//цикл будет повтрятся
}
 
 
}
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
//ввод списка из текстового файла
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;  //  возвращаем указатель на первый элемент списка
while (!inf.eof()){ // цикл пока не будет достигнут конец файла
ВОТ эту часть препод предложила вынести из цикла и поднять вверх типа зачем все время в цикле проверять пуст ли список или нет? типа это нужно проверить только один раз, я вверх убирал но тогда при запуске к основному списку добавлялся один элемент с нулем и он был первый а после него шли другие, как по мне так наоборот должен быть в цикле , или я не прав и просто не правильно вынес? if(on){ //если до этого список был пуст, то
ptr=list; //записываем в него первый элемент
on=false;
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
07.11.2011, 16:43     ошибка в функции подскажите как исправить #48
а если файл пуст, то будет утечка памяти ?
а если случится ошибка чтения файла, то цикл зациклится навсегда ?
что значит inf.ignore(); ?

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
sp *func()
{
    ifstream in;
    string fname;
    sp *list, *tail;
    sp tmp;
    
    cin >> fname;
    in.open(fname.c_str());
    // проверить, открылся ли
 
    list = NULL;
    while (inf >> tmp.elfile.name
        && inf >> tmp.elfile.data
        && inf >> tmp.elfile.upd) {
        tmp->next = NULL;
    
        if (list == NULL) {
            list = new sp;
            *list = tmp;
            tail = list;
        } else {
            tail->next = new sp;
            *tail->next = tmp;
            tail = tail->next;
        }
    }
    in.close();
    return list;
}
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
07.11.2011, 17:14  [ТС]     ошибка в функции подскажите как исправить #49
Цитата Сообщение от accept Посмотреть сообщение
inf.ignore();
ну я так понимаю игнорировать последующие символы

Добавлено через 1 минуту
Цитата Сообщение от accept Посмотреть сообщение
c_str()
для чего применяется эта функция?
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
07.11.2011, 17:14     ошибка в функции подскажите как исправить #50
там же нет getline(), разделители будут пропускаться при следующем вводе

Цитата Сообщение от lexflax
для чего применяется эта функция?
метод открытия файла принимает символьный массив
поэтому string с помощью своего метода выдаёт указатель на символьный массив
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
09.11.2011, 16:45  [ТС]     ошибка в функции подскажите как исправить #51
вот две функции исправил вставки после адреса, и удаление с адресом , посмотрите все норм в них? работают отлично

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
//удаление элемента с адресом adr
sp* del(sp *list,sp *adr){
sp *pt=list;
if(pt==adr){// если номер совпал то...
pt=pt->next; //Теперь papa указывает на второй элемент списка
delete(adr); //тут удаляется тот адрес элемента который совпал со списком
return pt;}
//
 
while(pt->next != NULL) {
        if( pt->next == adr ) {
            pt->next = pt->next->next;
            delete(adr);
            return list;
        }
 
        pt = pt->next;
    }  return list;
 
}
 
//вставка нового элемента после элемента с адресом 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->next==list){
 
        pt=q->next;
 
    }else{
        q->next= adr->next;
        adr->next=q;
    }
    return pt;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2011, 17:50     ошибка в функции подскажите как исправить
Еще ссылки по теме:

C++ подскажите как исправить ошибки
Подскажите как исправить функцию C++
Подскажите как исправить ошибку C++
C++ Подскажите, как исправить ошибку
C++ Подскажите как исправить код

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

Или воспользуйтесь поиском по форуму:
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
09.11.2011, 17:50     ошибка в функции подскажите как исправить #52
vst() содержит утечку

C++
1
    pt=q->next;
что это ? в q->next ничего нужного никогда нет
и утечка здесь
Yandex
Объявления
09.11.2011, 17:50     ошибка в функции подскажите как исправить
Ответ Создать тему
Опции темы

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