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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
lagg
0 / 0 / 0
Регистрация: 30.03.2011
Сообщений: 6
#1

Вопрос про удаление символа с определенной позиции в строке - C++

15.11.2011, 18:41. Просмотров 684. Ответов 0
Метки нет (Все метки)

Дано задание по многопоточным потокам в си. Есть разделяемая переменная F типа str, если нажата клавиша от 1 до 9, то происходит стирание символа в позиции N, а если нажата alt+(от 1 до 9), то Восстановление символа в позиции N.
Так же дан пример работы, но он дан для типа int :
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
// при нажатии "1" -> F=F+1 (операция 1)
// при нажатии "0" -> F=F-1 (операция 2)
#include <windows.h>
#include <conio.h>
#include <iostream.h>
#include <time.h>
HANDLE hThread;  // дескриптор создаваемого потока
DWORD IDThread;  // идентификатор потока
DWORD ThreadProc(struct log *p); // функция потока (параметр - 
                         // указатель на структуру log)
int F=0;             // разделяемая глобальная переменная
clock_t wtime=100;   // время задержки (мс)
void waiting(clock_t dt); // функция задержки
// Журнал 
struct log {
   int nom;     // порядковый номер операции
   int key;     // код нажатой клавиши
   DWORD ID;        // идентификатор созданного потока
   clock_t t1;  // время начала операции
   clock_t t2;  // время завершения операции
   int F;       // результат операции в дочернем потоке 
   int Fc;      // результат операции главном потоке 
                // (переменная-дублер) 
} mylog[1000];   // не более 1000 строк в журнале
 
//=================================================
int main()  // главный поток
{
  int i=0;      // счетчик операций
  int j=1;      // счетчик вывода строк журнала 
  int key=1;        // код нажатой клавиши
  int flag=1;   // признак завершения программы 
  int Fcontr;   // переменная-дублер
  mylog[1].t2=0; // признак того, что поток не завершен
  Fcontr=F;
 
// повторять пока flag !=0 или i<1000
while (flag || i >=1000)
{
//Прием кода нажатой клавиши
if (kbhit()!= 0)
 {
    key= getch();
    // формирование переменной-дублера
    if (key == 48) Fcontr=--Fcontr; 
        else  Fcontr=++Fcontr;          
//Проверка кода нажатой клавиши
switch (key)
  {
  case 27 : {flag=0; break;} // признак выхода из 
                            // программы (Esc)
  case 48 :     // нажата клавиша "0"   
  case 49 :         // нажата клавиша "1"
      {
          i=++i; //следующая операция           
        // формируем строку журнала          
          mylog[i].nom=i;
          mylog[i].key=key;
          mylog[i].t2=0;
          mylog[i].F=0;
          mylog[i].Fc=Fcontr;
          mylog[i].t1=clock();
// создание потока без немедленного запуска
hThread= CreateThread(NULL,0,ThreadProc,&mylog[i],CREATE_SUSPENDED,&IDThread);
        if (hThread == NULL)
            { cout << "Thread error" << key << endl;
            getch();
            return 0;
         }
    else
            {
   // запуск потока       
   mylog[i].ID=IDThread;
   ResumeThread(hThread);
        }
     }
   }
 }
// завершение работы потока проверяется по 
// сформированному в функции 
// потока значению времени t2
 if (mylog [j].t2!=0)
     {
// вывод j-й строки журнала     
cout << j << "  " << mylog[j].key << "  " << mylog[j].ID << "  " << mylog[j].t1 << "  " << mylog[j].t2 << "  " << mylog[j].F << "  " << mylog[j].Fc <<endl;
     j=++j;   // следующая строка журнала
     }
} // повторять пока flag !=0 или i<1000
  getch();
  return 0;
}
 
// функция потока: имитация "чтения", корректировки 
// и "записи" разделяемой переменной F
// параметр - указатель на текущую строку журнала 
DWORD ThreadProc(log *p)
{
int Fbuf;    
// чтение разделяемой переменной в буферную переменную 
Fbuf=F;
waiting(wtime);  // задержка
// корректировка буферной переменной
if ((*p).key == 48) Fbuf=--Fbuf;
        else  Fbuf=++Fbuf;
waiting(wtime);  // задержка
// запись из буферной переменной в разделяемую переменную
F=Fbuf;
// запись результата в текущую строку журнала
 (*p).F=F;
 (*p).t2=clock(); // время окончания работы потока
return 0;
}
 
// функция задержки
// параметр - время задержки в мс
void waiting(clock_t dt) {
clock_t tn;
tn=clock();
while (clock()-tn < dt); 
return;
}
а вот как написать программу для моего задания?

