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

C для начинающих

Войти
Регистрация
Восстановить пароль
 
d3vn
2 / 2 / 3
Регистрация: 18.11.2013
Сообщений: 118
#1

Отсортировать элементы структуры по алфавиту поля "Наименование" - C (СИ)

20.04.2014, 13:41. Просмотров 738. Ответов 10
Метки нет (Все метки)

Всем привет!
Разбираюсь со структурами и стала задача отсортировать элементы структуры по алфавиту поля "Наименование". Понятия не имею, как это сделать...
То есть, например
________________
Было:
Кукуруза Сильпо 15
Петрушка АТБ 5
Морковка Метро 10
_________________
Стало:
Кукуруза Сильпо 15
Морковка Метро 10
Петрушка АТБ 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
#define n 3
 
int main()
{
    int i;
    setlocale(LC_ALL, "Russian");
    struct 
    {
        char item[20];
        char shop[20];
        int price;
    }   goods[n];
    for(i = 0; i < n; i++)
    {
        printf("\nВведите название товара (ENG) № %d: ",i+1);
        scanf("%s",&goods[i].item);
        printf("\nВведите название магазина (ENG) № %d: ",i+1);
        scanf("%s",&goods[i].shop);
        printf("\nВведите стоимость товара № %d: ",i+1);
        scanf("%d",&goods[i].price);
    }
    system("cls");
    printf("   Товар");
    printf("        Магазин");
    printf("        Цена");
    for(i = 0; i < n; i++)
       {
        printf("\n");
        printf("   %s",goods[i].item);
        printf("           %s",goods[i].shop);
        printf("           %d",goods[i].price);
    }
 
    getch();
    return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2014, 13:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отсортировать элементы структуры по алфавиту поля "Наименование" (C (СИ)):

Создать запись "Двигатель", которая содержит элементы "Название", "Мощность", "Скорость", "Цена" - C (СИ)
Создать запись &quot;Двигатель&quot;, которая содержит элементы &quot;Название&quot;, &quot;Мощность&quot;, &quot;Скорость&quot;, &quot;Цена&quot;. На основе записи &quot;Двигатель&quot; создать...

Структуры. Распечатать анкетные данные студентов, обучающихся на "4" и "5" - C (СИ)
Распечатать анкетные данные студентов, обучающихся на &quot;4&quot; и &quot;5&quot;. Заранее спасибо.

Все положительные элементы массива заменить на значение "1", отрицательные на "-1" - C (СИ)
Дана последовательность чисел a (i=1, 2, …, n). Все положительные элементы заменить на значение &quot;1&quot;, отрицательные на &quot;-1&quot;. написал до: ...

Структура "Поезд". Как сделать сортировку по алфавиту в программе - C (СИ)
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #define _CRT_SECURE_NO_WARNINGS typedef struct trains { int...

Ввести структуру "историческое событие" с полями "число", "месяц", "год", "событие" - C (СИ)
Ввести структуру ИСТОРИЧЕСКОЕ СОБЫТИЕ с полями ЧИСЛО, МЕСЯЦ, ГОД, СОБЫТИЕ. Составить и протестировать функции a. ввода исторического...

Подсчитать общее количество вхождений в строку символов "А", "a", "B" и "b" - C (СИ)
#include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;conio.h&gt; main() { int i; int k; char...

10
dimabubyakin
159 / 120 / 44
Регистрация: 16.10.2013
Сообщений: 1,738
Завершенные тесты: 5
20.04.2014, 14:15 #2
Цитата Сообщение от d3vn Посмотреть сообщение
Было:
Кукуруза Сильпо 15
Петрушка АТБ 5
Морковка Метро 10
_________________
Стало:
Кукуруза Сильпо 15
Морковка Метро 10
Петрушка АТБ 5
________________
А как так получилось? Либо я не внимательный, либо у вас нет сортировки
1
d3vn
2 / 2 / 3
Регистрация: 18.11.2013
Сообщений: 118
20.04.2014, 14:16  [ТС] #3
dimabubyakin, это пример того, как нужно сделать))
Сортировки нет, теоретически понимаю, что это можно сделать по кодам символам, но практически ничего не получается
0
dimabubyakin
159 / 120 / 44
Регистрация: 16.10.2013
Сообщений: 1,738
Завершенные тесты: 5
20.04.2014, 14:22 #4
Элементарная сортировка обменами:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
StructName tmp;// временная переменная для обмена нужна, StructName - название вашей структуры
bool f;
do 
    {
    f=false;
    for (int i=0;i<n-1;i++)
    if(a[i]>a[i+1])// a[i] - массив структур, вам соответственно поставить goods[i].[B]items[/B] - то по чем сортируем
        {
        f=true;
        tmp=a[i];
        a[i]=a[i+1];
        a[i+1]=tmp;
        } 
    }
    while(f==true);
};
1
d3vn
2 / 2 / 3
Регистрация: 18.11.2013
Сообщений: 118
20.04.2014, 14:29  [ТС] #5
dimabubyakin, спасибо, буду пробовать!

