Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
59 / 59 / 7
Регистрация: 16.05.2010
Сообщений: 632
1

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

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

Словарь представляет из себя любые слова и их ID.Я сделал класс Dictionary и методы этого класса для работы со словарём,однако возникла проблема с записью данных(проблема где-то в функции WriteID),но в чём дело не пойму.
0
Вложения
Тип файла: rar Архив WinRAR.rar (3.4 Кб, 83 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.07.2012, 15:35
Ответы с готовыми решениями:

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

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

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

Программа для создания матриц
Задание прикреплено в файле. Вот что я смог написать, прошу, чем проще, тем лучше. лучше с...

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

Не по теме:

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

0
59 / 59 / 8
Регистрация: 15.10.2010
Сообщений: 356
29.07.2012, 17:33 8
Цитата Сообщение от alexey31415 Посмотреть сообщение
я пока не получил не одного заказа
Я так и понял
0
59 / 59 / 7
Регистрация: 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
59 / 59 / 8
Регистрация: 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
59 / 59 / 7
Регистрация: 16.05.2010
Сообщений: 632
30.07.2012, 20:05  [ТС] 11
Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
положить (судя хотя бы по примеру) 12 символов.
разве число до 255 не занимает 1 байт и соответсвенно не будет записано,например,в первый элемент массива

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

согласен.не лучший код,но сейчас главная цель-чтоб он заработал
0
59 / 59 / 8
Регистрация: 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
59 / 59 / 7
Регистрация: 16.05.2010
Сообщений: 632
30.07.2012, 20:39  [ТС] 13
Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
Пересмотрите логику. В корне.
а что вы предлагаете?

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

Добавлено через 2 часа 6 минут
вы мне лучше скажите,если можете,почему файлы не записываются в файл
0
59 / 59 / 8
Регистрация: 15.10.2010
Сообщений: 356
30.07.2012, 23:05 16
Цитата Сообщение от alexey31415 Посмотреть сообщение
почему файлы не записываются в файл
Что, еще раз?
Пример что ли...
0
59 / 59 / 7
Регистрация: 16.05.2010
Сообщений: 632
30.07.2012, 23:36  [ТС] 17
я выбираю пункт создать новый словарь,ввожу слова,когда выхожу из программы(нажимаю 0) и вылетает ошибка:необработанное исключение в каком-то регистре
когда открою файл,название которого вводил в программе,то там число слов,которое я хотел записать и восклицательные знаки,между которыми знак минус
0
59 / 59 / 8
Регистрация: 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 =)

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

Не по теме:

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

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

Добавлено через 2 минуты
Как же Вы в булеву то переменную что то считываете... Интересно посмотреть.
Честно говоря я сто лет не юзал namespace std. Посему просьба рассказать в итоге, на сколько это была удачная идея =)
По моему - крайне неудачная. Но я возможно ошибаюсь.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.07.2012, 01:08

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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