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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
mabden
0 / 0 / 0
Регистрация: 24.12.2009
Сообщений: 10
#1

Сортировка выводимых данных в алфавитном порядке - C++

24.12.2009, 09:42. Просмотров 2167. Ответов 15
Метки нет (Все метки)

у меня вот такое задание
Дан файл, состоящий из записей, которые содержат следующие поля:
- фамилия, имя;
- знак Зодиака;
- дата рождения.
Написать программу, выдающую
- информацию о заданном человеке;
- информацию о людях, родившихся под заданным знаком Зодиака, в алфавитном порядке.

все сделал кроме последнего пункта, информацию выводит но как сделать в алфавитном порядке?
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
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
 
#define DL_FIO 25
#define DL_ZZAD 10
#define  DL_DR 8
 
 
struct zadiak
{
    char fio[DL_FIO];
    char zad[DL_ZZAD];
    char dr[DL_DR];
};
 
void Info(FILE *f);
void Zadiak(FILE *f);
 
int main()
{
    FILE *f;  /* ссылка на входной файл */
    char n;   /* номер пункта меню */
    clrscr();
    f= fopen("zadiak.txt", "r");
    if (f==NULL)
    {
        puts ("Файл  zadiak.txt не найден");
                getch();
            return 1;
    }
    do
    {
        puts ("\n========================================================");
        puts ("Выберите номер пункта меню:");
        puts ("1 - вывод информации о заданном человеке");
        puts ("2 - вывод информацию о людях, родившихся под заданным знаком Задиака");
        puts ("3 - выход");
        puts("------------------------------------------------------");
        n = getche();
 
    switch(n)
         {
            case '1': Info(f); break;
            case '2': Zadiak(f); break;
            case '3': break;
            default: puts("\nНужно вводить номер пункта от 1 до 3");
         }
 
 
         if (n!='3')
         {  puts("\nДля продолжения нажмите любую клавишу");
                getch();
         }
    }
    while (n != '3');
    fclose(f);
    return 0;
}
 
void Info(FILE *f)
{
    zadiak tz;
    int n = 0;
    char zcel[DL_FIO];
    puts ("\nВведите интересующего человека");
    gets (zcel);
 
    rewind (f);
    while(fgets((char*)&tz,45,f)!=NULL)
    {
        tz.fio[DL_FIO-1]='\0';
        tz.zad[DL_ZZAD-1]='\0';
        tz.dr[DL_DR-1]='\0';
        if (strncmp (tz.fio, zcel, strlen (zcel)) == 0 )
        {
            n++;
            printf("\n %s %s  %s",tz.fio, tz.zad, tz.dr );
        }
    }
    if(n==0)puts("Заданого человека нет!");
}
 
 
void Zadiak(FILE *f)
{
    zadiak tz;
    int n = 0;
    char cel[DL_FIO];
    puts ("\nВведите интересующей знак задиака");
    gets (cel);
 
    rewind (f);
    while(fgets((char*)&tz,45,f)!=NULL)
    {
        tz.fio[DL_FIO-1]='\0';
        tz.zad[DL_ZZAD-1]='\0';
        tz.dr[DL_DR-1]='\0';
        if (strncmp (tz.zad, cel, strlen (cel)) == 0 )
        {
 
                        // вот здесь что то должно произойти чтоб отсортировать выходящие данные
            n++;
            printf("\n%d %s %s  %s",n, tz.fio, tz.zad, tz.dr );
        }
    }
    if(n==0)puts("Заданого задиака нет!");
}
Добавлено через 10 минут
отсортировать массив не сложно, я решил пузырьковым методом.

Проблема в том что когда я попытался вывести данные в массив то выдает ошибку cannot convert from 'char *' to 'char

