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

вопрос в самом низу посмотрите интересно понять - C++

Восстановить пароль Регистрация
 
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
01.11.2011, 15:27     вопрос в самом низу посмотрите интересно понять #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
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
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
# 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* fb_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("  0: формирование списка из текстового файла")<<endl;
      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("  10: выход")<<endl;
      cout<<Rus("вариант ")<<endl;
      cin>>v;
      switch(v){
        case 0: k = ft_enter(); break;/*вызов функции ввод тектового файла в переменную к, чтоб по ней потом можно было делать сортировку, поиск и тд*/
        case 1: k = fb_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* fb_enter(){
    sp* list =new sp; //создаем указатель на голову списка
    sp *ptr,*q;//два указателя на sp.
    int ok=1;//Переменная ok со значением 1.
    char name[15];// символьный тип которое будет именем файла и его типом не больше 15знаков
    cout<<Rus("введи имя входн тип.файла")<<endl;
    cin>>name;// ввод имени и типа
    ifstream intf(name, ios::binary); //режим бинарного открытия файла
    ptr=list; //теперь ptr указывает туда же куда и list
    while (!intf.eof()){  // // цикл пока не будет достигнут конец файла
        intf.read(reinterpret_cast<char *>(&ptr->elfile),sizeof(lfile)); /*читаем из бинарного файла байты кол-вом размер структуры lfile в переменную. reinterpret_cast<T> - небезопасное преобразование. В данном случае т.к. read принимает указатель на char* преобразовываем указатель на lfile в указатель на char и читаем в него. */
            if(ptr->elfile.upd != NULL){  // если не ноль
                q=ptr;//q теперь указывает туда же куда и ptr.
                ptr->next=new sp;//ptr теперь указывает на тот элемент который был выделен строкой выше
                ptr=ptr->next;// ptr теперь указывает на тот элемент который был выделен строкой выше
            }
    }
    ptr->next=NULL;//обнуляем следующий элемент за q.
    intf.close();//закрытие файла
    return list; // возвращаем указатель на первый элемент списка
}
 
 
//ввод списка с экрана
sp* fs_enter(){
    sp* list =new sp; //выделяем память под список
    sp *ptr; //указатель на элемент списка
    char name; // символьный тип которое будет именем файла и его типом
    cout<< Rus("Введиде имя, дату создания, кольчество обращений к файлу")<<endl;
    ptr=list; //теперь ptr указывает на список
    while (true){
        cin>>ptr->elfile.name;
        cin>>ptr->elfile.data;
        cin>>ptr->elfile.upd;
        cout<<Rus("ещё (y/n)")<<endl;
        cin>>name;
        if(name=='n') break;
        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;//следующий
        if(prt == NULL) break;
    } while (true);
}
 
//сортировка списка как параметр берёт указатель на список.
sp* sort(sp *list){
    sp *pt=list, *ptr, *pred=list, *q;
    int ok,ok1;
    do{
        ok=0, ok1=1; ptr=list;
        while (ptr->next){
            if(ptr->elfile.upd > ptr->next->elfile.upd){
                if(ok1) { // первый элемент
                    ok1=0;
                    q=pt;
                    pt=pt->next;
                    q->next=pt->next;
                    pt->next=q;
                    ptr=pt;
                    ok=1;
                }
                else {
                    q=pred->next;
                    pred->next=pred->next->next;
                    q->next=pred->next->next;
                    pred->next->next=q;
                    ptr=pt->next;
                    ok=1;
                }
            }
                pred=ptr;
                ptr=ptr->next;
        }
    } while(ok);
    return pt;
}
 
//поиск файла по имени и вывод его в текстовый файл
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 (true){
        if(strstr(prt->elfile.name,f)){ // сравнивает имя файла введенное с теми что в списке, если совпадает то выводит о нем всю информацию в другой файл
          inf<<prt->elfile.name<<"  ";
          inf<<prt->elfile.data<<"  ";
          inf<<prt->elfile.upd<<endl;
        }
        prt=prt->next;//переход на другую строку
        if(prt == NULL) break;
    }
}
 
//Файл с наиольшим кольчеством обращений
void fsearch(sp *list){
     sp *prt = list;
     int p=-1;
     sp *r;
     while (true){
        if(prt->elfile.upd > p){//если первое обращение больше другого
            p = prt->elfile.upd; // присвоить его значение в р
            r = prt; //запомнить максимум
        }
        prt=prt->next;
        if(prt == NULL) break;
     }
     cout<<Rus("Файл с наиольшим кольчеством обращений")<<endl;
     cout<<r->elfile.name<<" ";
     cout<<r->elfile.data<<" ";
     cout<<r->elfile.upd<<endl;
}
 
//получить адрес
sp* pind(sp *list){
    sp *prt = list;
    int i=1,j=0;
    cout<<Rus("Введите номер")<<endl;
    cin>>j; //номер строки
    while (true){
        if(i==j){
            return prt; //строка под этим номером
            break;
        }
        prt=prt->next;
        if(prt == NULL) break;
        i++;
    }
}
 
//удаление элемента с адресом adr
sp* del(sp *list,sp *adr){
    sp *pt=list, *q;
    if(adr==list){// если номер совпал то...
        pt=adr->next;//  перейти на другую строку
        q=adr;// запомнить ее
    }else{
        q = adr->next;
        adr->next = adr->next->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;
        q->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 (true){
        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;
        if(prt == NULL) break;
        i++;
    }
}
ВОТ ФУНКЦИЯ нахождения адреса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//получить адрес
sp* pind(sp *list){
    sp *prt = list;
    int i=1,j=0;
    cout<<Rus("Введите номер")<<endl;
    cin>>j; //номер строки
    while (true){
        if(i==j){
            return prt; //строка под этим номером
            break;
        }
        prt=prt->next;
        if(prt == NULL) break;
        i++;
    }
}
вот функция удаления файла после введеного номера допустим ввели 2 то удаляет 3 строку
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->next = adr->next->next;
    }
    delete(q); //удаляет строку после указанного номера
    return pt;
}
В этой функции используется указатель adr я вот только не понимаю как мы его можем сравнивать с list если adr встречается впервые и в нем нету никакой величены, помогите понять эту суть...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2011, 15:27     вопрос в самом низу посмотрите интересно понять
Посмотрите здесь:

