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

задачка на сортировку - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Taiger
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 41
06.06.2012, 12:24     задачка на сортировку #1
есть файл input.txt.

\фио \возраст \табелный
иванов 30 30
петров 20 45
сидоров 20 10
перепупкин 25 15
нужно чтобы
отсортировтаь список работающих по убыванию возраста, для одинакового возраста отсортировать по возрастанию табельного номера.
С приминением процедур и функций
Решение в out.txt
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2012, 12:24     задачка на сортировку
Посмотрите здесь:

C++ сортировку массива
Объясните сортировку C++
C++ Выполнить сортировку
Задачка на сортировку массива C++
Задача на сортировку C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.06.2012, 12:53     задачка на сортировку #2
Раз у тебя два ключа, то и два признака сравнения.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template< class T > void Sort(T* Data, int Count) 
{
 T t;
 T *i;
 T *j;
 T *e;
 for (e=Data+Count-1, i=Data+1; i<=e; ++i)
 {
  for (j = i - 1; (j >= Data) && ((j->age>i->age)||((j->age==i->age)&&(j->number<i->number));--j)
  {
   *(j+1)=*j;
  }
  t=*i;
  *i=*j;
  *j=t;
 }
}
Добавлено через 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
template< class T > void Sort(T* Data, int Count)
{
 T t;
 T *i;
 T *j;
 T *m;
 for (i=Data+Count-1; i>Data; --i)
 {
   for (m=i, j=i-1; j>=Data; --j)
   {
     if ((m->age<j->age)||((m->age<j->age)&&(m->number>j->number)))
     {
       m=j;
     }
   }
   if (m!=i)
   {
    t=*i;
    *i=*m;
    *m=t;
   }
 }
}
Taiger
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 41
06.06.2012, 13:16  [ТС]     задачка на сортировку #3
Спасибо. Простите мне моб нескромность. А можно весь текст прграммы, желательно с комментами. Еще раз извинения и спасибо.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.06.2012, 13:45     задачка на сортировку #4
Тогда опиши фактический формат и желаемый интерфейс.

Добавлено через 1 минуту
Если переврал направление сортировки, то попробуй менять > на < и наоборот. Но не -> на -<, >-, или <-.
Taiger
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 41
06.06.2012, 13:48  [ТС]     задачка на сортировку #5
Задание: (с обязательным применением функций). Исходные данные или результат или и то и другое должно размещаться в текстовом файле.

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

пример подобного
Из файла, где хранятся данные о студентах (фамилия, имя, отчество, группа, номер студенческого билета, оценки за семестр) вывести на экран номера студенческих билетов и их владельцев, имеющих средний балл за семестр не ниже 4,5.

Ход работы:
Листинг программы:
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
#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <iomanip>
 
using namespace std;
 
struct studData {
    int por_numb;
    char lastname[15];
    char name [15];
    char middlename [15];
    char group[5];
    int stud_numb;
    int oc[10];
};
 
    fstream outStud,st;
    studData stud;
    double sr;
    double sr1=4.5,kol=10.0,sum=0;
 
void load_file (void);
void vivod_file (void);
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    outStud.open ("D:\\stud1.txt",ios::in);
    
    vivod_file();
    outStud.close();
    outStud.open ("D:\\stud1.txt",ios::in);
    st.open ("D:\\stud2.txt",ios::out);
 
    load_file();
 
    st.close();
    outStud.close();
    getchar ();
    return 0;
}
 