вот как я пытался, может надо это по другому написать?

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
void Zadiak(FILE *f)
{
    zadiak tz;
    int n = 0;
    char cel[DL_FIO];
    puts ("\nВведите интересующей знак задиака");
    gets (cel);
    char sortfio[100,3]; //создал массив
 
    rewind (f);
    while(fgets((char*)&tz,45,f)!=NULL)
    {
        tz.fio[DL_FIO-1]='\0';
        tz.zad[DL_ZZAD-1]='\0';
        tz.dr[DL_DR-1]='\0';
        if (strncmp (tz.zad, cel, strlen (cel)) == 0 )
        {
            sortfio[n,0]=tz.fio; //записываю данные в массив (именно на эти строчки и ругается компилятор)
            sortfio[n,1]=tz.zad;
            sortfio[n,2]=tz.dr;
 
            n++;
            //printf("\n%d %s %s  %s",n, tz.fio, tz.zad, tz.dr );
        }
    }
    if(n==0)puts("Заданого задиака нет!");
    else
    {
               // добавил вывод массива
        for(int i=0;i<n;i++)
        {
            printf("\n%d %s %s  %s",i+1, sortfio[i,0],sortfio[i,1], sortfio[i,2] );
        }
    }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2009, 09:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сортировка выводимых данных в алфавитном порядке (C++):

Сортировка в алфавитном порядке... - C++
Здравствуйте, не могли бы вы помочь мне с задачей? Просто мы на лекциях ещё не разобрали как работать с файлами и текстом на C++, а на...

Сортировка в алфавитном порядке - C++
Написал скрипт сортировки по алфавиту. По идее работать должен, но к сожалению не работает. Вот код: struct stud{ char...

Сортировка структур в алфавитном порядке - C++
Помогите пожалуйста, как сделать сортировку структур по алфавиту?) Заранее спасибо!) Программа осуществляет:  ввод с клавиатуры данных...

Сортировка слов в алфавитном порядке - C++
Дан текст из несколько слов. Нужно вывести слова в алфавитном порядке по первой букве.

Сортировка структур в алфавитном порядке - C++
Отсортировать в алфавитном порядке по &quot;TIP&quot;. #include&lt;iostream&gt; #include&lt;cstdio&gt; #include&lt;string.h&gt; using namespace std; ...

Сортировка структур в алфавитном порядке - C++
Есть массив структур, которые содержат русское слово и его английский перевод. Надо отсортировать по английским словам в алфавитном...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
24.12.2009, 10:56 #2
обьявлено char sortfio[100,3];// sortfio массив из 100 массивов по 3 символа.
а тут:
C++
1
2
3
sortfio[n,0]=tz.fio; //sortfio[n,0] это один символ, tz.fio - массив charов, как можно символу массив присваивать
sortfio[n,1]=tz.zad;
sortfio[n,2]=tz.dr;
тогда надо обьявить:
C++
1
char *sortfio[100][3];//массив из 100 массивов по 3 указателя на char.
что бы sortfio[n,0]=tz.fio; было правельно.
ибо имя массива можно использовать в качестве указателя на его первый элемент, в твоем случаи это имя tz.fio.
таке обращение к элементу A[i,j] - не корректно, надо A[i][j]. Это тоже ошибка у тебя.
и в целом что то мудрено очень у тебя получилось. можно намного проще эту эадачу решить помоему
1
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
24.12.2009, 11:00 #3
C++
1
char *sortfio[100,3];
операция запятая сработает так, что объявится массив из трёх элементов

C++
1
char *sortfio[100][3];
массив сто по три, где каждый элемент - указатель на символ (адрес символа)
1
mabden
0 / 0 / 0
Регистрация: 24.12.2009
Сообщений: 10
24.12.2009, 19:57  [ТС] #4
Ну а может есть другой способ вывода в алфавитном порядке?

Добавлено через 3 часа 16 минут
Сделал как вы сказали переправил, заработало но теперь один баг, он последнию запись вписывает во все, то есть если мы записываем
C++
1
sortfio[n] [0]=tz.fio;
то заместо n он вписывает во все и тоесть последняя запись отображается во всех ((((((((

помогите


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
void Zadiak(FILE *f)
{
        zadiak tz;
        int n = 0;
        char cel[DL_FIO];
        puts ("\nВведите интересующей знак задиака");
        gets (cel);
        char *sortfio[100] [3]; //создал массив
 
        rewind (f);
        while(fgets((char*)&tz,45,f)!=NULL)
        {
                tz.fio[DL_FIO-1]='\0';
                tz.zad[DL_ZZAD-1]='\0';
                tz.dr[DL_DR-1]='\0';
                if (strncmp (tz.zad, cel, strlen (cel)) == 0 )
                {
                        sortfio[n] [0]=tz.fio; //записываю данные в массив (именно на эти строчки и ругается компилятор)
                        sortfio[n] [1]=tz.zad;
                        sortfio[n] [2]=tz.dr;
 
                        n++;
                        //printf("\n%d %s %s  %s",n, tz.fio, tz.zad, tz.dr );
                }
        }
        if(n==0)puts("Заданого задиака нет!");
        else
        {
               // добавил вывод массива
                for(int i=0;i<n;i++)
                {
                        printf("\n%d %s %s  %s",i+1, sortfio[i] [0],sortfio[i] [1], sortfio[i] [2] );
                }
        }
}
Добавлено через 4 минуты
получаеться что то ввиде
1 Чичерин К. А. дева 19.09.8
2 Чичерин К. А. дева 19.09.8
3 Чичерин К. А. дева 19.09.8
4 Чичерин К. А. дева 19.09.8
5 Чичерин К. А. дева 19.09.8
6 Чичерин К. А. дева 19.09.8
7 Чичерин К. А. дева 19.09.8
8 Чичерин К. А. дева 19.09.8
9 Чичерин К. А. дева 19.09.8
10 Чичерин К. А. дева 19.09.8

хотя структура файла
Разадинов А. П. водолей 12.04.88
Нишиков А. Н. рыбы 5.10.80
Вавилонов Е. В. скорпион 20.11.78
Василев Н. В. deva 21.10.79
Паласухин К. В. рак 18.08.84
Варанен Н. Г. дева 14.03.86
Sad D. B. дева 9.07.87
Ланшиков П. Р. лев 30.10.81
Куринанов Л. Т. стрилец 23.09.45
Чичерин К. А. дева 19.09.89

Добавлено через 40 минут
Помогите люди добрые!!!! 4 день голову ламаю....

Добавлено через 4 часа 43 минуты
Ребятушки, ну дайте кто нибудь советик, очень нана!!!
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.12.2009, 05:26 #5
Цитата Сообщение от mabden
то заместо n он вписывает во все и тоесть последняя запись отображается во всех ((((((((
ну, так это бывает когда память не выделяешь для каждой строки
надо дублировать в память каждую строку и потом адресы этих дубликатов сохранять в массив указателей
не забыть ещё потом освободить каждую строку
1
mabden
0 / 0 / 0
Регистрация: 24.12.2009
Сообщений: 10
25.12.2009, 07:29  [ТС] #6
Цитата Сообщение от accept Посмотреть сообщение
ну, так это бывает когда память не выделяешь для каждой строки
надо дублировать в память каждую строку и потом адресы этих дубликатов сохранять в массив указателей
не забыть ещё потом освободить каждую строку

а как примерно это выглядит????
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.12.2009, 07:35 #7
C
1
    sortfio[n] [0]=tz.fio;
C
1
    sortfio[n][0] = DuplicateLine(tz.fio);
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdlib.h>
#include <string.h>
 
/* DuplicateLine:  создаёт копию для строки l */
char *DuplicateLine(const char *l)
{
    char *p;
    
    if (l == NULL || *l == '\0')
        return NULL;
    if ((p = malloc(strlen(l)+1)) != NULL);
        strcpy(p, l);
    return p;
}
1
mabden
0 / 0 / 0
Регистрация: 24.12.2009
Сообщений: 10
25.12.2009, 08:18  [ТС] #8
а это как использовать?



C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdlib.h>
#include <string.h>
 
/* DuplicateLine:  создаёт копию для строки l */
char *DuplicateLine(const char *l)
{
    char *p;
    
    if (l == NULL || *l == '\0')
        return NULL;
    if ((p = malloc(strlen(l)+1)) != NULL);
        strcpy(p, l);
    return p;
}
[/QUOTE]
0
M128K145
Эксперт С++
8288 / 3508 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
25.12.2009, 08:24 #9
mabden, как обычную функцию
0
mabden
0 / 0 / 0
Регистрация: 24.12.2009
Сообщений: 10
25.12.2009, 08:29  [ТС] #10
тепрь тут ошибка
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdlib.h>
#include <string.h>
 
/* DuplicateLine:  создаёт копию для строки l */
char *DuplicateLine(const char *l)
{
    char *p;
    
    if (l == NULL || *l == '\0')
        return NULL;
    if ((p = malloc(strlen(l)+1)) != NULL); //в этой страке
        strcpy(p, l);
    return p;
}
cannot convert `void *` to `char *`
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.12.2009, 09:32 #11
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdlib.h>
#include <string.h>
 
/* DuplicateLine:  создаёт копию для строки l */
char *DuplicateLine(const char *l)
{
    char *p;
    
    if (l == NULL || *l == '\0')
        return NULL;
    if ((p = (char *) malloc(strlen(l)+1)) != NULL);
        strcpy(p, l);
    return p;
}
Добавлено через 1 минуту
Цитата Сообщение от mabden
а это как использовать?
функцию под main записываешь, а сверху заголовок

C
1
char *DuplicateLine(const char *);
1
mabden
0 / 0 / 0
Регистрация: 24.12.2009
Сообщений: 10
25.12.2009, 11:48  [ТС] #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
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
void Zadiak(FILE *f)
{
        zadiak tz;
        int n = 0;
        char cel[DL_FIO];
                puts ("\nВведите интересующей знак задиака");
                gets (cel);
                char *sortfio[100] [3]; //создал массив
 
                rewind (f);
                while(fgets((char*)&tz,45,f)!=NULL)
                {
                                tz.fio[DL_FIO-1]='\0';
                                tz.zad[DL_ZZAD-1]='\0';
                                tz.dr[DL_DR-1]='\0';
                                if (strncmp (tz.zad, cel, strlen (cel)) == 0 )
                                {
                                                sortfio[n] [0]=DuplicateLine(tz.fio);
                                                sortfio[n] [1]=DuplicateLine(tz.zad);
                                                sortfio[n] [2]=DuplicateLine(tz.dr);
 
                                                n++;
                                                //printf("\n%d %s %s  %s",n, tz.fio, tz.zad, tz.dr );
                                }
                }
                if(n==0)puts("Заданого задиака нет!");
                else
                {
                        
 
        printf("\n %d",n); 
 
//сортировку данных добавил 
        char *temp[3]; 
        for (int i=1;  i<n  ;  i++)
        {
            for (int j=0;  j<n-i;  j++){
                //if (sortfio [j][0]>sortfio [j+1][0])
                if (strcmp(sortfio [j][0], sortfio [j+1][0])>0)
                {
                    temp[0]=sortfio[j][0]; 
                    sortfio [j][0]=sortfio [j+1][0];
                    sortfio [j+1][0]=temp[0];
 
                    /*strcpy(temp[0],sortfio[j][0]);
                    strcpy(sortfio [j][0],sortfio [j+1][0]);
                    strcpy(sortfio [j+1][0],temp[0]);*/
                }
            }
        }        
//вывод массива             
        for(i=0;i<n;i++)
        {
            printf("\n%d %s %s  %s",i+1, sortfio[i] [0],sortfio[i] [1], sortfio[i] [2] );
        }
    }
}
но проблема теперь такая почему то переменная n уменьшаеться

например если комментировать сортировку то n=10 и делает нормальный вывод данных

если с сортировкой то почему то n=2 и причем массив тоже уменьшается до двух значений
и выводятся два последних значения

с чем это связанно? и как это обойти?

Добавлено через 6 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        char temp[3]; 
        for (int i=1;  i<n  ;  i++)
        {
            for (int j=0;  j<n-i;  j++){
                //if (sortfio [j][0]>sortfio [j+1][0])
                if (strcmp(sortfio [j][0], sortfio [j+1][0])>0)
                {
                    temp[0]=(char)sortfio[j][0]; 
                    sortfio [j][0]=sortfio [j+1][0];
                    sortfio [j+1][0]=(char*)temp[0];
 
                }
            }
        }
попробовал вот так все нормально сработало
но теперь такая проблема первые 9 каие то ироглифы а 10 нормально вывелся
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.12.2009, 12:54 #13
C
1
    char *temp[3];
почему не char *temp;

а что вообще сортируется ?

Добавлено через 3 минуты
C
1
    while(fgets((char*)&tz,45,f)!=NULL)
tz - структура, а fgets работает со строкой
1
mabden
0 / 0 / 0
Регистрация: 24.12.2009
Сообщений: 10
25.12.2009, 14:06  [ТС] #14
потомучто мне три элемента потом надо будет тоже сортировать
sortfio [j][0]
sortfio [j][1]
sortfio [j][2]

все последовал вашему совету сделал

char *temp

получилось что то вроде
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
//сортировку данных добавил
        char *temp;
        for (int i=1;  i<n  ;  i++)
        {
            for (int j=0;  j<n-i;  j++){
                //if (sortfio [j][0]>sortfio [j+1][0])
                if (strcmp(sortfio [j][0], sortfio [j+1][0])>0)
                {
                    temp=sortfio[j][0];
                    sortfio [j][0]=sortfio [j+1][0];
                    sortfio [j+1][0]=temp;
 
                    temp=sortfio[j][1];
                    sortfio [j][1]=sortfio [j+1][1];
                    sortfio [j+1][1]=temp;
 
                    temp=sortfio[j][2];
                    sortfio [j][2]=sortfio [j+1][2];
                    sortfio [j+1][2]=temp;
                }
            }
        }
//вывод массива
        for(i=0;i<n;i++)
        {
            printf("\n%d %s %s  %s",i+1, sortfio[i] [0],sortfio[i] [1], sortfio[i] [2] );
        }
    }
и все получилось

Я ВАС ЛЮБЛЮ СПАСИБО ВАМ БОЛЬШОЕ!!!

КАК Я МОГУ ВАС ОТБЛАГОДАРИТЬ?

Добавлено через 6 минут
вот только пожалуйста разъясните что имено происходит в этой функции

а то чует моя печенка что меня этим вопросом он вгонит меня в ступор

C++
1
2
3
4
5
6
7
8
9
10
char *DuplicateLine(const char *l)
{
    char *p;
    
    if (l == NULL || *l == '\0')
        return NULL;
    if ((p = (char *) malloc(strlen(l)+1)) != NULL);
        strcpy(p, l);
    return p;
}
Добавлено через 11 минут
Цитата Сообщение от accept Посмотреть сообщение

C
1
    while(fgets((char*)&tz,45,f)!=NULL)
tz - структура, а fgets работает со строкой
нет тут то все в порядке он считывает по строке по 45 символов записывает в структуру в дальнейшим мы как раз и берем из нее данные пока не наступит конец файла
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.12.2009, 21:45 #15
fwrite вместо fgets (fgets реагирует на '\n')

Цитата Сообщение от mabden
вот только пожалуйста разъясните что имено происходит в этой функции
C
1
2
    if (l == NULL || *l == '\0') /* если переданная строка неправильная, вернуть NULL */
        return NULL;
C
1
2
    if ((p = (char *) malloc(strlen(l)+1)) != NULL);
        strcpy(p, l);
выделить память для копии строки, в зависимости от её длины, учесть нуль-символ, явно привести возвращённый указатель void * к char *, сохранить в p
если память выделилась, скопировать в неё переданную строку

C
1
    return p;
вернуть указатель на память или NULL, если память не выделилась
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2009, 21:45
Привет! Вот еще темы с ответами:

Сортировка строк в алфавитном порядке - C++
Собственно сабж) Вроде бы сделал что-то похожее, но ошибка запрета доступа, если вводить строки с клавиатуры (понимаю, что не выделил...

сортировка строки в алфавитном порядке - C++
как сделать так, чтоб программа выводила строку с повторами ? то есть ввожу abcddff программа выведет abcdf нужно чтоб...

Сортировка слов в алфавитном порядке - C++
Задан любой текст.Выпонить сортировку слов этого текста в алфавитном порядке.

Сортировка строк в алфавитном порядке - C++
Помогите пожалуйста написать программу для сортировки строк в алфавитном порядке Программа открывает фаил input.txt и отоброжает его...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.12.2009, 21:45
Ответ Создать тему
Опции темы

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