В
Все
Б
Биология
Б
Беларуская мова
У
Українська мова
А
Алгебра
Р
Русский язык
О
ОБЖ
И
История
Ф
Физика
Қ
Қазақ тiлi
О
Окружающий мир
Э
Экономика
Н
Немецкий язык
Х
Химия
П
Право
П
Психология
Д
Другие предметы
Л
Литература
Г
География
Ф
Французский язык
М
Математика
М
Музыка
А
Английский язык
М
МХК
У
Українська література
И
Информатика
О
Обществознание
Г
Геометрия
xXDenchykXx1
xXDenchykXx1
24.11.2022 21:39 •  Информатика

Программа на си,задание такое:1 процесс открывает файл порождает 2 процесс.Один из них записывает 1 байт в файл подает сигнал другому,второй читает и выводит на экран.Повторить N(у меня 6) циклов запись\чтение.
Проблема:скажите что не так в моем коде?Оно вводит в файл 012345,но выводит на консоль(cygwin,в прикрепленных скрин консоли) -1 шесть раз.
Программа:#include
#include
#include

int main(void) {
FILE *fp;
char name[] = "f.txt";//открытие файла

if ((fp = fopen(name, "w+")) == NULL)

{
printf("Не удалось открыть файл");
return 0;
}

char message = '1';//1 байт
char ch;
int pid = fork();
if (pid < 0) {
printf("Error in fork\n");
return -1;
}

for (int i = 0; i < 6; ++i) //6 ,цикл
{
if (pid > 0) {
raise(SIGSTOP);
fprintf(fp,"%d\n",i);
fflush(fp);
kill(pid, SIGCONT);
} else {
ch = fgetc(fp);

printf("\r%d\n",ch);//вывод на консоль
fflush(NULL);
kill(getppid(), SIGCONT);
raise(SIGSTOP);
}
}
fclose(fp);
return 0;
}

Показать ответ
Ответ:
baikalpearl
baikalpearl
27.01.2022 15:54
Const
  n = 20; { размер массивов }
  p=0; { минимальное значение элемента }
  q=15; { максимальное значение элемента }
type
  V=array[1..n] of integer;

procedure VInit(var a:V; s:string);
{ процедура заполняет элементы массива a
  случайными значениями из интервала [p;q].
  Элементы сформированного массива выводятся
  с заголовком, в который добавляется значение s }
var
  i,kol:integer;
begin 
  kol:=q-p+1;
  Writeln('Элементы массива ',s);
  for i:=1 to n do
  begin a[i]:=Random(kol)+p; Write(a[i],' ') end;
  Writeln
end;

procedure SortBubble(var a:V);
{ сортировка методом пузырька }
var
  i,j,t:integer;
begin
  for i := 1 to n-1 do
    for j := 1 to n-i do
      if a[j] > a[j+1] then
      begin t := a[j]; a[j] := a[j+1]; a[j+1] := t end
end;

procedure VOut(var a:V;s:string);
{ Элементы массива a выводятся с заголовком s }
var
  i:integer;
begin 
  Writeln(s);
  for i:=1 to n do Write(a[i],' ');
  Writeln
end;

function BinSearch(var a:V;key:integer):boolean;
{ двоичный поиск элемента со значением key в массиве a
  Возвращает true, если элемент найден и false, если нет }
var
  li,ri,mi:integer;
begin
  li:=1; ri:=n;
  while li<ri do begin
    mi:=(li+ri) div 2;
    if a[mi]<key then li:=mi+1 else ri:=mi;
  end;
  BinSearch:=(a[ri]=key)
end;

var
  a,b,c:V;
  i,ai1,s:integer;
  found:boolean;
begin
  Randomize;
  VInit(a,'A'); SortBubble(a); VOut(a,'Отсортированный массив A');
  VInit(b,'B'); SortBubble(b); VOut(b,'Отсортированный массив B');
  VInit(c,'C'); SortBubble(c); VOut(c,'Отсортированный массив C');
  s:=0; found:=false;
  for i:=1 to n do
  begin
    if found then
      if a[i]=ai1 then Inc(s,ai1)
      else found:=false;
    if not found then begin
      found:=BinSearch(b,a[i]);
      if found then found:=BinSearch(c,a[i]);
      if found then begin ai1:=a[i]; Inc(s,ai1) end
    end
  end;
  Writeln('Искомая сумма равна ',s);
end.

Тестовое решение:
Элементы массива A
4 10 6 4 12 5 5 15 0 14 2 2 0 3 14 1 11 13 3 9
Отсортированный массив A
0 0 1 2 2 3 3 4 4 5 5 6 9 10 11 12 13 14 14 15
Элементы массива B
7 3 13 3 10 11 3 15 12 10 0 5 5 15 13 1 15 9 1 5
Отсортированный массив B
0 1 1 3 3 3 5 5 5 7 9 10 10 11 12 13 13 15 15 15
Элементы массива C
4 10 5 8 14 15 8 14 12 4 12 12 3 11 4 0 12 2 10 0
Отсортированный массив C
0 0 2 3 4 4 4 5 8 8 10 10 11 12 12 12 12 14 14 15
Искомая сумма равна 64
0,0(0 оценок)
Ответ:
KsennyTAR
KsennyTAR
11.08.2021 17:55
Const
n=10;m=7;
var
a:array[1..n,1..m]of integer;
i,j,min,s,j_m:integer;
     begin     
         for i:=1 to n do         
               begin             
                  writeln;                     
                     for j:=1 to m do                         
                          begin                               
                              a[i,j]:=random(20)-5;                             
                              write(a[i,j]:4);                         
                          end;       
                end;         
writeln;  
{запишем в min чуть больше наибольшего значения суммы, которая может быть в любом столбце. Больше, чем 200 не будет, т.к. всего 10 строк, каждое значение исходя из заполнения матрицы не может быть больше, чем 15 }
min:=200;j_m:=1;
            for j:=1 to m do         
                begin             
                    s:=0;                   
                       for i:=1 to n do                     
                            s:=s+a[i,j];                   
                               if s<min then                     
                                    begin                           
                                       j_m:=j;                         
                                       min:=s;                     
                                    end;             
                              writeln('j :',j,' ',s);  {выводится значение суммы в каждом столбце, необязательно, можно удалить}       
                 end;         
writeln('№ столбца с мин суммой ',j_m);     
     for i:=1 to n do         
            writeln(a[i,j_m]); {вывод нужного столбца}
end.                           
0,0(0 оценок)
Популярные вопросы: Информатика
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota Оформи подписку
logo
Начни делиться знаниями
Вход Регистрация
Что ты хочешь узнать?
Спроси ai-бота