Форум программистов, компьютерный форум CyberForum.ru

Метод северо-западного угла - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.82
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
10.04.2011, 20:35     Метод северо-западного угла #1
надо реализовать данный метод.
http://www.reshmat.ru/example_transport_4.html
Вот ссылка на пример по которому делал код
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
#include <iostream>
 
bool check(int *ar)
{
    int sum=0;
    for(int i=0;i<4;i++)
     sum+=ar[i];
    if (sum==0)
       return true;
    return false;
}
 
int main()
{
    //запасы
    int a[]={70,80,110};
    //потребители
    int b[]={50,70,60,80};
    int m=3,n=4;
    //издержки
    int mat[4][5]={{14,16,13,7},
                     {15,11,9,8},
                     {12,17,18,16}};
    //матрица результата
    int matres[4][5]={{0,0,0,0},
                       {0,0,0,0},
                       {0,0,0,0}};
    
    int i=0,j=0;
    bool res;                  
    do
    {
        res=false;//проверка на нулевые элементы массива
        if (a[i]>b[j])//запасов больше чем надо
        {
            matres[i][j]=b[j];//потребность удовлетворена
            a[i]-=b[j];//осталось на складе
            if (i!=n-1)//оставшиеся элементы в столце обнулим
             for(int k=i+1;k<m;k++)
              matres[k][j]=0;
          j++;//следующий заказчик
        }
        else if (a[i]<b[j])//потребителю не хватит
        {
            matres[i][j]=a[j];//отдадим сколько сможем
            b[j]-=a[i];//сколько еще надо
            if (j!=n-1)//все элементы строки далее обнулим
             for(int k=j+1;k<n;k++)
               matres[i][k]=0;
           i++;//следующий поставщик
        }
        else goto l;//иначе отправим на проверку обнуления
         l:res=check(b);//проверка на обнуление
    }while(!res);
    cout<<"Полученный путь"<<endl;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
         cout<<matres[i][j]<<" ";
         cout<<endl;
    }
    double sum=0;//цена пути
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        sum+=matres[i][j]*mat[i][j];
    }
    cout<<"REs---"<<sum;
}
программа зацикливается.вроде логически все верно.в чем дело?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ailia
27 / 26 / 1
Регистрация: 27.12.2009
Сообщений: 106
10.04.2011, 20:47     Метод северо-западного угла #2
C++
1
2
         else goto l;//иначе отправим на проверку обнуления
         l:res=check(b);//проверка на обнуление
не вижу смысла создавать метку, чтобы перейти на след. строку.
причины зацикливания не нашел. советую выполнить программу в пошаговом режиме
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
10.04.2011, 20:52  [ТС]     Метод северо-западного угла #3
Цитата Сообщение от ailia Посмотреть сообщение
C++
1
2
         else goto l;//иначе отправим на проверку обнуления
         l:res=check(b);//проверка на обнуление
не вижу смысла создавать метку, чтобы перейти на след. строку.
надо было чтобы иначе выполнялась проверка, но и после if чтобы выполнялась проверка
ailia
27 / 26 / 1
Регистрация: 27.12.2009
Сообщений: 106
10.04.2011, 20:55     Метод северо-западного угла #4
Цитата Сообщение от Artishok Посмотреть сообщение
надо было чтобы иначе выполнялась проверка, но и после if чтобы выполнялась проверка
у вас goto стоит только в одном месте поэтому после if'а ничего не проверяется
ой, извиняюсь, все верно
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
12.04.2011, 17:17  [ТС]     Метод северо-западного угла #5
все исправил.все работает
maxa42
1 / 1 / 0
Регистрация: 10.04.2014
Сообщений: 19
10.04.2014, 18:39     Метод северо-западного угла #6
а в чем ошибка ? а то у меня такое же задание и я не могу найти ошибку
Sanek_MX
1 / 1 / 0
Регистрация: 08.04.2012
Сообщений: 45
05.04.2015, 11:04     Метод северо-западного угла #7
Подскажите, пожалуйста, а есть исходник такой, чтобы не зацикливался? Просто мне для курсовой по методу потенциалов нужен опорный план.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2015, 12:49     Метод северо-западного угла
Еще ссылки по теме:

Вычислить арксинус угла в градусах C++
Рассчитать квадрат синуса угла, значение угла вводится с клавиатуры в градусах C++
C++ Перевод угла в радианы

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

Или воспользуйтесь поиском по форуму:
gru74ik
Модератор
 Аватар для gru74ik
2999 / 1312 / 164
Регистрация: 20.02.2013
Сообщений: 3,742
Записей в блоге: 15
05.04.2015, 12:49     Метод северо-западного угла #8
Запись
C++
1
int matres[4][5]
означает "массив из четырёх элементов, каждый из которых, в свою очередь, является массивом из пяти элементов типа int. То есть, по-любому должно быть так:
C++
1
2
3
4
5
    int matres[4][5]={  {0,0,0,0,0},
                        {0,0,0,0,0},
                        {0,0,0,0,0},
                        {0,0,0,0,0}
                     };
Добавлено через 2 минуты
Строки 52-53 с goto и меткой совершенно избыточны - там достаточно простого else.

Добавлено через 3 минуты
В функции check() лучше сделать передачу указателя на начало массива и целочисленной переменной (либо целочисленной константы) - в качестве размера массива. Да и ветвление с ифом там тоже избыточно. Достаточно сделать так:
C++
1
2
3
4
5
6
7
8
bool check(int * ar, int arSize)
{
    int sum = 0;
    for(int i = 0; i < arSize; ++i)
     sum += ar[i];
    
    return sum==0;    // если sum равна 0, то вернётся true, в противном случае вернётся false
}
Добавлено через 5 минут
Название функции check - неудачно. Гораздо лучше было назвать её array_is_empty() или как-нибудь ещё в таком же духе.

Добавлено через 5 минут
Названия массивов одиночными буквами и рядом с ними туча комментариев - не самый лучший приём. Гораздо лучше было бы назвать сами массивы говорящими именами. То есть, вместо
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    //запасы
    int a[]={70,80,110};
    //потребители
    int b[]={50,70,60,80};
    int m=3,n=4;
    //издержки
    int mat[4][5]={{14,16,13,7},
                     {15,11,9,8},
                     {12,17,18,16}};
    //матрица результата
    int matres[4][5]={{0,0,0,0},
                       {0,0,0,0},
                       {0,0,0,0}};
лучше:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    int resources[] = {70,80,110};
 
    int consumers[] = {50,70,60,80};
    
    int m = 3, n = 4; // что есть m и n ???
 
    int outgoings[4][5]={{14,16,13,7},
                     {15,11,9,8},
                     {12,17,18,16}};
 
    int result[4][5]={{0,0,0,0},
                       {0,0,0,0},
                       {0,0,0,0}};
Добавлено через 4 минуты
Манера лепить всё в кучу - ужасна. Код становиться менее читаемым. Вам что, пробелов жалко?
Yandex
Объявления
05.04.2015, 12:49     Метод северо-западного угла
Ответ Создать тему
Опции темы

Текущее время: 03:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru