2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2, 3  След.
 
 Задачка на тему стек!
Сообщение01.12.2005, 08:29 
Народ подскажите как написать программку на СИ!
Задание:
Имеется n веществ. Задана таблица взаимодействия: некоторым парам веществ ставится в соответствие вещество, получаемое в результате их взаимодействия. Задана последовательность помещения веществ в пробирку. Если в пробирке рядом оказываются реагирующие вещества, они мгновенно превращаются в третье вещество согласно таблице.
Определите какие вещества останутся в пробирке.


Заранее СПАСИБО!!!

  
                  
 
 
Сообщение01.12.2005, 12:21 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
А в чем, собственно, затруднение? Задача на работу со структурами данных. Делаете однонаправленный список, кладете по одному объекты. После добавления каждого нового проверяете его реакцию со следующим. Если реагируют, то вместо этих двух кладете результат и снова проверяете со следующим. Когда проверка закончится, кладете следующий элемент. И так в цикле.

Если хотите помощи, задавайте конкретные вопросы.

 Профиль  
                  
 
 
Сообщение01.12.2005, 23:44 


27/11/05
183
Северодонецк
код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include <stdio.h>
#include <malloc.h>

#define CODE_FUNC_ERROR_PAR 1 // Ошибочны параметры функции
#define CODE_FUNC_ERROR_MEM 2 // Нет памяти
#define CODE_FUNC_OK        0 // Норма

struct formula
{
  long n1;  // Первое вещество из пары взаимодействующих веществ
  long n2;  // Второе вещество из пары взаимодействующих веществ
  long n3;  // Результат их взаимодействия
};

long stack_func
(
  struct formula  *para,    // Список формул взаимодействий веществ
  long            len_para, // Размер списка формул
  long            *src,     // Список веществ для опыта
  long            len_src,  // Размер списка веществ для опыта
  long            **out,    // Адрес результирующего списка веществ
                            //  после окончания опыта
  long            *len_out  // Размер списка веществ в результате опыта
)
{
  long i, j, n1, n2, *p;

  // Некоторый контроль входных параметров
  if(para == NULL || src == NULL || out == NULL || len_para < 1 || len_src < 2)
  {
    return(CODE_FUNC_ERROR_PAR);
  }

  // Выделение памяти для результата
  if((*out = p = (long *)malloc(len_src * sizeof(long))) == NULL)
  {
    return(CODE_FUNC_ERROR_MEM);
  }

  // Поместить в массив результата первое вещество
  p[0] = src[0];

  // Просмотр всех остальных веществ
  for(i = 1; i < len_src; ++i)
  {
    n1 = p[0];    // Последнее вещество из пробирки
    n2 = *++src;  // Очередное вещество для опыта

    // Поиск формулы взаимодействия этих веществ
    for(j = 0; j < len_para; ++j)
    {
      if(n1 == para[j].n1 && n2 == para[j].n2)
        break;
    }

    // Если формулу взаимодействия нашли, заменить
    // последнее вещество из пробирки на результат взаимодействия
    if(j != len_para)
    {
      p[0] = para[j].n3;
      continue;
    }

    // Формулу не нашли, последним веществом в пробирке будет
    // очередное выбранное вещество
    *++p = n2;
  }

  // Подсчитать количество веществ, оказавшихся
  // в пробирке после всех взаимодействий

  *len_out = (p - *out) + 1;

  // Возвратить успешный код возврата
  return(CODE_FUNC_OK);
}

// Список формул

struct formula prior_formula[] =
{
  5, 1, 3,
  3, 4, 5,
  6, 5, 1
};

// Исходные вещества для опыта
long prior[] =
{
  6, 3, 4, 3
};

