Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: помгите с лабой по С  (Прочитано 1963 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн nexus1418

  • Автор темы
  • Новичок
  • *
  • Сообщений: 44
    • Просмотр профиля
помгите с лабой по С
« : 03 Апреля 2008, 00:47:39 »
имеем многомерный массив, надо найти минимальное значение каждой строчки
и вывести индекс этого элемента
ошибка то что если цифра в строке на 1 месте самая маленькая, то выводит крякозяблы, если она на любом другом месте, то все хорошо
#include<stdio.h>

#include"matrix.h"

void input_matrix(int mrow, int mcol, double mat[mrow][mcol], char name)

{

   int r, c;

   for(r = 0; r < mrow; r++)

     for(c = 0; c < mcol; c++)

     {

        printf("%c[%d][%d]=", name, r, c);

        scanf("%lf", &mat[r][c]);

     }

}



void min_in_row(int mrow, int mcol, const double mat[mrow][mcol], double min[], double indeksstr[], double indeksstol[])

{

   int r, c,MaxR,MaxC;

   double s,s2,MinA;

    MinA=mat[0][0];

    for(r = 0; r < mrow; r++)

   {

     MinA=mat[0][0];

     s=s2=0;

     

     for(c = 0; c < mcol; c++)

     {

       if(MinA > mat[r][c] )

            {

             MinA=mat[r][c];

             s=r;

             s2=c;

             indeksstr[r]=s;

            indeksstol[r]=s2;

             min[r]=MinA;

            }

             

     }

    }

   

}

void output(int mrow, int mcol, const double mat[mrow][mcol], const double min[], const double indeksstr[], const double indeksstol[])

{

   int r, c,MaxR,MinR;

   double s,s2,MinA;

   for(r = 0; r < mrow; r++)

   {

           

     for(c = 0; c < mcol; c++)

       

       printf("%8.4g", mat[r][c]);

       printf("||Min znach%8.4g", min[r]);

       printf("||Str%8.4g", indeksstr[r]);

       printf("||col%8.4g", indeksstol[r]);

       printf("\n");

       

   }   

}

Оффлайн 12d3

  • Активист
  • *
  • Сообщений: 674
  • Ubuntu 10.04
    • Просмотр профиля
Re: помгите с лабой по С
« Ответ #1 : 03 Апреля 2008, 01:28:04 »
офигеть.
в min_in_row:
1) первый MinA=mat[0][0]; нафиг не нужен, хотя это пофиг.
2) Второй MinA=mat[0][0]; должен быть MinA=mat[r][0];
боюсь спросить, чему же в школе учили  :o

Оффлайн nexus1418

  • Автор темы
  • Новичок
  • *
  • Сообщений: 44
    • Просмотр профиля
Re: помгите с лабой по С
« Ответ #2 : 03 Апреля 2008, 01:39:02 »
ну да согласен)))исправлено давно
но не в этом проблема
проблема в том что если минималный символ стоит на 1 месте то выводит какой-то бред
если на любом другом то все нормально

Оффлайн 12d3

  • Активист
  • *
  • Сообщений: 674
  • Ubuntu 10.04
    • Просмотр профиля
Re: помгите с лабой по С
« Ответ #3 : 03 Апреля 2008, 01:47:56 »
а у вас в этом случае в indeksstr и indexstol ничего не пихается.
лучше так:
void min_in_row(int mrow, int mcol, const double mat[mrow][mcol], double min[], double indeksstr[], double indeksstol[])
{
   int r, c;
   double MinA;
   for(r = 0; r < mrow; r++) {
     minA=mat[r][0];
     indeksstr[r]=r;
     indeksstol[r]=0;
     for(c = 0; c < mcol; c++) {
       if(MinA > mat[r][c] ) {
          MinA=mat[r][c];
          indeksstol[r]=c;
       }
       min[r]=MinA;
     }
    }
}

Оффлайн nexus1418

  • Автор темы
  • Новичок
  • *
  • Сообщений: 44
    • Просмотр профиля
Re: помгите с лабой по С
« Ответ #4 : 03 Апреля 2008, 01:51:42 »
работает, спасибо!
и если не трудно прокомментируй свой пост

Оффлайн 12d3

  • Активист
  • *
  • Сообщений: 674
  • Ubuntu 10.04
    • Просмотр профиля
Re: помгите с лабой по С
« Ответ #5 : 03 Апреля 2008, 02:01:35 »
легко.
1) когда у тебя первый элемент минимальный, то if(MinA > mat[r][c])  не выполняется ни для одного элемента из строки, то бишь для этой строки indeksstr[r] и indexstol[r] ни разу не присвоится, следовательно, будет рандомным.
2) для r-ой строки indexstr[r] всегда равно r, то есть его достаточно присвоить только один раз.

Оффлайн Dem2n

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
...
« Ответ #6 : 19 Апреля 2008, 09:08:42 »
Не буду плодить темы, ибо моя проблема из той же категории...

