Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 28.01.2009
Сообщений: 26
1

Переписать программу без классов с C++

29.01.2010, 03:33. Просмотров 643. Ответов 5
Метки нет (Все метки)

Кто может помочь переписать программу без классов?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include "iostream.h"
#include <conio.h>
#define TRUE 1
#define FALSE 0
#define MaxNodes 5  //Количество вершин.
//Описание типа узла стека.
typedef struct Zveno *svqz;
typedef struct Zveno
{
  int Element;
  svqz Sled;
}asd;
 
 
class Spisok
{
  private:
         int Mas[MaxNodes][MaxNodes];  //Матрица весов дуг.
         int DD[MaxNodes][MaxNodes];   //Матрица расстояний.
         int SS[MaxNodes][MaxNodes];   //Матрица последовательных узлов.
     svqz Stack; //Указатель на рабочий стек.
         void UDALENIE (svqz *, int *);
         void W_S (svqz *, int);
         void Small_Put (int,int);
  public:
     Spisok() {Stack = NULL;}
         void Vvod_Ves();
         void Reshenie ();
};
 
void main()
{
  Spisok A;
 
  A.Vvod_Ves();
  A.Reshenie();
}
 
void Spisok::Small_Put (int one, int two)
//Нахождение кратчайшего пути.
{
  svqz St=NULL; //Указатель на вспомогательный стек.
  svqz UkZv;
  int Flag=FALSE; //Флаг построения кратчайшего пути.
  int elem1,elem2,k;
  //Помещение в стек конечной и начальной вершин.
  W_S (&Stack,two);
  W_S (&Stack,one);
  while (!Flag)
  {
    //Извлекли верхних два элемента.
    UDALENIE(&Stack,&elem1);
    UDALENIE(&Stack,&elem2);
    if (SS[elem1][elem2]==elem2) //Если есть путь...
      if (elem2==two) //и это конечный узел...
      {
       Flag = TRUE;   //то кратчайший путь найден.
       W_S (&St,elem1);
       W_S (&St,elem2);
      }
      else //и это не конечный узел...
      {
       W_S (&St,elem1); //В вспомогательный стек.
       W_S (&Stack,elem2); //Обратно в рабочий стек.
      }
    else //Если пути нет.
    {
      W_S (&Stack,elem2); //Обратно в рабочий стек.
      k = SS[elem1][elem2];
      W_S (&Stack,k);     //Запомнить промежуточную вершину.
      W_S (&Stack,elem1); //Обратно в рабочий стек.
    }
  }
  UkZv = St;
  while ( UkZv != NULL )
  {  cout << (UkZv->Element+1) << " "; 
     UkZv = UkZv->Sled;  }
  cout << endl;
}
 
void Spisok::W_S (svqz *stk, int Elem)
//Помещение Elem в стек stk.
{
  svqz q=new (Zveno);
  (*q).Element = Elem; 
  (*q).Sled = *stk; *stk = q;
}
 
void Spisok::UDALENIE (svqz *stk, int *Klad)
//Удаление звена из стека, заданного указателем *stk.
//Значение информационного поля удаляемого звена сохраня-
//ется в параметре Klad.
{
  svqz q;
 
  if (*stk==NULL) cout<<"Попытка выбора из пустого стека!\n";
  else
    { *Klad = (**stk).Element;
      q = *stk; *stk = (**stk).Sled; delete q; }
}
 
 
void Spisok::Vvod_Ves()
//Ввод матрицы весов дуг заданного графа.
{
  cout << "Vvodite elementi matrici vesov dyg po strokam:\n";
   for (int i=0;i<MaxNodes;i++)
   for (int j=0;j<MaxNodes;j++)
     {
       cout << "Vvedite Mas[" << (i+1) << "," << (j+1) << "]: ";
       cin >> Mas[i][j];
     }
}
 
void Spisok::Reshenie()
{
  int one,two;
  int i,j,asd = 1;
 
  //Инициализация.
  for (i=0;i<MaxNodes;i++)
   for (j=0;j<MaxNodes;j++)
   {
     if (Mas[i][j]>0)  SS[i][j]=j;
     else SS[i][j]=0;
     DD[i][j]=Mas[i][j];
   }
   do{
   cout << "\nStart point: ";
   cin >> one; one--;
   cout << "Finish point: ";
   cin >> two; two--;
 
   int ved=0;
   while (ved<MaxNodes)
   {
     for (i=0;i<MaxNodes;i++)
      for (j=0;j<MaxNodes;j++)
        if (i!=j && i!=ved && j!=ved &&
            DD[i][ved]>0 && DD[ved][j]>0)
          if (DD[i][ved]+DD[ved][j]<DD[i][j] || DD[i][j]==0)
          {
             DD[i][j]=DD[i][ved]+DD[ved][j];
             SS[i][j]=ved;
          }
          ved++;
   }
   i=one;
   if (SS[i][two]!=two && SS[i][two]!=0)
     while (SS[i][two]!=two)
     {
        j=SS[i][two];
        while (SS[i][j]!=j)  j=SS[i][j];
        i=j;
     }
     cout << "\nOrder path: ";
     Small_Put (one, two);
     cout << "Lenght path: " << DD[one][two];
     cout << "\nContinue(0-exit): ";
     cin >> asd;
     }while(asd != 0);
     getch();
}
Добавлено через 12 часов 49 минут
как то переделала, но не работает. наверно, косяки в указателях.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<alloc.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define MaxNodes 2  //kol-vo vershin
 