int main(int argc, char **argv)
{
  long  *result, len, i;

  switch(stack_func
         (
           prior_formula,
           sizeof(prior_formula) / sizeof(prior_formula[0]),
           prior,
           sizeof(prior) / sizeof(prior[0]),
           &result,
           &len
         )
        )
  {

  case CODE_FUNC_ERROR_PAR:
    printf("CODE_FUNC_ERROR_PAR\n");
    break;

  case CODE_FUNC_ERROR_MEM:
    printf("CODE_FUNC_ERROR_MEM\n");
    break;

  default:
    // Печать результата опыта
    for(i = 0; i < len; ++i)
    {
      printf("%d ", result[i]);
      if(i + 1 % 5 == 0)
        printf("\n");
    }
    printf("\n");
    free(result);
  }

  return(0);
}

 Профиль  
                  
 
 
Сообщение04.12.2005, 09:21 
0ГРОМНОЕ СПАСИБО!!![/b]

  
                  
 
 
Сообщение04.12.2005, 14:10 
А как переделать программку, чтобы при запуске она запрашивала эти вещества и таблицу взаимодействия? :)

Я просто плохо разбираюсь в программыровании.

  
                  
 
 
Сообщение05.12.2005, 15:29 
CHUVAK писал(а):
А как переделать программку, чтобы при запуске она запрашивала эти вещества и таблицу взаимодействия? :)

Я просто плохо разбираюсь в программыровании.


НУ ПОДСКАЖИТЕ ПОЖАЛУЙСТА!!! СРОЧНО НАДО!!!! :cry: :cry: :cry:

  
                  
 
 
Сообщение05.12.2005, 19:11 
bekas писал(а):
#include <stdio.h>
................................................
// Список формул

struct formula prior_formula[] =
{
5, 1, 3,
3, 4, 5,
6, 5, 1
};

// Исходные вещества для опыта
long prior[] =
{
6, 3, 4, 3
};
............................


А как сделать чтобы эти вещества были не цифрами а буквами? И как изменить программу?

  
                  
 
 
Сообщение05.12.2005, 22:40 


27/11/05
183
Северодонецк
Через пол-часа передам текст программы с вводом данных

 Профиль  
                  
 
 
Сообщение05.12.2005, 22:51 
bekas писал(а):
Через пол-часа передам текст программы с вводом данных


Спасибо большое!!!

  
                  
 
 
Сообщение06.12.2005, 00:34 


27/11/05
183
Северодонецк
код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include <stdio.h>
#include <malloc.h>
#include <string.h>

struct formula
{
  char *n1;  // Первое вещество из пары взаимодействующих веществ
  char *n2;  // Второе вещество из пары взаимодействующих веществ
  char *n3;  // Результат их взаимодействия
};

#define MAX_FORMULA 200 // Максимальное число формул
#define MAX_PRIOR   100 // Максимальное число опытных веществ
#define MAX_LEN 512

// Список формул
struct formula prior_formula[MAX_FORMULA];

// Число формул
long  cnt_formula;

// Число опытных веществ
long  cnt_prior;

// Исходные вещества для опыта
char *prior[MAX_PRIOR];

// Вещества в результате опыта
char *result[MAX_PRIOR];

void stack_func
(
  struct formula  *para,    // Список формул взаимодействий веществ
  long            len_para, // Размер списка формул
  char            **src,    // Список веществ для опыта
  long            len_src,  // Размер списка веществ для опыта
  char            **out,    // Адрес результирующего списка веществ
                            //  после окончания опыта
  long            *len_out  // Размер списка веществ в результате опыта
)
{
  long  i, j, d1, d2;
  char  *n1, *n2;

  // Поместить в массив результата первое вещество
  out[0] = src[0];
  d1 = d2 = 0;

  // Просмотр всех остальных веществ
  for(i = 1; i < len_src; ++i)
  {
    n1 = out[d1];    // Последнее вещество из пробирки
    n2 = src[++d2];  // Очередное вещество для опыта

    // Поиск формулы взаимодействия этих веществ
    for(j = 0; j < len_para; ++j)
    {
      if(strcmp(n1, para[j].n1) == 0 && strcmp(n2, para[j].n2) == 0)
        break;
    }

    // Если формулу взаимодействия нашли, заменить
    // последнее вещество из пробирки на результат взаимодействия
    if(j != len_para)
    {
      out[d1] = para[j].n3;
      continue;
    }

    // Формулу не нашли, последним веществом в пробирке будет
    // очередное выбранное вещество
    out[++d1] = n2;
  }

  *len_out = d1 + 1;
}

