Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
cj3687
2 / 2 / 2
Регистрация: 10.10.2013
Сообщений: 43
#1

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

29.03.2014, 10:54. Просмотров 1388. Ответов 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;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2014, 10:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Сортировка фамилий по алфавиту (C++):

Сортировка фамилий по алфавиту
Ввести список фамилий, которые расположены в произвольном порядке, и...

Сортировка фамилий по алфавиту
В исходном файле input.txt дано несколько фамилий. Нужно отсортировать их по...

Структуры.Сортировка фамилий по алфавиту
Не могу отсортировать по фамилиям.Необходимо использовать функцию bool...

Сортировка фамилий по алфавиту в файле
В файле записаны фамилии и через пробел номера. Необходимо отсортировать этот...

Из списка фамилий упорядочить их по алфавиту
Из списка фамилий упорядочить их по алфавиту проверить написание большой...

Упорядочить список фамилий по алфавиту
Заданный список фамилий. Упорядочить их по алфавиту. Проверить написания первой...

13
niznay
1 / 1 / 3
Регистрация: 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 -замена местами всех полей(имя,номер,работа ...)
1
cj3687
2 / 2 / 2
Регистрация: 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;
    
    
}
0
IrineK
Заблокирован
29.03.2014, 19:19 #4
strcmp вам в помощь.
1
cj3687
2 / 2 / 2
Регистрация: 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]);
    }
0
IrineK
Заблокирован
29.03.2014, 21:01 #6
Да, похоже.
Вот посмотрите на этот пример, где сортировка ведется по строкам: http://www.cyberforum.ru/c-beginners/thread1129410.html#post5952808
Надеюсь, поможет.
1
cj3687
2 / 2 / 2
Регистрация: 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;
    
    
}
0
IrineK
Заблокирован
29.03.2014, 23:39 #8
А в каком месте вы считываете инфу из файла?
0
cj3687
2 / 2 / 2
Регистрация: 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;
     }

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

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

Добавлено через 48 минут
1) с помощью fread в цикле считайте данные в массив а
2) проведите сортировку
3) вряд ли вам нужно записать отсортированную инфу после предыдущей. Скорее всего, нужно сделать rewind
4) опять в цикле запишите данные из массива в файл
1
cj3687
2 / 2 / 2
Регистрация: 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))
0
IrineK
Заблокирован
30.03.2014, 01:28 #12
Лучший ответ Сообщение было отмечено cj3687 как решение

Решение

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;
    
    
}
1
cj3687
2 / 2 / 2
Регистрация: 10.10.2013
Сообщений: 43
30.03.2014, 01:34  [ТС] #13
IrineK, Спасибо огромное!! Все работает!))
0
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 Посмотреть сообщение
Все работает!))
Я рада )
0
30.03.2014, 01:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2014, 01:38
Привет! Вот еще темы с решениями:

Как сделать сортировку фамилий по алфавиту?
Как сделать сортировку фамилий по алфавиту ?

Строки. [Ввести список фамилий,упорядочить по алфавиту]
Задание = реализовать через вызов функции...

ввести список из 10 фамилий, расположенных в произвольном порядке и упорядочить их по алфавиту
Помогите пожалуйста.Вот задание:&quot;ввести список из 10 фамилий, расположенных в...

Список фамилий вводится через запятую в виде строк: упорядоточить фамилии по алфавиту
Текст вводится с клавиатуры в виде массива слов. Исходный текст и результаты...


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

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

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