Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2011, 18:45   #1
lagg
 
Регистрация: 30.03.2011
Сообщений: 3
По умолчанию Вопрос про удаление символа с определенной позиции в строке

Дано задание по многопоточным потокам в си. Есть разделяемая переменная F типа str, если нажата клавиша от 1 до 9, то происходит стирание символа в позиции N, а если нажата alt+(от 1 до 9), то Восстановление символа в позиции N.
Так же дан пример работы, но он дан для типа int :
Код:
// при нажатии "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;
}
а вот как написать программу для моего задания?
lagg вне форума Ответить с цитированием
Старый 15.11.2011, 18:45   #2
lagg
 
Регистрация: 30.03.2011
Сообщений: 3
По умолчанию

PS. вот начало моей работы, правда не уверен, что делаю правильно
Код:
#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"
Заранее спасибо кто поможет
lagg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переход к определенной строке AlienZ Microsoft Office Excel 7 15.11.2011 00:04
Поиск и удаление символа в строке Karl_Karlovi4 Общие вопросы Delphi 14 26.10.2011 18:04
Поиск символа в Memo с N-ой позиции Dj_SheLL Помощь студентам 6 15.06.2011 19:24
Удаление символа в строке массива - Paskal ABC.Net ElektrikMaximka Помощь студентам 1 26.10.2010 19:44
Удаление символа в строке Fantom Общие вопросы Delphi 2 23.06.2008 16:03