int main(int argc, char **argv)
{
  long len, i, len1, len2, len3;
  FILE *f;
  char  feld[MAX_LEN + 1];
  char  c, *s, *s1, *s2, *s3;

  // Программа стартуется с тремя параметрами (все параметры имена файлов):
  //
  // 1) имя файла с формулами взаимодействия
  // 2) имя файла с опытными веществами
  // 3) имя файла результата

  // Ввод данных о формулах взаимодействия веществ из файла,
  // структура которого предполагается следующей:
  //
  // Каждая строка файла представляет собой одну формулу взаимодействия
  // и состоит из трех слов, разделенных пробелами, например:
  //
  // свинец соляная_кислота супер_вещество
  //
  // Обратите внимание на то, что в названии веществ не должно быть
  // пробела, при необходимост последнего следует использовать символ
  // подчеркивания
  //
  // В приведенном выше примере предполагается, что если в пробирке
  // последнее вещество есть свинец, то при добавлении в пробирку
  // соляная_кислота с этим свинцом превращается в супер_вещество
  //
  // Конец файла означает конец формул взаимодействия

  if(argc != 4)
  {
    printf("Bad Param\n");
  }
       
  // А есть ли файл с формулами?
  if((f = fopen(argv[1], "r")) == NULL)
  {
    printf("Not File (%s) Found\n", argv[1]);
    return(0);
  }

  // Номер строки файла для выдачи ошибок
  i = 0;

  // Счетчик формул
  cnt_formula = 0;
 
  // Счетчик опытных веществ
  cnt_prior = 0;

  // Читаем символьный файл по записям до его конца
  while(fgets(feld, MAX_LEN, f))
  {
    ++i;

    // Сбрасываем пустые символы перед первым веществом
    for(s = feld; *s == ' ' || *s == '\t' || *s == '\n'; ++s)
      ;

    // Считаем, что если формула начинается с символа ';'
    // то это комментарийная строка
    // Комментарием будет также полностью пустая строка
    if(*s == ';' || *s == 0)
      continue;

    // Не слишком ли много формул задано?
    if(cnt_formula == MAX_FORMULA)
    {
      printf("Error Big Formula\n");
      goto error1;
    }

    // Отмечаем начало первого слова во введенной записи
    s1 = s;

    // Ищем конец первого слова
    while((c = *++s) != ' ' && c != '\t' && c != '\n' && c)
      ;

    // Записываем в конец первого слова символ конца строки
    *s = 0;

    // А есть ли еще слова после первого слова?
    if(c == 0)
    {

error:

      printf("Error Formula Line %d\n", i);

error1:

      fclose(f);

error2:

      // Освобождаем память
      for(i = 0; i < cnt_formula; ++i)
        free(prior_formula[i].n1);

      return(0);
    }

    // Сбрасываем пустые символы перед вторым веществом
    while((c = *++s) == ' ' || c == '\t' || c == '\n')
      ;

    // А есть ли второе вещество?
    if(c == 0)
      goto error;        

    // Отмечаем начало второго слова во введенной записи
    s2 = s;

    // Ищем конец второго слова
    while((c = *++s) != ' ' && c != '\t' && c != '\n' && c)
      ;

    // Записываем в конец второго слова символ конца строки
    *s = 0;

    // А есть ли еще слова после второго слова?
    if(c == 0)
      goto error;        

    // Сбрасываем пустые символы перед третьим веществом
    while((c = *++s) == ' ' || c == '\t' || c == '\n')
      ;

    // Отмечаем начало третьего слова во введенной записи
    s3 = s;

    // Ищем конец третьего слова
    while((c = *++s) != ' ' && c != '\t' && c != '\n' && c)
      ;

    // Записываем в конец третьего слова символ конца строки
    *s = 0;

    // После третьего слова до конца записи могут идти только
    // пустые символы
    if(c)
    {
      while((c = *++s) == ' ' || c == '\t' || c == '\n')
        ;
      if(c)
        goto error;
    }

    // Теперь можно выделить память под три слова и запомнить их там
    // Считаем, что память есть всегда, поэтому не применяем контроль
    len1 = strlen(s1) + 1;
    len2 = strlen(s2) + 1;
    len3 = strlen(s3) + 1;
    s = (char *)malloc(len1 + len2 + len3);
    prior_formula[cnt_formula].n1 = s;
    prior_formula[cnt_formula].n2 = s + len1;
    prior_formula[cnt_formula].n3 = s + len1 + len2;
    strcpy(prior_formula[cnt_formula].n1, s1);
    strcpy(prior_formula[cnt_formula].n2, s2);
    strcpy(prior_formula[cnt_formula].n3, s3);

    // Увеличиваем счетчик формул
    ++cnt_formula;
  }

  // А есть ли хотя бы одна формула?
  if(cnt_formula == 0)
  {
    printf("Error No Formula\n");
    goto error1;
  }

  // С формулами покончено, закрываем их файл
  fclose(f);

  // Ввод данных о веществах, участвующих в опыте
  // Считается, что они тоже заданы словами, разделенными пробелами,
  // но для упрощения программы будем их вводить при помощи fscanf,
  // а не заниматься разбором, как для формул

  // А есть ли файл с опытными веществами?
  if((f = fopen(argv[2], "r")) == NULL)
  {
    printf("Not File (%s) Found\n", argv[2]);
    goto error2;
  }

  while(fscanf(f, "%s", feld) == 1)
  {
    if(cnt_prior == MAX_PRIOR)
    {
      printf("Error Big Prior\n");

      // Освобождаем память
      for(i = 0; i < cnt_prior; ++i)
        free(prior[i]);
      goto error1;
    }
    prior[cnt_prior] = (char *)malloc(strlen(feld) + 1);
    strcpy(prior[cnt_prior], feld);
    ++cnt_prior;
  }

  // А есть ли опытные вещества?
  if(cnt_prior == 0)
  {
    printf("Error No Prior\n");
    goto error1;
  }

  // С опытными веществами покончено, закрываем их файл
  fclose(f);

  stack_func(prior_formula, cnt_formula, prior, cnt_prior, result, &len);

  // Открыть файл печати результата
  f = fopen(argv[3], "w");

  // Печать результата опыта
  for(i = 0; i < len; ++i)
  {
    fprintf(f, "%s ", result[i]);
    if(i + 1 % 5 == 0)
      fprintf(f, "\n");
  }
  fprintf(f, "\n");

  fclose(f);

  // Освободить память

  for(i = 0; i < cnt_formula; ++i)
    free(prior_formula[i].n1);

  for(i = 0; i < cnt_prior; ++i)
    free(prior[i]);

  return(0);
}


