"СЕАНС ДЛЯ ВЗРОСЛЫХ"

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » "СЕАНС ДЛЯ ВЗРОСЛЫХ" » Учёба,работа! » Ученье свет..... Помогите, умные головы :-)


Ученье свет..... Помогите, умные головы :-)

Сообщений 1 страница 24 из 24

1

Господа, Умники)умницы) нужна помощь..........
Построить программу выполнения заданного преобразования арифметического выражения с применением деревьев.
Преобразование выражения реализовать в виде набора подпрограмм
Программа должна вводить и печатать выражения в исходном(текстовом) виде, преобразовывать их в деревья, выполнять задание преобразования путем обращения к подрограммам и печатать результаты в виде дерева и в его текстововм представлении
Программу проверить на нескольких выражениях, среди которых должны быть выражения, не содержащие преобразуемых элементов, содержащие ровно один такой элемент или несколько элементов подлежащих преобразованию, причем в разных местах дерева
а само задание вот:
Упростить выражение, выполнив деление
4*a/2 -> 2*a
Язык программирования Си
75% уже сделано, а может и больше, может кто подправит...

/////////////////////////////////////////////////////////////////////
//          Лабораторная работа 24                                 //
//            Упростить выражения, выполнив деление:               //
//                   4*a/2 -> 2*a                                  //
//                                                                 //
/////////////////////////////////////////////////////////////////////

