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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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