Что требуется: написать очередную (четвертую из семи) учебную прогу по курсу ОС.
В чем проблема: отсутствует даже представление с чего тут начать и как это делать  :(

Собственно вот задания:

1. Написать реализацию очереди строк в разделяемой памяти. При запуске программа создает блок
разделяемой памяти (если его еще нет) или присоединяется к существующему блоку. Программа должна
обеспечивать основные функции для работы с очередью (добавить и удалить элемент) и возможность запуска
себя во многих экземплярах.
2. Написать программу, вычисляющую сумму элементов n последовательностей вещественных чисел,
находящихся в n файлах, имена которых заданы массивом A. Ответ должен быть записан в файл res.txt.
Программа запускает n процессов, вычисляющих ответ для каждого из файлов и прибавляющих его к
результату, находящемуся в выходном файле. Для совместного доступа к файлу использовать механизмы
отображения файла в память и блокировки чтения/записи (функции mmap и fcntl).
3. Реализовать клиент-серверное приложение, в котором процесс-клиент считывает строку со
стандартного ввода и передает ее через разделяемую память процессу-серверу, выводящему ее на
стандартный вывод. Для организации взаимного исключения при доступе к критически разделяемым ресурсам
использовать семафор.
4. Написать функцию, получающую в качестве аргументов целое число n и массив длины n с именами
файлов, содержащих единую последовательность вещественных чисел неизвестной длины, и возвращающую
 количество участков постояннства этой последовательности. Функция возвращает -1, -2 и т.д., если она не
смогла открыть какой-либо файл, прочитать элемент и т.д. Функция должна запускать n процессов,
обрабатывающих свой файл и передающих результаты в основной процесс через очередь сообщений для
 формирования ответа для последовательности в целом.
5. Написать программу, осуществляющую мониторинг и перезапуск в случае завершения работы заданного
 количества приложений. Приложения задаются массивом строк, являющихся их полным путевым именем, и
 не имеют аргументов.
6. Написать реализацию стека строк в разделяемой памяти. При запуске программа создает блок
разделяемой памяти (если его еще нет) или присоединяется к существующему блоку. Программа должна
обеспечивать основные функции для работы со стеком (добавить и удалить элемент) и возможность запуска
себя во многих экземплярах.
7. Написать программу, вычисляющую сумму элементов n последовательностей вещественных чисел,
 находящихся в n файлах, имена которых заданы массивом A. Ответ должен быть записан в файл res.txt.
Программа запускает n процессов, вычисляющих ответ для каждого из файлов и прибавляющих его к
результату, находящемуся в выходном файле. Взаимное исключение при доступе к файлу обеспечиавется с
 помощью семафора.
8. Написать реализацию набора конфигурационных параметров для многих одновременно работающих
экземпляров программы. Набор параметров задается некоторой структурой данных и хранится в разделяемой
 памяти. Блок разделяемой памяти создается при запуске первого экземпляра программы и заполняется из
файла. Перед окончанием работы последнего экземпляра набор параметров сохраняется в файле, а блок
разделяемой памяти удаляется. Программа должна обеспечивать основные функции работы с набором
параметров (прочитать и изменить элемент), причем в случае изменения данных одним из экземпляров он
оповещает все остальные экземпляры с помощью сигнала.
9. Реализовать многопроцессную программу вычисления произведения матрицы на вектор, организуя
взаимодействие между процессами посредством каналов (функция pipe).
10. Реализуйте программу, которая запускает процесс, читающий построчно текст из файла и передающий
 строки по каналам (функция pipe) одновременно трем потомкам. Первый потомок печатает в файл digit.out
 только цифры, встречающиеся в данных строках, второй -  в файл small.out только маленькие латинские
буквы, третий – в файл big.out только заглавные латинские буквы. Родительский процесс должен ожидать
завершения порожденных процессов.
11. Реализовать клиент-серверное приложение, в котором процесс-клиент считывает строку со
стандартного ввода и передает ее через файл, отображаемый в память процессу-серверу, выводящему ее на
 стандартный вывод. Для организации взаимного исключения при доступе к критически разделяемым ресурсам
 использовать семафор.

Из всего вышеприведенного особый интерес вызывает первый номер, все остальное факультативно.
Чего я жду? Идеальным вариантом будет, если Вы сможете мне подкинуть листинги программ, которые реализуют основные цели вышеприведенных заданий (Работа с процессами). Также приветствуются ссылки на маны (желательно на русском). Буду рад любой помощи, ибо пока никакого представления по воплощению этого в жизнь просто нету. А времени катастрофически мало.

Thread

  • Гость
Re: помгите с лабой по С
« Ответ #7 : 19 Апреля 2008, 10:32:00 »
Dem2n, подобные задачи предполагают активное использование интерфейсов UNIX. По первому заданию: курить http://www.cs.cf.ac.uk/Dave/C/node27.html, http://en.wikipedia.org/wiki/Shared_memory и http://www.google.lv/search?q=(unix+OR+linux+OR+posix)+shared+memory. По остальным: выявить ключевое слово, перевести на английский и гуглить :>

 

Страница сгенерирована за 0.043 секунд. Запросов: 25.