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

Не получается отсортировать рабочий график - C++

Восстановить пароль Регистрация
 
Bioflame
0 / 0 / 0
Регистрация: 28.08.2012
Сообщений: 4
28.08.2012, 21:48     Не получается отсортировать рабочий график #1
Нужно чтобы программа могла читать рабочии графики контор 2х видов:
Стандартный E 10-19, T 10-19, K 10-19, N 10-19, R 10-19, L 10-17
Укороченный E-R 10-19, L 10-17
В добавок дни, когда контора закрыта, должны быть тоже помечены.

У меня не получается скомпилировать программу. Пишет, что я сравниваю подписанные и неподписанные интеджеры. Я не очень понимаю в чем дело, нужна помощь.

Вот код:
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 <iostream>
#include <fstream>
#include <vector>
#include <stdlib.h>
 
using namespace std;
 
ifstream in;
 
void date_sort(string);
void dayandtime(string tooaeg[]);
 
int main()
{
string filename;
    do{
        cout<<"What file would you like to load? ";
        getline(cin,filename);
        in.open(filename.c_str(), ios::in);
        if (!in)
        {
            cerr<<"Couldn't open file ("<<filename<<"). Please, try again.\n";
        }
    }while (!in);
    while(in.good())
    {
    string line;
    getline(in,line);
    date_sort(line);
    }
    in.close();
}
void date_sort(string line)
{
    int i=0;//указатель на букву в строке
        int pos=0;
        string tooaeg[7];//дни недели
        int day=0;
        while(i<line.length()){
        switch(line[i]){
            case ',':
            pos++;
            break;
            default:
            if(tooaeg[pos]==" "){//убираем пробелы вначале
                tooaeg[pos]=line[i];
            }
            else{//прибавляем по букве
                tooaeg[pos].append(line,i, 1);
            }
            break;
        }
        i++;
    }
    dayandtime(tooaeg);
}
void dayandtime(string tooaeg[])
{
    string week[7]="ETKNRLP";   //Дни недели
    int i=0;
    int first=0;
    int second=0;
    while(i<7)
    {
        string str=tooaeg[i];
        for(int g=0;g<str.size();g++)
                {
                    if (isdigit(str[3]))
                    {
                        cout<<"normal day"<<endl;
                        break;
                    }
                    else
                    {
                        for(int j=0; j<7; j++)
                        {
                            if(str[0]==week[j]){first=j;}
                            if(str[2]==week[j]){second==j;}
                            if(first!=0 && second!=0)
                            {
                                for(int k=0; k<second-first+1;k++)
                                {
                                    cout<<"complex day"<<endl;
                                }
                            }
                        }
                        break;
                    }
                }
        if(str==""){cout<<"empty string"<<endl;}
        i++;
    }
}
Ошибка в цикле с 76й строки.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Roof
 Аватар для Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
29.08.2012, 08:37     Не получается отсортировать рабочий график #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
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
#include <iostream>
#include <fstream>
//#include <vector> это не используется
//#include <stdlib.h> и это тоже
 
using namespace std;
 
ifstream in;
 
void date_sort( string );
void dayandtime( string tooaeg[] );
 
int main() {
    string filename;
    do {
        cout << "What file would you like to load? ";
        getline( cin, filename );
        in.open( filename.c_str(), ios::in );
        if ( !in ) {
            cerr << "Couldn't open file (" << filename << "). Please, try again.\n";
        }
    } while ( !in );
    while ( in.good() ) {
        string line;
        getline( in, line );
        date_sort( line );
    }
    in.close();
    return 0;
}
void date_sort( string line ) {
    //int i=0;//указатель на букву в строке  //заменил
    string::size_type i = 0;
    int pos = 0;
    string tooaeg[ 7 ]; //дни недели
    //int day=0; // это зачем нужно?
    while ( i < line.length() ) {
        switch ( line[ i ] ) {
        case ',':
            pos++;
            break;
        default:
            if ( tooaeg[ pos ] == " " ) { //убираем пробелы вначале
                tooaeg[ pos ] = line[ i ];
            } else { //прибавляем по букве
                tooaeg[ pos ].append( line, i, 1 );
            }
            break;
        }
        i++;
    }
    dayandtime( tooaeg );
}
void dayandtime( string tooaeg[] ) {
    string week[ 7 ] = "ETKNRLP"; //Дни недели 
    // массив из 7 элементов типа string
    // причем week[ 0 ] == "ETKNRLP" и week[ any ] == "ETKNRLP", проверял на компиляторе g++
    // таким образом лучше не делать, думаю, что Вы подразумевали другое.
    int i = 0;
    int first = 0;
    int second = 0;
    while ( i < 7 ) {
        string str = tooaeg[ i ];
        //for ( int g = 0; g < str.size(); g++ ) { //заменил
        for ( string::size_type g = 0; g < str.size(); g++ ) {
            if ( isdigit( str[ 3 ] ) ) {
                cout << "normal day" << endl;
                break;
            } else {
                for ( int j = 0; j < 7; j++ ) {
                    // str[ 0 ] это символ, а week[ j ] это string - потому и нельзя сравнить
                    // думайте, что исправить
                    if ( str[ 0 ] == week[ j ] ) {
                        first = j;
                    }
                    if ( str[ 2 ] == week[ j ] ) { // аналогично
                        second == j; // думаю подразумевается second = j
                    }
                    if ( first != 0 && second != 0 ) {
                        for ( int k = 0; k < second - first + 1; k++ ) {
                            cout << "complex day" << endl;
                        }
                    }
                }
                break;
            }
        }
        if ( str == "" ) {
            cout << "empty string" << endl;
        }
        i++;
    }
 
}
Вот для проверки еще поглядите пример. Думаю, что станет понятней.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
 