void load_file (void)
{
 
    cout << endl << "Result: " <<endl <<endl;
    for (;;)
    {
        outStud >> setiosflags (ios::left) >>setw(3) >> stud.por_numb;
 
        if (outStud.eof()) break;
 
        outStud >>setiosflags (ios::left) >>setw (15) >> stud.lastname >> setw (15) >> stud.name
        >> setw (15) >> stud.middlename >> setw (5) >> stud.group >>setw (5) >> stud.stud_numb;
 
        for (int i=1; i<=10; i++)
        {
        outStud >> setiosflags (ios::left) >> setw(2) >> stud.oc[i];
        sum=sum+stud.oc[i];
        }
 
        sr=sum/kol;
        if (sr>=sr1)
        {
            st<<setiosflags (ios::left) <<setw(3) <<stud.por_numb <<setw (15) << stud.lastname <<setw (15) << stud.name
            <<setw (15) << stud.middlename <<setw (5) << stud.group <<setw (5) << stud.stud_numb;
 
            for (int i=1; i<=10; i++)
            {
            st <<setiosflags (ios::left) << setw(2) << stud.oc[i];
            }
 
            st << endl;
 
            cout << setiosflags (ios::left) <<setw(3) <<stud.por_numb <<setw (10) << stud.lastname <<setw (8) << stud.name
            <<setw (12) << stud.middlename <<setw (5) << stud.group <<setw (5) << stud.stud_numb;
 
            for (int i=1; i<=10; i++)
            {
            cout << setiosflags (ios::left) << setw(2) << stud.oc[i];
            }
            cout <<" sredniy bal= " <<sr<<endl;
        }
                cout <<endl; sum=0; sr=0;
    }
}
 
void vivod_file (void)
{
        cout << "Nachalniy file:" <<endl;
    for (;;)
    {
        outStud >> setiosflags (ios::left) >>setw(3) >> stud.por_numb;
        if (outStud.eof()) break;
        outStud >>setiosflags (ios::left) >>setw (15) >> stud.lastname >> setw (15) >> stud.name
        >> setw (15) >> stud.middlename >> setw (5) >> stud.group >>setw (5) >> stud.stud_numb;
        
        cout << setiosflags (ios::left) <<setw(3) <<stud.por_numb <<setw (10) << stud.lastname <<setw (8) << stud.name
        <<setw (12) << stud.middlename <<setw (5) << stud.group <<setw (5) << stud.stud_numb;
        
        for (int i=1; i<=10; i++)
        {
        outStud >> setiosflags (ios::left) >> setw(2) >> stud.oc[i];
        cout << setiosflags (ios::left) <<setw (2) <<stud.oc[i];
        }
        cout <<endl;
    }
}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.06.2012, 13:54     задачка на сортировку #6
Таблица, разделённая пробелами, таблица, разделённая табуляциями, таблица, разделённая запятыми, таблица, разделённая точками с запятой и таблица, форматированная псевдографикой - это всё txt.

Добавлено через 1 минуту
Дай пример самого файла вложением, раз описать не можешь.

Добавлено через 3 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
if ((m->age<j->age)||((m->age<j->age)&&(m->number>j->number)))
C++
1
if ((m->age<j->age)||((m->age==j->age)&&(m->number>j->number)))
Taiger
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 41
06.06.2012, 13:59  [ТС]     задачка на сортировку #7
файл абсолбтно произволный. создается руками как угодно.
а потмо согласно заданию
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.06.2012, 14:45     задачка на сортировку #8
Вот пример близкой постановки: дан файл input.txt, с таблицей, разделённой табуляцией, с переводом строки символами \n\r и полями: ФИО, возраст, табельный номер. Требуется отсортировать данные о сотрудниках из этого файла и в том же формате вывести в файл output.txt. Имена обоих файлов вводятся с клавиатуры, все данные файла полностью помещаются в оперативной памяти, сортировать требуется по убыванию возраста, а при его совпадении по возрастанию табельного номера, интерфейс консольный. Решение:
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
#include <iostream.h>
#include <fstream.h>
#include <string.h>
 
struct TPerson
{
 string FIO;
 unsigend int age;
 unsigend int namber;
};
 
struct TPersonsList;
{
 TPerson Data;
 TPerson *next;
};
 
TPersonsList *list=nullptr;
 
