Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
nyahaas
0 / 0 / 0
Регистрация: 01.12.2013
Сообщений: 5
1

Написать программу, которая ищет в словаре слово, указанное там же

20.05.2014, 22:53. Просмотров 677. Ответов 3
Метки нет (Все метки)

Словарь организован в виде файла, содержащего по одному слову в строке, словарь упорядочен по убыванию(у меня пока по возрастанию). Написать программу, которая ищет в словаре слово, указанное там же. Для поиска интерполяционный метод. Запрещается считывать из словаря в память более одного слова одновременно.

Не понимаю, как реализовать этот поиск для слов. Так как для цифр-не получится, там нужно знать цифровое значение, которое лежит в массиве цифр. Попыталась через код буквы. Сортировать по каждой букве(сейчас пока только для одной). Брать её код и подставлять там в формулу. Но не получается. fseek тоже как-то странно работает. Видимо я что-то не так делаю.

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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// tanya_rgr3.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <string.h>
int sort(char*filename, char*key, int n, int size_w);
int vvod(char* filename, int &n);
 
int _tmain(int argc, _TCHAR* argv[])
{
    int n = 0;
    char filename[] = "in.txt";
    int size_w = vvod(filename, n);
    char key[] = "g";
    int z=sort(filename, key, n, size_w);
    printf("%d", z);
    return 0;
}
 
int vvod(char* filename, int &n)
{
    FILE*in;
    in = fopen(filename, "rt");
    char temp[20];
    fscanf(in, "%s", temp);
    int i = 1;
    int size_w = strlen(temp);
    while (!feof(in))
    {
        fscanf(in, "%s", temp);
        i++;
    }
    n = i - 1;
    printf("%d\n", n);
    fclose(in);
    return size_w;
}
 
int sort(char*filename, char*key, int n, int size_w)
{
    FILE*in;
    in = fopen(filename, "rt");
    int*a = new int[size_w];
    int*right = new int[size_w];
    int*left = new int[size_w];
    int*mid = new int[size_w];
    int l, r, m;
    int count = 0;//количество удачно найденных букв
    char*temp = new char[size_w];
    for (int j = 0; j < size_w; j++)
    {
        a[j] = key[j];
        //printf("%d ", b[j]);
    }
 
    for (int i = 0; i < size_w; i++)
    {
        l = 0;
        r = n - 1;
        fseek(in, 0, SEEK_SET);
        fscanf(in, "%s", temp);
        left[i] = temp[i];
        rewind(in);
        fseek(in, r*sizeof(temp), SEEK_SET);
        int l=fscanf(in, "%s", temp);
        right[i] = temp[i];
        rewind(in);
        while (left[i] <= a[i] && a[i] <= right[i])
        {
            m = l + (a[i] - left[i]) / (right[i] - left[i])*(r - l);
                fseek(in, m*(sizeof(temp)), SEEK_SET);
                fscanf(in, "%s", temp);
                    if (temp[i] == a[i]) count++;
                    if (temp[i] < a[i])
                    {
                        l = m + 1;
                        fseek(in, l*(sizeof(temp)), SEEK_SET);
                        fscanf(in, "%s", temp);
                        left[i] = temp[i];
                    }
                    else
                    {
                        r = m + 1;
                        fseek(in, l*(sizeof(temp)), SEEK_SET);
                        fscanf(in, "%s", temp);
                        right[i] = temp[i];
                    }
            rewind(in);
        }
        fseek(in, l*(sizeof(temp)), SEEK_SET);
        fscanf(in, "%s", temp);
            if (temp[i] == a[i]) count++;
                else return -1;
    }
    return count;
}
 
/*interpolationSearch(n, x):
  l = 0; // левая граница поиска (будем считать, что элементы массива нумеруются с нуля)
  r = n - 1; // правая граница поиска
 
  while a[l] <= x && x <= a[r]
    m = l + (x - a[l]) / (a[r] - a[l]) * (r - l); // элемент, с которым будем проводить сравнение
    if a[m] == x
      result = m;
    if a[m] < x
      l = m + 1;
    else
      r = m - 1;
 
  if a[l] == x
    result = l;
  else
  result = -1; // not found*/
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2014, 22:53
Ответы с готовыми решениями:

Написать функцию которая ищет последнее слово в строке(заканчивается пробелом)
надо написать ф-ю которая ищет последнее слово в строке(заканчивается пробелом). я написал, но не...

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

Программа, которая ищет по файлам и заменяет там текст
Может кто написать вот такую программу, или хотябы натолкнуть на мысль как ее написать ? : Есть...

Написать программу, которая для заданного с клавиатуры числа А ищет корень уравнения f(x)=0
Написать программу, которая для заданного с клавиатуры числа А ищет корень уравнения f(x)=0. ...

Массив: Написать программу, которая ищет максимальный элемент и выводит его на экран
Дана матрица W размера n*n, где n&lt;=15. Элементы матрицы вычисляются по формуле w(i,j)=i*j*(-i...

3
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
20.05.2014, 23:24 2
ну во первых это было бы лучше и удобнее делать через бинарник, т.е. fwrite, fread,
во вторых просто в цикле сравнивайте слова, какая тут может быть проблема вообще? if(str1 == str2) ... или if(strcmp(str1,str2)) ... как вариант
0
Вованя
149 / 145 / 65
Регистрация: 20.02.2014
Сообщений: 531
Завершенные тесты: 1
21.05.2014, 00:04 3
Цитата Сообщение от nyahaas Посмотреть сообщение
seek тоже как-то странно работает
fseek работает не странно только в бинарном режиме. А у вас в текстовом открыт.
strcmp и используйте. Сравнивает слова в алфавитном порядке и возвращает значение -1, 0, 1. Например, для строк abb и abc функция strcmp("abb", "abc) вернет -1, так как abb предшествует abc, если строки поменять местами, то вернет 1. Если строки равны вернет 0.
0
nyahaas
0 / 0 / 0
Регистрация: 01.12.2013
Сообщений: 5
21.05.2014, 07:44  [ТС] 4
http://neerc.ifmo.ru/wiki/index.php?...B8%D1%81%D0%BA

Там есть формула с a[l] и a[r]. Как мне высчитать эти a[l] и a[r] в случае со словами?
0
21.05.2014, 07:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2014, 07:44

Написать программу, которая с помощью цикла FOR /D ищет в log-файлах Windows сообщения...
Написать программу, которая с помощью цикла FOR /D ищет в log-файлах Windows сообщения, задаваемые...

Написать программу, которая ищет во входном потоке два повторяющихся друг за другом слова
Написать программу, которая ищет во входном потоке два повторяющихся друг за другом слова.

Написать программу, которая ищет в тексте повторяющиеся друг за другом слова и удаляет одно из них
Помогите пожалуйста: Написать программу, которая ищет в тексте повторяющиеся друг за другом слова...


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

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

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