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

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

29.07.2012, 15:35. Просмотров 2818. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

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

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

Не по теме:

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

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

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

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

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

Написать программу, использующую этот класс для представления англо-русского словаря
Имеется код на задание: описание класса, реализующий бинарное дерево...


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

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

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