bool FormatAnalize(string s, int *Positions)
{
 if (s=="ФИО\tвозраст\tтабельный номер")
 {
  Positions[0]=0;
  Positions[1]=1;
  Positions[2]=2;
  return true;
 }
 if (s=="ФИО\tтабельный номер"\tвозраст)
 {
  Positions[0]=0;
  Positions[1]=2;
  Positions[2]=1;
  return true;
 }
 if (s=="возраст\tФИО\tтабельный номер")
 {
  Positions[0]=1;
  Positions[1]=0;
  Positions[2]=2;
  return true;
 }
 if (s=="возраст\tтабельный номер"\tФИО)
 {
  Positions[0]=2;
  Positions[1]=0;
  Positions[2]=1;
  return true;
 }
 if (s=="табельный номер\tФИО\tвозраст")
 {
  Positions[0]=1;
  Positions[1]=2;
  Positions[2]=0;
  return true;
 }
 if (s=="табельный номер\tвозраст\tФИО")
 {
  Positions[0]=2;
  Positions[1]=1;
  Positions[2]=0;
  return true;
 }
 return false;
}
 
void GetSubs(sting s, string *subs)
{
 unsigend int ic, isub, L;
 char c;
 subs[0]="";
 subs[1]="";
 subs[2]="";
 for (L=s.length(), ic=1, isub=0; ic<=L; ++ic)
 {
  c=s[ic];
  if (c=='\t')
  {
   ++isub;
  }
  else
  {
   subs[isub]=subs[isub]+c;
  }
 } 
}
 
unsigend int MyIntToStr(sritn s)
{
 unsigend int r, i, L;
 char c;
 r=0;
 for (i=1, L=s.length(); i<=L; ++i)
 {
  c=s[i];
  r*=10;
  switch (c)
  {
   case '1': r+=1;
   case '2': r+=2;
   case '3': r+=3;
   case '4': r+=4;
   case '5': r+=5;
   case '6': r+=6;
   case '7': r+=7;
   case '8': r+=8;
   case '9': r+=9;
  }
 }
 return r;
}
 
void free(TPersonsList *&list)
{
 TPersonsList *b;
 while (list!=nullptr)
 {
  b=list;
  delete list;
  list=b;
 }
}
 
void load(strigng &FileName, TPersonsList *&list)
{
 srting buffer;
 string subs[3];
 ifsteam file;
 int Positions[3];
 list *p;
 file.open(&FileName);
 file>>s;
 if (!FormatAnalize(s, Positions))
 {
  return;
 }
 while (!EOF(file))
 {
  file>>s;
  if (list==nullptr)
  {
   list=new TPersonsList;
   p=list;
  }
  else
  {
   p->next=new TPersonsList;
   p=p->next;
  }
  p->next=nullptr;
  GetSubs(s, subs);
  p->Data.FIO=subs[0];
  p->Data.age=MyIntToStr(subs[1]);
  p->Data.number=MyIntToStr(subs[2]);
 }
 file.close(); 
}
 
void sort(TPersonsList *list)
{
 TPersonsList *i;
 TPersonsList *j;
 TPersonsList *m;
 TPerson t;
 if (list==nullptr)
 {
  return;
 }
 for (i=list; i->next!=nullptr; i=i->next)
 {
  for (j=i->next, m=i; j!=nullptr; j=j->next)
  {
   if ((m->Data->age<j->age)||((m->Data->age==j->age)&&(m->Data->number>j->Data->number)))
   {
    m=j;
   }
  }
  if (m!=i)
  {
   t=*i->Data;
   *i->Data=*m->Data;
   *m->Data=t;
  }
 }
}
 
void save(strigng &FileName, TPersonsList *list)
{
 TPersonsList *p;
 ofsteam file;
 file->open(FileName);
 file<<"ФИО\tвозраст<<таблеьный номер";
 for (p=list; p!=nullptr; p=p->next)
 {
  file<<"\n\r"<<p->Data.FIO<<'\t'<<p->Data.age<<'\t'<<p-.Data.number;
 }
 file.close();
}
 