------------------------------------------
Так, если есть файлы:

f1.txt:

t5 t1 t3
t3 t4 t5
t6 t5 t1

f2.txt:

t6 t3 t4 t3

то в результате запуска prog.exe f1.txt f2.txt f3.txt

в файле f3.txt должно быть следующее:

t6 t5 t3[/code]

 Профиль  
                  
 
 
Сообщение06.12.2005, 07:46 


27/11/05
183
Северодонецк
После фрагмента:


// А есть ли опытные вещества?
if(cnt_prior == 0)
{
printf("Error No Prior\n");
goto error1;
}

надо бы еще добавить:

// Опытных веществ должно быть не менее двух
if(cnt_prior < 2)
{
printf("Error 2 Prior\n");
goto error1;
}

 Профиль  
                  
 
 
Сообщение06.12.2005, 19:18 
За прогу конечно же большое спасибо! Но как я понял данная программа должна запускаться из командной строки с двумя параметрами(текст с формулами и текст с веществами)!
При этом в ходе тестирования вашей проги я нашёл одну ошибку:
если у нас имеется формула 2, 3, 4 т.е. при взаимод. веществ 2 и 3 мы получаем 4,
то при наличии веществ 1, 5, 2, 3, 6 да она работает! получаем: 1, 5, 4, 6
Но если у нас имеются вещества 1, 5, 3, 2, 6 она не работает! вещества 3 и 2 не заменяются на 4! Получаем опять 1, 5, 3, 2, 6 ! Пожалуйста раскажите как это исправить!!!!!! И ещё как сделать чтобы эта прога ПРИ ЗАПУСКЕ ЗАПРАШИВАЛА ЭТИ ТЕКСТОВЫЕ ФАЙЛЫ(их пути) С ФОРМУЛАМИ И ВЕЩЕСТВАМИ!