int main() {
    string week[ 7 ] = "ETKNRLP"; //Дни недели
    cout << week[ 0 ] << endl;
    cout << week[ 1 ] << endl;
    cout << week[ 5 ] << endl;
    
    return 0;
}
Bioflame
0 / 0 / 0
Регистрация: 28.08.2012
Сообщений: 4
29.08.2012, 09:31  [ТС]     Не получается отсортировать рабочий график #3
Спасибо за ответ. Да есть некоторые недочеты.
vector у меня используется, просто в этом куске программы его нет, забыл убрать. Так вообще у меня ведется полный учет контор в вектор.

Понял ошибку насчет массива строк, я 7 раз одно и то же записывал получается.

Изначально я делал так char week[]="ETKNRLP", но что-то у меня тоже не вышло. Посижу, подумаю.

1 Вопрос. Не могли бы вы пожалуйста объяснить этот момент: string::size_type i = 0; // string::size_type g = 0;
Roof
 Аватар для Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
29.08.2012, 09:38     Не получается отсортировать рабочий график #4
Bioflame, Если Вы уже используете контейнеры, то я порекомендую вовсе отказатьсяот массивов в пользу векторов или других контейнеров, в зависимости от задачи.
Bioflame
0 / 0 / 0
Регистрация: 28.08.2012
Сообщений: 4
29.08.2012, 09:48  [ТС]     Не получается отсортировать рабочий график #5
Может я не правильно мыслю, но на данный момент выглядит так.
Есть список:
Jarve kontor Pдrnu mnt. 234/238, 11624 Tallinn Tel 665 5100 E 10-19, T 10-19, K 10-19, N 10-19, R 10-19, L 10-17
Kristiine kontor Endla 45, 10615 Tallinn Tel 665 5100 E 10-20, T 10-20, K 10-20, N 10-20, R 10-20, L 10-17, P 10-15
Lasnamae Centrumi kontor Mustakivi tee 13, 13912 Tallinn Tel 665 5100 E 10-20, T 10-20, K 10-20, N 10-20, R 10-20, L 10-17, P 10-15

__________
Плюс, есть еще укороченный рабочик график у других контор. Я все данные записываю в вектор. А внутри вектора у меня есть еще отдельный массив из 7ми элементов для расписания.
Roof
 Аватар для Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
29.08.2012, 10:21     Не получается отсортировать рабочий график #6
Поясняю насчет string::size_type.
Функция size возвращает тип size_type, а не int. Ведь размер строки может не уместиться в int, так как диапазон значений начинается с отрицательного числа, далеко от нуля.
size_type - это вспомогательный тип данных, определенный в классе string и в некоторых других библиотечных типах. Он является беззнаковым типом. Размер ведь не может быть отрицательный.
Этот вспомогательный тип позволяет использовать библиотечные типы машинно-независмым способом.
size_type определен как синоним unsigned, unsigned int или unsigned long т.е. как гарантированно большой чтобы содержать размер любой строки.
string::size_type - применяется оператор видимости :: - указывающий на то, что имя size_type определено именно в классе string.

В общем, использовать знаковые типы данных там где нужные беззнаковые - не стоит, так как это может привести в лучшем случае к warning сообщениям компилятора, а в худшем к ошибкам времени выполнения.

Добавлено через 16 минут
Думаю, что Вам нужно организовать свой тип данных и объявить вектор с элементами этого типа.

Добавлено через 6 минут
А по какому критерию Вам необходима сортировка данного списка?
Bioflame
0 / 0 / 0
Регистрация: 28.08.2012
Сообщений: 4
29.08.2012, 10:26  [ТС]     Не получается отсортировать рабочий график #7
Пользователь может спросить просто расписание конкретной конторы и получит ответ в стиле:
Контора 1, местонахождения
пон 11-17
вт 10-17
....
воск закрыто

Или пользователь может сделать запрос на определенный день и время и проверить, какая контора работает в это время и работает ли вообще.

Вот я и думал, что будет очень удобно сделать массив из 7ми элементов внутри вектора, где будет храниться время.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2012, 11:03     Не получается отсортировать рабочий график
Еще ссылки по теме:

C++ Скрипты на рабочий стол
Сделал рабочий код C++
Отсортировать массив по убыванию, затем добавить недостающий элемент и отсортировать массив по возрастанию C++

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

Или воспользуйтесь поиском по форуму:
Roof
 Аватар для Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
29.08.2012, 11:03     Не получается отсортировать рабочий график #8
Лучше использовать ООП для данной задачи. Это удобней будет.
Yandex
Объявления
29.08.2012, 11:03     Не получается отсортировать рабочий график
Ответ Создать тему
Опции темы

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