Добавлено через 7 минут
dimabubyakin,


C
1
2
3
4
5
6
struct Prices
    {
        char item[20];
        char shop[20];
        int price;
    }   goods[n];

Сортировка:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Prices tmp;// временная переменная для обмена нужна, StructName - название вашей структуры
bool f;
do 
    {
    f=false;
    for (int i=0;i<n-1;i++)
    if(goods[i].item > goods[i+1].item)// a[i] - массив структур, вам соответственно поставить goods[i].[B]items[/B] - то по чем сортируем
        {
        f=true;
        tmp =goods[i].item; //отсутствует оператор "=" соответствующий этим операндам
        goods[i].item = goods[i+1].item;// выражение должно быть допустимым для изменения левосторонним значением
        goods[i+1].item = tmp;// выражение должно быть допустимым для изменения левосторонним значением
        } 
    }
    while(f==true);

Ошибки в выделенных строках написал как комментарии. Вы извите за такие вот вопросы на каждом шагу, просто тема вообще для меня незнакомая, а толковой информации что-то не особо.
0
dimabubyakin
159 / 120 / 44
Регистрация: 16.10.2013
Сообщений: 1,738
Завершенные тесты: 5
20.04.2014, 14:59 #6
Вы не поняли суть сортировки,
C++
1
2
3
4
5
6
7
if(goods[i].item > goods[i+1].item)// a[i] - массив структур, вам соответственно поставить goods[i].[B]items[/B] - то по чем сортируем
        {
        f=true;
        tmp =goods[i]; //отсутствует оператор "=" соответствующий этим операндам
        goods[i]= goods[i+1];// выражение должно быть допустимым для изменения левосторонним значением
        goods[i+1] = tmp;// выражение должно быть допустимым для изменения левосторонним значением
        }
Добавлено через 4 минуты
вот смотрите, к примеру у вас есть Группа студентов, и нужно отсортировать их по фамилии, так вот, к примеру попалась такая парочка:
Иванов И.И. и Петров П.П., мы меняем местами не фамилии(как сделали вы), а "объекты", то есть чтобы поменять их местами нам нужна временная переменная tmp(название не имеет значения),
C++
1
2
3
4
5
6
if(stud[i].fam>stud[i+1].fam) 
{
tmp=stud[i];
stud[i]=stud[i+1];
stud[i+1]=tmp;
}
Добавлено через 4 минуты
Если вы не поняли как обмениваются местами элементы, то вот пример: у вас есть 2 ведра краски, ведра пронумерованы , 1 - зеленый , 2 - красный , как поменять их содержимое местами? А вот так, мы возьмем како-нибудь пустое ведро, перельем в него краску из ведра 1, оно у нас станет пустое, затем мы свободно перельем из ведра 2 в ведро 1 краску , ну и соответственно из ведра в которое мы перелили краску из ведра 1 выльем краску в ведро 2. Как-то так)
1
d3vn
2 / 2 / 3
Регистрация: 18.11.2013
Сообщений: 118
20.04.2014, 16:18  [ТС] #7
dimabubyakin, по поводу обмена это я конечно знаю и понимаю.
Просто заминка была именно с объектами и значениями. Ошибок теперь нет, а выводить теперь отсортированную структуру нужно тоже как-то по особому?
Потому что через
C
1
2
3
4
5
6
7
for(i = 0; i < n; i++)
    {
        printf("\n");
        printf("   %s",goods[i].item);
        printf("           %s",goods[i].shop);
        printf("           %d",goods[i].price);
    }