P.S. не исключено что ваша прога работает провильно! Возможно я ошибаюсь!

  
                  
 
 
Сообщение07.12.2005, 00:03 


27/11/05
183
Северодонецк
Как вы сказали, возможно, ошибки нет. Это как в известном историческом
анекдоте, когда первая американская противоракетная система при первом
своем практическом испытании запустила ракету в сторону луны.
Разработчикам ведь сказали, что надо обороняться от любого небесного
объекта, движущегося на США. А надо было уточнить, что луна не входит
в этот перечень. Из вашей формулировки задачи явно не следовало, что
комбинация формул A-B-C и B-A-C это одно и то же. Впрочем, исправления
в программе тривиальны (см. далее текст программы):

вместо

if(strcmp(n1, para[j].n1) == 0 && strcmp(n2, para[j].n2) == 0)

необходимо записать

if(strcmp(n1, para[j].n1) == 0 && strcmp(n2, para[j].n2) == 0 ||
strcmp(n2, para[j].n1) == 0 && strcmp(n1, para[j].n2) == 0)

Чтобы вводить имена файлов с консоли, также особых переделок в программе
не понадобилось (см. далее текст программы).

Если не секрет, в какой области образования ваше поприще?

код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include <stdio.h>
#include <malloc.h>
#include <string.h>

struct formula
{
  char *n1;  // Первое вещество из пары взаимодействующих веществ
  char *n2;  // Второе вещество из пары взаимодействующих веществ
  char *n3;  // Результат их взаимодействия
};

#define MAX_FORMULA 200 // Максимальное число формул
#define MAX_PRIOR   100 // Максимальное число опытных веществ
#define MAX_LEN 512

// Список формул
struct formula prior_formula[MAX_FORMULA];

// Число формул
long  cnt_formula;

// Число опытных веществ
long  cnt_prior;

// Исходные вещества для опыта
char *prior[MAX_PRIOR];

// Вещества в результате опыта
char *result[MAX_PRIOR];

void stack_func
(
  struct formula  *para,    // Список формул взаимодействий веществ
  long            len_para, // Размер списка формул
  char            **src,    // Список веществ для опыта
  long            len_src,  // Размер списка веществ для опыта
  char            **out,    // Адрес результирующего списка веществ
                            //  после окончания опыта
  long            *len_out  // Размер списка веществ в результате опыта
)
{
  long  i, j, d1, d2;
  char  *n1, *n2;

  // Поместить в массив результата первое вещество
  out[0] = src[0];
  d1 = d2 = 0;

  // Просмотр всех остальных веществ
  for(i = 1; i < len_src; ++i)
  {
    n1 = out[d1];    // Последнее вещество из пробирки
    n2 = src[++d2];  // Очередное вещество для опыта

    // Поиск формулы взаимодействия этих веществ
    for(j = 0; j < len_para; ++j)
    {
      if(strcmp(n1, para[j].n1) == 0 && strcmp(n2, para[j].n2) == 0 ||
         strcmp(n2, para[j].n1) == 0 && strcmp(n1, para[j].n2) == 0)
        break;
    }

    // Если формулу взаимодействия нашли, заменить
    // последнее вещество из пробирки на результат взаимодействия
    if(j != len_para)
    {
      out[d1] = para[j].n3;
      continue;
    }

    // Формулу не нашли, последним веществом в пробирке будет
    // очередное выбранное вещество
    out[++d1] = n2;
  }

  *len_out = d1 + 1;
}

