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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.80
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
#1

Программа для создания словаря - C++

29.07.2012, 15:35. Просмотров 2648. Ответов 24
Метки нет (Все метки)

Словарь представляет из себя любые слова и их ID.Я сделал класс Dictionary и методы этого класса для работы со словарём,однако возникла проблема с записью данных(проблема где-то в функции WriteID),но в чём дело не пойму.
0
Вложения
Тип файла: rar Архив WinRAR.rar (3.4 Кб, 81 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2012, 15:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа для создания словаря (C++):

Использование контейнера set для создания словаря - C++
Всем привет. Прошу помощи с программой. Само задание: Написать программу «Англо - русский и русско - английский словарь». «База данных»...

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

Программа для создания анаграм - C++
Помогите, пожалуйста! Знаю, мозговитых людей здесь много... Думаю, кто-нибудь заинтересуется Суть программы в том, чтобы создать...

Программа для создания матриц - C++
Задание прикреплено в файле. Вот что я смог написать, прошу, чем проще, тем лучше. лучше с объяснениями. Заранее спасибо) #include...

Программа для создания и управления порталом (наподобие siteedit) - C++
Здравствуйте! Нужно сделать прогу для создания и управления порталом за основу можно взять прогу siteedit (http://siteedit.ru/) ...

программа по созданию словаря - C++
Очень нужна помощь...Такое задание:Карточка иностранного слова представляет собой структуру, содержащую иностранное слово и его перевод....

24
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
29.07.2012, 16:01 #2
Не понимаю, чего Вы хотите добиться циклом:
C++
1
2
3
4
5
6
7
8
9
10
        int size = strlen(words[Amount - i]);
        char *temp = new char[size];
        strcpy(temp, words[size - i]);
        dict << temp << '!';
        delete []temp;
        size = strlen(ID[Amount - i]);
        temp = new char[size];
        strcpy(temp, ID[size - i]);
        dict << temp << '!';
        delete []temp;
Почему нельзя с ходу писать в файл данные из массива?
C++
1
dict << words[size - i] << '!' << ID[size - i ] << '!';
Да и зачем Вам 2 вектора?
Не проще ли std::map использовать?
Как я понимаю, у Вас однозначное соответствие word <-> ID =)
0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
29.07.2012, 16:05  [ТС] #3
Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
Не понимаю, чего Вы хотите добиться циклом:
это пережиток прошлого кода
это можно исправить,но дело втом,что данные не записываются,в файле есть количество слов,но самих слов нет
0
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
29.07.2012, 16:16 #4
Проверьте, существуют ли они вообще =)
Проверьте индексацию.
В отладочном режиме.
0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
29.07.2012, 16:33  [ТС] #5
я нажимаю F10,но я нахожзусь в main(),где вызввается эта функция,я лишь знаю,что когда доходит дело до функции WriteID вылетает ошибка
0
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
29.07.2012, 16:36 #6
Ну нажмите F11 =) Или какая там кнопочка для входа в процедуру =) Накройняк точку останова поставьте внутри WriteID.
Неужели Вас надо учить отлаживать программы, учитывая
Цитата Сообщение от alexey31415 Посмотреть сообщение
Курсовые, контрольные, лабораторные: С++, WinAPI
0
alexey31415
29.07.2012, 17:31  [ТС]
  #7

Не по теме:

это лишь реклама,я пока не получил не одного заказа

0
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
29.07.2012, 17:33 #8
Цитата Сообщение от alexey31415 Посмотреть сообщение
я пока не получил не одного заказа
Я так и понял
0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
30.07.2012, 19:39  [ТС] #9
Ошибка где-то в двух этих функциях,но я никак не могу понять почему
Если не сложно помогите разобраться

NewWords
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
bool Dictionary::NewWords()
{
    setlocale(0,"");
 
    cout << "Введите:" << endl;
    cout << "1 - для добавления нового слова" << endl;
    cout << "0 - для выхода из программы" << endl;
 
    bool temp = false;
    bool repeat = 0;
 
    char word[20] = {0};
    char id_of_word[8] = {0};
 
    char * string;
 
    cin >> temp;
 
            while(temp)
            {
                cout << "Введите слово" << endl;
 
                cin >> word;
 
                cout << "Введите ID:" << endl;
                if(!repeat)
                {
                cout << "Значения должны быть в диапазоне от 0 до 255" << endl;
                cout << "Пример:125.0.12.369" << endl;
                repeat = true;
                }
 
                cin >> id_of_word;
 
                if(correct(id_of_word))
                {
                ///////////////////////////////////
                string = new char[strlen(word) + 1];
 
                strcpy(string,word);
 
                this->words.push_back(string);
 
                delete []string;
 
                //////////////////////////////////
                string = new char[strlen(id_of_word) + 1];
 
                strcpy(string,id_of_word);
 
                this->ID.push_back(string);
 
                delete []string;
                //////////////////////////////////
                Amount++;
                }
                else
                    cout << "Неверный или неправильный ID" << endl;
 
                cout << "Введите:" << endl;
                cout << "1 - для добавления нового слова" << endl;
                cout << "0 - для выхода из программы" << endl;
 
                cin >> temp;
            }
 
        return true;
}


WriteID.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
47
48
#include "StdAfx.h"
#include "Dictionary.h"
 
