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

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

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

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

15.11.2011, 18:41. Просмотров 674. Ответов 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++ Есть ли в С++ функция копирования строки с определенной позиции?
C++ Нужно вычислить номер позиции первого значащего символа
C++ Поиск позиции символа в строке
C++ Напишите программу, которая выводит на экран все слова, которые имеют определенный символ в определенной позиции
Удаление символа в строке C++
Строки. Дан текст. Найти позиции заданного символа в тексте C++
Скопировать из одного символьного массива в другой, начиная с определенной позиции C++
C++ Программа вычисляющая номер позиции первого символа 0
C++ Определить последнее вхождение символа “р” в строке и вывести строку, начиная с первого символа и до последнего “р” в строке
C++ Удаление символа в строке
C++ Установить в целом числе биты в ноль, начиная с определенной позиции

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

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

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