Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.69
Scouser93
0 / 0 / 0
Регистрация: 19.12.2011
Сообщений: 4
#1

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

19.12.2011, 20:33. Просмотров 7680. Ответов 17
Метки нет (Все метки)

В исходном файле input.txt дано несколько фамилий. Нужно отсортировать их по алфавиту и вставить в файл output.txt. Содержимое input.txt и output.txt вывести на экран. Язык C.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2011, 20:33
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Сортировка фамилий по алфавиту (C++):

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

Сортировка фамилий по алфавиту
В структуре (Рабочие), которая записана в двоичный файл, требуется...

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

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

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

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

17
zss
Модератор
Эксперт С++
6956 / 6518 / 4138
Регистрация: 18.12.2011
Сообщений: 17,205
Завершенные тесты: 1
19.12.2011, 20:39 #2
Используйте функцию strcmp(str1,str2);
Она возвращает -1, если строки уже отсортированы
(те str2 по алфавиту позже, чем str1),
+1 - если нет и ноль - если строки одинаковые.
0
Scouser93
0 / 0 / 0
Регистрация: 19.12.2011
Сообщений: 4
19.12.2011, 21:01  [ТС] #3
Напишите, если не сложно, полную программу.
0
zss
Модератор
Эксперт С++
6956 / 6518 / 4138
Регистрация: 18.12.2011
Сообщений: 17,205
Завершенные тесты: 1
19.12.2011, 21:05 #4
А приведите то, что у Вас получилось
0
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;         
}
 Комментарий модератора 
Используйте теги форматирования кода!
0
zss
Модератор
Эксперт С++
6956 / 6518 / 4138
Регистрация: 18.12.2011
Сообщений: 17,205
Завершенные тесты: 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);
            }
        }
    }
1
vibe
0 / 0 / 1
Регистрация: 11.12.2010
Сообщений: 7
22.12.2011, 20:13 #7
а какой окончательный полный вариант? напишите,пожалуйста.. а то у меня такое же задание
0
zss
Модератор
Эксперт С++
6956 / 6518 / 4138
Регистрация: 18.12.2011
Сообщений: 17,205
Завершенные тесты: 1
23.12.2011, 20:06 #8
Цитата Сообщение от vibe Посмотреть сообщение
а какой окончательный полный вариант? напишите,пожалуйста.. а то у меня такое же задание
Уж постарайтесь самостоятельно собрать из двух кусков один.
Если не получится, то Вам не стоит вообще браться за программирование.
0
go
Эксперт С++
3636 / 1368 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
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);
0
nicenice
3 / 3 / 2
Регистрация: 22.11.2011
Сообщений: 168
21.01.2012, 20:40 #10
а можно всё перевести на С?
0
go
Эксперт С++
3636 / 1368 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
21.01.2012, 21:04 #11
Цитата Сообщение от nicenice Посмотреть сообщение
а можно всё перевести на С?
Вроде как, везде в этой теме Си - коды.
0
Dimon0907
0 / 0 / 0
Регистрация: 28.05.2013
Сообщений: 6
28.05.2013, 03:14 #12
здесь ведь исходные данные из текста надо ввести в массив? если да, то как это сделать?

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

J.X. Smith
B.A. Weiter
A.C. Johnes
0
daslex
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
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");
}
 
}
0
Barrent
246 / 122 / 54
Регистрация: 04.05.2013
Сообщений: 346
Завершенные тесты: 2
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;
}
1
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;
}
0
daslex
22.09.2015, 21:51
  #17

Не по теме:

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

0
ServerCydia
0 / 0 / 0
Регистрация: 21.10.2014
Сообщений: 3
22.09.2015, 22:33 #18
Ой, простите, спс большое! Новичок просто на форуме, еще не совсем разобрался
0
22.09.2015, 22:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2015, 22:33
Привет! Вот еще темы с решениями:

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

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

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

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


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

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

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