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

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

Войти
Регистрация
Восстановить пароль
 
cj3687
2 / 2 / 0
Регистрация: 10.10.2013
Сообщений: 43
#1

Сортировка фамилий по алфавиту - C++

29.03.2014, 10:54. Просмотров 887. Ответов 13
Метки нет (Все метки)

В структуре (Рабочие), которая записана в двоичный файл, требуется отсортировать фамилии работников по алфавиту (ну еще найти кол-во молодых и пенсионеров но я это реализовал). Никак не могу придумать сортировку (даже не знаю как: через библиотеку string.h или еще каким-нибудь способом). Вот код:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>
#include <locale.h>
#include <windows.h>
#define LENGTH 1024
 
using namespace std;
 
struct Rec1
{
   int nomer;
   char name[30];   
   char work[30];
   int year;
   int exper;
   float price;
};
 
int CreateFile (char *fileName)
{
    FILE *f;
    struct Rec1 workers;
    if ((f=fopen(fileName,"wb"))==NULL)
      return 1;
    workers.nomer=0;  
    printf("Фамилия, инициалы:");
    scanf("%s",workers.name);
    printf("Должность:");
    scanf("%s",workers.work);
    while (strcmp(workers.name,"000"))
    {
        workers.nomer++;
        printf("Год рождения:");
        scanf("%d",&workers.year);
        printf("Стаж:");
        scanf("%d",&workers.exper);
        printf("Заработная плата:");
        scanf("%f",&workers.price);
        fwrite(&workers,sizeof(workers),1,f);
        printf("Фамилия, инициалы:");
        scanf("%s",workers.name);
        printf("Должность:");
        scanf("%s",workers.work);
    }  
    fclose(f);
    return 0;
}
 
int ReadFile (char *fileName)
{
    FILE *f;
    int i,n;
    struct Rec1 workers;
    if ((f=fopen(fileName,"rb"))==NULL)
      return 1;
    n=workers.nomer;
    printf("  №");
    printf("      Ф.И.О.    ");
    printf("  Год рождения   ");
    printf("  Должность    ");
    printf("  Стаж  ");
    printf("  Зар. плата  ");
    printf("\n");
      while (fread(&workers,sizeof(workers),1,f))
      {
       
        printf ("%3d",workers.nomer);
        printf ("%15s",workers.name);
        printf ("%12d",workers.year);
        printf("%15s",workers.work);
        printf ("%12d",workers.exper);
        printf ("%12.2f\n",workers.price);
        
     }
      
   fclose(f);
   return 0;
}
long Size (char *fileName1)
{
    FILE *f1;
    long n;
    if ((f1=fopen(fileName1,"rb"))==NULL)
     return -1;
    fseek (f1,0,SEEK_END);
    n=ftell(f1);
    fclose(f1);
    return n; 
}
int AddFileIn (char *fileName)
{
    FILE *f;
    struct Rec1 workers;
    int n;
    if ((f=fopen(fileName,"ab"))==NULL)
      return 1;
     n=Size(fileName)/sizeof(struct Rec1); 
    workers.nomer=n;    
    printf("Фамилия, инициалы:");
    scanf("%s",workers.name);
    printf("Должность:");
    scanf("%s",workers.work);
    while (strcmp(workers.name,"000"))
    {
        workers.nomer++;
        printf("Год рождения:");
        scanf("%d",&workers.year);
        printf("Стаж:");
        scanf("%d",&workers.exper);
        printf("Заработная плата:");
        scanf("%f",&workers.price);
        fwrite(&workers,sizeof(workers),1,f);
        printf("Фамилия, инициалы:");
        scanf("%s",workers.name);
        printf("Должность:");
        scanf("%s",workers.work);
    }  
    fclose(f);
    return 0;
 
}
int Old_New(char *fileName)
{
    FILE *f;
    struct Rec1 workers; 
    int old=0,noobs=0;
    if ((f=fopen(fileName,"rb"))==NULL)
     return 1;
   while(fread(&workers,sizeof(workers),1,f))
    {
        if ((2014 - workers.year)>60)
         old++;
        else if ((2014 - workers.year)<25)
        noobs++;
    }
    cout<<"Number of retirees: "<<old<<"\nNumber of young workers: "<<noobs<<endl;
}
/*
int Sorting (char *fileName)
{
    FILE *f;
    struct Rec1 workers;
    struct Rec1 *a; 
    int n,i,j;
    if ((f=fopen(fileName,"rb"))==NULL)
      {
        fclose(f);
        return 1;
     }
    n=Size(fileName)/sizeof(struct Rec1);
    a=(struct Rec1 *)malloc(n*sizeof(struct Rec1));
    string tmp="";
    for(int i=0;i<n;i++)
       for(int j=i;j<n;j++)
       if(a[i].name>a[j].name) 
        {
         tmp=a[i].name; 
         a[i].name=a[j].name;
         a[j].name=tmp;
       }
}*/
int CreateFileOut(char *fileName)
{
    FILE *f;
 
    struct Rec1 workers;
    struct Rec1 *a;
    int n,i,j;
    if ((f=fopen(fileName,"rb"))==NULL)
      {
        fclose(f);
        return 1;
     }
    n=Size(fileName)/sizeof(struct Rec1);
    a=(struct Rec1 *)malloc(n*sizeof(struct Rec1));
    struct Rec1 swap;
    for(i = 0; i < n; i++){
    for(j = i + 1; j < n; j++)
    if (strcmp (a[i].name, a[j].name) > 0)
    {
        swap = a[i].name;
        a[i].name = a[j].name;
        a[j].name = swap;
    }
    }
    fwrite(a,sizeof(struct Rec1),n,f);
    cout<<"123\n";
    fclose(f);
    return 0;
    
    
}
 
/////////////////////////////////////////
int main()
{
    char *fileName="e:\\Inf\\a.data";
    char *fileName1="e:\\Inf\\a.data";
    char *fileName2="e:\\Inf\\b.data";
    setlocale(LC_CTYPE,"Russian");
    int z,i;
    printf("Меню:\n");
    printf("1. Create file\n2. Open file\n3. Add information\n4. Number of retirees and young workers; Sorting.");
    printf("\n");
    printf("\nВведите пункт меню:\n\n");
    scanf("%d",&z);
    switch(z)
      {
        case 1:system("cls"); CreateFile(fileName); break;
   
        case 2: system("cls");printf("\n");ReadFile(fileName); break;
 
        case 3:system("cls"); AddFileIn(fileName); break;
        
        case 4:system("cls"); Old_New(fileName); CreateFileOut(fileName); break;
        
      }
    
 
    getch();
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2014, 10:54     Сортировка фамилий по алфавиту
Посмотрите здесь:

C++ Из списка фамилий упорядочить их по алфавиту
C++ сортировка фамилий
C++ Сортировка фамилий по алфавиту
задача стоит так : Список фамилий вводится через запятую в виде строки. Упорядочить фамилии по алфавиту C++
C++ Задача со строками (ввод списка фамилий через запятую в виде строки. Фамилии должны быть отсортированы по-алфавиту)
C++ ввести список из 10 фамилий, расположенных в произвольном порядке и упорядочить их по алфавиту
C++ сортировка фамилий по алфавитом
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
niznay
1 / 1 / 0
Регистрация: 12.09.2013
Сообщений: 22
29.03.2014, 12:26     Сортировка фамилий по алфавиту #2
сравнивай по первой букве
пример if(Rec1[0].name[0]>Rec1[1].name[0]) swap(Rec1[0],Rec1[1]);где swap -замена местами всех полей(имя,номер,работа ...)
cj3687
2 / 2 / 0
Регистрация: 10.10.2013
Сообщений: 43
29.03.2014, 17:39  [ТС]     Сортировка фамилий по алфавиту #3
niznay, Что-то никак (
Я правильно понял?:
Кликните здесь для просмотра всего текста
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
int Sorting(char *fileName)
{
    FILE *f;
 
    struct Rec1 workers;
    struct Rec1 *Rec1;
    int n,i,j;
    if ((f=fopen(fileName,"rb"))==NULL)
      {
        fclose(f);
        return 1;
     }
    n=Size(fileName)/sizeof(struct Rec1);
    Rec1=(struct Rec1 *)malloc(n*sizeof(struct Rec1));
    for(i = 0; i < n; i++){
    for(j = i + 1; j < n; j++)
    if(Rec1[i].name[i]>Rec1[j].name[i]) 
    {
        swap(Rec1[i],Rec1[j]);
    }
    }
    fwrite(Rec1,sizeof(struct Rec1),n,f);
    cout<<"123\n";
    fclose(f);
    return 0;
    
    
}
IrineK
Заблокирован
29.03.2014, 19:19     Сортировка фамилий по алфавиту #4
strcmp вам в помощь.
cj3687
2 / 2 / 0
Регистрация: 10.10.2013
Сообщений: 43
29.03.2014, 20:20  [ТС]     Сортировка фамилий по алфавиту #5
IrineK, Так?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
if(strcmp (Rec1[i].name , Rec1[j].name)>0) 
    {
        swap(Rec1[i],Rec1[j]);
    }
IrineK
Заблокирован
29.03.2014, 21:01     Сортировка фамилий по алфавиту #6
Да, похоже.
Вот посмотрите на этот пример, где сортировка ведется по строкам: Сортировка базы данных
Надеюсь, поможет.
cj3687
2 / 2 / 0
Регистрация: 10.10.2013
Сообщений: 43
29.03.2014, 22:16  [ТС]     Сортировка фамилий по алфавиту #7
IrineK, Увы, но нет( Может быть запись не происходит (хотя должна вроде). Даже не знаю...
Кликните здесь для просмотра всего текста
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
int Sorting(char *fileName)
{
    FILE *f;
 
    struct Rec1 workers;
    struct Rec1 *a;
    int n,i,j;
    if ((f=fopen(fileName,"rb"))==NULL)
      {
        fclose(f);
        return 1;
     }
    n=Size(fileName)/sizeof(struct Rec1);
    a=(struct Rec1 *)malloc(n*sizeof(struct Rec1));
    for(i = 0; i < n-1; i++){
        for(j = i + 1; j < n; j++)
           if(strcmp (a[i].name , a[j].name) > 0) 
            {
               swap(a[i],a[j]);
               
            }
            
       }
    fwrite(a,sizeof(struct Rec1),n,f);
    cout<<"123\n";
    fclose(f);
    return 0;
    
    
}
IrineK
Заблокирован
29.03.2014, 23:39     Сортировка фамилий по алфавиту #8
А в каком месте вы считываете инфу из файла?
cj3687
2 / 2 / 0
Регистрация: 10.10.2013
Сообщений: 43
30.03.2014, 00:07  [ТС]     Сортировка фамилий по алфавиту #9
IrineK, Вот:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
if ((f=fopen(fileName,"rb"))==NULL)
      {
        fclose(f);
        return 1;
     }

Но я видимо забыл открыть его для записи. И нужно так
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
if ((f=fopen(fileName,"r+b"))==NULL)
      {
        fclose(f);
        return 1;
     }

Но почему-то он записывает что-то непонятное
Миниатюры
Сортировка фамилий по алфавиту  
IrineK
Заблокирован
30.03.2014, 01:01     Сортировка фамилий по алфавиту #10
Этими инструкциями вы только открыли файл для чтения и проверили, получилось ли.
Но пока вы еще ничего не считали.

fread вам в помощь.

Добавлено через 48 минут
1) с помощью fread в цикле считайте данные в массив а
2) проведите сортировку
3) вряд ли вам нужно записать отсортированную инфу после предыдущей. Скорее всего, нужно сделать rewind
4) опять в цикле запишите данные из массива в файл
cj3687
2 / 2 / 0
Регистрация: 10.10.2013
Сообщений: 43
30.03.2014, 01:17  [ТС]     Сортировка фамилий по алфавиту #11
IrineK, Так?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if(a == NULL || fread(a,sizeof(struct Rec1),n,f) != n)
    {
        fclose(f);
        return 2;
    }
    for(i = 0; i < n-1; i++){
        for(j = i + 1; j < n; j++)
         while( fread(a,sizeof(workers),1,f))
           if(strcmp (a[i].name , a[j].name) > 0) 
            {
               swap(a[i],a[j]);
               
            }
            
       }
       rewind(f);
    fwrite(a,sizeof(struct Rec1),n,f);