bool Dictionary::WriteID(int param)
{
    fstream dict;
 
    int i = Amount;
    bool result = false;
 
    if(param)
    {
        dict.open(NameOfFile,ios::out);
        dict << this->Amount;
 
        while(i)
        {
            dict << this->words[Amount - i] << '!';
 
            dict << this->ID[Amount - i] << '!';
 
            i--;
        }
 
        result = true;
    }
    else
    {
        dict.open(NameOfFile,ios::ate);
    
        dict.seekp(0);
        dict << this->Amount;
        dict.seekp(0,ios::end);
 
        while(i)
        {
            dict << this->words[Amount - i] << '!';
 
            dict << this->ID[Amount - i] << '!';
 
            i--;
        }
 
        result = true;
    }
 
        return result;
}
0
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
30.07.2012, 19: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
                if(correct(id_of_word))
                {
                ///////////////////////////////////
                string = new char[strlen(word) + 1];
 
                strcpy(string,word);
 
                this->words.push_back(string);
 
                delete []string;
 
                //////////////////////////////////
                string = new char[strlen(id_of_word) + 1];
 
                strcpy(string,id_of_word);
 
                this->ID.push_back(string);
 
                delete []string;
                //////////////////////////////////
                Amount++;
                }
Зачем копировать строки?! При push_back они по любому скопируются.

А вот над этим Вам явно стоит немного больше подумать:

C++
1
2
3
4
5
6
char id_of_word[8] = {0}
// ...
cout << "Значения должны быть в диапазоне от 0 до 255" << endl;
cout << "Пример:125.0.12.369" << endl;
//...
cin >> id_of_word;
Вы в восьмисимвольный массив пытаетесь положить (судя хотя бы по примеру) 12 символов.

Далее - еще интереснее:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
bool Dictionary::correct(char id[])
{
    for(int i = 0;i < 2*COUNT_OF_BYTES - 1;i++)
    {
        if(id[i] < 0 || id[i] > 255)
            return false;
 
        if(!(id[i++] != '.'))
            return false;
    }
 
    return true;
}
Вы ввели ряд цифр в символьный массив => должны проверить, а правда ли каждый символ - цифра или точка? А вы что делаете?

Советую с нуля продумать логику приложения. Больно все коряво.
0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
30.07.2012, 20:05  [ТС] #11
Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
положить (судя хотя бы по примеру) 12 символов.
разве число до 255 не занимает 1 байт и соответсвенно не будет записано,например,в первый элемент массива

Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
правда ли каждый символ - цифра или точка
isdigit проверяет является ли значение цифрой,а у меня числа от 0 до 255

согласен.не лучший код,но сейчас главная цель-чтоб он заработал
0
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
30.07.2012, 20:08 #12
Цитата Сообщение от alexey31415 Посмотреть сообщение
разве число до 255 не занимает 1 байт и соответсвенно не будет записано,например,в первый элемент массива
Число 255 занимает 1 байт, верно.
Однако при вводе Вы считываете СИМВОЛЫ
Символ 2 - 1 байт, символ 5 - 1 байт. Итого - 3 байта.
Цитата Сообщение от alexey31415 Посмотреть сообщение
но сейчас главная цель-чтоб он заработал
Вряд ли он заработает
Пересмотрите логику. В корне.

Добавлено через 1 минуту
Цитата Сообщение от alexey31415 Посмотреть сообщение
а у меня числа от 0 до 255
Нет, у вас массив из 3х символов, из 3х цифр если хотите.
0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
30.07.2012, 20:39  [ТС] #13
Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
Пересмотрите логику. В корне.
а что вы предлагаете?

Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
Символ 2 - 1 байт, символ 5 - 1 байт. Итого - 3 байта.
я думал об этом,но надеялся,что это не так,стоит попробовывать
0
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
30.07.2012, 20:42 #14
Цитата Сообщение от alexey31415 Посмотреть сообщение
а что вы предлагаете?
Хотя бы тот факт, что Вы просите пользователя вводить код слова =) Я, конечно, понятия не имею зачем данная программа нужна, но знаю, что пользователю такое доверять нельзя. Хотя бы потому что он может задать одинаковые ключи.
Потом зачем использовать два вектора когда есть класс std::map. Намного более функциональный для данного случая.
И тд и тп.
0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
30.07.2012, 23:04  [ТС] #15
идентификаторы буду вводить я,их ужно вводить
использование map хорошо и сделаю.но позже

Добавлено через 2 часа 6 минут
вы мне лучше скажите,если можете,почему файлы не записываются в файл
0
30.07.2012, 23:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2012, 23:04
Привет! Вот еще темы с ответами:

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

демонстрационная программа создания и уничтожения процессов - C++
Помогите пожалуйста как можно исправить программу Приложение 2 //демонстрационная программа создания и уничтожения процессов //тип...

Какие нужны библиотеки для создания читов для онлайн игр? - C++
Здравствуйте, недавно возник вопрос, А как собственно говоря делают читы для онлайн игр? Какие для них нужны библиотеки, какие методы...

Литература для создания элементарного языка управляющих сигналов и интерпретатора для него - C++
Доброго времени суток! Подскажите, с чего начать при создании? Нужно придумать элементарный язык для задания управляющих сигналов и...


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

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

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