Выводит то же самое
0
dimabubyakin
159 / 120 / 44
Регистрация: 16.10.2013
Сообщений: 1,738
Завершенные тесты: 5
20.04.2014, 16:44 #8
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
#include <stdio.h>
#include <conio.h>
#define n 3
 
int main()
{
    int i;
    struct 
    {
        char item[20];
        char shop[20];
        int price;
    } goods[n],tmp;
    for(i = 0; i < n; i++)
    {
        printf("\nГ*Г*çâГ*Г*ГЁГҐ òîâГ*Г°Г* %d: ",i+1);
        scanf("%s",&goods[i].item);
        printf("\nГЊГ*ГЈГ*çèГ*) ? %d: ",i+1);
        scanf("%s",&goods[i].shop);
        printf("\nÑòîèìîñòü %d: ",i+1);
        scanf("%d",&goods[i].price);
    }
bool f;
do 
    {
    f=false;
    for (int i=0;i<n-1;i++)
    if(goods[i].item[0] > goods[i+1].item[0])// a[i] - ?????? ????????, ??? ?????????????? ????????? goods[i].[B]items[/B] - ?? ?? ??? ?????????
        {
        f=true;
        tmp =goods[i]; //??????????? ???????? "=" ??????????????? ???? ?????????
        goods[i]= goods[i+1];// ????????? ?????? ???? ?????????? ??? ????????? ????????????? ?????????
        goods[i+1] = tmp;// ????????? ?????? ???? ?????????? ??? ????????? ????????????? ?????????
        } 
    }
    while(f==true);
    printf("  Г’ГЋГўГ*Г°");
    printf("        ГЊГ*ГЈГ*çèГ*?");
    printf("        Г–ГҐГ*Г*");
    for(i = 0; i < n; i++)
       {
        printf("\n");
        printf("   %s",goods[i].item);
        printf("           %s",goods[i].shop);
        printf("           %d",goods[i].price);
    }
 
    getch();
    return 0;
}
Добавлено через 40 секунд
Так как мы сортируем текст, нужно было еще так написать
C++
1
if(goods[i].item[0] > goods[i+1].item[0])
1
d3vn
2 / 2 / 3
Регистрация: 18.11.2013
Сообщений: 118
20.04.2014, 21:35  [ТС] #9
dimabubyakin, а такой еще вопрос. Вы не знаете, как можно считать данные из файла и вогнать их в предыдущую структуру? Например, файл:
Товар Магазин Цена
Прод1 Маг1 15
Прод2 Маг2 20
Прод3 Маг3 25

А потом уже их и отсортировать.
Попробовал отделять их табами и соответственно считывать, но каша какая-то выходит, не пойму как из строки вытягивать слова и вставлять их в "ячейки"
0
dimabubyakin
159 / 120 / 44
Регистрация: 16.10.2013
Сообщений: 1,738
Завершенные тесты: 5
21.04.2014, 00:33 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
d3vn, считать данные из файла, затолкать в массив структур, отсортировать и записать обратно? Да можно так сделать

Добавлено через 2 минуты
Вы хотите с текстового файла считывать?

Добавлено через 11 секунд
Или типизированного?