Добавлено через 11 минут
Цитата Сообщение от cj3687 Посмотреть сообщение
IrineK, Так?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if(a == NULL || fread(a,sizeof(struct Rec1),n,f) != n)
    {
        fclose(f);
        return 2;
    }
    for(i = 0; i < n-1; i++){
        for(j = i + 1; j < n; j++)
         while( fread(a,sizeof(workers),1,f))
           if(strcmp (a[i].name , a[j].name) > 0) 
            {
               swap(a[i],a[j]);
               
            }
            
       }
       rewind(f);
    fwrite(a,sizeof(struct Rec1),n,f);
Хотя я и не очень уверен на счет
C++
1
while( fread(a,sizeof(workers),1,f))
IrineK
Заблокирован
30.03.2014, 01:28     Сортировка фамилий по алфавиту #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
int CreateFileOut(char *fileName)
{
    FILE *f;
 
    struct Rec1 *a;
    int n,i,j;
    if ((f=fopen(fileName,"rb+"))==NULL)
      {
        fclose(f);
        return 1;
     }
    n=Size(fileName)/sizeof(struct Rec1);
    a=(struct Rec1 *)malloc(n*sizeof(struct Rec1));
   
    for(i = 0; i < n; i++)
        fread (&a[i],sizeof(struct Rec1),1,f);
 
    for(i = 0; i < n; i++){
        for(j = i + 1; j < n; j++)
            if (strcmp (a[i].name, a[j].name) > 0)
                swap (a[i], a[j]);
    rewind (f);
    
    fwrite(a,sizeof(struct Rec1),n,f);
    cout<<"123\n";
    fclose(f);
    return 0;
    
    
}
cj3687
2 / 2 / 0
Регистрация: 10.10.2013
Сообщений: 43
30.03.2014, 01:34  [ТС]     Сортировка фамилий по алфавиту #13
IrineK, Спасибо огромное!! Все работает!))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2014, 01:38     Сортировка фамилий по алфавиту
Еще ссылки по теме:

C++ Строки. [Ввести список фамилий,упорядочить по алфавиту]
Сортировка фамилий по алфавиту в файле C++
C++ Сортировка массива структур в алфавитном порядке фамилий
C++ Сортировка массива фамилий
Сортировка по алфавиту C++

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

Или воспользуйтесь поиском по форуму:
IrineK
Заблокирован
30.03.2014, 01:38     Сортировка фамилий по алфавиту #14
C++
1
2
for(i = 0; i < n; i++)
        fread (&a[i],sizeof(struct Rec1),1,f);
Можно поменять на
C++
1
2
i = -1;
while (fread (&a[++i],sizeof(struct Rec1),1,f));
Добавлено через 1 минуту
Цитата Сообщение от cj3687 Посмотреть сообщение
Все работает!))
Я рада )
Yandex
Объявления
30.03.2014, 01:38     Сортировка фамилий по алфавиту
Ответ Создать тему
Опции темы

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