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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.69
Scouser93
0 / 0 / 0
Регистрация: 19.12.2011
Сообщений: 4
19.12.2011, 20:33     Сортировка фамилий по алфавиту #1
В исходном файле input.txt дано несколько фамилий. Нужно отсортировать их по алфавиту и вставить в файл output.txt. Содержимое input.txt и output.txt вывести на экран. Язык C.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2011, 20:33     Сортировка фамилий по алфавиту
Посмотрите здесь:

C++ Из списка фамилий упорядочить их по алфавиту
C++ сортировка фамилий
задача стоит так : Список фамилий вводится через запятую в виде строки. Упорядочить фамилии по алфавиту C++
C++ Задача со строками (ввод списка фамилий через запятую в виде строки. Фамилии должны быть отсортированы по-алфавиту)
C++ ввести список из 10 фамилий, расположенных в произвольном порядке и упорядочить их по алфавиту
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5947 / 5552 / 1784
Регистрация: 18.12.2011
Сообщений: 14,184
Завершенные тесты: 1
19.12.2011, 20:39     Сортировка фамилий по алфавиту #2
Используйте функцию strcmp(str1,str2);
Она возвращает -1, если строки уже отсортированы
(те str2 по алфавиту позже, чем str1),
+1 - если нет и ноль - если строки одинаковые.
Scouser93
0 / 0 / 0
Регистрация: 19.12.2011
Сообщений: 4
19.12.2011, 21:01  [ТС]     Сортировка фамилий по алфавиту #3
Напишите, если не сложно, полную программу.
zss
Модератор
Эксперт С++
 Аватар для zss
5947 / 5552 / 1784
Регистрация: 18.12.2011
Сообщений: 14,184
Завершенные тесты: 1
19.12.2011, 21:05     Сортировка фамилий по алфавиту #4
А приведите то, что у Вас получилось
Scouser93
0 / 0 / 0
Регистрация: 19.12.2011
Сообщений: 4
19.12.2011, 21:11  [ТС]     Сортировка фамилий по алфавиту #5
Это часть программы, которая считывает данные с input.txt и копирует в 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
#include <stdio.h>
#include <string.h>
int main ()
{
    char fio [100]; 
    int swin;       
    FILE *fpin,*fpout;  
    fpin = fopen ("C:/Users/kylik/Desktop/input.txt", "r"); 
    fpout = fopen ("C:/Users/kylik/Desktop/output.txt", "w");
    for (;;)        
    {
        swin = fscanf (fpin, "%s", fio);
        if (swin == EOF)   
           break;            
                    printf ("\nFamilija: %s",fio);
        fprintf(fpout,"%s\n",fio);
    }
    printf ("\nSpisok familij sakonchilsja...\n");
    printf ("\n------------------------------\n");
    
    fclose(fpin);  
    fclose(fpout); 
    fpin = fopen ("C:/Users/kylik/Desktop/output.txt", "r"); 
    for (;;)    
    {
        swin = fscanf (fpin, "%s", fio);
        if (swin == EOF)   
            break;         
        printf("%s\n",fio);
    };
  
    fclose (fpin);    
      getchar();        
     return 0;         
}
 Комментарий модератора 
Используйте теги форматирования кода!
zss
Модератор
Эксперт С++
 Аватар для zss
5947 / 5552 / 1784
Регистрация: 18.12.2011
Сообщений: 14,184
Завершенные тесты: 1
19.12.2011, 21:29     Сортировка фамилий по алфавиту #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    char fio[1000][100]; // массив на 1000 фамилий
    int n=20; // прочитано 20 фамилий
