Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.99/141: Рейтинг темы: голосов - 141, средняя оценка - 4.99
0 / 0 / 0
Регистрация: 19.12.2011
Сообщений: 4
1

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

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

Author24 — интернет-сервис помощи студентам
В исходном файле input.txt дано несколько фамилий. Нужно отсортировать их по алфавиту и вставить в файл output.txt. Содержимое input.txt и output.txt вывести на экран. Язык C.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.12.2011, 20:33
Ответы с готовыми решениями:

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

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

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

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

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

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

J.X. Smith
B.A. Weiter
A.C. Johnes
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
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
252 / 128 / 54
Регистрация: 04.05.2013
Сообщений: 346
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
1 / 1 / 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;
}
1
daslex
22.09.2015, 21:51
  #17

Не по теме:

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

0
1 / 1 / 0
Регистрация: 21.10.2014
Сообщений: 3
22.09.2015, 22:33 18
Ой, простите, спс большое! Новичок просто на форуме, еще не совсем разобрался
0
22.09.2015, 22:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.09.2015, 22:33
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru