С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/41: Рейтинг темы: голосов - 41, средняя оценка - 4.83
3 / 3 / 0
Регистрация: 11.12.2011
Сообщений: 88
1

Считать из файла структуру, отсортировать и записать в новый файл

28.12.2011, 22:44. Показов 8317. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, буду очень благодарен если кто поможет. застрял на функции лоад. Вот само задание:
создать программу по индивидуальному варианту, которая:
1.1. открывает внешний файл Input.txt и считывает с него данные согласно индивидуальным заданием (не менее 5-ти записей с 3-мя или более полями);
1.2. запоминает полученные данные в виде структуры данных;
1.3. сортирует данные структуры за числовым полем любым методом сортировки;
1.4. записывает полученные результаты сортировки во внешний файл Output.txt в виде таблицы с соответствующей шапкой и табулирования данных.
2. Выполнить пункты 1.3 и 1.4 для сортировки данных структуры по символьным полем.

1. Закрытые данные-члены класса:
- Мобильный номер;
- Остаток средств на счете;
- Название тарифного плана.
Открытые функции-члены класса:
- Инициализация (введение через аргументы функции информации в данные-члены класса);
- Вывод на экран информации, сохранения в данных-членах.
2. Модернизировать класс так, чтобы работу по инициализации данных выполнял конструктор, а деструктор выводил на экран мобильный номер и название тарифного плана.


Файл допустим такого содержания:
09342598623 56.30 life
05085458748 23.10 mtc
09765874598 11.20 kyivstar
09345874122 89.65 life
09645874114 11.50 mtc