....
    for(int i=0;i<n;i++)
    {
        for(int j=i;j<n;j++)
        {
            if(strcmp(fio[i],fio[j])==1) // еще неотсортировано
            {
                char t[100]; // переставляем
                strcpy(t,str[i]);
                strcpy(str[i],str[j];
                strcpy(str[j],t);
            }
        }
    }
vibe
0 / 0 / 1
Регистрация: 11.12.2010
Сообщений: 7
22.12.2011, 20:13     Сортировка фамилий по алфавиту #7
а какой окончательный полный вариант? напишите,пожалуйста.. а то у меня такое же задание
zss
Модератор
Эксперт С++
 Аватар для zss
5947 / 5552 / 1784
Регистрация: 18.12.2011
Сообщений: 14,184
Завершенные тесты: 1
23.12.2011, 20:06     Сортировка фамилий по алфавиту #8
Цитата Сообщение от vibe Посмотреть сообщение
а какой окончательный полный вариант? напишите,пожалуйста.. а то у меня такое же задание
Уж постарайтесь самостоятельно собрать из двух кусков один.
Если не получится, то Вам не стоит вообще браться за программирование.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
23.12.2011, 20:13     Сортировка фамилий по алфавиту #9
C
1
2
int cmp (const void *a, const void *b)  { return strcmp ( *(char **) a, *(char **) b ) ; }
qsort (arr, Num, sizeof (arr[0]), cmp);
nicenice
3 / 3 / 0
Регистрация: 22.11.2011
Сообщений: 168
21.01.2012, 20:40     Сортировка фамилий по алфавиту #10
а можно всё перевести на С?
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
21.01.2012, 21:04     Сортировка фамилий по алфавиту #11
Цитата Сообщение от nicenice Посмотреть сообщение
а можно всё перевести на С?
Вроде как, везде в этой теме Си - коды.
Dimon0907
0 / 0 / 0
Регистрация: 28.05.2013
Сообщений: 6
28.05.2013, 03:14     Сортировка фамилий по алфавиту #12
здесь ведь исходные данные из текста надо ввести в массив? если да, то как это сделать?

Добавлено через 41 минуту
почему-то не сортирует?
ServerCydia
0 / 0 / 0
Регистрация: 21.10.2014
Сообщений: 3
21.09.2015, 21:30     Сортировка фамилий по алфавиту #13
А у меня вот задача посложнее: нужно, что бы фамилии сортировались после инициалов,т.е.

J.X. Smith
B.A. Weiter
A.C. Johnes
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
21.09.2015, 23:58     Сортировка фамилий по алфавиту #14
ServerCydia,
Кликните здесь для просмотра всего текста
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
#include <stdio.h>
#include <string.h>
 
int main(){
 
    char Famil[255];
    char fio[100][255];
    char ArrInitial[100][7];
 
    FILE *fp = fopen("D:\\in.txt","r");
        if(fp == NULL)
        {
            printf("can not open file '%s'","D:\\in.txt");
            return 0;
        }
 
        int n=0;
 
 
    while(fgets(fio[n],sizeof(Famil),fp)){
        strncpy(ArrInitial[n],fio[n],5);
        ArrInitial[n][6]=0;
 
        int k=strlen(fio[n]);
        strncpy(fio[n],fio[n]+5,k-5);
        fio[n][k-6]=0;
 
 
 
        n++;
    };
    fclose(fp);
    printf("%s","\n");
 
    char t[100], u[7];
    for(int i=0;i<n;i++)
    {
        for(int j=i;j<n;j++)
        {
            if(strcmp(fio[i],fio[j])==1) // еще неотсортировано
            {
                // переставляем
                strcpy(t,fio[i]);
                strcpy(fio[i],fio[j]);
                strcpy(fio[j],t);
 
                strcpy(u,ArrInitial[i]);
                strcpy(ArrInitial[i],ArrInitial[j]);
                strcpy(ArrInitial[j],u);
            }
        }
    }
 
 
/*Я просто вывел на экран, в файл запишите сами*/
for (int i=0;i<n;i++){
    printf("%s%s%s",ArrInitial[i],fio[i],"\n");
}
 
}
Barrent
 Аватар для Barrent
211 / 87 / 27
Регистрация: 04.05.2013
Сообщений: 260
Завершенные тесты: 1
22.09.2015, 01:09     Сортировка фамилий по алфавиту #15
ServerCydia,
Сделал без файлов - их сами уже добавите.
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
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <vector>
#include <string>
#include <algorithm>
 
using namespace std;
 
bool Compare(const string &left, const string &right);
size_t FindSurnameIndex(const string  &fio);
 
int main()
{
    vector<string> names;   
    //вводим данные
    names.push_back("J.X.Smith");
    names.push_back("B.A. Weiter");
    names.push_back("A.C. Johnes");
    //сортировка
    std::sort(names.begin(), names.end(), Compare);
    //вывод на экран
    for (auto name = names.begin(); name != names.end(); name++){
        cout << *name << endl;
    }
    system("pause");
    return 0;
}
 
//Сравнение 2-х ФИО
bool Compare(const string &left, const string &right){
    //Находим индексы начала фамилий
    size_t left_index_dot = FindSurnameIndex(left);
    size_t right_index_dot = FindSurnameIndex(right);
 
    //Сравниваем фамилии
    for (size_t i = left_index_dot, j = right_index_dot; i < left.length(), j < right.length(); i++, j++){
 
        if (left[i] < right[j])
            return true;
 
        if (left[i] > right[j])
            return false;
 
        if ((i + 1 == left.length()) && (j + 1 < right.length()))
            return true;
 
        if ((i + 1 < left.length()) && (j + 1 == right.length()))
            return false;
 
        if ((i + 1 == left.length()) && (j + 1 == right.length()))
            return true;
    }
    return true;
}
 
//Возвращает позицию фамилии
size_t FindSurnameIndex(const string  &fio){
    //находим позицию первой точки
    size_t first_dot = fio.find('.');
    size_t non_space;
    //если точки нет, то возвращаем позицию первого не пробела (или 0 если все пробелы)
    if (first_dot == string::npos){
        non_space = fio.find_first_not_of(' ');
        if (non_space == string::npos)
            return 0;
        return non_space;
    }
        
    //находим позицию второй точки  
    size_t second_dot = fio.find('.', first_dot + 1);
    //если точки нет, то возвращаем позицию первого не пробела (или 0 если все пробелы) после первой точки
    if (second_dot == string::npos){
        non_space = fio.find_first_not_of(' ', first_dot + 1);
        if (non_space == string::npos)
            return 0;
        return non_space;
    }
    
    //возврат позиции не пробела после второй точки
    non_space = fio.find_first_not_of(' ', second_dot + 1);
    if (non_space == string::npos)
        return second_dot + 1;
    return non_space;
}
ServerCydia
0 / 0 / 0
Регистрация: 21.10.2014
Сообщений: 3
22.09.2015, 21:00     Сортировка фамилий по алфавиту #16
Нет, задача немного другая: Есть фамилии с инициалами, их определенное количество. Выглядят они
C
1
2
3
4
3
G.A. Simpson
M.J. Berns 
A.G. Johnson
, где первая цифра -- количество фамилий. Их надо привести к виду
C
1
2
3
1. M.J. Berns
2. A.G. Johnson
3. G.A. Simpson
Я написал программу, которая сортирует фамилии по алфавитному порядку, но у меня не получается сортировка с инициалами. По идее, надо в каком-то цикле добавить 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
#include <stdio.h>
#include <string.h>
 
 
int main()
{
  int N;
  scanf("%d", &N);
  char s1[80], S[N+1][80];
  int i, j;
  for ( i=0; i<N+1; i++ )
    gets ( S[i] );
  for ( i=0; i<N; i++ )
    for ( j=N-1; j>=i; j--)
      if ( strcmp(S[j],S[j+1]) > 0 ) {
        strcpy(s1, S[j]);
        strcpy(S[j], S[j+1]);
        strcpy(S[j+1], s1);
        }
  for ( i=1; i<N+1; i++ )
    printf("%d. %s\n", i,S[i]);
  getchar();
  return 0;
}
daslex
22.09.2015, 21:51
  #17

Не по теме:

ServerCydia, А под спойлер слабо посмотреть?

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2015, 22:33     Сортировка фамилий по алфавиту
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
ServerCydia
0 / 0 / 0
Регистрация: 21.10.2014
Сообщений: 3
22.09.2015, 22:33     Сортировка фамилий по алфавиту #18
Ой, простите, спс большое! Новичок просто на форуме, еще не совсем разобрался
Yandex
Объявления
22.09.2015, 22:33     Сортировка фамилий по алфавиту
Ответ Создать тему
Опции темы

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