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

Оформить программу через потоки - C++

Восстановить пароль Регистрация
 
|| Flashka ||
 Аватар для || Flashka ||
2 / 2 / 0
Регистрация: 03.03.2010
Сообщений: 94
15.03.2010, 11:17     Оформить программу через потоки #1
Всем привет!! Помогите пожалуйста оформить программу через потоки!! )))
В программе поиск элемента оформить как функцию потока. Сначала вводятся необходимые значения, затем осуществляется поис и только после этого выводится резулятат.

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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <time.h>
 
using namespace std;
int g_KeySearch;
 
#define MAX_QUANTITY 100
#define ELEMENT       -1
 
int searchBinary(int* p_Array, int g_KeySearch, int functionAr1, int functionAr2);
 
/////////////////////////////////////////////////////////////////////////////////
//
// Главная функция консольного приложения
//
// FUNCTION: void main(void)
//
// PARAMETERS: нет
//           
// RETURN VALUE: нет
//
// COMMENTS: нет
//
 
void main(void)
{    
    setlocale(LC_CTYPE,"Russian");
 
    int arrayOfNumbers[MAX_QUANTITY];
    int tmp, searchingNumber, position;
    int  theLeftElement
        ,ridhtElement
        ,number = 0
        ,buffer = 0
        ,variable1 = 0
        ,variable2 = 0;
    int sizeOfaFile = 0;
    int *numberOfaFile;
    bool CorrectnessCheck;
  
    cout << "\n\tПрограмма, которая находит элемент при помощи\n"
         << " \t\t\tдвоичного поиска\n";
    do
    {
        cout << "\nВведите размер массива: ";
        cin.clear();
        cin >> sizeOfaFile;
        fflush(stdin);
 
        if(!cin.good())
        {
                cout<<"\n>>Ошибка!!! Размер должен быть числом!\n";
                cout<<"\n>>Пожалуйста, введите число. \n";
                CorrectnessCheck = false; 
        }
            else CorrectnessCheck = true; 
            }
      while (!CorrectnessCheck); 
 
      numberOfaFile = (int *) malloc (sizeOfaFile);
 
      cout << "\nВведите элементы массива: ";
 
    for( int theLeftElement=0; theLeftElement<
             sizeOfaFile; ++theLeftElement)
    {
            do
            {
                cin.clear();
                cin >> arrayOfNumbers[theLeftElement];
                fflush(stdin);
            if(!cin.good())
            {
              cout<<"\n>>Ошибка!!! Элементы должны быть числом!\n";
              cout<<"\n>>Пожалуйста, введите число. \n";
              CorrectnessCheck = false; 
            }
            else CorrectnessCheck = true; 
            }while (!CorrectnessCheck);
     } 
 
    // просматриваем элемент от начала до конца, массив начинается с 0
    for (theLeftElement = 0; theLeftElement < 
         MAX_QUANTITY-1; theLeftElement++) 
    {
        // просматриваем массив со следующего от текущего положения элемента
        for (ridhtElement = theLeftElement+1; ridhtElement < 
             MAX_QUANTITY; ridhtElement++) 
        {
            // если левый элемент меньше чем правый, то меняем их местами
            // т.о. меньшие элементы всплывают к концу массива
            if (arrayOfNumbers[theLeftElement] < 
                arrayOfNumbers[ridhtElement]) 
            {
                tmp = arrayOfNumbers[theLeftElement];
                arrayOfNumbers[theLeftElement] = arrayOfNumbers[ridhtElement];
                arrayOfNumbers[ridhtElement] = tmp; 
            }
        }
            if (arrayOfNumbers[theLeftElement] != buffer) 
            {
                buffer = arrayOfNumbers[theLeftElement];
                variable2 = 1;
            }
            else 
            {
                variable2++;
            if (variable2 > variable1)
            {
            number = buffer;
            variable1 = variable2;
            }
        }
 
    }
 
    
    for (theLeftElement=0; theLeftElement < sizeOfaFile; theLeftElement++) 
    {
        cout << arrayOfNumbers[theLeftElement] << " ";
    }
 
        do
        {    
            cout << endl << endl << "Введите ключ для поиска: ";
            cin.clear();
            cin >> searchingNumber;
            fflush(stdin);
 
            if(!cin.good())
            {
                cout<<"\n>>Ошибка!!! Ключ должны быть числом!\n";
                cout<<"\n>>Пожалуйста, введите число. \n";
                CorrectnessCheck = false; 
            }
            else CorrectnessCheck = true; 
            }while (!CorrectnessCheck);
 
    cout << endl;
    position = searchBinary(arrayOfNumbers
                            , searchingNumber, 0, MAX_QUANTITY - 1
                           );
    position != -1 ? cout << "Искомая позиция: " << position+1
                   : cout << "Нет такого элемента!"
                   ;
    getch();
}
/////////////////////////////////////////////////////////////////////////////////
//
// Фунуция бинарного поиска элемента
//
// FUNKCTION: int searchBinary(int*, int, int, int)
//
// PARAMETERS: [in] p_Array     - указатель на массив
//             [in] head        - левая граница подмассива
//             [in] tail        - правая граница подмассива
//             [in] g_KeySearch - эталон поиска
//
// RETURN VALUE: позиция элемента в массиве - в случае успеха
//               -1                         - в случае неудачи
//
// COMMENTS: элементы массива нумеруются с нуля
//
int searchBinary(int* p_Array, int g_KeySearch, int head, int tail)
{ 
    int currPosition = ELEMENT;
    if ((tail == head) && (p_Array[tail] != g_KeySearch )) 
    {
        return ELEMENT;
    }
    else 
    {
        currPosition = (head+tail)/2;
        if (g_KeySearch == p_Array[currPosition])
        {
            return currPosition;
        }
        else 
        {
            if (g_KeySearch > p_Array[currPosition]) 
            {
                currPosition = searchBinary(p_Array, g_KeySearch, head, currPosition);
            }
            else
            {
                currPosition = searchBinary(p_Array, g_KeySearch, currPosition+1, tail);
            }
        }
    }
}
Добавлено через 16 часов 50 минут
Блин, ну что никто совсем ничего про потоки не знает......... (((
Обидно.......;(
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2010, 11:17     Оформить программу через потоки
Посмотрите здесь:

C++ Оформить программу в виде подпрограмм
Оформить код через классы C++
Оформить программу в виде функций C++
C++ Запись в файл через потоки
C++ Закончить программу
C++ Оформить программу в виде функций
Оформить программу через функцию C++
C++ Оформить в виде функций программу

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OffyGhost
 Аватар для OffyGhost
7 / 7 / 1
Регистрация: 04.03.2010
Сообщений: 107
15.03.2010, 14:25     Оформить программу через потоки #2
где у тебя поиск ??

#include <windows.h>
подклчюаем

перед мейном пишешь:

C++
1
2
3
4
5
DWORD WINAPI poisk (PVOID Parametr)
{
// тут вставляешь код поиска чего тебе нада
    return 0;
}
C++
1
2
3
    DWORD idThread;
    HANDLE h1;
    h1 = CreateThread (NULL, NULL, poisk, &var, NULL, &idThread);
где var - то значение, которое получаешь в результате поиска

перед выводом этого значения на экран пишешь
WaitForSingleObject(h1, INFINITE);

CloseHandle(h1);
пишешь в конце проги, закрыть поток


PS
Учимся в одном универе?
СФУ ИКИТ
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
15.03.2010, 21:38     Оформить программу через потоки #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
OffyGhost,посмотри пожалуйста в чём дело
Я всё сделал вроде правильно, сам поиск неважен щас, может я где-то в деталях ошибся... Создаётся поток, а вот он то ли завершиться не может то ли что, но я там создал типа контрольной точки (там увидишь, я всё прокомментировал), так вот её главный поток проскакивает. Где-то я ошибся, а где не пойму. Спасибо.


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
#include <windows.h>
#include <stdio.h>
 
 
 
int poisk (PVOID pvParam) {
 
 //Если во введённых значпениях будет искомое, этот параметр превратится в true
 pvParam= false;
 
 //ЭТО МАССИВ ДЛЯ ВВОДИМЫХ ЗНАЧЕНИЙ
 int mass [256];
 
 int i, j, chislo;
 j= 0;
 
 //Обнуляем массив для поиска элементов
 for (i= 0; i< 256; i++) {
  mass [256]= 0;
 }
 
 //Заполняем массив введённым изначениями
 //ПО окончании пишем ENTER ^Z ENTER
 printf ("VVedi znachenia cherez probel ");
 while (scanf ("%d", &mass [i++])==1) {}
 
 //Вводим искомое число
 printf ("Vvodi iskomoe chislo ");
 scanf ("%d", &chislo);
 
 //Ищем егг\о в массиве, если находим, соответвтенно изменяем *pvParam 
 for (i-1; i>=0; i--) {
  if (mass [i]== chislo) {
    pvParam= (PVOID)true;
    break;
  }
 }
 
 //Буфер очщаю
 fflush (stdin);
 
 printf ("Eto vot tipa kontrolnoi tochki TUT VSO NORMALNO, NE PROSKSKIVAET!");
 getchar ();
 
 return 0;
}
 
 
 
 
 
 
 
int main () {
 PVOID var;
 DWORD idThread;
 HANDLE h1;
 
 //Здесь надо прописать проверку- солздан поток или нет. Это я опущу
 //ВЫполнил приведение типов согласно прототипу функции, нашёл его где-то в инклудах,
 //Чтобы предупреждений не возникало
 h1 = CreateThread (NULL, (DWORD)NULL, (LPTHREAD_START_ROUTINE)poisk, &var, (DWORD)NULL, &idThread);
 
 
 //Это зачем?
 //Если я правильно понял, основной поток ждёт завершения потока h1 и ТОЛЬКО после этого выводится 
 //значение переменой var. Правильно?
 WaitForSingleObject(h1, INFINITE);
 
 //Даже буфер очистить решил
 fflush (stdin);
 
 //С выводом var я потом разберусь, вот этй контрольнуюочку проскакивает!
 //printf ("%d" , var);
 printf ("KONTROLNAYA TOCHKA\n ");
 getchar ();
 getchar ();
 
 //В конце проги мы закрываем этот поток.
 CloseHandle(h1);
 
 return 0;
 
}
Добавлено через 2 часа 23 минуты
Я рвазобрался, ошибки как в моём коде, так и в коде OffyGhost

Но, поскольку ошибки такого жалкого червя мало кому интересны, начну со второго.
Итак, главная и единстенная ошибка OffyGhost- неправильный прототип функции, а именно: неправильный четвёртый параметр. ЭТот параметр имеет тип PVOID, следовательно, его нужно объявить так:
C++
1
PVOID var
а потом уже
C++
1
CreateThread (NULL, NULL, poisk, var, NULL, &idThread);
Вместо ошибочного
C++
1
CreateThread (NULL, NULL, poisk, &var, NULL, &idThread);
(хотя компилятор хавает, негоже привыкать надеятьсяна авось)

Всё? ОТнюдь! Сюрпризы только начинаются. Эта безупречная, казалось
бы, запись не сработает! И опять из-за проклятой var!
...НО терпение и труд всё перетрут. Посмотрите, какое значение должна иметь
var при передаче в функцию? Правильно, адрес какой-либо переменной (PVOID
говорит нам, что переменной любого типа) Но var не присвоен адрес никакой переменной!
ПОэтому и происходит сбой!

Делаем так:
C++
1
2
3
4
int peremennaya;
PVOID var= &k;
...
h1 = CreateThread (NULL, (DWORD)NULL, (LPTHREAD_START_ROUTINE)poisk, var, (DWORD)NULL, &idThread);
Вот теперь всё ОК!

Ну, а в моём коде ошибка глупая, я прописал память. НЕобходимо писать так:
C++
1
2
 i= 0;
 while (scanf ("%d", &mass [i++])==1) {}
И тоже всё будет ОК. Можете проверить.
ДО новых встреч, друзья!
Yandex
Объявления
15.03.2010, 21:38     Оформить программу через потоки
Ответ Создать тему
Опции темы

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