int main()
{
 string InputFileName, OutputFileName;
 do
 {
  std::cin>>InputFileName;
  std::cin>>OutputFileName;
  if ((InputFileName!="")&&(OutputFileName!=""))
  {
   load (InputFileName, list);
   sort(list);
   save(InputFileName, list);
   free(list);
  }
 } while ((InputFileName!="")&&(OutputFileName!=""));
 return 0;
}
Добавлено через 54 секунды
Цитата Сообщение от Taiger Посмотреть сообщение
файл абсолбтно произволный. создается руками как угодно.
а потмо согласно заданию
разобрать произвольный файл может только человек.
Taiger
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 41
06.06.2012, 14:51  [ТС]     задачка на сортировку #9
иммелось в виду в файле можно отделять пробелом или табудяцией. не имело значения.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.06.2012, 15:00     задачка на сортировку #10
Нет. Или пробелом, или табуляцией. Вариантов слишком много и каждый возможный разделитель может использоваться в качестве обычного символа, что даст неизбежные ошибки разделения. В крайнем случае можно таблицу чисел без заголовочной строки разделять любым не цифровым символом, причём, если в файле есть дроби, то разделитель целой и дробной части тоже считается цифровым символом, если в файле есть знаковые числа, то и знак числа - цифровой символ, если используется нотация плавающей запятой, то и E (или D, или * и ^, или любые другие, задействованные под плавающую запятую) - цифровой символ.

Добавлено через 7 минут
В одном файле один разделитель ячеек, выбирается или через интерфейс программы, или прописывается в задании.
Taiger
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 41
06.06.2012, 15:01  [ТС]     задачка на сортировку #11
мальнько пичитал.
Получается через булевые присваем параметры строк (фио, возраст, таб,)
а вот дальше не совсем
void GetSubs
unsigend int MyIntToStr
void load-процедура чтения?
file.open(&FileName) в скобках поставить имя или путь файла?
void sort-сортировка по условию задачи
void save-процедура сохранения
int main-сама программа выполнения процедур

std::cin>>InputFileName;
std::cin>>OutputFileName;
if ((InputFileName!="")&&(OutputFileName!=""))
в кавычках надо подставить название файлов?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.06.2012, 15:05     задачка на сортировку #12
В крайнем случае, сам файл может описывать свой разделитель каким либо стандартным способом. Например, можно принять соглашение, по которому в начале файла будут строка:
Код
разделитель ячеек - символ '\t'.
, что означает табуляцию, а если надо заменить на запятую, то строка примет вид:
Код
разделитель ячеек - символ ','.
. Если в друг апостроф, то
Код
разделитель ячеек - символ '\''.
.