В чем интересно загвоздка???интересно разобраться! C++
C++ Философский вопрос: Как понять, что ты знаешь язык?
C++ интересно
ну очень интересно C++
Вопрос не по теме мне кажется но не могу понять помогите C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.11.2011, 15:45     вопрос в самом низу посмотрите интересно понять #2
Цитата Сообщение от lexflax Посмотреть сообщение
adr встречается впервые и в нем нету никакой величены
В строке 64 ему присваивается "какая-то величина".
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
01.11.2011, 15:47  [ТС]     вопрос в самом низу посмотрите интересно понять #3
но я не вижу чтоб там было adr и так же в вызове функции pind в ее описание тоже адр нету
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.11.2011, 16:03     вопрос в самом низу посмотрите интересно понять #4
Цитата Сообщение от lexflax Посмотреть сообщение
и так же в вызове функции pind в ее описание тоже адр нету
Сурьёзно?
А где связь между pind и adr, который в del?
Срочно читай про функции, формальные и фактические параметры.
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
01.11.2011, 16:06  [ТС]     вопрос в самом низу посмотрите интересно понять #5
да я читал и не раз, только все равно путаюсь, так объяснить нельзя? вы явно хорошо связь всю эту цепочку видите, не поможите как нибудь все равно сам до этого дойду у меня без вариантов так сказать, но время тикает мало осталось
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.11.2011, 16:16     вопрос в самом низу посмотрите интересно понять #6
Разберёшься с этим примером, сможешь и со своим разобраться.

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
#include <iostream>
 
int func1( int a )
{
     a = a * 2;
     return a;
}
 
int func2( int a )
{
     a = a + 10;
     return a;
}
 
int main()
{
    int a = 5;
 
    int b = func1( 10 );
    int c = func2( 20 );
 
    std::cout << a << "  " << b << "  " << c << std::endl;
    return 0;
 
}
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
01.11.2011, 16:29  [ТС]     вопрос в самом низу посмотрите интересно понять #7
Цитата Сообщение от Deviaphan Посмотреть сообщение
int main()
{
* * int a = 5;
int b = func1( 10 );
* * int c = func2( 20 );
std::cout << a << " *" << b << " *" << c << std::endl;
* * return 0;
}
C++
1
2
3
4
5
int a = 5;
int b = func1( 10 );// а почему в скобках 10? не а должно быть?
* * int c = func2( 20 ); а тут почему 20 ? а не 15? ведь там объявленно а=а+10
std::cout << a << " *" << b << " *" << c << std::endl;
* * return 0;
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.11.2011, 16:32     вопрос в самом низу посмотрите интересно понять #8
Цитата Сообщение от lexflax Посмотреть сообщение
а почему в скобках 10? не а должно быть?
Цитата Сообщение от lexflax Посмотреть сообщение
а тут почему 20 ? а не 15? ведь там объявленно а=а+10
А я знал, что ты именно это спросишь.) Потому такой код и написал. Разбирайся. В отладчике запусти. Разбирайся.)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.11.2011, 16:33     вопрос в самом низу посмотрите интересно понять #9
lexflax, Вот. Вот и разбирайся.

Связи в названиях между формальными параметрами и фактическими нету никакой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.11.2011, 17:03     вопрос в самом низу посмотрите интересно понять
Еще ссылки по теме:

Стек на основе массива структур - эт как понять читаю литературу и не могу понять! C++
Почему в координата Y на мониторе вверху, а в математике она была в низу C++
C++ Посмотрите пожалуйста, не могу понять. Программа по исследованию областей!

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

Или воспользуйтесь поиском по форуму:
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
01.11.2011, 17:03  [ТС]     вопрос в самом низу посмотрите интересно понять #10
Цитата Сообщение от Deviaphan Посмотреть сообщение
int b = func1( 10 );
* * int c = func2( 20 );
std::cout << a << " *" << b << " *" << c << std::endl;
* * return 0;
C++
1
2
3
4
int b = func1( 10 ); то есть это значение а которое вверху было объявленно, тоесть b на выходе будет 20, а с на выходе будет 30 так?
* * int c = func2( 20 );
std::cout << a << " *" << b << " *" << c << std::endl;
* * return 0;
Добавлено через 25 минут
по своему примеру все равно понять не могу
C++
1
2
3
4
5
6
7
8
9
10
11
 case 0: k = ft_enter(); break;/*вызов функции ввод тектового файла в переменную к, чтоб по ней потом можно было делать сортировку, поиск и тд*/
                case 1: k = fb_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;
ну k понятно в ей присваивается список который сначала или из текстового файла вводится или из типизированного или с экрана это первые три вызова, потом по ней же сортировка делается, ну в case 7 все равно не пойму, вызов функции del( в ней само это k, и вызов функции нахождения адреса по к) но возвращает там ptr тоесть ту строку которая совпала с веденной, вот я наверно сам и ответил на свой вопрос) ))))))
Yandex
Объявления
01.11.2011, 17:03     вопрос в самом низу посмотрите интересно понять
Ответ Создать тему
Опции темы

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