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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.80
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
29.07.2012, 15:35     Программа для создания словаря #1
Словарь представляет из себя любые слова и их ID.Я сделал класс Dictionary и методы этого класса для работы со словарём,однако возникла проблема с записью данных(проблема где-то в функции WriteID),но в чём дело не пойму.
Вложения
Тип файла: rar Архив WinRAR.rar (3.4 Кб, 80 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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 =)
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
29.07.2012, 16:05  [ТС]     Программа для создания словаря #3
Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
Не понимаю, чего Вы хотите добиться циклом:
это пережиток прошлого кода
это можно исправить,но дело втом,что данные не записываются,в файле есть количество слов,но самих слов нет
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
29.07.2012, 16:16     Программа для создания словаря #4
Проверьте, существуют ли они вообще =)
Проверьте индексацию.
В отладочном режиме.
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
29.07.2012, 16:33  [ТС]     Программа для создания словаря #5
я нажимаю F10,но я нахожзусь в main(),где вызввается эта функция,я лишь знаю,что когда доходит дело до функции WriteID вылетает ошибка
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
29.07.2012, 16:36     Программа для создания словаря #6
Ну нажмите F11 =) Или какая там кнопочка для входа в процедуру =) Накройняк точку останова поставьте внутри WriteID.
Неужели Вас надо учить отлаживать программы, учитывая
Цитата Сообщение от alexey31415 Посмотреть сообщение
Курсовые, контрольные, лабораторные: С++, WinAPI
alexey31415
29.07.2012, 17:31  [ТС]
  #7

Не по теме:

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

HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
29.07.2012, 17:33     Программа для создания словаря #8
Цитата Сообщение от alexey31415 Посмотреть сообщение
я пока не получил не одного заказа
Я так и понял
alexey31415
 Аватар для 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;
}
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;
}
Вы ввели ряд цифр в символьный массив => должны проверить, а правда ли каждый символ - цифра или точка? А вы что делаете?

Советую с нуля продумать логику приложения. Больно все коряво.
alexey31415
 Аватар для 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

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

Добавлено через 2 часа 6 минут
вы мне лучше скажите,если можете,почему файлы не записываются в файл
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
30.07.2012, 23:05     Программа для создания словаря #16
Цитата Сообщение от alexey31415 Посмотреть сообщение
почему файлы не записываются в файл
Что, еще раз?
Пример что ли...
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
30.07.2012, 23:36  [ТС]     Программа для создания словаря #17
я выбираю пункт создать новый словарь,ввожу слова,когда выхожу из программы(нажимаю 0) и вылетает ошибка:необработанное исключение в каком-то регистре
когда открою файл,название которого вводил в программе,то там число слов,которое я хотел записать и восклицательные знаки,между которыми знак минус
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
30.07.2012, 23:42     Программа для создания словаря #18
То что я заметил в старом проекте
C++
1
2
3
4
5
6
7
8
while(temp)
{
  // ...
  cout << "Введите:" << endl;
  cout << "1 - для добавления нового слова" << endl;
  cout << "0 - для выхода из программы" << endl;
  cin >> temp;
}
Опять же вводится символьный ноль, а не численный.
В условии цикла посему надо проверять не на temp == 0, а на temp == '0';

Что там Вы намутили нового - я не знаю. Может что то еще хуже.

Не по теме:

Рано Вам заниматься Курсовыми, контрольными, лабораторными: С++, WinAPI =)

alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
31.07.2012, 01:05  [ТС]     Программа для создания словаря #19
temp уже булева переменная,так что всё нормально

Не по теме:

надо когда-то начинать и с чего-то

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2012, 01:08     Программа для создания словаря
Еще ссылки по теме:

C++ Набор для создания 3d игр
Литература для создания элементарного языка управляющих сигналов и интерпретатора для него C++
C++ Использование контейнера set для создания словаря

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

Или воспользуйтесь поиском по форуму:
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
31.07.2012, 01:08     Программа для создания словаря #20
Цитата Сообщение от alexey31415 Посмотреть сообщение
temp уже булева переменная
Уже страшно =)

Добавлено через 2 минуты
Как же Вы в булеву то переменную что то считываете... Интересно посмотреть.
Честно говоря я сто лет не юзал namespace std. Посему просьба рассказать в итоге, на сколько это была удачная идея =)
По моему - крайне неудачная. Но я возможно ошибаюсь.
Yandex
Объявления
31.07.2012, 01:08     Программа для создания словаря
Ответ Создать тему
Опции темы

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