int main(int argc, char **argv)
{
  long len, i, len1, len2, len3;
  FILE *f;
  char  feld[MAX_LEN + 1];
  char  c, *s, *s1, *s2, *s3;
  char  name_formula[MAX_LEN], name_prior[MAX_LEN], name_out[MAX_LEN];

  // Программа стартуется без параметров,
  // а имена файлов вводятся с консоли
  //
  // 1) имя файла с формулами взаимодействия
  // 2) имя файла с опытными веществами
  // 3) имя файла результата

  // Ввод данных о формулах взаимодействия веществ из файла,
  // структура которого предполагается следующей:
  //
  // Каждая строка файла представляет собой одну формулу взаимодействия
  // и состоит из трех слов, разделенных пробелами, например:
  //
  // свинец соляная_кислота супер_вещество
  //
  // Обратите внимание на то, что в названии веществ не должно быть
  // пробела, при необходимост последнего следует использовать символ
  // подчеркивания
  //
  // В приведенном выше примере предполагается, что если в пробирке
  // последнее вещество есть свинец, то при добавлении в пробирку
  // соляная_кислота с этим свинцом превращается в супер_вещество
  //
  // Конец файла означает конец формул взаимодействия

  // Запрос имен трех файлов с консоли
  // Не предполагается никаких проверок (переполнение и так далее)
  printf("Formula File? ");
  gets(name_formula);

  printf("Prior File?   ");
  gets(name_prior);

  printf("Result File?  ");
  gets(name_out);

  // А есть ли файл с формулами?
  if((f = fopen(name_formula, "r")) == NULL)
  {
    printf("Not File (%s) Found\n", name_formula);
    return(0);
  }

  // Номер строки файла для выдачи ошибок
  i = 0;

  // Счетчик формул
  cnt_formula = 0;
 
  // Счетчик опытных веществ
  cnt_prior = 0;

  // Читаем символьный файл по записям до его конца
  while(fgets(feld, MAX_LEN, f))
  {
    ++i;

    // Сбрасываем пустые символы перед первым веществом
    for(s = feld; *s == ' ' || *s == '\t' || *s == '\n'; ++s)
      ;

    // Считаем, что если формула начинается с символа ';'
    // то это комментарийная строка
    // Комментарием будет также полностью пустая строка
    if(*s == ';' || *s == 0)
      continue;

    // Не слишком ли много формул задано?
    if(cnt_formula == MAX_FORMULA)
    {
      printf("Error Big Formula\n");
      goto error1;
    }

    // Отмечаем начало первого слова во введенной записи
    s1 = s;

    // Ищем конец первого слова
    while((c = *++s) != ' ' && c != '\t' && c != '\n' && c)
      ;

    // Записываем в конец первого слова символ конца строки
    *s = 0;

    // А есть ли еще слова после первого слова?
    if(c == 0)
    {

error:

      printf("Error Formula Line %d\n", i);

error1:

      fclose(f);

error2:

      // Освобождаем память
      for(i = 0; i < cnt_formula; ++i)
        free(prior_formula[i].n1);

      return(0);
    }

    // Сбрасываем пустые символы перед вторым веществом
    while((c = *++s) == ' ' || c == '\t' || c == '\n')
      ;

    // А есть ли второе вещество?
    if(c == 0)
      goto error;        

    // Отмечаем начало второго слова во введенной записи
    s2 = s;

    // Ищем конец второго слова
    while((c = *++s) != ' ' && c != '\t' && c != '\n' && c)
      ;

    // Записываем в конец второго слова символ конца строки
    *s = 0;

    // А есть ли еще слова после второго слова?
    if(c == 0)
      goto error;        

    // Сбрасываем пустые символы перед третьим веществом
    while((c = *++s) == ' ' || c == '\t' || c == '\n')
      ;

    // Отмечаем начало третьего слова во введенной записи
    s3 = s;

    // Ищем конец третьего слова
    while((c = *++s) != ' ' && c != '\t' && c != '\n' && c)
      ;

    // Записываем в конец третьего слова символ конца строки
    *s = 0;

    // После третьего слова до конца записи могут идти только
    // пустые символы
    if(c)
    {
      while((c = *++s) == ' ' || c == '\t' || c == '\n')
        ;
      if(c)
        goto error;
    }

    // Теперь можно выделить память под три слова и запомнить их там
    // Считаем, что память есть всегда, поэтому не применяем контроль
    len1 = strlen(s1) + 1;
    len2 = strlen(s2) + 1;
    len3 = strlen(s3) + 1;
    s = (char *)malloc(len1 + len2 + len3);
    prior_formula[cnt_formula].n1 = s;
    prior_formula[cnt_formula].n2 = s + len1;
    prior_formula[cnt_formula].n3 = s + len1 + len2;
    strcpy(prior_formula[cnt_formula].n1, s1);
    strcpy(prior_formula[cnt_formula].n2, s2);
    strcpy(prior_formula[cnt_formula].n3, s3);

    // Увеличиваем счетчик формул
    ++cnt_formula;
  }

  // А есть ли хотя бы одна формула?
  if(cnt_formula == 0)
  {
    printf("Error No Formula\n");
    goto error1;
  }

  // С формулами покончено, закрываем их файл
  fclose(f);

  // Ввод данных о веществах, участвующих в опыте
  // Считается, что они тоже заданы словами, разделенными пробелами,
  // но для упрощения программы будем их вводить при помощи fscanf,
  // а не заниматься разбором, как для формул

  // А есть ли файл с опытными веществами?
  if((f = fopen(name_prior, "r")) == NULL)
  {
    printf("Not File (%s) Found\n", name_prior);
    goto error2;
  }

  while(fscanf(f, "%s", feld) == 1)
  {
    if(cnt_prior == MAX_PRIOR)
    {
      printf("Error Big Prior\n");

      // Освобождаем память
      for(i = 0; i < cnt_prior; ++i)
        free(prior[i]);
      goto error1;
    }
    prior[cnt_prior] = (char *)malloc(strlen(feld) + 1);
    strcpy(prior[cnt_prior], feld);
    ++cnt_prior;
  }

  // А есть ли опытные вещества?
  if(cnt_prior == 0)
  {
    printf("Error No Prior\n");
    goto error1;
  }

  // А не слишком ли мало опытных веществ?
  if(cnt_prior < 2)
  {
    printf("Error 2 Prior\n");
    goto error1;
  }

  // С опытными веществами покончено, закрываем их файл
  fclose(f);

  stack_func(prior_formula, cnt_formula, prior, cnt_prior, result, &len);

  // Открыть файл печати результата
  f = fopen(name_out, "w");

  // Печать результата опыта
  for(i = 0; i < len; ++i)
  {
    fprintf(f, "%s ", result[i]);
    if(i + 1 % 5 == 0)
      fprintf(f, "\n");
  }
  fprintf(f, "\n");

  fclose(f);

  // Освободить память

  for(i = 0; i < cnt_formula; ++i)
    free(prior_formula[i].n1);

  for(i = 0; i < cnt_prior; ++i)
    free(prior[i]);

  return(0);
}

 Профиль  
                  
 
 
Сообщение07.12.2005, 07:51 
И ещё хочу спросить: вы в этой проге использовали библиотеку malloc.h! Скажите пожалуйста
какие прототипы функций она содержит (имеется вввиду прототипы тех функций которые используются у вас в программе)

  
                  
 
 
Сообщение07.12.2005, 14:35 


27/11/05
183
Северодонецк
Это функции free и malloc

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу 1, 2, 3  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Missir


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group