typedef struct lin
 { int Element;
   struct lin *next;
 }NT;
 
 
 
/* int Mas[MaxNodes][MaxNodes];  //matriza vesov dug
 int DD[MaxNodes][MaxNodes];   //matriza rasstojanii
 int SS[MaxNodes][MaxNodes];   //matriza posledovatelnih uzlov
 */
  void del(NT*s, int *Klad) //udalenie zvena iz stacka, sozdannogo uk. s
                           //zna4enie polj sohran v Klad
{
 NT *q;
 if (s==NULL)
  printf ("\n Popitka vibora iz pustogo stacka\n");
 else
  {
   *Klad=s->Element;
   q=s;
   s=s->next;
   delete q;
   }
  }
 
 
 void put_Stack (NT*s, int Elem)
 {
  NT*q= new NT;
 
  q->Element=Elem;
  q->next=s;
  s=q;
  }
 
 void vvod_ves()
 {
 int Mas[MaxNodes][MaxNodes], i, j;
   printf("Vvodite elementi matrici vesov dyg po strokam:\n");
 
 
 
   for (i=0;i<MaxNodes;i++)
     for (j=0;j<MaxNodes;j++)
      {
       printf("\nVvedite Mas [%d][%d]:",(i+1),j+1);
       fflush(stdin);
       scanf("[%d][%d]", Mas[i][j]);
       }
   }
 
 void poisk_puti(int one, int two)
 {
   NT *St, *UkZv, *Stack;
   St=NULL;
   Stack=NULL;
   int Flag, elem1, elem2, k;
   int SS[MaxNodes][MaxNodes];
   Flag=0;// flag postroenija krat4aishego puti
   //pomeshenie v stack konechnoi i na4alnoi vershini
  put_Stack (Stack, two);
  put_Stack (Stack, one);
 
  while (!Flag)
   {
      //izvle4enie verhnih dvuh elementov
      del(Stack, &elem1);
      del(Stack, &elem2);
 
      if (SS[elem1][elem2]==elem2)//esli est put'
        if (elem2==two)            //i eto kone4nii uzel
          {
            Flag=1; // krat4aishii put' naiden
            put_Stack (Stack, elem1);
            put_Stack (Stack, elem2);
           }
        else    //i eto ne kone4nii uzel
           {
            put_Stack (St, elem1); //v vspomog. stack
            put_Stack (Stack, elem2);//obratno v rabo4ii stack
           }
      else // esli puti net
       {
        put_Stack (Stack, elem2); // obratno v rabo4ii stack
        k=SS[elem1][elem2];
        put_Stack (Stack, k);  //zapomnit' promeshuto4nuu vershinu
        put_Stack (Stack, elem2); // obratno v rabo4ii stack
       }
     }
  UkZv=St;
  while (UkZv!=NULL)
  {
   printf("", UkZv->Element+1);
   UkZv= UkZv->next;
   }
  }
 
 
 void reshenie()
 {
   int one, two,i,j, y=1;
   int Mas[MaxNodes][MaxNodes];  //matriza vesov dug
   int DD[MaxNodes][MaxNodes];   //matriza rasstojanii
   int SS[MaxNodes][MaxNodes];   //matriza posledovatelnih uzlov
   //inizializazija
 
   for (i=0;i<MaxNodes;i++)
    for (j=0;j<MaxNodes;j++)
     {
       if (Mas[i][j]>0)  SS[i][j]=j;
       else SS[i][j]=0;
       DD[i][j]=Mas[i][j];
      }
    do
     {
       printf ("\n Start point:");
       fflush(stdin);
       scanf("%d", &one);
 
       printf ("\n Finish point:");
       fflush(stdin);
       scanf("%d", &two);
 
       int ved=0;
       while (ved<MaxNodes)
        {
          for (i=0;i<MaxNodes;i++)
          for (j=0;j<MaxNodes;j++)
            if (i!=j && i!=ved && j!=ved &&DD[i][ved]>0 && DD[ved][j]>0)
              if (DD[i][ved]+DD[ved][j]<DD[i][j] || DD[i][j]==0)
               {
                 DD[i][j]=DD[i][ved]+DD[ved][j];
                 SS[i][j]=ved;
               }
              ved++;
         }
      i=one;
      if (SS[i][two]!=two && SS[i][two]!=0)
        while (SS[i][two]!=two)
          {
           j=SS[i][two];
           while (SS[i][j]!=j)
            j=SS[i][j];
           i=j;
          }
 
        printf("\n Order path: ");
        poisk_puti(one, two);
        printf("\n Lenght path: ", DD[one][two]);
     
     printf("\n Continue? (no-0): ");
     scanf ("%d",&y);
     }
      while(y!=0);
   }
 void main(void)
   {
    int one, two;
    vvod_ves();
    /*printf ("\n Start point:");
    fflush(stdin);
    scanf("%d", &one);
 
    printf ("\n Finish point:");
    fflush(stdin);
    scanf("%d", &two);*/
    reshenie();
 
 
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.01.2010, 03:33
Ответы с готовыми решениями:

Переписать программу без использования циклов
Как переписать эту программу, но без использования циклов? Язык программирования Си!!!! Жду...

Нахождение числа - Переписать программу без операторов int sum
Доброго времени суток... Народ помогите пожалуйста переписать программу без операторов int sum......

Переписать без функции
Помогите переписать без функции и sizeof, size_t. Большое спасибо. #include &lt;stdio.h&gt; #include...

Переписать код без вызова функции
есть код, как можно переписать, чтобы не использовать вот эту строку: ]void selectSort(int* arr,...

5
4845 / 3266 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
29.01.2010, 04:50 2
C
1
2
3
4
5
6
7
void put_Stack (NT *s, int Elem) {
    NT *q = new NT;
 
    q->Element = Elem;
    q->next = s;
    s = q;
}
s разрушается после функции, так как это локальная переменная

нужно подавать NT **s
потом делать *s = q
и q->next = s; соответственно q->next = *s;

Добавлено через 33 секунды
C
1
fflush(stdin);
fflush можно применять только к потокам вывода

Добавлено через 3 минуты
C
1
fflush(stdout);
применяется когда в printf'е нет перевода строки (printf пишет в буфер потока, и тот выталкивается только когда встречает '\n')
поэтому когда перевода строки нет, а на экран обязательно надо вывести, делается принудительное выталкивание буфера с помощью fflush
(на некоторых системах на экране может ничего не отображаться до конца программы без fflush'а)
1
0 / 0 / 0
Регистрация: 28.01.2009
Сообщений: 26
29.01.2010, 05:07  [ТС] 3
т.е. теперь во все вызовах ф-ции
C
1
void put_Stack (NT**s, int Elem)
надо писать
C
1
put_Stack (&Stack, one);
?

и всё равно не работает(

Добавлено через 4 минуты
и ещё: тут точно правильный перевод?
C++
1
2
3
4
5
UkZv = St;
  while ( UkZv != NULL )
  {  cout << (UkZv->Element+1) << " "; 
     UkZv = UkZv->Sled;  }
  cout << endl;
в
C
1
2
3
4
5
6
UkZv=St;
  while (UkZv!=NULL)
  {
   printf("", UkZv->Element+1);
   UkZv= UkZv->next;
   }
0
4845 / 3266 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
29.01.2010, 05:15 4
C
1
void del(NT*s, int *Klad)
тут тоже

C
1
printf("%d ", UkZv->Element+1);
0
0 / 0 / 0
Регистрация: 28.01.2009
Сообщений: 26
29.01.2010, 05:27  [ТС] 5
совсем глупый вопрос: т.к. теперь NT**s, то как поставить указатели?
C
1
2
3
4
5
6
7
8
9
 void del(NT**s, int *Klad) 
{
 ...
  Klad=s->Element;
 ...
    s=s->next;
...
   }
  }
0
4845 / 3266 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
29.01.2010, 08:22 6
C
1
2
3
4
5
6
7
8
9
10
11
12
13
void del(NT **s, int *Klad)
{
    NT *q;
    
    if (*s == NULL)
        printf ("\n Popitka vibora iz pustogo stacka\n");
    else {
        *Klad = (*s)->Element;
        q = *s;
        *s = (*s)->next;
        delete q;
    }
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.01.2010, 08:22

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Переписать функцию без использования библиотеки <stdarg.h>
нужно сделать функцию похожую на 3, но без использования библиотеки &lt;stdarg.h&gt; #include...

Переписать без использования внутренних классов
Программисты посмотрите) тоже есть код но надо сделать его без внутренних классов, я немного не...

Переписать программу с использованием классов
Добавить классы... # include &lt;iostream&gt; # include &lt;conio.h&gt; #include &lt;string&gt; #include&lt;stdio.h&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.