PS. вот начало моей работы, правда не уверен, что делаю правильно
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
#include <windows.h>
#include <conio.h>
#include <iostream.h>
#include <time.h>
#include <string.h>
HANDLE hThread;  // дескриптор создаваемого потока
DWORD IDThread;  // идентификатор потока
DWORD ThreadProc(struct log *p); // функция потока (параметр - 
                         // указатель на структуру log)
char F[12]="Hello world!";     // разделяемая глобальная переменная
clock_t wtime=100;   // время задержки (мс)
void waiting(clock_t dt); // функция задержки
// Журнал 
struct log {
      int nom;      // порядковый номер операции
   int key;     // код нажатой клавиши
   DWORD ID;        // идентификатор созданного потока
   clock_t t1;  // время начала операции
   clock_t t2;  // время завершения операции
   char F;      // результат операции в дочернем потоке 
   char Fc;     // результат операции главном потоке 
                // (переменная-дублер) 
} mylog[1000];   // не более 1000 строк в журнале
int k;
//=================================================
int main()  // ГЈГ«Г*ГўГ*ûé ïîòîê
{
  int i=0;      // счетчик операций
  int j=1;      // счетчик вывода строк журнала 
  int key=1;        // код нажатой клавиши
  int flag=1;   // признак завершения программы 
  char Fcontr;  // переменная-дублер
  mylog[1].t2=0; // признак того, что поток не завершен
  Fcontr=F;
 
// повторять пока flag !=0 или i<1000
while (flag || i >=1000)
{
//Прием кода нажатой клавиши
if (kbhit()!= 0)
 {
    key= getch();
    // формирование переменной-дублера
    if (key >= 49 && key<=57) Fcontr=--Fcontr;
        else  Fcontr=++Fcontr;
//Проверка кода нажатой клавиши
switch (key)
  {
  case 27 : {flag=0; break;} // признак выхода из 
                            // программы (Esc
  case 49 :     // Нажата клавиша "1"
  case 50 :         // Нажата клавиша "2"
  case 51 :         // Нажата клавиша "3"
  case 52 :         // Нажата клавиша "4"
  case 53 :         // Нажата клавиша "5"
  case 54 :         // Нажата клавиша "6"
  case 55 :         // Нажата клавиша "7"
  case 56 :         // Нажата клавиша "8"
  case 57 :         // Нажата клавиша "9"
Заранее спасибо кто поможет
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2011, 18:41     Вопрос про удаление символа с определенной позиции в строке
Посмотрите здесь:

Поиск позиции символа в строке - C++
Здравствуйте, у меня есть строка со словом и строка с прочерками (--------), длина у них одинаковая, есть кнопки, на которых буквы...

Удаление символа в строке - C++
Помогите пожалуйста, вот программа: #include &lt;iostream&gt; using namespace std; int main() { int k; cin &gt;&gt; k; ...

Удаление символа в строке - C++
Подскажите какой функцией удалять символ в строке (String не использовать).

Есть ли в С++ функция копирования строки с определенной позиции? - C++
подскажите пожал-та. есть в С++ функция копирования строки с определенной позиции? что то не могу найти такую. например char...

Как написать текст в консоли в определенной позиции? - C++
Привет всем. Подскажите, как написать текст в консоли например в 3 столбце начиная с 5 символа? И как узнать длину выводимого...

Скопировать из одного символьного массива в другой, начиная с определенной позиции - C++
Добрый вечер. Столкнулся с проблемой: Имеется: char buffer = &quot;We are the champions&quot;; char word = &quot; &quot;; Мне надо скопировать в word ...

Установить в целом числе биты в ноль, начиная с определенной позиции - C++
Доброго времени суток. Помогите пожалуйста с заданием: Заранее благодарен за помощь.

Программа вычисляющая номер позиции первого символа 0 - C++
Доброго времени суток Требуется написать такую программу: Используя тип unsigned long int, выполнить с двоичным представлением...

Напишите программу, которая выводит на экран все слова, которые имеют определенный символ в определенной позиции - C++
Здравствуйте. Препод сегодня задал решить задачу но это совсем не мой уровень, а завтра нужно показать, помогите пожалуйста! Есть...

Нужно вычислить номер позиции первого значащего символа - C++
Задача такая. Нужно вычислить номер позиции первого значащего символа. Используя Signed Char. Вообщем 1)задаеться число ...

Строки. Дан текст. Найти позиции заданного символа в тексте - C++
Дан текст. Найти позиции заданного символа в тексте

Удаление из файла определенной записи - C++
Новые записи сохраняются в файле нормально, а вот как удалить определённую запись не могу понять. Подскажите, если можно то в самой функции...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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