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

из 4 функций сделать одну - C++

Восстановить пароль Регистрация
 
dmmax
 Аватар для dmmax
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 81
01.12.2012, 19:43     из 4 функций сделать одну #1
Помогите пожалуйста из 4 функций сортировки сделать одну, но чтобы работала на все Заранее благодарен.
вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "module.h"
 
void sortCheck(Books* mas, int& size){
    bool flag;
    do{
        flag = false;
        for(int i = 0; i < size - 1; ++i)
            if(mas[i].check < mas[i + 1].check){
                Books tmp;
                tmp = mas[i];
                mas[i] = mas[i + 1];
                mas[i + 1] = tmp;
                flag = true;
            }
    }while(flag);
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "module.h"
 
void sortPrice(Books* mas, int& size){
    bool flag;
    do{
        flag = false;
        for(int i = 0; i < size - 1; ++i)
            if(mas[i].price < mas[i + 1].price){
                Books tmp;
                tmp = mas[i];
                mas[i] = mas[i+1];
                mas[i+1] = tmp;
                flag = true;
            }
    }while(flag);
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "module.h"
 
void sortTNOP(Books* mas, int& size){
    bool flag;
    do{
        flag = false;
        for(int i = 0;i < size - 1; ++i)
            if(mas[i].tnop < mas[i+1].tnop){
                Books tmp;
                tmp = mas[i];
                mas[i] = mas[i+1];
                mas[i + 1] = tmp;
                flag = true;
            }
    }while(flag);
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "module.h"
#include <string.h>
 
void sortWriters(Books* mas, int& size){
    bool flag;
    do{
        flag = false;
        for(int i = 0;i < size - 1; ++i)
            if((strcmp(mas[i].writers, mas[i+1].writers)) == 1){
                Books tmp;
                tmp = mas[i];
                mas[i] = mas[i + 1];
                mas[i + 1] = tmp;
                flag = true;
            }
    }while(flag);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Diemon
17 / 5 / 2
Регистрация: 13.09.2011
Сообщений: 24
01.12.2012, 20:03     из 4 функций сделать одну #2
Достаточно не просто делать что - либо без конечного проекта. Код не компилировался, но, по идее, должен работать.

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
#include "module.h"
#include <string.h>
 
void sort(Books* mas, int& size, const char* param){
    bool flag;
    switch(param){
    case "check":
        do{
            flag = false;
            for(int i = 0; i < size - 1; ++i)
                if(mas[i].check < mas[i + 1].check){
                    Books tmp;
                    tmp = mas[i];
                    mas[i] = mas[i + 1];
                    mas[i + 1] = tmp;
                    flag = true;
                }   
        }while(flag);
    break;
        
    case "price":
        do{
            flag = false;
            for(int i = 0; i < size - 1; ++i)
                if(mas[i].price < mas[i + 1].price){
                    Books tmp;
                    tmp = mas[i];
                    mas[i] = mas[i+1];
                    mas[i+1] = tmp;
                    flag = true;
                }
        }while(flag);
    break;
        
    case "TNOP":
        do{
            flag = false;
            for(int i = 0;i < size - 1; ++i)
                if(mas[i].tnop < mas[i+1].tnop){
                    Books tmp;
                    tmp = mas[i];
                    mas[i] = mas[i+1];
                    mas[i + 1] = tmp;
                    flag = true;
                }
        }while(flag);
    break;
        
    case "writers":
        do{
            flag = false;
            for(int i = 0;i < size - 1; ++i)
                if((strcmp(mas[i].writers, mas[i+1].writers)) == 1){
                    Books tmp;
                    tmp = mas[i];
                    mas[i] = mas[i + 1];
                    mas[i + 1] = tmp;
                    flag = true;
                }
        }while(flag);
    break;
    }
}
dmmax
 Аватар для dmmax
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 81
01.12.2012, 20:05  [ТС]     из 4 функций сделать одну #3
Я конечно могу его скинуть полностью, но слишком много будет кодов. Если надо, давайте я полностью скину.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
01.12.2012, 20:14     из 4 функций сделать одну #4
Первое, что в голову лезет - передавать в качестве 3 аргумента в функцию параметр, ну а далее switch-ем обрабатывать.
Diemon
17 / 5 / 2
Регистрация: 13.09.2011
Сообщений: 24
01.12.2012, 20:16     из 4 функций сделать одну #5
Цитата Сообщение от dmmax Посмотреть сообщение
Я конечно могу его скинуть полностью, но слишком много будет кодов. Если надо, давайте я полностью скину.

Ну, вы посмотрите данный код, подходит он вам или нет, проверьте ошибки.
dmmax
 Аватар для dmmax
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 81
01.12.2012, 20:28  [ТС]     из 4 функций сделать одну #6
Кликните здесь для просмотра всего текста
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
#include "module.h"
#include <conio.h>
 
char printMenu(int n){
    switch(n)
        {
        case 0:
            cout << "\n1. Показ массива на экран." << endl;
            cout << "2. Сортировка." << endl;
            cout << "3. Показ вверху списка рекомендованные книги." << endl;
            cout << "0. Выход." << endl;
            break;
        case 1:
            cout << "\n1. Показ таблицы полностью." << endl;
            cout << "2. Показ таблиц, только k строк." << endl;
            cout << "3. Ручное заполнение работы." << endl;
            cout << "0. Выход в главное меню." << endl;
            break;
        case 2:
            cout << "1. По количеству страниц." << endl;
            cout << "2. По Автору." << endl;
            cout << "3. По названию." << endl;
            cout << "4. По цене." << endl;
            cout << "0. Выход в главное меню." << endl;
            break;
        case 4:
            break;
        }
    char fmenu = getch();
    return fmenu;
}
= printmenu
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "module.h"
void printText(Books* mas, int& size){
    if(mas != NULL){
        system("cls");
        cout <<"№:--Страниц:-------Автор------------Проиизведение----Цена---Рекомендация\n";
 
        for(int i = 0;i < size; ++i){
           printf("%02d.|%-15d|%-15s|%-16s|%4d| %s\n",i + 1, mas[i].tnop, mas[i].writers, mas[i].product, mas[i].price,
               mas[i].check ? "Да" : "Нет");
        cout << "-----------------------------------------------------------------------\n";
        }
    }
}
= printtext
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "module.h"
 
void sortCheck(Books* mas, int& size){
    bool flag;
    do{
        flag = false;
        for(int i = 0; i < size - 1; ++i)
            if(mas[i].check < mas[i + 1].check){
                Books tmp;
                tmp = mas[i];
                mas[i] = mas[i + 1];
                mas[i + 1] = tmp;
                flag = true;
            }
    }while(flag);
}
= sortCheck

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "module.h"
void sortPrice(Books* mas, int& size){
    bool flag;
    do{
        flag = false;
        for(int i = 0; i < size - 1; ++i)
            if(mas[i].price < mas[i + 1].price){
                Books tmp;
                tmp = mas[i];
                mas[i] = mas[i+1];
                mas[i+1] = tmp;
                flag = true;
            }
    }while(flag);
}
= sortPrice

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "module.h"
#include <string.h>
void sortProduct(Books* mas, int& size){
    bool flag;
    do{
        flag = false;
        for(int i = 0; i < size - 1; ++i)
            if((strcmp(mas[i].product, mas[i+1].product)) == 1){
                Books tmp;
                tmp = mas[i];
                mas[i] = mas[i+1];
                mas[i+1] = tmp;
                flag = true;
            }
    }while(flag);
}
= sortProduct

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "module.h"
void sortTNOP(Books* mas, int& size){
    bool flag;
    do{
        flag = false;
        for(int i = 0;i < size - 1; ++i)
            if(mas[i].tnop < mas[i+1].tnop){
                Books tmp;
                tmp = mas[i];
                mas[i] = mas[i+1];
                mas[i + 1] = tmp;
                flag = true;
            }
    }while(flag);
}
= sortTNOP

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "module.h"
#include <string.h>
 
void sortWriters(Books* mas, int& size){
    bool flag;
    do{
        flag = false;
        for(int i = 0;i < size - 1; ++i)
            if((strcmp(mas[i].writers, mas[i+1].writers)) == 1){
                Books tmp;
                tmp = mas[i];
                mas[i] = mas[i + 1];
                mas[i + 1] = tmp;
                flag = true;
            }
    }while(flag);
}
= sortWriters

Кликните здесь для просмотра всего текста
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
/*Книги: автор, наименование, количество страниц, цена. Дополнить вывод рекомендацией 
книг, которые можно прочитать за один вечер (количество страниц меньше 100).*/
#include "module.h"
#include <conio.h>
#include <windows.h>
 
#define CRTDBG_MEM_ALLOC
#include <crtdbg.h>
 
 
int main()
{
    _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int size = 0;
    char menu;
    Books* mas = NULL;
    do{
        menu = printMenu(0);
        switch(menu){
            case '1': // Показ массива на экран
                {
                    system("cls");
                    char submenu;
                    do{
                        submenu = printMenu(1);
                        switch(submenu){
                            system("cls");
                            case '1':  // Показ таблицы полностью
                                textFileAll(mas, size);
                                printText(mas, size);
                                break;
                            case '2':  // Показ таблицы, только k строк
                                textFile(mas, size);
                                printText(mas, size);
                                break;
                            case '3':  // Ручное заполнение таблицы.
                                textByHund(mas, size);
                                printText(mas, size);
                                break;
 
                            case '0':   //Выход в главное меню
                                system("cls");
                                break;
                            default:
                                {
                                    system("cls");
                                    cout << "\n Вы ввели неверный пункт меню!" << endl;
                                }
                        }
                    }while(submenu != '0');
                }
                break;
            case '2': //Сортировка
                {
                   system("cls");
                   char submenu;
                   do{
                       submenu = printMenu(2);
                       switch(submenu){
                            case '1':      // sortTNOP
                                sortTNOP(mas, size);
                                printText(mas, size);
                                break;
                            case '2':     // sortWriters
                                sortWriters(mas, size);
                                printText(mas, size);
                                break;
                            case '3':     // sortProduct
                                sortProduct(mas, size);
                                printText(mas, size);
                                break;
                            case '4':     // sortPriece
                                sortPrice(mas, size);
                                printText(mas, size);
                                break;
                            case '0':     //exit
                                system("cls");
                                break;
                            default:
                                {
                                    system("cls");
                                    cout << "\nВы ввели неверный пункт меню!" << endl;
                                }
                       }
 
                   }while(submenu != '0');
                }
                break;
            case '3':  //Показ рекомендованных книг.
                {
                    system("cls");
                    sortCheck(mas, size);
                    printText(mas, size);
                }
                break;
            case '0':
                break;
            default:
                {
                    system("cls");
                    cout << "Вы ввели неверный пункт меню!" << endl;
                }
        }
 
    }while(menu != '0');
 
    if(mas != 0){
        delete [] mas;
    }
    return 0;
}
= struct.cpp
Кликните здесь для просмотра всего текста
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
#include "module.h"
#include <conio.h>
void textByHund(Books*& mas, int& size){
    system("cls");
 
    int number;
    do{
        cout << "\nСколько книг будем задавать?" << endl;
        cout << "Число книг: " ;
        cin >> number;
 
        if(number <= 0)
            cout << "Число, задаваемых книг, должно быть > 0!" << endl;
    }while(number <= 0);
 
    mas = new Books[size + number];
    for(int i = 0; i < size; ++i)
        mas[i] = mas[i];
 
    for(int i = size; i < size + number; ++i){
        system("cls");
        cout << endl;
 
        cout << "Введите кол-во строк в книге: ";
        cin >> mas[i].tnop;
 
        cout << "Введите автора книги: ";
        cin >> mas[i].writers;
 
        cout << "Введите название книги: ";
        cin >> mas[i].product;
 
        cout << "Введите цену книги: ";
        cin >> mas[i].price;
 
        mas[i].check = false;
    }
    system ("clr");
 
    for(int i = size;i < size + number; ++i){
       if(mas[i].tnop < 100)
           mas[i].check = true;
       else if (mas[i].tnop > 100)
           mas[i].check = false;
    }
}
= textByHand
Кликните здесь для просмотра всего текста
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
#include "module.h"
 
void textFile(Books*& mas, int& size){
    system("cls");
 
    FILE* in;
 
    if(mas != NULL)
        delete [] mas;
 
    do{
        cout << "\n Введите количество рабочих: ";
        cin >> size;
 
        if(size <= 0)             
            cout << "Количество рабочих не может быть <= 0!" << endl;
    }while(size <= 0);
 
    system("cls");
 
    if((in = fopen("BookBase.txt", "r")) != NULL){
        mas = new Books[size];
        int i = 0;
        while(i < size){
            fscanf(in, "%d %s %s %d ", &mas[i].tnop, &mas[i].writers, &mas[i].product, &mas[i].price);
            ++i;
        }
    for(int i = 0;i < size; ++i){
       if(mas[i].tnop < 100)
           mas[i].check = true;
       else if (mas[i].tnop > 100)
           mas[i].check = false;
    }
    fclose(in);
    }
    else
        cout << "Файла с базой в папке нету!" << endl;
}
= textFile
Кликните здесь для просмотра всего текста
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
#include "module.h"
 
void textFileAll(Books*& mas, int& size){ 
    system("cls");
 
    FILE* in;
 
    if(mas != NULL)
        {
 
        delete [] mas;
        mas = NULL;
        }
 
    if((in = fopen("BookBase.txt", "r")) != NULL){
        size = 0;
       
        int i = 0;
        while(!feof(in)){
            Books b;
            fscanf(in, "%d %s %s %d", &b.tnop, &b.writers, &b.product, &b.price);
 
            b.check = false;
            if (b.tnop <= 100) 
                b.check = true; 
            
            if(feof(in))
            {
                break;
            }
 
            Books* tmp = new Books[size + 1];
            for(int j = 0;j < size; ++ j)
                tmp[j] = mas[j];
                    
            if (mas != NULL)
                delete [] mas;
            mas = tmp;
            mas[size] = b;
            ++size;
            ++i;
        }
 
        fclose(in);
    }
    else
        cout << "Файла с базой в папке нету!" << endl;
}
= textFileAll
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
 
struct Books{
    int tnop; // the number of pages - кол-во строк
    char writers[15]; // писатели
    char product[15]; // произведение
    int price;             //цена
    bool check;                  //проверка
};
char printMenu(int n);
void setStaff(Books*& mas, int& size);
void printText(Books* mas, int& size);
void textFile(Books*& mas, int& size);
void textFileAll(Books*& mas, int& size);
void textByHund(Books*& mas, int& size);
void sortTNOP(Books* mas, int& size);
void sortWriters(Books* mas, int& size);
void sortProduct(Books* mas, int& size);
void sortPrice(Books* mas, int& size);
void sortCheck(Books* mas, int& size);


BookBase.txt:

Кликните здесь для просмотра всего текста
267 Коэльо Алхимик 786
1222 Страуструп Программирование 2500
56 Петров Зима 101
34 Твардовский Тёркин 387
23 Пушкин Выстрел 888
116 Лермонтов Демон 546
312 Толстой Воскресенье 777
99 Есенин Пугачёв 345
567 Гёте Фауст 999


Добавлено через 6 минут
Просто я ваш код не понял с кейсами...
Diemon
17 / 5 / 2
Регистрация: 13.09.2011
Сообщений: 24
01.12.2012, 20:46     из 4 функций сделать одну #7
Цитата Сообщение от dmmax Посмотреть сообщение
Просто я ваш код не понял с кейсами...
Все достаточно просто, вы передаёте в функцию всё те же массивы, и параметр, по которому будет ориентироваться case, таким образом, совмещены все ваши функции сортировки в одну.

Кликните здесь для просмотра всего текста
Но опять же, есть ли смысл в том, чтобы делать столь большую функцию?
dmmax
 Аватар для dmmax
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 81
01.12.2012, 20:49  [ТС]     из 4 функций сделать одну #8
Цитата Сообщение от Diemon Посмотреть сообщение
Все достаточно просто, вы передаёте в функцию всё те же массивы, и параметр, по которому будет ориентироваться case, таким образом, совмещены все ваши функции сортировки в одну.

Кликните здесь для просмотра всего текста
Но опять же, есть ли смысл в том, чтобы делать столь большую функцию?
я понимаю, что можно всё в одну функцию так же запихать, но куда же понятней будет, если они по разным будут функциям, разве нет? не понимаю, почему учителю не понравилось разбитая сортировка. хоть и одинаковая.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
01.12.2012, 20:55     из 4 функций сделать одну #9
Цитата Сообщение от dmmax Посмотреть сообщение
не понимаю, почему учителю не понравилось разбитая сортировка. хоть и одинаковая.
много копирайта
dmmax
 Аватар для dmmax
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 81
01.12.2012, 20:59  [ТС]     из 4 функций сделать одну #10
Цитата Сообщение от MrGluck Посмотреть сообщение
много копирайта
зато читабельность не пропадает просто другой сортировки не смог придумать
Diemon
17 / 5 / 2
Регистрация: 13.09.2011
Сообщений: 24
01.12.2012, 21:04     из 4 функций сделать одну #11
Цитата Сообщение от dmmax Посмотреть сообщение
я понимаю, что можно всё в одну функцию так же запихать, но куда же понятней будет, если они по разным будут функциям, разве нет? не понимаю, почему учителю не понравилось разбитая сортировка. хоть и одинаковая.
Ещё попробуйте воспользоваться функцией std::swap, позволит вам не пользоваться "tmp" и шикарно меняет местами любые переменные.
Собственно и копирайты пропадут, если ей воспользоваться.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2012, 14:48     из 4 функций сделать одну
Еще ссылки по теме:

C++ Как сделать чтобы при компиляции cin>>a>>b>>c; вводить можно было в одну строку?
Можно ли сделать список вызова функций? C++
Программа не выполняет одну из функций C++

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

Или воспользуйтесь поиском по форуму:
dmmax
 Аватар для dmmax
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 81
03.12.2012, 14:48  [ТС]     из 4 функций сделать одну #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
#include "module.h"
 
bool compare(Books* b1, Books* b2, char field)
{
    switch(field)
    {
        case '1':      // sortTNOP
            return b1->tnop > b2->tnop;
        case '2':     // sortWriters
            return strcmp(b1->writers, b2->writers) > 0;
        case '3':     // sortProduct
            return strcmp(b1->product, b2->product) > 0;
        case '4':     // sortPriece
            return b1->price > b2->price;
        case '5':
            return b1->check > b2->check;
 
    }
    return false;
}
 
void sort(Books* mas, int size, char field)
{
    bool flag;
    do{
        flag = false;
        for(int i = 0; i < size - 1; ++i)
            if(compare(&mas[i], &mas[i+1], field)){
                Books tmp;
                tmp = mas[i];
                mas[i] = mas[i+1];
                mas[i+1] = tmp;
                flag = true;
            }
    }while(flag);
}


заместо тех 5 сортировок, всё в двух функциях. очень удобно
Yandex
Объявления
03.12.2012, 14:48     из 4 функций сделать одну
Ответ Создать тему
Опции темы

Текущее время: 05:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru