Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РГР.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
503.3 Кб
Скачать

Результати виконання програм

Програма а:

Програма б:

Завдання 5

Семафори.

Задано рядок S, і безліч пар символів (ai, bi) i = 1, 2 ... n, отримати новий рядок, замінивши в рядку S кожне входження ai символу на bi. Вхідні дані: рядок S довільної довжини, ціле додатнє число n, безліч пар символів (ai, bi) i = 1, 2 ... n. Для вирішення завдання використати чотири процеси (потоки), розділивши між ними рядок S.

Лістинги програм

Програма а:

#include<stdio.h>

#include<unistd.h>

#include<sys/ipc.h>

#include<sys/shm.h>

#include<sys/sem.h>

#include<sys/wait.h>

#include<string.h>

int semid;

sembuf Plus1 = { 0, 1, 0 };

sembuf Minus1 = { 0, -1, 0 };

void func(int, char[], int[]);

void clear();

void space();

char s[100][2];

int n;

int main()

{

char str[] = "";

static int mas[100];

semid = semget(IPC_PRIVATE, 1, IPC_CREAT|0666) ;

if (semid < 0)

{

printf("Error\n");

return 0;

}

printf("Enter string: ");

scanf("%s", str);

printf("Enter N:");

scanf("%d", &n);

int i;

printf("Enter symbols:\n");

for (i = 0; i < n; i++)

{

clear();

scanf("%c", &s[i][0]);

space();

scanf("%c", &s[i][1]);

}

semop(semid, &Plus1, 1);

for (i = 0; i < 4; i++)

{

if (fork() == 0)

{

func(i, str, mas);

return 1;

}

}

for (i = 0; i < 4; i++)

{

wait(NULL);

}

printf("Result:\n");

printf("%s\n", str);

return 1;

}

void func(int part, char str[], int mas[])

{

semop(semid, &Minus1, 1);

int tmpLen = strlen(str) / 4;

int start = part * tmpLen;

int end = start + tmpLen;

if (part == 3)

{

end = strlen(str);

}

int i, j;

for(i = start; i < end; i++)

{

for (j = 0; j < n; j++)

{

if ((str[i] == s[j][0]) && (mas[i] == 0))

{

str[i] = s[j][1];

mas[i] = 1;

}

}

}

semop(semid, &Plus1, 1);

}

void clear()

{

while(getchar() != '\n');

}

void space()

{

while(getchar() != ' ');

}

Програма б:

#include<sched.h>

#include<stdio.h>

#include<unistd.h>

#include<semaphore.h>

#include<string.h>

#define NUMSTACK 5000

char stack[4][ NUMSTACK];

int count = 0;

int n;

char str[] = "";

char s[100][2];

static int mas[100];

int func(void *);

void clear();

void space();

sem_t sem1;

sem_t sem2;

int main()

{

printf("Enter string: ");

scanf("%s", str);

printf("Enter N:");

scanf("%d", &n);

int i;

printf("Enter symbols:\n");

for (i = 0; i < n; i++)

{

clear();

scanf("%c", &s[i][0]);

space();

scanf("%c", &s[i][1]);

}

sem_init(&sem1, 1, 1);

sem_init(&sem2, 1, 0);

for (i = 0; i < 4; i++)

{

char *tostack = stack[i];

clone(func, (void*)(tostack+NUMSTACK-1), CLONE_VM, NULL);

}

for (i = 0; i < 4; i++)

{

sem_wait(&sem2);

}

printf("Result:\n");

printf("%s\n", str);

return 1;

}

int func(void *param)

{

int tmpLen = strlen(str) / 4;

int start = count * tmpLen;

int end = start + tmpLen;

if (count == 3)

{

end = strlen(str);

}

int i, j;

for(i = start; i < end; i++)

{

for (j = 0; j < n; j++)

{

if ((str[i] == s[j][0]) && (mas[i] == 0))

{

str[i] = s[j][1];

mas[i] = 1;

}

}

}

count += 1;

sem_post(&sem1);

sem_post(&sem2);

return 1;

}

void clear()

{

while(getchar() != '\n');

}

void space()

{

while(getchar() != ' ');

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]