Дошел до этого, дальше мои знания не позволяют((
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
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
struct Abonent
{
    int nomer;
    double ostatok;
    char tarif[15];
}arr [5];
 
int load (struct Abonent *arr)
{
    char *token=0;
    int field=1;
    char str[256];
    FILE *f=fopen("D:\\Input.txt", "r");
    token = strtok (str, " ");
    
}
 
void main (void)
{
    load(arr);
 
}
Вложения
Тип файла: txt Input.txt.txt (120 байт, 33 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.12.2011, 22:44
Ответы с готовыми решениями:

Считать числа из файла, отсортировать и записать в другой
Программа должна считывать 10 чисел из файла input.txt, сортировать их в порядке возрастания и...

Прочесть структуру из файла, модифицировать и записать обратно в файл
Составить структуру в файле на языке си . читаешь структуру из файла, меняешь значения структуры...

Прочитать из файла, отсортировать и записать результат в файл
Необходимо прочитать числа из файла как список, провести сортировку (по убыванию и возрастанию) и...

Считать структуру с файла
КАа считать структуру с файла?Текстовый или бинарный без разницы Структура такая struct...

12
3 / 3 / 0
Регистрация: 11.12.2011
Сообщений: 88
29.12.2011, 20:54  [ТС] 2
незнаю даже как записать данные с файла в структуру

Добавлено через 56 минут
load(arr);
int load (struct Abonent *arr)
правильны ли эти строчки?


и почему в лоаде нельзя так писать:
strcpy (arr->nomer=atoi(token), token);
пишет еррор : мол аргумент типа инт несовместим с параметром типа чар.
Помогите кто-то пожалуйста

Добавлено через 20 часов 9 минут
......

Добавлено через 58 минут
load(arr)
вот вызов функции

вот сама функция
C
1
2
3
4
5
6
7
8
9
10
11
12
int load (struct Abonent *arr)
{
    FILE *f=fopen("D:\Input.txt", "r");
    int i=0;
    for(i=0;i<5;i++)
    {
        fscanf(f,"%d", &arr[i].nomer);
        fscanf(f,"%f", &arr[i].ostatok);
        fscanf(f,"%s", &arr[i].tarif);
    }
    return 0;
}
что тут неправильно?
выбивает еррор
0
33 / 33 / 4
Регистрация: 04.03.2011
Сообщений: 67
29.12.2011, 21:33 3
Можешь считывать так из файла так:
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
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
 
 
 
struct Abonent
{
        int nomer;
        double ostatok;
        char tarif[15];
}arr [20];
 
int load (struct Abonent *t)
{
        int i=0;
        FILE *f=fopen("D:\\Input12.txt", "r");
        if (f==NULL)
        {
            puts("Error");
            return 0;
        }
        while (!feof(f))
        {
            fscanf(f,"%d %lf %s",&t[i].nomer,&t[i].ostatok,&t[i].tarif);
            i++;
        }
        fcloseall();
        return i-1;
}
 
int main ()
{
    int i,n;
       n=load(arr);
       for (i=0;i<n;i++)
           printf("%6d %10.2lf %10s\n",arr[i].nomer,arr[i].ostatok,arr[i].tarif);
       system("pause");
        return 0;
}
В strcpy 2 параметра должны быть сhar, а у тебя 1 int другой char
В функции у тебя проблема потому что тебе надо считывать данные пока не будет достигнут конец файла. Сделай условие
C
1
2
3
4
while (!feof)
{
     //код
}
1
3 / 3 / 0
Регистрация: 11.12.2011
Сообщений: 88
29.12.2011, 21:59  [ТС] 4
Ropsat, уже сделал так вроде load работает. пока не конец файла это обязательно? я же fscanf же вроде до пробела считывает, нет?

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 <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
struct Abonent
{
    char nomer[11];
    double ostatok;
    char tarif[15];
}arr [5];
 
int load (struct Abonent *arr)
{
    int i=0;
    FILE *f=NULL; 
    f=fopen("D:\Input.txt", "rt");
    if (f==NULL)
    {
        printf ("No file!!!\n");
        exit (0);
    }
    
    for(i=0;i<5;i++)
    {
        fscanf(f,"%s", &arr[i].nomer);
        fscanf(f,"%lf", &arr[i].ostatok);
        fscanf(f,"%s", &arr[i].tarif);
    }
    fclose (f);
    return 0;
}
 
void main (void)
{
    int n=0;
L:  printf("\n1.load\n2.sortorovka po osratky\n3.sortirovka po tarify\n4.save\n5.exit\n");
    printf ("Input number : ");
    scanf ("%d", &n);
    switch (n)
    {
    case 1 : load(arr);
             break;
 
    //case 2 : sortost ();
             break;
 
    //case 3 : sorttar ();
             break;
 
    //case 4 : save ();
             break;
 
    case 5 : exit (0);
             break;
    }
    goto L;
    
}
не знаешь как сортировать символьные поля?
0
33 / 33 / 4
Регистрация: 04.03.2011
Сообщений: 67
29.12.2011, 22:30 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
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
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
struct Abonent
{
        int nomer;
        double ostatok;
        char tarif[15];
}arr [20];
 
int load (struct Abonent *t)
{
        int i=0;
        FILE *f=fopen("D:\\Input12.txt", "r");
        if (f==NULL)
        {
            puts("Error");
            return 0;
        }
        while (!feof(f))
        {
            fscanf(f,"%d %lf %s",&t[i].nomer,&t[i].ostatok,&t[i].tarif);
            i++;
        }
        fcloseall();
        return i-1;
}
 
void Sort(struct Abonent *t,int k)
{
    int i,j;
    char temp[15];
    for (i=0;i<k;i++)
        for (j=0;j<k-1;j++)
            if (strcmp(t[j].tarif,t[j+1].tarif)>0)
                {
                    strcpy(temp,t[j].tarif);
                    strcpy(t[j].tarif,t[j+1].tarif);
                    strcpy(t[j+1].tarif,temp);
                }
}
 
int main ()
{
        int i,n;
       n=load(arr);
       for (i=0;i<n;i++)
           printf("%6d %10.2lf %10s\n",arr[i].nomer,arr[i].ostatok,arr[i].tarif);
       Sort(arr,n);
           putchar('n');
       for (i=0;i<n;i++)
           printf("%6d %10.2lf %10s\n",arr[i].nomer,arr[i].ostatok,arr[i].tarif); 
       system("pause");
        return 0;
}
Ну если ты знаешь что у тебя в файле будет 5 полей с данными об абоненте, то можешь делать по-своему, но если количество у тебя может быть различным, то пиши через while (! feof(f))

Я сортировал по ASCII кодам символов через strcmp
1
3 / 3 / 0
Регистрация: 11.12.2011
Сообщений: 88
29.12.2011, 23:28  [ТС] 6
Ropsat, спасибо большое что помогаешь.

Добавлено через 6 минут
Ropsat, а как номер правильно записать(первое поле), когда пишу через инт, то оно бред какой-то запоминает

Добавлено через 1 минуту
Ropsat, всё понял, сделал так
C
1
char nomer[11];
и номер стало корректно считывать.

Добавлено через 45 минут
помогите кто-то как сделать сортировку по остатку на счете. в чём я неправ(функция sortost)?


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
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
struct Abonent
{
    char nomer[11];
    double ostatok;
    char tarif[15];
}arr [5],x;
 
int load (struct Abonent *arr)
{
    int i=0;
    FILE *f=NULL; 
    f=fopen("D:\Input.txt", "rt");
    if (f==NULL)
    {
        printf ("No file!!!\n");
        exit (0);
    }
    
    for(i=0;i<5;i++)
    {
        fscanf(f,"%s", &arr[i].nomer);
        fscanf(f,"%lf", &arr[i].ostatok);
        fscanf(f,"%s", &arr[i].tarif);
    }
    fclose (f);
    return 0;
}
 
int sortost (struct Abonent *arr)
{
    int i=0, j=0;
    for(i=0;i<5;i++)
    {
        for(j=1; j<5; j++)
        {
            if( (arr[i].ostatok)>(arr[j].ostatok) );
            {
                x=arr[i];
                arr[i]=arr[j];
                arr[j]=x;
            }
        }
    }
 
    return 0;
}
 
int sorttar (struct Abonent *arr)
{
    int i=0, j=0;
    char temp [15];
    for (i=0; i<5; i++)
    {
        for (j=0; j<4; j++)
        {
            if (strcmp(arr[j].tarif, arr [j+1].tarif) >0)
            {
                strcpy (temp, arr[j].tarif);
                strcpy (arr[j].tarif, arr[j+1].tarif);
                strcpy (arr[j+1].tarif, temp);
            }
        }
    }
    return 0;
}
 
void main (void)
{
    int n=0;
L:  printf("1.load\n2.sortorovka po osratky\n3.sortirovka po tarify\n4.save\n5.exit\n");
    printf ("Input number : ");
    scanf ("%d", &n);
    printf ("\n");
    switch (n)
    {
    case 1 : load(arr);
             break;
 
    case 2 : sortost (arr);
             break;
 
    case 3 : sorttar (arr);
             break;
 
    //case 4 : save ();
             break;
 
    case 5 : exit (0);
             break;
    }
    goto L;
    
}
 
 
/*  for (i=0;i<5;i++)
    printf("%s %lf %s\n",arr[i].nomer,arr[i].ostatok,arr[i].tarif);*/
0
3 / 3 / 0
Регистрация: 30.11.2011
Сообщений: 17
29.12.2011, 23:42 7
C
1
2
3
4
5
6
7
8
9
10
11
for(i=0;i<5;i++)
        {
                for(j=1; j<5; j++)
                {
                        if( (arr[i].ostatok)>(arr[j].ostatok) );
                        {
                                x=arr[i].ostatok;
                                arr[i].ostatok=arr[j].ostatok;
                                arr[j].ostatok=x;
                        }
                }
 Комментарий модератора 
Используйте теги выделения кода.
1
3 / 3 / 0
Регистрация: 11.12.2011
Сообщений: 88
29.12.2011, 23:54  [ТС] 8
N@t@lk@, спасибо, что пробуешь помочь, но твой вариант неправильный, пишет невозможно преобразовать дабл в абонент
0
33 / 33 / 4
Регистрация: 04.03.2011
Сообщений: 67
30.12.2011, 00:30 9
Сначала я неверно написал. Вот так должно быть
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
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
struct Abonent
{
        int nomer;
        double ostatok;
        char tarif[15];
}arr [20];
 
int load (struct Abonent *t)
{
        int i=0;
        FILE *f=fopen("D:\\Input12.txt", "r");
        if (f==NULL)
        {
            puts("Error");
            return 0;
        }
        while (!feof(f))
        {
            fscanf(f,"%d %lf %s",&t[i].nomer,&t[i].ostatok,&t[i].tarif);
            i++;
        }
        fcloseall();
        return i;
}
 
void Sort(struct Abonent *t,int k)
{
    int i,j;
    Abonent temp ;
    for (i=0;i<k;i++)
        for (j=0;j<k-1;j++)
            if (strcmp(t[j].tarif,t[j+1].tarif)>=0)
                {
                    temp=t[j];
                    t[j]=t[j+1];
                    t[j+1]=temp;
                }
 
}
void sortost (struct Abonent *t,int k)
{
        int i=0, j=0;
        Abonent x;
        for(i=0;i<k;i++)
        {
                for(j=0; j<k-1; j++)
                {
                        if( t[j].ostatok > t[j+1].ostatok) 
                        {
                            x=t[j];
                            t[j]=t[j+1];
                            t[j+1]=x;
                        }
                }
        }
 
        return ;
}
int main ()
{
        int i,n,p;
       n=load(arr);
       for (i=0;i<n;i++)
           printf("%6d %10.2lf %10s\n",arr[i].nomer,arr[i].ostatok,arr[i].tarif);
       printf("1 - Sortirovka po tarufam\n");
       printf("2 - Sortirovka po osta4e\n");
       scanf("%d",&p);
       switch (p)
       {
           case 1:
                    {
                        Sort(arr,n);
                        break;
                    }
           case 2:
               {
 
                    sortost(arr,n);
                            break;
               }
       }
 
       for (i=0;i<n;i++)
           printf("%6d %10.2lf %10s\n",arr[i].nomer,arr[i].ostatok,arr[i].tarif); 
       system("pause");
        return 0;
}
1
3 / 3 / 0
Регистрация: 11.12.2011
Сообщений: 88
30.12.2011, 01:51  [ТС] 10
вот сделал точно так как ты, но оно не работает (не сортирует по остатку)

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 <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
struct Abonent
{
    char nomer[11];
    double ostatok;
    char tarif[15];
}arr [5];
 
int load (struct Abonent *arr)
{
    int i=0;
    FILE *f=NULL; 
    f=fopen("D:\Input.txt", "rt");
    if (f==NULL)
    {
        printf ("No file!!!\n");
        exit (0);
    }
    
    for(i=0;i<5;i++)
    {
        fscanf(f,"%s", &arr[i].nomer);
        fscanf(f,"%lf", &arr[i].ostatok);
        fscanf(f,"%s", &arr[i].tarif);
    }
    fclose (f);
 
    return i;
}
 
int sortost (struct Abonent *t, int k)
{
    struct Abonent x;
    int i=0, j=0;
    for(i=0;i<k;i++)
    {
        for(j=0; j<k-1; j++)
        {
            if( t[j].ostatok > t[j+1].ostatok );
            {
                x=t[j];
                t[j]=t[j+1];
                t[j+1]=x;
            }
        }
    }
 
    return 0;
}
 
int sorttar (struct Abonent *arr)
{
    int i=0, j=0;
    char temp [15];
    for (i=0; i<5; i++)
    {
        for (j=0; j<4; j++)
        {
            if (strcmp(arr[j].tarif, arr [j+1].tarif) >0)
            {
                strcpy (temp, arr[j].tarif);
                strcpy (arr[j].tarif, arr[j+1].tarif);
                strcpy (arr[j+1].tarif, temp);
            }
        }
    }
 
    return 0;
}
 
void main (void)
{
    int n=0, i=0,v;
L:  printf("1.load\n2.sortorovka po osratky\n3.sortirovka po tarify\n4.save\n5.exit\n");
    printf ("Input number : ");
    scanf ("%d", &n);
    printf ("\n");
 
    switch (n)
    {
    case 1 : v=load(arr);
             break;
 
    case 2 : sortost (arr,v);
             break;
 
    case 3 : sorttar (arr);
             break;
 
    //case 4 : save ();
             break;
 
    case 5 : exit (0);
             break;
    }
    for (i=0;i<5;i++)
    printf("%s %lf %s\n",arr[i].nomer,arr[i].ostatok,arr[i].tarif);
    printf("\n");
    goto L;
    
}
 
 
/*  for (i=0;i<5;i++)
    printf("%s %lf %s\n",arr[i].nomer,arr[i].ostatok,arr[i].tarif);*/
Добавлено через 1 минуту
может у кого есть ещё идеи по сортировке структуру по числовому полю?

Добавлено через 15 минут
попробывал и так уже, тоже ничего не присходит, компилятор не возражает, но сортировка не происходит(

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int sortost (struct Abonent *t)
{
    struct Abonent x;
    int i=0, j=0;
    for(i=0;i<5;i++)
    {
        for(j=0; j<4; j++)
        {
            if( t[j].ostatok > t[j+1].ostatok );
            {
                x.ostatok=t[j].ostatok;
                t[j].ostatok=t[j+1].ostatok;
                t[j+1].ostatok=x.ostatok;
            }
        }
    }
 
    return 0;
}
Добавлено через 39 минут
Ropsat, сортировка по тарифу тоже не работает, она сортирует, но при этом не просто поле тарифов, не меняя при этом другие поля. Тоесть меняет тарифы(все норм), но другие елементы остаются на местах (номерам получается присваиваются новые тарифы)
0
33 / 33 / 4
Регистрация: 04.03.2011
Сообщений: 67
30.12.2011, 02:09 11
Цитата Сообщение от fors-dnet Посмотреть сообщение
вот сделал точно так как ты, но оно не работает (не сортирует по остатку)

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 <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
struct Abonent
{
    char nomer[11];
    double ostatok;
    char tarif[15];
}arr [5];
 
int load (struct Abonent *arr)
{
    int i=0;
    FILE *f=NULL; 
    f=fopen("D:\Input.txt", "rt");
    if (f==NULL)
    {
        printf ("No file!!!\n");
        exit (0);
    }
    
    for(i=0;i<5;i++)
    {
        fscanf(f,"%s", &arr[i].nomer);
        fscanf(f,"%lf", &arr[i].ostatok);
        fscanf(f,"%s", &arr[i].tarif);
    }
    fclose (f);
 
    return i;
}
 
int sortost (struct Abonent *t, int k)
{
    struct Abonent x;
    int i=0, j=0;
    for(i=0;i<k;i++)
    {
        for(j=0; j<k-1; j++)
        {
            if( t[j].ostatok > t[j+1].ostatok );
            {
                x=t[j];
                t[j]=t[j+1];
                t[j+1]=x;
            }
        }
    }
 
    return 0;
}
 
int sorttar (struct Abonent *arr)
{
    int i=0, j=0;
    char temp [15];
    for (i=0; i<5; i++)
    {
        for (j=0; j<4; j++)
        {
            if (strcmp(arr[j].tarif, arr [j+1].tarif) >0)
            {
                strcpy (temp, arr[j].tarif);
                strcpy (arr[j].tarif, arr[j+1].tarif);
                strcpy (arr[j+1].tarif, temp);
            }
        }
    }
 
    return 0;
}
 
void main (void)
{
    int n=0, i=0,v;
L:  printf("1.load\n2.sortorovka po osratky\n3.sortirovka po tarify\n4.save\n5.exit\n");
    printf ("Input number : ");
    scanf ("%d", &n);
    printf ("\n");
 
    switch (n)
    {
    case 1 : v=load(arr);
             break;
 
    case 2 : sortost (arr,v);
             break;
 
    case 3 : sorttar (arr);
             break;
 
    //case 4 : save ();
             break;
 
    case 5 : exit (0);
             break;
    }
    for (i=0;i<5;i++)
    printf("%s %lf %s\n",arr[i].nomer,arr[i].ostatok,arr[i].tarif);
    printf("\n");
    goto L;
    
}
 
 
/*  for (i=0;i<5;i++)
    printf("%s %lf %s\n",arr[i].nomer,arr[i].ostatok,arr[i].tarif);*/
Добавлено через 1 минуту
может у кого есть ещё идеи по сортировке структуру по числовому полю?

Добавлено через 15 минут
попробывал и так уже, тоже ничего не присходит, компилятор не возражает, но сортировка не происходит(

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int sortost (struct Abonent *t)
{
    struct Abonent x;
    int i=0, j=0;
    for(i=0;i<5;i++)
    {
        for(j=0; j<4; j++)
        {
            if( t[j].ostatok > t[j+1].ostatok );
            {
                x.ostatok=t[j].ostatok;
                t[j].ostatok=t[j+1].ostatok;
                t[j+1].ostatok=x.ostatok;
            }
        }
    }
 
    return 0;
}
Добавлено через 39 минут
Ropsat, сортировка по тарифу тоже не работает, она сортирует, но при этом не просто поле тарифов, не меняя при этом другие поля. Тоесть меняет тарифы(все норм), но другие елементы остаются на местах (номерам получается присваиваются новые тарифы)
Во-первых, посмотри на свой ​​if там где остаток, после него у тебя двоеточие.
Во-вторых, скопируй для сортировки тарифов мой код, у тебя не правильно пишет.
1
3 / 3 / 0
Регистрация: 11.12.2011
Сообщений: 88
30.12.2011, 20:39  [ТС] 12
Ropsat, спасибо большое, я втыкал чёт жестко, точка с запятой после ифа то вообще((. Всё исправил, работает.

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
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
 
struct Abonent
{
    char nomer[11];
    double ostatok;
    char tarif[15];
}arr [5];
 
int load (struct Abonent *arr)
{
    int i=0;
    FILE *f=NULL; 
    f=fopen("D:\Input.txt", "rt");
    if (f==NULL)
    {
        printf ("No file!!!\n");
        exit (0);
    }
    
    for(i=0;i<5;i++)
    {
        fscanf(f,"%s", &arr[i].nomer);
        fscanf(f,"%lf", &arr[i].ostatok);
        fscanf(f,"%s", &arr[i].tarif);
    }
    fclose (f);
 
    return 0;
}
 
int sortost (struct Abonent *t)
{
    struct Abonent x;
    int i=0, j=0;   
    for(i=0;i<5;i++)
    {
        for(j=0; j<4; j++)
        {
            if( t[j].ostatok > t[j+1].ostatok )
            {
                x=t[j];
                t[j]=t[j+1];
                t[j+1]=x;
            }
            
        }
    }
 
    return 0;
}
 
int sorttar (struct Abonent *arr)
{
    int i=0, j=0;
    struct Abonent temp;
    for (i=0; i<5; i++)
    {
        for (j=0; j<4; j++)
        {
            if (strcmp(arr[j].tarif, arr [j+1].tarif) >= 0)
            {
                temp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
            }
        }
    }
 
    return 0;
}
 
void main (void)
{
    int n=0, i=0;
L:  printf("1.load\n2.sortorovka po osratky\n3.sortirovka po tarify\n4.save\n5.exit\n");
    printf ("Input number : ");
    scanf ("%d", &n);
    printf ("\n");
 
    switch (n)
    {
    case 1 : load(arr);
             break;
 
    case 2 : sortost (arr);
             break;
 
    case 3 : sorttar (arr);
             break;
 
    //case 4 : save ();
             break;
 
    case 5 : exit (0);
             break;
    }
    for (i=0;i<5;i++)
    printf("%s %2.2lf %s\n",arr[i].nomer,arr[i].ostatok,arr[i].tarif);
    printf("\n");
    goto L;
    
}
0
2 / 2 / 1
Регистрация: 30.12.2011
Сообщений: 3
02.01.2012, 05:21 13
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
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
 
#define MAX_ABONENTS 100
 
class Abonent{
private:
    char nomer[11];
    float ostatok;
    char tarif[15];
public:
    Abonent(FILE* f){load(f);}
    ~Abonent(){printf("%s %s\n",nomer,tarif);}
 
    void load(FILE* f){fscanf(f,"%s %f %s",&nomer,&ostatok,&tarif);}
    void save(FILE* f){fprintf(f,"%s %f %s\n",nomer,ostatok,tarif);}
 
    void show(){printf("%s\t%f\t%s\n",nomer,ostatok,tarif);}
 
    int ostatokBolshe(Abonent* a){return this->ostatok>a->ostatok;}
    int ostatokMenshe(Abonent* a){return this->ostatok<a->ostatok;}
    int tarifBolshe(Abonent* a){return strcmp(this->tarif,a->tarif)>0;}
    int tarifMenshe(Abonent* a){return strcmp(this->tarif,a->tarif)<0;}
};
 
typedef Abonent* PAbonent;
 
void loadAll(PAbonent *a,int *t,const char *pth){
    FILE* f=fopen(pth,"r");
    while(!feof(f)){
        a[*t]=new Abonent(f);
        (*t)++;
    }
    fclose(f);
}
 
void saveAll(PAbonent *a,int t,const char *pth){
    FILE* f=fopen(pth,"w");
    for(int i=0;i<t;i++)a[i]->save(f);  
    fclose(f);
}
 
void sortOstatok(PAbonent *a,int t){
    int flag=true;
    Abonent *temp;
    while(flag){
        flag=false;
        for(int i=0;i<t-1;i++)
            if(a[i]->ostatokBolshe(a[i+1])){
                flag=true;
                temp=a[i];
                a[i]=a[i+1];
                a[i+1]=temp;
            }
    }
}
 
void sortTarif(PAbonent *a,int t){
    int flag=true;
    Abonent *temp;
    while(flag){
        flag=false;
        for(int i=0;i<t-1;i++)
            if(a[i]->tarifBolshe(a[i+1])){
                flag=true;
                temp=a[i];
                a[i]=a[i+1];
                a[i+1]=temp;
            }
    }
}
 
void showAll(PAbonent *a,int t){
    for(int i=0;i<t;i++){
        printf("%d.",i+1);
        a[i]->show();
    }
}
 
void main(){
    PAbonent abons[MAX_ABONENTS];
    int totalAbons=0;
    int n;
    printf("1.load\n2.sortorovka po ostatky\n3.sortirovka po tarify\n4.save\n5.exit\n");
    while(true){
        printf("Input number: ");
        scanf("%d",&n);
        printf("\n");
     
        switch (n){
            case 1: 
                loadAll(abons,&totalAbons,"D:\\Input.txt");
                showAll(abons,totalAbons);
                break;
            case 2:
                sortOstatok(abons,totalAbons);
                showAll(abons,totalAbons);
                break;
            case 3: 
                sortTarif(abons,totalAbons);
                showAll(abons,totalAbons);
                break;
            case 4: saveAll(abons,totalAbons,"D:\\Result.txt");break;
            case 5: exit(0);break;
        }
    }
}
1
02.01.2012, 05:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.01.2012, 05:21
Помогаю со студенческими работами здесь

Вставить в начало каждой строки файла ее номер и записать преобразованные строки в новый файл
Дан текстовый файл. Вставить в начало каждой строки ее номер и записать преобразованные строки в...

Считать структуру из файла в массив
Здравствуйте, есть такая проблема никак не получается записать в массив созданный файл, делаю это...

Массив считать из файла, отсортировать по возрастанию и записать в новый файл
Создаем текстовый файл из num строК, каждая строка содержит трехразрядное число сгенерированное,...

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


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

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