Добавлено через 41 секунду
Цитата Сообщение от Taiger Посмотреть сообщение
Получается через булевые присваем параметры строк (фио, возраст, таб,)
где ты увидел кого то булевого?
Taiger
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 41
06.06.2012, 15:09  [ТС]     задачка на сортировку #13
bool FormatAnalize(string s, int *Positions)
{
if (s=="ФИО\tвозраст\tтабельный номер")
{
Positions[0]=0;
Positions[1]=1;
Positions[2]=2;
return true;


ШАс попробую закомпилить. может еше вопросы появятся.
и коментарии бы дописать пока вы тут
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.06.2012, 15:11     задачка на сортировку #14
void GetSubs - разбор строки на подстроки, потом одна подстрока присваивается в FIO, а остальные преобразуются в числа и присваиваются своим полям.
unsigend int MyIntToStr - преобразование строки в число.
void load - процедура чтения.
file.open(&FileName) - в скобках и есть имя файла, оно передано параметром.
void sort - сортировка по условию задачи.
void save - процедура сохранения.
int main - функция, содержащая точку входа в программу. Вся программа - это весь файл со всеми функциями.
Цитата Сообщение от taras atavin Посмотреть сообщение
p->Data.FIO=subs[0];
* p->Data.age=MyIntToStr(subs[1]);
* p->Data.number=MyIntToStr(subs[2]);
C++
1
2
3
p->Data.FIO=subs[positions[0]];
* p->Data.age=MyIntToStr(subs[positions[1]]);
* p->Data.number=MyIntToStr(subs[positions[2]]);
Добавлено через 46 секунд
Цитата Сообщение от Taiger Посмотреть сообщение
bool FormatAnalize(string s, int *Positions)
{
if (s=="ФИО\tвозраст\tтабельный номер")
{
Positions[0]=0;
Positions[1]=1;
Positions[2]=2;
return true;
Это одна единственная функция анализа заголовка.
Taiger
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 41
06.06.2012, 15:59  [ТС]     задачка на сортировку #15
Петров 30 25
Иванов 25 24
Сидоров 30 26
Пупкин 24 27
файлик такой должен быть? после ФИО и между цифрами табуляция


Чет не выходит аленькой цветочек

Добавлено через 5 минут
если в дев++ то просто говорит файл не откомпилирован если в борланде то начинает на это ругаться
unsigend int age;

Добавлено через 22 минуты
не собирается ругань в 3 этажа стоит.
началось с этого include <iostream.h>
#include <fstream.h> буквы h понравилось.
потом стал на это
if (s=="ФИО\tвозраст\tтабельный номер")
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.06.2012, 16:08     задачка на сортировку #16
Как в моём вложении. Между ячейками табуляция, в словосочетании "табельный номер" - пробел. Перевод строки виндузячий (двумя символами). Если никсовый (одним символом), то ввод может и справится, а вывод всё равно будет с виндузячим переводом строки.
Вложения
Тип файла: txt input.txt (84 байт, 12 просмотров)
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.06.2012, 16:12     задачка на сортировку #17
Цитата Сообщение от Taiger Посмотреть сообщение
unsigend int age;
ну правильно, очепятка же
C++
1
unsigned int age;
.

Добавлено через 1 минуту
Цитата Сообщение от Taiger Посмотреть сообщение
в кавычках надо подставить название файлов?
нет, они спецаильно пустые.

Добавлено через 1 минуту
Цитата Сообщение от Taiger Посмотреть сообщение
if (s=="ФИО\tвозраст\tтабельный номер")
однако странно. Открой string.h и кидай сюда его декларацию (от class string до закрывающей фигурной скобки и точки с запятой).
Taiger
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 41
06.06.2012, 16:16  [ТС]     задачка на сортировку #18
if ((InputFileName!="")&&(OutputFileName!=""))
в кавычки? вставить импут оутпут?

Ругается на <fstream.h> но сач ин деректори.
Если убрать букву h начинает матерится на if (s=="ФИО\tвозраст\tтабельный номер")
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.06.2012, 16:24     задачка на сортировку #19
Цитата Сообщение от Taiger Посмотреть сообщение
в кавычки? вставить импут оутпут?
Ничего! Это проверка на жим два раза кочерги без ввода.

Добавлено через 52 секунды
Цитата Сообщение от Taiger Посмотреть сообщение
Ругается на <fstream.h> но сач ин деректори.
попробуй убрать и посмотри, что скажет на файловые потоки.

Добавлено через 59 секунд
Цитата Сообщение от Taiger Посмотреть сообщение
if (s=="ФИО\tвозраст\tтабельный номер")
давай декларацию стрингов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2012, 16:46     задачка на сортировку
Еще ссылки по теме:

Задача на сортировку C++
Сортировку вставками меняем на сортировку слиянием C++
Сортировку вставками меняем на Пирамидальную сортировку и на Сортировку подсчётом C++

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

Или воспользуйтесь поиском по форуму:
Taiger
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 41
06.06.2012, 16:46  [ТС]     задачка на сортировку #20
не нашел там побобного
куда фалик выслать? мой скайп n_tager
в вашем скайпе 42 совпадения
Yandex
Объявления
06.06.2012, 16:46     задачка на сортировку
Ответ Создать тему
Опции темы

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