/********************************************************************     
*                    Определим синтаксис выражений                 *
*    expr   -> term   | expr + term | expr - term                  *
*    term   -> fact   | term * fact | term / fact                  *
*    fact   -> (expr) | digit       | letter                       *
*    digit  -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9               *
*    letter -> a | b | c | ... | z | A | B | ... | Z               *
********************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct node* Tree;

struct node
{
    char value;
    Tree left;
    Tree right;
};

int x = 0;
int y = 0;

/////////////////////////////////////////////////////////////////////
int  CharToInt(char ch)
{
  switch((int)ch)
    {
    case 48:
      return 0;
      break;
    case 49:
      return 1;
      break;
    case 50:
      return 2;
      break;
    case 51:
      return 3;
      break;
    case 52:
      return 4;
      break;
    case 53:
      return 5;
      break;
    case 54:
      return 6;
      break;
    case 55:
      return 7;
      break;
    case 56:
      return 8;
      break;
    case 57:
      return 9;
      break;
    }
  return -1;
}
/////////////////////////////////////////////////////////////////////
char IntToChar(int i)
{
  switch(i)
    {
    case 0:
      return '0';
      break;
    case 1:
      return '1';
      break;
    case 2:
      return '2';
      break;
    case 3:
      return '3';
      break;
    case 4:
      return '4';
      break;
    case 5:
      return '5';
      break;
    case 6:
      return '6';
      break;
    case 7:
      return '7';
      break;
    case 8:
      return '8';
      break;
    case 9:
      return '9';
      break;
    }
  return '&';
}
/////////////////////////////////////////////////////////////////////
Tree node_create(char value, Tree left, Tree right)
{
  Tree uzel;
  uzel = (Tree) malloc (sizeof(struct node));
  if (uzel == NULL)
    {
      perror("malloc");
      exit(1);
    }
  uzel->value = value;
  uzel->left = left;
  uzel->right = right;
  return uzel;
}
/////////////////////////////////////////////////////////////////////
void tree_destroy(Tree t)
{
  while (t != NULL)
    {
      Tree tmp;
      tree_destroy(t->left);
      tmp = t;
      t = t->right;
      free(tmp);
    }
}
/////////////////////////////////////////////////////////////////////
void tree_print_with_tab(Tree t, int tab)
{
  if (t->right != NULL)
    tree_print_with_tab(t->right, tab + 1);
  for (int i = 0; i < tab; ++i)
    printf("   ");
  printf("%c \n", t->value);
  if(t->left != NULL)
    tree_print_with_tab(t->left, tab + 1);
}
/////////////////////////////////////////////////////////////////////
void tree_print(Tree t)
{
  if (t != NULL)
    tree_print_with_tab(t,0);
  else
    printf("<empty>");
}
/////////////////////////////////////////////////////////////////////
extern  Tree  parse_expr();

Tree parse_fact()
{
  Tree fact = NULL;
  char ch = getchar();
  if (ch == '(')
    {
      fact = parse_expr();
      ch = getchar();
    }
  else if (isalnum(ch))
    fact = node_create(ch,NULL,NULL);

  return fact;
}
/////////////////////////////////////////////////////////////////////
Tree parse_term()
{
  char ch;
  Tree term  = parse_fact();
  while ((ch = getchar())!= '\n')
    if (ch == '*' || ch == '/')
      term = node_create(ch,term, parse_fact());
    else
      break;
  ungetc(ch,stdin);
return term;
}
/////////////////////////////////////////////////////////////////////
Tree parse_expr()
{
  char ch;
  Tree ex = parse_term();
  while ((ch = getchar()) != '\n')
    if (ch == '+' || ch == '-')
      ex = node_create(ch,ex,parse_term());
    else
      break;
  ungetc(ch,stdin);
  return ex;
}

/////////////////////////////////////////////////////////////////////
void recreate_tree(Tree t)
{
  if (t != NULL)
    {
        if ((t->value == '*') && (t->right->value == '/'))
       {
   if ((t->left != NULL) && (t->right->right != NULL))
     {
       x = CharToInt((t->left->value));
       y = CharToInt((t->right->right->value));
       t->left->value = IntToChar(x/y);
     }
   else return;   // new!!!
        }
     recreate_tree(t->left);
     recreate_tree(t->right);
      if (t->value == '/' )
      {
   t->value = t->left->value;
          tree_destroy(t->left);
          tree_destroy(t->right);
       }
    }
}

/////////////////////////////////////////////////////////////////////
void Order(Tree t)
{
  if (t != NULL)
    {
      Order(t->left);
      printf("%c",t->value);
      Order(t->right); 
    }
}
/////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
  printf("Введите выражение \n");
  printf("> ");
  Tree expr = parse_expr();
  printf("Дерево введенного выражения:\n");
  tree_print(expr);
  printf("Выражение:  ");
  Order(expr); printf("\n");
  recreate_tree(expr);
  printf("Дерево полученного выражения:\n");
  //printf("\n ---------------- \n");
   tree_print(expr);
   printf("Выражение:  ");
  Order(expr); printf("\n");
  tree_destroy(expr);
return 0;
}

Внутри еще и файл с этим
Скачать присоединенный файл (laba24.c):
/////////////////////////////////////////////////////////////////////
//                Лабораторная работа 24                        //
//            Упростить выражения, выполнив деление:               //
//                      4*a/2 -> 2*a                             //
//                                                                 //
/////////////////////////////////////////////////////////////////////

/********************************************************************     
*                    Определим синтаксис выражений                 *
*    expr   -> term   | expr + term | expr - term                  *
*    term   -> fact   | term * fact | term / fact                  *
*    fact   -> (expr) | digit       | letter                       *
*    digit  -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9               *
*    letter -> a | b | c | ... | z | A | B | ... | Z               *
********************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct node* Tree;

struct node
{
    char value;
    Tree left;
    Tree right;
};

int x = 0;
int y = 0;

/////////////////////////////////////////////////////////////////////
int  CharToInt(char ch)
{
  switch((int)ch)
    {
    case 48:
      return 0;
      break;
    case 49:
      return 1;
      break;
    case 50:
      return 2;
      break;
    case 51:
      return 3;
      break;
    case 52:
      return 4;
      break;
    case 53:
      return 5;
      break;
    case 54:
      return 6;
      break;
    case 55:
      return 7;
      break;
    case 56:
      return 8;
      break;
    case 57:
      return 9;
      break;
    }
  return -1;
}
/////////////////////////////////////////////////////////////////////
char IntToChar(int i)
{
  switch(i)
    {
    case 0:
      return '0';
      break;
    case 1:
      return '1';
      break;
    case 2:
      return '2';
      break;
    case 3:
      return '3';
      break;
    case 4:
      return '4';
      break;
    case 5:
      return '5';
      break;
    case 6:
      return '6';
      break;
    case 7:
      return '7';
      break;
    case 8:
      return '8';
      break;
    case 9:
      return '9';
      break;
    }
  return '&';
}
/////////////////////////////////////////////////////////////////////
Tree node_create(char value, Tree left, Tree right)
{
  Tree uzel;
  uzel = (Tree) malloc (sizeof(struct node));
  if (uzel == NULL)
    {
      perror("malloc");
      exit(1);
    }
  uzel->value = value;
  uzel->left = left;
  uzel->right = right;
  return uzel;
}
/////////////////////////////////////////////////////////////////////
void tree_destroy(Tree t)
{
  while (t != NULL)
    {
      Tree tmp;
      tree_destroy(t->left);
      tmp = t;
      t = t->right;
      free(tmp);
    }
}
/////////////////////////////////////////////////////////////////////
void tree_print_with_tab(Tree t, int tab)
{
  if (t->right != NULL)
    tree_print_with_tab(t->right, tab + 1);
  for (int i = 0; i < tab; ++i)
    printf("   ");
  printf("%c \n", t->value);
  if(t->left != NULL)
    tree_print_with_tab(t->left, tab + 1);
}
/////////////////////////////////////////////////////////////////////
void tree_print(Tree t)
{
  if (t != NULL)
    tree_print_with_tab(t,0);
  else
    printf("<empty>");
}
/////////////////////////////////////////////////////////////////////
extern  Tree  parse_expr();

Tree parse_fact()
{
  Tree fact = NULL;
  char ch = getchar();
  if (ch == '(')
    {
      fact = parse_expr();
      ch = getchar();
    }
  else if (isalnum(ch))
    fact = node_create(ch,NULL,NULL);

  return fact;
}
/////////////////////////////////////////////////////////////////////
Tree parse_term()
{
  char ch;
  Tree term  = parse_fact();
  while ((ch = getchar())!= '\n')
    if (ch == '*' || ch == '/')
      term = node_create(ch,term, parse_fact());
    else
      break;
  ungetc(ch,stdin);
return term;
}
/////////////////////////////////////////////////////////////////////
Tree parse_expr()
{
  char ch;
  Tree ex = parse_term();
  while ((ch = getchar()) != '\n')
    if (ch == '+' || ch == '-')
      ex = node_create(ch,ex,parse_term());
    else
      break;
  ungetc(ch,stdin);
  return ex;
}

/////////////////////////////////////////////////////////////////////
void recreate_tree(Tree t)
{
  if (t != NULL)
    {
        if ((t->value == '*') && (t->right->value == '/'))
          {
      if ((t->left != NULL) && (t->right->right != NULL))
        {
          x = CharToInt((t->left->value));
          y = CharToInt((t->right->right->value));
          t->left->value = IntToChar(x/y);
        }
      else return;   // new!!!
           }
     recreate_tree(t->left);
     recreate_tree(t->right);
      if (t->value == '/' )
      {
      t->value = t->left->value;
          tree_destroy(t->left);
          tree_destroy(t->right);
       }
    }
}

/////////////////////////////////////////////////////////////////////
void Order(Tree t)
{
  if (t != NULL)
    {
      Order(t->left);
      printf("%c",t->value);
      Order(t->right); 
    }
}
/////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
  printf("Введите выражение \n");
  printf("> ");
  Tree expr = parse_expr();
  printf("Дерево введенного выражения:\n");
  tree_print(expr);
  printf("Выражение:  ");
  Order(expr); printf("\n");
  recreate_tree(expr);
  printf("Дерево полученного выражения:\n");
  //printf("\n ---------------- \n");
   tree_print(expr);
   printf("Выражение:  ");
  Order(expr); printf("\n");
  tree_destroy(expr);   
return 0;
}

0

2

пдец какой ыыыы

0

3

МышкаФтапках написал(а):

нужна помощь..........

В Си я 0 по фазе)

0

4

Неужели так все запущено?)

0

5

Да что ж такое!!!!! какие вы вредные ужас....

0

6

Хм... я могу сделать. Но на это надо время.

0

7

Дим времени мало всего до среды

0

8

Как я понимаю, прогу откуда-то спионерили и под другой вариант переделывали?

0

9

бла-бла-бла........... кроме ай-ай, порицания... итог нулевой...... мдя-я-я-я

0

10

Ну Эль, ну для меня это вообще тёмный лес!! Я чесслово не знаю этой примудрости!!

0

11

Никуя себе, "75% сделано". Все, что там сделано - это обработка выражений, ввод и вывод.
Самого главного нет - разложение числителя и знаменателя на множители и выделение наибольшего общего делителя (вынесение множителя за скобки).

Короче, если успею сегодня, то сделаю.

0

12

Какой ужас!Люди,вы о чём???)))))))

0

13

Удалось найти книжку на эту тему, где методика более-менее подробно описана, правда, только на английском.

JOELS. COHEN, Computer Algebra and Symbolic Computation (Elementary Algorithms).
можно скачать здесь:
http://www.eknigu.com/info/Cs_Computer science/CsCa_Computer algebra/Cohen J. Computer algebra and symbolic computation (Peters, 2002)(344s)_CsCa_.pdf

Задача автоматического упрощения выражений (в частности, дробей), мягко говоря, нетривиальная, почему я сразу же сказал, что нужно время. Я не успеваю сделать, только завтра.

Отредактировано Кладоискатель (2007-07-10 22:15:55)

0

14

Держи, Климова... всю ночь из-за тебя не спал, но я сделал прогу. Увеличилась примерно в 2 раза.
Тестовый пример упрощает, как надо.
Остальное пусть сами доделывают, всякую мелочь типа очистки памяти.

Извини, что поздно. Но в следующий раз, прежде чем спрашивать подобные задания, запаситесь временем и терпением, потому как задача, кажущаяся простой с точки зрения далекого от математики и программирования человека, может вовсе таковой не являться.

Код:
/////////////////////////////////////////////////////////////////////
//                Лабораторная работа 24                        //
//            Упростить выражения, выполнив деление:               //
//                      4*a/2 -> 2*a                             //
//                                                                 //
/////////////////////////////////////////////////////////////////////

/********************************************************************     
*                    Определим синтаксис выражений                 *
*    expr   -> term   | expr + term | expr - term                  *
*    term   -> fact   | term * fact | term / fact                  *
*    fact   -> (expr) | digit       | letter                       *
*    digit  -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9               *
*    letter -> a | b | c | ... | z | A | B | ... | Z               *
********************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct node* Tree;

struct node
{
    char value;
    Tree left;
    Tree right;
};

int x = 0;
int y = 0;

void Order(Tree t);
Tree mul_factor(Tree u, Tree v);


/////////////////////////////////////////////////////////////////////
int  CharToInt(char ch)
{
  switch((int)ch)
    {
    case 48:
      return 0;
      break;
    case 49:
      return 1;
      break;
    case 50:
      return 2;
      break;
    case 51:
      return 3;
      break;
    case 52:
      return 4;
      break;
    case 53:
      return 5;
      break;
    case 54:
      return 6;
      break;
    case 55:
      return 7;
      break;
    case 56:
      return 8;
      break;
    case 57:
      return 9;
      break;
    }
  return -1;
}
/////////////////////////////////////////////////////////////////////
char IntToChar(int i)
{
  switch(i)
    {
    case 0:
      return '0';
      break;
    case 1:
      return '1';
      break;
    case 2:
      return '2';
      break;
    case 3:
      return '3';
      break;
    case 4:
      return '4';
      break;
    case 5:
      return '5';
      break;
    case 6:
      return '6';
      break;
    case 7:
      return '7';
      break;
    case 8:
      return '8';
      break;
    case 9:
      return '9';
      break;
    }
  return '&';
}
/////////////////////////////////////////////////////////////////////
Tree node_create(char value, Tree left, Tree right)
{
  Tree uzel;
  uzel = (Tree) malloc (sizeof(struct node));
  if (uzel == NULL)
    {
      perror("malloc");
      exit(1);
    }
  uzel->value = value;
  uzel->left = left;
  uzel->right = right;
  return uzel;
}
/////////////////////////////////////////////////////////////////////
void tree_destroy(Tree t)
{
  while (t != NULL)
    {
      Tree tmp;
      tree_destroy(t->left);
      tmp = t;
      t = t->right;
      free(tmp);
    }
}

/////////////////////////////////////////////////////////////////////
int tree_compare(Tree t1, Tree t2)
{

  printf(" u_cmp=");
  Order(t1);
  printf(" v_cmp=");
  Order(t2);
  printf("\n");

  if(t1->value == t2->value) {
    if(t1->left != NULL && t2->left == NULL) return 0;
    if(t1->left == NULL && t2->left != NULL) return 0;

    if(t1->left != NULL && t2->left != NULL)
    if(tree_compare(t1->left, t2->left)) {  
      
       if(t1->right != NULL && t2->right == NULL) return 0;
       if(t1->right == NULL && t2->right != NULL) return 0;

       if(t1->right == NULL && t2->right == NULL) 
       if(tree_compare(t1->right, t2->right)) {  
         return 1;
       
       }
    }  
    
  } else
  return 0;
}

/////////////////////////////////////////////////////////////////////
void tree_print_with_tab(Tree t, int tab)
{
  int i;
  if (t->right != NULL)
    tree_print_with_tab(t->right, tab + 1);
  for (i = 0; i < tab; ++i)
    printf("   ");
  printf("%c \n", t->value);
  if(t->left != NULL)
    tree_print_with_tab(t->left, tab + 1);
}
/////////////////////////////////////////////////////////////////////
void tree_print(Tree t)
{
  if (t != NULL)
    tree_print_with_tab(t,0);
  else
    printf("<empty>");
}
/////////////////////////////////////////////////////////////////////
Tree  parse_expr();

Tree parse_fact()
{
  Tree fact = NULL;
  char ch = getchar();
  if (ch == '(')
    {
      fact = parse_expr();
      ch = getchar();
    }
  else if (isalnum(ch))
    fact = node_create(ch,NULL,NULL);

  return fact;
}
/////////////////////////////////////////////////////////////////////
Tree parse_term()
{
  char ch;
  Tree term  = parse_fact();
  while ((ch = getchar())!= '\n')
    if (ch == '*' || ch == '/')
      term = node_create(ch,term, parse_fact());
    else
      break;
  ungetc(ch,stdin);
return term;
}
/////////////////////////////////////////////////////////////////////
Tree parse_expr()
{
  char ch;
  Tree ex = parse_term();
  while ((ch = getchar()) != '\n')
    if (ch == '+' || ch == '-')
      ex = node_create(ch,ex,parse_term());
    else
      break;
  ungetc(ch,stdin);
  return ex;
}

/////////////////////////////////////////////////////////////////////
void Order(Tree t)
{
  if (t != NULL)
    {
      Order(t->left);
      printf("%c",t->value);
      Order(t->right); 
    }
}


/////////////////////////////////////////////////////////////////////
//Greatest Common Divisor

int get_CommonDivisor(int i, int j)
{
 while (i != j)
 {
   if (i > j) i -= j;
   else j -= i;
 }
return i;
}

// is expression is a product of subexpressions?
int is_product(Tree u) {
 if(u->value == '*' || u->value == '/') return 1; else return 0;
}

int is_sum(Tree u) {
 if(u->value == '+' || u->value == '-') return 1; else return 0;
}

// is expression is a digit?
int is_integer(Tree u) {
 if(CharToInt(u->value)<0) return 0; else return 1;
}

////////////////////
// division by factor u/v
Tree div_factor(Tree u, Tree v) {

 if(u->left == v) return u->right;
 if(u->right == v) return u->left;
 return v;
}

// division by factor u/v
Tree div_by_factor(Tree u, Tree f) {

  printf(" u__=");
  Order(u);
  printf(" f__=");
  Order(f);
  printf("\n");


 if(is_integer(u) && is_integer(f)) {
  // not subexpressions, divide with reminder

  int nf = CharToInt(u->value)/CharToInt(f->value);
  printf("numdiv:%d\n",nf);
  return node_create(IntToChar(nf), NULL, NULL);
 }
 else
 if(is_product(u)) {

  printf("-----> prod1");

  // not subexpressions, proceed to divide with reminder
  if(is_integer(u->left)) {
     return mul_factor(div_by_factor(u->left,f),u->right);
  }
  else
  if(is_integer(u->right)) {
     return mul_factor(u->left,div_by_factor(u->right,f));
  }

  printf("-----> prod2");
  // return one of factors
  if(tree_compare(u->left, f)) return u->right;
  if(tree_compare(u->right, f)) return u->left;
  
  return NULL; // cannot divide

 }
 else
 if(is_sum(u)) {
   Tree l = div_by_factor(u->left, f);
   Tree r = div_by_factor(u->right, f);
   u->left=l;
   u->right=r;
 }

 return u;
}


////////////////////
// division by factor u/v
Tree mul_factor(Tree u, Tree v) {

  printf(" u*=");
  Order(u);
  printf(" v*=");
  Order(v);
  printf("\n");

 if(is_integer(u) && is_integer(v)) {
  if(u->value=='1') return node_create(v->value, NULL, NULL);
  if(v->value=='1') return node_create(u->value, NULL, NULL);
 } else
 return node_create('*', u, v);
 
}


////////////////////
// common factor
Tree common_factor(Tree u, Tree v) {


  printf(" u1=");
  Order(u);
  printf(" v1=");
  Order(v);
  printf("\n");

// case 0: singular

// case 1: both subexpressions are digits
 if(is_integer(u) && is_integer(v)) {
  Tree t;
  int f = get_CommonDivisor(CharToInt(u->value), CharToInt(v->value));
  printf("com_divisor:%d\n",f);
  t=node_create(IntToChar(f), NULL, NULL);
  return t;
 }

// case 2: u subexpression is a product
 if(is_product(u)) {

   Tree f,r,U,V,t1;
//   printf("u branch\n");
   f = u->left;
//   printf("f=");
   Order(f);
   r = common_factor(f,v);
//   printf(" r=");
   Order(r);
   U=div_factor(u,f);
//   printf(" U=");
   Order(U);
   V=div_factor(v,r);
//   printf(" V=");
   Order(V);
   t1 = common_factor(U, V);
//   printf(" t1=");
   Order(t1);
   return mul_factor(r, t1); 
   
 } else 
 if(is_product(v)) {
   printf("v branch\n");
   return common_factor(v,u);
 } 
 
 return node_create('1',NULL,NULL);
}

/////////////////

Tree recreate_tree(Tree t)
{

  if (t != NULL)
  {


      t->left=recreate_tree(t->left);
      t->right=recreate_tree(t->right);
      
      if (t->value == '/' )
      {

	    Tree left = t->left;
	    Tree right = t->right;

            if(left==NULL) printf("left is NULL");
            if(right==NULL) printf("right is NULL");
	    
	    Tree factor = common_factor(left, right);
	    printf("factor:\n");
            Order(factor); 
	    printf("\n");

            if(factor->value != '1') {
               left=div_by_factor(left,factor);
               right=div_by_factor(right,factor);
	       
               if(right->value=='1') t=left;
	       else {
	         t->left=left;
	         t->right=right;
	       }
	    } 
	    
      }
    }
  return t;
}

/////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
  printf("enter expr:\n");
  printf("> ");
  Tree expr = parse_expr();
  printf("entered tree:\n");
  tree_print(expr);
  printf("Expression:  ");
  Order(expr); printf("\n");
  expr=recreate_tree(expr);
  printf("Modified expression:\n");
  printf("\n ---------------- \n");
   tree_print(expr);
  printf("Expression: ");
  Order(expr); printf("\n");
  tree_destroy(expr);   
return 0;
}

Отредактировано Кладоискатель (2007-07-11 01:22:00)

0

15

МышкаФтапках написал(а):

бла-бла-бла........... кроме ай-ай, порицания... итог нулевой...... мдя-я-я-я

А я взял и сделал. Из принципа. Потому, что я могу, и я лишний раз себе это доказал. А тот оболдуй, который не хочет сам учиться - ему это и не поможет.
И не надо на меня давить, особенно не разбираясь в вопросе и в сложности и ставить какие-то сроки.
Я это делать не обязан, и у меня не так много свободного времени, чтобы решать хрен знает кому хрен знает зачем. И уж совсем не для того, чтобы выслушивать в свой адрес ехидные замечания.

И вообще, если кто тут только и делает, что просто болтает языком, так это ты.

Отредактировано Кладоискатель (2007-07-11 14:00:05)

0

16

Кладоискатель написал(а):

И вообще, если кто тут только и делает, что просто болтает языком, так это ты.

открыл Америку?! , да, я просто болтаю языком.....
Спасибо за помощь, я от души... а на то что я тут без цели...*усмехнулась*... тоже подумаю над этим...
Не делай добро.. не получишь зло......Прав народ...

Отредактировано МышкаФтапках (2007-07-12 01:58:33)

0

17

МышкаФтапках написал(а):

Дим времени мало всего до среды

и это были не рамки... а всего лишь удивление что мало времени, а ты (кстати нечего что я на "ты"?) отзвался  , что бы помочь.
  Данная задача была выложенна на разных форумах, многие не брались, могли и не брались т к как мало времени( парень кстати сам почти все решил, просто поговорив, с одним из помощников, понял что и как исправить)....по этому вяло вякнула про то, что времени до среды. Я не написала, что берись и делай,  всего пару раз  ( в чате и тут ) обратилась к тебе лично за просьбой о помощи. Не оправдываюсь, считаю это не нужным делом.  Решила объяснить......., твое решение, так же выложила как и твой ответ... там где и просила помощи,на других форумах.  Многим стало весело, а поверь уж мне,  в сети не мало  более опытных чем ты, по образованию, и уму и собразительности но НИ КТО.. НИ КТО, не стал бить себе в грудь, тем что окзаал мне такую честь, как помощь...

Отредактировано МышкаФтапках (2007-07-12 02:30:52)

0

18

Это, ответ " оболтуса". Еще раз, в предупреждении словесной перепалки, в которые не хочу вступать,  и не только потому что я глупа, а потому что НЕ ХОЧУ.... данную тему развивать не буду. Цербер, спасибо езе раз за оказанную мне помощь. Обещаю  (второе данное тебе обещание на этом форуме) впередь больше лично к тебе не обращаться за помощью. Еще раз спасибо.
В задаче требуется упростить выражения вида 

*******(02:35:05 12/07/2007)
что задача ставилась из дерева вида

                           *
                        4      /
                             a    2
Получать дерево вида
                           
                            *
                         2    a       

Как видно из рисунка, все, что надо для решения этой простой задачи (проблема разбора выражения и печати в виде дерева была решена изначально!) в левого сына помещать результат деления (в данном случае 4 делим на 2) в правого сына кладем, то, что до этого было левым внуком, а дальше рекурсивно удаляем ненужные поддеревья  (обоих внуков) (функция удаления также была написана ранее!!!).  Никаких более сложных преобразований никто по заданию не просил, находить общий множитель или что-то выносить за скобки. Хотя алгоритм разложения на множители  тоже достаточно прост и можно было бы  реализовать и его.

Это лично от меня. Написать кому то программу, взяться помочь, а потом наезжать, на человека который просто  решила мне помочь, Вы  считает так поступают воспитанные люди? Сразу видно что сам алгоритмическим мышлением явно проблемы и если кто то что-то может то сразу воспринимается в штыки. Лучше бы почитал классику, Кормена с Лейзерсоном, да Вирта, а потом кричал где какие там нетривиальные задачи.

0

19

МышкаФтапках написал(а):

что задача ставилась из дерева вида

                           *
                        4      /
                             a    2
Получать дерево вида
                           
                            *
                         2    a

первый раз вижу такую заморочку...если признаться...
ну и как ? проверяли? работает на всех примерах? в чем это можно применить? есть литература по теме только на русском языке...(с англ у меня трабл)?

0

20

Кладоискатель написал(а):

Но в следующий раз, прежде чем спрашивать подобные задания, запаситесь временем и терпением, потому как задача, кажущаяся простой с точки зрения далекого от математики и программирования человека, может вовсе таковой не являться.

+1 !!!

от себя добавлю что разбираться в чужом коде это вообще изрядный труд - особенно обидно если он напрасен...
проще и быстрее написать самому.

по коду:

перевод из char в int и обратно осуществляется путем прибавления или вычитания ASSCI-кода нуля. а не перебирания всех цифр. это занимает много меньше строчек=)
ну по крайней мере я так делаю)

0

21

МышкаФтапках написал(а):

Никаких более сложных преобразований никто по заданию не просил, находить общий множитель или что-то выносить за скобки. Хотя алгоритм разложения на множители  тоже достаточно прост и можно было бы  реализовать и его.

Задание в первом посте:
"
Построить программу выполнения заданного преобразования арифметического выражения с применением деревьев.
Преобразование выражения реализовать в виде набора подпрограмм
Программа должна вводить и печатать выражения в исходном(текстовом) виде, преобразовывать их в деревья, выполнять задание преобразования путем обращения к подрограммам и печатать результаты в виде дерева и в его текстововм представлении
Программу проверить на нескольких выражениях, среди которых должны быть выражения, не содержащие преобразуемых элементов, содержащие ровно один такой элемент или несколько элементов подлежащих преобразованию, причем в разных местах дерева
"

Или я читать не умею, или кто-то не умеет формулировать вопрос. Если это не надо делать, зачем об этом вообще говорить?

troyan™ написал(а):

перевод из char в int и обратно осуществляется путем прибавления или вычитания ASSCI-кода нуля.

Да там вообще все дебильно сделано... Переводить надо не из char в int, а строку десятичных цифр переводить в число через atoi. Набор терминальных символов какой-то ущербный. И потом, я бы добавил ссылку на предка в узел дерева.

МышкаФтапках написал(а):

Многим стало весело, а поверь уж мне,  в сети не мало  более опытных чем ты, по образованию, и уму и собразительности но НИ КТО.. НИ КТО, не стал бить себе в грудь, тем что окзаал мне такую честь, как помощь...

Бла-бла-бла можно было не говорить. Причем тут честь? Откуда она вообще тут взялась?

Есть задача, я могу её решить, я решаю. Неважно - Климовой ли, Трояну, Рассветной, своему начальнику или Путину Владимиру Владимировичу. Если задание мне непонятно, временные рамки не удовлетворительные - я спрашиваю.

Если я чем-то помогаю, то я помогаю так КАК МНЕ ЭТО УДОБНО. Если у меня нет времени на помощь - я не обязан.
Бесит, когда начинаешь человеку помогать, а он тебя же еще и обругает всяко - плохо помогаешь, фигней маешься, языком трепешь и т.д.

То, что в сети много умного народу, которые гораздо умнее меня - я в этом не сомневаюсь. Вот и спрашивайте у них, на кой лезть сюда-то было, это что, форум программеров?
Однако вот это "бла-бла-бла" фактически означало - Цербер, дурак, натрепался тут, что все может, а сам нихрена не сделал. Это бесит.
После этого я чувствую себя должным. Я вынужден оправдываться.

troyan™ написал(а):

первый раз вижу такую заморочку...если признаться...

Это из области компьютерной алгебры. Преобразование символьных выражений. В универе я такие вещи на прологе делал, а теперь вот на сях попробовал :)
Кстати, мне это пригодится в одном образовательном проекте, который я разрабатываю, на яве.

Отредактировано Кладоискатель (2007-07-12 07:34:57)

0

22

Кладоискатель написал(а):

Переводить надо не из char в int, а строку десятичных цифр переводить в число через atoi.

да ксатти - не всегда же будут однозначные цифры - могут быть и трех и четырех - т.е. перевод там достаточно замороченный выйдет - ну  это если уже надо будет можно написать - щас помоему уже все временные рамки для решения задачи были исчерпаны))

пы.сы. вот для этого и надо запастись временем если задаешь задачу на форуме: народ потрепится обсудит в итоге будет аццкая прога которая будет уметь все  :D

0

23

troyan™ написал(а):

да ксатти - не всегда же будут однозначные цифры - могут быть и трех и четырех - т.е. перевод там достаточно замороченный выйдет

Не, ну это стандартный лексический разбор будет... Встретилась первая цифра или минус, дальше читаем по формату, пока попадаются цифры, добавляем их к строке. Если попался разделитель - буква, знак действия или пробел - останавливаемся и преобразуем строку в число.

0

24

Кладоискатель написал(а):

Не, ну это стандартный лексический разбор будет... Встретилась первая цифра или минус, дальше читаем по формату, пока попадаются цифры, добавляем их к строке. Если попался разделитель - буква, знак действия или пробел - останавливаемся и преобразуем строку в число.

ну я помню на первом курсе намучился с подсчетом этим)))

0


Вы здесь » "СЕАНС ДЛЯ ВЗРОСЛЫХ" » Учёба,работа! » Ученье свет..... Помогите, умные головы :-)