Добавлено через 14 минут
Я вот набросал,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <fstream>
#define n 20
using namespace std;
ifstream fin("d.txt");
struct{
char name[10];
}a[n];
int main()
{
for(int i=0;i<n;i++)
fin>>a[i].name;
for(int i=0;i<n;i++)
cout<<a[i].name<<endl;
system("pause");
}
Считывает данные из файла, если в файле написано так:
The Text
То считает 2 строки, оно считывает до пробела, все что после уже идет в след элемент
1
d3vn
2 / 2 / 3
Регистрация: 18.11.2013
Сообщений: 118
26.04.2014, 14:32  [ТС] #11
dimabubyakin,
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
int main()
{
    int i;
    setlocale(LC_ALL, "Russian");
    struct 
    {
        char item[20];
        char shop[20];
        int price;
    } goods[n],tmp;
FILE *file;
    file = fopen("c:\\1text.txt","r");
    for(int i=0;i<n;i++)
    {
    fscanf(file, "%s", goods[i].item);
    fscanf(file, "%s", goods[i].shop);
    fscanf(file, "%d", goods[i].price);
    }
    for(int i=0;i<n;i++)
    {
    printf("   %s",goods[i].item);
    printf("   %s",goods[i].shop);
    printf("   %d",goods[i].price);
    }
Сделал так, но при запуске ссылается на ошибку:
C
1
2
3
4
if (longone)
                                    *(long UNALIGNED *)pointer = (unsigned long)number;
                                else
                                    *(short UNALIGNED *)pointer = (unsigned short)number;
Файл:
Bash
1
2
3
Moloko METRO 150
Kartoshka ATB 250
Avokado Sushiya 700
Добавлено через 13 минут
dimabubyakin,
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
int main()
{
    int i, j;
    setlocale(LC_ALL, "Russian");
    struct 
    {
        char item[20];
        char shop[20];
        int price;
    } goods[n],tmp;
    i = 0;
    FILE *file;
    file = fopen("c:\\1text.txt","r");
    while(!(feof))
    {
        fscanf(file, "%s %s %d", goods[i].item, goods[i].shop, goods[i].price);
        i++;
    }
    for(j = 0; j < i; j++)
    {
    printf("   %s",goods[j].item);
    printf("   %s",goods[j].shop);
    printf("   %d",goods[j].price);
    }
    getch();
    return 0;
}
Ничего не выводит. Можете подсказать в чем ошибка?
Файл:
C
1
2
3
Moloko METRO 150
Kartoshka ATB 250
Avocado ASHAN 700
Добавлено через 2 часа 45 минут
dimabubyakin, во всем разобрался.
Единственное, можете помочь мне все выводы моей структуры запихнуть в одну функцию?
Типо:
C
1
2
3
4
5
6
7
8
9
10
11
void PrintPriceList(int j, int p, char goods[j].item, char goods[j].shop, char goods[j].price)
{
    for(j = 0; j < p; j++)
        {
            printf("%d.", j + 1);
            printf("  %s",goods[j].item);
            printf("           %s",goods[j].shop);
            printf("           %s",goods[j].price);
            printf("\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
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#include "stdafx.h"
#include "conio.h"
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#include "locale.h"
#define n 20
 
void PrintPriceList(int j, int p, char goods[j].item, char goods[j].shop, char goods[j].price)
{
    for(j = 0; j < p; j++)
        {
            printf("%d.", j + 1);
            printf("  %s",goods[j].item);
            printf("           %s",goods[j].shop);
            printf("           %s",goods[j].price);
            printf("\n");
        }
}
int main()
{
    int i, j, k, p, choose, F, NewN, m;
    bool f;
    setlocale(LC_ALL, "Russian");
    struct Price
    {
        char item[20];
        char shop[20];
        char price[20];
    } goods[n], tmp;
    i = 0;
    FILE *file;
    file = fopen("c:\\1text.txt","r");
    printf("Меню:\n");
    printf("\t1.Дополнить прайс-лист (Файл) и отсортировать\n\t2.Отсортировать исходный прайс-лист (Файл)\n");
    printf("\nВведите пункт меню: ");
    scanf("%d", &choose);
    system("cls");
    switch(choose)
    {
    case 1:
        printf("Введите количество добавляемых позиций: ");
        scanf("%d", &F);
        while(!(feof(file)))
        {
            fscanf(file, "%s %s %s", goods[i].item, goods[i].shop, goods[i].price);
            i++;
        }
        i--;
        p = i;
        printf("\nВ файле имеется %d позиции(ий)", p + 1);
        printf("\n\nВведите:");
        for(k = p + 1; k < F + p + 1; k++)
        {
            printf("\nНазвание товара № %d: ", k + 1);
            scanf("%s", &goods[k].item);
            printf("\nМагазин № %d: ", k + 1);
            scanf("%s", &goods[k].shop);
            printf("\nСтоимость № %d: ", k + 1);
            scanf("%s", &goods[k].price);
        }
        system("cls");
        printf("Новый прайс-лист:\n");
        printf("\n");
        printf("  Товар        Магазин        Цена\n");
        printf("\n");
        for(j = 0; j < F + p + 1; j++)
        {
            printf("%d.", j + 1);
            printf("  %s",goods[j].item);
            printf("           %s",goods[j].shop);
            printf("           %s",goods[j].price);
            printf("\n");
        }
        m = F + p + 1;
        printf("\n");
        printf("Данные с клавиатуры введены для следующих товаров:\n");
        printf("\n");
        printf("  Товар        Магазин        Цена\n");
        printf("\n");
        for(j = p + 1; j < F + p + 1; j++)
        {
            printf("%d.", j - p);
            printf("  %s",goods[j].item);
            printf("           %s",goods[j].shop);
            printf("           %s",goods[j].price);
            printf("\n");
        }
        do 
        {
            f = false;
            for (int j = 0; j < m - 1; j++)
            {
                if(goods[j].item[0] > goods[j+1].item[0])
                {
                    f = true;
                    tmp = goods[j]; 
                    goods[j]= goods[j+1];
                    goods[j+1] = tmp;
                } 
            }
        } while(f==true);
        printf("\n");
        printf("Прайс-лист после сортировки:\n");
        printf("\n");
        printf("  Товар        Магазин        Цена\n");
        printf("\n");
        for(j = 0; j < F + p + 1; j++)
        {
            printf("%d.", j + 1);
            printf("  %s",goods[j].item);
            printf("           %s",goods[j].shop);
            printf("           %s",goods[j].price);
            printf("\n");
        }
        fclose(file);
        file = fopen("c:\\1text.txt","w");
        for(i = 0; i < F + p + 1; i++)//Запись в файл
        {
            fprintf(file, "%s %s %s\n", goods[i].item, goods[i].shop, goods[i].price);
        }
        break;
    case 2:
        while(!(feof(file)))
        {
            fscanf(file, "%s %s %s", goods[i].item, goods[i].shop, goods[i].price);
            i++;
        }
        i--;
        p = i;
        printf("\nВ файле имеется %d позиции(ий)", p + 1);
        printf("Исходный прайс-лист:\n");
        printf("\n");
        printf("  Товар        Магазин        Цена\n");
        printf("\n");
        for(j = 0; j < p; j++)
        {
            printf("%d.", j + 1);
            printf("  %s",goods[j].item);
            printf("           %s",goods[j].shop);
            printf("           %s",goods[j].price);
            printf("\n");
        }
        do 
        {
            f = false;
            for (int j = 0; j < p - 1; j++)
            {
                if(goods[j].item[0] > goods[j+1].item[0])
                {
                    f = true;
                    tmp = goods[j]; 
                    goods[j]= goods[j+1];
                    goods[j+1] = tmp;
                } 
            }
        } while(f==true);
        printf("\n");
        printf("Прайс-лист после сортировки:\n");
        printf("\n");
        printf("  Товар        Магазин        Цена\n");
        printf("\n");
        for(j = 0; j < p; j++)
        {
            printf("%d.", j + 1);
            printf("  %s",goods[j].item);
            printf("           %s",goods[j].shop);
            printf("           %s",goods[j].price);
            printf("\n");
        }
        fclose(file);
        file = fopen("c:\\1text.txt","w");
        for(j = 0; j < p; j++)
        {
            fprintf(file, "%s %s %s\n", goods[j].item, goods[j].shop, goods[j].price);
        }
        break;
    }
    getch();
    return 0;
}
Спасибо.
0
26.04.2014, 14:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2014, 14:32
Привет! Вот еще темы с ответами:

Отсортировать структуры по возрастанию значения поля nomer - C (СИ)
программирую в Pelles C for Windows 3.00.4 в общем мне надо ввести кол-во записей, отсортировать их по возрастанию значения поля nomer...

"Перевернуть" в строке все слова (Например: "Жили были" в "илиЖ илыб") - C (СИ)
&quot;Перевернуть&quot; в строке все слова. (Например: &quot;Жили были дед и баба&quot; - &quot;илиЖ илиб дед и абаб&quot;)

Функция замены ":" на "_" в названии файла и ошибка "undefined reference to 'strcat'" - C (СИ)
Добрый день,прошу помочь мне с такой проблемой: В общем есть функция,работающая с именем файла,которая меняет в имени файла &quot;:&quot; на &quot;_&quot; ...

Подсчитать количество сдвоенных символов "сс", "нн", "лл" в тексте, расположенном в текстовом файле - C (СИ)
Пожалуйста) Подсчитать количество сдвоенных символов сс, нн, лл в тексте, расположенном в текстовом файле.


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

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

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